From 25af08d13e017808d72978294c4840b3e59cd0fa Mon Sep 17 00:00:00 2001 From: FIXME <> Date: Mon, 27 Nov 2000 09:49:34 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'SLIAA-1-0-branch'. --- Device3Dfx/3dfx_driver.c | 804 - Device3Dfx/Device3Dfx.spec | 160 - Device3Dfx/Makefile | 127 - Device3Dfx/kinfo.c | 67 - Device3Dfx/mtrrs.c | 935 -- glide2x/README | 31 - glide2x/cvg/bin/makefile | 26 - glide2x/cvg/bin/makefile.linux | 26 - glide2x/cvg/binsrc/makefile | 27 - glide2x/cvg/binsrc/makefile.linux | 26 - glide2x/cvg/cmd/makefile.linux | 27 - glide2x/cvg/cmd/pass/makefile.linux | 40 - glide2x/cvg/cmd/pass/pass.c | 48 - glide2x/cvg/glide/makefile | 31 - glide2x/cvg/glide/makefile.linux | 24 - glide2x/cvg/glide/makefile.unix | 24 - glide2x/cvg/glide/oem/fxbldno.c | 52 - glide2x/cvg/glide/oem/makefile | 63 - glide2x/cvg/glide/oem/makefile.linux | 49 - glide2x/cvg/glide/oem/oeminit.c | 372 - glide2x/cvg/glide/oem/oeminit.h | 93 - glide2x/cvg/glide/oem/oeminit.rc | 71 - glide2x/cvg/glide/oem/rcver.h | 47 - glide2x/cvg/glide/src/banner.inc | 101 - glide2x/cvg/glide/src/cpudetect.c | 47 - glide2x/cvg/glide/src/cpudtect.S | 127 - glide2x/cvg/glide/src/cpudtect.asm | 163 - glide2x/cvg/glide/src/ddgump.c | 575 - glide2x/cvg/glide/src/diglide.c | 407 - glide2x/cvg/glide/src/digutex.c | 581 - glide2x/cvg/glide/src/disst.c | 213 - glide2x/cvg/glide/src/distate.c | 943 -- glide2x/cvg/glide/src/distrip.c | 445 - glide2x/cvg/glide/src/ditex.c | 674 - glide2x/cvg/glide/src/fifo.c | 730 - glide2x/cvg/glide/src/fxbldno.c | 52 - glide2x/cvg/glide/src/fxgasm.c | 208 - glide2x/cvg/glide/src/fxglide.h | 2391 --- glide2x/cvg/glide/src/g3df.c | 558 - glide2x/cvg/glide/src/gaa.c | 1118 -- glide2x/cvg/glide/src/gbanner.c | 170 - glide2x/cvg/glide/src/gdraw.c | 1130 -- glide2x/cvg/glide/src/gerror.c | 281 - glide2x/cvg/glide/src/gglide.c | 2594 --- glide2x/cvg/glide/src/glfb.c | 1124 -- glide2x/cvg/glide/src/glide.h | 1518 -- glide2x/cvg/glide/src/glide.rc | 71 - glide2x/cvg/glide/src/glidesys.h | 131 - glide2x/cvg/glide/src/glideutl.h | 186 - glide2x/cvg/glide/src/gmovie.c | 56 - glide2x/cvg/glide/src/gpci.c | 629 - glide2x/cvg/glide/src/gsplash.c | 958 -- glide2x/cvg/glide/src/gsst.c | 2069 --- glide2x/cvg/glide/src/gsstdef.h | 241 - glide2x/cvg/glide/src/gstrip.c | 302 - glide2x/cvg/glide/src/gtex.c | 1102 -- glide2x/cvg/glide/src/gtexdl.c | 825 - glide2x/cvg/glide/src/gu.c | 449 - glide2x/cvg/glide/src/guclip.c | 444 - glide2x/cvg/glide/src/gump.c | 105 - glide2x/cvg/glide/src/gump.h | 59 - glide2x/cvg/glide/src/gutex.c | 211 - glide2x/cvg/glide/src/gxdraw.c | 583 - glide2x/cvg/glide/src/makefile | 314 - glide2x/cvg/glide/src/makefile.linux | 263 - glide2x/cvg/glide/src/rcver.h | 28 - glide2x/cvg/glide/src/readme | 41 - glide2x/cvg/glide/src/splshdat.c | 14791 ----------------- glide2x/cvg/glide/src/xdraw2.S | 259 - glide2x/cvg/glide/src/xdraw2.asm | 220 - glide2x/cvg/glide/src/xdraw2.inc | 310 - glide2x/cvg/glide/src/xdraw2.inc.S | 315 - glide2x/cvg/glide/tests/alpha.3df | Bin 87428 -> 0 bytes glide2x/cvg/glide/tests/ap88.3df | Bin 173903 -> 0 bytes glide2x/cvg/glide/tests/argb1555.3df | 806 - glide2x/cvg/glide/tests/argb4444.3df | 5 - glide2x/cvg/glide/tests/argb8332.3df | Bin 174815 -> 0 bytes glide2x/cvg/glide/tests/argb8888.3df | Bin 349577 -> 0 bytes glide2x/cvg/glide/tests/ayiq.3df | Bin 174705 -> 0 bytes glide2x/cvg/glide/tests/cmp.bat | 65 - glide2x/cvg/glide/tests/decal1.3df | Bin 174813 -> 0 bytes glide2x/cvg/glide/tests/display.c | 442 - glide2x/cvg/glide/tests/h3dtst01.c | 200 - glide2x/cvg/glide/tests/h3dtst02.c | 292 - glide2x/cvg/glide/tests/lava.3df | Bin 88450 -> 0 bytes glide2x/cvg/glide/tests/light.3df | 5 - glide2x/cvg/glide/tests/makefile | 145 - glide2x/cvg/glide/tests/makefile.distrib | 15 - glide2x/cvg/glide/tests/makefile.linux | 77 - glide2x/cvg/glide/tests/matt1.3df | Bin 174813 -> 0 bytes glide2x/cvg/glide/tests/miro.3df | Bin 174813 -> 0 bytes glide2x/cvg/glide/tests/p8.3df | Bin 86520 -> 0 bytes glide2x/cvg/glide/tests/plib.c | 1397 -- glide2x/cvg/glide/tests/plib.h | 129 - glide2x/cvg/glide/tests/qatest00.c | 1239 -- glide2x/cvg/glide/tests/qatest00.h | 94 - glide2x/cvg/glide/tests/qatest01.c | 171 - glide2x/cvg/glide/tests/rgb332.3df | Bin 87432 -> 0 bytes glide2x/cvg/glide/tests/rgb565.3df | 748 - glide2x/cvg/glide/tests/sst1img.bat | 48 - glide2x/cvg/glide/tests/test00.c | 137 - glide2x/cvg/glide/tests/test01.c | 157 - glide2x/cvg/glide/tests/test02.c | 159 - glide2x/cvg/glide/tests/test03.c | 154 - glide2x/cvg/glide/tests/test04.c | 157 - glide2x/cvg/glide/tests/test05.c | 191 - glide2x/cvg/glide/tests/test06.c | 188 - glide2x/cvg/glide/tests/test07.c | 171 - glide2x/cvg/glide/tests/test08.c | 170 - glide2x/cvg/glide/tests/test09.c | 212 - glide2x/cvg/glide/tests/test10.c | 207 - glide2x/cvg/glide/tests/test11.c | 260 - glide2x/cvg/glide/tests/test12.c | 345 - glide2x/cvg/glide/tests/test13.c | 174 - glide2x/cvg/glide/tests/test14.c | 184 - glide2x/cvg/glide/tests/test15.c | 217 - glide2x/cvg/glide/tests/test16.c | 201 - glide2x/cvg/glide/tests/test17.c | 292 - glide2x/cvg/glide/tests/test18.c | 258 - glide2x/cvg/glide/tests/test19.c | 369 - glide2x/cvg/glide/tests/test20.c | 320 - glide2x/cvg/glide/tests/test21.c | 374 - glide2x/cvg/glide/tests/test22.c | 306 - glide2x/cvg/glide/tests/test23.c | 260 - glide2x/cvg/glide/tests/test24.c | 255 - glide2x/cvg/glide/tests/test25.c | 898 - glide2x/cvg/glide/tests/test26.c | 370 - glide2x/cvg/glide/tests/test27.c | 204 - glide2x/cvg/glide/tests/test28.c | 229 - glide2x/cvg/glide/tests/test29.c | 271 - glide2x/cvg/glide/tests/testdesc.txt | 46 - glide2x/cvg/glide/tests/testimg.bat | 48 - glide2x/cvg/glide/tests/tldata.inc | 69 - glide2x/cvg/glide/tests/tlib.c | 1787 -- glide2x/cvg/glide/tests/tlib.h | 141 - glide2x/cvg/glide/tests/yiq.3df | Bin 87319 -> 0 bytes glide2x/cvg/include/makefile | 26 - glide2x/cvg/include/makefile.linux | 26 - glide2x/cvg/incsrc/cvg.h | 34 - glide2x/cvg/incsrc/cvgdefs.h | 944 -- glide2x/cvg/incsrc/cvginfo.h | 141 - glide2x/cvg/incsrc/cvgregs.h | 229 - glide2x/cvg/incsrc/fxhal.h | 165 - glide2x/cvg/incsrc/gdebug.h | 138 - glide2x/cvg/incsrc/h3.h | 34 - glide2x/cvg/incsrc/makefile | 29 - glide2x/cvg/incsrc/makefile.linux | 29 - glide2x/cvg/incsrc/sst1vid.h | 112 - glide2x/cvg/incsrc/vxd.h | 39 - glide2x/cvg/init/canopus.c | 182 - glide2x/cvg/init/canopus.h | 45 - glide2x/cvg/init/dac.c | 1374 -- glide2x/cvg/init/gamma.c | 256 - glide2x/cvg/init/gdebug.c | 491 - glide2x/cvg/init/info.c | 657 - glide2x/cvg/init/init.rc | 65 - glide2x/cvg/init/makefile | 48 - glide2x/cvg/init/makefile.linux | 56 - glide2x/cvg/init/parse.c | 1024 -- glide2x/cvg/init/print.c | 88 - glide2x/cvg/init/rcver.h | 5 - glide2x/cvg/init/sli.c | 741 - glide2x/cvg/init/sst1init.c | 1332 -- glide2x/cvg/init/sst1init.h | 1839 --- glide2x/cvg/init/util.c | 1185 -- glide2x/cvg/init/video.c | 1467 -- glide2x/cvg/init/voodoo2.ini | 90 - glide2x/cvg/lib/makefile | 26 - glide2x/cvg/lib/makefile.linux | 26 - glide2x/cvg/libsrc/makefile | 27 - glide2x/cvg/libsrc/makefile.linux | 26 - glide2x/cvg/makefile | 38 - glide2x/cvg/makefile.linux | 37 - glide2x/glide_license.txt | 255 - glide2x/h3/bin/makefile | 26 - glide2x/h3/bin/makefile.linux | 26 - glide2x/h3/binsrc/makefile | 27 - glide2x/h3/binsrc/makefile.linux | 26 - glide2x/h3/glide/makefile | 31 - glide2x/h3/glide/makefile.linux | 27 - glide2x/h3/glide/src/cpudtect.S | 321 - glide2x/h3/glide/src/cpudtect.asm | 320 - glide2x/h3/glide/src/ddgu.c | 206 - glide2x/h3/glide/src/ddgump.c | 597 - glide2x/h3/glide/src/diglide.c | 400 - glide2x/h3/glide/src/digutex.c | 603 - glide2x/h3/glide/src/disst.c | 230 - glide2x/h3/glide/src/distate.c | 946 -- glide2x/h3/glide/src/distrip.c | 451 - glide2x/h3/glide/src/ditex.c | 698 - glide2x/h3/glide/src/fifo.c | 861 - glide2x/h3/glide/src/fxbldno.c | 55 - glide2x/h3/glide/src/fxgasm.c | 271 - glide2x/h3/glide/src/fxglide.h | 3378 ---- glide2x/h3/glide/src/fxsplash.h | 57 - glide2x/h3/glide/src/g3df.c | 568 - glide2x/h3/glide/src/gaa.c | 2370 --- glide2x/h3/glide/src/gbanner.c | 145 - glide2x/h3/glide/src/gdraw.c | 1819 -- glide2x/h3/glide/src/gerror.c | 282 - glide2x/h3/glide/src/gglide.c | 2850 ---- glide2x/h3/glide/src/glfb.c | 961 -- glide2x/h3/glide/src/glide.h | 1527 -- glide2x/h3/glide/src/glide.rc | 72 - glide2x/h3/glide/src/glide.rx | 4 - glide2x/h3/glide/src/glidesys.h | 137 - glide2x/h3/glide/src/glideutl.h | 189 - glide2x/h3/glide/src/glimport.asm | 235 - glide2x/h3/glide/src/gmovie.c | 59 - glide2x/h3/glide/src/gpci.c | 1057 -- glide2x/h3/glide/src/gsplash.c | 1012 -- glide2x/h3/glide/src/gsst.c | 1871 --- glide2x/h3/glide/src/gsstdef.h | 244 - glide2x/h3/glide/src/gstrip.c | 308 - glide2x/h3/glide/src/gtex.c | 1216 -- glide2x/h3/glide/src/gtexdl.c | 919 -- glide2x/h3/glide/src/gu.c | 453 - glide2x/h3/glide/src/guclip.c | 444 - glide2x/h3/glide/src/gump.c | 108 - glide2x/h3/glide/src/gump.h | 62 - glide2x/h3/glide/src/gutex.c | 211 - glide2x/h3/glide/src/gxdraw.c | 610 - glide2x/h3/glide/src/makefile | 360 - glide2x/h3/glide/src/makefile.linux | 279 - glide2x/h3/glide/src/qmodes.h | 401 - glide2x/h3/glide/src/rcver.h | 60 - glide2x/h3/glide/src/readme | 40 - glide2x/h3/glide/src/splshdat.c | 14809 ----------------- glide2x/h3/glide/src/tv.h | 573 - glide2x/h3/glide/src/xdraw2.S | 245 - glide2x/h3/glide/src/xdraw2.asm | 216 - glide2x/h3/glide/src/xdraw2.inc | 1266 -- glide2x/h3/glide/src/xdraw2.inc.S | 1268 -- glide2x/h3/glide/src/xtexdl.S | 284 - glide2x/h3/glide/src/xtexdl.asm | 287 - glide2x/h3/glide/src/xtexdl_def.c | 369 - glide2x/h3/glide/tests/alpha.3df | Bin 87428 -> 0 bytes glide2x/h3/glide/tests/ap88.3df | Bin 173903 -> 0 bytes glide2x/h3/glide/tests/argb1555.3df | 806 - glide2x/h3/glide/tests/argb4444.3df | 5 - glide2x/h3/glide/tests/argb8332.3df | Bin 174815 -> 0 bytes glide2x/h3/glide/tests/argb8888.3df | Bin 349577 -> 0 bytes glide2x/h3/glide/tests/ayiq.3df | Bin 174705 -> 0 bytes glide2x/h3/glide/tests/cmp.bat | 65 - glide2x/h3/glide/tests/decal1.3df | Bin 174813 -> 0 bytes glide2x/h3/glide/tests/display.c | 442 - glide2x/h3/glide/tests/h3dtst01.c | 200 - glide2x/h3/glide/tests/h3dtst02.c | 292 - glide2x/h3/glide/tests/lava.3df | Bin 88450 -> 0 bytes glide2x/h3/glide/tests/light.3df | 5 - glide2x/h3/glide/tests/makefile | 145 - glide2x/h3/glide/tests/makefile.distrib | 15 - glide2x/h3/glide/tests/makefile.linux | 77 - glide2x/h3/glide/tests/matt1.3df | Bin 174813 -> 0 bytes glide2x/h3/glide/tests/miro.3df | Bin 174813 -> 0 bytes glide2x/h3/glide/tests/p8.3df | Bin 86520 -> 0 bytes glide2x/h3/glide/tests/plib.c | 1397 -- glide2x/h3/glide/tests/plib.h | 129 - glide2x/h3/glide/tests/qatest00.c | 1239 -- glide2x/h3/glide/tests/qatest00.h | 94 - glide2x/h3/glide/tests/qatest01.c | 171 - glide2x/h3/glide/tests/rgb332.3df | Bin 87432 -> 0 bytes glide2x/h3/glide/tests/rgb565.3df | 748 - glide2x/h3/glide/tests/sst1img.bat | 48 - glide2x/h3/glide/tests/test00.c | 137 - glide2x/h3/glide/tests/test01.c | 157 - glide2x/h3/glide/tests/test02.c | 159 - glide2x/h3/glide/tests/test03.c | 154 - glide2x/h3/glide/tests/test04.c | 157 - glide2x/h3/glide/tests/test05.c | 191 - glide2x/h3/glide/tests/test06.c | 188 - glide2x/h3/glide/tests/test07.c | 171 - glide2x/h3/glide/tests/test08.c | 170 - glide2x/h3/glide/tests/test09.c | 212 - glide2x/h3/glide/tests/test10.c | 207 - glide2x/h3/glide/tests/test11.c | 260 - glide2x/h3/glide/tests/test12.c | 345 - glide2x/h3/glide/tests/test13.c | 174 - glide2x/h3/glide/tests/test14.c | 184 - glide2x/h3/glide/tests/test15.c | 217 - glide2x/h3/glide/tests/test16.c | 201 - glide2x/h3/glide/tests/test17.c | 292 - glide2x/h3/glide/tests/test18.c | 258 - glide2x/h3/glide/tests/test19.c | 369 - glide2x/h3/glide/tests/test20.c | 320 - glide2x/h3/glide/tests/test21.c | 374 - glide2x/h3/glide/tests/test22.c | 306 - glide2x/h3/glide/tests/test23.c | 260 - glide2x/h3/glide/tests/test24.c | 255 - glide2x/h3/glide/tests/test25.c | 898 - glide2x/h3/glide/tests/test26.c | 370 - glide2x/h3/glide/tests/test27.c | 204 - glide2x/h3/glide/tests/test28.c | 229 - glide2x/h3/glide/tests/test29.c | 271 - glide2x/h3/glide/tests/testdesc.txt | 46 - glide2x/h3/glide/tests/testimg.bat | 48 - glide2x/h3/glide/tests/tldata.inc | 69 - glide2x/h3/glide/tests/tlib.c | 1787 -- glide2x/h3/glide/tests/tlib.h | 141 - glide2x/h3/glide/tests/yiq.3df | Bin 87319 -> 0 bytes glide2x/h3/include/makefile | 26 - glide2x/h3/include/makefile.linux | 26 - glide2x/h3/incsrc/fxhal.h | 217 - glide2x/h3/incsrc/fxvid.h | 52 - glide2x/h3/incsrc/gdebug.h | 144 - glide2x/h3/incsrc/h3.h | 36 - glide2x/h3/incsrc/h3cinit.h | 153 - glide2x/h3/incsrc/h3defs.h | 1346 -- glide2x/h3/incsrc/h3gdefs.h | 307 - glide2x/h3/incsrc/h3hwc.h | 154 - glide2x/h3/incsrc/h3info.h | 95 - glide2x/h3/incsrc/h3regs.h | 386 - glide2x/h3/incsrc/makefile | 29 - glide2x/h3/incsrc/makefile.linux | 29 - glide2x/h3/incsrc/sst1vid.h | 128 - glide2x/h3/incsrc/vector.h | 63 - glide2x/h3/incsrc/vxd.h | 39 - glide2x/h3/lib/makefile | 26 - glide2x/h3/lib/makefile.linux | 26 - glide2x/h3/libsrc/makefile | 27 - glide2x/h3/libsrc/makefile.linux | 26 - glide2x/h3/makefile | 38 - glide2x/h3/makefile.linux | 40 - glide2x/h3/minihwc/dos_mode.c | 113 - glide2x/h3/minihwc/dxdrvr.c | 1024 -- glide2x/h3/minihwc/exttest.c | 243 - glide2x/h3/minihwc/fxhwc.h | 46 - glide2x/h3/minihwc/gdebug.c | 491 - glide2x/h3/minihwc/hwcext.h | 459 - glide2x/h3/minihwc/hwcio.c | 808 - glide2x/h3/minihwc/hwcio.h | 83 - glide2x/h3/minihwc/initvga.h | 121 - glide2x/h3/minihwc/linhwc.c | 1256 -- glide2x/h3/minihwc/makefile | 76 - glide2x/h3/minihwc/makefile.linux | 42 - glide2x/h3/minihwc/minihwc.c | 3807 ----- glide2x/h3/minihwc/minihwc.h | 553 - glide2x/h3/minihwc/qmodes.h | 402 - glide2x/h3/minihwc/setmode.h | 28 - glide2x/h3/minihwc/test/exttest.c | 234 - glide2x/h3/minihwc/test/makefile | 39 - glide2x/h3/minihwc/test/test.c | 64 - glide2x/h3/minihwc/tv.h | 573 - glide2x/h3/minihwc/win_mode.c | 682 - glide2x/makefile.linux | 62 - glide2x/sst1/bin/makefile.linux | 26 - glide2x/sst1/bin/makefile.unix | 26 - glide2x/sst1/binsrc/makefile.linux | 26 - glide2x/sst1/binsrc/makefile.unix | 26 - glide2x/sst1/cmd/makefile.linux | 27 - glide2x/sst1/cmd/makefile.unix | 27 - glide2x/sst1/cmd/pass/makefile.linux | 40 - glide2x/sst1/cmd/pass/makefile.unix | 40 - glide2x/sst1/cmd/pass/pass.c | 48 - glide2x/sst1/glide/makefile.linux | 24 - glide2x/sst1/glide/makefile.unix | 24 - glide2x/sst1/glide/src/banner.inc | 122 - glide2x/sst1/glide/src/cpudetect.c | 47 - glide2x/sst1/glide/src/cpudtect.S | 130 - glide2x/sst1/glide/src/cpudtect.asm | 160 - glide2x/sst1/glide/src/ddgump.c | 604 - glide2x/sst1/glide/src/diglide.c | 346 - glide2x/sst1/glide/src/digutex.c | 562 - glide2x/sst1/glide/src/disst.c | 167 - glide2x/sst1/glide/src/ditex.c | 642 - glide2x/sst1/glide/src/fxbldno.c | 52 - glide2x/sst1/glide/src/fxgasm.c | 194 - glide2x/sst1/glide/src/fxglide.h | 1406 -- glide2x/sst1/glide/src/fxinline.h | 27 - glide2x/sst1/glide/src/g3df.c | 523 - glide2x/sst1/glide/src/gaa.c | 846 - glide2x/sst1/glide/src/gbanner.c | 184 - glide2x/sst1/glide/src/gdraw.c | 528 - glide2x/sst1/glide/src/gerror.c | 161 - glide2x/sst1/glide/src/gglide.c | 2089 --- glide2x/sst1/glide/src/glfb.c | 1020 -- glide2x/sst1/glide/src/glide.h | 1518 -- glide2x/sst1/glide/src/glide.rc | 71 - glide2x/sst1/glide/src/glidesys.h | 108 - glide2x/sst1/glide/src/glideutl.h | 186 - glide2x/sst1/glide/src/gmovie.c | 49 - glide2x/sst1/glide/src/gpci.c | 1030 -- glide2x/sst1/glide/src/gsplash.c | 896 - glide2x/sst1/glide/src/gsst.c | 1423 -- glide2x/sst1/glide/src/gsstdef.h | 231 - glide2x/sst1/glide/src/gtex.c | 752 - glide2x/sst1/glide/src/gtexdl.c | 725 - glide2x/sst1/glide/src/gu.c | 432 - glide2x/sst1/glide/src/guclip.c | 423 - glide2x/sst1/glide/src/gump.c | 90 - glide2x/sst1/glide/src/gump.h | 59 - glide2x/sst1/glide/src/gutex.c | 167 - glide2x/sst1/glide/src/gxdraw.c | 859 - glide2x/sst1/glide/src/makefile.linux | 199 - glide2x/sst1/glide/src/makefile.unix | 197 - glide2x/sst1/glide/src/rcver.h | 60 - glide2x/sst1/glide/src/readme | 40 - glide2x/sst1/glide/src/splshdat.c | 17359 -------------------- glide2x/sst1/glide/src/sst96.c | 743 - glide2x/sst1/glide/src/xdraw.S | 695 - glide2x/sst1/glide/src/xdraw.asm | 656 - glide2x/sst1/glide/src/xdraw96.S | 713 - glide2x/sst1/glide/src/xdraw96.asm | 686 - glide2x/sst1/glide/tests/alpha.3df | Bin 87428 -> 0 bytes glide2x/sst1/glide/tests/ap88.3df | Bin 173903 -> 0 bytes glide2x/sst1/glide/tests/argb1555.3df | 806 - glide2x/sst1/glide/tests/argb4444.3df | 5 - glide2x/sst1/glide/tests/argb8332.3df | Bin 174815 -> 0 bytes glide2x/sst1/glide/tests/argb8888.3df | Bin 349577 -> 0 bytes glide2x/sst1/glide/tests/ayiq.3df | Bin 174705 -> 0 bytes glide2x/sst1/glide/tests/cmp.bat | 65 - glide2x/sst1/glide/tests/decal1.3df | Bin 174813 -> 0 bytes glide2x/sst1/glide/tests/display.c | 446 - glide2x/sst1/glide/tests/h3dtst01.c | 201 - glide2x/sst1/glide/tests/h3dtst02.c | 292 - glide2x/sst1/glide/tests/lava.3df | Bin 88450 -> 0 bytes glide2x/sst1/glide/tests/light.3df | 5 - glide2x/sst1/glide/tests/makefile | 145 - glide2x/sst1/glide/tests/makefile.distrib | 15 - glide2x/sst1/glide/tests/makefile.linux | 76 - glide2x/sst1/glide/tests/makefile.unix | 71 - glide2x/sst1/glide/tests/matt1.3df | Bin 174813 -> 0 bytes glide2x/sst1/glide/tests/miro.3df | Bin 174813 -> 0 bytes glide2x/sst1/glide/tests/p8.3df | Bin 86520 -> 0 bytes glide2x/sst1/glide/tests/plib.c | 1384 -- glide2x/sst1/glide/tests/plib.h | 143 - glide2x/sst1/glide/tests/qatest00.c | 1240 -- glide2x/sst1/glide/tests/qatest00.h | 94 - glide2x/sst1/glide/tests/qatest01.c | 172 - glide2x/sst1/glide/tests/rgb332.3df | Bin 87432 -> 0 bytes glide2x/sst1/glide/tests/rgb565.3df | 748 - glide2x/sst1/glide/tests/sst1img.bat | 48 - glide2x/sst1/glide/tests/test00.c | 136 - glide2x/sst1/glide/tests/test01.c | 157 - glide2x/sst1/glide/tests/test02.c | 159 - glide2x/sst1/glide/tests/test03.c | 154 - glide2x/sst1/glide/tests/test04.c | 157 - glide2x/sst1/glide/tests/test05.c | 191 - glide2x/sst1/glide/tests/test06.c | 188 - glide2x/sst1/glide/tests/test07.c | 171 - glide2x/sst1/glide/tests/test08.c | 170 - glide2x/sst1/glide/tests/test09.c | 212 - glide2x/sst1/glide/tests/test10.c | 207 - glide2x/sst1/glide/tests/test11.c | 260 - glide2x/sst1/glide/tests/test12.c | 345 - glide2x/sst1/glide/tests/test13.c | 174 - glide2x/sst1/glide/tests/test14.c | 184 - glide2x/sst1/glide/tests/test15.c | 217 - glide2x/sst1/glide/tests/test16.c | 201 - glide2x/sst1/glide/tests/test17.c | 292 - glide2x/sst1/glide/tests/test18.c | 258 - glide2x/sst1/glide/tests/test19.c | 369 - glide2x/sst1/glide/tests/test20.c | 320 - glide2x/sst1/glide/tests/test21.c | 374 - glide2x/sst1/glide/tests/test22.c | 306 - glide2x/sst1/glide/tests/test23.c | 260 - glide2x/sst1/glide/tests/test24.c | 255 - glide2x/sst1/glide/tests/test25.c | 897 - glide2x/sst1/glide/tests/test26.c | 375 - glide2x/sst1/glide/tests/test27.c | 203 - glide2x/sst1/glide/tests/test28.c | 229 - glide2x/sst1/glide/tests/test29.c | 271 - glide2x/sst1/glide/tests/testdesc.txt | 46 - glide2x/sst1/glide/tests/testimg.bat | 48 - glide2x/sst1/glide/tests/tldata.inc | 69 - glide2x/sst1/glide/tests/tlib.c | 1863 --- glide2x/sst1/glide/tests/tlib.h | 144 - glide2x/sst1/glide/tests/yiq.3df | Bin 87319 -> 0 bytes glide2x/sst1/include/makefile.linux | 26 - glide2x/sst1/include/makefile.unix | 26 - glide2x/sst1/incsrc/makefile.linux | 25 - glide2x/sst1/incsrc/makefile.sun | 29 - glide2x/sst1/incsrc/makefile.unix | 25 - glide2x/sst1/incsrc/ncc.h | 41 - glide2x/sst1/incsrc/sst.h | 1107 -- glide2x/sst1/init/fxinit.h | 125 - glide2x/sst1/init/h3drvr.c | 120 - glide2x/sst1/init/init.c | 827 - glide2x/sst1/init/init.h | 403 - glide2x/sst1/init/init96/atvga.h | 86 - glide2x/sst1/init/init96/dxdrvr.c | 1006 -- glide2x/sst1/init/init96/fxinit96.h | 136 - glide2x/sst1/init/init96/init96.c | 2241 --- glide2x/sst1/init/init96/init96.h | 69 - glide2x/sst1/init/init96/initat3d.h | 51 - glide2x/sst1/init/init96/initmcrx.c | 612 - glide2x/sst1/init/init96/initmcrx.h | 52 - glide2x/sst1/init/init96/initvga.h | 121 - glide2x/sst1/init/init96/lindrvr.c | 575 - glide2x/sst1/init/init96/makefile.linux | 56 - glide2x/sst1/init/init96/makefile.unix | 56 - glide2x/sst1/init/init96/readme.txt | 37 - glide2x/sst1/init/initvg/MAKEFILE.new | 53 - glide2x/sst1/init/initvg/dac.c | 1211 -- glide2x/sst1/init/initvg/gamma.c | 256 - glide2x/sst1/init/initvg/gdebug.c | 264 - glide2x/sst1/init/initvg/gdebug.h | 68 - glide2x/sst1/init/initvg/info.c | 589 - glide2x/sst1/init/initvg/init.rc | 65 - glide2x/sst1/init/initvg/makefile.linux | 56 - glide2x/sst1/init/initvg/makefile.unix | 56 - glide2x/sst1/init/initvg/parse.c | 920 -- glide2x/sst1/init/initvg/print.c | 81 - glide2x/sst1/init/initvg/rcver.h | 25 - glide2x/sst1/init/initvg/sli.c | 544 - glide2x/sst1/init/initvg/sst1init.c | 916 -- glide2x/sst1/init/initvg/sst1init.h | 1246 -- glide2x/sst1/init/initvg/util.c | 359 - glide2x/sst1/init/initvg/video.c | 1106 -- glide2x/sst1/init/makefile.linux | 51 - glide2x/sst1/init/makefile.unix | 51 - glide2x/sst1/init/project.txt | 80 - glide2x/sst1/init/sst1vid.h | 109 - glide2x/sst1/init/tests/test_a.c | 105 - glide2x/sst1/init/tests/test_b.c | 73 - glide2x/sst1/init/vg96drvr.c | 192 - glide2x/sst1/init/vgdrvr.c | 201 - glide2x/sst1/lib/makefile.linux | 26 - glide2x/sst1/lib/makefile.sun | 26 - glide2x/sst1/lib/makefile.unix | 26 - glide2x/sst1/libsrc/makefile.linux | 26 - glide2x/sst1/libsrc/makefile.unix | 26 - glide2x/sst1/makefile.linux | 24 - glide2x/sst1/makefile.unix | 24 - 524 files changed, 226328 deletions(-) delete mode 100644 Device3Dfx/3dfx_driver.c delete mode 100644 Device3Dfx/Device3Dfx.spec delete mode 100644 Device3Dfx/Makefile delete mode 100644 Device3Dfx/kinfo.c delete mode 100644 Device3Dfx/mtrrs.c delete mode 100644 glide2x/README delete mode 100644 glide2x/cvg/bin/makefile delete mode 100644 glide2x/cvg/bin/makefile.linux delete mode 100644 glide2x/cvg/binsrc/makefile delete mode 100644 glide2x/cvg/binsrc/makefile.linux delete mode 100644 glide2x/cvg/cmd/makefile.linux delete mode 100644 glide2x/cvg/cmd/pass/makefile.linux delete mode 100644 glide2x/cvg/cmd/pass/pass.c delete mode 100644 glide2x/cvg/glide/makefile delete mode 100644 glide2x/cvg/glide/makefile.linux delete mode 100644 glide2x/cvg/glide/makefile.unix delete mode 100644 glide2x/cvg/glide/oem/fxbldno.c delete mode 100644 glide2x/cvg/glide/oem/makefile delete mode 100644 glide2x/cvg/glide/oem/makefile.linux delete mode 100644 glide2x/cvg/glide/oem/oeminit.c delete mode 100644 glide2x/cvg/glide/oem/oeminit.h delete mode 100644 glide2x/cvg/glide/oem/oeminit.rc delete mode 100644 glide2x/cvg/glide/oem/rcver.h delete mode 100644 glide2x/cvg/glide/src/banner.inc delete mode 100644 glide2x/cvg/glide/src/cpudetect.c delete mode 100644 glide2x/cvg/glide/src/cpudtect.S delete mode 100644 glide2x/cvg/glide/src/cpudtect.asm delete mode 100644 glide2x/cvg/glide/src/ddgump.c delete mode 100644 glide2x/cvg/glide/src/diglide.c delete mode 100644 glide2x/cvg/glide/src/digutex.c delete mode 100644 glide2x/cvg/glide/src/disst.c delete mode 100644 glide2x/cvg/glide/src/distate.c delete mode 100644 glide2x/cvg/glide/src/distrip.c delete mode 100644 glide2x/cvg/glide/src/ditex.c delete mode 100644 glide2x/cvg/glide/src/fifo.c delete mode 100644 glide2x/cvg/glide/src/fxbldno.c delete mode 100644 glide2x/cvg/glide/src/fxgasm.c delete mode 100644 glide2x/cvg/glide/src/fxglide.h delete mode 100644 glide2x/cvg/glide/src/g3df.c delete mode 100644 glide2x/cvg/glide/src/gaa.c delete mode 100644 glide2x/cvg/glide/src/gbanner.c delete mode 100644 glide2x/cvg/glide/src/gdraw.c delete mode 100644 glide2x/cvg/glide/src/gerror.c delete mode 100644 glide2x/cvg/glide/src/gglide.c delete mode 100644 glide2x/cvg/glide/src/glfb.c delete mode 100644 glide2x/cvg/glide/src/glide.h delete mode 100644 glide2x/cvg/glide/src/glide.rc delete mode 100644 glide2x/cvg/glide/src/glidesys.h delete mode 100644 glide2x/cvg/glide/src/glideutl.h delete mode 100644 glide2x/cvg/glide/src/gmovie.c delete mode 100644 glide2x/cvg/glide/src/gpci.c delete mode 100644 glide2x/cvg/glide/src/gsplash.c delete mode 100644 glide2x/cvg/glide/src/gsst.c delete mode 100644 glide2x/cvg/glide/src/gsstdef.h delete mode 100644 glide2x/cvg/glide/src/gstrip.c delete mode 100644 glide2x/cvg/glide/src/gtex.c delete mode 100644 glide2x/cvg/glide/src/gtexdl.c delete mode 100644 glide2x/cvg/glide/src/gu.c delete mode 100644 glide2x/cvg/glide/src/guclip.c delete mode 100644 glide2x/cvg/glide/src/gump.c delete mode 100644 glide2x/cvg/glide/src/gump.h delete mode 100644 glide2x/cvg/glide/src/gutex.c delete mode 100644 glide2x/cvg/glide/src/gxdraw.c delete mode 100644 glide2x/cvg/glide/src/makefile delete mode 100644 glide2x/cvg/glide/src/makefile.linux delete mode 100644 glide2x/cvg/glide/src/rcver.h delete mode 100644 glide2x/cvg/glide/src/readme delete mode 100644 glide2x/cvg/glide/src/splshdat.c delete mode 100644 glide2x/cvg/glide/src/xdraw2.S delete mode 100644 glide2x/cvg/glide/src/xdraw2.asm delete mode 100644 glide2x/cvg/glide/src/xdraw2.inc delete mode 100644 glide2x/cvg/glide/src/xdraw2.inc.S delete mode 100644 glide2x/cvg/glide/tests/alpha.3df delete mode 100644 glide2x/cvg/glide/tests/ap88.3df delete mode 100644 glide2x/cvg/glide/tests/argb1555.3df delete mode 100644 glide2x/cvg/glide/tests/argb4444.3df delete mode 100644 glide2x/cvg/glide/tests/argb8332.3df delete mode 100644 glide2x/cvg/glide/tests/argb8888.3df delete mode 100644 glide2x/cvg/glide/tests/ayiq.3df delete mode 100644 glide2x/cvg/glide/tests/cmp.bat delete mode 100644 glide2x/cvg/glide/tests/decal1.3df delete mode 100644 glide2x/cvg/glide/tests/display.c delete mode 100644 glide2x/cvg/glide/tests/h3dtst01.c delete mode 100644 glide2x/cvg/glide/tests/h3dtst02.c delete mode 100644 glide2x/cvg/glide/tests/lava.3df delete mode 100644 glide2x/cvg/glide/tests/light.3df delete mode 100644 glide2x/cvg/glide/tests/makefile delete mode 100644 glide2x/cvg/glide/tests/makefile.distrib delete mode 100644 glide2x/cvg/glide/tests/makefile.linux delete mode 100644 glide2x/cvg/glide/tests/matt1.3df delete mode 100644 glide2x/cvg/glide/tests/miro.3df delete mode 100644 glide2x/cvg/glide/tests/p8.3df delete mode 100644 glide2x/cvg/glide/tests/plib.c delete mode 100644 glide2x/cvg/glide/tests/plib.h delete mode 100644 glide2x/cvg/glide/tests/qatest00.c delete mode 100644 glide2x/cvg/glide/tests/qatest00.h delete mode 100644 glide2x/cvg/glide/tests/qatest01.c delete mode 100644 glide2x/cvg/glide/tests/rgb332.3df delete mode 100644 glide2x/cvg/glide/tests/rgb565.3df delete mode 100644 glide2x/cvg/glide/tests/sst1img.bat delete mode 100644 glide2x/cvg/glide/tests/test00.c delete mode 100644 glide2x/cvg/glide/tests/test01.c delete mode 100644 glide2x/cvg/glide/tests/test02.c delete mode 100644 glide2x/cvg/glide/tests/test03.c delete mode 100644 glide2x/cvg/glide/tests/test04.c delete mode 100644 glide2x/cvg/glide/tests/test05.c delete mode 100644 glide2x/cvg/glide/tests/test06.c delete mode 100644 glide2x/cvg/glide/tests/test07.c delete mode 100644 glide2x/cvg/glide/tests/test08.c delete mode 100644 glide2x/cvg/glide/tests/test09.c delete mode 100644 glide2x/cvg/glide/tests/test10.c delete mode 100644 glide2x/cvg/glide/tests/test11.c delete mode 100644 glide2x/cvg/glide/tests/test12.c delete mode 100644 glide2x/cvg/glide/tests/test13.c delete mode 100644 glide2x/cvg/glide/tests/test14.c delete mode 100644 glide2x/cvg/glide/tests/test15.c delete mode 100644 glide2x/cvg/glide/tests/test16.c delete mode 100644 glide2x/cvg/glide/tests/test17.c delete mode 100644 glide2x/cvg/glide/tests/test18.c delete mode 100644 glide2x/cvg/glide/tests/test19.c delete mode 100644 glide2x/cvg/glide/tests/test20.c delete mode 100644 glide2x/cvg/glide/tests/test21.c delete mode 100644 glide2x/cvg/glide/tests/test22.c delete mode 100644 glide2x/cvg/glide/tests/test23.c delete mode 100644 glide2x/cvg/glide/tests/test24.c delete mode 100644 glide2x/cvg/glide/tests/test25.c delete mode 100644 glide2x/cvg/glide/tests/test26.c delete mode 100644 glide2x/cvg/glide/tests/test27.c delete mode 100644 glide2x/cvg/glide/tests/test28.c delete mode 100644 glide2x/cvg/glide/tests/test29.c delete mode 100644 glide2x/cvg/glide/tests/testdesc.txt delete mode 100644 glide2x/cvg/glide/tests/testimg.bat delete mode 100644 glide2x/cvg/glide/tests/tldata.inc delete mode 100644 glide2x/cvg/glide/tests/tlib.c delete mode 100644 glide2x/cvg/glide/tests/tlib.h delete mode 100644 glide2x/cvg/glide/tests/yiq.3df delete mode 100644 glide2x/cvg/include/makefile delete mode 100644 glide2x/cvg/include/makefile.linux delete mode 100644 glide2x/cvg/incsrc/cvg.h delete mode 100644 glide2x/cvg/incsrc/cvgdefs.h delete mode 100644 glide2x/cvg/incsrc/cvginfo.h delete mode 100644 glide2x/cvg/incsrc/cvgregs.h delete mode 100644 glide2x/cvg/incsrc/fxhal.h delete mode 100644 glide2x/cvg/incsrc/gdebug.h delete mode 100644 glide2x/cvg/incsrc/h3.h delete mode 100644 glide2x/cvg/incsrc/makefile delete mode 100644 glide2x/cvg/incsrc/makefile.linux delete mode 100644 glide2x/cvg/incsrc/sst1vid.h delete mode 100644 glide2x/cvg/incsrc/vxd.h delete mode 100644 glide2x/cvg/init/canopus.c delete mode 100644 glide2x/cvg/init/canopus.h delete mode 100644 glide2x/cvg/init/dac.c delete mode 100644 glide2x/cvg/init/gamma.c delete mode 100644 glide2x/cvg/init/gdebug.c delete mode 100644 glide2x/cvg/init/info.c delete mode 100644 glide2x/cvg/init/init.rc delete mode 100644 glide2x/cvg/init/makefile delete mode 100644 glide2x/cvg/init/makefile.linux delete mode 100644 glide2x/cvg/init/parse.c delete mode 100644 glide2x/cvg/init/print.c delete mode 100644 glide2x/cvg/init/rcver.h delete mode 100644 glide2x/cvg/init/sli.c delete mode 100644 glide2x/cvg/init/sst1init.c delete mode 100644 glide2x/cvg/init/sst1init.h delete mode 100644 glide2x/cvg/init/util.c delete mode 100644 glide2x/cvg/init/video.c delete mode 100644 glide2x/cvg/init/voodoo2.ini delete mode 100644 glide2x/cvg/lib/makefile delete mode 100644 glide2x/cvg/lib/makefile.linux delete mode 100644 glide2x/cvg/libsrc/makefile delete mode 100644 glide2x/cvg/libsrc/makefile.linux delete mode 100644 glide2x/cvg/makefile delete mode 100644 glide2x/cvg/makefile.linux delete mode 100644 glide2x/glide_license.txt delete mode 100644 glide2x/h3/bin/makefile delete mode 100644 glide2x/h3/bin/makefile.linux delete mode 100644 glide2x/h3/binsrc/makefile delete mode 100644 glide2x/h3/binsrc/makefile.linux delete mode 100644 glide2x/h3/glide/makefile delete mode 100644 glide2x/h3/glide/makefile.linux delete mode 100644 glide2x/h3/glide/src/cpudtect.S delete mode 100644 glide2x/h3/glide/src/cpudtect.asm delete mode 100644 glide2x/h3/glide/src/ddgu.c delete mode 100644 glide2x/h3/glide/src/ddgump.c delete mode 100644 glide2x/h3/glide/src/diglide.c delete mode 100644 glide2x/h3/glide/src/digutex.c delete mode 100644 glide2x/h3/glide/src/disst.c delete mode 100644 glide2x/h3/glide/src/distate.c delete mode 100644 glide2x/h3/glide/src/distrip.c delete mode 100644 glide2x/h3/glide/src/ditex.c delete mode 100644 glide2x/h3/glide/src/fifo.c delete mode 100644 glide2x/h3/glide/src/fxbldno.c delete mode 100644 glide2x/h3/glide/src/fxgasm.c delete mode 100644 glide2x/h3/glide/src/fxglide.h delete mode 100644 glide2x/h3/glide/src/fxsplash.h delete mode 100644 glide2x/h3/glide/src/g3df.c delete mode 100644 glide2x/h3/glide/src/gaa.c delete mode 100644 glide2x/h3/glide/src/gbanner.c delete mode 100644 glide2x/h3/glide/src/gdraw.c delete mode 100644 glide2x/h3/glide/src/gerror.c delete mode 100644 glide2x/h3/glide/src/gglide.c delete mode 100644 glide2x/h3/glide/src/glfb.c delete mode 100644 glide2x/h3/glide/src/glide.h delete mode 100644 glide2x/h3/glide/src/glide.rc delete mode 100644 glide2x/h3/glide/src/glide.rx delete mode 100644 glide2x/h3/glide/src/glidesys.h delete mode 100644 glide2x/h3/glide/src/glideutl.h delete mode 100644 glide2x/h3/glide/src/glimport.asm delete mode 100644 glide2x/h3/glide/src/gmovie.c delete mode 100644 glide2x/h3/glide/src/gpci.c delete mode 100644 glide2x/h3/glide/src/gsplash.c delete mode 100644 glide2x/h3/glide/src/gsst.c delete mode 100644 glide2x/h3/glide/src/gsstdef.h delete mode 100644 glide2x/h3/glide/src/gstrip.c delete mode 100644 glide2x/h3/glide/src/gtex.c delete mode 100644 glide2x/h3/glide/src/gtexdl.c delete mode 100644 glide2x/h3/glide/src/gu.c delete mode 100644 glide2x/h3/glide/src/guclip.c delete mode 100644 glide2x/h3/glide/src/gump.c delete mode 100644 glide2x/h3/glide/src/gump.h delete mode 100644 glide2x/h3/glide/src/gutex.c delete mode 100644 glide2x/h3/glide/src/gxdraw.c delete mode 100644 glide2x/h3/glide/src/makefile delete mode 100644 glide2x/h3/glide/src/makefile.linux delete mode 100644 glide2x/h3/glide/src/qmodes.h delete mode 100644 glide2x/h3/glide/src/rcver.h delete mode 100644 glide2x/h3/glide/src/readme delete mode 100644 glide2x/h3/glide/src/splshdat.c delete mode 100644 glide2x/h3/glide/src/tv.h delete mode 100644 glide2x/h3/glide/src/xdraw2.S delete mode 100644 glide2x/h3/glide/src/xdraw2.asm delete mode 100644 glide2x/h3/glide/src/xdraw2.inc delete mode 100644 glide2x/h3/glide/src/xdraw2.inc.S delete mode 100644 glide2x/h3/glide/src/xtexdl.S delete mode 100644 glide2x/h3/glide/src/xtexdl.asm delete mode 100644 glide2x/h3/glide/src/xtexdl_def.c delete mode 100644 glide2x/h3/glide/tests/alpha.3df delete mode 100644 glide2x/h3/glide/tests/ap88.3df delete mode 100644 glide2x/h3/glide/tests/argb1555.3df delete mode 100644 glide2x/h3/glide/tests/argb4444.3df delete mode 100644 glide2x/h3/glide/tests/argb8332.3df delete mode 100644 glide2x/h3/glide/tests/argb8888.3df delete mode 100644 glide2x/h3/glide/tests/ayiq.3df delete mode 100644 glide2x/h3/glide/tests/cmp.bat delete mode 100644 glide2x/h3/glide/tests/decal1.3df delete mode 100644 glide2x/h3/glide/tests/display.c delete mode 100644 glide2x/h3/glide/tests/h3dtst01.c delete mode 100644 glide2x/h3/glide/tests/h3dtst02.c delete mode 100644 glide2x/h3/glide/tests/lava.3df delete mode 100644 glide2x/h3/glide/tests/light.3df delete mode 100644 glide2x/h3/glide/tests/makefile delete mode 100644 glide2x/h3/glide/tests/makefile.distrib delete mode 100644 glide2x/h3/glide/tests/makefile.linux delete mode 100644 glide2x/h3/glide/tests/matt1.3df delete mode 100644 glide2x/h3/glide/tests/miro.3df delete mode 100644 glide2x/h3/glide/tests/p8.3df delete mode 100644 glide2x/h3/glide/tests/plib.c delete mode 100644 glide2x/h3/glide/tests/plib.h delete mode 100644 glide2x/h3/glide/tests/qatest00.c delete mode 100644 glide2x/h3/glide/tests/qatest00.h delete mode 100644 glide2x/h3/glide/tests/qatest01.c delete mode 100644 glide2x/h3/glide/tests/rgb332.3df delete mode 100644 glide2x/h3/glide/tests/rgb565.3df delete mode 100644 glide2x/h3/glide/tests/sst1img.bat delete mode 100644 glide2x/h3/glide/tests/test00.c delete mode 100644 glide2x/h3/glide/tests/test01.c delete mode 100644 glide2x/h3/glide/tests/test02.c delete mode 100644 glide2x/h3/glide/tests/test03.c delete mode 100644 glide2x/h3/glide/tests/test04.c delete mode 100644 glide2x/h3/glide/tests/test05.c delete mode 100644 glide2x/h3/glide/tests/test06.c delete mode 100644 glide2x/h3/glide/tests/test07.c delete mode 100644 glide2x/h3/glide/tests/test08.c delete mode 100644 glide2x/h3/glide/tests/test09.c delete mode 100644 glide2x/h3/glide/tests/test10.c delete mode 100644 glide2x/h3/glide/tests/test11.c delete mode 100644 glide2x/h3/glide/tests/test12.c delete mode 100644 glide2x/h3/glide/tests/test13.c delete mode 100644 glide2x/h3/glide/tests/test14.c delete mode 100644 glide2x/h3/glide/tests/test15.c delete mode 100644 glide2x/h3/glide/tests/test16.c delete mode 100644 glide2x/h3/glide/tests/test17.c delete mode 100644 glide2x/h3/glide/tests/test18.c delete mode 100644 glide2x/h3/glide/tests/test19.c delete mode 100644 glide2x/h3/glide/tests/test20.c delete mode 100644 glide2x/h3/glide/tests/test21.c delete mode 100644 glide2x/h3/glide/tests/test22.c delete mode 100644 glide2x/h3/glide/tests/test23.c delete mode 100644 glide2x/h3/glide/tests/test24.c delete mode 100644 glide2x/h3/glide/tests/test25.c delete mode 100644 glide2x/h3/glide/tests/test26.c delete mode 100644 glide2x/h3/glide/tests/test27.c delete mode 100644 glide2x/h3/glide/tests/test28.c delete mode 100644 glide2x/h3/glide/tests/test29.c delete mode 100644 glide2x/h3/glide/tests/testdesc.txt delete mode 100644 glide2x/h3/glide/tests/testimg.bat delete mode 100644 glide2x/h3/glide/tests/tldata.inc delete mode 100644 glide2x/h3/glide/tests/tlib.c delete mode 100644 glide2x/h3/glide/tests/tlib.h delete mode 100644 glide2x/h3/glide/tests/yiq.3df delete mode 100644 glide2x/h3/include/makefile delete mode 100644 glide2x/h3/include/makefile.linux delete mode 100644 glide2x/h3/incsrc/fxhal.h delete mode 100644 glide2x/h3/incsrc/fxvid.h delete mode 100644 glide2x/h3/incsrc/gdebug.h delete mode 100644 glide2x/h3/incsrc/h3.h delete mode 100644 glide2x/h3/incsrc/h3cinit.h delete mode 100644 glide2x/h3/incsrc/h3defs.h delete mode 100644 glide2x/h3/incsrc/h3gdefs.h delete mode 100644 glide2x/h3/incsrc/h3hwc.h delete mode 100644 glide2x/h3/incsrc/h3info.h delete mode 100644 glide2x/h3/incsrc/h3regs.h delete mode 100644 glide2x/h3/incsrc/makefile delete mode 100644 glide2x/h3/incsrc/makefile.linux delete mode 100644 glide2x/h3/incsrc/sst1vid.h delete mode 100644 glide2x/h3/incsrc/vector.h delete mode 100644 glide2x/h3/incsrc/vxd.h delete mode 100644 glide2x/h3/lib/makefile delete mode 100644 glide2x/h3/lib/makefile.linux delete mode 100644 glide2x/h3/libsrc/makefile delete mode 100644 glide2x/h3/libsrc/makefile.linux delete mode 100644 glide2x/h3/makefile delete mode 100644 glide2x/h3/makefile.linux delete mode 100644 glide2x/h3/minihwc/dos_mode.c delete mode 100644 glide2x/h3/minihwc/dxdrvr.c delete mode 100644 glide2x/h3/minihwc/exttest.c delete mode 100644 glide2x/h3/minihwc/fxhwc.h delete mode 100644 glide2x/h3/minihwc/gdebug.c delete mode 100644 glide2x/h3/minihwc/hwcext.h delete mode 100644 glide2x/h3/minihwc/hwcio.c delete mode 100644 glide2x/h3/minihwc/hwcio.h delete mode 100644 glide2x/h3/minihwc/initvga.h delete mode 100644 glide2x/h3/minihwc/linhwc.c delete mode 100644 glide2x/h3/minihwc/makefile delete mode 100644 glide2x/h3/minihwc/makefile.linux delete mode 100644 glide2x/h3/minihwc/minihwc.c delete mode 100644 glide2x/h3/minihwc/minihwc.h delete mode 100644 glide2x/h3/minihwc/qmodes.h delete mode 100644 glide2x/h3/minihwc/setmode.h delete mode 100644 glide2x/h3/minihwc/test/exttest.c delete mode 100644 glide2x/h3/minihwc/test/makefile delete mode 100644 glide2x/h3/minihwc/test/test.c delete mode 100644 glide2x/h3/minihwc/tv.h delete mode 100644 glide2x/h3/minihwc/win_mode.c delete mode 100644 glide2x/makefile.linux delete mode 100644 glide2x/sst1/bin/makefile.linux delete mode 100644 glide2x/sst1/bin/makefile.unix delete mode 100644 glide2x/sst1/binsrc/makefile.linux delete mode 100644 glide2x/sst1/binsrc/makefile.unix delete mode 100644 glide2x/sst1/cmd/makefile.linux delete mode 100644 glide2x/sst1/cmd/makefile.unix delete mode 100644 glide2x/sst1/cmd/pass/makefile.linux delete mode 100644 glide2x/sst1/cmd/pass/makefile.unix delete mode 100644 glide2x/sst1/cmd/pass/pass.c delete mode 100644 glide2x/sst1/glide/makefile.linux delete mode 100644 glide2x/sst1/glide/makefile.unix delete mode 100644 glide2x/sst1/glide/src/banner.inc delete mode 100644 glide2x/sst1/glide/src/cpudetect.c delete mode 100644 glide2x/sst1/glide/src/cpudtect.S delete mode 100644 glide2x/sst1/glide/src/cpudtect.asm delete mode 100644 glide2x/sst1/glide/src/ddgump.c delete mode 100644 glide2x/sst1/glide/src/diglide.c delete mode 100644 glide2x/sst1/glide/src/digutex.c delete mode 100644 glide2x/sst1/glide/src/disst.c delete mode 100644 glide2x/sst1/glide/src/ditex.c delete mode 100644 glide2x/sst1/glide/src/fxbldno.c delete mode 100644 glide2x/sst1/glide/src/fxgasm.c delete mode 100644 glide2x/sst1/glide/src/fxglide.h delete mode 100644 glide2x/sst1/glide/src/fxinline.h delete mode 100644 glide2x/sst1/glide/src/g3df.c delete mode 100644 glide2x/sst1/glide/src/gaa.c delete mode 100644 glide2x/sst1/glide/src/gbanner.c delete mode 100644 glide2x/sst1/glide/src/gdraw.c delete mode 100644 glide2x/sst1/glide/src/gerror.c delete mode 100644 glide2x/sst1/glide/src/gglide.c delete mode 100644 glide2x/sst1/glide/src/glfb.c delete mode 100644 glide2x/sst1/glide/src/glide.h delete mode 100644 glide2x/sst1/glide/src/glide.rc delete mode 100644 glide2x/sst1/glide/src/glidesys.h delete mode 100644 glide2x/sst1/glide/src/glideutl.h delete mode 100644 glide2x/sst1/glide/src/gmovie.c delete mode 100644 glide2x/sst1/glide/src/gpci.c delete mode 100644 glide2x/sst1/glide/src/gsplash.c delete mode 100644 glide2x/sst1/glide/src/gsst.c delete mode 100644 glide2x/sst1/glide/src/gsstdef.h delete mode 100644 glide2x/sst1/glide/src/gtex.c delete mode 100644 glide2x/sst1/glide/src/gtexdl.c delete mode 100644 glide2x/sst1/glide/src/gu.c delete mode 100644 glide2x/sst1/glide/src/guclip.c delete mode 100644 glide2x/sst1/glide/src/gump.c delete mode 100644 glide2x/sst1/glide/src/gump.h delete mode 100644 glide2x/sst1/glide/src/gutex.c delete mode 100644 glide2x/sst1/glide/src/gxdraw.c delete mode 100644 glide2x/sst1/glide/src/makefile.linux delete mode 100644 glide2x/sst1/glide/src/makefile.unix delete mode 100644 glide2x/sst1/glide/src/rcver.h delete mode 100644 glide2x/sst1/glide/src/readme delete mode 100644 glide2x/sst1/glide/src/splshdat.c delete mode 100644 glide2x/sst1/glide/src/sst96.c delete mode 100644 glide2x/sst1/glide/src/xdraw.S delete mode 100644 glide2x/sst1/glide/src/xdraw.asm delete mode 100644 glide2x/sst1/glide/src/xdraw96.S delete mode 100644 glide2x/sst1/glide/src/xdraw96.asm delete mode 100644 glide2x/sst1/glide/tests/alpha.3df delete mode 100644 glide2x/sst1/glide/tests/ap88.3df delete mode 100644 glide2x/sst1/glide/tests/argb1555.3df delete mode 100644 glide2x/sst1/glide/tests/argb4444.3df delete mode 100644 glide2x/sst1/glide/tests/argb8332.3df delete mode 100644 glide2x/sst1/glide/tests/argb8888.3df delete mode 100644 glide2x/sst1/glide/tests/ayiq.3df delete mode 100644 glide2x/sst1/glide/tests/cmp.bat delete mode 100644 glide2x/sst1/glide/tests/decal1.3df delete mode 100644 glide2x/sst1/glide/tests/display.c delete mode 100644 glide2x/sst1/glide/tests/h3dtst01.c delete mode 100644 glide2x/sst1/glide/tests/h3dtst02.c delete mode 100644 glide2x/sst1/glide/tests/lava.3df delete mode 100644 glide2x/sst1/glide/tests/light.3df delete mode 100644 glide2x/sst1/glide/tests/makefile delete mode 100644 glide2x/sst1/glide/tests/makefile.distrib delete mode 100644 glide2x/sst1/glide/tests/makefile.linux delete mode 100644 glide2x/sst1/glide/tests/makefile.unix delete mode 100644 glide2x/sst1/glide/tests/matt1.3df delete mode 100644 glide2x/sst1/glide/tests/miro.3df delete mode 100644 glide2x/sst1/glide/tests/p8.3df delete mode 100644 glide2x/sst1/glide/tests/plib.c delete mode 100644 glide2x/sst1/glide/tests/plib.h delete mode 100644 glide2x/sst1/glide/tests/qatest00.c delete mode 100644 glide2x/sst1/glide/tests/qatest00.h delete mode 100644 glide2x/sst1/glide/tests/qatest01.c delete mode 100644 glide2x/sst1/glide/tests/rgb332.3df delete mode 100644 glide2x/sst1/glide/tests/rgb565.3df delete mode 100644 glide2x/sst1/glide/tests/sst1img.bat delete mode 100644 glide2x/sst1/glide/tests/test00.c delete mode 100644 glide2x/sst1/glide/tests/test01.c delete mode 100644 glide2x/sst1/glide/tests/test02.c delete mode 100644 glide2x/sst1/glide/tests/test03.c delete mode 100644 glide2x/sst1/glide/tests/test04.c delete mode 100644 glide2x/sst1/glide/tests/test05.c delete mode 100644 glide2x/sst1/glide/tests/test06.c delete mode 100644 glide2x/sst1/glide/tests/test07.c delete mode 100644 glide2x/sst1/glide/tests/test08.c delete mode 100644 glide2x/sst1/glide/tests/test09.c delete mode 100644 glide2x/sst1/glide/tests/test10.c delete mode 100644 glide2x/sst1/glide/tests/test11.c delete mode 100644 glide2x/sst1/glide/tests/test12.c delete mode 100644 glide2x/sst1/glide/tests/test13.c delete mode 100644 glide2x/sst1/glide/tests/test14.c delete mode 100644 glide2x/sst1/glide/tests/test15.c delete mode 100644 glide2x/sst1/glide/tests/test16.c delete mode 100644 glide2x/sst1/glide/tests/test17.c delete mode 100644 glide2x/sst1/glide/tests/test18.c delete mode 100644 glide2x/sst1/glide/tests/test19.c delete mode 100644 glide2x/sst1/glide/tests/test20.c delete mode 100644 glide2x/sst1/glide/tests/test21.c delete mode 100644 glide2x/sst1/glide/tests/test22.c delete mode 100644 glide2x/sst1/glide/tests/test23.c delete mode 100644 glide2x/sst1/glide/tests/test24.c delete mode 100644 glide2x/sst1/glide/tests/test25.c delete mode 100644 glide2x/sst1/glide/tests/test26.c delete mode 100644 glide2x/sst1/glide/tests/test27.c delete mode 100644 glide2x/sst1/glide/tests/test28.c delete mode 100644 glide2x/sst1/glide/tests/test29.c delete mode 100644 glide2x/sst1/glide/tests/testdesc.txt delete mode 100644 glide2x/sst1/glide/tests/testimg.bat delete mode 100644 glide2x/sst1/glide/tests/tldata.inc delete mode 100644 glide2x/sst1/glide/tests/tlib.c delete mode 100644 glide2x/sst1/glide/tests/tlib.h delete mode 100644 glide2x/sst1/glide/tests/yiq.3df delete mode 100644 glide2x/sst1/include/makefile.linux delete mode 100644 glide2x/sst1/include/makefile.unix delete mode 100644 glide2x/sst1/incsrc/makefile.linux delete mode 100644 glide2x/sst1/incsrc/makefile.sun delete mode 100644 glide2x/sst1/incsrc/makefile.unix delete mode 100644 glide2x/sst1/incsrc/ncc.h delete mode 100644 glide2x/sst1/incsrc/sst.h delete mode 100644 glide2x/sst1/init/fxinit.h delete mode 100644 glide2x/sst1/init/h3drvr.c delete mode 100644 glide2x/sst1/init/init.c delete mode 100644 glide2x/sst1/init/init.h delete mode 100644 glide2x/sst1/init/init96/atvga.h delete mode 100644 glide2x/sst1/init/init96/dxdrvr.c delete mode 100644 glide2x/sst1/init/init96/fxinit96.h delete mode 100644 glide2x/sst1/init/init96/init96.c delete mode 100644 glide2x/sst1/init/init96/init96.h delete mode 100644 glide2x/sst1/init/init96/initat3d.h delete mode 100644 glide2x/sst1/init/init96/initmcrx.c delete mode 100644 glide2x/sst1/init/init96/initmcrx.h delete mode 100644 glide2x/sst1/init/init96/initvga.h delete mode 100644 glide2x/sst1/init/init96/lindrvr.c delete mode 100644 glide2x/sst1/init/init96/makefile.linux delete mode 100644 glide2x/sst1/init/init96/makefile.unix delete mode 100644 glide2x/sst1/init/init96/readme.txt delete mode 100644 glide2x/sst1/init/initvg/MAKEFILE.new delete mode 100644 glide2x/sst1/init/initvg/dac.c delete mode 100644 glide2x/sst1/init/initvg/gamma.c delete mode 100644 glide2x/sst1/init/initvg/gdebug.c delete mode 100644 glide2x/sst1/init/initvg/gdebug.h delete mode 100644 glide2x/sst1/init/initvg/info.c delete mode 100644 glide2x/sst1/init/initvg/init.rc delete mode 100644 glide2x/sst1/init/initvg/makefile.linux delete mode 100644 glide2x/sst1/init/initvg/makefile.unix delete mode 100644 glide2x/sst1/init/initvg/parse.c delete mode 100644 glide2x/sst1/init/initvg/print.c delete mode 100644 glide2x/sst1/init/initvg/rcver.h delete mode 100644 glide2x/sst1/init/initvg/sli.c delete mode 100644 glide2x/sst1/init/initvg/sst1init.c delete mode 100644 glide2x/sst1/init/initvg/sst1init.h delete mode 100644 glide2x/sst1/init/initvg/util.c delete mode 100644 glide2x/sst1/init/initvg/video.c delete mode 100644 glide2x/sst1/init/makefile.linux delete mode 100644 glide2x/sst1/init/makefile.unix delete mode 100644 glide2x/sst1/init/project.txt delete mode 100644 glide2x/sst1/init/sst1vid.h delete mode 100644 glide2x/sst1/init/tests/test_a.c delete mode 100644 glide2x/sst1/init/tests/test_b.c delete mode 100644 glide2x/sst1/init/vg96drvr.c delete mode 100644 glide2x/sst1/init/vgdrvr.c delete mode 100644 glide2x/sst1/lib/makefile.linux delete mode 100644 glide2x/sst1/lib/makefile.sun delete mode 100644 glide2x/sst1/lib/makefile.unix delete mode 100644 glide2x/sst1/libsrc/makefile.linux delete mode 100644 glide2x/sst1/libsrc/makefile.unix delete mode 100644 glide2x/sst1/makefile.linux delete mode 100644 glide2x/sst1/makefile.unix diff --git a/Device3Dfx/3dfx_driver.c b/Device3Dfx/3dfx_driver.c deleted file mode 100644 index 90bd855..0000000 --- a/Device3Dfx/3dfx_driver.c +++ /dev/null @@ -1,804 +0,0 @@ -/* - - /dev/3dfx device for 2.x kernels with MTRR settings enabled. - - Compile with : - - gcc -O2 -DMODULE -D__KERNEL__ -I/usr/src/linux/include -pipe - -fno-strength-reduce -malign-loops=2 -malign-jumps=2 - -malign-functions=2 -c -o 3dfx.o 3dfx_driver.c - - Add -D__SMP__ if you're running of an multi-processor system. - Add -DHAVE_MTRR if you have and want MTRR settings. - Add -g -Wall -Wstrict-prototypes -DDEBUG, if you are debugging. - - Original by Daryll Straus. - Port to 2.1 kernel by Jon Taylor. - setmtrr_3dfx() added by Jens Axboe. - Combining 2.0 and 2.1/2.2 kernels into one rpm, - resetmtrr_3df(), and using correct pci calls for - 2.1/2.2 kernels by Carlo Wood. - - ChangeLog - - 2000/02/04 Joseph Kain - - * Updated Carlo Woord's email address. - - 1999/12/22 Joseph Kain - - * Support for new VMA structure in Kernels 2.3.14 and higher. - This patch is based on Dieter Nuetzel's work. - - 1999/11/09 Joseph Kain - - * Made cards static to remove conflict with hisax ISDN driver. - - 1998/10/30 Carlo Wood - - * Re-included module versions (this source was based on the - source by Jon Taylor which was based on an older version - by Daryll Straus. I now included the later changes made - by Daryll in this source too). - * Use pci_find_device for 2.1/2.2 kernels instead of the old - pcibios_find_device. Idem pci_present(). - - 1998/10/21 Carlo Wood - - * Fixed compile bugs related to 2.0 kernels. - - 1998/10/21 Carlo Wood - - * `struct file_operations' was changed as of kernel 2.1.118, - fixed this module to also work with versions > 2.1.117. - - * Machines that don't have mtrr still need . - - 1998/10/20 Carlo Wood - - * Finally fixed in init_module() the right way. This time I tested - it too (it now really works). - - * Added resetmtrr_3dfx() to clean up the MTRR settings when the - module is unloaded. This is not really necessary but its clean. - It allows to compare using this device WITH MTRR with another - method WITHOUT MTRR, without being confused by sticky MTRR settings - for instance. - - 1998/10/18 Carlo Wood - - * Forgot the '== -EBUSY' in init_module(), causing the registration of - character device to always fail. You need to reboot if you tried - the previous version (if there is junk in `cat /proc/devices' major 107). - - 1998/10/18 Carlo Wood - - * struct file_operations fops_3dfx was initialized wrong: - `release_3dfx' was put on the place of `fsync', causing weird - behaviour :). - - * Several warning fixes. - - * setmtrr_3dfx did not always return a value, and the value was - ignored, effectively ignoring errors returned by mtrr_add(). - - */ - -/* Include this first as it defines things that affect the kernel headers */ -#include "kinfo.h" -#include - -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) -#define KERNEL_VER_2_1 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 1, 115) -/* It might work with smaller kernels, but I never tested that */ -#error "Upgrade your kernel" -#endif -#else -#define copy_to_user memcpy_tofs -#define copy_from_user memcpy_fromfs -#define pci_present pcibios_present -#endif - -#ifdef MODULE -#include -#include -#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) -#define MODVERSIONS -#endif -#ifdef MODVERSIONS -#include -#endif -#else -#define MOD_INC_USE_COUNT -#define MOD_DEC_USE_COUNT -#endif - -#include -#include -#include -#include -#include -#ifndef KERNEL_VER_2_1 -#include -#endif -#include -#include -#include -#include -#include - -#ifdef KERNEL_VER_2_1 -#include -#endif -#ifdef HAVE_MTRR -#ifdef KERNEL_VER_2_1 -#include -#else -extern int mtrr_add(unsigned long base, unsigned long size, unsigned int type, char increment); -extern int mtrr_del(int reg, unsigned long base, unsigned long size); -#define MTRR_TYPE_UNCACHABLE 0 -#define MTRR_TYPE_WRCOMB 1 -#endif -#endif - -#define MAJOR_3DFX 107 -#define DEVICE_VOODOO 0 - -#define PCI_VENDOR_ID_LINUX 0x0 -#define PCI_DEVICE_ID_LINUX 0x2 -#define PCI_COMMAND_LINUX 0x4 -#define PCI_REVISION_ID_LINUX 0x8 -#define PCI_BASE_ADDRESS_0_LINUX 0x10 -#define PCI_BASE_ADDRESS_1_LINUX 0x14 -#define SST1_PCI_SPECIAL1_LINUX 0x40 -#define SST1_PCI_SPECIAL2_LINUX 0x44 -#define SST1_PCI_SPECIAL3_LINUX 0x48 -#define SST1_PCI_SPECIAL4_LINUX 0x54 - -#define VGA_INPUT_STATUS_1C 0x3DA -#define VGA_MISC_OUTPUT_READ 0x3cc -#define VGA_MISC_OUTPUT_WRITE 0x3c2 -#define SC_INDEX 0x3c4 -#define SC_DATA 0x3c5 - -#ifndef PCI_VENDOR_ID_3DFX -#define PCI_VENDOR_ID_3DFX 0x121a -#endif - -#ifndef PCI_VENDOR_ID_ALLIANCE -#define PCI_VENDOR_ID_ALLIANCE 0x1142 -#endif - -#ifndef PCI_DEVICE_ID_3DFX_VOODOO2 -#define PCI_DEVICE_ID_3DFX_VOODOO2 2 -#endif - -#ifndef PCI_DEVICE_ID_ALLIANCE_AT3D -#define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d -#endif - -#ifndef PCI_DEVICE_ID_3DFX_BANSHEE -#define PCI_DEVICE_ID_3DFX_BANSHEE 3 -#endif - -#ifndef PCI_DEVICE_ID_3DFX_VOODOO3 -#define PCI_DEVICE_ID_3DFX_VOODOO3 5 -#endif - -#ifdef DEBUG -#define DEBUGMSG(x) printk x -#else -#define DEBUGMSG(x) -#endif - -/* This macro is for accessing vma->vm_offset or vma->vm_pgoff depending - * on kernel version */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14) -#define VM_OFFSET(vma) (vma->vm_offset) -#else -#define VM_OFFSET(vma) (vma->vm_pgoff << PAGE_SHIFT) -#endif - -struct pioData_t { - short port; - short size; - int device; - void *value; -}; - -struct cardInfo_t { - int vendor; - int type; - int addr0; - int addr1; - unsigned char bus; - unsigned char dev; - struct file *curFile; -#ifdef HAVE_MTRR - int mtrr_buf; - int mtrr_ctl; -#endif -}; - -typedef struct pioData_t pioData; -typedef struct cardInfo_t cardInfo; - -#ifdef MODULE -void cleanup_module(void); -#endif - -#define MAXCARDS 16 - -static cardInfo cards[MAXCARDS]; -static int numCards = 0; - -static void findCardType(int vendor, int device) -{ -#ifdef KERNEL_VER_2_1 - struct pci_dev *dev = NULL; - while (numCards < MAXCARDS && (dev = pci_find_device(vendor, device, dev))) { - pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &cards[numCards].addr0); - pci_read_config_dword(dev, PCI_BASE_ADDRESS_1, &cards[numCards].addr1); - cards[numCards].bus = dev->bus->number; - cards[numCards].dev = dev->devfn; -#else - int i; - for (i = 0; numCards < MAXCARDS; i++) { - if (pcibios_find_device(vendor, device, i, &cards[numCards].bus, &cards[numCards].dev)) - return; - pcibios_read_config_dword(cards[numCards].bus, cards[numCards].dev, PCI_BASE_ADDRESS_0, &cards[numCards].addr0); - pcibios_read_config_dword(cards[numCards].bus, cards[numCards].dev, PCI_BASE_ADDRESS_1, &cards[numCards].addr1); -#endif - - cards[numCards].addr0 &= ~0xF; - cards[numCards].addr1 &= ~0xF; - cards[numCards].vendor = vendor; - cards[numCards].type = device; - cards[numCards].curFile = 0; - - DEBUGMSG(("3dfx: board vendor %d type %d located at %x/%x bus %d dev %d\n", - vendor, device, cards[numCards].addr0, cards[numCards].addr1, cards[numCards].bus, cards[numCards].dev)); - - ++numCards; - } -} - -static int findCards(void) -{ - if (!pci_present()) - return 0; - numCards = 0; - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO2); - findCardType(PCI_VENDOR_ID_ALLIANCE, 0x643d); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE); - findCardType(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3); - return numCards; -} - -static int open_3dfx(struct inode *inode, struct file *file) -{ - DEBUGMSG(("3dfx: Entering open_3dfx\n")); - if (!numCards) { - printk("3dfx: No 3Dfx cards found\n"); - return -ENODEV; - } - MOD_INC_USE_COUNT; - return 0; -} - -#ifdef KERNEL_VER_2_1 -static int release_3dfx(struct inode *inode, struct file *file) -#else -static void release_3dfx(struct inode *inode, struct file *file) -#endif -{ - int i; - - DEBUGMSG(("3dfx: Entering release_3dfx\n")); - for (i = 0; i < numCards; ++i) - if (cards[i].curFile == file) - cards[i].curFile = 0; - MOD_DEC_USE_COUNT; - -#ifdef KERNEL_VER_2_1 - return 0; -#endif -} - -#ifdef KERNEL_VER_2_1 -static int mmap_3dfx(struct file *file, struct vm_area_struct *vma) -#else -static int mmap_3dfx(struct inode *inode, struct file *file, struct vm_area_struct *vma) -#endif -{ - size_t len; - int i; - - DEBUGMSG(("3dfx: Entering mmap_3dfx\n")); - for (i = 0; i < numCards; ++i) { - if ((cards[i].addr0 == VM_OFFSET(vma)) || - (cards[i].addr1 == VM_OFFSET(vma))) - break; - } - if (i == numCards) { - DEBUGMSG(("3dfx: Couldn't match address %lx to a card\n", - VM_OFFSET(vma))); - return -EPERM; - } - /* This one is a special case, the macro doesn't help */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14) - if ((vma->vm_offset) & ~PAGE_MASK) { - DEBUGMSG(("3dfx: Map request not page aligned\n")); - return -ENXIO; - } -#else - if ((vma->vm_pgoff) & ~PAGE_MASK) { - DEBUGMSG(("3dfx: Map request not page aligned\n")); - return -ENXIO; - } -#endif - len = vma->vm_end - vma->vm_start; - if ((len < 0) || (len > 0x2000000)) { - DEBUGMSG(("3dfx: Invalid mapping size requested\n")); - return -EINVAL; - } -#if defined(__i386__) - pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; -#endif - if (remap_page_range(vma->vm_start, VM_OFFSET(vma), len, - vma->vm_page_prot)) { - DEBUGMSG(("3dfx: Page remap failed\n")); - return -EAGAIN; - } -#ifndef KERNEL_VER_2_1 - vma->vm_inode = inode; - inode->i_count++; -#endif - return 0; -} - -static int doQueryBoards(void) -{ - return numCards; -} - -static int doQueryFetch(pioData *desc) -{ - int retval; - char retchar; - short retword; - int retlong; - - if (desc->device < 0 || desc->device >= numCards) - return -EINVAL; - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case PCI_VENDOR_ID_LINUX: - if (desc->size != 2) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].vendor, desc->size); - return 0; - case PCI_DEVICE_ID_LINUX: - if (desc->size != 2) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].type, desc->size); - return 0; - case PCI_BASE_ADDRESS_0_LINUX: - if (desc->size != 4) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].addr0, desc->size); - return 0; - case PCI_BASE_ADDRESS_1_LINUX: - if (desc->size != 4) - return -EINVAL; - copy_to_user(desc->value, &cards[desc->device].addr1, desc->size); - return 0; - case SST1_PCI_SPECIAL1_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case PCI_REVISION_ID: - if (desc->size != 1) - return -EINVAL; - break; - case SST1_PCI_SPECIAL4_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - default: - return -EINVAL; - } - switch (desc->size) { - case 1: - pcibios_read_config_byte(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retchar); - copy_to_user(desc->value, &retchar, 1); - break; - case 2: - pcibios_read_config_word(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retword); - copy_to_user(desc->value, &retword, 2); - break; - case 4: - pcibios_read_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port, &retlong); - copy_to_user(desc->value, &retlong, 4); - break; - default: - return -EINVAL; - } - return 0; -} - -static int doQueryUpdate(pioData *desc) -{ - int retval; - int preval; - int mask; - char retchar; - short retword; - int retlong; - - if (desc->device < 0 || desc->device >= numCards) - return -EINVAL; - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case PCI_COMMAND_LINUX: - if (desc->size != 2) - return -EINVAL; - break; - case SST1_PCI_SPECIAL1_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL2_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL3_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - case SST1_PCI_SPECIAL4_LINUX: - if (desc->size != 4) - return -EINVAL; - break; - default: - return -EINVAL; - } - pcibios_read_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port & ~0x3, &retval); - switch (desc->size) { - case 1: - copy_from_user(&retchar, desc->value, 1); - preval = retchar << (8 * (desc->port & 0x3)); - mask = 0xFF << (8 * (desc->port & 0x3)); - break; - case 2: - copy_from_user(&retword, desc->value, 2); - preval = retword << (8 * (desc->port & 0x3)); - mask = 0xFFFF << (8 * (desc->port & 0x3)); - break; - case 4: - copy_from_user(&retlong, desc->value, 4); - preval = retlong; - mask = ~0; - break; - default: - return -EINVAL; - } - retval = (retval & ~mask) | preval; - pcibios_write_config_dword(cards[desc->device].bus, cards[desc->device].dev, desc->port, retval); - return 0; -} - -static int doQuery(unsigned int cmd, unsigned long arg) -{ - pioData desc; - int retval; - - if (_IOC_NR(cmd) == 2) - return doQueryBoards(); - if ((retval = verify_area(VERIFY_READ, (void *)arg, sizeof(pioData)))) - return retval; - copy_from_user(&desc, (void *)arg, sizeof(pioData)); - if (_IOC_NR(cmd) == 3) - return doQueryFetch(&desc); - if (_IOC_NR(cmd) == 4) - return doQueryUpdate(&desc); - return -EINVAL; -} - -static int doPIORead(pioData *desc) -{ - int retval; - char retchar; - - if ((retval = verify_area(VERIFY_WRITE, desc->value, desc->size))) - return retval; - switch (desc->port) { - case VGA_INPUT_STATUS_1C: - break; - case SC_INDEX: - break; - case SC_DATA: - break; - case VGA_MISC_OUTPUT_READ: - break; - default: - return -EPERM; - } - - if (desc->size != 1) - return -EINVAL; - - retchar = inb(desc->port); - copy_to_user(desc->value, &retchar, sizeof(char)); - - return 0; -} - -static int doPIOWrite(pioData *desc) -{ - int retval; - char retchar; - - if ((retval = verify_area(VERIFY_READ, desc->value, desc->size))) - return retval; - - switch (desc->port) { - case SC_INDEX: - break; - case SC_DATA: - break; - case VGA_MISC_OUTPUT_WRITE: - break; - default: - return -EPERM; - } - - if (desc->size != 1) - return -EINVAL; - - copy_from_user(&retchar, desc->value, sizeof(char)); - outb(retchar, desc->port); - - return 0; -} - -static int doPIO(unsigned int cmd, unsigned long arg) -{ - pioData desc; - int retval; - - if ((retval = verify_area(VERIFY_READ, (void *)arg, sizeof(pioData)))) - return retval; - copy_from_user(&desc, (void *)arg, sizeof(pioData)); - if (_IOC_DIR(cmd) == _IOC_READ) - return doPIORead(&desc); - if (_IOC_DIR(cmd) == _IOC_WRITE) - return doPIOWrite(&desc); - - return -EINVAL; -} - -static int ioctl_3dfx(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) -{ - DEBUGMSG(("3dfx: Entering ioctl_3dfx, inode %p file %p cmd %x arg %lx\n", inode, file, cmd, arg)); - switch (_IOC_TYPE(cmd)) { - case '3': - return doQuery(cmd, arg); - case 0: - return doPIO(cmd, arg); - default: - DEBUGMSG(("3dfx: Unknown 3dfx request made\n")); - return -EINVAL; - } -} - -#ifdef HAVE_MTRR -int setmtrr_3dfx(void) -{ - int i = 0, retval = -2; - unsigned char dlc; - - /* First do a bios fixup if this system has a 82441FX chipset */ -#ifdef KERNEL_VER_2_1 - struct pci_dev *dev = NULL; - if ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, dev))) { - pci_read_config_byte(dev, 0x82, &dlc); - if (!(dlc & 1 << 1)) { - dlc |= 1 << 1; - pci_write_config_byte(dev, 0x82, dlc); - printk("3dfx: PIIX3: Enabling Passive Release\n"); - } - } -#else - unsigned char bus, dev_fn; - if (!pcibios_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, i, &bus, &dev_fn)) { - pcibios_read_config_byte(bus, dev_fn, 0x82, &dlc); - if (!(dlc & 1 << 1)) { - dlc |= 1 << 1; - pcibios_write_config_byte(bus, dev_fn, 0x82, dlc); - printk("3dfx: PIIX3: Enabling Passive Release\n"); - } - } -#endif - - /* Set up the mtrr's */ - if (numCards == 0) - return -EIO; - for (i = 0; i < numCards; i++) { - if ((cards[i].vendor != PCI_VENDOR_ID_3DFX) || - (cards[i].type>PCI_DEVICE_ID_3DFX_VOODOO3)) - { - cards[i].mtrr_buf = -1; /* Used as flag in resetmtrr_3dfx() */ - continue; - } - switch (cards[i].type) { - case PCI_DEVICE_ID_3DFX_VOODOO: - case PCI_DEVICE_ID_3DFX_VOODOO2: - /* Frame buffer to write combining */ - retval = cards[i].mtrr_buf = mtrr_add(cards[i].addr0, 0x400000, MTRR_TYPE_WRCOMB, 1); - if (retval>=0) { - retval = cards[i].mtrr_ctl = mtrr_add(cards[i].addr0, 0x1000, MTRR_TYPE_UNCACHABLE, 1); - if (retval<0) { - mtrr_del(cards[i].mtrr_buf, 0, 0); - cards[i].mtrr_buf=-1; - } - } - if (retval < 0) { - printk("3dfx: Could not set MTRR for Voodoo card\n"); - /* Can still run */ - return 0; - } - break; - case PCI_DEVICE_ID_3DFX_BANSHEE: - case PCI_DEVICE_ID_3DFX_VOODOO3: - retval = cards[i].mtrr_buf = mtrr_add(cards[i].addr1, 0x1000000, MTRR_TYPE_WRCOMB, 1); - if (retval < 0) { - printk("3dfx: Could not set MTRR for Voodoo card\n"); - /* Can still run */ - return 0; - } - cards[i].mtrr_ctl=-1; - break; - default: - /* We should never hit this */ - } - } - if (retval == -2) - { - DEBUGMSG(("3dfx: Could not set MTRR for this graphics card\n")); - retval = 0; /* Can still run */ - } -#ifdef DEBUG - else if (retval >= 0) - DEBUGMSG(("3dfx: Successfully set MTRR, mtrr register: %d\n", retval)); -#endif - - return retval; -} - -int resetmtrr_3dfx(void) -{ - int i, ret, retval = 0; - for (i = 0; i < numCards; i++) { - if (cards[i].mtrr_buf >= 0) { - ret = mtrr_del(cards[i].mtrr_buf, 0, 0); - if (ret < 0) - retval = ret; - cards[i].mtrr_buf = -1; - if (cards[i].mtrr_ctl >= 0) { - ret = mtrr_del(cards[i].mtrr_ctl, 0, 0); - if (ret < 0) - retval = ret; - cards[i].mtrr_ctl = -1; - } - } - } - return retval; -} - -#endif /* HAVE_MTRR */ - -static struct file_operations fops_3dfx = { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0) - owner: THIS_MODULE, -#endif - ioctl: ioctl_3dfx, /* ioctl */ - mmap: mmap_3dfx, /* mmap */ - open: open_3dfx, /* open */ - release: release_3dfx, /* release */ -}; - -#ifdef MODULE -int init_module(void) -{ - int ret; - DEBUGMSG(("3dfx: Entering init_module()\n")); - - if ((ret = register_chrdev(MAJOR_3DFX, "3dfx", &fops_3dfx)) < 0) { - printk("3dfx: Unable to register character device with major %d\n", MAJOR_3DFX); - return ret; - } - DEBUGMSG(("3dfx: Successfully registered device 3dfx\n")); - findCards(); - -#ifdef HAVE_MTRR - ret = setmtrr_3dfx(); - if (ret < 0) - { - DEBUGMSG(("setmtrr_3dfx() failed, returned %d\n", ret)); - unregister_chrdev(MAJOR_3DFX, "3dfx"); - return ret; - } -#endif - - return 0; -} - -void cleanup_module(void) -{ - DEBUGMSG(("3dfx: Entering cleanup_module\n")); - -#ifdef HAVE_MTRR - resetmtrr_3dfx(); -#endif - if (unregister_chrdev(MAJOR_3DFX, "3dfx")) - { - DEBUGMSG(("3dfx: unregister_chrdev failed\n")); - return; - } -} -#else /* !MODULE */ - -long init_3dfx(long mem_start, long mem_end) -{ - if (register_chrdev(MAJOR_3DFX, "3dfx", &fops_3dfx)) - { - DEBUGMSG(("3dfx: Unable to register_chrdev with major %d\n", MAJOR_3DFX)); - return 0; - } - findCards(); - - return mem_start; -} -#endif /* !MODULE */ - - -#if defined(DEBUG) && defined(KERNEL_VER_2_1) -/* - * Kludge to get rid of: - * ./3dfx.o: unresolved symbol inb - * ./3dfx.o: unresolved symbol inl - * ./3dfx.o: unresolved symbol inw - * ./3dfx.o: unresolved symbol outb - * ./3dfx.o: unresolved symbol outl - * ./3dfx.o: unresolved symbol outw - * when compiling this module with -g during debugging. - */ -#undef __KERNEL__ -#define extern -#undef _ASM_IO_H -#include -/* - * And this is copied from asm/uaccess.h - * in order to get rid of - * ./3dfx.o: unresolved symbol verify_area - * when compiling this module with -g during debugging. - */ -inline int verify_area(int type, const void * addr, unsigned long size) -{ - return access_ok(type,addr,size) ? 0 : -EFAULT; -} - -int a_last_dummy_function(int a) -{ - return a; -} -#endif diff --git a/Device3Dfx/Device3Dfx.spec b/Device3Dfx/Device3Dfx.spec deleted file mode 100644 index 14bbf56..0000000 --- a/Device3Dfx/Device3Dfx.spec +++ /dev/null @@ -1,160 +0,0 @@ -Summary: Device driver for 3Dfx boards for 2.x kernels -Name: Device3Dfx -Version: 2.3 -Release: 5 -Icon: 3dfx.gif -Source: Device3Dfx.tar.gz -License: GPL -Group: Drivers - -%changelog - -* Sat Apr 08 2000 Joseph Kain - Release 2.3-5 -- Check both the kernel and the processor for MTRR support before enabling. - -* Wed Jan 04 2000 Joseph Kain - Release 2.3-4 - -- Forgot to include kinfo.h in 3dfx_driver.c in the last release. This - fixes some build problems for SMP kernels. - -* Wed Dec 22 1999 Joseph Kain - Release 2.3-3 - -- Fixes to the Makefile to stop grepping the header files. Changes to - mtrr.c and 3dfx_driver.c to support these Makefile changes. -- 3dfx_driver.c now supports 2.3.14+ kernels. - -* Mon Dec 13 1999 Joseph Kain - Release 2.3-2 - -- Removed depmod -a from the Makefile. This elliminates errors in the - build on systems with modules with broken depedancies (Happens on Madrake) -- Changed depmod -a to depmod -a > /dev/null in the post and postun to - elliminate any warnings/errors with modules that don't have anything - to do with Device3Dfx. Warnings scare people. - -* Tue Nov 09 1999 Joseph Kain - Release 2.3: - -- Made cards static to remove conflict with hisax ISDN driver. -- Removed 3dfx.o from the source distribution - -* Fri Jun 25 1999 Daryll Strauss - - Release 2.2: - -- Set MTRR for VB/V3 boards -- Allow build without kernel sources installed -- Code cleanup -- Improvements in /etc/conf.modules setup - -* Sun May 16 1999 Daryll Strauss - - Release 2.1: - -- Added support for multiple board mappings -- Enlarged size of mappings -- Changes to support VB/V3 boards - -* Sun Apr 4 1999 Daryll Strauss - - Release 2.0-1: - -- This is just a rename of Michael's version to return it to my original - naming scheme. -- Added the License field to the spec file. - -* Thu Mar 11 1999 Michael Vance - - Release 2.5-2: - -- Fixed for 2.2.3 kernels because of an mmap() update - -* Fri Oct 30 1998 Carlo Wood - - Release 2.5-1: - -- Upped source to Dev3Dfx-2.5.tar.gz -- Boosted version number of rpm to the version of the tar.gz. - Moved everything to the Makefile, so Dev3Dfx-2.5.tar.gz is - self containing and will work without rpm too. - -* Wed Oct 21 1998 Carlo Wood - - Release 1.2-5: - -- Upped source to Dev3Dfx-2.4.tar.gz -- Removed dangerous and confusing use of /lib/modules/preferred -- Removed the use of `uname': It now will compile for the kernel - version in /usr/src/linux and not be bothered by the running - kernel version. - -* Wed Oct 21 1998 Carlo Wood - - Release 1.2-4: - -- Upped source to Dev3Dfx-2.3.tar.gz - -* Mon Oct 19 1998 Carlo Wood - - Release 1.2-3: - -- Corrected Summary and Description to refer to 2.x rather - then 2.1 kernels. -- Removed script lines that write an `option' line to /etc/conf.modules. -- Upped source to Dev3Dfx-2.2.tar.gz - -* Sun Oct 18 1998 Carlo Wood - - Release 1.2-2: - -- Added OPT_CFLAGS stuff. - -* Sun Oct 18 1998 Carlo Wood - - Release 1.2-1: - -- Packaged version 1.2 with support for 2.1 kernels by John Taylor and - MTRR settings added by Jens Axboe. - -%description -This package installs the 3Dfx device driver to allow access to 3Dfx -boards without the user having root privledges. It should work on both -2.0 and 2.1/2.2 kernels and set the MTRR settings correctly. It should -also work with SMP kernels (2.1/2.2). - -%prep -%setup -c - -%build -make OPT_CFLAGS="$RPM_OPT_FLAGS" - -%install -make RPM_INSTALL="1" install | grep '^/lib/modules/' > modules-file-list - -%post -if [ "$1" = 1 ]; then - grep -v 3dfx /etc/conf.modules > /etc/conf.modules.tmp - echo alias char-major-107 3dfx >> /etc/conf.modules.tmp - mv /etc/conf.modules.tmp /etc/conf.modules -fi -/sbin/depmod -a > /dev/null - -%postun -if [ "$1" = 0 ]; then - grep -v 3dfx /etc/conf.modules > /etc/conf.modules.tmp - mv /etc/conf.modules.tmp /etc/conf.modules -fi -/sbin/depmod -a > /dev/null - -%verifyscript -inconf=`grep 'alias char-major-107 3dfx' /etc/conf.modules` -if [ "x$inconf" = "x" ]; then - echo "3dfx entry not included in /etc/conf.modules" -fi - -%files -f modules-file-list -%verify(not mode user group) /dev/3dfx - diff --git a/Device3Dfx/Makefile b/Device3Dfx/Makefile deleted file mode 100644 index d08c283..0000000 --- a/Device3Dfx/Makefile +++ /dev/null @@ -1,127 +0,0 @@ -############################################################################### -# Makefile by Carlo Wood (and others) - -ifeq ($(OPT_CFLAGS),) - -# Determine the machine type -ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) - -# Setup machine dependant compiler flags -ifeq ($(ARCH), i386) -OPT_CFLAGS = -O2 -m486 -fomit-frame-pointer \ - -fno-strength-reduce \ - -malign-loops=2 -malign-jumps=2 -malign-functions=2 -endif - -ifeq ($(ARCH), alpha) -OPT_CFLAGS = -O2 -mno-fp-regs -mcpu=ev4 \ - -ffixed-8 \ - -Wa,-mev6 \ - -fomit-frame-pointer -fno-strict-aliasing -endif - -endif # ifeq ($OPT_CFLAGS),) - -CFLAGS := -DMODULE -D__KERNEL__ -I/usr/src/linux/include $(OPT_CFLAGS) - -############################################################################### -# You should never need to change anything below. - -all: sanity 3dfx.o - -# Sanity checks -sanity: - @( \ - if [ ! -e /usr/src/linux ]; then \ - echo "Expect kernel source at location /usr/src/linux"; \ - echo "Sym.link /usr/src/linux -> where you have your sources"; \ - exit -1; \ - fi; \ - if [ ! -r /usr/src/linux/include ]; then \ - echo "Expect readable headers in /usr/src/linux/include"; \ - exit -1; \ - fi; \ - if [ ! -r /usr/src/linux/include/linux/version.h ]; then \ - echo "Missing /usr/src/linux/include/linux/version.h"; \ - echo "Configure and install the kernel first"; \ - exit -1; \ - fi; \ - if [ ! -e /proc/cpuinfo ]; then \ - echo "You need the /proc file system"; \ - echo "Reconfigure kernel and say Yes to CONFIG_PROC_FS"; \ - exit -1; \ - fi; \ - ) - -kinfo: kinfo.c - $(CC) -o kinfo kinfo.c - -kinfo.h: kinfo - ./kinfo - -ifneq ($(KERNEL_VERSION_MAJOR),2.0) - -############################################################################### -# kernel 2.1+ - -3dfx.o: kinfo.h 3dfx_driver.c Makefile - $(CC) $(CFLAGS) -c -o $@ 3dfx_driver.c - -else - -############################################################################### -# Kernel 2.0 - -OBJS = 3dfx_driver.o -ifneq ($(HAVE_MTRR),) -OBJS += mtrrs.o -endif - -3dfx.o: kinfo.h $(OBJS) Makefile - $(LD) -r -o $@ $(OBJS) - -endif - -############################################################################### - -install: - mkdir -p /lib/modules/$(shell ./kinfo --UTS)/misc - cp 3dfx.o /lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o - @( \ - if [ -e /lib/modules/$(shell ./kinfo --UTS)/modules.dep ]; then \ - indep=`grep 'misc/3dfx.o:' /lib/modules/$(shell ./kinfo --UTS)/modules.dep`; \ - if [ -z "$$indep" ]; then \ - echo "/lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o:" >> /lib/modules/$(shell ./kinfo --UTS)/modules.dep; \ - echo "" >> /lib/modules/$(shell ./kinfo --UTS)/modules.dep; \ - fi; \ - fi; \ - if [ ! -c /dev/3dfx ]; then \ - mknod /dev/3dfx c 107 0; \ - chmod go+w /dev/3dfx; \ - fi; \ - if [ "$(RPM_INSTALL)" = "1" ]; then \ - echo "/lib/modules/$(shell ./kinfo --UTS)/misc/3dfx.o"; \ - else \ - inconf=`grep 'alias char-major-107 3dfx' /etc/conf.modules`; \ - if [ -z "$$inconf" ]; then \ - echo "alias char-major-107 3dfx" >> /etc/conf.modules; \ - fi; \ - fi; \ - ) - -############################################################################### -# This is for debugging purposes by the developers: - -clean: - rm -f *.o *.s kinfo kinfo.h - -3dfx.s: 3dfx_driver.c Makefile - $(CC) $(CFLAGS) -S -c 3dfx_driver.c - -tar: - tar czf ../../SOURCES/Dev3Dfx-2.5.tar.gz 3dfx_driver.c mtrrs.c Makefile - - -debug: - make OPT_CFLAGS="-g -Wall -Wstrict-prototypes -DDEBUG" - diff --git a/Device3Dfx/kinfo.c b/Device3Dfx/kinfo.c deleted file mode 100644 index 908c65c..0000000 --- a/Device3Dfx/kinfo.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - kinfo.c: A small program that includes several kernel heades - and builds a header defining options for 3dfx_driver.c. - - 1999/12/22 Joseph Kain - - * Initial version -*/ - -#include - -/* These include files will bring in the information we need */ -#include -#include - - -int -main (int argc, char **argv) -{ - /* Here is the strategy. The old Makefile would have grepped the kernel - * headers and put these defines on the command line. Now we include - * the kernel headers and extract the information. Then we create a - * new header with all of the options we need. */ - - if (argc == 1) - { - FILE *f = fopen ("kinfo.h", "w"); - FILE *p = NULL; - int result; - char temp[1000]; - -#ifdef CONFIG_MTRR - /* It is not enough to just check if the kernel supports MTRRs, if the - * processor doesn't have MTRRs then its possible (and likely) that - * the kernel was still compiled with MTRR support. So we also have to - * check the processor has MTRRs. */ - - result = system ("grep mtrr /proc/cpuinfo > /dev/null"); - - /* See if grep found anything */ - if (result == 0) /* Grep reported a match */ - { - fprintf (f, "#define HAVE_MTRR\n"); - } - -#endif - -#ifdef CONFIG_SMP - fprintf (f, "#define __SMP__\n"); -#endif - -#ifdef CONFIG_MODVERSIONS - fprintf (f, "#define MODVERSIONS\n"); -#endif - - fclose (f); - } - else - { - if (strcmp (argv[1], "--UTS") == 0) - { - printf ("%s", UTS_RELEASE); - } - } -} - - diff --git a/Device3Dfx/mtrrs.c b/Device3Dfx/mtrrs.c deleted file mode 100644 index 3ffa1bd..0000000 --- a/Device3Dfx/mtrrs.c +++ /dev/null @@ -1,935 +0,0 @@ -/* Generic MTRR (Memory Type Range Register) driver. - - Copyright (C) 1997-1998 Richard Gooch - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - Richard Gooch may be reached by email at rgooch@atnf.csiro.au - The postal address is: - Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. - - Source: "Pentium Pro Family Developer's Manual, Volume 3: - Operating System Writer's Guide" (Intel document number 242692), - section 11.11.7 - - ChangeLog - - Prehistory Martin Tischhäuser - Initial register-setting code (from proform-1.0). - 19971216 Richard Gooch - Original version for /proc/mtrr interface, SMP-safe. - v1.0 - 19971217 Richard Gooch - Bug fix for ioctls()'s. - Added sample code in Documentation/mtrr.txt - v1.1 - 19971218 Richard Gooch - Disallow overlapping regions. - 19971219 Jens Maurer - Register-setting fixups. - v1.2 - 19971222 Richard Gooch - Fixups for kernel 2.1.75. - v1.3 - 19971229 David Wragg - Register-setting fixups and conformity with Intel conventions. - 19971229 Richard Gooch - Cosmetic changes and wrote this ChangeLog ;-) - 19980106 Richard Gooch - Fixups for kernel 2.1.78. - v1.4 - 19980119 David Wragg - Included passive-release enable code (elsewhere in PCI setup). - v1.5 - 19980131 Richard Gooch - Replaced global kernel lock with private spinlock. - v1.6 - 19980201 Richard Gooch - Added wait for other CPUs to complete changes. - v1.7 - 19980202 Richard Gooch - Bug fix in definition of for UP. - v1.8 - 19980319 Richard Gooch - Fixups for kernel 2.1.90. - 19980323 Richard Gooch - Move SMP BIOS fixup before secondary CPUs call - v1.9 - 19980325 Richard Gooch - Fixed test for overlapping regions: confused by adjacent regions - 19980326 Richard Gooch - Added wbinvd in . - 19980401 Richard Gooch - Bug fix for non-SMP compilation. - 19980418 David Wragg - Fixed-MTRR synchronisation for SMP and use atomic operations - instead of spinlocks. - 19980418 Richard Gooch - Differentiate different MTRR register classes for BIOS fixup. - v1.10 - 19980419 David Wragg - Bug fix in variable MTRR synchronisation. - v1.11 - 19980419 Richard Gooch - Fixups for kernel 2.1.97. - v1.12 - 19980421 Richard Gooch - Safer synchronisation across CPUs when changing MTRRs. - v1.13 - 19980423 Richard Gooch - Bugfix for SMP systems without MTRR support. - v1.14 - 19980427 Richard Gooch - Trap calls to and on non-MTRR machines. - v1.15 - 19980427 Richard Gooch - Use atomic bitops for setting SMP change mask. - v1.16 - 19980428 Richard Gooch - Removed spurious diagnostic message. - v1.17 - 19980429 Richard Gooch - Moved register-setting macros into this file. - Moved setup code from init/main.c to i386-specific areas. - v1.18 - 19980502 Richard Gooch - Moved MTRR detection outside conditionals in . - v1.19 - 19980502 Richard Gooch - Documentation improvement: mention Pentium II and AGP. - v1.20 - 19980521 Richard Gooch - Only manipulate interrupt enable flag on local CPU. - Allow enclosed uncachable regions. - v1.21 - - v1.21-- Emil Briggs - Backported to 2.0.x kernels, /proc and ioctl - interfaces removed and the result incorporated - into the 3dfx device driver. Not SMP safe. If - you have an SMP use the 2.2 series kernels. - - v1.22 - 19991222 Joseph Kain - Do kernel version checks here instead of in - Makefile. The Makefile now only needs the - kernel version for install. -*/ - - -/* Include this first as it defines things that affect the kernel headers */ -#include "kinfo.h" - -/* MTRR support is only available in kerenls versioned 2.1.0 or higher. - * For earlier kernels this code compiles to nothing. */ -#include - -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) - - -#ifndef _LINUX_MTRR_H -#define _LINUX_MTRR_H - -struct mtrr_sentry -{ - unsigned long base; /* Base address */ - unsigned long size; /* Size of region */ - unsigned int type; /* Type of region */ -}; - -struct mtrr_gentry -{ - unsigned int regnum; /* Register number */ - unsigned long base; /* Base address */ - unsigned long size; /* Size of region */ - unsigned int type; /* Type of region */ -}; - - -/* These are the region types */ -#define MTRR_TYPE_UNCACHABLE 0 -#define MTRR_TYPE_WRCOMB 1 -/*#define MTRR_TYPE_ 2*/ -/*#define MTRR_TYPE_ 3*/ -#define MTRR_TYPE_WRTHROUGH 4 -#define MTRR_TYPE_WRPROT 5 -#define MTRR_TYPE_WRBACK 6 -#define MTRR_NUM_TYPES 7 - -static char *mtrr_strings[MTRR_NUM_TYPES] = -{ - "uncachable", /* 0 */ - "write-combining", /* 1 */ - "?", /* 2 */ - "?", /* 3 */ - "write-through", /* 4 */ - "write-protect", /* 5 */ - "write-back", /* 6 */ -}; - -#ifdef __KERNEL__ - -/* The following functions are for use by other drivers */ -extern int mtrr_add (unsigned long base, unsigned long size, - unsigned int type, char increment); -extern int mtrr_del (int reg, unsigned long base, unsigned long size); - -#endif - -#endif /* _LINUX_MTRR_H */ - -#ifdef MODULE -#include -#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) -#define MODVERSIONS -#endif -#ifdef MODVERSIONS -#include -#endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define MTRR_NEED_STRINGS - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#undef __SMP__ - -#define MTRR_VERSION "1.21 (19980521)" - -#define TRUE 1 -#define FALSE 0 - -#define X86_FEATURE_MTRR 0x1000 /* memory type registers */ - -#define MTRRcap_MSR 0x0fe -#define MTRRdefType_MSR 0x2ff - -#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg)) -#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1) - -#define NUM_FIXED_RANGES 88 -#define MTRRfix64K_00000_MSR 0x250 -#define MTRRfix16K_80000_MSR 0x258 -#define MTRRfix16K_A0000_MSR 0x259 -#define MTRRfix4K_C0000_MSR 0x268 -#define MTRRfix4K_C8000_MSR 0x269 -#define MTRRfix4K_D0000_MSR 0x26a -#define MTRRfix4K_D8000_MSR 0x26b -#define MTRRfix4K_E0000_MSR 0x26c -#define MTRRfix4K_E8000_MSR 0x26d -#define MTRRfix4K_F0000_MSR 0x26e -#define MTRRfix4K_F8000_MSR 0x26f - - -#ifdef __SMP__ -# define MTRR_CHANGE_MASK_FIXED 0x01 -# define MTRR_CHANGE_MASK_VARIABLE 0x02 -# define MTRR_CHANGE_MASK_DEFTYPE 0x04 -#endif - -/* In the processor's MTRR interface, the MTRR type is always held in - an 8 bit field: */ -typedef u8 mtrr_type; - -#define LINE_SIZE 80 -#define JIFFIE_TIMEOUT 100 - -#define set_mtrr(reg,base,size,type) set_mtrr_up (reg, base, size, type,TRUE) - - -static unsigned int *usage_table = NULL; - - -struct set_mtrr_context -{ - unsigned long flags; - unsigned long deftype_lo; - unsigned long deftype_hi; - unsigned long cr4val; -}; - -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) - - -/* Put the processor into a state where MTRRs can be safely set. */ -static void set_mtrr_prepare(struct set_mtrr_context *ctxt) -{ - unsigned long tmp; - - /* disable interrupts locally */ - save_flags (ctxt->flags); cli (); - - /* save value of CR4 and clear Page Global Enable (bit 7) */ - asm volatile ("movl %%cr4, %0\n\t" - "movl %0, %1\n\t" - "andb $0x7f, %b1\n\t" - "movl %1, %%cr4\n\t" - : "=r" (ctxt->cr4val), "=q" (tmp) : : "memory"); - - /* disable and flush caches. Note that wbinvd flushes the TLBs as - a side-effect. */ - asm volatile ("movl %%cr0, %0\n\t" - "orl $0x40000000, %0\n\t" - "wbinvd\n\t" - "movl %0, %%cr0\n\t" - "wbinvd\n\t" - : "=r" (tmp) : : "memory"); - - /* disable MTRRs, and set the default type to uncached. */ - rdmsr(MTRRdefType_MSR, ctxt->deftype_lo, ctxt->deftype_hi); - wrmsr(MTRRdefType_MSR, ctxt->deftype_lo & 0xf300UL, ctxt->deftype_hi); -} /* End Function set_mtrr_prepare */ - - -/* Restore the processor after a set_mtrr_prepare */ -static void set_mtrr_done(struct set_mtrr_context *ctxt) -{ - unsigned long tmp; - - /* flush caches and TLBs */ - asm volatile ("wbinvd" : : : "memory" ); - - /* restore MTRRdefType */ - wrmsr(MTRRdefType_MSR, ctxt->deftype_lo, ctxt->deftype_hi); - - /* enable caches */ - asm volatile ("movl %%cr0, %0\n\t" - "andl $0xbfffffff, %0\n\t" - "movl %0, %%cr0\n\t" - : "=r" (tmp) : : "memory"); - - /* restore value of CR4 */ - asm volatile ("movl %0, %%cr4" - : : "r" (ctxt->cr4val) : "memory"); - - /* re-enable interrupts locally (if enabled previously) */ - restore_flags (ctxt->flags); -} /* End Function set_mtrr_done */ - - -/* this function returns the number of variable MTRRs */ -static unsigned int get_num_var_ranges (void) -{ - unsigned long config, dummy; - - rdmsr(MTRRcap_MSR, config, dummy); - return (config & 0xff); -} /* End Function get_num_var_ranges */ - - -/* non-zero if we have the write-combining memory type. */ -static int have_wrcomb (void) -{ - unsigned long config, dummy; - - rdmsr(MTRRcap_MSR, config, dummy); - return (config & (1<<10)); -} - - -static void get_mtrr (unsigned int reg, unsigned long *base, - unsigned long *size, mtrr_type *type) -{ - unsigned long dummy, mask_lo, base_lo; - - rdmsr(MTRRphysMask_MSR(reg), mask_lo, dummy); - if ((mask_lo & 0x800) == 0) { - /* Invalid (i.e. free) range. */ - *base = 0; - *size = 0; - *type = 0; - return; - } - - rdmsr(MTRRphysBase_MSR(reg), base_lo, dummy); - - /* We ignore the extra address bits (32-35). If someone wants to - run x86 Linux on a machine with >4GB memory, this will be the - least of their problems. */ - - /* Clean up mask_lo so it gives the real address mask. */ - mask_lo = (mask_lo & 0xfffff000UL); - - /* This works correctly if size is a power of two, i.e. a - contiguous range. */ - *size = ~(mask_lo - 1); - - *base = (base_lo & 0xfffff000UL); - *type = (base_lo & 0xff); -} /* End Function get_mtrr */ - - -static void set_mtrr_up (unsigned int reg, unsigned long base, - unsigned long size, mtrr_type type, int do_safe) -/* [SUMMARY] Set variable MTRR register on the local CPU. - The register to set. - The base address of the region. - The size of the region. If this is 0 the region is disabled. - The type of the region. - If TRUE, do the change safely. If FALSE, safety measures should - be done externally. -*/ -{ - struct set_mtrr_context ctxt; - - if (do_safe) set_mtrr_prepare (&ctxt); - if (size == 0) - { - /* The invalid bit is kept in the mask, so we simply clear the - relevant mask register to disable a range. */ - wrmsr (MTRRphysMask_MSR (reg), 0, 0); - } - else - { - wrmsr (MTRRphysBase_MSR (reg), base | type, 0); - wrmsr (MTRRphysMask_MSR (reg), ~(size - 1) | 0x800, 0); - } - if (do_safe) set_mtrr_done (&ctxt); -} /* End Function set_mtrr_up */ - - -#ifdef __SMP__ - -struct mtrr_var_range -{ - unsigned long base_lo; - unsigned long base_hi; - unsigned long mask_lo; - unsigned long mask_hi; -}; - - -/* Get the MSR pair relating to a var range. */ -static void get_mtrr_var_range (unsigned int index, - struct mtrr_var_range *vr) -{ - rdmsr (MTRRphysBase_MSR (index), vr->base_lo, vr->base_hi); - rdmsr (MTRRphysMask_MSR (index), vr->mask_lo, vr->mask_hi); -} /* End Function get_mtrr_var_range */ - - -/* Set the MSR pair relating to a var range. Returns TRUE if - changes are made. */ -static int set_mtrr_var_range_testing (unsigned int index, - struct mtrr_var_range *vr) -{ - unsigned int lo, hi; - int changed = FALSE; - - rdmsr(MTRRphysBase_MSR(index), lo, hi); - - if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL) - || (vr->base_hi & 0xfUL) != (hi & 0xfUL)) { - wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi); - changed = TRUE; - } - - rdmsr(MTRRphysMask_MSR(index), lo, hi); - - if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL) - || (vr->mask_hi & 0xfUL) != (hi & 0xfUL)) { - wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); - changed = TRUE; - } - - return changed; -} - - -static void get_fixed_ranges(mtrr_type *frs) -{ - unsigned long *p = (unsigned long *)frs; - int i; - - rdmsr(MTRRfix64K_00000_MSR, p[0], p[1]); - - for (i = 0; i < 2; i++) - rdmsr(MTRRfix16K_80000_MSR + i, p[2 + i*2], p[3 + i*2]); - - for (i = 0; i < 8; i++) - rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i*2], p[7 + i*2]); -} - - -static int set_fixed_ranges_testing(mtrr_type *frs) -{ - unsigned long *p = (unsigned long *)frs; - int changed = FALSE; - int i; - unsigned long lo, hi; - - rdmsr(MTRRfix64K_00000_MSR, lo, hi); - if (p[0] != lo || p[1] != hi) { - wrmsr(MTRRfix64K_00000_MSR, p[0], p[1]); - changed = TRUE; - } - - for (i = 0; i < 2; i++) { - rdmsr(MTRRfix16K_80000_MSR + i, lo, hi); - if (p[2 + i*2] != lo || p[3 + i*2] != hi) { - wrmsr(MTRRfix16K_80000_MSR + i, p[2 + i*2], p[3 + i*2]); - changed = TRUE; - } - } - - for (i = 0; i < 8; i++) { - rdmsr(MTRRfix4K_C0000_MSR + i, lo, hi); - if (p[6 + i*2] != lo || p[7 + i*2] != hi) { - wrmsr(MTRRfix4K_C0000_MSR + i, p[6 + i*2], p[7 + i*2]); - changed = TRUE; - } - } - - return changed; -} - - -struct mtrr_state -{ - unsigned int num_var_ranges; - struct mtrr_var_range *var_ranges; - mtrr_type fixed_ranges[NUM_FIXED_RANGES]; - unsigned char enabled; - mtrr_type def_type; -}; - - -/* Grab all of the MTRR state for this CPU into *state. */ -static void get_mtrr_state(struct mtrr_state *state) -{ - unsigned int nvrs, i; - struct mtrr_var_range *vrs; - unsigned long lo, dummy; - - nvrs = state->num_var_ranges = get_num_var_ranges(); - vrs = state->var_ranges - = kmalloc(nvrs * sizeof(struct mtrr_var_range), GFP_KERNEL); - if (vrs == NULL) - nvrs = state->num_var_ranges = 0; - - for (i = 0; i < nvrs; i++) - get_mtrr_var_range(i, &vrs[i]); - - get_fixed_ranges(state->fixed_ranges); - - rdmsr(MTRRdefType_MSR, lo, dummy); - state->def_type = (lo & 0xff); - state->enabled = (lo & 0xc00) >> 10; -} /* End Function get_mtrr_state */ - - -/* Free resources associated with a struct mtrr_state */ -static void finalize_mtrr_state(struct mtrr_state *state) -{ - if (state->var_ranges) kfree (state->var_ranges); -} /* End Function finalize_mtrr_state */ - - -static unsigned long set_mtrr_state (struct mtrr_state *state, - struct set_mtrr_context *ctxt) -/* [SUMMARY] Set the MTRR state for this CPU. - The MTRR state information to read. - Some relevant CPU context. - [NOTE] The CPU must already be in a safe state for MTRR changes. - [RETURNS] 0 if no changes made, else a mask indication what was changed. -*/ -{ - unsigned int i; - unsigned long change_mask = 0; - - for (i = 0; i < state->num_var_ranges; i++) - if (set_mtrr_var_range_testing(i, &state->var_ranges[i])) - change_mask |= MTRR_CHANGE_MASK_VARIABLE; - - if (set_fixed_ranges_testing(state->fixed_ranges)) - change_mask |= MTRR_CHANGE_MASK_FIXED; - - /* set_mtrr_restore restores the old value of MTRRdefType, - so to set it we fiddle with the saved value. */ - if ((ctxt->deftype_lo & 0xff) != state->def_type - || ((ctxt->deftype_lo & 0xc00) >> 10) != state->enabled) - { - ctxt->deftype_lo |= (state->def_type | state->enabled << 10); - change_mask |= MTRR_CHANGE_MASK_DEFTYPE; - } - - return change_mask; -} /* End Function set_mtrr_state */ - - -static atomic_t undone_count; -static void (*handler_func) (struct set_mtrr_context *ctxt, void *info); -static void *handler_info; -static volatile int wait_barrier_execute = FALSE; -static volatile int wait_barrier_cache_enable = FALSE; - -static void sync_handler (void) -/* [SUMMARY] Synchronisation handler. Executed by "other" CPUs. - [RETURNS] Nothing. -*/ -{ - struct set_mtrr_context ctxt; - - set_mtrr_prepare (&ctxt); - /* Notify master CPU that I'm at the barrier and then wait */ - atomic_dec (&undone_count); - while (wait_barrier_execute) barrier (); - /* The master has cleared me to execute */ - (*handler_func) (&ctxt, handler_info); - /* Notify master CPU that I've executed the function */ - atomic_dec (&undone_count); - /* Wait for master to clear me to enable cache and return */ - while (wait_barrier_cache_enable) barrier (); - set_mtrr_done (&ctxt); -} /* End Function sync_handler */ - -static void do_all_cpus (void (*handler) (struct set_mtrr_context *ctxt, - void *info), - void *info, int local) -/* [SUMMARY] Execute a function on all CPUs, with caches flushed and disabled. - [PURPOSE] This function will synchronise all CPUs, flush and disable caches - on all CPUs, then call a specified function. When the specified function - finishes on all CPUs, caches are enabled on all CPUs. - The function to execute. - An arbitrary information pointer which is passed to <>. - If TRUE <> is executed locally. - [RETURNS] Nothing. -*/ -{ - unsigned long timeout; - struct set_mtrr_context ctxt; - - mtrr_hook = sync_handler; - handler_func = handler; - handler_info = info; - wait_barrier_execute = TRUE; - wait_barrier_cache_enable = TRUE; - /* Send a message to all other CPUs and wait for them to enter the - barrier */ - atomic_set (&undone_count, smp_num_cpus - 1); - smp_message_pass (MSG_ALL_BUT_SELF, MSG_MTRR_CHANGE, 0, 0); - /* Wait for it to be done */ - timeout = jiffies + JIFFIE_TIMEOUT; - while ( (atomic_read (&undone_count) > 0) && (jiffies < timeout) ) - barrier (); - if (atomic_read (&undone_count) > 0) - { - panic ("mtrr: timed out waiting for other CPUs\n"); - } - mtrr_hook = NULL; - /* All other CPUs should be waiting for the barrier, with their caches - already flushed and disabled. Prepare for function completion - notification */ - atomic_set (&undone_count, smp_num_cpus - 1); - /* Flush and disable the local CPU's cache and release the barier, which - should cause the other CPUs to execute the function. Also execute it - locally if required */ - set_mtrr_prepare (&ctxt); - wait_barrier_execute = FALSE; - if (local) (*handler) (&ctxt, info); - /* Now wait for other CPUs to complete the function */ - while (atomic_read (&undone_count) > 0) barrier (); - /* Now all CPUs should have finished the function. Release the barrier to - allow them to re-enable their caches and return from their interrupt, - then enable the local cache and return */ - wait_barrier_cache_enable = FALSE; - set_mtrr_done (&ctxt); - handler_func = NULL; - handler_info = NULL; -} /* End Function do_all_cpus */ - - -struct set_mtrr_data -{ - unsigned long smp_base; - unsigned long smp_size; - unsigned int smp_reg; - mtrr_type smp_type; -}; - -static void set_mtrr_handler (struct set_mtrr_context *ctxt, void *info) -{ - struct set_mtrr_data *data = info; - - set_mtrr_up (data->smp_reg, data->smp_base, data->smp_size, data->smp_type, - FALSE); -} /* End Function set_mtrr_handler */ - - - -/* A warning that is common to the module and non-module cases. */ -/* Some BIOS's are fucked and don't set all MTRRs the same! */ -#ifdef MODULE -static void mtrr_state_warn (unsigned long mask) -#else -static void mtrr_state_warn (unsigned long mask) -#endif -{ - if (!mask) return; - if (mask & MTRR_CHANGE_MASK_FIXED) - printk ("mtrr: your CPUs had inconsistent fixed MTRR settings\n"); - if (mask & MTRR_CHANGE_MASK_VARIABLE) - printk ("mtrr: your CPUs had inconsistent variable MTRR settings\n"); - if (mask & MTRR_CHANGE_MASK_DEFTYPE) - printk ("mtrr: your CPUs had inconsistent MTRRdefType settings\n"); - printk ("mtrr: probably your BIOS does not setup all CPUs\n"); -} /* End Function mtrr_state_warn */ - -#ifdef MODULE -/* As a module, copy the MTRR state using an IPI handler. */ - -static volatile unsigned long smp_changes_mask = 0; - -static void copy_mtrr_state_handler (struct set_mtrr_context *ctxt, void *info) -{ - unsigned long mask, count; - struct mtrr_state *smp_mtrr_state = info; - - mask = set_mtrr_state (smp_mtrr_state, ctxt); - /* Use the atomic bitops to update the global mask */ - for (count = 0; count < sizeof mask * 8; ++count) - { - if (mask & 0x01) set_bit (count, &smp_changes_mask); - mask >>= 1; - } -} /* End Function copy_mtrr_state_handler */ - -/* Copies the entire MTRR state of this CPU to all the others. */ -static void copy_mtrr_state (void) -{ - struct mtrr_state ms; - - get_mtrr_state (&ms); - do_all_cpus (copy_mtrr_state_handler, &ms, FALSE); - finalize_mtrr_state (&ms); - mtrr_state_warn (smp_changes_mask); -} /* End Function copy_mtrr_state */ - -#endif /* MODULE */ -#endif /* __SMP__ */ - -static char *attrib_to_str (int x) -{ - return (x <= 6) ? mtrr_strings[x] : "?"; -} /* End Function attrib_to_str */ - -static void init_table (void) -{ - int i, max; - - max = get_num_var_ranges (); - if ( ( usage_table = kmalloc (max * sizeof *usage_table, GFP_KERNEL) ) - == NULL ) - { - printk ("mtrr: could not allocate\n"); - return; - } - for (i = 0; i < max; i++) usage_table[i] = 1; - -} /* End Function init_table */ - -int mtrr_add (unsigned long base, unsigned long size, unsigned int type, - char increment) -/* [SUMMARY] Add an MTRR entry. - The starting (base) address of the region. - The size (in bytes) of the region. - The type of the new region. - If true and the region already exists, the usage count will be - incremented. - [RETURNS] The MTRR register on success, else a negative number indicating - the error code. - [NOTE] This routine uses a spinlock. -*/ -{ - int i, max; - mtrr_type ltype; - unsigned long lbase, lsize, last; - - if (!usage_table) init_table(); - if ( (base & 0xfff) || (size & 0xfff) ) - { - printk ("mtrr: size and base must be multiples of 4kB\n"); - printk ("mtrr: size: %lx base: %lx\n", size, base); - return -EINVAL; - } - if (base + size < 0x100000) - { - printk ("mtrr: cannot set region below 1 MByte (0x%lx,0x%lx)\n", - base, size); - return -EINVAL; - } - /* Check upper bits of base and last are equal and lower bits are 0 for - base and 1 for last */ - last = base + size - 1; - for (lbase = base; !(lbase & 1) && (last & 1); - lbase = lbase >> 1, last = last >> 1); - if (lbase != last) - { - printk ("mtrr: base(0x%lx) is not aligned on a size(0x%lx) boundary\n", - base, size); - return -EINVAL; - } - if (type >= MTRR_NUM_TYPES) - { - printk ("mtrr: type: %u illegal\n", type); - return -EINVAL; - } - /* If the type is WC, check that this processor supports it */ - if ( (type == MTRR_TYPE_WRCOMB) && !have_wrcomb () ) - { - printk ("mtrr: your processor doesn't support write-combining\n"); - return -ENOSYS; - } - increment = increment ? 1 : 0; - max = get_num_var_ranges (); - /* Search for existing MTRR */ - - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if (base >= lbase + lsize) continue; - if ( (base < lbase) && (base + size <= lbase) ) continue; - /* At this point we know there is some kind of overlap/enclosure */ - if ( (base < lbase) || (base + size > lbase + lsize) ) - { - printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n", - base, size, lbase, lsize); - return -EINVAL; - } - /* New region is enclosed by an existing region */ - if (ltype != type) - { - if (type == MTRR_TYPE_UNCACHABLE) continue; - printk ( "mtrr: type mismatch for %lx,%lx old: %s new: %s\n", - base, size, attrib_to_str (ltype), attrib_to_str (type) ); - return -EINVAL; - } - if (increment) ++usage_table[i]; - return i; - } - /* Search for an empty MTRR */ - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if (lsize > 0) continue; - set_mtrr (i, base, size, type); - usage_table[i] = 1; - return i; - } - printk ("mtrr: no more MTRRs available\n"); - return -ENOSPC; -} /* End Function mtrr_add */ - -int mtrr_del (int reg, unsigned long base, unsigned long size) -/* [SUMMARY] Delete MTRR/decrement usage count. - The register. If this is less than 0 then <> and <> must - be supplied. - The base address of the region. This is ignored if <> is >= 0. - The size of the region. This is ignored if <> is >= 0. - [RETURNS] The register on success, else a negative number indicating - the error code. - [NOTE] This routine uses a spinlock. -*/ -{ - int i, max; - mtrr_type ltype; - unsigned long lbase, lsize; - - if (!usage_table) init_table(); - max = get_num_var_ranges (); - if (reg < 0) - { - /* Search for existing MTRR */ - for (i = 0; i < max; ++i) - { - get_mtrr (i, &lbase, &lsize, <ype); - if ( (lbase == base) && (lsize == size) ) - { - reg = i; - break; - } - } - if (reg < 0) - { - printk ("mtrr: no MTRR for %lx,%lx found\n", base, size); - return -EINVAL; - } - } - if (reg >= max) - { - printk ("mtrr: register: %d too big\n", reg); - return -EINVAL; - } - get_mtrr (reg, &lbase, &lsize, <ype); - if (lsize < 1) - { - printk ("mtrr: MTRR %d not used\n", reg); - return -EINVAL; - } - if (usage_table[reg] < 1) - { - printk ("mtrr: reg: %d has count=0\n", reg); - return -EINVAL; - } - if (--usage_table[reg] < 1) set_mtrr (reg, 0, 0, 0); - return reg; -} /* End Function mtrr_del */ - -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 1, 0) */ diff --git a/glide2x/README b/glide2x/README deleted file mode 100644 index 51d3443..0000000 --- a/glide2x/README +++ /dev/null @@ -1,31 +0,0 @@ -Here are a few notes about building Glide3x from CVS. - -The Glide source trees are branced by platform and the platform names are -internal names used at 3dfx. Since these name may not make sense to others -here is a quick list. - -sst1: Voodoo Graphics -sst96: Voodoo Rush -cvg: Voodoo 2 -h3: Voodoo Banshee/Voodoo 3 - -There is a single toplevel makefile for glide2x. To select a build -for either sst1, cvg or h3 set FX_GLIDE_HW to either sst1, cvg or h3. The -default is to build for h3. - -There are many other environment variables used to control the Glide -build. Here is a listing of some of the important ones: - -DEBUG=1: Turn on debugging information, note this disables - the asm optimizations. -FX_GLIDE_PIC=1: Enable PIC in shared libraries. -FX_GLIDE_CTRISETUP=1: Use C versions as opposed to ASM versions of triangle - setup code. -GL_AMD3D=1: Enable AMD 3DNow! optimizations. Note this is - currently broken on several platforms. - -All glide source trees use a common set of libraries kept in the -swlibs branch. In order to build any glide library the swlibs branch -must be moved inside the glide3x directory. The swlibs branch is not -stored here within the glide2x cvs tree because it is also shared with -the glide3x branch. diff --git a/glide2x/cvg/bin/makefile b/glide2x/cvg/bin/makefile deleted file mode 100644 index 4d5c26f..0000000 --- a/glide2x/cvg/bin/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = *.exe *.dll *.bat - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/cvg/bin/makefile.linux b/glide2x/cvg/bin/makefile.linux deleted file mode 100644 index 360d40d..0000000 --- a/glide2x/cvg/bin/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(patsubst CVS,,$(patsubst makefile%,,$(wildcard *))) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/binsrc/makefile b/glide2x/cvg/binsrc/makefile deleted file mode 100644 index d4ac1a6..0000000 --- a/glide2x/cvg/binsrc/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)\cvg - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak - diff --git a/glide2x/cvg/binsrc/makefile.linux b/glide2x/cvg/binsrc/makefile.linux deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/cvg/binsrc/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/cvg/cmd/makefile.linux b/glide2x/cvg/cmd/makefile.linux deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/cvg/cmd/makefile.linux +++ /dev/null @@ -1,27 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = cmd -SUBDIRS = pass - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/cmd/pass/makefile.linux b/glide2x/cvg/cmd/pass/makefile.linux deleted file mode 100644 index 9d984bb..0000000 --- a/glide2x/cvg/cmd/pass/makefile.linux +++ /dev/null @@ -1,40 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -LCOPTS = -LCINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include - -# sources -CFILES = pass.c -LLDLIBS = -L$(BUILD_ROOT)/$(FX_GLIDE_HW)/lib -lsst1init \ - -L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci - - -# targets -PROGRAM = pass -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/cvg/cmd/pass/pass.c b/glide2x/cvg/cmd/pass/pass.c deleted file mode 100644 index b2fb77a..0000000 --- a/glide2x/cvg/cmd/pass/pass.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#include -#include - -#include <3dfx.h> -#include -#include - -/* This should be exported, but isn't yet */ -#define SST1INIT_MAX_BOARDS 16 - -int main (int argc, char* argv[]) -{ - FxU32* sst[SST1INIT_MAX_BOARDS]; - int num_sst; - int i; - - /* Map all the boards in the system */ - num_sst = 0; - do { - sst[num_sst] = sst1InitMapBoard (num_sst); - } while (sst[num_sst++] != NULL); - - /* Shut them all down */ - for (i = 0; i < num_sst; i += 1) - sst1InitVgaPassCtrl(sst[i], 1); - - return 0; -} diff --git a/glide2x/cvg/glide/makefile b/glide2x/cvg/glide/makefile deleted file mode 100644 index 755f9b1..0000000 --- a/glide2x/cvg/glide/makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = glide -!if "$(FX_TARGET)" == "DOS" -SUBDIRS = src tests -!else -SUBDIRS = oem src tests -!endif - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/cvg/glide/makefile.linux b/glide2x/cvg/glide/makefile.linux deleted file mode 100644 index 8857efa..0000000 --- a/glide2x/cvg/glide/makefile.linux +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = glide -SUBDIRS = oem src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/glide/makefile.unix b/glide2x/cvg/glide/makefile.unix deleted file mode 100644 index 8857efa..0000000 --- a/glide2x/cvg/glide/makefile.unix +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = glide -SUBDIRS = oem src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/glide/oem/fxbldno.c b/glide2x/cvg/glide/oem/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/cvg/glide/oem/fxbldno.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - * - * $Header$ - * $Log$ - * - * 1 7/25/97 9:05a Pgj - * generate fxbldno.h which defines BUILD_NUMBER - * - */ - -#include -#include -#include - -main(int argc, char **argv) -{ - struct tm locTime; - time_t sysTime; - char *build; - - time(&sysTime); - locTime = *localtime(&sysTime); - - if (build = getenv("BUILD_NUMBER")) { - printf("#define BUILD_NUMBER %s\n", build); - } else { - unsigned short magic; - magic = (locTime.tm_yday << 7) | - (locTime.tm_hour << 2) | - (locTime.tm_min / 15); - printf("#define BUILD_NUMBER %d\n", magic); - } - return 0; - -} /* end main() */ diff --git a/glide2x/cvg/glide/oem/makefile b/glide2x/cvg/glide/oem/makefile deleted file mode 100644 index 8214e20..0000000 --- a/glide2x/cvg/glide/oem/makefile +++ /dev/null @@ -1,63 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -!if "$(FX_GLIDE_HW)" == "SST96" -GLIDE_SRC_BASE = sst1 -!else -GLIDE_SRC_BASE = $(FX_GLIDE_HW) -!endif -LCINCS = $(LCINCS) -I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)\include \ - -I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)\glide\src - -!if "$(DEBUG)" == "1" -LCDEFS = -DDEBUG=1 -!endif - -CFILES = oeminit.c -RCFILE = oeminit.rc -HEADERS = oeminit.h -PRIVATE_HEADERS = rcver.h -LIBRARIES = fxoem2x.lib - -INSTALL_DESTINATION = $(BUILD_ROOT)\$(GLIDE_SRC_BASE) - -# Make a static link library for things like the diags. -!if "$(FX_DLL_BUILD)" == "1" -FX_DLL_LIBRARY = 1 -!else -LCDEFS = $(LCDEFS) -DFX_STATIC_BUILD -!endif - -LCDEFS = $(LCDEFS) - -!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak - -!if "$(FX_TARGET)" == "WIN32" -!if "$(FX_DLL_BUILD)" != "" -fxoem2x.dll: -!endif -!endif - -fxbldno.exe: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) - -fxbldno.h: fxbldno.exe - fxbldno > fxbldno.h - -oeminit.res: rcver.h fxbldno.h diff --git a/glide2x/cvg/glide/oem/makefile.linux b/glide2x/cvg/glide/oem/makefile.linux deleted file mode 100644 index c7d8c70..0000000 --- a/glide2x/cvg/glide/oem/makefile.linux +++ /dev/null @@ -1,49 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -ifeq ($(FX_GLIDE_HW),SST96) -GLIDE_SRC_BASE = sst1 -else -GLIDE_SRC_BASE = $(FX_GLIDE_HW) -endif -LCINCS += -I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)/include \ - -I$(BUILD_ROOT)/$(GLIDE_SRC_BASE)/glide/src - -ifeq ($(DEBUG),1) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -CFILES = oeminit.c - -HEADERS = oeminit.h - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(GLIDE_SRC_BASE) - -LIBRARIES = libfxoem2x.a - -# Make a static link library for things like the diags. -ifeq ($(FX_DLL_BUILD),1) -FX_DLL_LIBRARY = 1 -else -LCDEFS += -DFX_STATIC_BUILD -endif - -include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak - diff --git a/glide2x/cvg/glide/oem/oeminit.c b/glide2x/cvg/glide/oem/oeminit.c deleted file mode 100644 index 18b1d58..0000000 --- a/glide2x/cvg/glide/oem/oeminit.c +++ /dev/null @@ -1,372 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ -#include -#include -#include - -#ifndef __linux__ -#include -#endif - -#define FX_DLL_DEFINITION -#include <3dfx.h> -#include -#include "oeminit.h" - -const OemPciRegister OEM_PCI_VENDOR_ID = { 0x0, 2, OEM_READ_ONLY }; -const OemPciRegister OEM_PCI_DEVICE_ID = { 0x2, 2, OEM_READ_ONLY }; -const OemPciRegister OEM_PCI_COMMAND = { 0x4, 2, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_STATUS = { 0x6, 2, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_REVISION_ID = { 0x8, 1, OEM_READ_ONLY }; -const OemPciRegister OEM_PCI_CLASS_CODE = { 0x9, 3, OEM_READ_ONLY }; -const OemPciRegister OEM_PCI_CACHE_LINE_SIZE = { 0xC, 1, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_LATENCY_TIMER = { 0xD, 1, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_HEADER_TYPE = { 0xE, 1, OEM_READ_ONLY }; -const OemPciRegister OEM_PCI_BIST = { 0xF, 1, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_0 = { 0x10, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_1 = { 0x14, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_2 = { 0x18, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_3 = { 0x1C, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_4 = { 0x20, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_5 = { 0x24, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_6 = { 0x28, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_7 = { 0x2c, 4, OEM_READ_WRITE }; -const OemPciRegister OEM_PCI_BASE_ADDRESS_8 = { 0x30, 4, OEM_READ_WRITE }; - -static FILE* outFile = NULL; - -static const char* -myGetenv(const char* envKey) -{ - FxBool callRealGetenvP = FXTRUE; - -#if __WIN32__ - /* NB: If were being called from cya code in - * DllMain(DLL_PROCESS_DETACH) because the current app has called - * exit() or dropped off of the end of main the per dll environ - * string table has been freed by the c runtime but has not been set - * to NULL. Bad things happen if this memory has been unmapped by - * the system or if the string cannot be found. - */ - { - HANDLE curProcessHandle = GetCurrentProcess(); - DWORD exitCode = STILL_ACTIVE; - - callRealGetenvP = ((curProcessHandle != NULL) && - GetExitCodeProcess(curProcessHandle, &exitCode) && - (exitCode == STILL_ACTIVE)); - } -#endif /* __WIN32__ */ - - return (callRealGetenvP - ? getenv(envKey) - : NULL); -} - -static void -MyDebugPrintf(FILE* outputFile, const char* fmtString, ...) -{ - static FxBool debugDumpP = FXFALSE; - static FxBool calledP = FXFALSE; - - if (!calledP) { - const char* envStr = myGetenv("GDBG_LEVEL"); - - debugDumpP = ((envStr != NULL) && - (atoi(envStr) >= 80)); - - calledP = FXTRUE; - } - - if (debugDumpP) { - va_list args; - -#if !DIRECTX - va_start(args, fmtString); - if (outputFile != NULL) vfprintf(outputFile, fmtString, args); - va_end(args); -#endif /* !DIRECTX */ - - va_start(args, fmtString); - { - //char msgBuf[256]; - - vfprintf(stderr, fmtString, args); - //vsprintf(msgBuf, fmtString, args); - //OutputDebugString(msgBuf); - } - va_end(args); - } -} - -static struct { - const char* resName; - GrScreenResolution_t resId; -} resTable[] = { - { "320x200", GR_RESOLUTION_320x200 }, /* 0x0 */ - { "320x240", GR_RESOLUTION_320x240 }, /* 0x1 */ - { "400x256", GR_RESOLUTION_400x256 }, /* 0x2 */ - { "512x384", GR_RESOLUTION_512x384 }, /* 0x3 */ - { "640x200", GR_RESOLUTION_640x200 }, /* 0x4 */ - { "640x350", GR_RESOLUTION_640x350 }, /* 0x5 */ - { "640x400", GR_RESOLUTION_640x400 }, /* 0x6 */ - { "640x480", GR_RESOLUTION_640x480 }, /* 0x7 */ - { "800x600", GR_RESOLUTION_800x600 }, /* 0x8 */ - { "960x720", GR_RESOLUTION_960x720 }, /* 0x9 */ - { "856x480", GR_RESOLUTION_856x480 }, /* 0xA */ - { "512x256", GR_RESOLUTION_512x256 }, /* 0xB */ - { "1024x768", GR_RESOLUTION_1024x768 }, /* 0xC */ - { "1280x1024", GR_RESOLUTION_1280x1024 }, /* 0xD */ - { "1600x1200", GR_RESOLUTION_1600x1200 }, /* 0xE */ - { "400x300", GR_RESOLUTION_400x300 } /* 0xF */ -}; - -static const char* -GlideRes2String(GrScreenResolution_t res) -{ - int i; - const char* retVal = NULL; - - for(i = 0; i < sizeof(resTable) / sizeof(resTable[0]); i++) { - if (resTable[i].resId == res) { - retVal = resTable[i].resName; - break; - } - } - - return ((retVal == NULL) - ? "Unknown" - : retVal); -} - -static const char* -GlideRefresh2String(GrScreenRefresh_t refresh) -{ - static const char* refreshStrings[] = { - "60", "70", "72", "75", "80", "90", "100", "85", "120" - }; - - return ((refresh > sizeof(refreshStrings) / sizeof(refreshStrings[0])) - ? "Unknown" - : refreshStrings[refresh]); -} - -static void -DumpOemVideoInfo(const OemVideoTimingInfo* videoInfo) -{ - if ((outFile != NULL) && (videoInfo != NULL)) { - MyDebugPrintf(outFile, "VideoTimingInfo:\n"); - MyDebugPrintf(outFile, "\tGlideResolution: (0x%lX : %s)\n", - videoInfo->res, GlideRes2String(videoInfo->res)); - MyDebugPrintf(outFile, "\tGlideRefreshRate: (0x%lX : %s Mhz)\n", - videoInfo->refresh, GlideRefresh2String(videoInfo->refresh)); - MyDebugPrintf(outFile, "\tDepth: %ld\n", videoInfo->depth); - MyDebugPrintf(outFile, "\tHSyncOn: 0x%lX\n", videoInfo->hSyncOn); - MyDebugPrintf(outFile, "\tHSyncOff: 0x%lX\n", videoInfo->hSyncOff); - MyDebugPrintf(outFile, "\tVSyncOn: 0x%lX\n", videoInfo->vSyncOn); - MyDebugPrintf(outFile, "\tVSyncOn: 0x%lX\n", videoInfo->vSyncOff); - MyDebugPrintf(outFile, "\tHBackPorch: 0x%lX\n", videoInfo->hBackPorch); - MyDebugPrintf(outFile, "\tVBackPorch: 0x%lX\n", videoInfo->vBackPorch); - MyDebugPrintf(outFile, "\tXDimension: 0x%lX\n", videoInfo->xDimension); - MyDebugPrintf(outFile, "\tYDimension: 0x%lX\n", videoInfo->yDimension); - MyDebugPrintf(outFile, "\tClkFreq 16bpp: %g\n", videoInfo->clkFreq16bpp); - MyDebugPrintf(outFile, "\tClkFreq 24bpp: %g\n", videoInfo->clkFreq24bpp); - } -} - -static void -DumpOemInitInfo(const char* fnName, const OemInitInfo* oemInfo) -{ - const char* envStr = myGetenv("GDBG_LEVEL"); - - if ((envStr != NULL) && (atoi(envStr) >= 80)) { - if (outFile == NULL) outFile = fopen("oemdll.txt", "w"); - if (outFile != NULL) { - MyDebugPrintf(outFile, "%s: \n", fnName); - if (oemInfo == NULL) goto __errExit; - - MyDebugPrintf(outFile, "\tVersion: %d.%d\n", - (oemInfo->version >> 16UL), (oemInfo->version & 0xFFFFUL)); - MyDebugPrintf(outFile, "\tVendorId: 0x%lX\n", oemInfo->vendorID); - MyDebugPrintf(outFile, "\tSubVendorId: 0x%lX\n", oemInfo->subvendorID); - MyDebugPrintf(outFile, "\tDeviceId: 0x%lX\n", oemInfo->deviceID); - MyDebugPrintf(outFile, "\tBoardId: 0x%lX\n", oemInfo->boardID); - MyDebugPrintf(outFile, "\tHW BaseAddr: 0x%lX\n", (FxU32)oemInfo->linearAddress); - MyDebugPrintf(outFile, "\tSliSlaveAddr: 0x%lX\n", (FxU32)oemInfo->slaveAddress); - - DumpOemVideoInfo(&oemInfo->vid); - - __errExit: - MyDebugPrintf(outFile, "\n"); - } - } -} - -/*------------------------------------------------------------------- - Function: fxoemInitMapBoard - Date: 04-Feb-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - oem - information for oem dll - Return: - -------------------------------------------------------------------*/ -FX_EXPORT FxU32 FX_CSTYLE fxoemInitMapBoard(OemInitInfo *oem) -{ -#define FN_NAME "fxoemInitMapBoard" - - DumpOemInitInfo(FN_NAME, oem); - - return 1; -#undef FN_NAME -} /* fxoemInitMapBoard */ - -/*------------------------------------------------------------------- - Function: fxoemGet - Date: 12-Mar-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - pname - selector to query oem dll functions - plenth - length of the parameter in bytes - param - data field - Return: - size of the parameter. O on error or not supported - -------------------------------------------------------------------*/ -FX_EXPORT FxI32 FX_CSTYLE fxoemGet(FxU32 pname, FxU32 plength, FxI32 *params) -{ -#define FN_NAME "fxoemGet" - - switch(pname) { - case FX_OEM_TVOUT: - if (plength == 4) { - *params = FXFALSE; - return 4; - } - break; - case FX_OEM_SLIMASTER: - if (plength == 8) { - *params = 0; - *(params +1) = 0; - return 8; - } - break; - case FX_OEM_SLISLAVE: - if (plength == 8) { - *params = 0; - *(params +1) = 0; - return 8; - } - break; - } - return 0; -#undef FN_NAME -} /* fxoemGet */ - -/*------------------------------------------------------------------- - Function: fxoemInitVideoTiming - Date: 23-Feb-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - vid - video timing data - Return: - 1 if video timing is modified - 0 if video timing is unchanged - -------------------------------------------------------------------*/ -FX_EXPORT FxU32 FX_CSTYLE fxoemInitVideoTiming(OemVideoTimingInfo *vid) -{ -#define FN_NAME "fxoemInitVideoTiming" - - DumpOemVideoInfo(vid); - - return 0; -#undef FN_NAME -} /* fxoemInitSetVideo */ - -/*------------------------------------------------------------------- - Function: fxoemInitSetVideo - Date: 04-Feb-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - oem - information for oem dll - Return: - -------------------------------------------------------------------*/ -FX_EXPORT FxU32 FX_CSTYLE fxoemInitSetVideo(OemInitInfo *oem) -{ -#define FN_NAME "fxoemInitSetVideo" - - DumpOemInitInfo(FN_NAME, oem); - - return 1; -#undef FN_NAME -} /* fxoemInitSetVideo */ - -/*------------------------------------------------------------------- - Function: fxoemRestoreVideo - Date: 04-Feb-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - oem - information for oem dll - Return: - -------------------------------------------------------------------*/ -FX_EXPORT FxU32 FX_CSTYLE fxoemRestoreVideo(OemInitInfo *oem) -{ -#define FN_NAME "fxoemRestoreVideo" - - DumpOemInitInfo(FN_NAME, oem); - if (outFile != NULL) { - fclose(outFile); - outFile = NULL; - } - - return 1; -#undef FN_NAME -} /* fxoemRestoreVideo */ - -/*------------------------------------------------------------------- - Function: fxoemControl - Date: 23-Feb-98 - Implementor(s): atai - Description: - null function for oem dll - Arguments: - mode - determine whether the VGA display or Voodoo Graphics is visiable - Return: - -------------------------------------------------------------------*/ -FX_EXPORT FxU32 FX_CSTYLE fxoemControl(FxU32 mode) -{ -#define FN_NAME "fxoemControlMode" - - DumpOemInitInfo(FN_NAME, NULL); - - return 1; -#undef FN_NAME -} /* fxoemRestoreVideo */ - - diff --git a/glide2x/cvg/glide/oem/oeminit.h b/glide2x/cvg/glide/oem/oeminit.h deleted file mode 100644 index 6bf4ffc..0000000 --- a/glide2x/cvg/glide/oem/oeminit.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#ifndef __OEMINIT_H__ -#define __OEMINIT_H__ - -#define OEMINIT_INVALID_BOARD_ID 0xdeadfeed -#define OEMINIT_VERSION 0x10001 - -#include "3dfx.h" -#define FX_DLL_DEFINITION -#include "fxdll.h" -#include "sst1vid.h" - -#define FX_OEM_CONTROL_ACTIVATE 1 -#define FX_OEM_CONTROL_DEACTIVATE 2 - -#define FX_OEM_TVOUT 1 -#define FX_OEM_SLIMASTER 2 -#define FX_OEM_SLISLAVE 3 - -#define FX_OEM_FBI_CONFIG_SHIFT 8 - -typedef enum { - OEM_READ_ONLY, - OEM_WRITE_ONLY, - OEM_READ_WRITE -} OemPciIOFlag; - -typedef struct { - FxU32 regAddress; - FxU32 sizeInBytes; - OemPciIOFlag rwFlag; -} OemPciRegister; - -typedef FxU32 (FX_CALL *PciConfigProc)(OemPciRegister, FxU32, FxU32 *); - -typedef struct { - GrScreenResolution_t res; - GrScreenRefresh_t refresh; - FxU32 depth; - FxU32 hSyncOn; - FxU32 hSyncOff; - FxU32 vSyncOn; - FxU32 vSyncOff; - FxU32 hBackPorch; - FxU32 vBackPorch; - FxU32 xDimension; - FxU32 yDimension; - float clkFreq16bpp; - float clkFreq24bpp; -} OemVideoTimingInfo; - -typedef struct { - FxU32 version; /* Version for this structure */ - FxU32 vendorID; /* PCI Vendor ID field */ - FxU32 subvendorID; /* PCI sub Vendor ID field */ - FxU32 deviceID; /* PCI Device ID field */ - FxU32 boardID; /* Board ID: defined for Voodoo2 only!!! */ - FxU32 *linearAddress; /* address for primary board */ - FxU32 *slaveAddress; /* address for slave board */ - PciConfigProc fxoemPciWriteConfig; - PciConfigProc fxoemPciReadConfig; - OemVideoTimingInfo vid; - FxU32 reserved[42]; -} OemInitInfo; - -FX_EXPORT FxU32 FX_CSTYLE fxoemInitMapBoard(OemInitInfo *oem); -FX_EXPORT FxI32 FX_CSTYLE fxoemGet(FxU32 pname, FxU32 plength, FxI32 *params); -FX_EXPORT FxU32 FX_CSTYLE fxoemInitVideoTiming(OemVideoTimingInfo *vid); -FX_EXPORT FxU32 FX_CSTYLE fxoemInitSetVideo(OemInitInfo *oem); -FX_EXPORT FxU32 FX_CSTYLE fxoemRestoreVideo(OemInitInfo *oem); -FX_EXPORT FxU32 FX_CSTYLE fxoemControl(FxU32 mode); - -#endif __OEMINIT_H__ - diff --git a/glide2x/cvg/glide/oem/oeminit.rc b/glide2x/cvg/glide/oem/oeminit.rc deleted file mode 100644 index b966d82..0000000 --- a/glide2x/cvg/glide/oem/oeminit.rc +++ /dev/null @@ -1,71 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" -#include "fxbldno.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#ifndef GLIDE3 -#define VERSIONNAME "oeminit2x.dll\0" -#else -#define VERSIONNAME "oeminit3x.dll\0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3Dfx Interactive, Inc.\0" - VALUE "FileDescription", "3Dfx Interactive, Inc. OEM DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1997\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", PRODNAME - VALUE "ProductVersion", VERSIONSTR - VALUE "Graphics Subsystem", HWSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/cvg/glide/oem/rcver.h b/glide2x/cvg/glide/oem/rcver.h deleted file mode 100644 index 3230db0..0000000 --- a/glide2x/cvg/glide/oem/rcver.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#define MANVERSION 2 -#define MANREVISION 53 - -#ifndef GLIDE3 -#define VERSIONSTR "2.53\0" -#else -#define VERSIONSTR "3.0\0" -#endif - -#if defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(H3) -# define HWSTR " Banshee(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#else -# define PRODNAME "Something really, really important\0" -# define HWSTR " Unknown Chip\0" -#endif diff --git a/glide2x/cvg/glide/src/banner.inc b/glide2x/cvg/glide/src/banner.inc deleted file mode 100644 index 5a5f972..0000000 --- a/glide2x/cvg/glide/src/banner.inc +++ /dev/null @@ -1,101 +0,0 @@ -static int banner_width = 180; -static int banner_height = 90; -static unsigned short banner_data[] = { -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52aa, 0xad34, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xacee, 0x39a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x93ea, 0xd5d0, 0x944d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9383, 0xd506, 0x8beb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc63, 0xd506, 0xd58d, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a82, 0xd4e4, 0xd504, 0xc54d, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5202, 0xd4e3, 0xd4e3, 0xd505, 0xcd6d, 0x5aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xc483, 0xd503, 0xd504, 0xd569, 0x8baa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9364, 0xd4e2, 0xd4e2, 0xd4e2, 0xd505, 0xc54e, 0x4206, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e3, 0xd504, 0xd546, 0xd504, 0xd525, 0xc54d, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x93a4, 0xcd4c, 0x20e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd504, 0xd547, 0xd548, 0xd504, 0xd526, 0xbd2f, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd504, 0xd56a, 0xd634, 0xd569, 0xd525, 0xdd69, 0x8369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c3, 0xb487, 0xd504, 0xd528, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0x6ac4, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528a, 0x39e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd526, 0xd548, 0xd5cf, 0xd613, 0xd527, 0xd505, 0xd548, 0xacae, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49a1, 0xcce5, 0xd56a, 0xde12, 0xde98, 0xddce, 0xd548, 0xdd04, 0xc52e, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c5, 0xcce7, 0xd504, 0xd503, 0xd527, 0x7b48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0x9b83, 0xc4a4, 0xac23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5247, 0xc570, 0x736a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd505, 0xd58c, 0xd634, 0xd678, 0xd5f1, 0xd548, 0xd504, 0xd58b, 0x942c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xb444, 0xdd48, 0xddf0, 0xde98, 0xdeb9, 0xde55, 0xdd6b, 0xdd03, 0xdd8b, 0x7349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2902, 0x9be6, 0xd527, 0xd524, 0xd524, 0xdd03, 0xd526, 0x9c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x72c4, 0xac25, 0xd4e3, 0xd4e3, 0xd4e3, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd5cf, 0xacef, 0x4227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xd5f1, 0xd698, 0xd6ba, 0xd699, 0xd5cf, 0xd547, 0xd525, 0xd5ae, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b43, 0xdd04, 0xddae, 0xde76, 0xdeda, 0xdeda, 0xdeba, 0xddcf, 0xdd25, 0xdd47, 0xbd0c, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a04, 0xbc86, 0xdd24, 0xdd26, 0xddcf, 0xddcf, 0xdd25, 0xdd26, 0xb4ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x8b64, 0xc4a6, 0xd503, 0xd4e3, 0xd4e3, 0xd4e3, 0xd507, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9362, 0xd4e3, 0xd56b, 0xcdb2, 0x83cc, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd525, 0xd548, 0xd613, 0xd6b9, 0xd6ba, 0xd6ba, 0xd677, 0xddae, 0xd527, 0xdd25, 0xd58d, 0x62c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd505, 0xdd68, 0xde34, 0xdeda, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd8a, 0xdd25, 0xdd8c, 0x6b09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xcd06, 0xdd24, 0xdd68, 0xde33, 0xdeb9, 0xde34, 0xdd46, 0xdd25, 0xcd49, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6aa4, 0xa404, 0xd4e4, 0xd504, 0xd549, 0xd5ae, 0xd5ad, 0xd548, 0xd505, 0xbc86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xd4e2, 0xd4e3, 0xd506, 0xd58c, 0xb531, 0x5248, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd504, 0xd5ad, 0xd655, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xde76, 0xddae, 0xdd04, 0xdd47, 0xc54d, 0x4a06, 0x0000, 0x0000, 0x0000, 0x2921, 0xbc84, 0xdd46, 0xde11, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb8, 0xddf0, 0xdd46, 0xdd47, 0xbcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x9c07, 0xdd26, 0xdd26, 0xdd8a, 0xde55, 0xdeb9, 0xdedb, 0xde55, 0xdd8b, 0xdd25, 0xdd47, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x8b65, 0xbcc8, 0xd526, 0xd526, 0xd56a, 0xd612, 0xd676, 0xd698, 0xd5f2, 0xd525, 0xd506, 0x93c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xc462, 0xd4e3, 0xd503, 0xd504, 0xd527, 0xcdd1, 0x8c0d, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd505, 0xd5f1, 0xde98, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdeba, 0xde55, 0xdd8c, 0xdd25, 0xdd26, 0xbd2e, 0x2943, 0x0000, 0x0000, 0x9b83, 0xdd26, 0xddcd, 0xde77, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd89, 0xdd25, 0xddad, 0x6ae9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0xbca8, 0xdd46, 0xdd48, 0xddcf, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xde97, 0xddee, 0xdd25, 0xdd46, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0xa3e6, 0xcce5, 0xd504, 0xd547, 0xd58c, 0xd633, 0xd698, 0xd6ba, 0xd6ba, 0xd678, 0xd5d0, 0xd504, 0xd527, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b82, 0xd548, 0xd58b, 0xd549, 0xd4e3, 0xd505, 0xd58c, 0xbd51, 0x5aa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a24, 0xd526, 0xd526, 0xde35, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde34, 0xdd6a, 0xdd25, 0xdd26, 0xacac, 0x1081, 0x6aa3, 0xd504, 0xdd48, 0xde76, 0xdeda, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd25, 0xdd47, 0xb4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b25, 0xd507, 0xdd24, 0xdd8a, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xde97, 0xddef, 0xdd46, 0xdd46, 0x9c2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x7b26, 0xbc86, 0xd525, 0xdd04, 0xd546, 0xddd0, 0xde55, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd634, 0xd58c, 0xd504, 0xc4e9, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd527, 0xd5d0, 0xd656, 0xd5ad, 0xd527, 0xd505, 0xd527, 0xd5b0, 0x944d, 0x2924, 0x0000, 0x0000, 0x0000, 0x0000, 0x9384, 0xd525, 0xd58a, 0xde56, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xdd48, 0xdd24, 0xdd24, 0xa3c3, 0xc4a4, 0xdd48, 0xde10, 0xdeb9, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xde54, 0xdd68, 0xdd26, 0xdd8a, 0x5a87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xa407, 0xdd26, 0xdd45, 0xddab, 0xde55, 0xdeda, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdeb8, 0xde32, 0xdd46, 0xdd25, 0xb4cb, 0x0000, 0x0000, 0x0000, 0x5224, 0x9be7, 0xcce7, 0xdd04, 0xdd47, 0xdd8b, 0xde11, 0xde97, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6b9, 0xd612, 0xd569, 0xd504, 0xa3e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0xc4c5, 0xd5af, 0xd698, 0xd698, 0xd634, 0xd58c, 0xd525, 0xd526, 0xd56a, 0xbd70, 0x62e9, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xddf0, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeb9, 0xde32, 0xdd48, 0xdd25, 0xdd24, 0xdd46, 0xddcd, 0xdeb8, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xde97, 0xddee, 0xdd46, 0xdd46, 0xacad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5224, 0xc4e9, 0xdd25, 0xdd47, 0xde10, 0xde97, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xdd68, 0xdd25, 0xcd29, 0x3142, 0x7306, 0xb467, 0xd527, 0xdd25, 0xdd48, 0xddce, 0xde54, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd5d0, 0xd546, 0xd526, 0x7305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c2, 0x39a5, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e4, 0xd56b, 0xd655, 0xd6ba, 0xd6ba, 0xd698, 0xd5f1, 0xd549, 0xd504, 0xd525, 0xd5ad, 0x9c6d, 0x3163, 0x5a23, 0xd525, 0xdd47, 0xde55, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde32, 0xddce, 0xddcd, 0xde11, 0xde97, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde54, 0xdd47, 0xdd46, 0xddcd, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x8347, 0xd527, 0xdd46, 0xdd8a, 0xde32, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddab, 0xdd46, 0xdd24, 0xcd06, 0xdd46, 0xdd46, 0xdd8b, 0xddcd, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd654, 0xd58b, 0xd525, 0xcd4a, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x5a65, 0x7b27, 0x9bc7, 0xac46, 0xc4a5, 0x93e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a2, 0xd548, 0xd5f1, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6b9, 0xd656, 0xd5ae, 0xd525, 0xd504, 0xdd47, 0xc4c6, 0xb444, 0xdd26, 0xdd8a, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefa, 0xde97, 0xddab, 0xdd46, 0xdd67, 0xa48d, 0x0000, 0x0000, 0x3163, 0xac27, 0xdd68, 0xdd45, 0xddcd, 0xde75, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddcd, 0xdd47, 0xdd24, 0xdd67, 0xddac, 0xde12, 0xde76, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde12, 0xd569, 0xd526, 0xb468, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0x4a26, 0x7307, 0x93a6, 0xa426, 0xbca7, 0xd506, 0xd4e3, 0xd4e2, 0xd4e2, 0xd4e3, 0xb445, 0x18a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0xcce5, 0xd5ad, 0xd6b9, 0xd6ba, 0xd6ba, 0xd6ba, 0xdeba, 0xde99, 0xd654, 0xd56a, 0xd525, 0xdd03, 0xdd03, 0xdd48, 0xddef, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde52, 0xdd68, 0xdd45, 0xd5af, 0x4a05, 0x5a65, 0xc4e7, 0xdd46, 0xdd68, 0xddef, 0xde96, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xddef, 0xde31, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xddce, 0xdd25, 0xd547, 0x8366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39a4, 0x62c7, 0x8388, 0x9c29, 0xb487, 0xccc5, 0xd507, 0xd504, 0xd504, 0xd505, 0xd527, 0xd528, 0xd548, 0xd505, 0xd4e2, 0xc4c6, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xabe2, 0xd56b, 0xd678, 0xd6ba, 0xdeba, 0xd6ba, 0xdeda, 0xdeda, 0xdeba, 0xde98, 0xd5f0, 0xddad, 0xdd8c, 0xddcf, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xddab, 0xdd45, 0xdd68, 0xc4a7, 0xd548, 0xdd46, 0xdd89, 0xde32, 0xe6d9, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xdd8c, 0xdd04, 0xd56b, 0x4a04, 0x0000, 0x2944, 0x5a87, 0x7b48, 0x93e7, 0xac68, 0xc4ea, 0xd56a, 0xd527, 0xd525, 0xd505, 0xd526, 0xd549, 0xd58c, 0xd5d0, 0xd5f3, 0xd635, 0xd656, 0xd655, 0xd58c, 0xd506, 0xccc4, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae2, 0xd549, 0xd634, 0xd6b9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeda, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe6fa, 0xde31, 0xdd89, 0xe546, 0xdd45, 0xe567, 0xddaa, 0xe696, 0xe6fa, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde54, 0xdd6b, 0xdd03, 0xcd08, 0xa448, 0xbcc9, 0xd528, 0xd526, 0xd525, 0xd505, 0xd505, 0xd526, 0xd528, 0xd56a, 0xd5ce, 0xd633, 0xd677, 0xd699, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd677, 0xd5cf, 0xd506, 0xd505, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a48, 0xa48c, 0x940a, 0x734a, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xd506, 0xd5cf, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xad75, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0x94b2, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe6d9, 0xe653, 0xe5ed, 0xe5cc, 0xe631, 0xe6b8, 0xe6fb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde10, 0xdd49, 0xdd03, 0xdd03, 0xdd04, 0xdd27, 0xd547, 0xd569, 0xd5ae, 0xddf1, 0xd634, 0xd676, 0xd698, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd678, 0xd5f1, 0xd506, 0xd504, 0xa427, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a43, 0xc4a5, 0xd505, 0xd56c, 0xbd2d, 0xa4ae, 0x83cc, 0x5ac8, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb446, 0xddab, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x738e, 0xa534, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde75, 0xddce, 0xddcd, 0xde11, 0xde54, 0xde55, 0xde77, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd699, 0xd5f2, 0xd547, 0xd504, 0xbc85, 0x2922, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc482, 0xd4e3, 0xd504, 0xd505, 0xd527, 0xd56b, 0xcd90, 0xb4cd, 0x942c, 0x734b, 0x39c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8323, 0xdd47, 0xde54, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x5aeb, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd613, 0xd56a, 0xd505, 0xcd08, 0x5204, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4a3, 0xd526, 0xd569, 0xd526, 0xd505, 0xd505, 0xd504, 0xd525, 0xd548, 0xd5ae, 0xbd4e, 0xa48e, 0x838a, 0x5a45, 0x51e2, 0xd506, 0xddf0, 0xde97, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xb5b6, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xad55, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd655, 0xd58d, 0xd503, 0xd549, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4c6, 0xd5ae, 0xd677, 0xd655, 0xd612, 0xd5cf, 0xd56a, 0xd525, 0xd503, 0xd503, 0xd504, 0xd526, 0xd547, 0xccc4, 0xd505, 0xddce, 0xde77, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0x738e, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xdedb, 0xd6ba, 0xd677, 0xd58c, 0xd526, 0xd505, 0x93c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xccc6, 0xd5cd, 0xd677, 0xd699, 0xd6ba, 0xd6b9, 0xd699, 0xde77, 0xd611, 0xd58b, 0xdd47, 0xdd26, 0xdd26, 0xdd69, 0xde33, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xd69a, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xa514, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd698, 0xd5ad, 0xd526, 0xd505, 0xb48a, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc6, 0xd5f1, 0xd677, 0xd6ba, 0xdeba, 0xd6ba, 0xdeba, 0xdeba, 0xdeb9, 0xde98, 0xde55, 0xde76, 0xde97, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xd6ba, 0x8430, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0xad55, 0xe71c, 0xe71c, 0xe71c, 0xad75, 0x4228, 0x4a49, 0x7bcf, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd611, 0xd527, 0xd504, 0xc52b, 0x39a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc5, 0xd5f1, 0xd698, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x7bcf, 0xe71c, 0xe71c, 0xe71c, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x8c71, 0xbdf7, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde33, 0xd547, 0xd525, 0xcd28, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce7, 0xd5f1, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xc638, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xb5b6, 0x9cd3, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x52aa, 0xce59, 0xe71c, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0xa514, 0xce79, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x9cf3, 0x4a49, 0x4a49, 0x9cf3, 0xbdf7, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde34, 0xdd69, 0xdd25, 0xd569, 0x8389, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xd5f0, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xc638, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0xbdf7, 0xe73c, 0x8c71, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x7bef, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xce79, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xad55, 0x9cf3, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde55, 0xddad, 0xdd04, 0xdd26, 0xb4cb, 0x3185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcd09, 0xde11, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xbdd7, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x9cf3, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0xb5b6, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x4a69, 0x4a69, 0x632c, 0x4a49, 0x4a49, 0x528a, 0x4a49, 0x630c, 0x4228, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xddf0, 0xdd47, 0xdd04, 0xdd26, 0xd58b, 0xd5d0, 0xc56f, 0xbcee, 0xa46c, 0x940b, 0x838a, 0x6b09, 0x5247, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b03, 0xdd47, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xbdd7, 0xbdd7, 0xbdd7, 0x9cd3, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x8c71, 0x9cf3, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0xc638, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x4a69, 0x7bef, 0x4a69, 0x632c, 0x4a69, 0x630c, 0x4a49, 0x7bcf, 0x4a49, 0x8c71, 0x630c, 0x4228, 0xe71c, 0xd6ba, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeba, 0xde75, 0xddef, 0xdd69, 0xdd26, 0xdd26, 0xdd26, 0xdd05, 0xd505, 0xd525, 0xd526, 0xd526, 0xd548, 0xd549, 0xd56c, 0xc4e8, 0xb4a9, 0xa44a, 0x93eb, 0x7b6a, 0x62c8, 0x41e5, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0x8b86, 0xbc86, 0xd505, 0xdd26, 0xddce, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x9492, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0xbdd7, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0x9492, 0xb596, 0xc618, 0x7bef, 0x4a69, 0x7bef, 0x4a49, 0x8c71, 0x4a49, 0x4a49, 0xad75, 0x4a49, 0x7bcf, 0x9cf3, 0x4228, 0x8c51, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde76, 0xde54, 0xde33, 0xd611, 0xd5d0, 0xd5ae, 0xd58d, 0xd56b, 0xd549, 0xd527, 0xd525, 0xd504, 0xd4e3, 0xd4e3, 0xd504, 0xd504, 0xd506, 0xbc65, 0x4a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x9385, 0xbc65, 0xd527, 0xdd26, 0xdd46, 0xddad, 0xde55, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x630c, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0xad55, 0xef7d, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xd69a, 0xef5d, 0xef5d, 0xc618, 0xc618, 0x4a69, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xce79, 0x9cf3, 0x4228, 0x4228, 0x630c, 0x4228, 0x9cd3, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeba, 0xd6ba, 0xd6b9, 0xd699, 0xd698, 0xd678, 0xd677, 0xd656, 0xd5f2, 0xd548, 0xd504, 0xd4c2, 0x9bc4, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x93a6, 0xbca6, 0xd525, 0xd526, 0xdd47, 0xdd8c, 0xde11, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xd69a, 0xce59, 0xef5d, 0x9492, 0x8c71, 0x4a49, 0x4a49, 0xbdf7, 0xbdf7, 0x4228, 0x4228, 0x4228, 0x73ae, 0x4228, 0x4208, 0x73ae, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6ba, 0xd6ba, 0xd698, 0xd634, 0xd56a, 0xd505, 0xbc85, 0x6262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x5a65, 0x93a4, 0xc4a5, 0xd525, 0xd505, 0xd548, 0xd5ad, 0xd633, 0xde77, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x39e7, 0x2165, 0x2185, 0x2186, 0x21c6, 0x2a07, 0x3228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x94b2, 0x8410, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdd7, 0x52aa, 0x52aa, 0xa534, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xc618, 0x8c71, 0x7bcf, 0x4a49, 0x4228, 0x4228, 0x8c71, 0xe73c, 0x4228, 0x630c, 0x4208, 0x8c51, 0x8c51, 0xad55, 0xe71c, 0xc638, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xd6ba, 0xdeba, 0xd656, 0xd5ce, 0xd527, 0xd4e5, 0x9ba3, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6264, 0x9bc5, 0xc4a5, 0xd505, 0xd525, 0xd549, 0xd5ae, 0xd634, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x1904, 0x08e3, 0x0903, 0x0944, 0x0985, 0x09c6, 0x09e6, 0x09e6, 0x21e7, 0x3a08, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x8410, 0xef7d, 0xef7d, 0xd6ba, 0xad55, 0x8430, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0x5aeb, 0x630c, 0x5aeb, 0xbdf7, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0x5acb, 0x52aa, 0x52aa, 0x52aa, 0x528a, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x8c71, 0xbdf7, 0x8430, 0x7bcf, 0x8c71, 0x4228, 0x73ae, 0x4228, 0x630c, 0x4208, 0x9cd3, 0x4208, 0x4208, 0xce79, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd698, 0xd612, 0xd56b, 0xd504, 0xbc85, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6a83, 0x9bc4, 0xc4c6, 0xd505, 0xd526, 0xd569, 0xd5cf, 0xd655, 0xd698, 0xd6b9, 0xdeba, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x2986, 0x08c3, 0x08e3, 0x0903, 0x0924, 0x0965, 0x09c6, 0x09e7, 0x09e6, 0x09c6, 0x0985, 0x31c7, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4228, 0xad75, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdf7, 0x8c51, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x8c71, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xad75, 0x5acb, 0x5acb, 0x4228, 0x3186, 0x39c7, 0xb596, 0xdefb, 0xef5d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xbdd7, 0x9492, 0x4228, 0x4228, 0x4228, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xbdf7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xd5ad, 0xdd27, 0xd506, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x9bc5, 0xc4c5, 0xd4e3, 0xd4e3, 0xd505, 0xd58c, 0xd633, 0xd698, 0xd6b9, 0xd6ba, 0xd6ba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xb5b6, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x08e3, 0x08c3, 0x08c3, 0x0903, 0x0924, 0x0965, 0x09a6, 0x09e6, 0x09e7, 0x09c6, 0x0985, 0x0924, 0x4228, 0x4a69, 0x528a, 0x39e7, 0x08c2, 0x2165, 0x632c, 0x8c92, 0xb5b6, 0xd69a, 0xef7d, 0xf7be, 0xf7be, 0x9cf3, 0x630c, 0x630c, 0x630c, 0x632c, 0x632c, 0x632c, 0x632c, 0xdefb, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xdedb, 0x5aeb, 0x5acb, 0x52aa, 0x18e3, 0x0861, 0x0861, 0x4208, 0x73ae, 0x4208, 0x9cd3, 0x9492, 0xd69a, 0xdefb, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0x7bcf, 0x9cf3, 0x8c71, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde97, 0xde11, 0xdd47, 0xd526, 0xbc86, 0x6244, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3121, 0x6a82, 0x9b82, 0xbc63, 0xd505, 0xd58b, 0xd612, 0xd677, 0xd6b9, 0xd6ba, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x738e, 0x39e7, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0x9cf3, 0x4208, 0x4228, 0x4228, 0x1924, 0x08c3, 0x08e3, 0x0965, 0x0985, 0x09a6, 0x09e7, 0x0a28, 0x0a28, 0x09e7, 0x09a6, 0x0945, 0x31c6, 0x528a, 0x4a49, 0x0903, 0x08c2, 0x08c2, 0x08c2, 0x0903, 0x0965, 0x0965, 0x3a69, 0x73cf, 0x9d34, 0xce79, 0x9cf3, 0x632c, 0x632c, 0x6b4d, 0x6b4d, 0x6b4d, 0x6b4d, 0xb5b6, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xa514, 0x5aeb, 0x5aeb, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x0861, 0x0861, 0x632c, 0x4228, 0xce59, 0x7bcf, 0xa534, 0xdefb, 0xdedb, 0xe73c, 0xe73c, 0xce79, 0x4228, 0xe73c, 0xce59, 0xbdf7, 0x8c51, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeb8, 0xde54, 0xdd8c, 0xdd25, 0xd505, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0x7ae3, 0xa3e5, 0xc4a5, 0xd548, 0xd5cf, 0xde55, 0xde77, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xbdd7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0xce59, 0xe73c, 0xe71c, 0xe73c, 0xad75, 0x4208, 0x4208, 0x4208, 0x2985, 0x08e3, 0x0985, 0x09c6, 0x0a27, 0x0a28, 0x09e7, 0x0a07, 0x0a68, 0x0aa9, 0x0a69, 0x09c6, 0x2165, 0x4a69, 0x2185, 0x08e3, 0x08c2, 0x08c2, 0x08a2, 0x0903, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x2a28, 0x3a28, 0x52cb, 0x6b4d, 0x6b4d, 0x6b6d, 0x6b6d, 0xad55, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xe71c, 0x630c, 0x630c, 0x52aa, 0x2104, 0x3186, 0x0861, 0x0861, 0x31a6, 0x0861, 0x6b4d, 0x0861, 0x39c7, 0x4a49, 0x6b4d, 0xad55, 0x0861, 0x0861, 0x4a69, 0x0861, 0x8c51, 0x7bcf, 0xbdd7, 0xc618, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xbdf7, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd46, 0xdd26, 0xbc86, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0x5202, 0x8b43, 0xac25, 0xcd07, 0xdd8c, 0xddf0, 0xde54, 0xde98, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x31c7, 0x0944, 0x09a6, 0x09a5, 0x09e7, 0x0a27, 0x0a68, 0x0a28, 0x0a07, 0x0a28, 0x0a89, 0x0a89, 0x09c6, 0x31e7, 0x0903, 0x08e3, 0x08c2, 0x08e3, 0x08c2, 0x08c3, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x09a6, 0x0985, 0x0965, 0x3a28, 0x632c, 0x738e, 0x738e, 0x738e, 0xffff, 0xffff, 0xffff, 0xffff, 0x9492, 0x632c, 0x630c, 0x5acb, 0x39e7, 0x5acb, 0xc638, 0xc618, 0xbdd7, 0x39e7, 0x7bcf, 0x0861, 0x4208, 0x0861, 0x6b4d, 0x8c51, 0x0861, 0x2945, 0x2945, 0x8430, 0x10a2, 0x10a2, 0x10a2, 0x94b2, 0x738e, 0xdedb, 0xad75, 0xb5b6, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeb9, 0xde32, 0xdd8a, 0xdd47, 0xd506, 0x8b86, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6262, 0x9384, 0xb465, 0xd548, 0xddce, 0xde33, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4208, 0x31e7, 0x2186, 0x52ca, 0x634d, 0x1144, 0x09a6, 0x0a48, 0x0a89, 0x0a68, 0x0a48, 0x0a68, 0x0a48, 0x0965, 0x0924, 0x08e3, 0x0924, 0x0965, 0x0944, 0x0924, 0x0965, 0x09a6, 0x0985, 0x0965, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0965, 0x0965, 0x1985, 0x632c, 0x73ae, 0x738e, 0xdedb, 0xffff, 0xffff, 0xb596, 0x6b4d, 0x632c, 0x4208, 0x2124, 0x31a6, 0x7bef, 0xe73c, 0xf7be, 0xef5d, 0xc618, 0x528a, 0x4228, 0x73ae, 0x7bcf, 0x8c71, 0x10a2, 0x4a49, 0x94b2, 0x3186, 0x7bcf, 0x2945, 0x4a49, 0x0861, 0x2104, 0x2945, 0x8c51, 0x0861, 0x39c7, 0xdefb, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xdd8a, 0xdd46, 0xdd25, 0xd56b, 0xac8d, 0x6b09, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x72c3, 0x9bc4, 0xcce6, 0xddab, 0xde33, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x3186, 0x0903, 0x0924, 0x0903, 0x08e3, 0x0944, 0x0965, 0x0a68, 0x0aca, 0x0aca, 0x0aa9, 0x0a89, 0x09c6, 0x0924, 0x0903, 0x0985, 0x09c6, 0x09e7, 0x09e6, 0x09a6, 0x09c6, 0x0a27, 0x0a07, 0x09e7, 0x09e7, 0x09e6, 0x09a6, 0x0985, 0x0965, 0x0944, 0x2165, 0x6b6d, 0x7bcf, 0xffff, 0xffff, 0xffff, 0x6b6d, 0x6b4d, 0x5acb, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xf7be, 0xf7be, 0xf7be, 0x7bef, 0x528a, 0x528a, 0x8410, 0xef7d, 0xdedb, 0xe73c, 0xdedb, 0x7bcf, 0x738e, 0x39c7, 0x2104, 0x0861, 0x10a2, 0x528a, 0x2104, 0x0861, 0x94b2, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xddcd, 0xdd47, 0xdd25, 0xdd47, 0xddce, 0xc56f, 0x8c2d, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0xbc85, 0xdd68, 0xde11, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x39e7, 0x08e3, 0x08e3, 0x0944, 0x0903, 0x08e3, 0x0924, 0x0965, 0x0a48, 0x0aa9, 0x0aea, 0x0b0b, 0x0aca, 0x09c6, 0x0924, 0x0985, 0x0944, 0x0965, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x0a48, 0x0a89, 0x0aa9, 0x0a89, 0x0a28, 0x09c6, 0x0945, 0x0904, 0x5acb, 0x7bef, 0xc638, 0xe71c, 0xce79, 0x738e, 0x6b4d, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0xa514, 0xf7be, 0xf7be, 0xf7be, 0xbdd7, 0x528a, 0x528a, 0x528a, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xce59, 0x8c51, 0x94b2, 0xa534, 0xad75, 0x9cd3, 0x4a49, 0x39c7, 0xc638, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddef, 0xdd69, 0xdd46, 0xdd25, 0xdd47, 0xd5af, 0xacce, 0x6b2a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a1, 0xc4a6, 0xdd47, 0xde11, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x31a6, 0x08c2, 0x08c2, 0x0924, 0x0904, 0x08e3, 0x0904, 0x09e6, 0x0a48, 0x0a89, 0x0aaa, 0x0aca, 0x0a89, 0x0924, 0x0985, 0x09e7, 0x0985, 0x0944, 0x0944, 0x0985, 0x638d, 0x4aeb, 0x09c6, 0x09c6, 0x09e7, 0x0a48, 0x0aa9, 0x0aca, 0x0aaa, 0x0a89, 0x0a28, 0x0965, 0x3a08, 0x8410, 0x7bef, 0x7bcf, 0x7bcf, 0x738e, 0x4a49, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0xef5d, 0xffdf, 0xf7be, 0xf7be, 0xdefb, 0x52aa, 0x528a, 0x528a, 0xbdd7, 0xf79e, 0xef7d, 0xef7d, 0xd69a, 0xa514, 0x4208, 0x94b2, 0xd69a, 0xef5d, 0xef5d, 0xce79, 0xd69a, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde98, 0xde54, 0xddce, 0xdd48, 0xdd25, 0xdd48, 0xdd8c, 0xc570, 0x942d, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c2, 0xc4a5, 0xdd46, 0xddf0, 0xdeb7, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x39e7, 0x08c2, 0x08c2, 0x0944, 0x0924, 0x0924, 0x0944, 0x0985, 0x09e7, 0x0a28, 0x0a68, 0x0a69, 0x09a5, 0x0944, 0x0985, 0x0985, 0x0985, 0x0965, 0x0965, 0x73cf, 0xffdf, 0xffdf, 0xa534, 0x52cb, 0x3a69, 0x19e7, 0x0a27, 0x0a69, 0x0aa9, 0x0a89, 0x0a89, 0x0a68, 0x1985, 0x7bef, 0x8410, 0x7bef, 0x7bcf, 0x632c, 0x1082, 0x0861, 0x0861, 0x0861, 0x0861, 0xc618, 0xffdf, 0xdedb, 0x9492, 0xb5b6, 0xd6ba, 0x94b2, 0x528a, 0x528a, 0x8410, 0xf79e, 0xc638, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x5aeb, 0x8c71, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddf0, 0xdd6a, 0xdd26, 0xdd26, 0xdd47, 0xd58d, 0xaccd, 0x732a, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xc4c5, 0xdd46, 0xddef, 0xde98, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0x8c51, 0x4208, 0x4208, 0x4208, 0x31a6, 0x31c7, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x10e3, 0x0924, 0x0965, 0x0944, 0x0944, 0x0944, 0x0924, 0x0944, 0x0985, 0x09a6, 0x0944, 0x08e3, 0x09c6, 0x09a6, 0x0965, 0x0965, 0x0965, 0x21e7, 0xb5b6, 0xa514, 0x632c, 0x632c, 0x6b4d, 0x6b6d, 0x6b6d, 0x428a, 0x0a48, 0x0a89, 0x0a89, 0x0a68, 0x0a27, 0x09c6, 0x73ae, 0x8430, 0x7bef, 0x7bcf, 0x3186, 0x0861, 0x0861, 0x0861, 0x0861, 0x3186, 0xc618, 0xffff, 0xef7d, 0x2124, 0x0861, 0x0861, 0x4228, 0x4a69, 0x528a, 0x528a, 0x8410, 0x4a69, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x4228, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde34, 0xddcf, 0xdd47, 0xdd04, 0xd525, 0xd569, 0xc54e, 0x940b, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5203, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xbdf7, 0x9cf3, 0x6b4d, 0x08e3, 0x08e3, 0x2165, 0x31c7, 0x39e7, 0x3a07, 0x7bef, 0x4249, 0x0985, 0x09c6, 0x09a6, 0x0965, 0x0985, 0x1185, 0x1965, 0x0903, 0x08e3, 0x08a2, 0x0924, 0x09c6, 0x09a6, 0x0985, 0x0985, 0x09a6, 0x3a49, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x738e, 0x3208, 0x09e7, 0x0a89, 0x0a89, 0x0a48, 0x09c6, 0x0944, 0xad96, 0x9cd3, 0x8410, 0x52aa, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x5aeb, 0x630c, 0xffff, 0xffff, 0x9cd3, 0x0861, 0x0861, 0x0861, 0x39c7, 0x528a, 0x528a, 0x4a69, 0x4a69, 0x4a49, 0x39c7, 0x39e7, 0x4228, 0x4a49, 0x4228, 0x7bcf, 0xad55, 0xd69a, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde98, 0xde11, 0xdd6a, 0xd504, 0xd504, 0xd505, 0xd549, 0xb445, 0x7305, 0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xdd69, 0xde10, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x634d, 0x08c2, 0x08e3, 0x0903, 0x0924, 0x0944, 0x0944, 0x0924, 0x08e3, 0x0944, 0x09a6, 0x09a6, 0x0985, 0x0965, 0x31c7, 0x29a6, 0x08e3, 0x08e3, 0x08c2, 0x0944, 0x0985, 0x0985, 0x0965, 0x0944, 0x21c6, 0x5acb, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x4aaa, 0x0944, 0x0985, 0x0a69, 0x0a68, 0x0a28, 0x09a6, 0x0965, 0x3a69, 0x4228, 0x528a, 0x10a2, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x632c, 0x630c, 0xffff, 0xffff, 0xc638, 0x31a6, 0x0861, 0x0861, 0x10a2, 0x4a69, 0x4a69, 0x4208, 0x2965, 0x10a2, 0x0861, 0x0861, 0x1082, 0x39e7, 0x7bcf, 0xdefb, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xdeda, 0xdeb9, 0xde97, 0xde54, 0xde12, 0xddcf, 0xdd6a, 0xdd25, 0xd504, 0xc4a4, 0xac04, 0x8b64, 0x6aa4, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a42, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xe71c, 0x3a28, 0x08a2, 0x08e3, 0x08e3, 0x0924, 0x0944, 0x0965, 0x0944, 0x08e3, 0x08e3, 0x0965, 0x09a6, 0x09a6, 0x0985, 0x1185, 0x0924, 0x08e3, 0x08e3, 0x0924, 0x0924, 0x0944, 0x0965, 0x09a6, 0x11a6, 0x4a8a, 0x5aeb, 0x5aeb, 0x630c, 0x632c, 0x632c, 0x634d, 0x4289, 0x09a6, 0x0965, 0x0985, 0x0a89, 0x0a89, 0x0a27, 0x09c6, 0x0944, 0x0903, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x31a6, 0x9cf3, 0x630c, 0xa534, 0xb5b6, 0x5aeb, 0x5acb, 0x4228, 0x0861, 0x0861, 0x0861, 0x2945, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdeb8, 0xde54, 0xddee, 0xdd69, 0xdd46, 0xdd26, 0xcce6, 0xb444, 0x9b83, 0x72c2, 0x49c2, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6242, 0xcce5, 0xdd68, 0xde32, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x08a2, 0x0924, 0x0903, 0x0924, 0x0944, 0x0944, 0x0944, 0x0903, 0x08e3, 0x0985, 0x09c6, 0x0985, 0x0965, 0x0965, 0x0924, 0x0903, 0x0924, 0x09a6, 0x09a6, 0x0965, 0x0944, 0x0965, 0x3a28, 0x5acb, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x52aa, 0x2a28, 0x09a6, 0x09a6, 0x0985, 0x09c6, 0x0aa9, 0x0aa9, 0x0a68, 0x09e7, 0x0965, 0x08c3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x39c7, 0x630c, 0x5aeb, 0x5aeb, 0x5acb, 0x528a, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0x9492, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe6fb, 0xded9, 0xde96, 0xde53, 0xde10, 0xddac, 0xdd68, 0xdd45, 0xd505, 0xbc64, 0xa3c4, 0x8303, 0x5a22, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd4e6, 0xdd68, 0xde32, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xa555, 0x08a2, 0x0944, 0x0944, 0x0965, 0x0944, 0x0965, 0x0965, 0x0924, 0x0924, 0x0985, 0x0965, 0x0924, 0x0944, 0x0965, 0x0944, 0x0924, 0x0985, 0x09c6, 0x09c6, 0x09e7, 0x09a6, 0x0965, 0x21a6, 0x31e7, 0x3a28, 0x3269, 0x3248, 0x11a6, 0x0985, 0x09e6, 0x09a6, 0x0985, 0x09a6, 0x09e6, 0x0a48, 0x0a89, 0x0a68, 0x0a07, 0x3269, 0x7c10, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5acb, 0x52aa, 0x4208, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x94b2, 0xce59, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6fb, 0xe6d9, 0xe674, 0xe630, 0xe5aa, 0xdd68, 0xdd47, 0xdd47, 0xccc6, 0xac25, 0x8b64, 0x6284, 0x3142, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xd505, 0xdd48, 0xde54, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xce79, 0x0944, 0x0965, 0x0985, 0x0985, 0x0985, 0x0985, 0x09a6, 0x09a6, 0x0985, 0x0985, 0x0965, 0x0945, 0x0985, 0x0985, 0x0965, 0x09a6, 0x0a07, 0x0a07, 0x09e7, 0x09e7, 0x09e7, 0x0985, 0x0924, 0x0944, 0x0985, 0x0a07, 0x09e7, 0x0985, 0x0965, 0x09c6, 0x09c6, 0x0985, 0x0a27, 0x0a48, 0x0a28, 0x0a48, 0x0a48, 0x0a28, 0xa555, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x0861, 0x2104, 0x2124, 0x0861, 0x0861, 0x2945, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x3186, 0xb5b6, 0xf79e, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6f9, 0xe631, 0xe5cc, 0xe568, 0xe568, 0xd507, 0xb466, 0x93a5, 0x72a3, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd505, 0xdd69, 0xde33, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xb5b6, 0x52eb, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0944, 0x0985, 0x0965, 0x0965, 0x0944, 0x636d, 0x532c, 0x0985, 0x09c6, 0x0a28, 0x0a27, 0x0a28, 0x0a07, 0x0a07, 0x09c6, 0x0965, 0x0944, 0x0944, 0x0965, 0x09e6, 0x0a07, 0x09a6, 0x0965, 0x09c6, 0x09e7, 0x09c6, 0x0a48, 0x0a89, 0x0aca, 0x0aa9, 0x0a69, 0x6c0f, 0xf7be, 0xc618, 0x0861, 0x0861, 0x0861, 0x1082, 0x5acb, 0x6b4d, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x0861, 0x0861, 0x2104, 0x4a49, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe5ec, 0xe589, 0xe566, 0x9be6, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd4e4, 0xdd6a, 0xde32, 0xdeb9, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xe73c, 0xc659, 0x9d13, 0x73ef, 0x4aca, 0x4289, 0x428a, 0x5b4d, 0x8c92, 0xc638, 0xf79e, 0x9d14, 0x0985, 0x0a69, 0x0a89, 0x0a28, 0x0a07, 0x0a07, 0x0a28, 0x09e7, 0x0985, 0x0944, 0x0924, 0x0944, 0x09c6, 0x0a07, 0x09c6, 0x0965, 0x09a6, 0x0a27, 0x0a28, 0x0a48, 0x0a69, 0x0aca, 0x0aea, 0x53ef, 0xef7d, 0xffff, 0xe73c, 0x18c3, 0x0861, 0x0861, 0x0861, 0x18c3, 0x2965, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x2124, 0x7bef, 0xc638, 0xc618, 0x0861, 0x0861, 0x0861, 0x39c7, 0x8410, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe6f9, 0xe5ee, 0xe567, 0xdd68, 0x8326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd505, 0xdd04, 0xdd26, 0xdd48, 0xdd69, 0xdd6a, 0xdd8b, 0xdd8b, 0xddab, 0xddab, 0xddcc, 0xddee, 0xddee, 0xde0f, 0xe60f, 0xe630, 0xe674, 0xe6b7, 0xe6d7, 0xe6d8, 0xe6d7, 0xe6f9, 0xe71b, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xc659, 0x0a07, 0x0a89, 0x0a89, 0x0a28, 0x09c6, 0x09c6, 0x0a07, 0x0a48, 0x0a27, 0x09c6, 0x0985, 0x0985, 0x09c6, 0x0a27, 0x09e6, 0x09a5, 0x09a6, 0x09c6, 0x0a07, 0x0a48, 0x0a68, 0x0a89, 0x7491, 0xef7d, 0xffff, 0xffff, 0xffff, 0x9492, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5aeb, 0xad55, 0xb5b6, 0x9492, 0x630c, 0x52aa, 0xad55, 0xe73c, 0xffff, 0xffff, 0xffdf, 0x5acb, 0x0861, 0x0861, 0x10a2, 0x4228, 0xce59, 0x9cf3, 0x632c, 0x9492, 0xd6ba, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe60f, 0xe588, 0xdd69, 0x7b06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x49c2, 0x5202, 0x5a22, 0x6a62, 0x6aa3, 0x7ae3, 0x8303, 0x8b44, 0x8b64, 0x93a4, 0x9bc5, 0xa3e5, 0xac25, 0xb446, 0xb466, 0xbca6, 0xc4c7, 0xcce7, 0xcd08, 0xd528, 0xdd68, 0xe5cc, 0xe693, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xef7d, 0xadd7, 0x84d2, 0x536d, 0x1a68, 0x0a07, 0x09c6, 0x09e6, 0x0a28, 0x0a48, 0x0a48, 0x09e7, 0x0985, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0965, 0x09a6, 0x3aeb, 0xb5d7, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xf7be, 0xad55, 0x39e7, 0x0861, 0x0861, 0x0861, 0x52aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x630c, 0x9cd3, 0x3186, 0x2124, 0x31a6, 0xa534, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe60f, 0xe567, 0xdd6a, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe60f, 0xe6b6, 0xe73b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xe75d, 0xce79, 0xa575, 0x7c71, 0x434c, 0x0a89, 0x0a68, 0x0a28, 0x09c6, 0x0944, 0x0924, 0x0965, 0x0965, 0x0944, 0x21c6, 0x634c, 0xb5b6, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xce79, 0x9cf3, 0x7bcf, 0x5acb, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xef7d, 0x9cf3, 0x73ae, 0x39e7, 0x630c, 0xb596, 0x0861, 0x0861, 0x39e7, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe696, 0xe5ec, 0xe568, 0xdd48, 0x6ae6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xb446, 0xe5aa, 0xe651, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xe73c, 0xce9a, 0xb5f7, 0x9d34, 0x94b2, 0x94b2, 0x9d34, 0xad75, 0xc659, 0xef5d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xdefb, 0xe71c, 0x94b2, 0x9cf3, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf77c, 0xf739, 0xf6f6, 0xef39, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe5cc, 0xe568, 0xd548, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e5, 0xe5a9, 0xe630, 0xe6f9, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf738, 0xf671, 0xf62e, 0xf64f, 0xf64f, 0xee91, 0xeed6, 0xef3a, 0xef5c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6b7, 0xe5ab, 0xe567, 0xd549, 0x6285, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b65, 0xe588, 0xe631, 0xe6f8, 0xef3c, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf79d, 0xf738, 0xf670, 0xf5ea, 0xf5eb, 0xf62c, 0xee0b, 0xedeb, 0xee0c, 0xee71, 0xeeb5, 0xeef8, 0xef19, 0xef3b, 0xef3c, 0xef3c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe695, 0xe5cc, 0xe568, 0xd549, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xe568, 0xe60f, 0xe6d7, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf738, 0xf670, 0xf5eb, 0xd54b, 0x8bca, 0xb4ce, 0xcd6e, 0xe60d, 0xedeb, 0xedca, 0xedeb, 0xedec, 0xee2e, 0xee73, 0xeed7, 0xef1a, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe695, 0xe5cd, 0xe546, 0xd54b, 0x5a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xdd48, 0xe5ed, 0xe6d7, 0xe73b, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef3b, 0xef19, 0xeef8, 0xeeb4, 0xee71, 0xee70, 0xeed5, 0xf75a, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff12, 0xfed0, 0xff34, 0xffbb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf759, 0xf691, 0xf5eb, 0xcd2c, 0x0000, 0x0000, 0x0000, 0x2924, 0x62e9, 0x93ea, 0xb48a, 0xcd2b, 0xe5cc, 0xedca, 0xeda9, 0xedca, 0xe60e, 0xe674, 0xe6b6, 0xe6d8, 0xe6f9, 0xe6fa, 0xe71b, 0xe71c, 0xe71b, 0xe674, 0xe5ab, 0xe567, 0xcd29, 0x5224, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a23, 0xdd48, 0xe5cb, 0xe6b7, 0xe73b, 0xef3c, 0xef3c, 0xef3b, 0xef19, 0xeeb4, 0xee50, 0xedec, 0xedca, 0xdd69, 0xcd29, 0xedea, 0xee2d, 0xf718, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff76, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffba, 0xfed0, 0xfeae, 0xfe8e, 0xfed1, 0xff57, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffde, 0xf7be, 0xf79c, 0xf6b3, 0xf60b, 0xdd8c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0x6ac7, 0x93c9, 0xb48a, 0xcd2a, 0xe58a, 0xe5aa, 0xe5cb, 0xe5cc, 0xe5cd, 0xe60f, 0xe673, 0xe6b7, 0xe6d8, 0xe653, 0xe5aa, 0xe567, 0xcd08, 0x5205, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xcd08, 0xe5cc, 0xe6b5, 0xe71a, 0xe71b, 0xe6f9, 0xeeb5, 0xee30, 0xedcb, 0xedca, 0xd54a, 0xac27, 0x72c5, 0x20c1, 0xa407, 0xedeb, 0xf670, 0xf719, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff77, 0xfecf, 0xfecf, 0xff33, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff76, 0xfed0, 0xbceb, 0xc50b, 0xfe8f, 0xfeaf, 0xff13, 0xffbc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf6d5, 0xf60b, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3984, 0x6ac6, 0x93a7, 0xac47, 0xcce8, 0xe589, 0xe588, 0xe588, 0xe5aa, 0xe5ed, 0xe5cd, 0xe567, 0xe547, 0xcd09, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3962, 0xc4a6, 0xe5cb, 0xe672, 0xe6f9, 0xe673, 0xe60f, 0xe5cb, 0xeda9, 0xcd08, 0x9be6, 0x6284, 0x1081, 0x0000, 0x0000, 0x0000, 0xbcc9, 0xedeb, 0xf6b3, 0xf75a, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffde, 0xffde, 0xffde, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff77, 0xfef1, 0xfed0, 0xfecf, 0xfecf, 0xff54, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfed0, 0x7b69, 0x0000, 0x8389, 0xee2e, 0xfeaf, 0xfed1, 0xff78, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xee2e, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x6aa5, 0x93a6, 0xac46, 0xccc6, 0xdd47, 0xe567, 0xdd46, 0xe546, 0xcd09, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe587, 0xe5aa, 0xe5ec, 0xe5a9, 0xe568, 0xc4c7, 0x93a6, 0x5a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd6a, 0xf60c, 0xf6f7, 0xf77c, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffde, 0xffde, 0xffbd, 0xff16, 0xfed2, 0xfef3, 0xff79, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xff32, 0xff12, 0xaced, 0xacec, 0xff11, 0xfed0, 0xff75, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xfeb0, 0x41e5, 0x0000, 0x0000, 0x39a4, 0xbccb, 0xfe8f, 0xfe8f, 0xff14, 0xffbb, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xf64d, 0x4a05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x6ac4, 0x9385, 0xac25, 0xccc6, 0xc4ea, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xac26, 0xe567, 0xe567, 0xdd47, 0xbc87, 0x8b86, 0x49c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c3, 0xedeb, 0xf64e, 0xf718, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbe, 0xffbd, 0xff59, 0xfeb1, 0xfe6e, 0xfe6d, 0xfe8e, 0xff14, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfef0, 0xde53, 0x2103, 0x0000, 0xacee, 0xff11, 0xff11, 0xff75, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff11, 0xe60e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7327, 0xe5ee, 0xfe8f, 0xfed1, 0xff57, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f6, 0xf64d, 0xf64d, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be6, 0xdd27, 0xb446, 0x8324, 0x41a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xf5eb, 0xf690, 0xf739, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbd, 0xff7a, 0xfef4, 0xfe6e, 0xfe4d, 0xf66f, 0xee0d, 0xfe6e, 0xfed1, 0xff78, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff97, 0xff12, 0xf713, 0x62e8, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff11, 0xff75, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xc54d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0xb4ab, 0xfe6e, 0xfeaf, 0xfef3, 0xffbb, 0xffde, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffde, 0xff37, 0xf66e, 0xf64d, 0x7b26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x72e5, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be7, 0xf60c, 0xf6b3, 0xf75b, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xff7b, 0xfef4, 0xfe6f, 0xfe4d, 0xfe90, 0xd5af, 0x6ae8, 0x7b48, 0xfeb0, 0xfe8e, 0xff14, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff33, 0xa4ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff12, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ac6, 0xddcd, 0xfe8e, 0xfeb0, 0xff58, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffde, 0xff37, 0xf66f, 0xf64d, 0x8b88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbca8, 0xf60c, 0xf6f6, 0xf77c, 0xf7be, 0xf7be, 0xf77c, 0xf716, 0xf66f, 0xfe4d, 0xfe4d, 0xe610, 0x83aa, 0x18a2, 0x0000, 0x0000, 0xcd8f, 0xfe6e, 0xfed1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xff11, 0xd674, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff11, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xfef1, 0x7b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2943, 0xa449, 0xf64e, 0xfe8f, 0xff14, 0xff9b, 0xfffe, 0xffff, 0xffdf, 0xffdf, 0xff37, 0xfe8f, 0xf64d, 0x9be8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54a, 0xf62d, 0xf75a, 0xf79d, 0xf77c, 0xf738, 0xf691, 0xfe4d, 0xfe4d, 0xee50, 0xa46c, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfe8f, 0xfeaf, 0xfef2, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffb8, 0xfef1, 0xf6f3, 0x62e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff11, 0xff11, 0xff97, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff97, 0xfef2, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6286, 0xd58d, 0xfe6e, 0xfed1, 0xff37, 0xffbd, 0xffde, 0xffdf, 0xff79, 0xfeb1, 0xfe4d, 0xac49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0xedeb, 0xf64e, 0xf75a, 0xf75a, 0xf6d4, 0xf62d, 0xf62d, 0xf64f, 0xb4ed, 0x4a06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd2e, 0xfeaf, 0xfeb0, 0xff77, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff32, 0xa4cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff12, 0xffb8, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff96, 0xe650, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e2, 0x9c09, 0xf62e, 0xfe8e, 0xfed1, 0xff9c, 0xffde, 0xff79, 0xfed2, 0xfe4d, 0xb48a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xf60c, 0xf66f, 0xf6b2, 0xf66f, 0xf62c, 0xf66e, 0xcd8e, 0x6ae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a06, 0xf690, 0xfeaf, 0xff12, 0xffdc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff32, 0xd652, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff75, 0xc56e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5205, 0xcd2b, 0xfe6e, 0xfeb0, 0xff36, 0xff36, 0xfed2, 0xfe4d, 0xc4ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bc7, 0xf60b, 0xf60b, 0xf60b, 0xf62c, 0xddce, 0x838a, 0x18a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xacad, 0xfeb0, 0xfed0, 0xffb9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff98, 0xff11, 0xf714, 0x5ac8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff31, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff53, 0xa4ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ba8, 0xeded, 0xfe6d, 0xfe8f, 0xfe8f, 0xfe4d, 0xcd2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb489, 0xf60b, 0xf60c, 0xe60e, 0x9c2a, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3184, 0xee2f, 0xfed0, 0xff33, 0xffdb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffda, 0xff55, 0xff75, 0x9ccf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffda, 0xff33, 0x7b89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e4, 0xc4eb, 0xfe4d, 0xfe4d, 0xfe4d, 0xdd6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54b, 0xee0e, 0xb4ab, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940b, 0xfef1, 0xfef1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xfffe, 0xff76, 0xff53, 0xd654, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff33, 0xffd8, 0xffff, 0xfffd, 0xffb8, 0xff13, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b27, 0xe5cc, 0xfe4d, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39c7, 0xc5b4, 0x6ae7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0xde0f, 0xfef1, 0xff34, 0xffdb, 0xffff, 0xffff, 0xff97, 0xff32, 0xf736, 0x52a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff32, 0xffb7, 0xff96, 0xff32, 0xe691, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0xb48a, 0xee2f, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c3, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7348, 0xff12, 0xfef0, 0xff77, 0xfffe, 0xfffc, 0xff33, 0xff74, 0x9c8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff33, 0xff32, 0xff32, 0xff11, 0xc58e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7329, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdb0, 0xfed0, 0xff11, 0xff33, 0xff32, 0xff33, 0xd655, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xff11, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfed1, 0xfef1, 0xfef1, 0xff12, 0xf734, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff53, 0xff32, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb52e, 0xff11, 0xff11, 0xff75, 0x948e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xfef1, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a05, 0xf6b0, 0xff33, 0xce12, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa48c, 0xef15, 0x4a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2964, 0x73ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; -#define banner_pixel 16200 -#define MAXR 31 -#define MINR 0 -#define MAXG 63 -#define MING 0 -#define MAXB 31 -#define MINB 0 diff --git a/glide2x/cvg/glide/src/cpudetect.c b/glide2x/cvg/glide/src/cpudetect.c deleted file mode 100644 index e1db725..0000000 --- a/glide2x/cvg/glide/src/cpudetect.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#include -#include - -int _cpu_detect_asm() { - struct utsname name; - - uname(&name); - if (!strcmp(name.machine, "i386")) return 3; - if (!strcmp(name.machine, "i486")) return 4; - if (!strcmp(name.machine, "i586")) return 5; - if (!strcmp(name.machine, "i686")) return 6; - fprintf(stderr, "Couldn't determine cpu type. Using i586\n"); - return 5; -} - -void single_precision_asm() { - asm("push %eax \n fnclex \n fstcw (%esp) \n movl (%esp), %eax \n " - "and $0x0000fcff, %eax \n movl %eax, (%esp) \n fldcw (%esp) \n pop %eax"); -} - - -void double_precision_asm() { - asm("push %eax \n fnclex \n fstcw (%esp) \n movw (%esp), %eax \n " - "and $0x0000fcff, %eax \n or $0x000002ff, %eax \n mov %eax, (%esp) \n " - "fldcw (%esp) \n pop %eax"); -} - diff --git a/glide2x/cvg/glide/src/cpudtect.S b/glide2x/cvg/glide/src/cpudtect.S deleted file mode 100644 index 7a1febd..0000000 --- a/glide2x/cvg/glide/src/cpudtect.S +++ /dev/null @@ -1,127 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Header$ -# $Log$ -# Revision 1.1.1.1 1999/12/07 21:49:08 joseph -# Initial checkin into SourceForge. -# -# -# 2 3/04/97 9:10p Dow -# Neutered mutiplatform multiheaded monster. -# -# - -.file "cpudtect.s" - -# 586P -# model FLAT,C - -# Data for data segment goes here -# DATA SEGMENT DWORD USE32 PUBLIC DATA; -# DATA ENDS - -# Some useful constants -# CPU Type -CPUTypeUnknown .ASSIGNA 0xffffffff -CPUTypePrePent .ASSIGNA 4 -CPUTypeP5 .ASSIGNA 5 -CPUTypeP6 .ASSIGNA 6 - -# References to external data: - -#_TEXT SEGMENT -# -# _cpu_detect_asm - detect the type of CPU -# -# USAGE: -# -# int __cdecl _cpu_detect_asm(void); -# -# returns 4 for non-pen - -.text -.align 4 -.globl _cpu_detect_asm -_cpu_detect_asm: -P6Stuff: - pusha # save all regs. - - # First, determine whether CPUID instruction is available. - # If it's not, then it's a 386 or 486. - pushf # push original EFLAGS. - pop %eax # pop into eax - mov %eax, %ecx # save original EFLAGS in ecx - xor $0x200000, %eax # flip ID bit in EFLAGS - push %eax # put it back on stack - popf # pop into EFLAGS - pushf # get EFLAGS back - pop %eax # into eax - xor %ecx, %eax # check to see if we could toggle ID - jz NotPentium # Sorry, not P5 or P6. - - # - # Now determine whether it's an intel P6 CPU. - # - ## Is it an Intel CPU? - xor %eax, %eax # eax = 0. - cpuid # get cpuid - xor $0x756e6547, %ebx # "Genu" - jnz NotIntel - xor $0x49656e69, %edx # "ineI" - jnz NotIntel - xor $0x6c65746e, %ecx # "ntel" - jnz NotIntel # - ## Verifying architecture family - mov $1, %eax - cpuid # get family/model/stepping - shr $8, %eax # rid of model & stepping number - and $0xf, %eax # use only family - cmp $6, %eax - jl IsP5 # It's a P5 - ## Else it's a P6 - # - # Intel P6 processor. - # Make sure it supports Memory Type Range Request registers - # -IsP6: - popa - mov $6, %eax # - ret # return - -IsP5: - popa - mov $5, %eax # - ret - -NotPentium: - popa - mov $4, %eax - ret - -NotIntel: - popa - mov $0xffffffff, %eax - ret - -.L_end__cpu_detect_asm: -.size _cpu_detect_asm,.L_end__cpu_detect_asm-_cpu_detect_asm -.END - - diff --git a/glide2x/cvg/glide/src/cpudtect.asm b/glide2x/cvg/glide/src/cpudtect.asm deleted file mode 100644 index ca5ee68..0000000 --- a/glide2x/cvg/glide/src/cpudtect.asm +++ /dev/null @@ -1,163 +0,0 @@ -;; -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Log$ -; -; 4 5/28/97 8:23a Peter -; Merge w/ original glide source -; -; 2 3/04/97 9:10p Dow -; Neutered mutiplatform multiheaded monster. -;; -;; - -TITLE cpudtect.asm - -.586P -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -;; Data for data segment goes here -;_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'; -;_DATA ENDS - -;;; Some useful constants -; CPU Type -CPUTypeUnknown = 0ffffffffh -CPUTypePrePent = 4h -CPUTypeP5 = 5h -CPUTypeP6 = 6h - -;;; References to external data: - -_TEXT SEGMENT -;; -;; _cpu_detect_asm - detect the type of CPU -;; -;; USAGE: -;; -;; int __cdecl _cpu_detect_asm(void); -;; -;; returns 4 for non-pen - -PUBLIC _cpu_detect_asm -_cpu_detect_asm PROC NEAR -P6Stuff: - .586 - pushad ; save all regs. - - ; First, determine whether CPUID instruction is available. - ; If it's not, then it's a 386 or 486. - pushfd ; push original EFLAGS. - pop eax ; pop into eax - mov ecx, eax ; save original EFLAGS in ecx - xor eax, 0200000h ; flip ID bit in EFLAGS - push eax ; put it back on stack - popfd ; pop into EFLAGS - pushfd ; get EFLAGS back - pop eax ; into eax - xor eax, ecx ; check to see if we could toggle ID - jz NotPentium ; Sorry, not P5 or P6. - - ; - ; Now determine whether it's an intel P6 CPU. - ; - ;; Is it an Intel CPU? - xor eax, eax ; eax = 0. - cpuid ; get cpuid - xor ebx, 0756e6547h ; "Genu" - jnz NotIntel - xor edx, 049656e69h ; "ineI" - jnz NotIntel - xor ecx, 06c65746eh ; "ntel" - jnz NotIntel ; - ;; Verifying architecture family - mov eax, 1 - cpuid ; get family/model/stepping - shr eax, 8 ; rid of model & stepping number - and eax, 0fh ; use only family - cmp eax, 6 - jl IsP5 ; It's a P5 - ;; Else it's a P6 - ; - ; Intel P6 processor. - ; Make sure it supports Memory Type Range Request registers - ; -IsP6: - popad - mov eax, 6 ; - ret ; return - -IsP5: - popad - mov eax, 5 ; - ret - -NotPentium: - popad - mov eax, 4 - ret - -NotIntel: - popad - mov eax, 0ffffffffh - ret - -_cpu_detect_asm ENDP - - -;------------------------------------------------------------------------------ -; this routine sets the precision to single -; which effects all adds, mults, and divs - align 4 ; - PUBLIC single_precision_asm -single_precision_asm PROC NEAR -.586 - push eax ; make room - fnclex ; clear pending exceptions - fstcw WORD PTR [esp] - mov eax, DWORD PTR [esp] - and eax, 0000fcffh ; clear bits 9:8 - mov DWORD PTR [esp], eax - fldcw WORD PTR [esp] - pop eax - ret 0 -single_precision_asm ENDP - -;------------------------------------------------------------------------------ -; this routine sets the precision to double -; which effects all adds, mults, and divs - align 4 ; - PUBLIC double_precision_asm -double_precision_asm PROC NEAR -.586 - push eax ; make room - fnclex ; clear pending exceptions - fstcw WORD PTR [esp] - mov eax, DWORD PTR [esp] - and eax, 0000fcffh ; clear bits 9:8 - or eax, 000002ffh ; set 9:8 to 10 - mov DWORD PTR [esp], eax - fldcw WORD PTR [esp] - pop eax - ret 0 -double_precision_asm ENDP - -_TEXT ENDS -END diff --git a/glide2x/cvg/glide/src/ddgump.c b/glide2x/cvg/glide/src/ddgump.c deleted file mode 100644 index f52e8b4..0000000 --- a/glide2x/cvg/glide/src/ddgump.c +++ /dev/null @@ -1,575 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:08 joseph -** Initial checkin into SourceForge. -** -** -** 16 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 15 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 14 12/15/97 5:51p Atai - * disable obsolete glide2 api for glide3 - * - * 13 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 12 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 11 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 10 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 9 10/27/97 1:16p Peter - * fixed silliness - * - * 8 10/27/97 11:10a Peter - * starting cleanup - * - * 7 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 6 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 5 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 4 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 3 5/21/97 6:04a Peter - * - * 2 3/04/97 9:08p Dow - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -/* gump.c */ -extern GrMPState _gumpState; - -/* -** _gumpTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DDFUNC(_gumpTexCombineFunction, void, (int virtual_tmu)) -{ -#define FN_NAME "_gumpTexCombineFunction" - FxU32 texmode; - GrMPTextureCombineFnc_t tc; - - GR_BEGIN_NOFIFOCHECK("_gumpTexCombineFunction",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",virtual_tmu); - - texmode = gc->state.tmu_config[0].textureMode; - texmode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tc = _gumpState.tc_fnc; - - switch (tc) { - case GR_MPTEXTURECOMBINE_ADD: - /* tmu0: other + local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } else { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } - break; - - case GR_MPTEXTURECOMBINE_MULTIPLY: - /* tmu0: other * local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } else { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } - break; - - case GR_MPTEXTURECOMBINE_DETAIL0: - /* tmu0: (other - local) * lod + local */ - /* = lod * other + (1 - lod) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lod + local */ - /* = (1 - lod) * local */ - /* pass1(tm1): (-local) * (1 - lod) + local */ - /* = lod * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_DETAIL1: - /* tmu0: (other - local) * (1 - lod) + local */ - /* = (1 - lod) * other + lod * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * (1 - lod) + local */ - /* = lod * local */ - /* pass1(tm1): (-local) * lod + local */ - /* = (1 - lod) * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_TRILINEAR0: - /* tmu0: (other - local) * lodbfrac + local */ - /* = lodbfrac * other + (1 - lodbfrac) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lodbfrac + local */ - /* = (1 - lodbfrac) * local */ - /* pass1(tm1): (-local) * (1 - lodbfrac) + local */ - /* = lodbfrac * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_TRILINEAR1: - /* tmu0: (other - local) * (1 - lodbfrac) + local - = (1 - lodbfrac) * other + lodbfrac * local - tmu1: local - pass0(tm0): (-local) * (1 - lodbfrac) + local - = lodbfrac * local - pass1(tm1): (-local) * lodbfrac + local - = (1 - lodbfrac) * local - */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_SUBTRACT: - /* - tmu0: other - local - tmu1: local - doesn't work, alpha blender can't subtract - */ - GrErrorCallback("_gumpTexCombineFunction: TEXTURE_SUBTRACT not supported", FXFALSE); - return; - break; - - default: - GrErrorCallback("_gumpTexCombineFunction: Unsupported function", FXFALSE); - return; - break; - } - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - { - SstRegs* tmuRegs = SST_TMU(hw, 0); - - GR_SET(eChipTMU0, tmuRegs, textureMode, texmode); - } - GR_CHECK_SIZE(); - - GR_END(); -#undef _gumpTexCombineFunction -} /* _gumpTexCombineFunction */ - -GR_ENTRY(guMPDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -{ - GR_BEGIN_NOFIFOCHECK("guMPDrawTriangle",98); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - /* check for multipass texture modes */ - /* xxx complex multipass mode checks should be moved into gtex/gglide */ - /* specific color combine modes use texture */ - /* this is equivalent to - fbzColorPath & SST_ENTEXTREMAP - cc_state & STATE_CC_REQUIRES_DECAL_STW */ - /* specific texture combine modes */ - /* xxx don't even check anymore, because you can't */ - - { - /* check for not possible on one tmu modes */ - /* alpha blend enabled (grAlphaBlendMode) - xxx some can work, with some cheats, even more - low bit alpha switches between iterated and constant rgb - (grAlphaControlsITRGBLighting) - alpha test (grAlphaTestFunction) - xxx actually, NEVER is ok too - chromakey - */ - - if ((gc->state.fbi_config.alphaMode & SST_ENALPHABLEND) || - (gc->state.fbi_config.fbzColorPath & SST_LOCALSELECT_OVERRIDE_WITH_ATEX) || - (gc->state.fbi_config.alphaMode & SST_ENALPHAFUNC) || - (gc->state.fbi_config.fbzMode & SST_ENCHROMAKEY)) { - GrErrorCallback("guMPDrawTriangle: Illegal state", FXFALSE); - } - - if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_ADD || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL1 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR1) { - /* render pass with all effects */ - /* select other texture map */ - /* set alpha blend to add to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine bias */ - /* render other pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig = 0; - FxU32 fogmode, fogmode_orig = 0; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - GR_CHECK_SIZE(); - - /* first pass */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[0]); - _gumpTexCombineFunction(0); - - /* render first pass */ - grDrawTriangle(a, b, c); - - /* second pass */ - - /* xxx may need to copy texture coordinates, see - grTexCombineFunction's second parameter. if so, - we have to disable the second coordinate when drawing. */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[1]); - _gumpTexCombineFunction(1); - - { - const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER); - const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING); - const FxU32 regCount = (2 + depthP + fogP); - const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL)); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if (fogP) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - - REG_GROUP_SET(hw, fogMode, fogmode); - } - - /* enable alpha blend to add to destination buffers */ - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT)); - - REG_GROUP_SET(hw, alphaMode, alphamode); - - /* if depth buffering, set to z= mode and disable writes */ - if (depthP) { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - REG_GROUP_SET(hw, fbzMode, fbzmode); - } - } - REG_GROUP_END(); - - /* render other pass */ - grDrawTriangle(a, b, c); - - /* restore */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* restore ccu/acu state */ - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig); - - /* restore fog state */ - if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig); - - /* restore alpha blending state */ - REG_GROUP_SET(hw, alphaMode, alphamode_orig); - - /* restore depth buffer state */ - if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig); - } - REG_GROUP_END(); - } - - goto all_done; - } else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_MULTIPLY) { - /* disable fog and color combine bias */ - /* render pass with all other effects */ - /* select other texture map */ - /* set alpha blend to multiply to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine factor */ - /* render other pass */ - /* if fog or color combine w/bias */ - /* disable tmu */ - /* set alpha blend to add to dest buffer */ - /* enable fog and color combine bias */ - /* render bias pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig = 0; - FxU32 fogmode, fogmode_orig = 0; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - - /* first pass */ - - /* tmu setup */ - - guTexSource(_gumpState.mmid[0]); - _gumpTexCombineFunction(0); - - /* disable bias */ - { - const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER); - const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING); - const FxU32 regCount = (2 + depthP + fogP); - const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL)); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, (1 + fogP), (0x01UL | MaskSelect(fogP, 0x02UL))); - { - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx consult add path for switch version */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if (fogP) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - - REG_GROUP_SET(hw, fogMode, fogmode); - } - } - REG_GROUP_END(); - - /* render first pass */ - grDrawTriangle(a, b, c); - - /* second pass */ - /* xxx may sometimes need to copy texture coordinates */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[1]); - _gumpTexCombineFunction(1); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* disable factor and bias in color combine-- - decal, except for the cases that need texture alpha */ - /* this can change the parameters output */ - fbzcolorpath = fbzcolorpath_orig; - fbzcolorpath &= ~( SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT | - SST_CC_REVERSE_BLEND ); - - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA ) - { - xxx see implementation notes on why this isn't implemented yet - GrErrorCallback("guDrawTriangleMP: " - "MULTIPLY and BLEND_ITRGB_ON_TEXALPHA not implemented yet!", FXFALSE ); - goto all_done; - } - */ - fbzcolorpath |= SST_RGBSEL_TMUOUT; - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable fog */ - if (fogP) REG_GROUP_SET(hw, fogMode, 0); - - /* enable alpha blend to multiply to destination buffers */ - /* xxx alpha component blender can only handle factors of - 0 and 1 */ - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_COLOR << SST_RGBSRCFACT_SHIFT) | - (SST_A_ZERO << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ZERO << SST_ADSTFACT_SHIFT)); - - REG_GROUP_SET(hw, alphaMode, alphamode); - - /* if depth buffering, set to z= mode and disable writes */ - if (depthP) { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - REG_GROUP_SET(hw, fbzMode, fbzmode); - } - } - REG_GROUP_END(); - - /* render second pass */ - grDrawTriangle(a, b, c); - - /* if bias, third pass */ - if (fogP) { - /* enable alpha blend to add to destination buffers */ - REG_GROUP_BEGIN(BROADCAST_ID, fogMode, 2, 0x03); - { - /* disable fog factor, leave fog bias enabled */ - /* xxx setting ADD_MULT with fog disabled is harmless */ - fogmode = fogmode_orig; - fogmode |= SST_FOGMULT; - REG_GROUP_SET(hw, fogMode, fogmode); - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT)); - REG_GROUP_SET(hw, alphaMode, alphamode); - } - REG_GROUP_END(); - - /* render third pass */ - grDrawTriangle(a, b, c); - } - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* restore ccu/acu state */ - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig); - - /* restore fog state */ - if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig); - - /* restore alpha blending state */ - REG_GROUP_SET(hw, alphaMode, alphamode_orig); - - /* restore depth buffer state */ - if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig); - } - REG_GROUP_END(); - } - - goto all_done; - } else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_SUBTRACT) { - GrErrorCallback("gumpDrawTriangle: GR_MPTEXCOMBINE_SUBTRACT not implemented", FXFALSE); - goto all_done; - } - } - -all_done: - GR_END(); -} - diff --git a/glide2x/cvg/glide/src/diglide.c b/glide2x/cvg/glide/src/diglide.c deleted file mode 100644 index a3ed20f..0000000 --- a/glide2x/cvg/glide/src/diglide.c +++ /dev/null @@ -1,407 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 40 6/23/98 5:38p Peter -** lfb hinting -** -** 39 3/17/98 3:00p Peter -** removed unused stats -** -** 38 3/02/98 7:22p Peter -** moved internal function to where it is used -** -** 37 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 36 2/20/98 9:05a Peter -** removed remnants of comdex grot -** -** 35 1/30/98 4:31p Peter -** general clenaup -** -** 34 1/20/98 10:48a Atai -** validate state in grGlideGetState - * - * 33 1/07/98 10:22a Peter - * lod dithering env var - * - * 32 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 31 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 30 12/09/97 12:20p Peter - * mac glide port - * - * 29 12/01/97 5:46p Peter - * fixed variable names in swizzle - * - * 28 12/01/97 5:17p Peter - * - * 27 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 26 11/14/97 5:02p Peter - * more comdex stuff - * - * 25 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 24 11/12/97 2:27p Peter - * - * 23 11/12/97 11:39a Dow - * H3 Stuff - * - * 22 11/12/97 9:21a Dow - * Changed CVG_FIFO to USE_PACKET_FIFO - * - * 21 11/04/97 4:00p Dow - * Banshee Mods - * - * 20 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 19 10/16/97 3:40p Peter - * packed rgb - * - * 18 9/20/97 10:53a Peter - * keep track of palette stats - * - * 17 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 16 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 15 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 14 7/08/97 2:48p Peter - * - * 13 6/30/97 3:20p Peter - * error callback - * - * 12 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree - * -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -/* the root of all EVIL */ -struct _GlideRoot_s GR_CDECL _GlideRoot; -/* This is global to speed up the function call wrappers */ - -/*--------------------------------------------------------------------------- -** -*/ -void -_grDisplayStats(void) -{ - int frames = _GlideRoot.stats.bufferSwaps; - - if (frames <= 0) frames = 1; - gdbg_info(80,"GLIDE STATISTICS:\n"); - gdbg_info(80," triangles processed: %7d tris drawn: %7d\n", - _GlideRoot.stats.trisProcessed, _GlideRoot.stats.trisDrawn); - gdbg_info(80," buffer swaps: %7d tris/frame: %7d , %d\n", - _GlideRoot.stats.bufferSwaps, - _GlideRoot.stats.trisProcessed/frames, - _GlideRoot.stats.trisDrawn/frames); - gdbg_info(80," points: %7d pnts/frame: %7d\n", - _GlideRoot.stats.pointsDrawn, _GlideRoot.stats.pointsDrawn/frames); - gdbg_info(80," lines: %7d lines/frame: %7d\n", - _GlideRoot.stats.linesDrawn, _GlideRoot.stats.linesDrawn/frames); - gdbg_info(80," texture downloads: %7d texture bytes: %7d\n", - _GlideRoot.stats.texDownloads, _GlideRoot.stats.texBytes); - gdbg_info(80," palette downloads: %7d palette bytes: %7d\n", - _GlideRoot.stats.palDownloads, _GlideRoot.stats.palBytes); - gdbg_info(80," NCC downloads: %7d NCC bytes: %7d\n", - _GlideRoot.stats.nccDownloads, _GlideRoot.stats.nccBytes); - -#if USE_PACKET_FIFO - gdbg_info(80,"\tCommandFifo:\n"); - gdbg_info(80,"\t\tWraps: %ld\n", _GlideRoot.stats.fifoWraps); - if (_GlideRoot.stats.fifoWraps > 0) { - gdbg_info(80,"\t\tAvg Drain Depth: %g\n", - (double)_GlideRoot.stats.fifoWrapDepth / _GlideRoot.stats.fifoWraps); - } - gdbg_info(80,"\t\tStalls: %ld\n", _GlideRoot.stats.fifoStalls); - if (_GlideRoot.stats.fifoStalls > 0) { - gdbg_info(80,"\t\tAvg Stall Depth: %g\n", - (double)_GlideRoot.stats.fifoStallDepth / _GlideRoot.stats.fifoStalls); - } -#endif /* CVG_FIFO */ -} - -#if !USE_PACKET_FIFO -/* -** fifoFree is kept in bytes, each fifo entry is 8 bytes, but since there -** are headers involved, we assume an average of 2 registers per 8 bytes -** or 4 bytes of registers stored in every fifo entry -*/ -void -_grReCacheFifo(FxI32 n) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_H3) - GR_DCL_GC; - gc->state.fifoFree = ((grSstStatus() >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff)<<2; - -#if 0 - gc->state.fifoFree -= gc->hwDep.sst1Dep.swFifoLWM + n; -#endif -#endif -} - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n) -{ - GR_DCL_GC; - do { - _grReCacheFifo(n); - } while (gc->state.fifoFree < 0); - - return gc->state.fifoFree; -} -#endif /* !USE_PACKET_FIFO */ - -/*--------------------------------------------------------------------------- -** -*/ -void -_grSwizzleColor(GrColor_t *color) -{ - GR_DCL_GC; - FxU32 red, green, blue, alpha; - - switch(gc->state.color_format) { - case GR_COLORFORMAT_ARGB: - break; - - case GR_COLORFORMAT_ABGR: - red = *color & 0x00ff; - blue = (*color >> 16) & 0xff; - *color &= 0xff00ff00; - *color |= ((red << 16) | blue); - break; - - case GR_COLORFORMAT_RGBA: - blue = (*color & 0x0000ff00) >> 8; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0xff000000) >> 24; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - case GR_COLORFORMAT_BGRA: - blue = (*color & 0xff000000) >> 24; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0x0000ff00) >> 8; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - default: - GR_ASSERT(0); - break; - } -} /* _grSwizzleColor */ - -/*--------------------------------------------------------------------------- -** grGlideGetVersion -** NOTE: allow this to be called before grGlideInit() -*/ -GR_DIENTRY(grGlideGetVersion, void, (char version[80])) -{ - GDBG_INFO(87,"grGlideGetVersion(0x%x) => \"%s\"\n",version,glideIdent+3); - GR_ASSERT(version != NULL); - strcpy(version,glideIdent+3); -} /* grGlideGetVersion */ - -/*--------------------------------------------------------------------------- -** grGlideGetState -*/ -GR_DIENTRY(grGlideGetState, void, (GrState *state)) -{ - GR_BEGIN_NOFIFOCHECK("grGlideGetState",87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - GR_ASSERT(state != NULL); - - *state = gc->state; - GR_END(); -} /* grGlideGetState */ - -#ifndef GLIDE_ALPHA -/*--------------------------------------------------------------------------- -** grHints -*/ -GR_DIENTRY(grHints, void, (GrHint_t hintType, FxU32 hints)) -{ - GR_BEGIN_NOFIFOCHECK("grHints",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",hintType,hints); - - switch (hintType) { - case GR_HINT_STWHINT: - if (gc->state.paramHints != hints) { - gc->state.paramHints = hints; - _grUpdateParamIndex(); - } - break; - - case GR_HINT_FIFOCHECKHINT: - /* swFifoLWM is kept internally in bytes, hints are in fifo entries */ - gc->state.checkFifo = hints; - break; - - case GR_HINT_FPUPRECISION: - hints ? double_precision_asm() : single_precision_asm(); - break; - - case GR_HINT_ALLOW_MIPMAP_DITHER: - /* Regardless of the game hint, force the user selection */ - gc->state.allowLODdither = ((_GlideRoot.environment.texLodDither != 0) || - hints); - break; - - case GR_HINT_LFB_WRITE: - { - const FxU32 lfbRange = (((hints * gc->state.screen_height) + 0x1000UL) & - ~(0x1000UL - 1)); - - pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->base_ptr + 0x200000UL), - 0x200000UL, - FXFALSE); - pciLinearRangeSetPermission((const FxU32)gc->lfb_ptr, - lfbRange, - FXTRUE); - pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->lfb_ptr + lfbRange), - 0x400000UL - lfbRange, - FXFALSE); - break; - } - - case GR_HINT_LFB_PROTECT: - pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->base_ptr + 0x200000UL), - 0x200000UL, - FXTRUE); - pciLinearRangeSetPermission((const FxU32)gc->lfb_ptr, - 0x400000, - FXFALSE); - break; - - case GR_HINT_LFB_RESET: - pciLinearRangeSetPermission((const FxU32)gc->base_ptr, - 0x1000000UL, - FXTRUE); - break; - - default: - GR_CHECK_F(myName, 1, "invalid hints type"); - } - GR_END(); -} /* grHints */ -#endif - -/*--------------------------------------------------------------------------- -** grGlideInit -*/ -GR_DIENTRY(grGlideInit, void, (void)) -{ - GDBG_INIT(); - - GDBG_INFO(80,"grGlideInit()\n"); - _GlideInitEnvironment(); /* the main init code */ - FXUNUSED(*glideIdent); - -#if GDBG_INFO_ON - gdbg_error_set_callback(_grErrorCallback); -#endif - - grResetTriStats(); - - GDBG_INFO(281,"grGlideInit --done---------------------------------------\n"); -} /* grGlideInit */ - - -/*--------------------------------------------------------------------------- -** grGlideShamelessPlug - grGlideShamelessPlug -** -** Returns: -** -** Notes: -** -*/ -GR_DIENTRY(grGlideShamelessPlug, void, (const FxBool mode)) -{ - GDBG_INFO(80,"grGlideShamelessPlug(%d)\n",mode); - _GlideRoot.environment.shamelessPlug = mode; -} /* grGlideShamelessPlug */ - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -GR_DIENTRY(grResetTriStats, void, (void)) -{ - GDBG_INFO(80,"grResetTriStats()\n"); - _GlideRoot.stats.bufferSwaps = 0; - _GlideRoot.stats.linesDrawn = 0; - _GlideRoot.stats.trisProcessed = 0; - _GlideRoot.stats.trisDrawn = 0; - _GlideRoot.stats.texDownloads = 0; - _GlideRoot.stats.texBytes = 0; - _GlideRoot.stats.palDownloads = 0; - _GlideRoot.stats.palBytes = 0; -} /* grResetTriStats */ - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -GR_DIENTRY(grTriStats, void, (FxU32 *trisProcessed, FxU32 *trisDrawn)) -{ - GDBG_INFO(80,"grTriStats() => %d %d\n", - _GlideRoot.stats.trisProcessed, - _GlideRoot.stats.trisDrawn); - *trisProcessed = _GlideRoot.stats.trisProcessed; - *trisDrawn = _GlideRoot.stats.trisDrawn; -} /* grTriStats */ - -void GR_CDECL -_grFence(void) -{ - GDBG_INFO(120,"\t\t\t\t\t\t\tFENCE\n"); - P6FENCE; -} diff --git a/glide2x/cvg/glide/src/digutex.c b/glide2x/cvg/glide/src/digutex.c deleted file mode 100644 index bde2ddf..0000000 --- a/glide2x/cvg/glide/src/digutex.c +++ /dev/null @@ -1,581 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 11 2/20/98 5:31p Peter -** crybaby glide -** -** 10 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 9 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 8 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 7 12/15/97 5:51p Atai - * disable obsolete glide2 api for glide3 - * - * 6 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 5 5/21/97 6:04a Peter - * - * 4 5/05/97 4:24p Pgj - * Neuter guTexDownloadMipMap error message - * - * 3 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 2 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from ditex.c */ -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; - - -/*--------------------------------------------------------------------------- -** guTexAllocateMemory -*/ -GR_DIENTRY(guTexAllocateMemory, GrMipMapId_t, ( GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t format, - GrMipMapMode_t mipmap_mode, - GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect_ratio, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - )) -{ - FxU32 - memrequired, - memavail, - baseAddress, - tLod, - texturemode, - filterMode, /* filter mode bits */ - clampMode; /* clamp mode bits */ - - GrMipMapId_t - mmid = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - int - int_lod_bias; - GrTexInfo info; - - GR_BEGIN_NOFIFOCHECK("guTexAllocateMemory",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - tmu,odd_even_mask,width,height,format,mipmap_mode, - small_lod,large_lod,aspect_ratio, - s_clamp_mode,t_clamp_mode, minfilter_mode,magfilter_mode); - /* - ** The constants are actually reverse of each other so the following - ** test IS valid! - */ - GR_CHECK_F(myName, small_lod < large_lod, "smallest_lod is larger than large_lod"); - - info.smallLod = small_lod; - info.largeLod = large_lod; - info.aspectRatio = aspect_ratio; - info.format = format; - memrequired = grTexTextureMemRequired(odd_even_mask, &info); - - /* - ** Make sure to not cross 2 MByte texture boundry - */ - if ((gc->tmu_state[tmu].freemem_base < 0x200000) && - (gc->tmu_state[tmu].freemem_base + memrequired > 0x200000)) - gc->tmu_state[tmu].freemem_base = 0x200000; - - /* - ** If we have enough memory and a free mip map handle then go for it - */ - memavail = guTexMemQueryAvail( tmu ); - - if ( memavail < memrequired ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - if (gc->mm_table.free_mmid >= MAX_MIPMAPS_PER_SST ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - /* - ** Allocate the mip map id - */ - mmid = gc->mm_table.free_mmid++; - - /* - ** calculate baseAddress (where LOD 0 would go) - */ - baseAddress = _grTexCalcBaseAddress( gc->tmu_state[tmu].freemem_base, - large_lod, - aspect_ratio, - format, - odd_even_mask ); - - GDBG_INFO(gc->myLevel," baseAddress = 0x%x (in bytes)\n",baseAddress); - - /* - ** reduce available memory to reflect allocation - */ - gc->tmu_state[tmu].freemem_base += memrequired; - - /* - ** Create the tLOD register value for this mip map - */ - int_lod_bias = _grTexFloatLODToFixedLOD( lod_bias ); - tLod = mipmap_mode==GR_MIPMAP_DISABLE ? large_lod : small_lod; - tLod = SST_TLOD_MINMAX_INT(large_lod,tLod); - tLod |= _gr_evenOdd_xlate_table[odd_even_mask]; - tLod |= _gr_aspect_xlate_table[aspect_ratio]; - tLod |= int_lod_bias << SST_LODBIAS_SHIFT; - filterMode = ( - (minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - - clampMode = ( - (s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** Create the tTextureMode register value for this mip map - */ - texturemode = ( format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( trilinear ) { - texturemode |= SST_TRILINEAR; - - if ( odd_even_mask & GR_MIPMAPLEVELMASK_ODD ) - tLod |= SST_LOD_ODD; - - if ( odd_even_mask != GR_MIPMAPLEVELMASK_BOTH ) - tLod |= SST_LOD_TSPLIT; - } - - /* - ** Fill in the mm_table data for this mip map - */ - gc->mm_table.data[mmid].format = format; - gc->mm_table.data[mmid].mipmap_mode = mipmap_mode; - gc->mm_table.data[mmid].magfilter_mode = magfilter_mode; - gc->mm_table.data[mmid].minfilter_mode = minfilter_mode; - gc->mm_table.data[mmid].s_clamp_mode = s_clamp_mode; - gc->mm_table.data[mmid].t_clamp_mode = t_clamp_mode; - gc->mm_table.data[mmid].tLOD = tLod; - gc->mm_table.data[mmid].tTextureMode = texturemode; - gc->mm_table.data[mmid].lod_bias = int_lod_bias; - gc->mm_table.data[mmid].lod_min = small_lod; - gc->mm_table.data[mmid].lod_max = large_lod; - gc->mm_table.data[mmid].tmu = tmu; - gc->mm_table.data[mmid].odd_even_mask = odd_even_mask; - gc->mm_table.data[mmid].tmu_base_address = baseAddress; - gc->mm_table.data[mmid].trilinear = trilinear; - gc->mm_table.data[mmid].aspect_ratio = aspect_ratio; - gc->mm_table.data[mmid].data = 0; - /* gc->mm_table.data[mmid].ncc_table = 0; */ - gc->mm_table.data[mmid].sst = _GlideRoot.current_sst; - gc->mm_table.data[mmid].valid = FXTRUE; - gc->mm_table.data[mmid].width = width; - gc->mm_table.data[mmid].height = height; - - GR_RETURN(mmid); -} /* guTexAllocateMemory */ - -static void -_guTexRebuildRegisterShadows( GrMipMapId_t mmid ) -{ - GR_DCL_GC; - GrMipMapInfo *mminfo = &gc->mm_table.data[mmid]; - int texturemode = 0; - int tLod = 0; - FxU32 - filterMode, /* filter mode bits of texturemode */ - clampMode; /* clamp mode bits of texturemode */ - - /* build filterMode */ - filterMode = ( - (mminfo->minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (mminfo->magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - clampMode = ( - (mminfo->s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (mminfo->t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** build up tTextureMode - */ - texturemode |= ( mminfo->format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mminfo->mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( mminfo->trilinear ) - texturemode |= SST_TRILINEAR; - - /* - ** build up tLOD - */ - tLod = mminfo->mipmap_mode == GR_MIPMAP_DISABLE ? mminfo->lod_max : mminfo->lod_min; - tLod = SST_TLOD_MINMAX_INT(mminfo->lod_max,tLod); - tLod |= _gr_evenOdd_xlate_table[mminfo->odd_even_mask]; - tLod |= _gr_aspect_xlate_table[mminfo->aspect_ratio]; - tLod |= mminfo->lod_bias << SST_LODBIAS_SHIFT; - - /* - ** assign them - */ - mminfo->tTextureMode = texturemode; - mminfo->tLOD = tLod; -} /* guTexRebuildRegisterShadows */ - - -/*--------------------------------------------------------------------------- -** guTexChangeAttributes -*/ -GR_DIENTRY(guTexChangeAttributes, FxBool, ( GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - )) -{ - GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexChangeAttributes",88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - mmid,width,height,fmt,mm_mode, - smallest_lod,largest_lod,aspect, - s_clamp_mode,t_clamp_mode, minFilterMode,magFilterMode); - /* - ** Make sure that mmid is not NULL - */ - if ( mmid == GR_NULL_MIPMAP_HANDLE ) { - GR_RETURN(FXFALSE); - } - - mminfo = &gc->mm_table.data[mmid]; - - /* - ** Fill in the mm_table data for this mip map - */ - if ( fmt != -1 ) - mminfo->format = fmt; - - if ( mm_mode != -1 ) - mminfo->mipmap_mode = mm_mode; - - if ( smallest_lod != -1 ) - mminfo->lod_min = smallest_lod; - if ( largest_lod != -1 ) - mminfo->lod_max = largest_lod; - if ( minFilterMode != -1 ) - mminfo->minfilter_mode = minFilterMode; - if ( magFilterMode != -1 ) - mminfo->magfilter_mode = magFilterMode; - if ( s_clamp_mode != -1 ) - mminfo->s_clamp_mode = s_clamp_mode; - if ( t_clamp_mode != -1 ) - mminfo->t_clamp_mode = t_clamp_mode; - if ( aspect != -1 ) - mminfo->aspect_ratio = aspect; - if ( width != -1 ) - mminfo->width = width; - if ( height != -1 ) - mminfo->height = height; - - _guTexRebuildRegisterShadows( mmid ); - GR_RETURN(FXTRUE); -} /* guTexChangeAttributes */ - -/*--------------------------------------------------------------------------- -** grTexCombineFunction - obsolete -** -*/ -GR_DIENTRY(grTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - guTexCombineFunction( tmu, tc ); -} - -/*--------------------------------------------------------------------------- -** guTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DIENTRY(guTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - GDBG_INFO(99,"guTexCombineFunction(%d,%d)\n",tmu,tc); - switch ( tc ) { - case GR_TEXTURECOMBINE_ZERO: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DECAL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_ONE: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXTRUE, FXTRUE ); - break; - - case GR_TEXTURECOMBINE_ADD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_MULTIPLY: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_ODD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_EVEN: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_SUBTRACT: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - default: - GrErrorCallback( "guTexCombineFunction: Unsupported function", FXTRUE ); - break; - } -} /* guTexCombineFunction */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMap -** -** Downloads a mip map (previously allocated with guTexAllocateMemory) to -** the hardware using the given data and ncctble. The "data" is assumed -** to be in row major order from largest mip map to smallest mip map. -*/ -GR_DIENTRY(guTexDownloadMipMap, void, - (GrMipMapId_t mmid, const void *src, const GuNccTable - *ncc_table ) ) -{ - GR_DCL_GC; - GrLOD_t lod; - const void *ptr = src; - - GDBG_INFO(99,"guTexDownloadMipMap(%d,0x%x,0x%x)\n",mmid,src,ncc_table); - GR_ASSERT(gc != NULL); - GR_ASSERT(src != NULL); - GR_CHECK_F("guTexDownloadMipMap", - ( mmid == GR_NULL_MIPMAP_HANDLE ) || ( mmid >= gc->mm_table.free_mmid ), - "invalid mip map handle passed"); - -#if 0 /* Fixme!!! XXX ??? */ - GR_CHECK_F("guTexDownloadMipMap", - gc->mm_table.data[mmid].format == GR_TEXFMT_P_8, - "guTex* does not support palletted textures - use grTex* instead"); -#endif /* 0 */ - - /* - ** Bind data and ncc table to this mip map - */ - gc->mm_table.data[mmid].data = (void *) ptr; - if (gc->mm_table.data[mmid].format == GR_TEXFMT_YIQ_422) - gc->mm_table.data[mmid].ncc_table = *ncc_table; - - /* - ** Start downloading mip map levels, note that ptr is updated by the caller - */ - for ( lod = gc->mm_table.data[mmid].lod_max; lod <= gc->mm_table.data[mmid].lod_min; lod++ ) { - guTexDownloadMipMapLevel( mmid, lod, &ptr ); - } -} /* guTexDownloadMipMap */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMapLevel -** -** Downloads a single mip map level to a mip map. "src" is considered to be -** row major data of the correct aspect ratio and format. -*/ -GR_DIENTRY(guTexDownloadMipMapLevel, void, - (GrMipMapId_t mmid, GrLOD_t lod, - const void **src_base)) -{ - FxU32 i; - const GrMipMapInfo *mminfo; - GR_DCL_GC; - - GDBG_INFO(99,"guTexDownloadMipMapLevel(%d,%d,0x%x)\n",mmid,lod,src_base); - GR_ASSERT(src_base != NULL); - mminfo = &gc->mm_table.data[mmid]; - GR_CHECK_F( "guTexDownloadMipMapLevel", - ( lod > mminfo->lod_min ) || ( lod < mminfo->lod_max ), - "specified lod is out of range"); - - /* GMT: replace with array access */ - /* download this level */ - i = _grTexCalcBaseAddress( 0, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask); - grTexDownloadMipMapLevel( mminfo->tmu, - mminfo->tmu_base_address - i, - lod, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask, - (void *)*src_base ); - - /* update src_base to point to next mipmap level */ - *src_base = (void *) (((FxU32)*src_base) + - (_grMipMapHostSize[_gr_aspect_index_table[mminfo->aspect_ratio]][lod] - << (mminfo->format>=GR_TEXFMT_16BIT))); - -} /* guTexDownloadMipmapLevel */ - -/*--------------------------------------------------------------------------- -** guTexGetCurrentMipMap -*/ -GR_DIENTRY(guTexGetCurrentMipMap, GrMipMapId_t, ( GrChipID_t tmu )) -{ -#define FN_NAME "guTexGetCurrentMipMap" - GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu ); - - GR_RETURN(gc->state.current_mm[tmu]); -#undef FN_NAME -} /* guTexGetCurrentMipMap */ - -/*--------------------------------------------------------------------------- -** guTexGetMipMapInfo -*/ -GR_DIENTRY(guTexGetMipMapInfo, GrMipMapInfo *, ( GrMipMapId_t mmid )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetMipMapInfo",99); - GDBG_INFO_MORE(gc->myLevel,"(%d) => 0x%x\n",mmid,&gc->mm_table.data[mmid]); - return &( gc->mm_table.data[mmid] ); -} /* guTexGetMipMapInfo */ - -/*--------------------------------------------------------------------------- -** guTexMemQueryAvail -** -** returns the amount of available texture memory on a specified TMU. -*/ -GR_DIENTRY(guTexMemQueryAvail, FxU32, ( GrChipID_t tmu )) -{ -#define FN_NAME "guTexMemQueryAvail" - GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base); -#undef FN_NAME -} /* guTexQueryMemAvail */ - -/*--------------------------------------------------------------------------- -** guTexMemReset -** -** Clears out texture buffer memory. -*/ -GR_DIENTRY(guTexMemReset, void, ( void )) -{ - int i; - - GR_BEGIN_NOFIFOCHECK("guTexMemReset",99); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) ); - gc->mm_table.free_mmid = 0; - - for ( i = 0; i < gc->num_tmu; i++ ) { - gc->state.current_mm[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].freemem_base = 0; - gc->tmu_state[i].ncc_mmids[0] = - gc->tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].ncc_table[0] = - gc->tmu_state[i].ncc_table[1] = 0; - } - GR_END(); -} /* guTexMemReset */ - diff --git a/glide2x/cvg/glide/src/disst.c b/glide2x/cvg/glide/src/disst.c deleted file mode 100644 index f7872b0..0000000 --- a/glide2x/cvg/glide/src/disst.c +++ /dev/null @@ -1,213 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 22 4/21/98 10:05a Peter -** grSstSelect cleanup (Thanks John/Rufus) -** -** 21 3/17/98 6:50p Peter -** sli paired vs active -** -** 20 2/24/98 10:15a Peter -** oem dll muckage -** -** 19 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 18 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 17 12/09/97 12:20p Peter - * mac glide port - * - * 16 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 15 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 14 10/31/97 9:15a Peter - * only lie about v2 boards - * - * 13 10/31/97 8:53a Peter - * last lying change, really - * - * 12 9/05/97 5:29p Peter - * changes for direct hw - * - * 11 6/20/97 9:56a Peter - * better lines/pts, hopefully - * - * 10 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:04a Peter - * - * 7 5/02/97 2:07p Pgj - * grSstScreenWidth/Height now FxU32 - * - * 6 3/17/97 6:25a Jdt - * Added initDeviceSelect to grSstSelect() - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 3/04/97 9:08p Dow - * - * 3 1/18/97 11:39p Dow - * Changed location of _curGCFuncs - * - * 2 1/16/97 3:39p Dow - * Added ref to _curGCFuncs during grSstSelect() - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** grSstQueryBoards -** -** NOTE: it is OK to call this routine before grGlideInit -*/ -GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc )) -{ - GDBG_INIT(); - GDBG_INFO(80,"grSstQueryBoards(0x%x)\n",hwc); - -#if GLIDE_INIT_HAL - hwc->num_sst = (_grSstDetectResources() - ? _GlideRoot.hwConfig.num_sst - : 0); -#else /* !GLIDE_INIT_HAL */ - hwc->num_sst = sst1InitNumBoardsInSystem(); -#endif /* !GLIDE_INIT_HAL */ - - return FXTRUE; -} /* grSstQueryBoards */ - -/*--------------------------------------------------------------------------- -** grSstQueryHardware -** -*/ -GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc )) -{ - FxBool retVal; - - GR_BEGIN_NOFIFOCHECK("grSstQueryHardware",80); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",hwc); - - /* init and copy the data back to the user's structure */ - retVal = _GlideRoot.hwConfig.num_sst > 0; - *hwc = _GlideRoot.hwConfig; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Lie that we are an sst1 for backwards compatability */ - { - int i; - const GrSstType reportType = ((GETENV("FX_GLIDE_REPORT_REAL_HW") == NULL) - ? GR_SSTTYPE_VOODOO - : GR_SSTTYPE_Voodoo2); - - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - if (hwc->SSTs[i].type == GR_SSTTYPE_Voodoo2) hwc->SSTs[i].type = reportType; - } - } -#endif - - GR_RETURN(retVal); -} /* grSstQueryHardware */ - -/*--------------------------------------------------------------------------- -** grSstSelect -*/ -GR_DIENTRY(grSstSelect, void, ( int which )) -{ - GR_BEGIN_NOFIFOCHECK("grSstSelect",80); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",which); - - if ( which >= _GlideRoot.hwConfig.num_sst ) - GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE ); - - _GlideRoot.current_sst = _GlideRoot.gcMap[which]; - _GlideRoot.curGC = &_GlideRoot.GCs[_GlideRoot.current_sst]; - -#ifdef GLIDE_MULTIPLATFORM - _GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs; -#endif - - GR_END(); -} /* grSstSelect */ - -/*--------------------------------------------------------------------------- -** grSstScreenWidth -*/ -GR_DIENTRY(grSstScreenWidth, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_width; -} /* grSstScreenWidth */ - -/*--------------------------------------------------------------------------- -** grSstScreenHeight -*/ -GR_DIENTRY(grSstScreenHeight, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_height; -} - -/*--------------------------------------------------------------------------- -** grSstVidMode - override args to grSstOpen() -*/ -GR_DIENTRY(grSstVidMode, void, (FxU32 whichSst, FxVideoTimingInfo* vidTimings)) -{ - GDBG_INFO(80,"grSstVidMode(%d,0x%x)\n",whichSst,vidTimings); -#ifdef GLIDE_DEBUG - if (whichSst >= MAX_NUM_SST) { - char errStr[1028]; - sprintf(errStr, "grSstVidMode: %ld greater than MAX_NUM_SST (%d)\n", - whichSst, MAX_NUM_SST); - - GrErrorCallback(errStr, FXTRUE); - } -#endif - - _GlideRoot.GCs[whichSst].vidTimings = vidTimings; -} /* grSstVidMode */ diff --git a/glide2x/cvg/glide/src/distate.c b/glide2x/cvg/glide/src/distate.c deleted file mode 100644 index e5ac0e8..0000000 --- a/glide2x/cvg/glide/src/distate.c +++ /dev/null @@ -1,943 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - * - * 17 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 16 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 15 1/05/98 6:06p Atai - * glide extension stuff - * - * 14 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 13 12/16/97 11:38a Atai - * added grChromaRange() - * - * 12 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 10 12/12/97 1:30p Atai - * remove fp z buffer - * - * 8 12/08/97 10:44a Atai - * added entry point for grCoordinateSpace(), grDepthRange(), and - * grViewport() - * - * 7 11/13/97 4:38p Atai - * invalidate lfbMode and c0c1 - * - * 6 11/10/97 5:20p Atai - * added factor for grAlphaCombine and remove extra _grChromakeyMode - * - * 5 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 4 10/15/97 7:33a Dow - * Made _grValidateState use central routine for writing data - * - * 3 10/14/97 4:18p Atai - * added grEnable and grDisable - * - * 2 10/10/97 2:57p Dow - * Minor adjustments - * - * 1 10/09/97 5:19p Dow - * State Monster file - */ - -#ifdef GLIDE3 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*============================================================================= -** Replacement state routines. -** -** These routines store away their arguments, and mark a piece of glide state -** as invalid. The next time a rendering primitive is called, the state will -** be invalid, and grValidateState will be called. See that routine for more -** info. -**===========================================================================*/ - -/* - Some macros for use in this file only - */ - -#define STOREARG(function, arg) \ -gc->state.stateArgs.##function##Args.arg = arg - -#define LOADARG(function, arg) \ -gc->state.stateArgs.##function##Args.arg - -#define INVALIDATE(regset) \ -gc->state.invalid |= ##regset##BIT - -#define NOTVALID(regset) \ -(gc->state.invalid & ##regset##BIT) - -#define SETVALID(regset) \ -(gc->state.invalid &= ~(##regset##BIT)) - -#define ENABLEMODE(mode) \ -gc->state.grEnableArgs.##mode## = GR_MODE_ENABLE; - -#define DISABLEMODE(mode) \ -gc->state.grEnableArgs.##mode## = GR_MODE_DISABLE; - -/*------------------------------------------------------------------- - Function: grAlphaBlendFunction - Date: 06-Oct-97 - Implementor(s): dow - Description: - Inform Glide that the Alpha Blend Function has been modified. - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaBlendFunction, void , (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df) ) -{ - #define FN_NAME "grAlphaBlendFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - /* Invalidate AlphaMode */ - INVALIDATE(alphaMode); - - STOREARG(grAlphaBlendFunction, rgb_sf); - STOREARG(grAlphaBlendFunction, rgb_df); - STOREARG(grAlphaBlendFunction, alpha_sf); - STOREARG(grAlphaBlendFunction, alpha_df); - - #undef FN_NAME -} /* grAlphaBlendFunction */ - -/*------------------------------------------------------------------- - Function: grAlphaTestFunction - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaTestFunction, void , (GrCmpFnc_t fnc) ) -{ - #define FN_NAME "grAlphaTestFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - /* Invalidate AlphaMode */ - INVALIDATE(alphaMode); - - STOREARG(grAlphaTestFunction, fnc); - - #undef FN_NAME -} /* grAlphaTestFunction */ - -/*------------------------------------------------------------------- - Function: grAlphaTestReferenceValue - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaTestReferenceValue, void , (GrAlpha_t value) ) -{ - #define FN_NAME "grAlphaTestReferenceValue" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - INVALIDATE(alphaMode); - - STOREARG(grAlphaTestReferenceValue,value); - - #undef FN_NAME -} /* grAlphaTestReferenceValue */ - -/*------------------------------------------------------------------- - Function: grAlphaCombine - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaCombine, void , - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert) ) -{ - #define FN_NAME "grAlphaCombine" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzColorPath); - - STOREARG(grAlphaCombine, function); - STOREARG(grAlphaCombine, factor); - STOREARG(grAlphaCombine, local); - STOREARG(grAlphaCombine, other); - STOREARG(grAlphaCombine, invert); - - #undef FN_NAME -} /* grAlphaCombine */ - -/*------------------------------------------------------------------- - Function: grAlphaControlsITRGBLighting - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaControlsITRGBLighting, void , (FxBool enable) ) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting",85); - - INVALIDATE(fbzColorPath); - - STOREARG(grAlphaControlsITRGBLighting, enable); - -#undef FN_NAME -} /* grAlphaControlsITRGBLighting */ - -/*------------------------------------------------------------------- - Function: grColorCombine - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grColorCombine, void , (GrCombineFunction_t function, - GrCombineFactor_t factor, - GrCombineLocal_t local, - GrCombineOther_t other, FxBool invert) ) -{ -#define FN_NAME "grColorCombine" - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - - INVALIDATE(fbzColorPath); - - STOREARG(grColorCombine, function); - STOREARG(grColorCombine, factor); - STOREARG(grColorCombine, local); - STOREARG(grColorCombine, other); - STOREARG(grColorCombine, invert); - -#undef FN_NAME -} /* grColorCombine */ - - -/*------------------------------------------------------------------- - Function: grChromakeyMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grChromakeyMode, void , (GrChromakeyMode_t mode) ) -{ -#define FN_NAME "grChromakeyMode" - GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85); - - INVALIDATE(fbzMode); - - STOREARG(grChromakeyMode, mode); - -#undef FN_NAME -} /* grChromakeyMode */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/*------------------------------------------------------------------- - Function: grChromaModeExt - Date: 05-Jan-98 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -void _grChromaModeExt(GrChromakeyMode_t mode) -{ -#define FN_NAME "_grChromaModeExt" - GR_BEGIN_NOFIFOCHECK("_grChromaModeExt",85); - - INVALIDATE(fbzMode); - - STOREARG(grChromakeyMode, mode); - -#undef FN_NAME -} /* _grChromaModeExt */ - -/*------------------------------------------------------------------- - Function: _grChromaRangeExt - Date: 15-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -void _grChromaRangeExt(GrColor_t color, GrColor_t range, GrChromaRangeMode_t mode) -{ -#define FN_NAME "_grChromaRangeExt" - GR_BEGIN_NOFIFOCHECK("_grChromaRangeExt",85); - - GR_CHECK_F(myName, - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type != GR_SSTTYPE_Voodoo2), - "grChromaRange not supported."); - - INVALIDATE(chromaKey); - - STOREARG(grChromakeyValue, color); - STOREARG(grChromaRange, range); - STOREARG(grChromaRange, mode); - -#undef FN_NAME -} /* _grChromaRangeExt */ -#endif - -/*------------------------------------------------------------------- - Function: grChromakeyValue - Date: 09-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_ENTRY(grChromakeyValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85); - - INVALIDATE(chromaKey); - - STOREARG(grChromakeyValue, color); - -#undef FN_NAME -} /* grChromakeyValue */ - -/*------------------------------------------------------------------- - Function: grDeptMask - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthMask, void , (FxBool enable) ) -{ - #define FN_NAME "grDepthMask" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthMask, enable); - - #undef FN_NAME -} /* grDeptMask */ - - -/*------------------------------------------------------------------- - Function: grDepthBufferFunction - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBufferFunction, void , (GrCmpFnc_t fnc) ) -{ - #define FN_NAME "grDepthBufferFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthBufferFunction, fnc); - - #undef FN_NAME -} /* grDepthBufferFunction */ - - -/*------------------------------------------------------------------- - Function: grDepthBufferMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBufferMode, void , (GrDepthBufferMode_t mode) ) -{ - #define FN_NAME "grDepthBufferMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthBufferMode, mode); - - #undef FN_NAME -} /* grDepthBufferMode */ - - -/*------------------------------------------------------------------- - Function: grDitherMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDitherMode, void , (GrDitherMode_t mode) ) -{ - #define FN_NAME "grDitherMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDitherMode, mode); - - #undef FN_NAME -} /* grDitherMode */ - -/*------------------------------------------------------------------- - Function: grRenderBuffer - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grRenderBuffer, void , (GrBuffer_t buffer) ) -{ - #define FN_NAME "grRenderBuffer" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grRenderBuffer, buffer); - - #undef FN_NAME -} /* grRenderBuffer */ - -/*------------------------------------------------------------------- - Function: grColorMask - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_ENTRY(grColorMask, void , (FxBool rgb, FxBool alpha) ) -{ -#define FN_NAME "grColorMask" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grColorMask, rgb); - STOREARG(grColorMask, alpha); - - -#undef FN_NAME -} /* grColorMask */ - -/*------------------------------------------------------------------- - Function: grSstOrigin - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grSstOrigin, void , (GrOriginLocation_t origin) ) -{ - #define FN_NAME "grSstOrigin" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(chromaKey); - - STOREARG(grSstOrigin, origin); - -#undef FN_NAME -} /* grSstOrigin */ - -/*------------------------------------------------------------------- - Function: grClipWindow - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grClipWindow, void , (FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy) ) -{ -#define FN_NAME "grClipWindow" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(clipRegs); - - STOREARG(grClipWindow, minx); - STOREARG(grClipWindow, miny); - STOREARG(grClipWindow, maxx); - STOREARG(grClipWindow, maxy); - -#undef FN_NAME -} /* grClipWindow */ - -/*------------------------------------------------------------------- - Function: grDepthBiasLevel - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBiasLevel, void , (FxI16 level) ) -{ -#define FN_NAME "grDepthBiasLevel" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(zaColor); - - STOREARG(grDepthBiasLevel, level); - -#undef FN_NAME -} /* grDepthBiasLevel */ - - -/*------------------------------------------------------------------- - Function: grFogMode - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grFogMode, void , (GrFogMode_t mode) ) -{ -#define FN_NAME "grFogMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(fogMode); - - STOREARG(grFogMode, mode); - -#undef FN_NAME -} /* grFogMode */ - - -/*------------------------------------------------------------------- - Function: grFogColorValue - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grFogColorValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(fogColor); - - STOREARG(grFogColorValue, color); - -#undef FN_NAME -} /* grFogColorValue */ - -/*------------------------------------------------------------------- - Function: grLfbWriteColorFormat - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grLfbWriteColorFormat, void , (GrColorFormat_t colorFormat) ) -{ -#define FN_NAME "grLfbWriteColorFormat" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - - INVALIDATE(lfbMode); - - STOREARG(grLfbWriteColorFormat, colorFormat); - -#undef FN_NAME -} /* grLfbWriteColorFormat */ - -/*------------------------------------------------------------------- - Function: grLfbWriteColorSwizzle - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grLfbWriteColorSwizzle, void , (FxBool swizzleBytes, FxBool - swapWords) ) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - - INVALIDATE(lfbMode); - - STOREARG(grLfbWriteColorSwizzle, swizzleBytes); - STOREARG(grLfbWriteColorSwizzle, swapWords); - -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - - -/*------------------------------------------------------------------- - Function: grConstantColorValue - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grConstantColorValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grConstantColorValue" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(c0c1); - - STOREARG(grConstantColorValue, color); - -#undef FN_NAME -} /* grConstantColorValue */ - - -/*==========================================================================*/ - - -/*------------------------------------------------------------------- - Function: grValidateState - Date: 08-Oct-97 - Implementor(s): dow - Description: - State Validation: - Once a rendering primitive has determined that the state is invalid, - it calls this routine. grValidateState then goes through valid - markers and flushes all invalid state. - -------------------------------------------------------------------*/ -void -_grValidateState() -{ -#define FN_NAME "_grValidateState" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - if (NOTVALID(alphaMode)) { - _grAlphaBlendFunction(LOADARG(grAlphaBlendFunction, rgb_sf), - LOADARG(grAlphaBlendFunction, rgb_df), - LOADARG(grAlphaBlendFunction, alpha_sf), - LOADARG(grAlphaBlendFunction, alpha_df)); - _grAlphaTestFunction(LOADARG(grAlphaTestFunction, fnc)); - _grAlphaTestReferenceValue(LOADARG(grAlphaTestReferenceValue, value)); - - } - - if (NOTVALID(fbzColorPath)) { - _grAlphaCombine(LOADARG(grAlphaCombine, function), - LOADARG(grAlphaCombine, factor), - LOADARG(grAlphaCombine, local), - LOADARG(grAlphaCombine, other), - LOADARG(grAlphaCombine, invert)); - _grAlphaControlsITRGBLighting(LOADARG(grAlphaControlsITRGBLighting, - enable)); - _grColorCombine(LOADARG(grColorCombine, function), - LOADARG(grColorCombine, factor), - LOADARG(grColorCombine, local), - LOADARG(grColorCombine, other), - LOADARG(grColorCombine, invert)); - - } - - if (NOTVALID(fbzMode)) { - _grChromakeyMode(LOADARG(grChromakeyMode, mode)); - _grDepthMask(LOADARG(grDepthMask, enable)); - _grDepthBufferFunction(LOADARG(grDepthBufferFunction, fnc)); - _grDepthBufferMode(LOADARG(grDepthBufferMode, mode)); - _grDitherMode(LOADARG(grDitherMode, mode)); - _grRenderBuffer(LOADARG(grRenderBuffer, buffer)); - _grColorMask(LOADARG(grColorMask, rgb), LOADARG(grColorMask, alpha)); - _grSstOrigin(LOADARG(grSstOrigin, origin)); - - } - - if (NOTVALID(chromaKey)) { -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grChromaRangeExt(LOADARG(grChromakeyValue, color),LOADARG(grChromaRange, range) - , LOADARG(grChromaRange, mode)); - -#else - _grChromakeyValue(LOADARG(grChromakeyValue, color)); -#endif - } - - if (NOTVALID(clipRegs)) { - _grClipWindow( - LOADARG(grClipWindow, minx), - LOADARG(grClipWindow, miny), - LOADARG(grClipWindow, maxx), - LOADARG(grClipWindow, maxy)); - } - - if (NOTVALID(zaColor)) { - _grDepthBiasLevel((FxI16) LOADARG(grDepthBiasLevel, level)); - } - - if (NOTVALID(fogMode)) { - _grFogMode(LOADARG(grFogMode, mode)); - } - - if (NOTVALID(fogColor)) { - _grFogColorValue(LOADARG(grFogColorValue, color)); - } - - if (NOTVALID(lfbMode)) { - _grLfbWriteColorFormat(LOADARG(grLfbWriteColorFormat, colorFormat)); - _grLfbWriteColorSwizzle(LOADARG(grLfbWriteColorSwizzle, swizzleBytes), - LOADARG(grLfbWriteColorSwizzle, swapWords)); - - } - - if (NOTVALID(c0c1)) { - _grConstantColorValue(LOADARG(grConstantColorValue, color)); - } - - _grUpdateParamIndex(); - - _grFlushCommonStateRegs(); - -#undef FN_NAME -} /* _grValidateState */ - -#define IARRAY(p,i) (*((FxU32 *)(p)+(i))) - -/*------------------------------------------------------------------- - Function: grEnable - Date: 10-Oct-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grEnable, void , (GrEnableMode_t mode) ) -{ -#define FN_NAME "grEnable" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_AA_ORDERED: - ENABLEMODE(primitive_smooth_mode); - break; - case GR_SHAMELESS_PLUG: - ENABLEMODE(shameless_plug_mode); - _GlideRoot.environment.shamelessPlug = mode; - break; - case GR_VIDEO_SMOOTHING: - ENABLEMODE(video_smooth_mode); - break; - case GR_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = GR_MODE_ENABLE; - break; - } - -#undef FN_NAME -} /* grEnable */ - -/*------------------------------------------------------------------- - Function: grDisable - Date: 10-Oct-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDisable, void , (GrEnableMode_t mode) ) -{ -#define FN_NAME "grDisable" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_AA_ORDERED: - DISABLEMODE(primitive_smooth_mode); - break; - case GR_SHAMELESS_PLUG: - DISABLEMODE(shameless_plug_mode); - break; - case GR_VIDEO_SMOOTHING: - DISABLEMODE(video_smooth_mode); - break; - case GR_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = GR_MODE_DISABLE; - break; - } - -#undef FN_NAME -} /* grDisable */ - -/*------------------------------------------------------------------- - Function: grCoordinateSpace - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grCoordinateSpace, void , (GrCoordinateSpaceMode_t mode) ) -{ -#define FN_NAME "grCoordinateSpace" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_WINDOW_COORDS: - gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_WINDOW_COORDS; - break; - case GR_CLIP_COORDS: - gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_CLIP_COORDS; - break; - } - -#undef FN_NAME -} /* grCoordinateSpace */ - -/*------------------------------------------------------------------- - Function: grDepthRange - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthRange, void , (FxFloat n, FxFloat f) ) -{ -#define FN_NAME "grDepthRange" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - gc->state.Viewport.n = n; - gc->state.Viewport.f = f; - gc->state.Viewport.hdepth = (f - n) * 0.5f * 65535.f; - gc->state.Viewport.oz = (f + n) * 0.5f * 65535.f; - -#undef FN_NAME -} /* grDepthRange */ - -/*------------------------------------------------------------------- - Function: grViewport - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grViewport, void , (FxI32 x, FxI32 y, FxI32 width, FxI32 height) ) -{ -#define FN_NAME "grViewport" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - gc->state.Viewport.ox = (FxFloat)(x + width * 0.5f); - gc->state.Viewport.oy = (FxFloat)(y + height *0.5f); - gc->state.Viewport.hwidth = width * 0.5f; - gc->state.Viewport.hheight = height * 0.5f; - -#undef FN_NAME -} /* grViewport */ - -#endif /* GLIDE3 */ diff --git a/glide2x/cvg/glide/src/distrip.c b/glide2x/cvg/glide/src/distrip.c deleted file mode 100644 index 06deb3a..0000000 --- a/glide2x/cvg/glide/src/distrip.c +++ /dev/null @@ -1,445 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 14 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 13 12/12/97 10:59a Atai - * clip space and viewport - * - * 12 12/08/97 10:42a Atai - * added grDrawVertexArrayLinear() - * - * 11 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 10 11/18/97 6:11p Peter - * fixed glide3 muckage - * - * 9 11/18/97 3:24p Atai - * change grParameterData to grVertexLayout - * define GR_PARAM_* - * - * 8 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 7 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 6 10/21/97 8:36p Atai - * added gr_lines routines - * use dword offset - * - * 5 10/17/97 2:11p Atai - * added grContinueArray. We only support non aa mode for now. - * - * 4 10/14/97 4:34p Atai - * filled out the calls to different drawarray routines - * - * 3 9/29/97 1:26p Dow - * Fixed packed color strips/fans - * - * 2 9/26/97 10:24a Dow - * Fixed state muckage in Glide3 parameter data - * - * 1 9/23/97 2:04p Dow - * DI code for strips -** -*/ -#ifdef GLIDE3 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - Function: grVertexLayout - Date: 17-Sep-97 - Implementor(s): dow - Library: Init Code for - Description: - This routine defines the format for vertex arrays. - - Arguments: - param - Type of date-i.e. vertex, color, or texture info: - GR_COLOR, GR_VERTEX, GR_TEXTURE0, GR_TEXTURE1 - components - Which components are specified - Valid Components: - - - So, this table summarizes the legal combinations: - Param Type Size Description - ======================================================================================================= - GR_PARAM_XY FxFloat 8 X and Y coordinates. Offset must be zero. - GR_PARAM_Z FxFloat 4 Z coordinate. - GR_PARAM_A FxFloat 4 Alpha value. - GR_PARAM_RGB FxFloat 12 RGB triplet. - GR_PARAM_PARGB FxU32 4 Packed ARGB. High-order byte is A, followed by R, G, and B. - GR_PARAM_STn FxFloat 8 S and T coordinates for TMU , where n is in the range [0, TBD] - GR_PARAM_Wn FxFloat 4 - - Return: - Nothing ever. - -------------------------------------------------------------------*/ -GR_DIENTRY(grVertexLayout, void , (FxU32 param, FxI32 offset, FxU32 mode) ) -{ -#define FN_NAME "grParameterData" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x)\n", param, offset); - - gc->state.vData.vertexInfo.param = param; - - switch (param) { - case GR_PARAM_XY: - GR_CHECK_F(myName, - (offset != 0), - "Offset must be zero."); - - gc->state.vData.vertexInfo.offset = offset; - gc->state.vData.vertexInfo.mode = mode; - break; - - case GR_PARAM_Z: - - gc->state.vData.zInfo.offset = offset; - gc->state.vData.zInfo.mode = mode; - - break; - - case GR_PARAM_W: - - gc->state.vData.wInfo.offset = offset; - gc->state.vData.wInfo.mode = mode; - - break; - - case GR_PARAM_A: - - gc->state.vData.aInfo.offset = offset; - gc->state.vData.colorType = GR_FLOAT; - gc->state.vData.aInfo.mode = mode; - - break; - case GR_PARAM_RGB: - - gc->state.vData.rgbInfo.offset = offset; - gc->state.vData.colorType = GR_FLOAT; - gc->state.vData.rgbInfo.mode = mode; - - break; - case GR_PARAM_PARGB: - - gc->state.vData.pargbInfo.offset = offset; - gc->state.vData.colorType = GR_U8; - gc->state.vData.pargbInfo.mode = mode; - - break; - case GR_PARAM_ST0: - - gc->state.vData.st0Info.offset = offset; - gc->state.vData.st0Info.mode = mode; - - break; - case GR_PARAM_ST1: - - gc->state.vData.st1Info.offset = offset; - gc->state.vData.st1Info.mode = mode; - - break; - case GR_PARAM_Q: - - gc->state.vData.qInfo.offset = offset; - gc->state.vData.qInfo.mode = mode; - - break; - case GR_PARAM_Q0: - - gc->state.vData.q0Info.offset = offset; - gc->state.vData.q0Info.mode = mode; - - break; - case GR_PARAM_Q1: - - gc->state.vData.q1Info.offset = offset; - gc->state.vData.q1Info.mode = mode; - - break; - } - -#if !GLIDE3_VERTEX_LAYOUT - switch (param) { - case GR_VERTEX: - GR_CHECK_F(myName, - !((components == GR_VERTEX_XYZ) || - (components == GR_VERTEX_XYZW)), - "Bad Component for Vertex Parameter"); - gc->state.vData.vertexInfo.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Vertex Parameter"); - gc->state.vData.vertexInfo.type = type; - - gc->state.vData.vertexInfo.offset = offset; - - GDBG_INFO(gc->myLevel, "%s: Vertex Offset = %d\n", FN_NAME, - gc->state.vData.vertexInfo.offset); - - break; - - case GR_COLOR: - GR_CHECK_F(myName, - !((components == GR_COLOR_RGB) || (components == GR_COLOR_RGBA)), - "Bad Component for Color Parameter"); - gc->state.vData.colorInfo.components = components; - - GR_CHECK_F(myName, !((type == GR_FLOAT) || (type == GR_U8)), - "Bad Type for Color Parameter"); - gc->state.vData.colorInfo.type = type; - - gc->state.vData.colorInfo.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Color Offset = %d\n", FN_NAME, - gc->state.vData.colorInfo.offset); - - break; - - case GR_TEXTURE0: - GR_CHECK_F(myName, - !((components == GR_TEX_NONE) || (components == GR_TEX_ST) || - (components == GR_TEX_STW)), - "Bad Component for Texture Parameter"); - gc->state.vData.tex0Info.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter"); - gc->state.vData.tex0Info.type == type; - - gc->state.vData.tex0Info.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Tex0 Offset = %d\n", FN_NAME, - gc->state.vData.tex0Info.offset); - - break; - - case GR_TEXTURE1: - GR_CHECK_F(myName, - !((components == GR_TEX_NONE) || (components == GR_TEX_ST) || - (components == GR_TEX_STW)), - "Bad Component for Texture Parameter"); - gc->state.vData.tex1Info.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter"); - gc->state.vData.tex1Info.type == type; - - gc->state.vData.tex1Info.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Tex1 Offset = %d\n", FN_NAME, - gc->state.vData.tex1Info.offset); - break; - - default: - GR_CHECK_F(myName, 0, "Invalid Parameter"); - break; - - } -#endif /* !GLIDE3_VERTEX_LAYOUT */ - - _grRebuildDataList(); - - GR_END(); -#undef FN_NAME -} /* grParameterData */ - -/*------------------------------------------------------------------- - Function: grDrawVertexArray - Date: 18-Sep-97 - Implementor(s): dow - Description: - - Arguments: - mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP, - GR_TRIANGLE_FAN, GR_TRIANGLES - - Return: - Nothing ever - -------------------------------------------------------------------*/ -GR_DIENTRY(grDrawVertexArray, void , (FxU32 mode, FxU32 Count, void *pointers) ) -{ -#define FN_NAME "grDrawVertexArray" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n", - mode, Count, pointers); - -#ifdef GDBG_INFO_ON - { - FxU32 i; - for (i = 0; i < Count; i++) - GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n", - FN_NAME, i, ((float **)pointers)[i]); - } -#endif - - switch (mode) { - case GR_POINTS: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawPoints(GR_VTX_PTR_ARRAY, Count, pointers); - break; - case GR_LINE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers); - break; - case GR_LINES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers); - break; - case GR_POLYGON: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLE_FAN: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers); - else - _grAAVpDrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers); - else - _grDrawTriangles(GR_VTX_PTR_ARRAY, Count, pointers); - break; - - } -#undef FN_NAME -} /* grDrawVertexArray */ - - -/*------------------------------------------------------------------- - Function: grDrawVertexArrayLinear - Date: 04-Dec-97 - Implementor(s): atai - Description: - - Arguments: - mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP, - GR_TRIANGLE_FAN, GR_TRIANGLES - - Return: - Nothing ever - -------------------------------------------------------------------*/ -GR_DIENTRY(grDrawVertexArrayLinear, void , (FxU32 mode, FxU32 Count, void *pointers, FxU32 stride) ) -{ -#define FN_NAME "grDrawVertexArrayLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n", - mode, Count, pointers); - -#ifdef GDBG_INFO_ON - { - FxU32 i; - for (i = 0; i < Count; i++) - GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n", - FN_NAME, i, (int)pointers + gc->state.vData.vStride * i); - } -#endif - - gc->state.vData.vStride = stride >> 2; - switch (mode) { - case GR_POINTS: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR, Count, pointers); - else - _grDrawPoints(GR_VTX_PTR, Count, pointers); - break; - case GR_LINE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers); - break; - case GR_LINES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers); - break; - case GR_POLYGON: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLE_FAN: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers); - else - _grAAVpDrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers); - else - _grDrawTriangles(GR_VTX_PTR, Count, pointers); - break; - - } -#undef FN_NAME -} /* grDrawVertexArrayLinear */ - -#endif /* GLIDE3 */ diff --git a/glide2x/cvg/glide/src/ditex.c b/glide2x/cvg/glide/src/ditex.c deleted file mode 100644 index 78aae7c..0000000 --- a/glide2x/cvg/glide/src/ditex.c +++ /dev/null @@ -1,674 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 20 6/06/98 12:06p Peter -** gmt's trilinear hell bug -** -** 19 2/20/98 5:31p Peter -** crybaby glide -** -** 18 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 17 1/30/98 4:31p Peter -** general clenaup - * - * 16 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 15 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 13 12/09/97 12:20p Peter - * mac glide port - * - * 12 12/02/97 9:49a Dow - * Got rid of Texelfx rev 0 warning - * - * 11 11/20/97 6:58p Dow - * Marked _grTexTextureMemRequired for movement - * - * 10 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 9 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 8 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 7 5/21/97 6:04a Peter - * - * 6 3/15/97 8:09p Jdt - * Remove grTexDownloadTable from this file because I added SST-1 only - * code to it - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 3 2/12/97 12:34p Dow - * Fixed Hanson muckage - * - * 2 1/18/97 11:41p Dow - * Fixed Gary's "Last C Bug" analog - * Fixed usage of _grMipMapOffset_Tsplit - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -const FxU32 _gr_aspect_index_table[] = -{ - 3, - 2, - 1, - 0, - 1, - 2, - 3, -}; - -/* size in texels */ -const FxU32 _grMipMapHostSize[4][16] = -{ - { /* 1:1 aspect ratio */ - 65536, /* 0 : 256x256 */ - 16384, /* 1 : 128x128 */ - 4096, /* 2 : 64x64 */ - 1024, /* 3 : 32x32 */ - 256, /* 4 : 16x16 */ - 64, /* 5 : 8x8 */ - 16, /* 6 : 4x4 */ - 4, /* 7 : 2x2 */ - 1, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 32768, /* 0 : 256x128 */ - 8192, /* 1 : 128x64 */ - 2048, /* 2 : 64x32 */ - 512, /* 3 : 32x16 */ - 128, /* 4 : 16x8 */ - 32, /* 5 : 8x4 */ - 8, /* 6 : 4x2 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 16384, /* 0 : 256x64 */ - 4096, /* 1 : 128x32 */ - 1024, /* 2 : 64x16 */ - 256, /* 3 : 32x8 */ - 64, /* 4 : 16x4 */ - 16, /* 5 : 8x2 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 8:1 aspect ratio */ - 8192, /* 0 : 256x32 */ - 2048, /* 1 : 128x16 */ - 512, /* 2 : 64x8 */ - 128, /* 3 : 32x4 */ - 32, /* 4 : 16x2 */ - 8, /* 5 : 8x1 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - } -}; - -const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2] = -{ - { - { 256 , 32 }, - { 128 , 16 }, - { 64 , 8 }, - { 32 , 4 }, - { 16 , 2 }, - { 8 , 1 }, - { 4 , 1 }, - { 2 , 1 }, - { 1 , 1 } - }, - { - { 256 , 64 }, - { 128 , 32 }, - { 64 , 16 }, - { 32 , 8 }, - { 16 , 4 }, - { 8 , 2 }, - { 4 , 1 }, - { 2 , 1 }, - { 1 , 1 } - } , - { - { 256 , 128 }, - { 128 , 64 }, - { 64 , 32 }, - { 32 , 16 }, - { 16 , 8 }, - { 8 , 4 }, - { 4 , 2 }, - { 2 , 1 }, - { 1 , 1 } - }, - { - { 256 , 256 }, - { 128 , 128 }, - { 64 , 64 }, - { 32 , 32 }, - { 16 , 16 }, - { 8 , 8 }, - { 4 , 4 }, - { 2 , 2 }, - { 1 , 1 } - }, - { - { 128, 256 }, - { 64, 128 }, - { 32, 64 }, - { 16, 32 }, - { 8, 16 }, - { 4, 8 }, - { 2, 4 }, - { 1, 2 }, - { 1, 1 } - }, - { - { 64, 256 }, - { 32, 128 }, - { 16, 64 }, - { 8, 32 }, - { 4, 16 }, - { 2, 8 }, - { 1, 4 }, - { 1, 2 }, - { 1, 1 } - }, - { - { 32, 256 }, - { 16, 128 }, - { 8, 64 }, - { 4, 32 }, - { 2, 16 }, - { 1, 8 }, - { 1, 4 }, - { 1, 2 }, - { 1, 1 } - } -}; - -/* translates GR_ASPECT_* to bits for the TLOD register */ -const FxU32 _gr_aspect_xlate_table[] = -{ - (3<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (2<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (1<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - 0<< SST_LOD_ASPECT_SHIFT, - 1<< SST_LOD_ASPECT_SHIFT, - 2<< SST_LOD_ASPECT_SHIFT, - 3<< SST_LOD_ASPECT_SHIFT -}; - -const FxU32 _gr_evenOdd_xlate_table[] = -{ - 0xFFFFFFFF, /* invalid */ - SST_LOD_TSPLIT, /* even */ - SST_LOD_TSPLIT | SST_LOD_ODD, /* odd */ - 0, /* both */ -}; - -/* the size of each mipmap level in texels, 4 is the minimum no matter what */ -/* index is [aspect_ratio][lod] */ -static const FxU32 _grMipMapSize[4][16] = { - { /* 8:1 aspect ratio */ - 0x02000, /* 0 : 256x32 */ - 0x00800, /* 1 : 128x16 */ - 0x00200, /* 2 : 64x8 */ - 0x00080, /* 3 : 32x4 */ - 0x00020, /* 4 : 16x2 */ - 0x00010, /* 5 : 8x1 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 0x04000, /* 0 : 256x64 */ - 0x01000, /* 1 : 128x32 */ - 0x00400, /* 2 : 64x16 */ - 0x00100, /* 3 : 32x8 */ - 0x00040, /* 4 : 16x4 */ - 0x00010, /* 5 : 8x2 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 0x08000, /* 0 : 256x128 */ - 0x02000, /* 1 : 128x64 */ - 0x00800, /* 2 : 64x32 */ - 0x00200, /* 3 : 32x16 */ - 0x00080, /* 4 : 16x8 */ - 0x00020, /* 5 : 8x4 */ - 0x00008, /* 6 : 4x2 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 1:1 aspect ratio */ - 0x10000, /* 0 : 256x256 */ - 0x04000, /* 1 : 128x128 */ - 0x01000, /* 2 : 64x64 */ - 0x00400, /* 3 : 32x32 */ - 0x00100, /* 4 : 16x16 */ - 0x00040, /* 5 : 8x8 */ - 0x00010, /* 6 : 4x4 */ - 0x00004, /* 7 : 2x2 */ - 0x00004, /* 8 : 1x1 */ - }, -}; - - -/* the offset from mipmap level 0 of each mipmap level in texels */ -/* index is [aspect_ratio][lod] */ -static FxU32 _grMipMapOffset[4][16]; -static FxU32 _grMipMapOffset_Tsplit[4][16]; - -/* initialize the MipMap Offset arrays */ -void -_grMipMapInit(void) -{ - int ar,lod; - - for (ar=0; ar<4; ar++) { /* for each aspect ratio */ - _grMipMapOffset[ar][0] = 0; /* start off with offset=0 */ - for (lod=1; lod<=9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset[ar][lod] = _grMipMapOffset[ar][lod-1] + - _grMipMapSize[ar][lod-1]; - } - _grMipMapOffset_Tsplit[ar][0] = 0; /* start off with offset=0 */ - _grMipMapOffset_Tsplit[ar][1] = 0; /* start off with offset=0 */ - for (lod=2; lod<=9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset_Tsplit[ar][lod] = _grMipMapOffset_Tsplit[ar][lod-2] + - _grMipMapSize[ar][lod-2]; - } - } -} /* _grMipMapInit */ - -/*--------------------------------------------------------------------------- -** This is not DI anymore. Perhaps all of these size routines need -** to be in gtex.c now. -*/ -FxU32 -_grTexTextureMemRequired( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd ) -{ - FxU32 memrequired; - - GR_CHECK_W("_grTexTextureMemRequired", small_lod < large_lod, - "small_lod bigger than large_lod" ); - GR_CHECK_F( "_grTexTextureMemRequired", evenOdd > GR_MIPMAPLEVELMASK_BOTH || evenOdd == 0, - "invalid evenOdd mask" ); - - /* mirror aspect ratios */ - if ( aspect > GR_ASPECT_1x1 ) aspect = GR_ASPECT_1x8 - aspect; - - if ( evenOdd == GR_MIPMAPLEVELMASK_BOTH ) { - memrequired = _grMipMapOffset[aspect][small_lod+1]; - memrequired -= _grMipMapOffset[aspect][large_lod]; - } else { - memrequired = 0; - /* construct XOR mask */ - evenOdd = (evenOdd == GR_MIPMAPLEVELMASK_EVEN); - while (large_lod <= small_lod) { /* sum up all the mipmap levels */ - if ((large_lod ^ evenOdd) & 1) /* that match the XOR mask */ - memrequired += _grMipMapSize[aspect][large_lod]; - large_lod++; - } - } - - if ( format >= GR_TEXFMT_16BIT ) /* convert from texels to bytes */ - memrequired <<= 1; /* 2 bytes per texel */ - - memrequired += 7; /* round up to 8 byte boundary */ - memrequired &= ~7; - return memrequired; -} /* _grTexTextureMemRequired */ - -FxU16 -_grTexFloatLODToFixedLOD( float value ) -{ - float num_quarters; - int new_value; - - num_quarters = ( value + .125F ) / .25F; - new_value = ( int ) num_quarters; - - new_value &= 0x003F; - - return new_value; -} /* _grTexFloatLODToFixedLOD */ - -/*--------------------------------------------------------------------------- -** _grTexCalcBaseAddress -*/ -FxU32 -_grTexCalcBaseAddress( FxU32 start, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 odd_even_mask ) -{ - FxU32 sum_of_lod_sizes; - - /* mirror aspect ratios */ - if ( aspect > GR_ASPECT_1x1 ) aspect = GR_ASPECT_1x8 - aspect; - - if ( odd_even_mask == GR_MIPMAPLEVELMASK_BOTH ) - sum_of_lod_sizes = _grMipMapOffset[aspect][large_lod]; - else { - if (((odd_even_mask == GR_MIPMAPLEVELMASK_EVEN) && (large_lod & 1)) || - ((odd_even_mask == GR_MIPMAPLEVELMASK_ODD) && !(large_lod & 1))) - large_lod += 1; - sum_of_lod_sizes = _grMipMapOffset_Tsplit[aspect][large_lod]; - } - - if ( format >= GR_TEXFMT_16BIT ) sum_of_lod_sizes <<= 1; - - return ( start - sum_of_lod_sizes ); -} /* _grTexCalcBaseAddress */ - -/*--------------------------------------------------------------------------- -** grTexCalcMemRequired -*/ -GR_DIENTRY(grTexCalcMemRequired, FxU32, - ( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format )) -{ - const FxU32 memrequired = _grTexTextureMemRequired(small_lod, large_lod, - aspect, format, - GR_MIPMAPLEVELMASK_BOTH ); - - GDBG_INFO(88,"grTexCalcMemRequired(%d,%d,%d,%d) => 0x%x(%d)\n", - small_lod,large_lod,aspect,format,memrequired,memrequired); - - return memrequired; -} /* grTexCalcMemRequired */ - - -/*--------------------------------------------------------------------------- -** grTexDetailControl -*/ -GR_DIENTRY(grTexDetailControl, void, - ( GrChipID_t tmu, int lod_bias, FxU8 detail_scale, - float detail_max )) -{ -#define FN_NAME "grTexDetailControl" - FxU32 tDetail; - FxU32 dmax = ( FxU32 ) ( detail_max * _GlideRoot.pool.f255 ); - FxU32 dscale = detail_scale; - - GR_BEGIN_NOFIFOCHECK("grTexDetailControl",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%g)\n",tmu,detail_scale,detail_max); - GR_CHECK_TMU( FN_NAME, tmu ); - GR_CHECK_F( myName, lod_bias < -32 || lod_bias > 31, "lod_bias out of range" ); - GR_CHECK_F( myName, detail_scale > 7, "detail_scale out of range" ); - GR_CHECK_F( myName, detail_max < 0.0 || detail_max > 1.0, "detail_max out of range" ); - - tDetail = ( ( lod_bias << SST_DETAIL_BIAS_SHIFT ) & SST_DETAIL_BIAS ); - tDetail |= ( ( dmax << SST_DETAIL_MAX_SHIFT ) & SST_DETAIL_MAX ); - tDetail |= ( ( dscale << SST_DETAIL_SCALE_SHIFT ) & SST_DETAIL_SCALE ); - - /* MULTIPLAT */ - _grTexDetailControl( tmu, tDetail ); - GR_END(); -#undef FN_NAME -} /* grTexDetailControl */ - -GR_DIENTRY(grTexMinAddress, FxU32, ( GrChipID_t tmu )) -{ -#define FN_NAME "grTexMinAddress" - GR_BEGIN_NOFIFOCHECK("grTexMinAddress",88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - FXUNUSED( tmu ); - GR_RETURN(0); -#undef FN_NAME -} /* grTexMinAddress */ - - -/*------------------------------------------------------------------- - Function: grTexMaxAddress - Date: 6/2 - Implementor(s): GaryT - Library: glide - Description: - Returns address of maximum extent of texture ram for a given TMU - Arguments: - tmu - Return: - the largest valid texture start Address - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexMaxAddress, FxU32, ( GrChipID_t tmu )) -{ -#define FN_NAME "grTexMaxAddress" - GR_BEGIN_NOFIFOCHECK("grTexMaxAddress",88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem-8); -#undef FN_NAME -} /* grTexMaxAddress */ - - -/*------------------------------------------------------------------- - Function: grTexTextureMemRequired - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns the tmu memory required to store the specified mipmap - ( Gary and I don't like the name of this function, but are - a little backed into a corner because of the existence - of grTexMemRequired() which does not imply any distinction - between texture memory and system ram ) - Arguments: - evenOdd - which set of mipmap levels are to be stored - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimensions - of texture - Return: - offset to be added to current texture base address to calculate next - valid texture memory download location - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexTextureMemRequired, FxU32, - ( FxU32 evenOdd, GrTexInfo *info)) -{ - FxU32 memrequired; - - GR_CHECK_F( "grTexTextureMemRequired", !info, "invalid info pointer" ); - memrequired = _grTexTextureMemRequired(info->smallLod, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd ); - - GDBG_INFO(88,"grTexTextureMemRequired(%d,0x%x) => 0x%x(%d)\n", - evenOdd,info,memrequired,memrequired); - return memrequired; -} /* grTexTextureMemRequired */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMap - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a texture mipmap to the specified tmu at the specified - base address. - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimension of - texture to be downloaded and containing texture data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadMipMap, void, - ( GrChipID_t tmu, FxU32 startAddress, FxU32 - evenOdd, GrTexInfo *info )) -{ - GR_DCL_GC; - GrLOD_t lod; - char *src_base; - FxU32 size = grTexTextureMemRequired( evenOdd, info ); - - FXUNUSED(gc); - - GDBG_INFO(89,"grTexDownloadMipMap(%d,0x%x,%d,0x%x\n",tmu,startAddress,evenOdd,info); - GR_CHECK_TMU( "grTexDownloadMipMap", tmu ); - GR_CHECK_COMPATABILITY("grTexDownloadMipMap", - startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F( "grTexDownloadMipMap", evenOdd > 0x3, "evenOdd mask invalid" ); - GR_CHECK_F( "grTexDownloadMipMap", !info, "info invalid" ); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) { - GR_CHECK_COMPATABILITY("grTexDownloadMipMap", - ((startAddress < 0x200000UL) && (startAddress + size > 0x200000UL)), - "mipmap cannot span 2 MB boundary"); - GrErrorCallback("grTexDownloadMipMap: mipmap cannot span 2 Mbyte boundary", FXTRUE); - } - - src_base = (char *)info->data; - - /*--------------------------------------------------------------- - Download one mipmap level at a time - ---------------------------------------------------------------*/ - for(lod = info->largeLod; lod <= info->smallLod; lod++ ) { - grTexDownloadMipMapLevel( tmu, - startAddress, - lod, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd, - src_base ); - - src_base += (_grMipMapHostSize[_gr_aspect_index_table[info->aspectRatio]][lod] << - (info->format >= GR_TEXFMT_16BIT)); - } -} /* grTexDownloadMipMap */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadTablePartial - Date: 6/3 - Implementor(s): GaryT - Library: glide - Description: - download part of a look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadTablePartial, void, - ( GrChipID_t tmu, GrTexTable_t type, - void *data, int start, int end )) -{ -#define FN_NAME "grTexDownloadTablePartial" - GR_BEGIN_NOFIFOCHECK("grTexDownloadTablePartial",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x, %d,%d)\n",tmu,type,data,start,end); - GR_CHECK_TMU(FN_NAME,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - - if ( type == GR_TEXTABLE_PALETTE ) /* Need Palette Download Code */ - _grTexDownloadPalette( tmu, (GuTexPalette *)data, start, end ); - else { /* Type is an ncc table */ - _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end ); - /* Removed redundant call - * _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end ); - */ - } - GR_END(); -#undef FN_NAME -} /* grTexDownloadTable */ - -/*--------------------------------------------------------------------------- -** grTexDownloadMipMapLevel -*/ -GR_DIENTRY(grTexDownloadMipMapLevel, void, - ( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, - GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, void *data )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevel",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data); - /* - ** note for glide3 lod translation: - ** we are calling gr* routine so the lod data should remain the same - */ - grTexDownloadMipMapLevelPartial( tmu, startAddress, - thisLod, largeLod, - aspectRatio, format, - evenOdd, data, - 0, _grMipMapHostWH[aspectRatio][thisLod][1] - 1 ); - GR_END(); -} /* grTexDownloadMipmapLevel */ - -FxU16 rle_line[256]; -FxU16 *rle_line_end; - -#if (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS | GLIDE_OS_UNIX)) -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) -{ - /* don't do anything just shut up the compiler */ -} -#endif /* (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) */ diff --git a/glide2x/cvg/glide/src/fifo.c b/glide2x/cvg/glide/src/fifo.c deleted file mode 100644 index 0ff7591..0000000 --- a/glide2x/cvg/glide/src/fifo.c +++ /dev/null @@ -1,730 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 22 3/14/98 1:07p Peter -** mac port happiness -** -** 21 2/20/98 9:05a Peter -** removed remnants of comdex grot -** -** 20 2/11/98 5:22p Peter -** added fifo get stuff for hanson -** -** 19 2/01/98 7:44p Peter -** parameter dumping level - * - * 18 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 17 12/09/97 12:20p Peter - * mac glide port - * - * 16 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 15 12/05/97 4:26p Peter - * watcom warnings - * - * 14 12/03/97 11:34a Peter - * dos debugging - * - * 13 11/21/97 3:53p Peter - * reset messages are controlled by gdbg_level - * - * 12 11/19/97 6:04p Peter - * actually exit if not reset - * - * 11 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 10 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 9 11/15/97 9:20p Peter - * I am the sorriest f*cker on the face of the planet - * - ** - */ - -#include -#include - -#if defined(__WIN32__) -#include -#endif - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -#if GDBG_INFO_ON - -static const char* -cvgRegNames[] = { - "status", /* 0x00 */ - "intrCtrl", /* 0x01 */ - "vAx", /* 0x02 */ - "vAy", /* 0x03 */ - "vBx", /* 0x04 */ - "vBy", /* 0x05 */ - "vCx", /* 0x06 */ - "vCy", /* 0x07 */ - "r", /* 0x08 */ - "g", /* 0x09 */ - "b", /* 0x0A */ - "z", /* 0x0B */ - "a", /* 0x0C */ - "s", /* 0x0D */ - "t", /* 0x0E */ - "w", /* 0x0F */ - "drdx", /* 0x10 */ - "dgdx", /* 0x11 */ - "dbdx", /* 0x12 */ - "dzdx", /* 0x13 */ - "dadx", /* 0x14 */ - "dsdx", /* 0x15 */ - "dtdx", /* 0x16 */ - "dwdx", /* 0x17 */ - "drdy", /* 0x18 */ - "dgdy", /* 0x19 */ - "dbdy", /* 0x1A */ - "dzdy", /* 0x1B */ - "dady", /* 0x1C */ - "dsdy", /* 0x1D */ - "dtdy", /* 0x1E */ - "dwdy", /* 0x1F */ - "triangleCMD", /* 0x20 */ - "reserved021", /* 0x21 */ - "FvAx", /* 0x22 */ - "FvAy", /* 0x23 */ - "FvBx", /* 0x24 */ - "FvBy", /* 0x25 */ - "FvCx", /* 0x26 */ - "FvCy", /* 0x27 */ - "Fr", /* 0x28 */ - "Fg", /* 0x29 */ - "Fb", /* 0x2A */ - "Fz", /* 0x2B */ - "Fa", /* 0x2C */ - "Fs", /* 0x2D */ - "Ft", /* 0x2E */ - "Fw", /* 0x2F */ - "Fdrdx", /* 0x30 */ - "Fdgdx", /* 0x31 */ - "Fdbdx", /* 0x32 */ - "Fdzdx", /* 0x33 */ - "Fdadx", /* 0x34 */ - "Fdsdx", /* 0x35 */ - "Fdtdx", /* 0x36 */ - "Fdwdx", /* 0x37 */ - "Fdrdy", /* 0x38 */ - "Fdgdy", /* 0x39 */ - "Fdbdy", /* 0x3A */ - "Fdzdy", /* 0x3B */ - "Fdady", /* 0x3C */ - "Fdsdy", /* 0x3D */ - "Fdtdy", /* 0x3E */ - "Fdwdy", /* 0x3F */ - "FtriangleCMD", /* 0x40 */ - "fbzColorPath", /* 0x41 */ - "fogMode", /* 0x42 */ - "alphaMode", /* 0x43 */ - "fbzMode", /* 0x44 */ - "lfbMode", /* 0x45 */ - "clipLeftRight", /* 0x46 */ - "clipLowYHighY", /* 0x47 */ - "nopCMD", /* 0x48 */ - "fastfillCMD", /* 0x49 */ - "swapbufferCMD", /* 0x4A */ - "fogColor", /* 0x4B */ - "zaColor", /* 0x4C */ - "chromaKey", /* 0x4D */ - "chromaRange", /* 0x4E */ - "userIntrCMD", /* 0x4F */ - "stipple", /* 0x50 */ - "color0", /* 0x51 */ - "color1", /* 0x52 */ - "fbiPixelsIn", /* 0x53 */ - "fbiChromaFail", /* 0x54 */ - "fbiZfuncFail", /* 0x55 */ - "fbiAfuncFail", /* 0x56 */ - "fbiPixelsOut", /* 0x57 */ - "fogTable0001", /* 0x58 */ - "fogTable0203", /* 0x59 */ - "fogTable0405", /* 0x5A */ - "fogTable0607", /* 0x5B */ - "fogTable0809", /* 0x5C */ - "fogTable0A0B", /* 0x5D */ - "fogTable0C0D", /* 0x5E */ - "fogTable0E0F", /* 0x5F */ - "fogTable1011", /* 0x60 */ - "fogTable1213", /* 0x61 */ - "fogTable1415", /* 0x62 */ - "fogTable1617", /* 0x63 */ - "fogTable1819", /* 0x64 */ - "fogTable1A1B", /* 0x65 */ - "fogTable1C1D", /* 0x66 */ - "fogTable1E1F", /* 0x67 */ - "fogTable2021", /* 0x68 */ - "fogTable2223", /* 0x69 */ - "fogTable2425", /* 0x6A */ - "fogTable2627", /* 0x6B */ - "fogTable2829", /* 0x6C */ - "fogTable2A2B", /* 0x6D */ - "fogTable2C2D", /* 0x6E */ - "fogTable2E2F", /* 0x6F */ - "fogTable3031", /* 0x70 */ - "fogTable3233", /* 0x71 */ - "fogTable3435", /* 0x72 */ - "fogTable3637", /* 0x73 */ - "fogTable3839", /* 0x74 */ - "fogTable3A3B", /* 0x75 */ - "fogTable3C3D", /* 0x76 */ - "fogTable3E3F", /* 0x77 */ - "cmdFifoBaseAddr", /* 0x78 */ - "cmdFifoBump", /* 0x79 */ - "cmdFifoRdPtr", /* 0x7A */ - "cmdFifoAMin", /* 0x7B */ - "cmdFifoAMax", /* 0x7C */ - "cmdFifoDepth", /* 0x7D */ - "cmdFifoHoles", /* 0x7E */ - "reserved07F", /* 0x7F */ - "fbiInit4", /* 0x80 */ - "vRetrace", /* 0x81 */ - "backPorch", /* 0x82 */ - "videoDim", /* 0x83 */ - "fbiInit0", /* 0x84 */ - "fbiInit1", /* 0x85 */ - "fbiInit2", /* 0x86 */ - "fbiInit3", /* 0x87 */ - "hSync", /* 0x88 */ - "vSync", /* 0x89 */ - "clutData", /* 0x8A */ - "dacData", /* 0x8B */ - "maxRGBDelta", /* 0x8C */ - "hBorder", /* 0x8D */ - "vBorder", /* 0x8E */ - "borderColor", /* 0x8F */ - "hvRetrace", /* 0x90 */ - "fbiInit5", /* 0x91 */ - "fbiInit6", /* 0x92 */ - "fbiInit7", /* 0x93 */ - "reserved094", /* 0x94 */ - "reserved095", /* 0x95 */ - "fbiSwapHistory", /* 0x96 */ - "fbiTriOut", /* 0x97 */ - "sSetupMode", /* 0x98 */ - "sVx", /* 0x99 */ - "sVy", /* 0x9A */ - "sARGB", /* 0x9B */ - "sRed", /* 0x9C */ - "sGreen", /* 0x9D */ - "sBlue", /* 0x9E */ - "sAlpha", /* 0x9F */ - "sVz", /* 0xA0 */ - "sWb", /* 0xA1 */ - "sWtmu0", /* 0xA2 */ - "sS/W0", /* 0xA3 */ - "sT/W0", /* 0xA4 */ - "sWtmu1", /* 0xA5 */ - "sS/Wtmu1", /* 0xA6 */ - "sT/Wtmu1", /* 0xA7 */ - "sDrawTriCMD", /* 0xA8 */ - "sBeginTriCMD", /* 0xA9 */ - "reserved0AA", /* 0xAA */ - "reserved0AB", /* 0xAB */ - "reserved0AC", /* 0xAC */ - "reserved0AD", /* 0xAD */ - "reserved0AE", /* 0xAE */ - "reserved0AF", /* 0xAF */ - "bltSrcBase", /* 0xB0 */ - "bltDstBase", /* 0xB1 */ - "bltXYStrides", /* 0xB2 */ - "bltSrcChroma", /* 0xB3 */ - "bltDstChroma", /* 0xB4 */ - "bltClipX", /* 0xB5 */ - "bltClipY", /* 0xB6 */ - "reserved067", /* 0xB7 */ - "bltSrcXY", /* 0xB8 */ - "bltDstXY", /* 0xB9 */ - "bltSize", /* 0xBA */ - "bltRop", /* 0xBB */ - "bltColor", /* 0xBC */ - "reserved067", /* 0xBD */ - "bltCommand", /* 0xBE */ - "bltData", /* 0xBF */ - "textureMode", /* 0xc0 */ - "tLOD", /* 0xc1 */ - "tDetail", /* 0xc2 */ - "texBaseAddr", /* 0xc3 */ - "texBaseAddr1", /* 0xc4 */ - "texBaseAddr2", /* 0xc5 */ - "texBaseAddr38", /* 0xc6 */ - "trexInit0", /* 0xc7 */ - "trexInit1", /* 0xc8 */ - "nccTable0_0", /* 0xc9 */ - "nccTable0_1", /* 0xca */ - "nccTable0_2", /* 0xcb */ - "nccTable0_3", /* 0xcc */ - "nccTable0_4", /* 0xcd */ - "nccTable0_5", /* 0xce */ - "nccTable0_6", /* 0xcf */ - "nccTable0_7", /* 0xd0 */ - "nccTable0_8", /* 0xd1 */ - "nccTable0_9", /* 0xd2 */ - "nccTable0_A", /* 0xd3 */ - "nccTable0_B", /* 0xd4 */ - "nccTable1_0", /* 0xd5 */ - "nccTable1_1", /* 0xd6 */ - "nccTable1_2", /* 0xd7 */ - "nccTable1_3", /* 0xd8 */ - "nccTable1_4", /* 0xd9 */ - "nccTable1_5", /* 0xda */ - "nccTable1_6", /* 0xdb */ - "nccTable1_7", /* 0xdc */ - "nccTable1_8", /* 0xdd */ - "nccTable1_9", /* 0xde */ - "nccTable1_A", /* 0xdf */ - "nccTable1_B", /* 0xe0 */ - "reserved0E1", /* 0xe1 */ - "reserved0E2", /* 0xe2 */ - "reserved0E3", /* 0xe3 */ - "reserved0E4", /* 0xe4 */ - "reserved0E5", /* 0xe5 */ - "reserved0E6", /* 0xe6 */ - "reserved0E7", /* 0xe7 */ - "reserved0E8", /* 0xe8 */ - "reserved0E9", /* 0xe9 */ - "reserved0EA", /* 0xea */ - "reserved0EB", /* 0xeb */ - "reserved0EC", /* 0xec */ - "reserved0ED", /* 0xed */ - "reserved0EE", /* 0xee */ - "reserved0EF", /* 0xef */ - "reserved0F0", /* 0xf0 */ - "reserved0F1", /* 0xf1 */ - "reserved0F2", /* 0xf2 */ - "reserved0F3", /* 0xf3 */ - "reserved0F4", /* 0xf4 */ - "reserved0F5", /* 0xf5 */ - "reserved0F6", /* 0xf6 */ - "reserved0F7", /* 0xf7 */ - "reserved0F8", /* 0xf8 */ - "reserved0F9", /* 0xf9 */ - "reserved0FA", /* 0xfa */ - "reserved0FB", /* 0xfb */ - "reserved0FC", /* 0xfc */ - "reserved0FD", /* 0xfd */ - "reserved0FE", /* 0xfe */ - "reserved0FF", /* 0xff */ -}; - -#define GEN_INDEX(a) ((((FxU32) a) - ((FxU32) gc->reg_ptr)) >> 2) - -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 index = GEN_INDEX(addr); - - GDBG_INFO(gc->myLevel + 199, "Storing to FIFO:\n"); - GDBG_INFO(gc->myLevel + 199, " FIFO Ptr: 0x%x : 0x%X\n", fifoPtr, gc->cmdTransportInfo.fifoRoom); - if (index <= 0xff) { - GDBG_INFO(gc->myLevel + 199, " Reg Name: %s\n", cvgRegNames[index]); - GDBG_INFO(gc->myLevel + 199, " Reg Num: 0x%X\n", index); - } else { - const char* strP; - const FxU32 offset = (addr - (FxU32)gc->reg_ptr); - - if (offset >= HW_TEXTURE_OFFSET) { - strP = "Texture"; - } else if (offset >= HW_LFB_OFFSET) { - strP = "LFB"; - index = addr; - } else if (offset >= HW_FIFO_OFFSET) { - strP = "Cmd FIFO"; - } else { - strP = "Woah!"; - } - GDBG_INFO(gc->myLevel + 199, " %s Addr: 0x%X\n", - strP, index); - } - GDBG_INFO(gc->myLevel + 199, " Value: 0x%X 0x%X\n", (index << 2), val); - - GDBG_INFO(120, " SET(0x%X, %ld(0x%X)) 0 %s (0x%X)\n", - 0x10000000UL + (FxU32)(index << 2), val, val, - cvgRegNames[index & 0xFF], fifoPtr); -} /* _grFifoWriteDebug */ - -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 index = GEN_INDEX(addr); - - GDBG_INFO(gc->myLevel + 200, "Storing to FIFO:\n"); - GDBG_INFO(gc->myLevel + 200, " FIFO Ptr: 0x%x\n", fifoPtr); - if (index <= 0xff) { - GDBG_INFO(gc->myLevel + 200, " Reg Name: %s\n", cvgRegNames[index]); - GDBG_INFO(gc->myLevel + 200, " Reg Num: 0x%x\n", index); - } - GDBG_INFO(gc->myLevel + 200, " Value: %4.2f\n", val); - - GDBG_INFO(120, " SET(0x%X, %4.2f (0x%X)) 0 %s\n", - 0x10000000UL + (FxU32)(index << 2), val, *(const FxU32*)&val, - cvgRegNames[index & 0xFF]); -} /* _grFifoFWriteDebug */ - -extern void -_grCVGFifoDump_TriHdr(const FxU32 hdrVal) -{ - GR_DCL_GC; - - /* Dump Packet Header */ - GDBG_INFO(gc->myLevel + 200, "CMD Fifo Triangle Packet (0x%X)\n", hdrVal); - GDBG_INFO(gc->myLevel + 200, " # Vertex: 0x%X\n", - (hdrVal & SSTCP_PKT3_NUMVERTEX) >> SSTCP_PKT3_NUMVERTEX_SHIFT); - GDBG_INFO(gc->myLevel + 200, " RGB: %s\n", - (hdrVal & SSTCP_PKT3_PACKEDCOLOR) ? "Packed" : "Separate"); - - GDBG_INFO(gc->myLevel + 200, " StripMode: %s\n", - (((hdrVal & (0x01 << 22)) == 0) ? "Strip" : "Fan")); - - GDBG_INFO(gc->myLevel + 200, " Culling: %s\n", - (((hdrVal & (0x01 << 23)) == 0) ? "Disable" : "Enable")); - - GDBG_INFO(gc->myLevel + 200, " CullingSign: %s\n", - (((hdrVal & (0x01 << 24)) == 0) ? "Positive" : "Negative")); - - GDBG_INFO(gc->myLevel + 200, " PingPongSign: %s\n", - (((hdrVal & (0x01 << 25)) == 0) ? "Normal" : "Disable")); - - if (GDBG_GET_DEBUGLEVEL(gc->myLevel + 200)) { - const FxU32 temp = (hdrVal & SSTCP_PKT3_PMASK); - int i; - - GDBG_INFO(gc->myLevel + 200, " Params: X Y"); - - for(i = 10; i <= 17; i++) { - static const char* paramSel[] = { "RGB", "Alpha", "Z", "Wb", "W0", "ST[0]", "W1", "ST[1]" }; - - if ((temp & (0x01UL << i)) != 0) GDBG_PRINTF("%s ", paramSel[i - 10]); - } - GDBG_INFO(gc->myLevel + 200, "\n"); - } - - { - const FxU32 temp = (hdrVal & SSTCP_PKT3_CMD) >> SSTCP_PKT3_CMD_SHIFT; - const char* tempStr; - - switch(temp) { - case 0x00: tempStr = "Independent"; break; - case 0x01: tempStr = "NewStrip"; break; - case 0x02: tempStr = "ContinueStrip"; break; - default: tempStr = "Reserved"; break; - } - GDBG_INFO(gc->myLevel + 200, " Command: 0x%X(%s)\n", temp, tempStr); - } -} - -extern void -_grCVGFifoDump_Linear(const FxU32* const linearPacketAddr) -{ - -} - -void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args) -{ - static FxBool inProcP = FXFALSE; - - if (!inProcP) { - static char errMsgBuf[1024]; - - inProcP = FXTRUE; - { - extern void (*GrErrorCallback)( const char *string, FxBool fatal ); - - vsprintf(errMsgBuf, format, args); - (*GrErrorCallback)(errMsgBuf, (GETENV("FX_ERROR_FAIL") != NULL)); - } - inProcP = FXFALSE; - } -} - -#endif /* GDBG_INFO_ON */ - -#if USE_PACKET_FIFO - -/* Routines privately exported so that the manufacturing diags - * and other things can do register writes etc w/o having access - * to the glide internals etc. - */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val) -{ -#define FN_NAME "_grSet32" - GR_DCL_GC; - - GR_ASSERT(sstAddr >= gc->base_ptr); - GR_ASSERT(sstAddr < &SST_TMU(gc->reg_ptr, GR_TMU0)->status); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET_INDEX(BROADCAST_ID, gc->reg_ptr, (sstAddr - gc->reg_ptr), val); - GR_CHECK_SIZE(); -#undef FN_NAME -} - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr) -{ - return GR_GET(*sstAddr); -} - -#if FIFO_ASSERT_FULL -const FxU32 kFifoCheckMask = 0xFFFF; -FxU32 gFifoCheckCount = 0; -#endif - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine) -{ -#define FN_NAME "_FifoMakeRoom" - FxU32 wrapAddr = 0x00UL; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 400); - - GR_ASSERT(blockSize > 0); - GR_ASSERT((FxU32)blockSize < gc->cmdTransportInfo.fifoSize); - FIFO_ASSERT(); - - /* Update the roomToXXX values w/ the # of writes since the last - * fifo stall/wrap. - */ - { - const FxI32 writes = (MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd) - - gc->cmdTransportInfo.fifoRoom); - - gc->cmdTransportInfo.roomToReadPtr -= writes; - gc->cmdTransportInfo.roomToEnd -= writes; - -#if GDBG_INFO_ON - GDBG_INFO_MORE(gc->myLevel, ": (%s : %d)\n" - "\tfifoBlock: (0x%X : 0x%X)\n" - "\tfifoRoom: (0x%X : 0x%X) : (0x%X : 0x%X)\n" - "\tfifo hw: (0x%X : 0x%X)\n", - ((fName == NULL) ? "Unknown" : fName), fLine, - (FxU32)gc->cmdTransportInfo.fifoPtr, blockSize, - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRoom, writes, - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead); - -#if !GLIDE_INIT_HAL - if (gc->scanline_interleaved) { - SstRegs* slaveHw = (SstRegs*)gc->slave_ptr; - - GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n", - HW_FIFO_PTR(FXFALSE), - GR_GET(slaveHw->cmdFifoDepth), - GR_GET(slaveHw->cmdFifoHoles), - GR_GET(slaveHw->status)); - } -#endif /* !GLIDE_INIT_HAL */ -#endif /* GDBG_INFO_ON */ - - ASSERT_FAULT_IMMED((gc->cmdTransportInfo.roomToReadPtr >= 0) && - (gc->cmdTransportInfo.roomToEnd >= 0)); - } - -again: - /* do we need to stall? */ - { - FxU32 lastHwRead = gc->cmdTransportInfo.fifoRead; - FxI32 roomToReadPtr = gc->cmdTransportInfo.roomToReadPtr; - - while (roomToReadPtr < blockSize) { - FxU32 curReadPtr = HW_FIFO_PTR(FXTRUE); - FxU32 curReadDist = curReadPtr - lastHwRead; - - GR_ASSERT((curReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (curReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd)); - -#if !GLIDE_INIT_HAL - /* If we're in an sli configuration then we need to make sure - * that we don't catch up to either the slave as well. - */ - if (gc->scanline_interleaved) { - const FxU32 slaveReadPtr = HW_FIFO_PTR(FXFALSE); - const FxU32 slaveReadDist = (slaveReadPtr - lastHwRead); - FxI32 distSlave = (FxI32)slaveReadDist; - FxI32 distMaster = (FxI32)curReadDist; - - GR_ASSERT((slaveReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (slaveReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd)); - - /* Get the actual absolute distance to the respective fifo ptrs */ - if (distSlave < 0) distSlave += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - if (distMaster < 0) distMaster += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - - /* Is the slave closer than the master? */ - if (distSlave < distMaster) { -#if GDBG_INFO_ON - { - SstRegs* slaveHw = (SstRegs*)gc->slave_ptr; - GDBG_INFO(gc->myLevel, " Wait sli: 0x%X : (0x%X : 0x%X : 0x%X)\n" - "\tMaster: 0x%X : 0x%X\n" - "\tSlave : 0x%X : 0x%X\n", - HW_FIFO_PTR(FXFALSE), - GR_GET(slaveHw->cmdFifoDepth), - GR_GET(slaveHw->cmdFifoHoles), - GR_GET(slaveHw->status), - curReadPtr, curReadDist, - slaveReadPtr, slaveReadDist); - } -#endif /* GDBG_INFO_ON */ - - curReadDist = slaveReadDist; - curReadPtr = slaveReadPtr; - } - } -#endif /* !GLIDE_INIT_HAL */ - - roomToReadPtr += curReadDist; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_USE_DEBUG_FIFO - _GlideRoot.stats.fifoStalls++; - _GlideRoot.stats.fifoStallDepth += GR_GET(hw->cmdFifoDepth); -#endif - /* Have we wrapped yet? */ - if (lastHwRead > curReadPtr) roomToReadPtr += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - lastHwRead = curReadPtr; - } - - GR_ASSERT((lastHwRead >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (lastHwRead < (FxU32)gc->cmdTransportInfo.fifoEnd)); - - /* Update cached copies */ - gc->cmdTransportInfo.fifoRead = lastHwRead; - gc->cmdTransportInfo.roomToReadPtr = roomToReadPtr; - - GDBG_INFO(gc->myLevel, " Wait: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - } - - /* Do we need to wrap to front? */ - if (gc->cmdTransportInfo.roomToEnd <= blockSize) { - GDBG_INFO(gc->myLevel + 10, " Pre-Wrap: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - - /* Set the jsr packet. - * NB: This command must be fenced. - */ - FIFO_ASSERT(); - { - SET(*gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoJmpHdr); - P6FENCE; - } - FIFO_ASSERT(); - - wrapAddr = (FxU32)gc->cmdTransportInfo.fifoPtr; - - /* Update roomXXX fields for the actual wrap */ - gc->cmdTransportInfo.roomToReadPtr -= gc->cmdTransportInfo.roomToEnd; - gc->cmdTransportInfo.roomToEnd = gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_USE_DEBUG_FIFO - _GlideRoot.stats.fifoWraps++; - _GlideRoot.stats.fifoWrapDepth += GR_GET(hw->cmdFifoDepth); -#endif - - /* Reset fifo ptr to start */ - gc->cmdTransportInfo.fifoPtr = gc->cmdTransportInfo.fifoStart; - -#if GLIDE_USE_SHADOW_FIFO - { - FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowPtr; - - while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2)) - *fifoPtr++ = 0x00UL; - gc->cmdTransportInfo.fifoShadowPtr = gc->cmdTransportInfo.fifoShadowBase; - } -#endif /* GLIDE_USE_SHADOW_FIFO */ - - GDBG_INFO(gc->myLevel + 10, " Post-Wrap: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - - goto again; - } - - /* compute room left */ - gc->cmdTransportInfo.fifoRoom = MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd); - -#if GDBG_INFO_ON -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - GDBG_INFO(gc->myLevel, FN_NAME"_Done:\n" - "\tfifoBlock: (0x%X : 0x%X)\n" - "\tfifoRoom: (0x%X : 0x%X : 0x%X)\n" - "\tfifo hw: (0x%X : 0x%X) : (0x%X : 0x%X : 0x%X)\n", - (FxU32)gc->cmdTransportInfo.fifoPtr, blockSize, - gc->cmdTransportInfo.roomToReadPtr, - gc->cmdTransportInfo.roomToEnd, gc->cmdTransportInfo.fifoRoom, - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead, - GR_GET(hw->cmdFifoDepth), GR_GET(hw->cmdFifoHoles), GR_GET(hw->status)); -#endif - -#if !GLIDE_INIT_HAL - if (gc->scanline_interleaved) { - SstRegs* slaveHw = (SstRegs*)gc->slave_ptr; - - GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n", - HW_FIFO_PTR(FXFALSE), - GR_GET(slaveHw->cmdFifoDepth), - GR_GET(slaveHw->cmdFifoHoles), - GR_GET(slaveHw->status)); - } -#endif /* !GLIDE_INIT_HAL */ -#endif /* GDBG_INFO_ON */ - - FIFO_ASSERT(); - GR_TRACE_EXIT(FN_NAME); -#undef FN_NAME -} - -extern void -_grGetCommandTransportInfo(GrCmdTransportInfo* info) -{ - GR_DCL_GC; - - GR_ASSERT(info != NULL); - *info = gc->cmdTransportInfo; -} - -#endif /* USE_PACKET_FIFO */ diff --git a/glide2x/cvg/glide/src/fxbldno.c b/glide2x/cvg/glide/src/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/cvg/glide/src/fxbldno.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - * - * $Header$ - * $Log$ - * - * 1 7/25/97 9:05a Pgj - * generate fxbldno.h which defines BUILD_NUMBER - * - */ - -#include -#include -#include - -main(int argc, char **argv) -{ - struct tm locTime; - time_t sysTime; - char *build; - - time(&sysTime); - locTime = *localtime(&sysTime); - - if (build = getenv("BUILD_NUMBER")) { - printf("#define BUILD_NUMBER %s\n", build); - } else { - unsigned short magic; - magic = (locTime.tm_yday << 7) | - (locTime.tm_hour << 2) | - (locTime.tm_min / 15); - printf("#define BUILD_NUMBER %d\n", magic); - } - return 0; - -} /* end main() */ diff --git a/glide2x/cvg/glide/src/fxgasm.c b/glide2x/cvg/glide/src/fxgasm.c deleted file mode 100644 index 51c51b4..0000000 --- a/glide2x/cvg/glide/src/fxgasm.c +++ /dev/null @@ -1,208 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#define NEWLINE printf("\n") -#define COMMENT printf(";----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("; Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) - -#else - -#define NEWLINE printf("\n"); -#define COMMENT printf("#----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("# Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t .EQU %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t .EQU %08x\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t .EQU %10d\n",pname,sizeof(p)) -#endif - -int -main (int argc, char **argv) -{ - int hex=0; /* default is print in decimal */ - static struct _GlideRoot_s gr; - static GrGC gc; - -#if !GLIDE_HW_TRI_SETUP - static SstRegs sst; - static struct dataList_s dl; -#endif /* !GLIDE_HW_TRI_SETUP */ - - if (argc > 1) { - if (strcmp("-inline", argv[1]) == 0) { - SstRegs dummyRegs = { 0x00UL }; - - printf("#ifndef __FX_INLINE_H__\n"); - printf("#define __FX_INLINE_H__\n"); - printf("\n"); - -#if GLIDE_DISPATCH_SETUP - printf("#define kCurGCOffset 0x%XUL\n", - offsetof(struct _GlideRoot_s, curGC)); - - printf("#define kTriProcOffset 0x%XUL\n", - offsetof(struct GrGC_s, cmdTransportInfo.triSetupProc)); - printf("#define kTriProcOffsetClean %d\n", - offsetof(struct GrGC_s, cmdTransportInfo.triSetupProc)); -#endif /* GLIDE_DISPATCH_SETUP */ - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\n", - sizeof(dummyRegs.fogTable) >> 1); - - printf("\n"); - printf("#endif /* __FX_INLINE_H__ */\n"); - - return 0; - } - - hex = 1; - } - - HEADER ("SSTREGS"); - - NEWLINE; - HEADER ("GC"); - OFFSET (gc,base_ptr,"base_ptr\t"); - OFFSET (gc,reg_ptr,"reg_ptr\t\t"); - OFFSET (gc,lfb_ptr,"lfb_ptr\t\t"); - OFFSET (gc,state.cull_mode,"cull_mode\t"); - OFFSET (gc, regDataList,"regDataList\t"); - OFFSET (gc, tsuDataList,"tsuDataList\t"); - OFFSET (gc, cmdTransportInfo.triPacketHdr, "triPacketHdr"); - OFFSET (gc, cmdTransportInfo.cullStripHdr, "cullStripHdr"); - OFFSET (gc, cmdTransportInfo.paramMask, "paramMask"); - - OFFSET (gc, cmdTransportInfo.fifoStart, "fifoStart"); - OFFSET (gc, cmdTransportInfo.fifoEnd, "fifoEnd"); - OFFSET (gc, cmdTransportInfo.fifoOffset, "fifoOffset"); - OFFSET (gc, cmdTransportInfo.fifoSize, "fifoSize"); - OFFSET (gc, cmdTransportInfo.fifoJmpHdr, "fifoJmpHdr"); - OFFSET (gc, cmdTransportInfo.fifoPtr, "fifoPtr"); - OFFSET (gc, cmdTransportInfo.fifoRead, "fifoRead"); - - OFFSET (gc, cmdTransportInfo.fifoRoom, "fifoRoom"); - OFFSET (gc, cmdTransportInfo.roomToReadPtr, "roomToReadPtr"); - OFFSET (gc, cmdTransportInfo.roomToEnd, "roomToEnd"); - - OFFSET (gc, cmdTransportInfo.fifoLfbP, "fifoLfbP"); - OFFSET (gc, cmdTransportInfo.lfbLockCount, "lfbLockCount"); - - SIZEOF (gr.GCs[0].state,"GrState\t"); - SIZEOF (gr.hwConfig,"GrHwConfiguration"); - SIZEOF (gr.GCs[0],"GC\t"); - NEWLINE; - - HEADER ("GlideRoot"); - OFFSET (gr,p6Fencer,"p6Fencer\t"); - OFFSET (gr,current_sst,"current_sst\t"); - OFFSET (gr,CPUType,"CPUType\t\t"); - OFFSET (gr,curGC,"curGC\t\t"); - OFFSET (gr,curTriSize,"curTriSize\t"); - - OFFSET (gr,stats.trisProcessed,"trisProcessed\t"); - OFFSET (gr,stats.trisDrawn,"trisDrawn\t"); - -#if GLIDE_PACKED_RGB - OFFSET (gr, pool.ftemp1, "fTemp1"); - OFFSET (gr, pool.ftemp2, "fTemp2"); - OFFSET (gr, pool.fBiasHi,"fBiasHi"); - OFFSET (gr, pool.fBiasLo,"fBiasLo"); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_PACKED_RGB */ - - SIZEOF (gr,"GlideRoot"); - NEWLINE; - - HEADER ("GrVertex"); - { - GrVertex v; - - OFFSET(v, x, "x"); - OFFSET(v, y, "y"); - OFFSET(v, r, "r"); - OFFSET(v, g, "g"); - OFFSET(v, b, "b"); - OFFSET(v, a, "a"); - SIZEOF(v, "GrVertex"); - } - NEWLINE; - -#if !GLIDE_HW_TRI_SETUP - HEADER ("dataList"); - OFFSET (dl,i,"dl_i\t\t"); - OFFSET (dl,addr,"dl_addr\t\t"); - SIZEOF (dl,"dataList\t"); - NEWLINE; -#endif /* !GLIDE_HW_TRI_SETUP */ - - return 0; -} diff --git a/glide2x/cvg/glide/src/fxglide.h b/glide2x/cvg/glide/src/fxglide.h deleted file mode 100644 index 06160e2..0000000 --- a/glide2x/cvg/glide/src/fxglide.h +++ /dev/null @@ -1,2391 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 206 6/06/98 12:06p Peter -** gmt's trilinear hell bug -** -** 205 5/20/98 4:26p Peter -** one more direct register write fix -** -** 204 5/20/98 3:51p Peter -** no fifo glide -** -** 203 5/18/98 12:16p Peter -** culling enabling -** -** 202 4/01/98 2:57p Peter -** removed voodoo^2 strings -** -** 201 4/01/98 1:51p Peter -** fixed resetting unused tmu muckage -** -** 200 3/31/98 6:09p Peter -** sli origin everywhere (I think) and grLfbReadRegion/grRenderBuffer vs -** triple buffering -** -** 199 3/23/98 5:57p Peter -** fixed FX_CALL -** -** 198 3/17/98 6:50p Peter -** sli paired vs active -** -** 197 3/17/98 3:00p Peter -** removed unused stats -** -** 196 3/17/98 1:57p Atai -** added boardid and requireoemdll registry -** -** 195 3/14/98 1:07p Peter -** mac port happiness -** -** 194 3/13/98 2:56p Atai -** added oeminfo in GC -** -** 193 3/13/98 1:26p Peter -** re-fixed shadowing -** -** 192 3/09/98 3:16p Peter -** removed debugging code accidentally checked in -** -** 191 3/09/98 2:24p Peter -** change for new pci passthrough interface -** -** 190 3/03/98 9:37p Peter -** more sli origin fun -** -** 189 3/02/98 7:22p Peter -** more crybaby stuff -** -** 188 2/24/98 10:15a Peter -** oem dll muckage -** -** 187 2/20/98 5:31p Peter -** crybaby glide -** -** 186 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 185 2/20/98 9:05a Peter -** removed remnants of comdex grot -** -** 184 2/19/98 5:53p Peter -** moved structure def for hanson -** -** 183 2/17/98 12:39p Peter -** sli monitor detect thing -** -** 182 2/12/98 3:40p Peter -** single buffering for opengl -** -** 181 2/11/98 5:26p Peter -** new write edge stuff -** -** 180 2/04/98 6:57p Atai -** added fxoem2x.dll for cvg -** -** 179 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 178 1/30/98 4:23p Peter -** renamed curSwapBuf->curRenderBuf for clarity -** -** 177 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 176 1/16/98 7:03p Peter - * fixed volatile - * - * 175 1/16/98 10:47a Peter - * fixed idle muckage - * - * 174 1/15/98 1:12p Peter - * dispatch w/o packing - * - * 173 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 172 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 168 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 167 1/07/98 10:22a Peter - * lod dithering env var - * - * 166 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 165 1/05/98 6:06p Atai - * glide extension stuff - * - * 164 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 163 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 162 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 160 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 156 12/09/97 12:20p Peter - * mac glide port - * - * 155 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 154 12/09/97 9:46a Atai - * added viewport varibales - * - * 152 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 151 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 150 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 149 11/19/97 4:33p Atai - * #define GLIDE3_VERTEX_LAYOUT 1 - * - * 148 11/19/97 3:51p Dow - * Tex stuff for h3, def of GETENV when using fxHal - * - * 147 11/18/97 6:11p Peter - * fixed glide3 muckage - * - * 146 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 145 11/18/97 3:25p Atai - * redefine vData - * - * 144 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 143 11/15/97 7:43p Peter - * more comdex silliness - * - * 142 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 141 11/14/97 5:02p Peter - * more comdex stuff - * - * 140 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 139 11/12/97 2:35p Peter - * fixed braino - * - * 138 11/12/97 2:27p Peter - * - * 137 11/12/97 11:38a Dow - * - * 136 11/12/97 11:15a Peter - * fixed tri/strip param send and used cvgdef.h constant - * - * 135 11/12/97 9:21a Dow - * Changed offset defs to those in h3defs.h - * - * 134 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 133 11/06/97 3:46p Peter - * dos ovl build problem - * - * 132 11/06/97 3:38p Dow - * More banshee stuff - * - * 131 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 130 11/04/97 5:04p Peter - * cataclysm part deux - * - * 129 11/04/97 4:00p Dow - * Banshee Mods - * - * 128 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 127 10/29/97 2:45p Peter - * C version of Taco's packing code - * -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include -#include -#include - -#include <3dfx.h> -#include -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_H3) -#include - -/* Compilation hacks for h3 */ - -/* Reserved fbzMode bits */ -#define SST_DRAWBUFFER_SHIFT 14 -#define SST_DRAWBUFFER (0x3 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_FRONT (0 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_BACK (1 << SST_DRAWBUFFER_SHIFT) - -/* Reserved lfbMode bits */ -#define SST_LFB_WRITEBUFSELECT_SHIFT 4 -#define SST_LFB_WRITEBUFSELECT (0x3< -#else -#error "Unknown HAL hw layer" -#endif - -#if GLIDE_INIT_HAL - -#include - -#ifdef GETENV -#undef GETENV -#endif -#define GETENV getenv - -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -extern FxU32 p6FenceVar; - -/* dpc - 2 june 1997 - * Moved the fence check out to avoid empty if body warning w/ gcc. - * This only applies to systems that require the p6 fencing. - */ -#define P6FENCE_CHECK if (i & 2) P6FENCE - -#if defined(__WATCOMC__) -void -p6Fence(void); -#pragma aux p6Fence = \ - "xchg eax, p6FenceVar" \ - modify [eax]; - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -#define P6FENCE {_asm xchg eax, p6FenceVar} -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ -#else /* !defined(GLIDE_INIT_HAL) */ - -/* All sst1init refs need to be protected inside - GLIDE_PLATFORM & GLIDE_HW_CVG - */ - -#include -/* dpc - 5 sep 1997 - FixMe! - * Currently we're mapping directly to the init code layer - * through the sst1XXX calls. - * - * #include - */ -#endif /* !defined(GLIDE_INIT_HAL) */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -typedef sst1VideoTimingStruct FxVideoTimingInfo; -#endif - -#if GLIDE_INIT_HAL -#define PLATFORM_IDLE_HW(__hwPtr) fxHalIdleNoNOP(__hwPtr) -#define IDLE_HW(__hwPtr) \ -do { \ - { \ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); \ - GR_SET(BROADCAST_ID, __hwPtr, nopCMD, 0); \ - GR_CHECK_SIZE(); \ - } \ - PLATFORM_IDLE_HW(__hwPtr); \ -} while(0) -#else /* !GLIDE_INIT_HAL */ -#define IDLE_HW(__hwPtr) sst1InitIdle((FxU32*)__hwPtr) -#endif /* !GLIDE_INIT_HAL */ - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#include "oeminit.h" -#endif - -#define GR_SKIP_OEMDLL 0xee1feef -#define GR_NO_OEMDLL 0xee1feed - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -/* Make sure GR_FLUSH_STATE is a noop if not Glide 3 */ -#define GR_FLUSH_STATE() - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s -{ - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct{ - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - FxU32 chromaRange; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct tmu_config_t { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - - FxU32 - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxU32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ -}; - -typedef struct GrGC_s -{ - FxU32 - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - -#define kMaxVertexParam (20 + (12 * GLIDE_NUM_TMU) + 3) - struct dataList_s { - int i; - FxFloat* addr; - } regDataList[kMaxVertexParam]; - int tsuDataList[kMaxVertexParam]; - - GrState - state; /* state of Glide/SST */ - - struct cmdTransportInfo { - FxU32 triPacketHdr; /* Pre-computed packet header for - * independent triangles. - */ - - FxU32 cullStripHdr; /* Pre-computed packet header for generic - * case of packet 3 triangles. This needs - * command type and # of vertices to be complete. - */ - - FxU32 paramMask; /* Mask for specifying parameters of - * non-triangle packets. The parameter - * bits[21:10] mimic the packet3 header - * controlling which fields are sent, and - * pc[28] controls whether any color - * information is sent as packed. - */ - - /* Basic command fifo characteristics. These should be - * considered logically const after their initialization. - */ - FxU32* fifoStart; /* Virtual address of start of fifo */ - FxU32* fifoEnd; /* Virtual address of fba fifo */ - FxU32 fifoOffset; /* Offset from hw base to fifo start */ - FxU32 fifoSize; /* Size in bytes of the fifo */ - FxU32 fifoJmpHdr; /* Type0 packet for jmp to fifo start */ - - FxU32* fifoPtr; /* Current write pointer into fifo */ - FxU32 fifoRead; /* Last known hw read ptr. - * This is the sli master, if enabled. - */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - FxI32 fifoRoom; /* Space until next fifo check */ - FxI32 roomToReadPtr;/* Bytes until last known hw ptr */ - FxI32 roomToEnd; /* # of bytes until last usable address before fifoEnd */ - - FxBool fifoLfbP; /* Do we expect lfb writes to go through the fifo? */ - FxBool lfbLockCount; /* Have we done an lfb lock? Count of the locks. */ - -#if GLIDE_DISPATCH_SETUP - FxI32 (FX_CALL *triSetupProc)(const GrVertex* a, const GrVertex* b, const GrVertex* c); -#endif /* GLIDE_DISPATCH_SETUP */ - -#if GLIDE_USE_SHADOW_FIFO - FxU32* fifoShadowBase; /* Buffer that shadows the hw fifo for debugging */ - FxU32* fifoShadowPtr; -#endif /* GLIDE_USE_SHADOW_FIFO */ - } cmdTransportInfo; - - union hwDep_u { - FxU32 noHwDep; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - struct cvgDep_s { -#if GLIDE_BLIT_CLEAR - /* xTilePages, yTileShift, tileSlopP, and numBufferPages are set - * in grSstWinOpen, and should be considered logically const - * until grSstWinClose at which point they are invalid. - * - * NB: The calculation of these values etc should really be - * moved into the init code at some point in my near future. - */ - FxU32 xTilePages; /* # of pages for video tiles in the x direction, - * the x-dimension of a tile is alwasy 32 pixels. - * Cons-ed up from fbiInit1[24], fbiInit1[7:4], and - * fbiInit6[30] in grSstWinOpen after all of the - * buffers etc are allocated. - */ - - FxBool tileSlopP; /* Set if the actual # of video tiles in the x - * direction will not evenly fit into a page. - * - * FixMe: Will this ever happen? - */ - - FxU32 yTileShift; /* (0x01UL << yTileShift) is the # of lines in a - * tile. This is dependent on the sli-ness of the - * board. - */ - - FxU32 numBufferPages;/* The number of pages used for an entire - * buffer (color or aux). - */ -#endif /* GLIDE_BLIT_CLEAR */ - - FxU32 renderBuf; /* Cached value of the current buffer swapped by the - * user via grBufferSwap. Legal values are - * [0 .. gc->state.num_buffers - 1]. - * - * NB: We need this because the current buffer - * availible in the status register lags the actual - * value due to the command fifo asynchrony (is that - * a word?). - */ - - FxU32 frontBuf; - FxU32 backBuf; - - /* CVG cannot really do single buffering */ - FxBool singleBufferP; - - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. There is some ugliness now in grSstOrigin and grSwapBuffer - * to deal w/ this correctly. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - FxU32 sliOriginBufCount; - - /* Keep track of which tmu's we have set the lod to be the - * minimum possible to avoid texture thrashing. - */ - FxBool tmuLodDisable[GLIDE_NUM_TMU]; - } cvgDep; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - } hwDep; - - /* lfb config */ - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu, /* number of TMUs attached */ - grColBuf, - grAuxBuf; - - /* sli config */ - FxBool sliPairP; /* Part of an sli pair? */ - FxBool scanline_interleaved; /* Enable sli for this pair */ - FxBool swapMasterSenseP; /* Swapped master and slave pointers */ - - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - FxU32 checkCounter; - FxU32 checkPtr; - - FxVideoTimingInfo* vidTimings;/* init code overrides */ - - FxBool open; /* Has GC Been Opened? */ - FxBool hwInitP; /* Has the hw associated w/ GC been initted and mapped? - * This is managed in _grDetectResources:gpci.c the first - * time that the board is detected, and in grSstWinOpen:gsst.c - * if the hw has been shutdown in a call to grSstWinClose. - */ - /* Oem Dll data */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - void *oemInit; - OemInitInfo oemi; -#endif -} GrGC; - -/* NOTE: this changes the P6FENCE macro expansion from sst1init.h !!! */ -#define p6FenceVar _GlideRoot.p6Fencer - -/* if we are debugging, call a routine so we can trace fences */ -#ifdef GLIDE_DEBUG -#define GR_P6FENCE _grFence(); -#else -#define GR_P6FENCE P6FENCE -#endif - -/* -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - - FxI32 curTriSize; /* the size in bytes of the current triangle */ -#if GLIDE_HW_TRI_SETUP - FxI32 curVertexSize; /* Size in bytes of a single vertex's parameters */ -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - FxU32 paramCount; - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - -#if GLIDE_PACKED_RGB -#define kPackBiasA _GlideRoot.pool.fBiasHi -#define kPackBiasR _GlideRoot.pool.fBiasHi -#define kPackBiasG _GlideRoot.pool.fBiasHi -#define kPackBiasB _GlideRoot.pool.fBiasLo - -#define kPackShiftA 16UL -#define kPackShiftR 8UL -#define kPackShiftG 0UL -#define kPackShiftB 0UL - -#define kPackMaskA 0x00FF00UL -#define kPackMaskR 0x00FF00UL -#define kPackMaskG 0x00FF00UL -#define kPackMaskB 0x00FFUL - - float fBiasHi; - float fBiasLo; -#endif /* GLIDE_PACKED_RGB */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - FxBool texLodDither; /* Always do lod-dithering */ - - /* Force alternate buffer strategy */ - FxI32 nColorBuffer; - FxI32 nAuxBuffer; - } environment; - - struct { - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - - FxU32 nccDownloads; /* # of NCC palette download calls */ - FxU32 nccBytes; /* # of NCC palette bytes downloaded */ - -#if USE_PACKET_FIFO - FxU32 fifoWraps; - FxU32 fifoWrapDepth; - FxU32 fifoStalls; - FxU32 fifoStallDepth; -#endif /* USE_PACKET_FIFO */ - } stats; - - GrHwConfiguration hwConfig; - - FxU32 gcNum; /* # of actual boards mapped */ - FxU32 gcMap[MAX_NUM_SST]; /* Logical mapping between selectable - * sst's and actual boards. - */ - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ -}; - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ - type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_STATE_ENTRY(name, type, args) \ - GR_ENTRY(name, type, args) - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define GLIDE_DRIVER_NAME "Voodoo" -#else -#define GLIDE_DRIVER_NAME "Unknown" -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); - -#if GLIDE_DISPATCH_SETUP -FxI32 FX_CSTYLE -_trisetup_cull(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -#define TRISETUP_NORGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup \ - : _trisetup_cull) - -#if GLIDE_PACKED_RGB -FxI32 FX_CSTYLE -_trisetup_cull_rgb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_cull_argb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_rgb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_argb(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -#define TRISETUP_RGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup_rgb \ - : _trisetup_cull_rgb) -#define TRISETUP_ARGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \ - ? _trisetup_argb \ - : _trisetup_cull_argb) - -#else /* !GLIDE_PACKED_RGB */ -#define TRISETUP_RGB(__cullMode) TRISETUP_NORGB(__cullMode) -#define TRISETUP_ARGB(__cullMode) TRISETUP_NORGB(__cullMode) -#endif /* !GLIDE_PACKED_RGB */ -#define TRISETUP (*gc->cmdTransportInfo.triSetupProc) -#else /* !GLIDE_DISPATCH_SETUP */ -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -/* GMT: BUG need to make this dynamically switchable - That is not a bug. It is an opinion! - */ -#if GLIDE_USE_C_TRISETUP -# if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO -# define TRISETUP _trisetup_nogradients -# else /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -# define TRISETUP _trisetup_nogradients -# endif /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -#else /* !GLIDE_USE_C_TRISETUP */ -# define TRISETUP _trisetup_asm -#endif /* !GLIDE_USE_C_TRISETUP */ -#endif /* !GLIDE_DISPATCH_SETUP */ -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer(void); -#endif - -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor(GrColor_t *color); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode(FxBool delta0Mode); - -void -_doGrErrorCallback(const char *name, const char *msg, FxBool fatal); - -void _grErrorDefaultCallback(const char *s, FxBool fatal); - -#ifdef __WIN32__ -void _grErrorWindowsCallback(const char *s, FxBool fatal); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)(const char *string, FxBool fatal); - -void GR_CDECL -_grFence(void); - -int -_guHeapCheck(void); - -void FX_CSTYLE -_grRebuildDataList(void); - -void -_grReCacheFifo(FxI32 n); - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD(float value); - -void FX_CSTYLE -_grTexDetailControl(GrChipID_t tmu, FxU32 detail); - -void FX_CSTYLE -_grTexDownloadNccTable(GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end); - -void FX_CSTYLE -_grTexDownloadPalette(GrChipID_t tmu, - GuTexPalette *pal, - int start, int end); - -FxU32 -_grTexCalcBaseAddress( - FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask); - -void -_grTexForceLod(GrChipID_t tmu, int value); - -FxU32 -_grTexTextureMemRequired(GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd); - -void FX_CSTYLE -_grUpdateParamIndex(void); - -/* ddgump.c */ -void FX_CSTYLE -_gumpTexCombineFunction(int virtual_tmu); - -/* disst.c - this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/* glfb.c */ -extern FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data); - -/* gglide.c - Flushes the current state in gc->state.fbi_config to the hw. - */ -extern void -_grFlushCommonStateRegs(void); - -#if USE_PACKET_FIFO -/* cvg.c */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val); - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr); - -typedef struct cmdTransportInfo GrCmdTransportInfo; -extern void -_grGetCommandTransportInfo(GrCmdTransportInfo*); -#endif /* USE_PACKET_FIFO */ - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if GLIDE_DEBUG || GLIDE_ASSERT || GLIDE_SANITY_ASSERT || GLIDE_SANITY_SIZE -#define DEBUG_MODE 1 -// #include -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) - -#if ASSERT_FAULT -#define ASSERT_FAULT_IMMED(__x) if (!(__x)) { \ - *(FxU32*)NULL = 0; \ - _grAssert(#__x, __FILE__, __LINE__); \ - } -#else -#define ASSERT_FAULT_IMMED(__x) GR_ASSERT(__x) -#endif - -#if !USE_PACKET_FIFO -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n,p) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif USE_PACKET_FIFO -/* Stuff to manage the command fifo on cvg - * - * NB: All of the addresses are in 'virtual' address space, and the - * sizes are in bytes. - */ - -/* The Voodoo^2 fifo is 4 byte aligned */ -#define FIFO_ALIGN_MASK 0x03 - -/* We claim space at the end of the fifo for: - * 1 nop (2 32-bit words) - * 1 jmp (1 32-bit word) - * 1 pad word - */ -#define FIFO_END_ADJUST (sizeof(FxU32) << 3) - -/* NB: This should be used sparingly because it does a 'real' hw read - * which is *SLOW*. - * - * NB: This address is always in sli master relative coordinates. - */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_FIFO_PTR(__masterP)\ -((FxU32)gc->cmdTransportInfo.fifoStart + \ - (GET(((SstRegs*)((__masterP) \ - ? gc->reg_ptr \ - : gc->slave_ptr))->cmdFifoReadPtr) - \ - gc->cmdTransportInfo.fifoOffset)) -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -# define HW_FIFO_PTR(__masterP) \ - ((FxU32)gc->cmdTransportInfo.fifoStart +\ - (GET(((SstCRegs*)(gc->hwDep.h3Dep.cRegs))->cmdFifo0.readPtrL)) - \ - gc->cmdTransportInfo.fifoOffset) -#else -# error "Define HW_FIFO_PTR for this hardware!" -#endif - -#if FIFO_ASSERT_FULL -extern const FxU32 kFifoCheckMask; -extern FxU32 gFifoCheckCount; - -#define FIFO_ASSERT() \ -if ((gFifoCheckCount++ & kFifoCheckMask) == 0) { \ - const FxU32 cmdFifoDepth = GR_GET(((SstRegs*)(gc->reg_ptr))->cmdFifoDepth); \ - const FxU32 maxFifoDepth = ((gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST) >> 2); \ - if(cmdFifoDepth > maxFifoDepth) { \ - gdbg_printf(__FILE__"(%ld): cmdFifoDepth > size: 0x%X : 0x%X : (0x%X : 0x%X)\n", \ - __LINE__, cmdFifoDepth, maxFifoDepth, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - ASSERT_FAULT_IMMED(cmdFifoDepth <= maxFifoDepth); \ - } else if (cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) > maxFifoDepth) { \ - gdbg_printf(__FILE__"(%ld): cmdFifoDepth + fifoRoom > size: (0x%X : 0x%X) : 0x%X\n", \ - __LINE__, cmdFifoDepth, (gc->cmdTransportInfo.fifoRoom >> 2), maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) <= maxFifoDepth); \ - } \ -} \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) >= (FxU32)gc->cmdTransportInfo.fifoStart); \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) < (FxU32)gc->cmdTransportInfo.fifoEnd); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#else /* !FIFO_ASSERT_FULL */ -#define FIFO_ASSERT() \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#endif /* !FIFO_ASSERT_FULL */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine); - -#define GR_CHECK_FOR_ROOM(__n, __p) \ -do { \ - const FxU32 writeSize = (__n) + ((__p) * sizeof(FxU32)); /* Adjust for size of hdrs */ \ - ASSERT(((FxU32)(gc->cmdTransportInfo.fifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - ASSERT(writeSize < gc->cmdTransportInfo.fifoSize - sizeof(FxU32)); \ - FIFO_ASSERT(); \ - if (gc->cmdTransportInfo.fifoRoom < (FxI32)writeSize) { \ - GDBG_INFO(280, "Fifo Addr Check: (0x%X : 0x%X)\n", \ - gc->cmdTransportInfo.fifoRoom, writeSize); \ - _FifoMakeRoom(writeSize, __FILE__, __LINE__); \ - } \ - ASSERT((FxU32)gc->cmdTransportInfo.fifoRoom >= writeSize); \ - FIFO_ASSERT(); \ -} while(0) -#else -#error "GR_CHECK_FOR_ROOM not defined" -#endif - -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) - -#define GR_CHECK_FOR_ROOM(__n, __p) - -#endif /* GLIDE_PLATFORM & GLIDE_HW_?? */ - -#if GLIDE_SANITY_SIZE -#if USE_PACKET_FIFO - -#if GLIDE_USE_SHADOW_FIFO -#define GR_CHECK_SHADOW_FIFO \ - if ((gc != NULL) && (gc->cmdTransportInfo.fifoShadowPtr != NULL)) \ - ASSERT_FAULT_IMMED((((FxU32)gc->cmdTransportInfo.fifoPtr) & (kDebugFifoSize - 1)) == \ - (((FxU32)gc->cmdTransportInfo.fifoShadowPtr) & (kDebugFifoSize - 1))) -#else /* !GLIDE_USE_SHADOW_FIFO */ -#define GR_CHECK_SHADOW_FIFO -#endif /* !GLIDE_USE_SHADOW_FIFO */ - -#define GR_CHECK_FIFO_PTR() \ - if((FxU32)gc->cmdTransportInfo.fifoPtr != gc->checkPtr + gc->checkCounter) \ - GDBG_ERROR("GR_ASSERT_FIFO", "(%s : %d) : " \ - "fifoPtr should be 0x%X (0x%X : 0x%X) but is 0x%X\n", \ - __FILE__, __LINE__, \ - gc->checkPtr + gc->checkCounter, gc->checkPtr, gc->checkCounter, \ - gc->cmdTransportInfo.fifoPtr); \ - GR_CHECK_SHADOW_FIFO; \ - ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr == gc->checkPtr + gc->checkCounter) -#define GR_SET_FIFO_PTR(__n, __p) \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = ((__n) + ((__p) << 2)) -#else -#define GR_CHECK_FIFO_PTR() -#define GR_SET_FIFO_PTR(__n, __p) -#endif - -#define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - GR_CHECK_FIFO_PTR(); \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - -#define GR_SET_EXPECTED_SIZE(n,p) \ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM(n,p); \ - gc->expected_counter = n; \ - GR_SET_FIFO_PTR(n, p) - -#define GR_INC_SIZE(n) gc->counter += n -#else - /* define to do nothing */ - #define GR_CHECK_SIZE() - #define GR_SET_EXPECTED_SIZE(n,p) GR_CHECK_FOR_ROOM(n,p) - #define GR_INC_SIZE(n) -#endif - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->reg_ptr - -#ifdef DEBUG_MODE -#define ASSERT(exp) GR_ASSERT(exp) - -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - const FxI32 saveLevel = gc->myLevel; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - GDBG_INFO(gc->myLevel,myName); \ - FXUNUSED(saveLevel); \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) \ - gc->myLevel = saveLevel; \ - GDBG_INFO(281, "%s --done---------------------------------------\n", __n) -#define GR_TRACE_RETURN(__l, __n, __v) \ - gc->myLevel = saveLevel; \ - GDBG_INFO((__l), "%s() => 0x%x---------------------\n", (__n), (__v), (__v)) -#else /* !DEBUG_MODE */ -#define ASSERT(exp) -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) -#define GR_TRACE_RETURN(__l, __n, __v) -#endif /* !DEBUG_MODE */ - -#define GR_BEGIN(name,level,size, packetNum) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size, packetNum) - -#define GR_END() {GR_CHECK_SIZE(); GR_TRACE_EXIT(myName);} - -#define GR_RETURN(val) \ - if (GDBG_GET_DEBUGLEVEL(gc->myLevel)) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GR_TRACE_RETURN(gc->myLevel, myName, val); \ - return val - -#if defined(GLIDE_SANITY_ASSERT) -#define GR_ASSERT(exp) ((void)((!(exp)) ? (_grAssert(#exp, __FILE__, __LINE__),0) : 0xFFFFFFFF)) -#else -#define GR_ASSERT(exp) ((void)(0 && ((FxU32)(exp)))) -#endif - -#define INTERNAL_CHECK(__name, __cond, __msg, __fatalP) \ - if (__cond) _doGrErrorCallback(__name, __msg, __fatalP) - -#if defined(GLIDE_DEBUG) -#define GR_CHECK_F(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXTRUE) -#define GR_CHECK_W(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXFALSE) -#else -#define GR_CHECK_F(name,condition,msg) -#define GR_CHECK_W(name,condition,msg) -#endif - -#if GLIDE_CHECK_COMPATABILITY -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) INTERNAL_CHECK(__name, __cond, __msg, FXTRUE) -#else -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) GR_CHECK_F(__name, __cond, __msg) -#endif /* !GLIDE_CHECK_COMPATABILITY */ - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_COMPATABILITY(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - -void -_grAssert(char *, char *, int); - -#if USE_PACKET_FIFO -#ifdef GDBG_INFO_ON -void _grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void _grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else /* ~GDBG_INFO_ON */ -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif /* !GDBG_INFO_ON */ -#endif /* USE_PACKET_FIFO */ - -#if USE_PACKET_FIFO && GLIDE_USE_SHADOW_FIFO - -#undef SET -#define SET(d, s) \ -do { \ - GR_DCL_GC; \ - GR_DCL_HW; \ - volatile FxU32* __u32P = (volatile FxU32*)&(d); \ - const FxU32 __u32Val = (s); \ - if ((__u32P != &hw->swapbufferCMD) && (gc->cmdTransportInfo.fifoShadowPtr != NULL)) { \ - *gc->cmdTransportInfo.fifoShadowPtr++ = __u32Val; \ - } \ - *__u32P = __u32Val; \ -} while(0) - -#undef SETF -#define SETF(d, s) \ -do { \ - volatile float* __floatP = (volatile float*)(&(d)); \ - const float __floatVal = (s); \ - GR_DCL_GC; \ - if (gc->cmdTransportInfo.fifoShadowPtr != NULL) { \ - *(float*)gc->cmdTransportInfo.fifoShadowPtr = __floatVal; \ - gc->cmdTransportInfo.fifoShadowPtr++; \ - } \ - *__floatP = __floatVal; \ -} while(0) - -#undef SET16 -#define SET16(d, s) SET(d, (FxU32)s) -#endif /* USE_PACKET_FIFO && GLIDE_USE_DEBUG_FIFO */ - -#if SET_BSWAP -#undef GET -#undef GET16 -#undef SET -#undef SET16 -#undef SETF - -#if __POWERPC__ && defined(__MWERKS__) -#define GET(s) __lwbrx( (void*)&(s), 0 ) -#define GET16(s) __lwbrx( (void*)&(s), 0 ) -#define SET(d, s) __stwbrx((s), (void*)&(d), 0) -#define SET16(d, s) __sthbrx((s), (void*)&(d), 0 ) -#define SETF(d, s) \ - { \ - const float temp = (s); \ - __stwbrx( *((FxU32*)&temp), (void*)&(d), 0 ); \ - } -#define SET_LINEAR(d, s) SET((d), (s)) -#define SET_LINEAR_16(d, s) SET((d), ((((FxU32)(s)) >> 16UL) | \ - (((FxU32)(s)) << 16UL))) -#define SET_LINEAR_8(d, s) ((d) = (s)) -#else /* !defined(__MWERKS__) && POWERPC */ -#error "Define byte swapped macros for GET/SET" -#endif /* !defined(__MWERKS__) && POWERPC */ -#endif /* SET_BSWAP */ - -#if GLIDE_USE_DEBUG_FIFO -#define kDebugFifoSize 0x1000UL -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#ifndef SET_LINEAR -#define SET_LINEAR(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_16(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_8(__addr, __val) SET(__addr, __val) -#endif /* !defined(SET_LINEAR) */ - -/* Extract the fp exponent from a floating point value. - * NB: The value passed to this macro must be convertable - * into an l-value. - */ -#define kFPExpMask 0x7F800000UL -#define kFPZeroMask 0x80000000UL -#define kFPExpShift 0x17UL -#define FP_FLOAT_EXP(__fpVal) ((FxU32)(((*(const FxU32*)(&(__fpVal))) & kFPExpMask) >> kFPExpShift)) -#define FP_FLOAT_ZERO(__fpVal) (((*(const FxU32*)(&(__fpVal))) & ~kFPZeroMask) == 0x00) - -/* The two most commonly defined macros in the known universe */ -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Simple macro to make selecting a value against a boolean flag - * simpler w/o a conditional. - * - * NB: This requires that the boolean value being passed in be the - * result of one of the standard relational operators. - */ -#define MaskSelect(__b, __val) (~(((FxU32)(__b)) - 1UL) & (__val)) - -/* Chipfield ids that glide uses. */ -#define kChipFieldShift (8UL + 3UL) -typedef enum { - eChipBroadcast = 0x00UL, - eChipFBI = 0x01UL, - eChipTMU0 = 0x02UL, - eChipTMU1 = 0x04UL, - eChipTMU2 = 0x08UL, - eChipAltBroadcast = 0x0FUL, -} FifoChipField; - -#if GLIDE_CHIP_BROADCAST && (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define BROADCAST_ID eChipAltBroadcast -#else -#define BROADCAST_ID eChipBroadcast -#endif - -/* Although these are named reg_group_xxx they are generic options for - * grouping register writes and should be fine w/ and w/o the fifo - * being enabled. - */ -#if GDBG_INFO_ON -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _regMask = (__regMask); \ -const FxU32 _groupNum = (__groupNum); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstRegs, __regBase) - -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} -#else /* !GDBG_INFO_ON */ -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) -#endif /* !GDBG_INFO_ON */ - -#if GLIDE_HW_TRI_SETUP -enum { - kSetupStrip = 0x00, - kSetupFan = 0x01, - kSetupCullDisable = 0x00, - kSetupCullEnable = 0x02, - kSetupCullPositive = 0x00, - kSetupCullNegative = 0x04, - kSetupPingPongNorm = 0x00, - kSetupPingPongDisable = 0x08 -}; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if USE_PACKET_FIFO - -/* CVG has a problem when using the chipfield to address multiple - * tmu's and using the tsu which does not send things to different - * tmu's. We work around this by using broadcast 0xF rather than 0x0 - * in the chipfield. This macro should build a compile-time constant - * bit value that can be or-ed w/ any dynamic data. - */ -#define FIFO_REG(__chipField, __field) \ - ((((FxU32)offsetof(SstRegs, __field)) << 1) | \ - (((FxU32)(__chipField)) << kChipFieldShift)) - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, \ - (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - (0xFFFFFFFF >> (32 - (__groupNum))), \ - (((__groupNum) << SSTCP_PKT1_NWORDS_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_INC | \ - SSTCP_PKT1), \ - FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "REG_GROUP_BEGIN: (0x%X : 0x%X) : (0x%X - 0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - (__pktHdr), (__groupMask), \ - FIFO_REG(__chipId, __regBase), __chipId, offsetof(SstRegs, __regBase), \ - (FxU32)gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoRoom); \ - SET(*_regGroupFifoPtr++, (__pktHdr)) - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - FIFO_ASSERT(); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tGroupEnd: (0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - _regGroupFifoPtr, gc->cmdTransportInfo.fifoRoom, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - FIFO_ASSERT(); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - FxU32* noTsuFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - volatile FxU32* regBaseAddr = &hw->FvA.x; \ - FIFO_ASSERT(); \ - GR_ASSERT(__floatP); \ - SET(*noTsuFifoPtr++, ((kNumTriParam << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - SSTCP_INC | /* sequential writes */ \ - FIFO_REG(BROADCAST_ID, FvA.x) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: (fbiRegs->%svA : 0x%X)\n", \ - ((__floatP) ? "F" : ""), (FxU32)noTsuFifoPtr) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - SET(*noTsuFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*noTsuFifoPtr++, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)noTsuFifoPtr - \ - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = noTsuFifoPtr; \ - FIFO_ASSERT(); \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#define STORE_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE16_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 temp32 = (((FxU32)(__val)) & 0x0000FFFF); \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, temp32); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*(FxFloat*)curFifoPtr, __val); \ - curFifoPtr++; \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -/* There are now three different flavors of the packet 3 macros for - * your coding pleasure. In increasing order of complexity and control - * they are TRI_BEGIN, TRI_STRIP_BEGIN, TRI_PACKET_BEGIN. - * - * NB: All of these macros must be terminated w/ a matching invocation of - * TRI_END otherwise all sorts of hell will break loose. - * - * TRI_BEGIN: - * The simplest form that draws a single indepependent triangle whose - * parameters and culling are all the glide defaults for grDrawTriangle. - * - * TRI_STRIP_BEGIN: - * setupMode: [kSetupStrip | kSetupFan]. Culling defaults to the current - * glide setting, w/ strips/fans defaulting to ping-pong culling - * nVertex: The number of vertices for the current packet (max 15). - * vertexSize: Size in bytes of the parameters for the vertices making up - * the current packet. - * cmd: [SSTCP_PKT3_BDDBDD (Independent) - * SSTCP_PKT3_BDDDDD (Start strip/fan) - * SSTCP_PKT3_DDDDDD (Continue strip)] - * - * TRI_PACKET_BEGIN: - * setupMode: The same as with TRI_STRIP_BEGIN, except that the caller - * needs to specify the culling bits kSetupCullXXX/kSetupPingPongXXX. - * params: Bits matching the descriptin of the sMode register describing - * which parameters are specified in the packet. - * nVertex: See TRI_STRIP_BEGIN. - * vertexSize: See TRI_STRIP_BEGIN. - * cmd: See TRI_STRIP_BEGIN. - */ -#define TRI_PACKET_BEGIN(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_STRIP_BEGIN(__setupMode, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - gc->cmdTransportInfo.cullStripHdr); \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_BEGIN() \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - TRI_ASSERT_DECL(3, _GlideRoot.curVertexSize, gc->cmdTransportInfo.triPacketHdr); \ - SET(*tPackPtr++, gc->cmdTransportInfo.triPacketHdr) - -#if GDBG_INFO_ON -extern void -_grCVGFifoDump_TriHdr(const FxU32 triPacketHdr); -extern void -_grCVGFifoDump_Linear(const FxU32* const linearPacketAddr); - -#define DEBUGFIFODUMP_TRI(__packetAddr) _grCVGFifoDump_TriHdr(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) _grCVGFifoDump_Linear(__packetAddr) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) \ - const FxU32 nVertex = (__nVerts); \ - const FxU32 sVertex = (__vertSize); \ - FxU32 pCount = 0; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(tPackPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((((__nVerts) * (__vertSize)) + sizeof(FxU32)) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT((((FxU32)tPackPtr) + ((__nVerts) * (__vertSize)) + sizeof(FxU32)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT(nVertex < 0x10); \ - GR_ASSERT(nVertex > 0x00); \ - GR_ASSERT(((__packetHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "Triangle(0x%X): (0x%X : 0x%X)\n", (__packetHdr), __nVerts, __vertSize); \ - DEBUGFIFODUMP_TRI(__packetHdr) -#define CLAMP_DUMP(__val, __floatVal) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: (%f : 0x%X)\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875)), \ - (__floatVal)) -#define SETF_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: %f\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875))) -#define SET_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: 0x%X\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (__val)) -#define TRI_ASSERT() \ - GR_ASSERT(pCount == (nVertex * (sVertex >> 2))); \ - ASSERT(((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) == (nVertex * sVertex) + sizeof(FxU32)) -#else /* !GDBG_INFO_ON */ -#define DEBUGFIFODUMP_TRI(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) - -#define CLAMP_DUMP(__val, __floatVal) -#define SETF_DUMP(__val) -#define SET_DUMP(__val) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) -#define TRI_ASSERT() -#endif /* !GDBG_INFO_ON */ - -/* Get the integer representation of the color component. Currently, - * following in the 'Glide is not an API for kids' tradition we'll - * probably do something silly like wrap around zero. - */ -#if GLIDE_PACKED_RGB -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - GR_ASSERT((__fpVal) >= 0.0f), \ - GR_ASSERT((__fpVal) < 256.0f), \ - (((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)) << (__fpShift))) - -#define RGBA_COMP_CLAMP(__fpVal, __compToken) \ - RGBA_COMP(__fpVal, kPackBias##__compToken, kPackShift##__compToken, kPackMask##__compToken) -#endif /* GLIDE_PACKED_RGB */ - -/* First stage tsu-subtractor chec/fix. - * Mmm..... sequence operator. - */ -#if GLIDE_FP_CLAMP -#define kFPClampThreshold 0x20UL -#define FP_FLOAT_CLAMP(__fpVal) ((FP_FLOAT_EXP(__fpVal) < kFPClampThreshold) \ - ? (_GlideRoot.stats.tsuValClamp++, 0x00UL) \ - : *(const FxU32*)(&(__fpVal))) - -#define TRI_SETF_CLAMP(__val) \ -do { \ - const FxU32 floatCastVal = FP_FLOAT_CLAMP(__val); \ - CLAMP_DUMP(__val, floatCastVal); \ - SET(*tPackPtr++, floatCastVal); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) -#else -#define TRI_SETF_CLAMP(__val) \ - TRI_SETF(__val) -#endif - -#define TRI_SETF(__val) \ -do { \ - SETF_DUMP(__val); \ - SETF(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#define TRI_SET(__val) \ -do { \ - SET_DUMP(__val); \ - SET(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define TRI_END \ - TRI_ASSERT(); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = tPackPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tTriEnd: (0x%X : 0x%X)\n", tPackPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -#define FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __f, __l) \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 __writeSize = (__numWords); /* Add size of packet header */ \ - const FxU32 hdr1 = ((__type) | \ - (((FxU32)(__maskW2)) << SSTCP_PKT5_BYTEN_W2_SHIFT) | \ - (((FxU32)(__maskWN)) << SSTCP_PKT5_BYTEN_WN_SHIFT) | \ - (__writeSize << SSTCP_PKT5_NWORDS_SHIFT) | \ - SSTCP_PKT5); \ - const FxU32 hdr2 = ((FxU32)(__addr)) & SSTCP_PKT5_BASEADDR; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(packetPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((__numWords) > 0); /* packet size */ \ - GR_ASSERT((__numWords) < ((0x01 << 19) - 2)); \ - GR_ASSERT((((__numWords) + 2) << 2) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT(((FxU32)packetPtr + (((__numWords) + 2) << 2)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT((hdr2 & 0xE0000000UL) == 0x00UL); \ - GR_ASSERT((((FxU32)(__type)) >= ((FxU32)kLinearWriteLFB)) && /* packet type */ \ - (((FxU32)(__type)) <= ((FxU32)kLinearWriteTex))); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "LinearWrite(0x%X : 0x%X)\n", hdr1, hdr2); \ - GDBG_INFO(gc->myLevel + 200, "\tFile: %s - Line: %ld\n", __f, __l); \ - GDBG_INFO(gc->myLevel + 200, "\tType: 0x%X\n", (FxU32)(__type)); \ - GDBG_INFO(gc->myLevel + 200, "\tAddr: 0x%X\n", (FxU32)(__addr)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskW2: 0x%X\n", (FxU32)(__maskW2)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskWN: 0x%X\n", (FxU32)(__maskWN)); \ - GDBG_INFO(gc->myLevel + 200, "\twriteSize: 0x%X\n", __writeSize); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 1: 0x%X\n", hdr1); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 2: 0x%X\n", hdr2); \ - SET(*packetPtr++, hdr1); \ - SET(*packetPtr++, hdr2); \ - GR_INC_SIZE(sizeof(FxU32)) - -#define FIFO_LINEAR_WRITE_SET(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_16(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_16(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_8(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_8(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_END \ - DEBUGFIFODUMP_LINEAR(gc->cmdTransportInfo.fifoPtr); \ - GR_ASSERT((((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == __writeSize + 2); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tLinearEnd: (0x%X : 0x%X)\n", \ - packetPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -# define GR_GET(s) GET(s) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) STORE_FIFO(c, h, f, s) -# define GR_SET_INDEX(c, h, r, s) STORE_FIFO_INDEX(c, h, r, s) -# define GR_SET16(c, h, f, s) STORE16_FIFO(c, h, f, s) -# define GR_SETF(c, h, f, s) STOREF_FIFO(c, h, f, s) -# define GR_SETF_INDEX(c, h, r, s) STOREF_FIFO_INDEX(c, h, r, s) -#else /* !USE_PACKET_FIFO */ -# define GR_GET(s) GET(s) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) do {SET((h)->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SET_INDEX(c, h, r, s) do {SET(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SETF(c, h, f, s) do {SETF(h->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SETF_INDEX(c, h, r, s) do {SETF(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SET16(c, h, f, s) do {SET16((h)->f, s); GR_INC_SIZE(2);} while(0) -#endif /* !USE_PACKET_FIFO */ - -/* Macros to do linear writes to lfb/tex memory. - * - * LINEAR_WRITE_BEGIN - Setup stuff for the linear write. - * - * numWords: The number of words to actually write to the destination - * address. This does *NOT* include the packet headers etc for any - * command fifos etc. - * - * type: One of the kLinearWriteXXX enum values above. This can - * control what the legal values for addr and maskXX are. - * - * addr: Base address to the start the write. - * - * maskXX: Control what bytes in a write are active, these are active - * low. W2 controls the masking of the first 32bit word written, and - * WN controls all of the other writes. - * - * LINEAR_WRITE_SET - Writes are done in 32-bit increments, and must - * be properly aligned etc. This can only be used inside of a - * LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_EDGE - Write to a 16-bit value to an address. The - * address must be aligned for at 16-bit access, and should not appear - * within a LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_END - Finish off any stuff for the linear write. - */ - -enum { - kLinearWriteLFB = SSTCP_PKT5_3DLFB, - kLinearWriteTex = SSTCP_PKT5_TEXPORT -}; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define TEX_ROW_ADDR_INCR(__t, __lod) ((__t) << 9) -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define TEX_ROW_ADDR_INCR(__t, __lod) ((__t) << 7) -#else -#error "Need to define TEX_ROW_ADDR_INCR for this hw." -#endif - -#if USE_PACKET_FIFO - -#define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((FxU32)((__numWords) + 1UL) << 2UL), 1); \ - FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __FILE__, __LINE__) -#define LINEAR_WRITE_SET(__addr, __val) \ - FIFO_LINEAR_WRITE_SET(__val) -#define LINEAR_WRITE_SET_16(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_16(__val) -#define LINEAR_WRITE_SET_8(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_8(__val) -#define LINEAR_WRITE_END() \ - FIFO_LINEAR_WRITE_END; \ - GR_CHECK_SIZE(); \ -} - -/* Macro to write the edge cases of a linear write, for example to the - * lfb w/ a 16-bit pixel value. We do some address manipulation here - * since the cmd fifo only addresses 32-bit quantities, but allows us - * to mask of crap for the actual write. - */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define FIFO_LINEAR_EDGE_MASK_ADJUST(__mask) ((~(__mask)) & 0x0FUL) -#define FIFO_LINEAR_EDGE_SET(__val) FIFO_LINEAR_WRITE_SET((((__val) & 0xFFFF0000UL) >> 16UL) | \ - (((__val) & 0x0000FFFFUL) << 16UL)) -#else -#define FIFO_LINEAR_EDGE_SET(__val) FIFO_LINEAR_WRITE_SET(__val) -#define FIFO_LINEAR_EDGE_MASK_ADJUST(__mask) (__mask) -#endif - -#define LINEAR_WRITE_EDGE(__type, __addr, __val, __valBytes) \ -do { \ - const FxU32 edgeAddr = (FxU32)(((FxU32)__addr) & 0x03UL); \ - GR_ASSERT((__valBytes) <= sizeof(FxU32)); \ - GR_ASSERT((((FxU32)(__addr)) + (__valBytes)) <= ((((FxU32)(__addr)) & ~0x03UL) + sizeof(FxU32))); \ - LINEAR_WRITE_BEGIN(1, __type, ((FxU32)__addr & ~0x03UL), \ - FIFO_LINEAR_EDGE_MASK_ADJUST((0xF0UL | (0x0FUL >> (__valBytes))) >> edgeAddr), \ - 0x00); \ - FIFO_LINEAR_EDGE_SET(((FxU32)(__val)) << (((sizeof(FxU32) - edgeAddr) << 3UL) - \ - ((__valBytes) << 3UL))); \ - LINEAR_WRITE_END(); \ -} while(0) -#else /* !USE_PACKET_FIFO */ -# define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((__numWords) << 2), (__numWords)) -# define LINEAR_WRITE_SET(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define LINEAR_WRITE_SET_16(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR_16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define LINEAR_WRITE_SET_8(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET_LINEAR_8(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -# define LINEAR_WRITE_EDGE(__type, __addr, __val, __isLeftP) \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); \ -{ \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} \ -GR_CHECK_SIZE() -# define LINEAR_WRITE_END() \ - GR_CHECK_SIZE(); \ -} - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, (0xFFFFFFFF >> (32 - (__groupNum))), FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(gc->myLevel + 100, "REG_GROUP_BEGIN: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstRegs, __regBase) >> 2) - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - SET(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - SETF(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - SET(((FxU32*)(__regBase))[offsetof(SstRegs, __regAddr) >> 2], fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - volatile FxU32* regBaseAddr = (volatile FxU32*)((__floatP) \ - ? &hw->FvA \ - : &hw->vA); \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: fbiRegs->%svA\n", \ - ((__floatP) ? "F" : "")) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - ASSERT(hwWriteAddr == regBaseAddr); \ - SET(*hwWriteAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*hwWriteAddr, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#endif /* !USE_PACKET_FIFO */ - -/* Offsets to 'virtual' addresses in the hw */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_REGISTER_OFFSET SST_3D_OFFSET -#define HW_FIFO_OFFSET 0x00200000UL -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_IO_REG_REMAP SST_IO_OFFSET -#define HW_CMD_AGP_OFFSET SST_CMDAGP_OFFSET -#define HW_2D_REG_OFFSET SST_2D_OFFSET -#define HW_3D_REG_OFFSET SST_3D_OFFSET -#define HW_REGISTER_OFFSET HW_3D_REG_OFFSET -#else -#error "Must define virtual address spaces for this hw" -#endif - -#define HW_FIFO_OFFSET 0x00200000UL -#define HW_LFB_OFFSET SST_LFB_OFFSET -#define HW_TEXTURE_OFFSET SST_TEX_OFFSET - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_BASE_PTR(__b) (__b) -#else -#error "Need HW_BASE_PTR to convert hw address into board address." -#endif - -#define HW_REG_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_REGISTER_OFFSET)) -#define HW_LFB_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_LFB_OFFSET)) -#define HW_TEX_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_TEXTURE_OFFSET)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) -#define ArraySize(__a) (sizeof(__a) / sizeof((__a)[0])) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#if GDBG_INFO_ON -/* cvg.c */ -extern void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args); -#endif - -extern FxU32 GR_CDECL -_cpu_detect_asm(void); - -extern void GR_CDECL -single_precision_asm(void); - -extern void GR_CDECL -double_precision_asm(void); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -/* gglide.c */ -extern void -_grSliOriginClear(void); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/cvg/glide/src/g3df.c b/glide2x/cvg/glide/src/g3df.c deleted file mode 100644 index 5a00fb5..0000000 --- a/glide2x/cvg/glide/src/g3df.c +++ /dev/null @@ -1,558 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 17 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 16 1/13/98 7:48p Atai - * fixed gu3dfGetInfo, grBufferClear, and GrState size - * - * 15 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 14 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 12 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 11 12/09/97 12:20p Peter - * mac glide port - * - * 10 6/06/97 5:56p Peter - * fixed gcc/dural compilation things - * - * 9 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 8 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 7 5/21/97 6:05a Peter - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#ifdef __linux__ -#include -#endif - -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _grMipMapHostSize[4][16]; - -static FxU16 ReadDataShort(FILE *); -static FxU32 ReadDataLong(FILE *); -static void Read8Bit(FxU8 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect); -static void Read16Bit(FxU16 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect); - -#if ((GLIDE_PLATFORM & (GLIDE_OS_DOS32 | GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) != 0) -const char *openmode = "rb"; -#else -const char *openmode = "r"; -#endif - -typedef struct -{ - const char *name; - GrTextureFormat_t fmt; - FxBool valid; -} CfTableEntry; - - -static FxBool -_grGet3dfHeader(FILE* stream, char* const buffer, const FxU32 bufSize) -{ - int numLines = 0; - FxU32 bufPos = 0; - - while(numLines < 4) { - /* Handle stream errors */ - if (fgets(buffer + bufPos, bufSize - bufPos, stream) == NULL) break; - bufPos += strlen(buffer + bufPos); - - /* fgets includes the '\n' in the buffer. If this is not there - * then the buffer is too small so fail. - */ - if (*(buffer + bufPos - sizeof(char)) != '\n') break; - numLines++; - } - - return (numLines == 4); -} - -/*--------------------------------------------------------------------------- -** gu3dfGetInfo -*/ -GR_DIENTRY(gu3dfGetInfo, FxBool, - (const char *FileName, Gu3dfInfo *Info)) -{ - FILE *image_file; - FxU32 i; - char version[5]; - char color_format[10]; - int aspect_width, aspect_height; - char buffer[100]; - int small_lod, large_lod; - FxBool ratio_found = FXFALSE; - FxBool format_found = FXFALSE; - GrAspectRatio_t wh_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_1x2, - GR_ASPECT_1x4, - GR_ASPECT_1x8 - }; - GrAspectRatio_t hw_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_2x1, - GR_ASPECT_4x1, - GR_ASPECT_8x1 - }; - CfTableEntry cftable[] = - { - { "I8", GR_TEXFMT_INTENSITY_8, FXTRUE }, - { "A8", GR_TEXFMT_ALPHA_8, FXTRUE }, - { "AI44", GR_TEXFMT_ALPHA_INTENSITY_44, FXTRUE }, - { "YIQ", GR_TEXFMT_YIQ_422, FXTRUE }, - { "RGB332", GR_TEXFMT_RGB_332, FXTRUE }, - { "RGB565", GR_TEXFMT_RGB_565, FXTRUE }, - { "ARGB8332", GR_TEXFMT_ARGB_8332, FXTRUE }, - { "ARGB1555", GR_TEXFMT_ARGB_1555, FXTRUE }, - { "AYIQ8422", GR_TEXFMT_AYIQ_8422, FXTRUE }, - { "ARGB4444", GR_TEXFMT_ARGB_4444, FXTRUE }, - { "AI88", GR_TEXFMT_ALPHA_INTENSITY_88, FXTRUE }, - { "P8", GR_TEXFMT_P_8, FXTRUE }, - { "AP88", GR_TEXFMT_AP_88, FXTRUE }, - { 0, 0, FXFALSE } - }; - - GDBG_INFO(81,"gu3dfGetInfo(%s,0x%x)\n",FileName,Info); - /* - ** open the filen - */ - if((image_file = fopen(FileName, openmode)) == NULL) return FXFALSE; - if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE; - - /* - ** grab statistics out of the header - */ - if(sscanf(buffer,"3df v%s %s lod range: %i %i aspect ratio: %i %i\n", - version, - color_format, - &small_lod, &large_lod, - &aspect_width, &aspect_height) == 0) - return FXFALSE; - - /* - ** determine aspect ratio, height, and width - */ - i = 0; - ratio_found = FXFALSE; - while ((i < 4) && (!ratio_found)) { - if ((aspect_width << i) == aspect_height) { - Info->header.aspect_ratio = wh_aspect_table[i]; - ratio_found = FXTRUE; - } - - i++; - } - - i = 0; - while ((i < 4) && (!ratio_found)) { - if ((aspect_height << i) == aspect_width) { - Info->header.aspect_ratio = hw_aspect_table[i]; - ratio_found = FXTRUE; - } - - i++; - } - if (!ratio_found) return FXFALSE; - - /* - ** determine height and width of the mip map - */ - if (aspect_width >= aspect_height) { - Info->header.width = large_lod; - Info->header.height = large_lod / aspect_width; - } else { - Info->header.height = large_lod; - Info->header.width = large_lod / aspect_height; - } - - - /* - ** calculate proper LOD values - */ - /* - ** note for glide3 lod translation: - ** we should return the new defines for glide3 - */ - switch (small_lod) { - case 1: - Info->header.small_lod = GR_LOD_1; - break; - - case 2: - Info->header.small_lod = GR_LOD_2; - break; - - case 4: - Info->header.small_lod = GR_LOD_4; - break; - - case 8: - Info->header.small_lod = GR_LOD_8; - break; - - case 16: - Info->header.small_lod = GR_LOD_16; - break; - - case 32: - Info->header.small_lod = GR_LOD_32; - break; - - case 64: - Info->header.small_lod = GR_LOD_64; - break; - - case 128: - Info->header.small_lod = GR_LOD_128; - break; - - case 256: - Info->header.small_lod = GR_LOD_256; - break; - } - - switch (large_lod) { - case 1: - Info->header.large_lod = GR_LOD_1; - break; - - case 2: - Info->header.large_lod = GR_LOD_2; - break; - - case 4: - Info->header.large_lod = GR_LOD_4; - break; - - case 8: - Info->header.large_lod = GR_LOD_8; - break; - - case 16: - Info->header.large_lod = GR_LOD_16; - break; - - case 32: - Info->header.large_lod = GR_LOD_32; - break; - - case 64: - Info->header.large_lod = GR_LOD_64; - break; - - case 128: - Info->header.large_lod = GR_LOD_128; - break; - - case 256: - Info->header.large_lod = GR_LOD_256; - break; - } - - /* - ** determine the color format of the input image - */ -#ifdef __GNUC__ - /* This function is not found in libgcc.a */ - { - char* tempStr = (char*)color_format; - while(*tempStr != '\0') *tempStr++ = toupper(*tempStr); - } -#else - { - extern char* strupr(char*); - strupr(color_format); - } -#endif /* __GNUC__ */ - - i = 0; - format_found = FXFALSE; - while ((cftable[i].name != 0) && (!format_found)) { - if (strcmp(color_format, cftable[i].name) == 0) { - Info->header.format = cftable[i].fmt; - format_found = FXTRUE; - } - - i++; - } - - /* - ** close the input file - */ - if (image_file != NULL) fclose(image_file); - - if (format_found) { - FxI32 lod; - Info->mem_required = 0; - for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) { - Info->mem_required += (_grMipMapHostSize[_gr_aspect_index_table[Info->header.aspect_ratio]] - [lod] << (Info->header.format >= GR_TEXFMT_16BIT)); - } - } - - return format_found; -} - -/*--------------------------------------------------------------------------- -** gu3dfLoad -*/ -GR_DIENTRY(gu3dfLoad, FxBool, (const char *filename, Gu3dfInfo *info)) -{ - FILE *image_file = 0; - FxU32 index = 0; - char buffer[100] = ""; - - GDBG_INFO(81,"gu3dfLoad(%s,0x%x)\n",filename,info); - /* - ** open the file - */ - if ((image_file = fopen(filename, openmode)) == NULL) return FXFALSE; - if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE; - - /* - ** If necessary, read in the YIQ decompression table - */ - if ((info->header.format == GR_TEXFMT_YIQ_422) || - (info->header.format == GR_TEXFMT_AYIQ_8422)) - { - /* - ** read in Y - */ - for (index = 0; index < 16; index++) - info->table.nccTable.yRGB[index] = ((FxI16) ReadDataShort(image_file)) & 0xFF; - - /* - ** read in I - */ - for (index = 0; index < 4; index++) { - info->table.nccTable.iRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.iRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.iRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - } - - /* - ** read in Q - */ - for (index = 0; index < 4; index++) { - info->table.nccTable.qRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.qRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.qRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - } - - /* - ** pack the table Y entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.yRGB[index*4+0]); - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+1]) << 8; - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+2]) << 16; - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+3]) << 24; - - info->table.nccTable.packed_data[index] = packedvalue; - } - - /* - ** pack the table I entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.iRGB[index][0]) << 18; - packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][1]) << 9; - packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][2]) << 0; - - info->table.nccTable.packed_data[index+4] = packedvalue; - } - - /* - ** pack the table Q entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.qRGB[index][0]) << 18; - packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][1]) << 9;; - packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][2]) << 0; - - info->table.nccTable.packed_data[index+8] = packedvalue; - } - } - - /* - ** If necessary, read in the Palette - */ - if ((info->header.format == GR_TEXFMT_P_8) || - (info->header.format == GR_TEXFMT_AP_88)) { - FxU32 i; - for(i = 0; i < 256; i++) - info->table.palette.data[i] = ReadDataLong(image_file); - } - - /* - ** Read in the image - */ - switch (info->header.format) - { - case GR_TEXFMT_INTENSITY_8: - case GR_TEXFMT_ALPHA_8: - case GR_TEXFMT_ALPHA_INTENSITY_44: - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_RGB_332: - case GR_TEXFMT_P_8: - Read8Bit(info->data, image_file, - info->header.small_lod, - info->header.large_lod, - info->header.aspect_ratio); - break; - - case GR_TEXFMT_RGB_565: - case GR_TEXFMT_ARGB_8332: - case GR_TEXFMT_ARGB_1555: - case GR_TEXFMT_AYIQ_8422: - case GR_TEXFMT_ARGB_4444: - case GR_TEXFMT_ALPHA_INTENSITY_88: - case GR_TEXFMT_AP_88: - Read16Bit(info->data, image_file, - info->header.small_lod, - info->header.large_lod, - info->header.aspect_ratio); - break; - - default: - return FXFALSE; - } - - /* - ** close the file - */ - fclose(image_file); - - return FXTRUE; -} - -/* -** Read8Bit -** -** Read in an 8-bit texture map, unpacked. -*/ -static void -Read8Bit(FxU8 *data, FILE *image_file, - int small_lod, int large_lod, - GrAspectRatio_t aspect_ratio) -{ - int lod; - int width, height; - - for (lod = large_lod; lod <= small_lod; lod++) { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - fread(data, sizeof(char), width*height, image_file); - data += width*height; - } -} - -/* -** Read16Bit -** -** Read in a 16-bit texture map, unpacked. -*/ -static void Read16Bit(FxU16 *data, FILE *image_file, - int small_lod, int large_lod, - GrAspectRatio_t aspect_ratio) -{ - int index; - int lod; - int width, height; - - for (lod = large_lod; lod <= small_lod; lod++) { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - for (index = 0; index < (width * height); index++) { - *data = ReadDataShort(image_file); - data++; - } - } -} - -/* -** FxU16 ReadDataShort -*/ -static FxU16 ReadDataShort(FILE *fp) -{ - FxU16 b1 = (FxU16)getc(fp); - FxU16 b2 = (FxU16)getc(fp); - -#define kShiftB1 8 -#define kShiftB2 0 - - return (((b1 & 0xFF) << kShiftB1) | ((b2 & 0xFF) << kShiftB2)); -} - -/* -** ReadDataLong -*/ -static FxU32 ReadDataLong(FILE *fp) -{ - FxU32 data; - FxU8 byte[4]; - - fread(byte, 4, 1, fp); - data = (((FxU32) byte[0]) << 24) | - (((FxU32) byte[1]) << 16) | - (((FxU32) byte[2]) << 8) | - ((FxU32) byte[3]); - - return data; -} - - - diff --git a/glide2x/cvg/glide/src/gaa.c b/glide2x/cvg/glide/src/gaa.c deleted file mode 100644 index d91c87b..0000000 --- a/glide2x/cvg/glide/src/gaa.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 64 5/18/98 12:15p Peter -** crybaby check for alpha enable -** -** 63 4/22/98 6:18p Jdt -** Optimized AA Lines. -** -** 62 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 61 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 60 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 59 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 57 12/08/97 10:40a Atai - * modify draw vertex primitive routines to do grDrawVertexArrayLinear() - * - * 56 12/05/97 4:26p Peter - * watcom warnings - * - * 55 11/24/97 4:40p Peter - * aa prims vs packing - * - * 54 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 53 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 52 11/18/97 6:11p Peter - * fixed glide3 muckage - * - * 51 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 50 11/18/97 3:26p Atai - * update vData - * optimize state monster - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 47 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 46 11/04/97 5:04p Peter - * cataclysm part deux - * - * 45 11/04/97 4:57p Atai - * use byte offset - * - * 44 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 43 11/03/97 3:19p Atai - * optimization - * - * 42 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 41 10/29/97 2:24p Atai - * re-work aa draw routines to increase sbench number - * - * 40 10/21/97 8:38p Atai - * added lines routine for grDrawArray - * - * 39 10/21/97 3:22p Peter - * hand pack rgb - * - * 38 10/19/97 12:51p Peter - * no tsu happiness - * - * 37 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 36 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 35 10/16/97 5:33p Peter - * argb != rgba - * - * 34 10/16/97 3:40p Peter - * packed rgb - * - * 33 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 32 10/14/97 7:33p Atai - * fix compiler error - * - * 31 10/14/97 5:40p Atai - * added grculltest - * - * 30 10/14/97 4:36p Atai - * added aa points, strip line and trianlges for drawarray - * - * 29 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 28 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 27 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 26 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 25 9/16/97 2:49p Peter - * fixed watcom unhappiness w/ static initializers - * - * 24 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 23 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 22 8/30/97 5:58p Tarolli - * cleanups - * - * 21 7/29/97 4:31p Atai - * replace old edge sense routine - * - * 19 7/28/97 2:42p Peter - * aa points? - * - * 18 7/26/97 3:04p Peter - * cleanup - * - * 17 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 16 6/30/97 3:21p Peter - * more aa through cmd fifo - * - * 15 6/20/97 1:17p Peter - * changes for new CVG_TRI macros -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -*/ -GR_ENTRY(grAADrawPoint, void, (const GrVertex *e)) -{ -#define FN_NAME "grAADrawPoint" - GR_DCL_GC; - GrCullMode_t cullSave; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - GDBG_INFO(94,"grAADrawPoint(0x%x)\n",e); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vertexParamOffset * 6, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - - { - const float ptX = e->x; - const float ptY = e->y; - const float* const fp = (const float* const)e; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - TRI_SET(packedColor); - } else { - TRI_SETF(0.0f); - } -#else /* !GLIDE_PACKED_RGB */ - /* Parameters up to alpha. - * - * NB: It is up to the user to correctly set this up - * so that the alpha is sent. - */ - while(*dataList != (GR_VERTEX_A_OFFSET << 2)) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - /* Send constant Alpha == 0.0f */ - TRI_SETF(0.0f); -#endif /* !GLIDE_PACKED_RGB */ - - /* Skip the actual alpha value in the data list */ - dataList++; - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* Anything else in the dataList */ - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - } - } - } - - TRI_END; - GR_CHECK_SIZE(); -#else - { - GrVertex a, b; - - /* - ** make corners of a square - */ - a = - b = *e; - - a.tmuvtx[0].oow = - b.tmuvtx[0].oow = _GlideRoot.pool.f1; - - a.x -= _GlideRoot.pool.f1; - a.y -= _GlideRoot.pool.f1; - - b.x += _GlideRoot.pool.f1; - b.y -= _GlideRoot.pool.f1; - - a.a = - b.a = _GlideRoot.pool.f0; - - grDrawTriangle(&a, &b, e); /* A B E */ - - b.x -= 2.0F; /* compute point D */ - b.y += 2.0F; - grDrawTriangle(&a, e, &b); /* A E D */ - - a.x += 2.0F; /* compute point C */ - a.y += 2.0F; - grDrawTriangle(&b, e, &a); /* D E C */ - - b.x += 2.0F; - b.y -= 2.0F; - grDrawTriangle(&a, e, &b); /* C E B */ - } -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - /* Restore culling mode */ - gc->state.cull_mode = cullSave; -#undef FN_NAME -} /* grAADrawPoint */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -static void -grAADrawStrip(const FxU32 cullMode, const float* const vectorList[], const FxU32 vectorNum) -{ -#define FN_NAME "grAADrawStrip" - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, gc->myLevel); - GDBG_INFO_MORE(gc->myLevel, "(): 0x%X\n", vectorNum); - - GR_FLUSH_STATE(); - - GR_SET_EXPECTED_SIZE(vertexParamOffset * vectorNum, 1); - TRI_PACKET_BEGIN(cullMode, gc->cmdTransportInfo.paramMask, - vectorNum, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - { - FxU32 v; - - for(v = 0; v < vectorNum; v++) { - const float* const vector = vectorList[v]; - - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vector, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vector, *dataList)); - dataList++; - } - } - } - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/* -** grAADrawEdgeTriangle -*/ -static void -grAADrawEdgeTriangle(float *va, float *vb, float *vc) -{ - float - *fa = va, - *fb = vb, - *fc = vc, - dpAB, dpBC, - dpdx, dpdy, /* Change in parameter WRT x & y */ - area; - float - ooa, dxAB, dxBC, dyAB, dyBC; - float negateArea = -1.f; - - GR_BEGIN_NOFIFOCHECK("grAADrawEdgeTriangle",gc->myLevel); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_FLUSH_STATE(); - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - if (va[1] < vb[1]) { - if (vb[1] > vc[1]) { /* acb */ - if (va[1] < vc[1]) { - fa = va; - fb = vc; - fc = vb; - negateArea *= -1.f; - } else { /* cab */ - fa = vc; - fb = va; - fc = vb; - } - /* else it's already sorted */ - } - } else { - if (vb[1] < vc[1]) { /* bac */ - if (va[1] < vc[1]) { - fa = vb; - fb = va; - fc = vc; - negateArea *= -1.f; - } else { /* bca */ - fa = vb; - fb = vc; - fc = va; - } - } else { /* cba */ - fa = vc; - fb = vb; - fc = va; - negateArea *= -1.f; - } - } - - /* Compute Area */ - dxAB = fa[0] - fb[0]; - dxBC = fb[0] - fc[0]; - - dyAB = fa[1] - fb[1]; - dyBC = fb[1] - fc[1]; - - area = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - if (area == 0.0f) goto all_done; - - ooa = 1.0f / area; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GR_SET_EXPECTED_SIZE(((10 + (_GlideRoot.paramCount - 1)) << 2), - 10 + (_GlideRoot.paramCount - 1)); - - /* write out X & Y for vertex A */ - GR_SETF(BROADCAST_ID, hw, FvA.x, fa[0]); - GR_SETF(BROADCAST_ID, hw, FvA.y, fa[1]); - - /* write out X & Y for vertex B */ - GR_SETF(BROADCAST_ID, hw, FvB.x, fb[0]); - GR_SETF(BROADCAST_ID, hw, FvB.y, fb[1]); - - /* write out X & Y for vertex C */ - GR_SETF(BROADCAST_ID, hw, FvC.x, fc[0]); - GR_SETF(BROADCAST_ID, hw, FvC.y, fc[1]); - - dpAB = (fa[GR_VERTEX_A_OFFSET] - fb[GR_VERTEX_A_OFFSET]); - dpBC = (fb[GR_VERTEX_A_OFFSET] - fc[GR_VERTEX_A_OFFSET]); - dpdx = dpAB * dyBC - dpBC * dyAB; - dpdy = dpBC * dxAB - dpAB * dxBC; - - /* Write the alpha data */ - GR_SETF(BROADCAST_ID, hw, Fa, fa[GR_VERTEX_A_OFFSET]); - GR_SETF(BROADCAST_ID, hw, Fdadx , dpdx); - GR_SETF(BROADCAST_ID, hw, Fdady , dpdy); - - { - const struct dataList_s* dlp = gc->regDataList; - int i = dlp->i; - - /* We already put the alpha out, and this is guaranteed to - * be included in the dataList via convention. - */ - while (i != (GR_VERTEX_A_OFFSET << 2)) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - dlp++; - i = dlp->i; - - while (i != 0) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - GR_SETF(BROADCAST_ID, hw, FtriangleCMD, area); - } - -all_done: - GR_END(); -} /* grAADrawEdgeTriangle */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - -#if (GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) -#define FUCAST( X ) (*(unsigned long*)&(X)) -#define FN_NAME "grAADrawLine" -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ - GR_DCL_GC; - GrVertex *_v1, *_v2; - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* datalist; - float xoff, yoff; - float alpha; - float dx, dy; /* delta X and Y */ - float adx, ady;/* |dX| and |dY| */ - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_SET_EXPECTED_SIZE( vertexParamOffset * 6, 1 ); - TRI_PACKET_BEGIN( 0, - gc->cmdTransportInfo.paramMask, - 6, - vertexParamOffset, - SSTCP_PKT3_BDDDDD ); - - /* y sort*/ - if (v2->y < v1->y) { - _v1 = (void*) v2; - _v2 = (void*) v1; - } else { - _v1 = (void*) v1; - _v2 = (void*) v2; - } -#define v1 _v1 -#define v2 _v2 - /* compute deltas and absolute deltas */ - - dx = v2->x - v1->x; - dy = v2->y - v1->y; - - adx = (float)(FUCAST( dx ) & 0x7fffffff); - ady = (float)(FUCAST( dy ) & 0x7fffffff); - - if ( adx >= ady ) { - xoff = 0.0f; - yoff = 1.0f; - } else { - xoff = 1.0f; - yoff = 0.0f; - } - - /* A---B Alpha = 0.0 - | \ | - V1-V2 Alpha = 1.0 ( user ) - | \ | - E---F Alpha = 0.0 -*/ - - /* B Vertex */ - TRI_SETF( v2->x + xoff ); - TRI_SETF( v2->y - yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* A Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x + xoff ); - TRI_SETF( v1->y - yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - v1->a = alpha; - - /* V2 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x ); - TRI_SETF( v2->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - /* V1 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x ); - TRI_SETF( v1->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - /* F Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x - xoff ); - TRI_SETF( v2->y + yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* E Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x - xoff ); - TRI_SETF( v1->y + yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - v1->a = alpha; - -#undef v1 -#undef v2 - TRI_END; - GR_CHECK_SIZE(); -} -#undef FN_NAME -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ - float dx, dy; /* delta X and Y */ - float adx, ady; /* |dX| and |dY| */ - GrVertex a, b, e, f; /* four vertices outlining the line */ - GR_DCL_GC; - - /* turn off culling so triangles unconditionally draw. - * - * NB: On cvg we control this via the command packet. - */ - GrCullMode_t cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GDBG_INFO(95, "grAADrawLine (%f %f) -> (%f %f)\n", - v1->x, v1->y, v2->x, v2->y); - - GR_FLUSH_STATE(); - - /* draw from low Y to high Y */ - if (v2->y < v1->y) { - const GrVertex* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v2->x - v1->x; - dy = ady = v2->y - v1->y; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - a = *v1; - e = *v1; - b = *v2; - f = *v2; - - if (adx >= ady) { /* X major line */ - a.y -= _GlideRoot.pool.f1; - a.a = 0.F; - b.y -= _GlideRoot.pool.f1; - b.a = 0.F; - e.y += _GlideRoot.pool.f1; - e.a = 0.F; - f.y += _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, v2, &b); - grDrawTriangle(&a, v2, v1); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } else { /* Y major line */ - a.x += _GlideRoot.pool.f1; - a.a = 0.F; - b.x += _GlideRoot.pool.f1; - b.a = 0.F; - e.x -= _GlideRoot.pool.f1; - e.a = 0.F; - f.x -= _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, &b, v2); - grDrawTriangle(v1, &a, v2); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } - - gc->state.cull_mode = cullSave; -} /* grAADrawLine */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdge -*/ -static void -grAADrawTriEdge(const GrVertex *a, const GrVertex *b, aaEdgeSense sense) -{ - GrVertex c = *a, d = *b; - - c.a = 0.f; - d.a = 0.f; - - switch (sense) { - case aaEdgeSenseTop: - c.y += _GlideRoot.pool.f1; - d.y += _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - c.x -= _GlideRoot.pool.f1; - d.x -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseBottom: - c.y -= _GlideRoot.pool.f1; - d.y -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - c.x += _GlideRoot.pool.f1; - d.x += _GlideRoot.pool.f1; - break; - } - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - /* Maintain the same culling mode that we would have used for - * the inner triangle. - */ - GR_DCL_GC; - const FxU32 cullMode = gc->state.cull_mode; - const FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? (kSetupCullEnable | ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative)) - : kSetupCullDisable); - const float* lVertexList[4]; - - lVertexList[0] = &c.x; - lVertexList[1] = &d.x; - lVertexList[2] = &a->x; - lVertexList[3] = &b->x; - - grAADrawStrip(kSetupStrip | sMode, - lVertexList, - sizeof(lVertexList) / sizeof(lVertexList[0])); - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - if (a->y < b->y) { - grAADrawEdgeTriangle((float *) a, (float *) &c, (float *) &d); - grAADrawEdgeTriangle((float *) a, (float *) &d, (float *) b); - } else { - grAADrawEdgeTriangle((float *) b, (float *) &d, (float *) &c); - grAADrawEdgeTriangle((float *) b, (float *) &c, (float *) a); - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -} /* grAADrawTriEdge */ - -#define DXSQUARED(i,j) ((i->x - j->x) * (i->x - j->x)) -#define DYSQUARED(i,j) ((i->y - j->y) * (i->y - j->y)) - -/* -** -*/ -static aaEdgeSense -aaCalcEdgeSense(const GrVertex *a, const GrVertex *b, const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy; - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - return ((c->x > a->x) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - else if (dy == 0.0f) { - return ((c->y > a->y) ? aaEdgeSenseBottom : aaEdgeSenseTop); - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - return ((cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft); - } - else { - if (dx <= dy) /* X-major line */ - return ((cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - } -} /* aaCalcEdgeSense */ - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, - void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias)) -{ -#define FN_NAME "grAADrawTriangle" - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 96); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - fbzModeOld = gc->state.fbi_config.fbzMode; - - /* backfaced or zero area */ - if (TRISETUP(a, b, c) <= 0) return; - - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - if (ab_antialias) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - } - - if (bc_antialias) { - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - if (ca_antialias) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - /* Restore the old fbzMode */ - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); - GR_END(); -#undef FN_NAME -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygon" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if (TRISETUP (a, b, c) <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - GR_END(); -#undef FN_NAME -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygonVertexList" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nverts,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP (a, b, c); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - - } - GR_END(); - -#undef FN_NAME -} /* grAADrawPolygonVertexList */ - - diff --git a/glide2x/cvg/glide/src/gbanner.c b/glide2x/cvg/glide/src/gbanner.c deleted file mode 100644 index 1ddfb4b..0000000 --- a/glide2x/cvg/glide/src/gbanner.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 17 1/05/98 6:06p Atai - * glide extension stuff - * - * 16 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 15 11/18/97 4:36p Peter - * make thing more translucent - * - * 14 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 13 7/26/97 3:04p Peter - * gratuitous plug is translucent - * - * 12 7/08/97 2:48p Peter - * shameless plug just uses lfb routines - * - * 11 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 10 5/21/97 6:05a Peter - * - * 9 5/02/97 2:08p Pgj - * screen_width/height now FxU32 - * - * 8 3/16/97 2:24a Jdt - * Fixed bug. Didn't initialize info. - * - * 7 3/12/97 11:51p Jdt - * Watcom warning. - * - * 6 3/12/97 4:20p Jdt - * Fixed for VG96 and optimized SST-1 - * - * 5 2/26/97 11:55a Jdt - * Updated banner for new lfb api - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GLIDE_PLUG -#include "banner.inc" -#endif - -/* display the translucent 3Dfx powerfield logo */ -void -_grShamelessPlug(void) -{ -#ifdef GLIDE_PLUG - GrState state; - - GR_BEGIN_NOFIFOCHECK("_grShamelessPlug", 80); - GDBG_INFO_MORE(gc->myLevel, "()\n"); - - grGlideGetState(&state); - grDisableAllEffects(); - - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - grAlphaBlendFunction(GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO); - grClipWindow(0, 0, - gc->state.screen_width - 1, - gc->state.screen_height - 1); - grDepthMask(FXFALSE); - grDepthBufferFunction(GR_CMP_ALWAYS); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grChromaRangeExt(0x0000, 0x0000, GR_CHROMARANGE_RGB_ALL); -#else - grChromakeyValue(0x0000); -#endif - - grChromakeyMode(GR_CHROMAKEY_ENABLE); - grLfbConstantAlpha((FxU8) 0x40); - grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - -#if 1 - /* NB: The banner image is actually upside down. Hence the - * negative stride and starting address calculation. - */ - _grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER, - gc->state.screen_width - (banner_width + 1), - gc->state.screen_height - (banner_height + 1), - GR_LFBWRITEMODE_565, - banner_width, banner_height, - -(banner_width << 1), - banner_data + (banner_width * (banner_height - 1))); -#else - { - const FxI32 maxY = gc->state.screen_height - (banner_height + 1); - const FxI32 maxX = gc->state.screen_width - (banner_width + 1); - static FxI32 y = 0; - static FxI32 x = 0; - static FxI32 plugDir; - - { - const FxI32* maxP; - const FxI32* valP; - - if (maxX > maxY) { - maxP = &maxY; - valP = &y; - } else { - maxP = &maxX; - valP = &x; - } - - if (*valP == 0) plugDir = 1; - else if (*valP >= *maxP) plugDir = -1; - } - - _grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER, - x += plugDir, - y += plugDir, - GR_LFBWRITEMODE_565, - banner_width, banner_height, - -(banner_width << 1), - banner_data + (banner_width * (banner_height - 1))); - } -#endif - - grGlideSetState(&state); - - GR_END(); -#endif /* GLIDE_PLUG */ -} /* _grShamelessPlug */ - diff --git a/glide2x/cvg/glide/src/gdraw.c b/glide2x/cvg/glide/src/gdraw.c deleted file mode 100644 index 3877090..0000000 --- a/glide2x/cvg/glide/src/gdraw.c +++ /dev/null @@ -1,1130 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - ** Revision 1.3 2000/01/17 22:18:41 joseph - ** A nicer, cleaner fix than the evil hack. - ** - ** Revision 1.2 2000/01/15 00:08:22 joseph - ** Evil nasty hack to fix dispatch code using binutils 2.9.5. - ** - ** Revision 1.1.1.1 1999/12/07 21:49:10 joseph - ** Initial checkin into SourceForge. - ** -** -** 98 6/02/98 8:03p Peter -** Mmmmm.... points -** -** 97 6/01/98 6:44p Peter -** snapped/unsnapped points -** -** 96 5/20/98 3:51p Peter -** no fifo glide -** -** 95 5/18/98 12:14p Peter -** better point code -** -** 94 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 93 2/11/98 5:23p Peter -** workaround for tombraider rgb > 255.0 - * - * 92 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 90 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 89 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 85 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 83 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 82 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 81 11/19/97 4:33p Atai - * make vSize debug variable - * - * 80 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 79 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 78 11/16/97 2:20p Peter - * cleanup - * - * 77 11/15/97 7:43p Peter - * more comdex silliness - * - ** - */ -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if GLIDE_DISPATCH_SETUP -#include "fxinline.h" -#endif - -#define SST_XY_HALF (1 << (SST_XY_FRACBITS - 1)) -#define SST_XY_ONE (1 << SST_XY_FRACBITS) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ -GR_ENTRY(grDrawPoint, void, (const GrVertex *p)) -{ -#define FN_NAME "grDrawPoint" - FxU32 x, y; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X) : (%f %f)\n", p, p->x, p->y); - - GR_FLUSH_STATE(); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - } - - /* draw a little triangle, with the lower left corner at pixel center. */ -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 2) + /* Size of Initial coordinate packet */ - _GlideRoot.curVertexSize, /* The full coordinate vertex */ - 2); /* We do two split packets */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - { - /* Lower right corner */ - TRI_SET(x); - TRI_SET(y); - - /* Upper right corner. */ - y -= (0x01UL << (21UL - kNumMantissaBits)); - TRI_SET(x); - TRI_SET(y); - - /* Upper Left corner */ - x -= (0x01UL << (21UL - kNumMantissaBits)); - } - TRI_END; - - /* Packet w/ actual point coordinate and parameter data */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, _GlideRoot.curVertexSize, SSTCP_PKT3_DDDDDD); - { - TRI_SET(x); - TRI_SET(y); - - /* Vertex parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(p, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(p, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - - _GlideRoot.stats.pointsDrawn++; -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - /* GMT: gross overestimate of fifo requirements */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, _GlideRoot.curTriSize >> 2); - { - const struct dataList_s* dlp = gc->regDataList; - int i; - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET(BROADCAST_ID, hw, FvA.x, x); - GR_SET(BROADCAST_ID, hw, FvA.y, y); - - x += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, FvB.x, x); - GR_SET(BROADCAST_ID, hw, FvB.y, y); - - y += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, FvC.x, x); - GR_SET(BROADCAST_ID, hw, FvC.y, y); - - i = _GlideRoot.stats.pointsDrawn++; - _GlideRoot.stats.pointsDrawn = ++i; - - dlp = gc->regDataList; - i = dlp->i; - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - while (i) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(p,i)); - dlp++; - i = dlp->i; - } - - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -#undef FN_NAME -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- - ** grDrawLine - ** - ** NOTE: 1. this will not fill the last pixel in line because - ** B2 or C is on the right edge and the right edge is not - ** drawn. - ** (0,0) - ** - ** A(x1,y1-0.5)+ - ** | \ - ** | \ \ - ** (x1,y1)* \ - ** | * \ - ** | *\ \ - ** B1(x1,y1+0.5)+ * \ - ** \ \ * +B2(x2,y2-0.5) - ** \ * | - ** \ \ * | - ** \ \ + (x2,y2) - ** \ | - ** \ | - ** +C(x2,y2+0.5) - */ - -GR_ENTRY(grDrawLine, void, (const GrVertex *a, const GrVertex *b)) -{ -#define FN_NAME "grDrawLine" - int i, j; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("grDrawLine", 91); - GDBG_INFO_MORE(gc->myLevel, "A: (%f %f) B: (%f %f)\n", - a->x, a->y, b->x, b->y); - - GR_FLUSH_STATE(); - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if (i < 0) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* One packet w/ 4 vertices */ - GR_SET_EXPECTED_SIZE((_GlideRoot.curVertexSize << 2), 1); - { - const float* const fa = (float*)a; - const float* const fb = (float*)b; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - TRI_PACKET_BEGIN(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, _GlideRoot.curVertexSize, SSTCP_PKT3_BDDDDD); - { - float fBias = - _GlideRoot.pool.fHalf; - int vIndex; - - /* x macjor */ - if (j >= i) { - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET]); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET]); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } else { /* y major */ - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } - } - TRI_END; - } - GR_CHECK_SIZE(); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(12 + _GlideRoot.curTriSize, (_GlideRoot.curTriSize + 12) >> 2); - { - float m, dp; - struct dataList_s* dlp; - - /* - ** X major line - */ - if (j >= i) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.x, a->x); - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x, dp); - GR_SETF(BROADCAST_ID, hw, FvC.x, dp); - - GR_SETF(BROADCAST_ID, hw, FvA.y, a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y, dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.y, dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), dp * m); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - } - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,_GlideRoot.pool.ftemp1); - - GR_SETF(BROADCAST_ID, hw, FvB.x,a->x); - GR_SETF(BROADCAST_ID, hw, FvB.y,a->y + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,-_GlideRoot.pool.ftemp1); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.y,a->y); - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y,dp); - GR_SETF(BROADCAST_ID, hw, FvC.y,dp); - - GR_SETF(BROADCAST_ID, hw, FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), dp * m); - } - GR_SET(BROADCAST_ID, hw, triangleCMD, 0xFFFFFFFF); - - GR_SETF(BROADCAST_ID, hw, FvB.x, a->x + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FvB.y, a->y); - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - - GR_END(); -#undef FN_NAME -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- - ** grDrawTriangle - */ - -GR_ENTRY(grDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -{ -#define FN_NAME grDrawTriangle -#if defined(GLIDE_USE_C_TRISETUP) || defined(__WATCOMC__) || defined(GLIDE_DEBUG) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Silly warning killer */ - if (0) goto all_done; - -#ifdef GLIDE_DEBUG - if (_GlideRoot.environment.triBoundsCheck) { - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF("Triangle out of bounds:\n"); - GDBG_PRINTF("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y); - GDBG_PRINTF("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y); - GDBG_PRINTF("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y); - GDBG_PRINTF("Culling triangle based on these bogus values.\n"); - goto all_done; - } - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ -#if GLIDE_DEBUG && !GLIDE_USE_C_TRISETUP - /* HackAlert: Nuke the fifo ptr checking stuff here if we're just - * debugging teh asm tri code. - */ - if (TRISETUP(a, b, c) != 0) { - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; - gc->checkCounter = 0; - } -#else - TRISETUP(a, b, c); -#endif - -all_done: - GR_END(); -#else -#if defined(__MSC__) - { - extern struct _GlideRoot_s _GlideRoot; - - _asm { - mov eax, [_GlideRoot + kCurGCOffset]; - mov eax, [eax + kTriProcOffset]; - jmp eax; - } - } -#endif -#if defined( __linux__ ) - - /* Here's the basic strategy for this dispatch code: - * We jump to _GlideRoot.curGC->archDispatchProcs.triSetupProc - * which contains code that looks like a function, we leave the - * paramters passed to grDrawTriangle on the stack and the dispatched - * function picks them up. However we have to compensate for - * the compiler pushing anything on the stack. The following describes - * why and when we have to pop. - * - * BIG_OPT: gcc pushes a frame pointer to maintain things, BIG_OPT - * turns on -fomit-frame-pointer so we don't have to pop it. - * - * PIC: When using position independant code gcc stores eip in ebx - * so it saves ebx from the previous call automatically. - * Therefore, once we have the jump address we have to pop ebx - * to restore the stack. - * - * The syntax is further complicated by the fact that gcc can (and will) - * emit code between the asm statements, so they all need to be in a single - * asm statement, wrapped with #ifdef's. This means we have fun with - * deciding if we need to list trashed registers and when we need commas - * between them. - */ - - asm ( -#if defined(PIC) - "popl %%ebx\n\t" -#endif -#if !defined(BIG_OPT) - "popl %%ebp\n\t" -#endif - "jmp *%0" - : /* no outputs */ - : "m" (_GlideRoot.curGC->cmdTransportInfo.triSetupProc) -#if defined (PIC) || !defined (BIG_OPT) - : -#endif -#if defined (PIC) - "ebx" -#endif -#if defined (PIC) && !defined (BIG_OPT) - , -#endif -#if !defined(BIG_OPT) - "ebp" -#endif - ); -#endif -#endif -#undef FN_NAME -} /* grDrawTriangle */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ -GR_ENTRY(grDrawPlanarPolygon, - void, - (int nVerts, const int iList[], const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygon(nVerts, iList, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[iList[0]]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[iList[i]], &vList[iList[i+1]]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[iList[i]], &vList[iList[i+1]]); - } - } -all_done: -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygonVertexList(nVerts, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[0]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[i], &vList[i+1]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[i], &vList[i+1]); - } - -all_done: - ; - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygonVertexList */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -#define kMaxPacket3Vertex 0x0FUL - -/* Packet 3 requires at least one vertex, if there isn't enough room - * in the fifo then force a wrap now and write up to the max. - */ -#define FIFO_VERT(__vertSize, __polyVerts) \ - ((gc->cmdTransportInfo.fifoRoom < (FxI32)(sizeof(FxU32) + (__vertSize))) \ - ? (__polyVerts) \ - : MIN((__polyVerts), ((gc->cmdTransportInfo.fifoRoom - sizeof(FxU32)) / (__vertSize)))) - -#define FIFO_MAX_VERT(__polyVerts) MIN(kMaxPacket3Vertex, (__polyVerts)) -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygon, void, (int nVerts, const int iList[], const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygon" - GR_BEGIN_NOFIFOCHECK("grDrawPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* vertexIndexP = iList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_ASSERT((packSize % vertexParamOffset) == 0); - GR_ASSERT(packSize >= vertexParamOffset); - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, - packSize / vertexParamOffset, vertexParamOffset, - packType); - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)(vList + *vertexIndexP++); - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* Are there more vertices that need to be sent for this - * polygon? Reset the parameters and do the rest of them. - */ - if (vertexIndexP < iList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", nVerts, packVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[iList[0]], &vList[iList[i]], &vList[iList[i+1]]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygonVertexList" - GR_BEGIN_NOFIFOCHECK("grDrawPolygonVertexList", 92); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const GrVertex* vertexListP = vList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - GR_ASSERT(packVerts > 0); - GR_ASSERT(packVerts <= kMaxPacket3Vertex); - - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, packVerts, vertexParamOffset, packType); - - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)vertexListP++; - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - /* dpc - 10 feb 1998 - - * Some apps send color values outside of the range [0..255] - */ -#undef RGBA_COMP -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - ((((float)(__fpVal)) > 255.0f) \ - ? (__fpMask) \ - : ((((float)(__fpVal)) < 0.0f) \ - ? 0x00UL \ - : ((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)))) << (__fpShift)) - - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* More verts? */ - if (vertexListP < vList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - /* Packet type to continue strip */ - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", packVerts, nVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[0], &vList[i], &vList[i+1]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygonVertexList */ - -/*--------------------------------------------------------------------------- - ** _grColorCombineDelta0Mode - ** - ** GMT: when we are in delta0 mode, color comes from the RGB iterators - ** but the slopes are 0.0. So when we enter delta0 mode we set - ** the iterators up and then we leave them alone during primitive - ** rendering - */ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, (FxBool delta0mode)) -{ -#define FN_NAME "_grColorCombineDelta0Mode" - GR_BEGIN_NOFIFOCHECK("_grColorCombineDelta0Mode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",delta0mode); - - if (delta0mode) { - GR_SET_EXPECTED_SIZE(9 << 2, 9); - { - GR_SETF(BROADCAST_ID, hw, Fr, gc->state.r); - GR_SETF(BROADCAST_ID, hw, Fg, gc->state.g); - GR_SETF(BROADCAST_ID, hw, Fb, gc->state.b); - GR_SET(BROADCAST_ID, hw, drdx, 0); - GR_SET(BROADCAST_ID, hw, drdy, 0); - GR_SET(BROADCAST_ID, hw, dgdx, 0); - GR_SET(BROADCAST_ID, hw, dgdy, 0); - GR_SET(BROADCAST_ID, hw, dbdx, 0); - GR_SET(BROADCAST_ID, hw, dbdy, 0); - } - GR_CHECK_SIZE(); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); -#undef FN_NAME -} /* _grColorCombineDeltaMode */ - diff --git a/glide2x/cvg/glide/src/gerror.c b/glide2x/cvg/glide/src/gerror.c deleted file mode 100644 index bc607bd..0000000 --- a/glide2x/cvg/glide/src/gerror.c +++ /dev/null @@ -1,281 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:10 joseph -** Initial checkin into SourceForge. -** -** -** 28 3/14/98 1:07p Peter -** mac port happiness -** -** 27 2/11/98 5:23p Peter -** no more infinite recursion - * - * 26 12/18/97 2:13p Peter - * cleaned up the error code - * - * 25 12/09/97 12:20p Peter - * mac glide port - * - * 24 12/05/97 4:38p Peter - * sli vs assertions - * - * 23 12/03/97 11:34a Peter - * dos debugging - * - * 22 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 21 11/15/97 8:55p Peter - * Removed OutputDebugString - * - * 20 11/15/97 7:43p Peter - * more comdex silliness - * - * 19 11/12/97 2:27p Peter - * - * 18 11/12/97 11:16a Peter - * cleaned up assertions - * - * 17 11/04/97 5:04p Peter - * cataclysm part deux - * - * 16 11/03/97 4:02p Peter - * cataclysm fix - * - * 15 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 14 10/23/97 5:28p Peter - * sli fifo thing - * - * 13 9/24/97 1:29p Peter - * more assertion spewage - * - * 12 9/05/97 5:29p Peter - * changes for direct hw - * - * 11 5/30/97 5:44p Peter - * Version that does basic triangles/registers w/ command fifo. Does not - * currently download textures correctly. - * - * 10 5/28/97 9:05a Peter - * Merge w/ latest glide changes - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:05a Peter - * - * 7 5/20/97 9:47a Pgj - * Use OutputDebugString for non-fatal errors under windows - * - * 6 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include -#ifdef __DOS__ -# include -#endif - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -void (*GrErrorCallback)( const char *string, FxBool fatal ); - -void _doGrErrorCallback( const char *name, const char *msg, FxBool fatal ) -{ - char buf[1024]; - -#if GDBG_INFO_ON - /* Neuter any fifo checking from the failing - * call. Otherwise entries into the shutdown - * calls cause spurious crap. - */ - if (fatal) { - GR_DCL_GC; - - gc->checkCounter = - gc->expected_counter = 0; - - gc->checkCounter = - gc->checkPtr = 0UL; - } -#endif /* GDBG_INFO_ON */ - - gdbg_printf("%s: %s.\n", name, msg); - sprintf(buf,"%s: %s.\n", name, msg); - GrErrorCallback(buf, fatal); - - if (fatal) exit(1); -} - -GR_DIENTRY(grErrorSetCallback, void, - ( void (*function) ( const char *string, FxBool fatal ) )) -{ - GDBG_INFO(80,"grErrorSetCallback(0x%x)",function); - GrErrorCallback = function; -} - -#ifdef __WIN32__ -void -_grErrorWindowsCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) { - GDBG_ERROR("glide", s); - grGlideShutdown(); - MessageBox(NULL, s, NULL, MB_OK); - } -} -#endif - -void -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) { - GDBG_ERROR("glide",s); - grGlideShutdown(); - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) - { - Str255 errBuf; - - errBuf[0] = sprintf((char*)(errBuf + 1), "%s", s); - DebugStr(errBuf); - } -#endif /* (GLIDE_PLATFORM * GLIDE_OS_MACOS) */ - } -} - -#ifdef __DOS__ -int _guHeapCheck( void ) -{ - int i = _heapchk(); - - if ( i != _HEAPOK ) - printf( "heapchk: %d\n", i ); - - return ( i == 0 ); -} -#endif - -void -_grAssert(char *exp, char *fileName, int lineNo) -{ - GR_DCL_GC; - GR_DCL_HW; - - /* No recursive re-entry thank you very much */ - { - static FxBool inProcP = FXFALSE; - if (inProcP) return; - inProcP = FXTRUE; - } - - /* dpc - 28 may 1997 - FixMe! - * What to do here? - */ -#if GLIDE_INIT_HAL - -#else /* !GLIDE_INIT_HAL */ - /* initRestoreVideo(); */ - sst1InitShutdown(gc->base_ptr); -#endif /* !GLIDE_INIT_HAL */ - - gdbg_printf("ASSERTION FAILED:\n"); - gdbg_printf("\tExpression: %s\n", exp); - gdbg_printf("\tFile: %s\n", fileName); - gdbg_printf("\tLine: %d\n", lineNo); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO - /* Spew about the state of the fifo since that's what most of the - * assertions are about anyway. - */ - { - gdbg_printf("Command Fifo:\n"); - gdbg_printf("\tfifoPtr: 0x%X\n" - "\tfifoParams: 0x%X : (0x%X : 0x%X)\n" - "\tfifoRoom: 0x%X : (0x%X : 0x%X)\n" - "\tfifo hw: (0x%X : 0x%X) : (0x%X : 0x%X : 0x%X)\n" - "\tStatus: 0x%X\n", - gc->cmdTransportInfo.fifoPtr, - gc->cmdTransportInfo.fifoStart, gc->cmdTransportInfo.fifoEnd, - gc->cmdTransportInfo.fifoSize, - gc->cmdTransportInfo.fifoRoom, - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead, - GR_GET(hw->cmdFifoDepth), GR_GET(hw->cmdFifoHoles), GR_GET(hw->cmdFifoBase), - GR_GET(hw->status)); - -#if !GLIDE_INIT_HAL - if (gc->scanline_interleaved) { - SstRegs* slaveHw = (SstRegs*)gc->slave_ptr; - slaveHw = slaveHw; // FIXME: Below might not exist. *sigh* - - GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n", - HW_FIFO_PTR(FXFALSE), - GR_GET(slaveHw->cmdFifoDepth), - GR_GET(slaveHw->cmdFifoHoles), - GR_GET(slaveHw->status)); - } -#endif /* !GLIDE_INIT_HAL */ - -#if GLIDE_USE_SHADOW_FIFO - if (gc->cmdTransportInfo.fifoShadowBase != NULL) { - const FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowBase; - - GDBG_PRINTF("Shadow Fifo: 0x%X\n", gc->cmdTransportInfo.fifoShadowPtr); - -#if 0 - while(fifoPtr != gc->cmdTransportInfo.fifoShadowPtr) GDBG_PRINTF("0x%X\n", *fifoPtr++); - GDBG_PRINTF("\n"); - - GDBG_PRINTF("Up to fifo wrap: \n"); - while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2)) - GDBG_PRINTF("0x%X\n", *fifoPtr++); -#endif - - free(gc->cmdTransportInfo.fifoShadowBase); - } -#endif /* GLIDE_USE_SHADOW_FIFO */ - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */ - - gdbg_printf("ABNORMAL TERMINATION\n"); - - exit(-1); - -} /* _grAssert */ diff --git a/glide2x/cvg/glide/src/gglide.c b/glide2x/cvg/glide/src/gglide.c deleted file mode 100644 index 830f7d9..0000000 --- a/glide2x/cvg/glide/src/gglide.c +++ /dev/null @@ -1,2594 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:10 joseph -** Initial checkin into SourceForge. -** -** -** 168 7/02/98 6:59p Peter -** Fixed merge problem from previous checkin -** -** 167 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old ( -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_STATE_ENTRY(grAlphaBlendFunction, void, - (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df)) -{ -#define FN_NAME "grAlphaBlendFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaBlendFunction", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d,%d,%d,%d)\n", - rgb_sf, rgb_df, alpha_sf, alpha_df); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - - if (rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - - alphamode |= ((((FxU32) rgb_sf) << SST_RGBSRCFACT_SHIFT) | - (((FxU32) rgb_df) << SST_RGBDSTFACT_SHIFT) | - (((FxU32) alpha_sf) << SST_ASRCFACT_SHIFT) | - (((FxU32) alpha_df) << SST_ADSTFACT_SHIFT)); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ - -GR_STATE_ENTRY(grAlphaCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grAlphaCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grAlphaCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT); - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.ac_requires_it_alpha = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#undef FN_NAME -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_STATE_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - FxU32 fbzColorPath; - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if (enable) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_STATE_ENTRY(grAlphaTestFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grAlphaTestFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestFunction", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if (fnc != GR_CMP_ALWAYS) - alphamode |= ((fnc << SST_ALPHAFUNC_SHIFT) | SST_ENALPHAFUNC); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_STATE_ENTRY(grAlphaTestReferenceValue, void, (GrAlpha_t value)) -{ -#define FN_NAME "grAlphaTestReferenceValue" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestReferenceValue", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",value); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= (((FxU32) value) << SST_ALPHAREF_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grAlphaTestReferenceValue */ - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, (GrColor_t color, GrAlpha_t alpha, FxU16 depth)) -{ -#define FN_NAME "grBufferClear" - GR_BEGIN_NOFIFOCHECK("grBufferClear", 86); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x,0x%x)\n", color, alpha, depth); - - { - const GrColor_t oldc1 = gc->state.fbi_config.color1; - const FxU32 oldzacolor = gc->state.fbi_config.zaColor; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - FxU32 zacolor = oldzacolor; - FxBool doneP = FXFALSE; - FxBool doColorP = ((fbzMode & SST_RGBWRMASK) != 0); - FxBool doAuxP = FXFALSE; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - const FxU32 clipBottomTop = gc->state.fbi_config.clipBottomTop; - const FxU32 bottomOriginP = ((fbzMode & SST_YORIGIN) == SST_YORIGIN); - FxBool didClipP = FXFALSE; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - /* Setup source registers */ - if (doColorP) _grSwizzleColor(&color); - if ((fbzMode & SST_ZAWRMASK) != 0) { - if ((fbzMode & SST_ENALPHABUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= (((FxU32) alpha) << SST_ZACOLOR_ALPHA_SHIFT); - } else if ((fbzMode & SST_ENDEPTHBUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= (((FxU32) depth) << SST_ZACOLOR_DEPTH_SHIFT); - } - } - - /* Why were we called? */ - if (!doColorP && !doAuxP) return; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* If the width clipping is the same as the screen resolution - * then we can use the sgram fill rect to clear the page aligned - * region, and then use the fastFillCmd to clear the remainder. - * - * NB: The test really does check against (clipLeft == 0) && - * (clipright == screenWidth) since screenWidth should have 0 - * in its upper bits. - * - * First we convert the vertical clipping from pixel coordinates - * to tile coordinates. (The top coordinate is rounded up to the - * next page, and the bottom coordinate is rounded down.) A page - * (4k) is composed of two tiles layed out horizontally. We then - * map this into fbi memory based on the current screen - * resolution, set in grSstWinOpen, scaled into tile space as - * well. Ick! - * - * To top it all of we have this 'special' case thanks to sli and - * y origin flipping. The problem is that each card is responsible - * for rendering its set of scanlines, regardless or the location - * of the y origin. However, if the origin is 'flipped' then it - * can be the case that the 'first' scanline on the screen is - * actually odd. To get around this the hw implicitly adds two - * invisible (they're always black) scanlines to the renderable - * area. If the y origin is at the top of the screen then - * scanlines screenHeight and (screenHeight + 1) are not - * rendered. If the origin is 'flipped' then scanlines 0 and - * (screenHeight + 1) are not rendered. - */ - if (gc->state.fbi_config.clipLeftRight == gc->state.screen_width) { - const FxU32 screenHeightAdjust = (gc->scanline_interleaved && bottomOriginP ? 1 : 0); - const FxU32 screenHeight = gc->state.screen_height + screenHeightAdjust; - const FxU32 yTileShift = gc->hwDep.cvgDep.yTileShift; - const FxU32 yTileMask = ((0x01 << yTileShift) - 1); - const FxU32 regBottom = ((clipBottomTop >> SST_CLIPBOTTOM_SHIFT) & 0x0FFF); - const FxU32 regTop = ((clipBottomTop >> SST_CLIPTOP_SHIFT) & 0x0FFF); - const FxU32 clipLow = (bottomOriginP ? screenHeight - regTop : regBottom); - const FxU32 clipHi = (bottomOriginP ? screenHeight - regBottom : regTop); - const FxU32 tileLow = ((clipLow >> yTileShift) + (((clipLow & yTileMask) == 0) ? 0 : 1)); - const FxU32 tileHi = (clipHi >> yTileShift); - - /* If they're both in the same tile then just clear using a - * fastFillCmd - */ - if (tileHi <= tileLow) goto __skipBlitClear; - - /* Column size is always a full page size divided by the # - * of points in a tile row (2 tiles). - * - * NB: This set is 'lifted' out of the groupings below because - * it is common and stays set accross blit invocations. - */ - { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, bltSize, - ((((((tileHi - tileLow) * gc->hwDep.cvgDep.xTilePages) - 1) << 16) | (0x1000 >> 3)) - 1)); - GR_CHECK_SIZE(); - } - - /* Clear the current buffer */ - if (doColorP) { - const FxU32 tileBuffer = (gc->hwDep.cvgDep.numBufferPages * gc->hwDep.cvgDep.renderBuf); - - REG_GROUP_BEGIN(BROADCAST_ID, bltDstXY, 3, 0x29); - { - /* Starting point of the blit. We always do a full page in x. */ - REG_GROUP_SET(hw, bltDstXY, - (((tileBuffer + (tileLow * gc->hwDep.cvgDep.xTilePages)) << 16) | 0x00UL)); - - /* dpc - 27 aug 1997 - FixMe! - * What is the right way of converting the 888 color that we're - * passed into a 565 color? - */ - REG_GROUP_SET(hw, bltColor, (((color & 0xF8UL) >> (3 + 0)) | /* blue [4:0] */ - ((color & 0xFC00UL) >> (2 + 3)) | /* green [10:5] */ - ((color & 0xF80000UL) >> (3 + 5)))); /* red [15:11] */ - - REG_GROUP_SET(hw, bltCommand, (SSTG_FRECTFILL | /* SGRAM Fill command */ - 0x80000000)); /* Start blit signal */ - } - REG_GROUP_END(); - } - - /* Clear the aux buffer */ - if (doAuxP) { - const FxU32 tileBuffer = (gc->hwDep.cvgDep.numBufferPages * gc->state.num_buffers); - - REG_GROUP_BEGIN(BROADCAST_ID, bltDstXY, 3, 0x29); - { - REG_GROUP_SET(hw, bltDstXY, (((tileBuffer + (tileLow * gc->hwDep.cvgDep.xTilePages)) << 16) | - 0x00UL)); - REG_GROUP_SET(hw, bltColor, zacolor); - REG_GROUP_SET(hw, bltCommand, (SSTG_FRECTFILL | /* SGRAM Fill command */ - 0x80000000)); /* Start blit signal */ - } - REG_GROUP_END(); - } - - __skipBlitClear: - /* Did we round off crap to page align the top part of - * clipping? If so then reset the hw clipping and use - * the normal fastFillCmd on this region. - */ - didClipP = ((tileLow << yTileShift) > clipLow); - if (didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41UL); - { - /* Set the colors */ - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, - 2 + bottomOriginP, (bottomOriginP | 0x28UL)); - { - /* Put the origin in our canonical clipping form */ - if (bottomOriginP) REG_GROUP_SET(hw, fbzMode, fbzMode & ~SST_YORIGIN); - - /* Reset the clipping to have the same top clipping and - * our rounded clip value as the bottom. - */ - REG_GROUP_SET(hw, clipBottomTop, ((clipLow << SST_CLIPBOTTOM_SHIFT) | - MIN(((tileLow << yTileShift) << SST_CLIPTOP_SHIFT), clipHi))); - - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - } - REG_GROUP_END(); - } - - /* If we're done then we have to restore the color registers. - * Otherwise, leave them set for the next fastFillCmd, and - * reset the clipping for the bottom rounding error. - */ - doneP = ((tileLow > tileHi) | - ((tileHi << yTileShift) == clipHi)); - if (doneP && didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } else if (!doneP) { - const FxBool origSetP = (bottomOriginP & !didClipP); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1 + origSetP, (origSetP | 0x8UL)); - { - if (origSetP) REG_GROUP_SET(hw, fbzMode, fbzMode & ~SST_YORIGIN); - - /* Reset the clipping to have the same bottom clipping and - * our rounded clip value as the top. - */ - REG_GROUP_SET(hw, clipBottomTop, (((tileHi << yTileShift) << SST_CLIPBOTTOM_SHIFT) | - (clipHi << SST_CLIPTOP_SHIFT))); - } - REG_GROUP_END(); - - /* Clear the color sense flags so that we don't waste - * time sending them again, and always set the clip flag. - */ - doColorP = - doAuxP = FXFALSE; - didClipP = FXTRUE; - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - if (!doneP) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* Restore clipping */ - if (didClipP) { - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, - bottomOriginP + 1, (bottomOriginP | 0x8UL)); - { - if (bottomOriginP) REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - } - -#undef FN_NAME -} /* grBufferClear */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -/* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ -void -_grSliOriginClear(void) -{ -#define FN_NAME "_grSliOriginClear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 86); - - GR_ASSERT(gc->scanline_interleaved); - GR_ASSERT(gc->hwDep.cvgDep.sliOriginBufCount != 0); - - /* Setup the two pixel high area to clear */ - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 3, 0x1003UL); - { - REG_GROUP_SET(hw, clipLeftRight, gc->state.screen_width); - REG_GROUP_SET(hw, clipBottomTop, 0x01UL); - REG_GROUP_SET(hw, c1, 0x00UL); - } - REG_GROUP_END(); - - /* Do the clear */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21UL); - { - REG_GROUP_SET(hw, fbzMode, - ((gc->state.fbi_config.fbzMode & ~SST_YORIGIN) | - (~gc->state.fbi_config.fbzMode & SST_YORIGIN) | - SST_RGBWRMASK)); - REG_GROUP_SET(hw, fastfillCMD, 0x01UL); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21UL); - { - REG_GROUP_SET(hw, fbzMode, - (gc->state.fbi_config.fbzMode | SST_RGBWRMASK)); - REG_GROUP_SET(hw, fastfillCMD, 0x01UL); - } - REG_GROUP_END(); - - /* Restore the initial glide state. - * NB: Cannot be done in one packet. Wah! - */ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - GR_CHECK_SIZE(); - - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 3, 0x1003UL); - { - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_END(); - - gc->hwDep.cvgDep.sliOriginBufCount--; -#undef FN_NAME -} -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ -GR_ENTRY(grBufferSwap, void, (int swapInterval)) -{ -#define FN_NAME "grBufferSwap" - int vSync; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",swapInterval); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (gc->hwDep.cvgDep.singleBufferP) return; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - -#if ((GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3)) - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) _grShamelessPlug(); - - /* check for environmental override. - * - * NB: If we are sli, the application passes in 0, and the user has - * elected to not sync to retrace then we honor the user's - * choice. Otherwise we force syncing because most apps don't know - * any better. If, however, the user has not chosen, but the app - * wants something other than 0 then we need to honor their choice. - */ - swapInterval = ((_GlideRoot.environment.swapInterval >= 0) - ? _GlideRoot.environment.swapInterval - : (gc->scanline_interleaved ? MAX(swapInterval, 1) : swapInterval)); - - GR_CHECK_F(myName, - (swapInterval > 255) || (swapInterval < 0), - "swap_interval out of range"); - - /* Wait until there's 6 or fewer buffer swaps pending. the hardware - * counter is only 3 bits so we don't want it to overflow also the - * latency gets too long. - */ - while (grBufferNumPending() > 6) - ; - - /* if the interval is non-zero turn on VSYNC waiting */ - vSync = (swapInterval > 0); - - if (swapInterval > 0) swapInterval--; - - /* NOTE: we need a PCI read before and after the swap command */ - /* but since we already called grBufferNumPending() we've done a read */ - { - const FxU32 swapCmdVal = (swapInterval << 1) | vSync; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO - /* When the command fifo is enabled we need to do a naked - * set to the command register too so that the num swaps pending - * field in status is kept in sync w/ reality. - * - * NB: This must be done before the fifo write to avoid a race - * condition if the hw is on our ass. - * - * NB: We fence here just in case since we are hopefully going to - * figure out the damn uswc problem soon. - */ - SET(hw->swapbufferCMD, swapCmdVal); - P6FENCE; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */ - - GR_SET_EXPECTED_SIZE(4, 1); - GR_SET(BROADCAST_ID, hw, swapbufferCMD, swapCmdVal); - GR_CHECK_SIZE(); - } - -#ifdef GLIDE_DEBUG - { - if ((FxI32)_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if ((_GlideRoot.stats.bufferSwaps == 0) || - (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot + 3)) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - if (_GlideRoot.stats.bufferSwaps == 0) saveDBG[i] = (char)GDBG_GET_DEBUGLEVEL(i); - GDBG_SET_DEBUGLEVEL(i, 0); - } - } - - /* turn on tracing after the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - GDBG_SET_DEBUGLEVEL(i, saveDBG[i]); - } - } - } - } -#endif /* GLIDE_DEBUG */ - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (gc->hwDep.cvgDep.sliOriginBufCount != 0) _grSliOriginClear(); - -#if GLIDE_BLIT_CLEAR - { - const FxU32 numBufs = gc->state.num_buffers; - FxU32* bufPtrs[3]; - FxU32 i; - - bufPtrs[0] = &gc->hwDep.cvgDep.renderBuf; - bufPtrs[1] = &gc->hwDep.cvgDep.frontBuf; - bufPtrs[2] = &gc->hwDep.cvgDep.backBuf; - - for(i = 0; i < sizeof(bufPtrs) / sizeof(*bufPtrs); i++) { - *bufPtrs[i] = (*bufPtrs[i] + 1) % numBufs; - } - - GDBG_INFO(gc->myLevel, - "\trenderBuf: 0x%X\n", - gc->hwDep.cvgDep.renderBuf); - } -#endif /* GLIDE_BLIT_CLEAR */ -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - grSstStatus(); /* special bug workaround */ -#else -# error "Need to implement swap." -#endif /* GLIDE_PLATFORM & GLIDE_HW_SST1 */ - - _GlideRoot.stats.bufferSwaps++; - - GR_END(); -#undef FN_NAME -} /* grBufferSwap */ - -/*--------------------------------------------------------------------------- -** grBufferNumPending -*/ - -GR_ENTRY(grBufferNumPending, int, (void)) -{ - int pend; /* Num Swaps pending */ - - { - FxU32 status = grSstStatus(); - -#if ((GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3)) - pend = ((status & SST_SWAPBUFPENDING) >> SST_SWAPBUFPENDING_SHIFT); -#else -#error "Implement BufferNumPending for this hardware" -#endif - } - - GDBG_INFO(86,"grBufferNumPending() => %d\n", pend); - - return pend; -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_STATE_ENTRY(grChromakeyMode, void, (GrChromakeyMode_t mode)) -{ -#define FN_NAME "grChromakeyMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grChromakeyMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (mode == GR_CHROMAKEY_ENABLE) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipFBI, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grChromaKeyMode */ - -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ -GR_STATE_ENTRY(grChromakeyValue, void, (GrColor_t color)) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 10); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - gc->state.fbi_config.chromaKey = color; - -#if 1 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipFBI, hw, chromaKey, color); - GR_CHECK_SIZE(); -#else - /* Experimental fix to see if the increased precison of v^2 bilinear - * blending (.4 to .8) was causing more grief to developers who did - * the hacky by turning on chroma w/ bilinear. - */ -#define kChromaOffset 2 - { - const FxI32 compR = (color >> 16) & 0xFF; - const FxI32 compG = (color >> 8) & 0xFF; - const FxI32 compB = (color >> 0) & 0xFF; - const FxU32 chromaMin = ((MAX(compR - kChromaOffset, 0x00) << 16) | - (MAX(compG - kChromaOffset, 0x00) << 8) | - (MAX(compB - kChromaOffset, 0x00) << 0)); - const FxU32 chromaMax = ((MIN(compR + kChromaOffset, 0xFF) << 16) | - (MIN(compG + kChromaOffset, 0xFF) << 8) | - (MIN(compB + kChromaOffset, 0xFF) << 0)); - - REG_GROUP_BEGIN(eChipFBI, chromaKey, 2, 0x03UL); - { - REG_GROUP_SET(hw, chromaKey, chromaMin); - REG_GROUP_SET(hw, chromaRange, chromaMax | SST_ENCHROMARANGE); - } - REG_GROUP_END(); - } -#undef kChromaOffset -#endif -#undef FN_NAME -} /* grChromaKeyValue */ - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO(85, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((maxx > gc->state.screen_width) || (maxy > gc->state.screen_height)), - "Max clip coordinate > screen size"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((minx > LONG_MAX) || (miny > LONG_MAX)), - "Negative min clip coordinate"); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO(85, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - *clipLeftRight = (minx << SST_CLIPLEFT_SHIFT) | (maxx << SST_CLIPRIGHT_SHIFT); - *clipBottomTop = (miny << SST_CLIPBOTTOM_SHIFT) | (maxy << SST_CLIPTOP_SHIFT); - - GDBG_INFO(85, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop); - -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_STATE_ENTRY(grClipWindow, void, (FxU32 minx, FxU32 miny, - FxU32 maxx, FxU32 maxy)) -{ -#define FN_NAME "grClipWindow" - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN_NOFIFOCHECK("grClipWindow",83); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 2, 0x03); - { - REG_GROUP_SET(hw, clipLeftRight, clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = (float) minx; - gc->state.clipwindowf_xmax = (float) maxx; - gc->state.clipwindowf_ymin = (float) miny; - gc->state.clipwindowf_ymax = (float) maxy; - - GR_END(); -#undef FN_NAME -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_STATE_ENTRY(grColorCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grColorCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA , - "unsupported color combine function"); - - /* Starting w/ Voodoo^2 the ccu has texture RGB mode as well. */ - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_RGB || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (factor == GR_COMBINE_FACTOR_TEXTURE_RGB) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.cc_requires_it_rgb = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_STATE_ENTRY(grColorMask, void, (FxBool rgb, FxBool alpha)) -{ -#define FN_NAME "grColorMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grColorMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x)\n", rgb, alpha); - - fbzMode = gc->state.fbi_config.fbzMode; - -#if 0 - GR_CHECK_W(myName, - (fbzMode & SST_ENDEPTHBUFFER) && alpha, - "alpha writes enabled even though depth buffering"); -#endif - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (alpha && (gc->grAuxBuf == 0)), - "cannot enable alpha buffering w/o allocating one"); - - if (rgb) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - /* XXX Should check for triple buffering too */ - - if (!(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3)) { - if (alpha) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_STATE_ENTRY(grConstantColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grConstantColorValue" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",color); - - _grSwizzleColor(&color); - - REG_GROUP_BEGIN(BROADCAST_ID, c0, 2, 0x03); - { - REG_GROUP_SET(hw, c0, color); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - - GR_END(); -#undef FN_NAME -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, (float a, float r, float g, float b)) -{ -#define FN_NAME "grConstantColorValue4" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue4",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - - if (gc->state.cc_delta0mode) { - REG_GROUP_BEGIN(BROADCAST_ID, Fr, 3, 0x07); - { - REG_GROUP_SETF(hw, Fr, r); - REG_GROUP_SETF(hw, Fg, g); - REG_GROUP_SETF(hw, Fb, b); - } - REG_GROUP_END(); - } - - GR_END(); -#undef FN_NAME -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, (GrCullMode_t mode)) -{ -#define FN_NAME "grCullMode" - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - gc->state.cull_mode = mode; - -#if GLIDE_HW_TRI_SETUP - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, mode); -#endif /* GLIDE_HW_TRI_SETUP */ - - GR_END(); -#undef FN_NAME -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_STATE_ENTRY(grDepthBiasLevel, void, (FxI16 level)) -{ -#define FN_NAME "grDepthBiasLevel" - FxU32 zacolor; - GR_BEGIN_NOFIFOCHECK("grDepthBiasLevel", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",level); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = (zacolor & ~SST_ZACOLOR_DEPTH) | (level & SST_ZACOLOR_DEPTH); - - gc->state.fbi_config.zaColor = zacolor; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, zaColor, zacolor); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_STATE_ENTRY(grDepthBufferFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grDepthBufferFunction" - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grDepthBufferFunction",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= (fnc << SST_ZFUNC_SHIFT); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -#undef FN_NAME -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_STATE_ENTRY(grDepthBufferMode, void, (GrDepthBufferMode_t mode)) -{ -#define FN_NAME "grDepthBufferMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthBufferMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (mode != GR_DEPTHBUFFER_DISABLE) && (gc->grAuxBuf == 0), - "cannot enable depth buffer w/o allocating one"); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | - SST_WBUFFER | - SST_ENZBIAS | - SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#undef FN_NAME -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -FxBool - -_grCanSupportDepthBuffer(void) -{ - GR_DCL_GC; - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return FXFALSE; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_STATE_ENTRY(grDepthMask, void, (FxBool enable)) -{ -#define FN_NAME "grDepthMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F(myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration"); - - if (enable) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, (void)) -{ - GDBG_INFO(87,"grDisableAllEffects()\n"); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grDepthBiasLevel(0); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grFogMode(GR_FOG_DISABLE); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_STATE_ENTRY(grDitherMode, void, (GrDitherMode_t mode)) -{ -#define FN_NAME "grDitherMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDitherMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (_GlideRoot.environment.disableDitherSub == FXTRUE) - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2); - else - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT); - - switch (mode) { - case GR_DITHER_DISABLE: - break; - - case GR_DITHER_2x2: - fbzMode |= (SST_ENDITHER | SST_DITHER2x2); - break; - - case GR_DITHER_4x4: - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - break; - } - - gc->state.fbi_config.fbzMode = fbzMode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_STATE_ENTRY(grFogMode, void, (GrFogMode_t mode)) -{ -#define FN_NAME "grFogMode" - FxU32 fogmode; - GR_BEGIN_NOFIFOCHECK("grFogMode", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~(SST_ENFOGGING | - SST_FOGADD | - SST_FOGMULT | - SST_FOG_ALPHA | - SST_FOG_Z | - SST_FOG_CONSTANT); - - switch (mode & 0xFF) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= (SST_ENFOGGING | SST_FOG_ALPHA); - break; - - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= (SST_ENFOGGING | SST_FOG_Z); - break; - - case GR_FOG_WITH_TABLE: - fogmode |= (SST_ENFOGGING); - break; - } - if (mode & GR_FOG_MULT2) fogmode |= SST_FOGMULT; - if (mode & GR_FOG_ADD2) fogmode |= SST_FOGADD; - - /* GMT says that this should be enabled for CVG. It is always safe - * to enable these even when fogging is not enabled. - */ - fogmode |= (SST_FOG_DITHER | SST_FOG_ZONES); - - /* - ** Update the hardware and Glide state - */ - gc->state.fbi_config.fogMode = fogmode; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogMode, fogmode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#undef FN_NAME -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_STATE_ENTRY(grFogColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK("grFogColorValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.fogColor = color; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogColor, color); - GR_CHECK_SIZE(); -#undef FN_NAME -} /* grFogColorValue */ - -/*--------------------------------------------------------------------------- -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, (const GrFog_t fogtable[])) -{ -#define FN_NAME "grFogTable" - const GrFog_t *locTable = fogtable; - const int iend = (kInternalFogTableEntryCount >> 1); - GR_BEGIN_NOFIFOCHECK("grFogTable",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",fogtable); - GR_ASSERT(fogtable != NULL); - GR_ASSERT(kInternalFogTableEntryCount == 64); - - REG_GROUP_LONG_BEGIN(BROADCAST_ID, fogTable[0], 32); - { - int j; - - for (j = 0; j < iend; j++) { - FxU32 e0, e1, d0, d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - - GR_CHECK_COMPATABILITY(FN_NAME, - (e1 < e0), - "Invalid fog table entry. (Must be monotonically increasing)"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((j > 0) ? (e0 < locTable[-1]) : 0), - "Invalid fog table entry. (Must be monotonically increasing)"); - - /* del0 in .2 format */ - d0 = ((e1 - e0) << 2); - - /* del1 in .2 format - don't access beyond end of table */ - d1 = ((j == (iend - 1)) ? e1 : locTable[2]); - d1 = (d1 - e1) << 2; - - REG_GROUP_SET(hw, fogTable[j], - ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - GDBG_INFO(gc->myLevel + 200, "fogTable[%ld]: 0x%X\n", - j, ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - locTable += 2; - } - } - REG_GROUP_END(); - - GR_END(); -#undef FN_NAME -} /* grFogTable */ - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, (void)) -{ - _GlideRoot.windowsInit = FXFALSE; - - if (!_GlideRoot.initialized) return; /* never made it thru startup */ - -#if GLIDE_SANITY_SIZE - /* GMT: reset the counter so we can proceed without assertions */ - { - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } -#endif /* GLIDE_SANITY_SIZE */ - - { - int i; - GR_BEGIN_NOFIFOCHECK("grGlideShutdown\n", 80); - - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - grSstSelect(i); - grSstWinClose(); - } - -#if GLIDE_INIT_HAL - fxHalShutdownAll(); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * Move this to the new initCode world some time. - * - * initClose(); - * - * NB: This is only necessary to properly shtudown the hw and vxd - * if the application never called grSstWinOpen because they are - * doing some sort of hw/dll detection before trying to run w/ - * glide. - */ - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - if (_GlideRoot.GCs[i].hwInitP) { - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(_GlideRoot.GCs[i].base_ptr, FXFALSE); - } - sst1InitShutdown(_GlideRoot.GCs[i].base_ptr); - - _GlideRoot.GCs[i].hwInitP = FXFALSE; - } - } -#endif /* !GLIDE_INIT_HAL */ - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - } -} /* grGlideShutdown */ - - -/*------------------------------------------------------------------- - Function: _grFlushCommonStateRegs - Date: 14-Oct-97 - Implementor(s): dpc - Description: - Flushes all State Monster regs. If we're not doing Glide 3, - then it's still used by grGlideSetState() - Arguments: - - Return: - -------------------------------------------------------------------*/ -void -_grFlushCommonStateRegs() -{ -#define FN_NAME "_grFlushCommonStateRegs" - GR_BEGIN("_grFlushCommonStateRegs", 97, 13 * sizeof(FxU32), 2); - - /* NB: This logical write must be split into two writes since the - * registers are non-contiguous (not good for packet 1) and are the - * register span is larget (greater than the 14 register mask size - * for packet 4). - */ - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 10, 0x1C7F); - { - REG_GROUP_SET(hw, fbzColorPath, gc->state.fbi_config.fbzColorPath); - REG_GROUP_SET(hw, fogMode, gc->state.fbi_config.fogMode); - REG_GROUP_SET(hw, alphaMode, gc->state.fbi_config.alphaMode); - REG_GROUP_SET(hw, fbzMode, gc->state.fbi_config.fbzMode); - - REG_GROUP_SET(hw, lfbMode, gc->state.fbi_config.lfbMode); - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - - REG_GROUP_SET(hw, fogColor, gc->state.fbi_config.fogColor); - REG_GROUP_SET(hw, zaColor, gc->state.fbi_config.zaColor); - REG_GROUP_SET(hw, chromaKey, gc->state.fbi_config.chromaKey); - } - REG_GROUP_NO_CHECK_END(); - - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, stipple, 3, 0x07); - { - REG_GROUP_SET(hw, stipple, gc->state.fbi_config.stipple); - REG_GROUP_SET(hw, c0, gc->state.fbi_config.color0); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_NO_CHECK_END(); - - - GR_END(); - -#undef FN_NAME -} /* _grFlushCommonStateRegs */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ -GR_ENTRY(grGlideSetState, void, (const GrState *state)) -{ -#define FN_NAME "grGlideSetState" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - { - const FxBool texChangeP = (((gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) != 0); - if (texChangeP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* If we're on sli and the new state includes changing the origin - * that we clear the slop lines at the bottom of the screen. - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state. */ - _grFlushCommonStateRegs(); - - GR_SET_EXPECTED_SIZE((7 * sizeof(FxU32)) * gc->num_tmu, gc->num_tmu); - { - int tmu; - - for (tmu = 0; tmu < gc->num_tmu; tmu++) { - SstRegs* tmuregs = SST_TMU(hw, tmu); - const FifoChipField chipField = (FifoChipField)(0x02UL << tmu); - - REG_GROUP_NO_CHECK_BEGIN(chipField, textureMode, 7, 0x7F); - { - REG_GROUP_SET(tmuregs, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(tmuregs, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(tmuregs, tDetail, gc->state.tmu_config[tmu].tDetail); - REG_GROUP_SET(tmuregs, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - - REG_GROUP_SET(tmuregs, texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1); - REG_GROUP_SET(tmuregs, texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2); - REG_GROUP_SET(tmuregs, texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8); - } - REG_GROUP_NO_CHECK_END(); - } - } - GR_CHECK_SIZE(); - - /* NOTE: since glide state includes things like hints and all cached - * variables like paramIndex we needn't recompute these, BUT: we do - * need to rebuild stuff that depends on them!!! - */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_STATE_ENTRY(grRenderBuffer, void, (GrBuffer_t buffer)) -{ -#define FN_NAME "grRenderBuffer" - GR_BEGIN_NOFIFOCHECK("grRenderBuffer", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",buffer); - GR_CHECK_F(myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer"); - - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= ((buffer == GR_BUFFER_FRONTBUFFER) - ? SST_DRAWBUFFER_FRONT - : SST_DRAWBUFFER_BACK); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - /* Setting the render buffer means we need to adjust - * our current pointer to the render buffer's physical - * address if we're doing blit clears. - */ - { - const FxU32 oldRenderBuf = gc->hwDep.cvgDep.renderBuf; - - gc->hwDep.cvgDep.renderBuf = ((buffer == GR_BUFFER_FRONTBUFFER) - ? gc->hwDep.cvgDep.frontBuf - : gc->hwDep.cvgDep.backBuf); - if ((gc->hwDep.cvgDep.renderBuf != oldRenderBuf) && - (gc->hwDep.cvgDep.sliOriginBufCount != 0)) _grSliOriginClear(); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - - GR_END(); -#undef FN_NAME -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - - /* dpc - 13 sep 1997 - FixMe! - * Setting one packet for now. - */ - GR_CHECK_FOR_ROOM(n, 1); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, (void)) -{ -#define FN_NAME "_grUpdateParamIndex" - GR_DCL_GC; - FxU32 paramIndex = 0; - const FxU32 hints = gc->state.paramHints; - const FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - const FxU32 fogMode = gc->state.fbi_config.fogMode; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[] = { - /* 0 */ - STATE_REQUIRES_OOW_FBI, - - /* 1 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - - /* 2 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - - /* 3 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - - /* 4 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 5 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 6 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - - /* 7 */ - STATE_REQUIRES_OOW_FBI | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 | - STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - }; - - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if (gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode) { - paramIndex |= STATE_REQUIRES_IT_DRGB; - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if (( fbzColorPath & SST_ALOCALSELECT ) == SST_ALOCAL_Z ) { - paramIndex |= STATE_REQUIRES_OOZ; - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } else { - paramIndex |= STATE_REQUIRES_OOZ; - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); -#undef FN_NAME -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) -#define RED Fr_ALT -#define DRDX Fdrdx_ALT -#define DRDY Fdrdy_ALT -#define GRN Fg_ALT -#define DGDX Fdgdx_ALT -#define DGDY Fdgdy_ALT -#define BLU Fb_ALT -#define DBDX Fdbdx_ALT -#define DBDY Fdbdy_ALT -#define ALF Fa_ALT -#define DADX Fdadx_ALT -#define DADY Fdady_ALT -#define Z Fz_ALT -#define DZDX Fdzdx_ALT -#define DZDY Fdzdy_ALT -#define S Fs_ALT -#define DSDX Fdsdx_ALT -#define DSDY Fdsdy_ALT -#define T Ft_ALT -#define DTDX Fdtdx_ALT -#define DTDY Fdtdy_ALT -#define W Fw_ALT -#define DWDX Fdwdx_ALT -#define DWDY Fdwdy_ALT -#else -#define RED Fr -#define DRDX Fdrdx -#define DRDY Fdrdy -#define GRN Fg -#define DGDX Fdgdx -#define DGDY Fdgdy -#define BLU Fb -#define DBDX Fdbdx -#define DBDY Fdbdy -#define ALF Fa -#define DADX Fdadx -#define DADY Fdady -#define Z Fz -#define DZDX Fdzdx -#define DZDY Fdzdy -#define S Fs -#define DSDX Fdsdx -#define DSDY Fdsdy -#define T Ft -#define DTDX Fdtdx -#define DTDY Fdtdy -#define W Fw -#define DWDX Fdwdx -#define DWDY Fdwdy -#endif - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t cullMode) -{ - GR_DCL_GC; - FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? kSetupCullEnable - : kSetupPingPongDisable); - if (sMode != kSetupPingPongDisable) sMode |= ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative); - -#if GLIDE_DISPATCH_SETUP -#define COLOR_COMP_ARGB ((SST_SETUP_RGB | SST_SETUP_A) << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_RGB (SST_SETUP_RGB << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_MASK COLOR_COMP_ARGB - - /* Setup custom triangle/strip procs. - * - * NB: Currently this selection is based entirely on if - * we're sending color information. We should possibly - * select on cpu type as well to determine if we should - * do sw culling or not. - */ - if ((paramMask & SSTCP_PKT3_PACKEDCOLOR) == SSTCP_PKT3_PACKEDCOLOR) { - const FxU32 colorComp = paramMask & COLOR_COMP_MASK; - - switch(colorComp) { - case COLOR_COMP_ARGB: - gc->cmdTransportInfo.triSetupProc = TRISETUP_ARGB(cullMode); - break; - - case COLOR_COMP_RGB: - gc->cmdTransportInfo.triSetupProc = TRISETUP_RGB(cullMode); - break; - - /* If no rgb data then it is not worthwhile to pack - * just alpha so just mask off the packed color bit - * and just use the looping proc. - */ - default: - gc->cmdTransportInfo.triSetupProc = TRISETUP_NORGB(cullMode); - paramMask &= ~SSTCP_PKT3_PACKEDCOLOR; - break; - } - } else { - gc->cmdTransportInfo.triSetupProc = TRISETUP_NORGB(cullMode); - } -#endif /* GLIDE_DISPATCH_SETUP */ - - gc->cmdTransportInfo.paramMask = paramMask; - - /* Compute the common case packet 3 header which just needs - * the vertex count and strip/command type to be completed. - */ - gc->cmdTransportInfo.cullStripHdr = ((sMode << SSTCP_PKT3_SMODE_SHIFT) | - paramMask | - SSTCP_PKT3); - - /* Independent triangle hdr for grDrawTriangle */ - gc->cmdTransportInfo.triPacketHdr = (gc->cmdTransportInfo.cullStripHdr | - (0x3UL << SSTCP_PKT3_NUMVERTEX_SHIFT) | - SSTCP_PKT3_BDDBDD); - -#if GLIDE_TRI_CULLING - /* If we're doing sw culling for independent triangles then turn off - * the hw culling so we're consistent. HW culling, however, remains - * enabled for things using strips/fans. - */ - if (cullMode != GR_CULL_DISABLE) { - gc->cmdTransportInfo.triPacketHdr &= ~(kSetupCullEnable << SSTCP_PKT3_SMODE_SHIFT); - } -#endif /* GLIDE_TRI_CULLING */ -} -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - * _grRebuildDataList - * - * NB: For CVG is *IMPERATIVE* that the writes to the parameter - * dataList remain in the order below otherwise the parameters - * will get written to the command packet in the wrong order. - */ -GR_DDFUNC(_grRebuildDataList, void, (void)) -{ -#define FN_NAME "_grRebuildDataList" - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 i; - SstRegs *tmu0; - SstRegs *tmu1; - -#if GLIDE_PACKED_RGB - FxBool packedRGB = FXFALSE; -#endif /* GLIDE_PACKED_RGB */ - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif /* GLIDE_DEBUG */ - - GDBG_INFO(85,"(s) paramHints=0x%x paramIndex=0x%x\n", FN_NAME, - gc->state.paramHints,gc->state.paramIndex); - - curTriSize = params = 0; - i = gc->state.paramIndex; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are ALTernate register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask = 0x00; -#endif /* GLIDE_HW_TRI_SETUP */ - - if (i & STATE_REQUIRES_IT_DRGB) { -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_R_OFFSET << 2; - - /* When using packed color we only add *ONE* item to the data list - * and this signals the entire color set since it is not possible - * to specify a single color component in any packet. - */ -#if !GLIDE_PACKED_RGB - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_G_OFFSET << 2; - gc->tsuDataList[curTriSize + 2] = GR_VERTEX_B_OFFSET << 2; -#endif /* !GLIDE_PACKED_RGB */ -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET << 2; - gc->regDataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET << 2; - - gc->regDataList[curTriSize + 0].addr = (float*)&hw->RED; - gc->regDataList[curTriSize + 1].addr = (float*)&hw->GRN; - gc->regDataList[curTriSize + 2].addr = (float*)&hw->BLU; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_PACKED_RGB - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; -#else /* !GLIDE_PACKED_RGB */ - curTriSize += 3; - params += 3; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_IT_ALPHA) { -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_A_OFFSET << 2; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->ALF; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - -#if GLIDE_PACKED_RGB - { - /* Only increment the parameter packet size if we have not already - * added the rgb fields. - */ - if ((i & STATE_REQUIRES_IT_DRGB) == 0) params += 1; - packedRGB = FXTRUE; - } -#else /* !GLIDE_PACKED_RGB */ - params += 1; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_OOZ) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOZ_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->Z; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - -#if GLIDE_FP_CLAMP_TEX -#if !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP -#error "Does not make sense to have GLIDE_FP_CLAMP_TEX w/o GLIDE_FP_CLAMP or GLIDE_HW_TRI_SETUP" -#endif /* !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP */ - - /* Simplify the test for clamping only the texture parameters by - * sticking an extra empty slot into the data list. - * - * NB: This means that the code that runs through the parameter list - * needs to increment the datalist pointer before moving onto the - * texture parameters. - */ - gc->tsuDataList[curTriSize++] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* TMU0 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->S; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu0->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_W_TMU1) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - - } - - if (i & STATE_REQUIRES_ST_TMU1) { -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->S; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu1->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - -#if (GLIDE_NUM_TMU > 2) -#error "GLIDE_NUM_TMU > 2: Write this code." -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 0; /* terminate the list with 0,* */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize] = 0; -#endif /* GLIDE_HW_TRI_SETUP */ - - curTriSize++; - -#if GLIDE_HW_TRI_SETUP - /* Per vertex size: (xy [required] + parameters) * param size (32 bit word) */ - _GlideRoot.curVertexSize = ((2 + params) << 2); - - /* Packet size: 3 * vertex size */ - _GlideRoot.curTriSize = (_GlideRoot.curVertexSize << 1) + _GlideRoot.curVertexSize; - - /* Shift the parameter mask to just write into the packet header. */ - GDBG_INFO(191, "CVG ParamMask: 0x%X\n", gc->cmdTransportInfo.paramMask); - gc->cmdTransportInfo.paramMask <<= SSTCP_PKT3_PMASK_SHIFT; - -#if GLIDE_PACKED_RGB - if (packedRGB) gc->cmdTransportInfo.paramMask |= SSTCP_PKT3_PACKEDCOLOR; -#endif /* GLIDE_PACKED_RGB */ - - /* Update common packet 3 headers */ - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, gc->state.cull_mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 1; - gc->regDataList[curTriSize].addr = (float*)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.paramCount = params; - _GlideRoot.curTriSize = (6 + curTriSize + (params << 1)) << 2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params << 3); -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_FP_CLAMP_TEX - /* Stick one more 0 in the dataList so that the texture clamping - * loop does not go one more iteration. - */ - gc->tsuDataList[++curTriSize] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - -#ifdef GDBG_INFO_ON -#if GLIDE_HW_TRI_SETUP - for (i = 0; gc->tsuDataList[i]; i++) { - GDBG_INFO(282," tsuDataList[%d] = %2d [%s]\n", - i, gc->tsuDataList[i] >> 2, p_str[gc->tsuDataList[i] >> 2]); - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - for (i = 0; gc->regDataList[i].i; i++) { - GDBG_INFO(282," dataList[%d] = %2d 0x%x [%s]\n", - i, gc->regDataList[i].i >> 2, gc->regDataList[i].addr, - p_str[gc->regDataList[i].i >> 2]); - } -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ -#endif /* GDBG_INFO_ON */ - -#undef FN_NAME -} /* _grRebuildDataList */ - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/cvg/glide/src/glfb.c b/glide2x/cvg/glide/src/glfb.c deleted file mode 100644 index 7d560ac..0000000 --- a/glide2x/cvg/glide/src/glfb.c +++ /dev/null @@ -1,1124 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:10 joseph -** Initial checkin into SourceForge. -** -** -** 75 6/23/98 5:38p Peter -** lfb hinting -** -** 74 4/29/98 2:49p Peter -** fixed debug build -** -** 73 4/16/98 3:54p Peter -** removed cruft -** -** 72 4/01/98 1:51p Peter -** sli origin thing vs grRenderBuffer -** -** 71 3/31/98 6:09p Peter -** sli origin everywhere (I think) and grLfbReadRegion/grRenderBuffer vs -** triple buffering -** -** 70 3/29/98 1:07p Peter -** yet another sli origin thing -** -** 69 3/23/98 5:57p Peter -** warning cleanup -** -** 68 3/18/98 3:04p Peter -** cleaner origin swapping hacks -** -** 67 3/13/98 1:56p Peter -** more sli origin swapping -** -** 66 3/13/98 1:27p Peter -** grLfbReadRegion vs triple buffering -** -** 65 3/09/98 2:24p Peter -** change for new pci passthrough interface -** -** 63 3/02/98 7:23p Peter -** clear slop on sli systems when changing y origin -** -** 62 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 61 2/11/98 5:26p Peter -** new write edge stuff -** -** 60 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 59 1/30/98 4:31p Peter -** general clenaup - * - * 58 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 57 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 56 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 55 12/15/97 6:04p Atai - * disable obsolete glide2 api for glide3 - * - * 54 12/15/97 5:54p Peter - * swizzle reads too - * - * 53 12/11/97 4:15p Peter - * mac lfb write region - * - * 52 12/01/97 5:18p Peter - * - * 51 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 50 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 3:38p Dow - * More banshee stuff - * - * 47 11/04/97 5:04p Peter - * cataclysm part deux - * - * 46 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 45 10/27/97 11:10a Peter - * starting cleanup - * - * 44 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 43 10/08/97 5:18p Peter - * fixed grLfbLock wrt writemode_any - * - * 42 10/08/97 11:33a Peter - * hmmmm.... - * - * 41 9/30/97 1:03p Peter - * more debugging code - * - * 40 9/25/97 1:35p Peter - * - * 39 9/24/97 4:09p Peter - * lfb/idle fixes - * - * 38 9/24/97 1:31p Peter - * assert if grXX call inside lock/unlock - * - * 37 9/20/97 10:54a Peter - * naked lfb writes - * - * 36 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, (GrAlpha_t alpha)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",alpha); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, (FxU16 depth)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",depth); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, - FxBool pixelPipeline, GrLfbInfo_t *info)) -{ -#define FN_NAME "grLfbLock" - FxBool rv = FXTRUE; - FxU32 lfbMode = 0, zaColor = 0, fbzMode = 0; - const FxBool idleLockP = ((type & GR_LFB_NOIDLE) == 0); -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - FxBool swizzleByteP = FXFALSE; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP */ - - GR_BEGIN_NOFIFOCHECK("grLfbLock", 87); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d, %d, %d, %d)\n", - type, buffer, writeMode, origin, pixelPipeline); - - GR_CHECK_COMPATABILITY(FN_NAME, !info, - "Null info structure passed."); - /* there is only one revision extant */ - GR_CHECK_COMPATABILITY(FN_NAME, info->size != sizeof(GrLfbInfo_t), - "uninitialized info structure passed."); - - type = type & ~(GR_LFB_NOIDLE); - switch(type) { - case GR_LFB_READ_ONLY: - { - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Read lock failure due to existing lock"); - rv = FXFALSE; - } else { - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN); - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - lfbMode |= SST_LFB_READFRONTBUFFER; - break; - - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READBACKBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READAUXBUFFER; - break; - - default: - GR_CHECK_F(myName, - 1, - "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - gc->state.fbi_config.lfbMode = lfbMode; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= (SST_LFB_READ_SWAP16 | - SST_LFB_READ_BYTESWAP); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - - info->strideInBytes = gc->fbStride * 2; - info->origin = origin; - info->lfbPtr = gc->lfb_ptr; - } - } - break; - - case GR_LFB_WRITE_ONLY: - { - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Write failure due to existing lock"); - rv = FXFALSE; - } else { - /* Set up the constant depth register because it may have - * been trashed by a call to grDepthBiasLevel - * (depthbiaslevel and constant depth use the same register) - */ - zaColor = gc->state.fbi_config.zaColor; - zaColor = (((FxU32) gc->state.lfb_constant_depth) << SST_ZACOLOR_DEPTH_SHIFT); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - - /* disable depth biasing */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENZBIAS); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITEBUFSELECT | - SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE); - - switch(writeMode) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - /* Default to hw */ - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = ((buffer == GR_BUFFER_AUXBUFFER) - ? GR_LFBWRITEMODE_ZA16 - : GR_LFBWRITEMODE_565); - } - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEBACKBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - if (writeMode != GR_LFBWRITEMODE_ZA16) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - break; - } - - lfbMode |= (writeMode << SST_LFB_FORMAT_SHIFT); - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - - if (pixelPipeline) { - lfbMode |= SST_LFB_ENPIXPIPE; - - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin ? SST_YORIGIN : 0); - } - gc->state.fbi_config.lfbMode = lfbMode; - - info->origin = origin; - info->writeMode = writeMode; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - /* Turn on word swizzling by default. - * - * NB: This state does not get shadowed because it is only - * relevant if the app is doing its own lfb writes. When coming - * through grLfbWriteRegion we take care of doing this when - * putting the data in the fifo so the actual rendering state - * in lfbMode is all we care about. - */ - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= SST_LFB_WRITE_SWAP16; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - - switch(lfbMode & SST_LFB_FORMAT) { - case SST_LFB_565: - case SST_LFB_555: - case SST_LFB_1555: - case SST_LFB_ZZ: - info->strideInBytes = gc->fbStride << 1; - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) && SET_BSWAP - if (!gc->cmdTransportInfo.fifoLfbP) lfbMode |= SST_LFB_WRITE_BYTESWAP; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_MACOS) */ - break; - - case SST_LFB_888: - case SST_LFB_8888: - case SST_LFB_Z565: - case SST_LFB_Z555: - case SST_LFB_Z1555: - info->strideInBytes = gc->fbStride << 2; - break; - } - - info->lfbPtr = gc->lfb_ptr; - } - } - break; - default: - rv = FXFALSE; - GDBG_INFO(gc->myLevel, "Lock failed because of invalid lock type."); - break; - } - - if (rv) { - const FxU32 lfbLockCount = gc->cmdTransportInfo.lfbLockCount; - - gc->lockPtrs[type] = buffer; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - /* If the cmd fifo has been turned off before then make sure its - * on again before trying to dork w/ the modes etc. - */ - if (lfbLockCount > 0) { - GR_ASSERT(!gc->cmdTransportInfo.fifoLfbP); - - /* Hack to allow the register writes below to be happy. - * - * NB: This *MUST* come before the unlock call since that - * is going to write a nopCmd via the init code callback. - */ - gc->cmdTransportInfo.lfbLockCount = 0; - -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_RESET, 0UL); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - sst1InitLfbUnlock((FxU32*)hw); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - - /* Setup the hw w/ the settings computed above. */ - switch(type) { - case GR_LFB_READ_ONLY: - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - GR_CHECK_SIZE(); - break; - - case GR_LFB_WRITE_ONLY: - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 3, 0x103); - { - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, lfbMode, lfbMode); - REG_GROUP_SET(hw, zaColor, zaColor); - } - REG_GROUP_END(); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - break; - } - - if (!gc->cmdTransportInfo.fifoLfbP && idleLockP) { - /* This is required to flush the write buffers before the - * actual LFB accesses. - */ - P6FENCE; - - /* Must idle to get things in the right order. */ - grSstIdle(); - } - - /* If we're not coming through grLfbWriteRegion then we need to - * temporarily turn off the command fifo so that the accesses are - * processed correctly by the hw. - */ - if (!gc->cmdTransportInfo.fifoLfbP) { -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - sst1InitLfbLock((FxU32*)hw); - -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_PROTECT, info->strideInBytes); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - - /* Increment lock count */ - gc->cmdTransportInfo.lfbLockCount = lfbLockCount + 1; - } - } - - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock (read only/write only) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, (GrLock_t type, GrBuffer_t buffer)) -{ -#define FN_NAME "grLfbUnlock" - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock", 87); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d)\n", type, buffer); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_COMPATABILITY(FN_NAME, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type"); - - GR_CHECK_COMPATABILITY(FN_NAME, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer"); - -#if ((GLIDE_PLATFORM & GLIDE_HW_SST1) || (GLIDE_PLATFORM & GLIDE_HW_CVG)) - if (gc->lockPtrs[type] == (FxU32)buffer) { - rval = FXTRUE; - gc->lockPtrs[type] = (FxU32)-1; - - /* Is this a direct lfb access? */ - if (!gc->cmdTransportInfo.fifoLfbP) { - /* Flush the write buffers */ - if (type != GR_LFB_READ_ONLY) P6FENCE; - - /* If there are no more outstanding lfb locks, then turn the - * fifo back on before we do anything else otherwise just - * return w/ the new lock count. - */ - gc->cmdTransportInfo.lfbLockCount--; - if (gc->cmdTransportInfo.lfbLockCount == 0) { -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - grHints(GR_HINT_LFB_PROTECT, 0UL); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - sst1InitLfbUnlock((FxU32*)hw); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL */ - } else { - return FXTRUE; - } - } - - GR_SET_EXPECTED_SIZE(8 + MaskSelect(gc->scanline_interleaved, sizeof(FxU32)), - 2 + gc->scanline_interleaved); - { - /* Restore depth bias level */ - GR_SET(BROADCAST_ID, hw, zaColor, gc->state.fbi_config.zaColor); - - /* turn back on depth biasing */ - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - - if (gc->scanline_interleaved) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } else { - GDBG_INFO(gc->myLevel, "Unlock failed because there was no matching lock"); - rval = FXFALSE; - } -#endif - - GR_RETURN(rval); -#undef FN_NAME -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_STATE_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#define FN_NAME "grLfbWriteColorFormat" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorFormat",82); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",colorFormat); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ -GR_STATE_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorSwizzle",82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords); - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - -FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data) -{ -#define FN_NAME "_grLfbWriteRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK("_grLfbWriteRegion", 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x, %s, %d, %d, %d, %d, %d, %d, 0x%x)\n", - dst_buffer, - (pixPipelineP ? "Enable" : "Disable"), - dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - if (src_format == GR_LFB_SRC_FMT_RLE16) - writeMode = GR_LFBWRITEMODE_565; - else - writeMode = src_format; - - gc->cmdTransportInfo.fifoLfbP = FXTRUE; - info.size = sizeof(info); - - if (grLfbLock(GR_LFB_WRITE_ONLY | GR_LFB_NOIDLE, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - pixPipelineP, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - /* When writing to the fifo we give an offset from the - * start of the lfb so we don't need to add it in here. - */ -#if USE_PACKET_FIFO - dstData = (FxU32*)(dst_y * info.strideInBytes); -#else - dstData = (FxU32*)(((FxU8*)info.lfbPtr) + (dst_y * info.strideInBytes)); -#endif - - srcData = (FxU32*)src_data; - scanline = src_height; - - switch(src_format) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData & 0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - - if (aligned) { - while(scanline--) { - GR_ASSERT(((FxU32)dstData & 0x03UL) == 0); - end = (FxU32*)((char*)srcData + length - 2); - - if (srcData < end) { - LINEAR_WRITE_BEGIN(length >> 2, kLinearWriteLFB, dstData, 0x00, 0x00); - while(srcData < end) { - LINEAR_WRITE_SET_16((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - } - - if ((length & 0x3) != 0x00) { - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData) + dstJump); - srcData = (FxU32*)(((char*)srcData) + srcJump); - } - } else { - while(scanline--) { - GR_ASSERT(((FxU32)dstData & 0x03UL) != 0); - end = (FxU32*)((char*)srcData + length); - - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, - *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - if (srcData < end) { - const FxU32 numWords = (((FxU32)end - (FxU32)srcData) >> 2); - FxU32 i; - - LINEAR_WRITE_BEGIN(numWords, kLinearWriteLFB, dstData, 0x00, 0x00); - for(i = 0; i < numWords; i++) { - LINEAR_WRITE_SET_16((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - } - - if ((length & 0x03) == 0) { - LINEAR_WRITE_EDGE(kLinearWriteLFB, dstData, - *(FxU16*)srcData, sizeof(FxU16)); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData) + dstJump); - srcData = (FxU32*)(((char*)srcData) + srcJump); - } - } - break; - - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while(scanline--) { - end = (FxU32*)((char*)srcData + length); - - LINEAR_WRITE_BEGIN(src_width, - kLinearWriteLFB, - (FxU32)dstData, - 0x00, 0x00); - while(srcData < end) { - LINEAR_WRITE_SET((FxU32)dstData, srcData[0]); - dstData++; - srcData++; - } - LINEAR_WRITE_END(); - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - break; - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock(GR_LFB_WRITE_ONLY, dst_buffer); - } else { - rv = FXFALSE; - } - gc->cmdTransportInfo.fifoLfbP = FXFALSE; - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data)) -{ - FxBool rv = FXTRUE; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - rv = _grLfbWriteRegion(FXFALSE, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - GR_RETURN(rv); -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, (GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data)) -{ -#define FN_NAME "grLfbReadRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion", 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define kTileSize (32 * sizeof(FxU16)) -#define kTileMask (kTileSize - 1) -#define kPageMask ((kTileSize << 1) - 1) - - { - const FxBool swapP = ((gc->grColBuf >= 3) && - (((src_buffer == GR_BUFFER_BACKBUFFER) && (gc->hwDep.cvgDep.backBuf == 2)) || - ((src_buffer == GR_BUFFER_FRONTBUFFER) && (gc->hwDep.cvgDep.frontBuf == 2)))); - - if (swapP && (gc->grAuxBuf > 0)) sst1InitAllocBuffers(gc->base_ptr, - gc->grColBuf, - 0); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - const FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - - dstData = (FxU32*)dst_data; - srcData = (const FxU32*)((FxU8*)info.lfbPtr + - (src_y * info.strideInBytes) + - (src_x << 1)); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Voodoo2 has a problem reading from the frame buffer if we are - * triple buffering and the triple buffer is the currently - * active lfb buffer. The problem is that the 32 pixel screen - * tiles are reversed such that the logical tiling 0101 comes - * back as 1010. We do the 'swapping' here for the app, but - * if they use direct lfb accesses they are screwed. - */ - if (swapP) { - while(scanline--) { - FxU32* const dstEnd = (FxU32*)((FxU8*)dstData + length); - const FxU32* end = (const FxU32*)((FxU8*)srcData + length); - const FxU32* tilePtr; - const FxU32* tileEnd; - const FxU32* tileEndAlign; - - /* Leading slop up to the start of a logical 0 tile */ - if (((FxU32)srcData & kPageMask) != 0) { - FxU32 tileSlopMask = 0xFFFFFFFFUL; - FxU32 tileSlopAdjust = kTileSize; - - /* Do we have a partial 0 tile? */ - if (((FxU32)srcData & kTileSize) == 0) { - tilePtr = (const FxU32*)((FxU32)srcData + kTileSize); - tileEnd = (const FxU32*)(((FxU32)end <= ((FxU32)tilePtr & ~kTileMask)) - ? ((FxU32)end + kTileSize) - : (((FxU32)tilePtr + kTileSize) & ~kTileMask)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x03UL); - - /* Are we aligned in the hw lfb? */ - if (((FxU32)tilePtr & 0x03UL) != 0) { - *(FxU16*)dstData = GR_GET16(*tilePtr); - dstData = (FxU32*)((FxU8*)dstData + sizeof(FxU16)); - tilePtr = (const FxU32*)((FxU8*)tilePtr + sizeof(FxU16)); - } - - /* Copy the remainder of the 0 tile */ - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) *(FxU16*)dstData = GR_GET16(*tilePtr); - - tileSlopMask = ~kTileMask; - tileSlopAdjust = 0; - } - - /* Copying the logical 1 tile. This may require us to go - * 'backwards' in physical memory if there was no logical - * 0 tile in the current read. - */ - tilePtr = (const FxU32*)(((FxU32)srcData - tileSlopAdjust) & tileSlopMask); - tileEnd = (const FxU32*)MIN((((FxU32)tilePtr + kTileSize) & ~kTileMask), - (FxU32)end - kTileSize - sizeof(FxU16)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x03UL); - - if (tilePtr < tileEnd) { - /* Are we aligned in the hw lfb? */ - if (((FxU32)tilePtr & 0x03UL) != 0) { - *(FxU16*)dstData = GR_GET16(*tilePtr); - dstData = (FxU32*)((FxU8*)dstData + sizeof(FxU16)); - tilePtr = (const FxU32*)((FxU8*)tilePtr + sizeof(FxU16)); - } - - /* Copy the remainder of the logical 1 tile */ - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - } - - srcData = (const FxU32*)(((FxU32)srcData + (kTileSize << 1)) & ~kPageMask); - } - - /* Loop over complete logical 01 tile groups */ - { - const FxU32* endTileAddr = (const FxU32*)((FxU32)end & ~kPageMask); - - while(srcData < endTileAddr) { - tilePtr = (const FxU32*)((FxU32)srcData + kTileSize); - tileEnd = (const FxU32*)((FxU32)tilePtr + kTileSize); - while(tilePtr < tileEnd) *dstData++ = GR_GET(*tilePtr++); - - tilePtr = srcData; - tileEnd = (const FxU32*)((FxU32)tilePtr + kTileSize); - while(tilePtr < tileEnd) *dstData++ = GR_GET(*tilePtr++); - - srcData = (const FxU32*)((FxU8*)srcData + (kTileSize << 1)); - } - } - - /* Slop 01 tile group */ - if (srcData < end) { - const FxU32* startTileAddr = (const FxU32*)((FxU32)srcData + kTileSize); - - tilePtr = startTileAddr; - tileEnd = (const FxU32*)((FxU32)startTileAddr + - MIN(kTileSize, ((FxU32)end - (FxU32)srcData))); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x3); - - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - - if (startTileAddr < end) { - tilePtr = srcData; - tileEnd = (const FxU32*)((FxU8*)tilePtr + kTileSize - - ((FxU32)tileEndAlign - (FxU32)end)); - tileEndAlign = (const FxU32*)((FxU32)tileEnd & ~0x3); - - while(tilePtr < tileEndAlign) *dstData++ = GR_GET(*tilePtr++); - if (tileEnd != tileEndAlign) - *(FxU16*)dstData = GR_GET16(*tilePtr); - } - } - - /* Adjust pointers */ - dstData = (FxU32*)((FxU8*)dstEnd + dstJump); - srcData = (const FxU32*)((FxU8*)end + srcJump); - } - } else -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - /* If the source data is aligned for 4 byte pci reads */ - if (((FxU32)srcData & 0x02UL) == 0) { - while(scanline--) { - const FxU32* end = (const FxU32*)((char*)srcData + length - 2); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (((int)length) & 0x2) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - const FxU32* end = (const FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (FxU16)GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (!(((int)length) & 0x2)) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - - grLfbUnlock(GR_LFB_READ_ONLY, src_buffer); - } else { - rv = FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - if (swapP && (gc->grAuxBuf > 0)) sst1InitAllocBuffers(gc->base_ptr, - gc->grColBuf, - gc->grAuxBuf); - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - GR_RETURN(rv); -#undef FN_NAME -}/* grLfbReadRegion */ - diff --git a/glide2x/cvg/glide/src/glide.h b/glide2x/cvg/glide/src/glide.h deleted file mode 100644 index f0ed986..0000000 --- a/glide2x/cvg/glide/src/glide.h +++ /dev/null @@ -1,1518 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef GLIDE3_ALPHA -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINT_LFB_WRITE 4 -#define GR_HINT_LFB_PROTECT 5 -#define GR_HINT_LFB_RESET 6 -#define GR_HINTTYPE_MAX GR_HINT_LFB_RESET -#ifdef H3D -#define GR_HINT_H3DENABLE GR_HINTTYPE_MAX -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX GR_HIT_H3DENABLE -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - FxU8 *bm_data, - long bm_h, - FxU32 u0, - FxU32 v0, - FxU32 width, - FxU32 height, - FxU32 dest_width, - FxU32 dest_height, - FxU16 *tlut); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/cvg/glide/src/glide.rc b/glide2x/cvg/glide/src/glide.rc deleted file mode 100644 index dc75c5f..0000000 --- a/glide2x/cvg/glide/src/glide.rc +++ /dev/null @@ -1,71 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" -#include "fxbldno.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#ifndef GLIDE3 -#define VERSIONNAME "glide2x.dll\0" -#else -#define VERSIONNAME "glide3x.dll\0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3Dfx Interactive, Inc.\0" - VALUE "FileDescription", "3Dfx Interactive, Inc. Glide DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1997\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", PRODNAME - VALUE "ProductVersion", VERSIONSTR - VALUE "Graphics Subsystem", HWSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/cvg/glide/src/glidesys.h b/glide2x/cvg/glide/src/glidesys.h deleted file mode 100644 index feefa41..0000000 --- a/glide2x/cvg/glide/src/glidesys.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 10 12/09/97 12:20p Peter - * mac glide port - * - * 9 11/04/97 4:00p Dow - * Banshee Mods - * - * 8 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 7 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 6 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 5 5/21/97 6:05a Peter -*/ -#ifndef __GLIDESYS_H__ -#define __GLIDESYS_H__ - -/* -n** ----------------------------------------------------------------------- -** COMPILER/ENVIRONMENT CONFIGURATION -** ----------------------------------------------------------------------- -*/ - -/* Endianness is stored in bits [30:31] */ -#define GLIDE_ENDIAN_SHIFT 30 -#define GLIDE_ENDIAN_LITTLE (0x1 << GLIDE_ENDIAN_SHIFT) -#define GLIDE_ENDIAN_BIG (0x2 << GLIDE_ENDIAN_SHIFT) - -/* OS is stored in bits [0:6] */ -#define GLIDE_OS_SHIFT 0 -#define GLIDE_OS_UNIX 0x1 -#define GLIDE_OS_DOS32 0x2 -#define GLIDE_OS_WIN32 0x4 -#define GLIDE_OS_MACOS 0x8 -#define GLIDE_OS_OS2 0x10 -#define GLIDE_OS_OTHER 0x40 /* For Proprietary Arcade HW */ - -#define GLIDE_SST_SHIFT 7 -#define GLIDE_SST_HW (0x2 << GLIDE_SST_SHIFT) - -/* Hardware Type is stored in bits [9:13] */ -#define GLIDE_HW_SHIFT 9 -#define GLIDE_HW_SST1 (0x1 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SST96 (0x2 << GLIDE_HW_SHIFT) -#define GLIDE_HW_H3 (0x4 << GLIDE_HW_SHIFT) -#define GLIDE_HW_CVG (0x10 << GLIDE_HW_SHIFT) - -/* -** Make sure we handle all instances of WIN32 -*/ -#ifndef __WIN32__ -# if defined (_WIN32) || defined (WIN32) || defined(__NT__) -# define __WIN32__ -# endif -#endif - -/* We need two checks on the OS: one for endian, the other for OS */ -/* Check for endianness */ -#if defined(__IRIX__) || defined(__sparc__) || defined(MACOS) -# define GLIDE_ENDIAN GLIDE_ENDIAN_BIG -#else -# define GLIDE_ENDIAN GLIDE_ENDIAN_LITTLE -#endif - -/* Check for OS */ -#if defined(__IRIX__) || defined(__sparc__) || defined(__linux__) -# define GLIDE_OS GLIDE_OS_UNIX -#elif defined(__DOS__) -# define GLIDE_OS GLIDE_OS_DOS32 -#elif defined(__WIN32__) -# define GLIDE_OS GLIDE_OS_WIN32 -#elif defined(macintosh) -# define GLIDE_OS GLIDE_OS_MACOS -#else -#error "Unknown OS" -#endif - -#define GLIDE_SST GLIDE_SST_HW - -/* Check for type of hardware */ -#ifdef SST96 -# define GLIDE_HW GLIDE_HW_SST96 -#elif defined(H3) -# define GLIDE_HW GLIDE_HW_H3 -#elif defined(CVG) -# define GLIDE_HW GLIDE_HW_CVG -#else /* Default to SST1 */ -# define GLIDE_HW GLIDE_HW_SST1 -#endif - - -#define GLIDE_PLATFORM (GLIDE_ENDIAN | GLIDE_OS | GLIDE_SST | GLIDE_HW) - -/* -** Control the number of TMUs -*/ -#ifndef GLIDE_NUM_TMU -# define GLIDE_NUM_TMU 2 -#endif - - -#if ((GLIDE_NUM_TMU < 0) && (GLIDE_NUM_TMU > 3)) -# error "GLIDE_NUM_TMU set to an invalid value" -#endif - -#endif /* __GLIDESYS_H__ */ diff --git a/glide2x/cvg/glide/src/glideutl.h b/glide2x/cvg/glide/src/glideutl.h deleted file mode 100644 index e578740..0000000 --- a/glide2x/cvg/glide/src/glideutl.h +++ /dev/null @@ -1,186 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 11 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 10 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 9 1/05/98 6:04p Atai - * move 3df gu related data structure from glide.h to glideutl.h - * - * 8 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 7 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 6 8/14/97 5:32p Pgj - * remove dead code per GMT - * - * 5 6/12/97 5:19p Pgj - * Fix bug 578 - * - * 4 3/05/97 9:36p Jdt - * Removed guFbWriteRegion added guEncodeRLE16 - * - * 3 1/16/97 3:45p Dow - * Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO -*/ - -/* Glide Utility routines */ - -#ifndef __GLIDEUTL_H__ -#define __GLIDEUTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -#endif - -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -guAADrawTriangleWithClip( const GrVertex *a, const GrVertex - *b, const GrVertex *c); - -FX_ENTRY void FX_CALL -guDrawTriangleWithClip( - const GrVertex *a, - const GrVertex *b, - const GrVertex *c - ); - -FX_ENTRY void FX_CALL -guDrawPolygonVertexListWithClip( int nverts, const GrVertex vlist[] ); - -/* -** hi-level rendering utility functions -*/ -FX_ENTRY void FX_CALL -guAlphaSource( GrAlphaSource_t mode ); - -FX_ENTRY void FX_CALL -guColorCombineFunction( GrColorCombineFnc_t fnc ); - -FX_ENTRY int FX_CALL -guEncodeRLE16( void *dst, - void *src, - FxU32 width, - FxU32 height ); - -FX_ENTRY FxU16 * FX_CALL -guTexCreateColorMipMap( void ); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -guGammaCorrectionRGB( FxFloat red, FxFloat green, FxFloat blue ); -#endif - -/* -** fog stuff -*/ -FX_ENTRY float FX_CALL -guFogTableIndexToW( int i ); - -FX_ENTRY void FX_CALL -guFogGenerateExp( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateExp2( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateLinear(GrFog_t fogtable[], - float nearZ, float farZ ); - -/* -** endian stuff -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -guEndianSwapWords( FxU32 value ); - -FX_ENTRY FxU16 FX_CALL -guEndianSwapBytes( FxU16 value ); -#endif /* !GLIDE3_ALPHA */ - -/* -** hi-level texture manipulation tools. -*/ -FX_ENTRY FxBool FX_CALL -gu3dfGetInfo( const char *filename, Gu3dfInfo *info ); - -FX_ENTRY FxBool FX_CALL -gu3dfLoad( const char *filename, Gu3dfInfo *data ); - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GLIDEUTL_H__ */ diff --git a/glide2x/cvg/glide/src/gmovie.c b/glide2x/cvg/glide/src/gmovie.c deleted file mode 100644 index 04ad996..0000000 --- a/glide2x/cvg/glide/src/gmovie.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 6 8/30/97 5:59p Tarolli - * cleanups - * - * 5 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 4 5/21/97 6:05a Peter - * - * 3 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -GR_DIENTRY(guMovieStart, void, ( void )) -{ - GrErrorCallback( "guMovieStart: unsupported", FXFALSE ); -} - -GR_DIENTRY(guMovieStop, void, ( void )) -{ - GrErrorCallback( "guMovieStop: unsupported", FXFALSE ); -} - -GR_DIENTRY(guMovieSetName, void, ( const char *name )) -{ - GrErrorCallback( "guMovieSetName: unsupported", FXFALSE ); -} diff --git a/glide2x/cvg/glide/src/gpci.c b/glide2x/cvg/glide/src/gpci.c deleted file mode 100644 index 31787fb..0000000 --- a/glide2x/cvg/glide/src/gpci.c +++ /dev/null @@ -1,629 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 110 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old ( glide2x.dll - * - * 66 10/31/97 8:53a Peter - * last lying change, really - * - * 65 10/30/97 3:42p Peter - * protected the last bit of nonsense - * - * 64 10/30/97 3:37p Peter - * spoof sst1 - * - * 63 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 62 10/23/97 5:28p Peter - * sli fifo thing - * - * 61 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 60 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 59 9/05/97 5:29p Peter - * changes for direct hw - * - * 58 9/01/97 3:18p Peter - * correct integer rounding for pts - * - * 57 8/30/97 5:59p Tarolli - * init and hal fixups - * - * 56 8/30/97 1:19p Peter - * first cut at using blit to clear, more to come to do inner rects - * - * 55 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 54 7/30/97 2:42p Peter - * shared and sanitized - * - * 53 7/28/97 2:41p Peter - * turned sli code back on for cvg, but waiting for hal - * - * 52 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 51 7/08/97 2:47p Peter - * fixed merge stupidity from last checkin - * - * 50 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 49 6/24/97 4:02p Peter - * proper cmd fifo placement - * - * 48 6/23/97 4:46p Peter - * fixed my ,uckage - * 47 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree -** -*/ - -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - Function: _grSstDetectResources - Date: -- - Implementor(s): Dow, Gmt, Jdt - Library: Glide - Description: - Discover devices on the PCI bus. - Discover configuration of detected devices. - Initialize all Glide GC's - - Recognized devices depend upon compile time flags - - This code should NOT initialize the hardware - any more than is necessary for discovery of - configuration - - Arguments: none - Return: - FXTRUE - at least one device was detected - FXFALSE - no devices were detected. - -------------------------------------------------------------------*/ -FxBool -_grSstDetectResources(void) -{ - static FxBool calledP = FXFALSE; - FxBool rv = FXFALSE; - FxU32 ctx, device; - - GDBG_INFO(280, "_grSstDetectResources()\n"); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - { -#if GLIDE_INIT_HAL - HalInfo* halInfo = fxHalInit(0); - if (halInfo == NULL) goto __errExit; -#else /* !GLIDE_INIT_HAL */ - FxDeviceInfo dummyDevInfo; -#endif /* !GLIDE_INIT_HAL */ - - /* The first time through the init code we need to map - * all of the boards. Future calls can just grab this - * info out of the halInfo that we have here. - */ - if (!calledP) { - FxU32 count = HAL_MAX_BOARDS; - FxBool inSliPairP = FXFALSE; - GrHwConfiguration* hwConfig = &_GlideRoot.hwConfig; - - /* NB: The hw will initially return fbiRevision == 2, but - * the init code does some more dorking w/ stuff and detects - * if it is really a CVG and sets it to 4. - */ - const FxU32 hwRevNum = ((GETENV("FX_GLIDE_HW_REV") == NULL) - ? 4 - : atol(GETENV("FX_GLIDE_HW_REV"))); - - for(ctx = device = 0; device < count; device++) { - const FxDeviceInfo* curDev = NULL; - FxBool regInitP = FXFALSE; - SstRegs* devRegs; - -#if GLIDE_INIT_HAL - devRegs = fxHalMapBoard(device); - curDev = halInfo->boardInfo + device; -#else /* !GLIDE_INIT_HAL */ - devRegs = (SstRegs*)sst1InitMapBoard(device); - if (devRegs != NULL) { - if (sst1InitGetDeviceInfo((FxU32*)devRegs, &dummyDevInfo)) { - dummyDevInfo.virtAddr[0] = devRegs; - curDev = &dummyDevInfo; - } - } -#endif /* !GLIDE_INIT_HAL */ - - if ((devRegs != NULL) && - (curDev != NULL) && - (curDev->fbiRevision >= hwRevNum)) { - const FxU32 curSstNum = hwConfig->num_sst; - FxU32 i; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Internally we always keep the real type. */ - hwConfig->SSTs[ctx].type = GR_SSTTYPE_Voodoo2; -#else -#error "What do you think you're doing?" -#endif - -#if GLIDE_INIT_HAL - if (!fxHalInitRegisters(curDev->virtAddr[0])) goto __errRegFailure; - -#else /* !GLIDE_INIT_HAL */ - /* dpc - 23 jan 1998 - FixMe! - * We set up the caching characteristics here so that we - * mimic the actions of the nt driver, where everything is - * happy, in win95. However, if this is the slave of an sli - * pair then we don't want to waste mtrr's that we're never - * really going to write to. - */ - if (!inSliPairP && (_GlideRoot.CPUType >= 6)) { - sst1InitCaching((FxU32*)devRegs, FXTRUE); - } - - if (!sst1InitRegisters((FxU32*)devRegs) || - !sst1InitGetDeviceInfo((FxU32*)devRegs, &dummyDevInfo)) goto __errRegFailure; - curDev = &dummyDevInfo; -#endif /* !GLIDE_INIT_HAL */ - - /* Set up pointers to the various address spaces within the hw */ - _GlideRoot.GCs[ctx].base_ptr = (FxU32*)HW_BASE_PTR(devRegs); - _GlideRoot.GCs[ctx].reg_ptr = (FxU32*)HW_REG_PTR(devRegs); - _GlideRoot.GCs[ctx].lfb_ptr = (FxU32*)HW_LFB_PTR(devRegs); - _GlideRoot.GCs[ctx].tex_ptr = (FxU32*)HW_TEX_PTR(devRegs); - - /* Video parameters */ - _GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE; - _GlideRoot.GCs[ctx].grSstRefresh = curDev->fbiVideoRefresh; - - /* Chip configuration */ - _GlideRoot.GCs[ctx].num_tmu = curDev->numberTmus; - _GlideRoot.GCs[ctx].fbuf_size = hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam; - - /* Independet board or physical sli master */ - if (!inSliPairP) { - _GlideRoot.gcMap[curSstNum] = _GlideRoot.gcNum; - - /* Voodoo^2 glide2x returns that it is an sst1, but the - * revision is bumped so that developers can really tell. - * Additionally, we now have the fun on Voodoo^1.5 which is - * just a Voodoo^2 in a 2200 configuration. - */ - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbiRev = (curDev->fbiRevision + - ((curDev->numberTmus == 1) - ? 0x080 - : 0x100)); - - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam = curDev->fbiMemSize; - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.nTexelfx = curDev->numberTmus; - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.sliDetect = curDev->sliDetected; - - for(i = 0; i < curDev->numberTmus; i++) { - const FxU32 curTmuMemSize = curDev->tmuMemSize[i]; - - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig[i].tmuRev = curDev->tmuRevision; - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig[i].tmuRam = curTmuMemSize; - } - - hwConfig->num_sst++; - } - - /* Clear the tmu state */ - for(i = 0; i < curDev->numberTmus; i++) { - const FxU32 curTmuMemSize = curDev->tmuMemSize[i]; - - memset(&_GlideRoot.GCs[ctx].tmu_state[i], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[i])); - _GlideRoot.GCs[ctx].tmu_state[i].total_mem = (curTmuMemSize << 20); - - _GlideRoot.GCs[ctx].tmu_state[i].ncc_mmids[0] = - _GlideRoot.GCs[ctx].tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - } - - /* sst1GetDeviceInfo will not return any pairing information - * until after the boards are paired w/ sst1InitSli which we - * have not yet done. Currently we assume that the next - * discovered board will be the slave. - */ - _GlideRoot.GCs[ctx].scanline_interleaved = curDev->sliDetected; - _GlideRoot.GCs[ctx].sliPairP = curDev->sliPaired; - _GlideRoot.GCs[ctx].slave_ptr = NULL; - - /* Are we currenly mapping a physcial sli-slave? */ - if (curDev->sliDetected && inSliPairP) { - _GlideRoot.GCs[ctx - 1].slave_ptr = _GlideRoot.GCs[ctx].base_ptr; - - /* Report the minimum of the two boards' memory if they - * are different. The hw does not care becuase it is just - * not going to access the memory. - */ - { - const FxU32 curSstNum = hwConfig->num_sst - 1; - GrTMUConfig_t* tmuConfig = hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig; - - /* Fbi memory */ - if ((FxU32)hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam != curDev->fbiMemSize) { - hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam = curDev->fbiMemSize; - } - - /* Tmu memory */ - for(i = 0; i < curDev->numberTmus; i++) { - if ((FxU32)tmuConfig[i].tmuRam != curDev->tmuMemSize[i]) { - tmuConfig[i].tmuRam = MIN((FxU32)tmuConfig[i].tmuRam, curDev->tmuMemSize[i]); - } - } - } - } - - /* On an sli system the boards cannot be addressed - * separately so pairing and detection are different things, - * and we need to keep track of these paired boards as an - * atomic unit. - */ - inSliPairP = (curDev->sliPaired ? !inSliPairP : FXFALSE); - - /* This device is ready to go. */ - regInitP = FXTRUE; - _GlideRoot.gcNum++; - _GlideRoot.GCs[ctx].hwInitP = FXTRUE; - - rv = FXTRUE; - ctx++; - - __errRegFailure: - /* For some reason we failed to init the board that we just mapped. */ - if (!regInitP && (devRegs != NULL)) { -#if GLIDE_INIT_HAL - fxHalShutdown(devRegs); -#else /* !GLIDE_INIT_HAL */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching((FxU32*)devRegs, FXFALSE); - } - pciUnmapPhysical((FxU32)devRegs, 0x1000000UL); -#endif /* !GLIDE_INIT_HAL */ - } - } - } - - /* Done setting up. Don't do the silly mapping thing again. */ - calledP = FXTRUE; - } else { - /* Did we previously find boards? */ - rv = (_GlideRoot.hwConfig.num_sst != 0); - } - - goto __errExit; /* Keep warnings happy */ -__errExit: - ; - } -#else -# error "Write code for this chip" -#endif - - return rv; -} /* _grSstDetectResources */ - - -static void -displayBoardInfo(int i, GrHwConfiguration *hwc) -{ - if ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) || - (hwc->SSTs[i].type == GR_SSTTYPE_Voodoo2)) { - int tmuNum; - - GDBG_INFO(80,"SST board %d: 3Dfx Voodoo%s\n", - i, ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) ? " Graphics" : "^2")); - if (hwc->SSTs[i].sstBoard.VoodooConfig.sliDetect) { - GDBG_INFO(80,"\tScanline Interleaved\n"); - } - - GDBG_INFO(80,"\tPixelfx rev 0x%lX with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.VoodooConfig.fbiRev, - hwc->SSTs[i].sstBoard.VoodooConfig.fbRam); - GDBG_INFO(80,"\t%d Texelfx chips:\n", - hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx); - for (tmuNum = 0; - tmuNum < hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx; - tmuNum++) { - GDBG_INFO(80,"\t\tTexelfx %d: Rev 0x%lX, %d MB Texture\n", tmuNum, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRev, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRam); - } - } else if (hwc->SSTs[i].type == GR_SSTTYPE_SST96) { - GDBG_INFO(80,"SST board %d: 3Dfx Voodoo Rush\n", i); - GDBG_INFO(80,"\tFBI Jr. with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.SST96Config.fbRam); - GDBG_INFO(80,"\tTexelfx chips: 1\n"); - } else { - GDBG_INFO(80,"error: SSTs %d: unknown type\n",i); - } -} /* displayBoardInfo */ - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#include -#endif - -void -_GlideInitEnvironment(void) -{ -#define FN_NAME "_GlideInitEnvironment" - int i; - - if (_GlideRoot.initialized) /* only execute once */ - return; - GDBG_INIT(); /* init the GDEBUG libraray */ - GDBG_INFO(80,"%s()\n", FN_NAME); - -#ifdef __WIN32__ - grErrorSetCallback(_grErrorWindowsCallback); -#else - grErrorSetCallback(_grErrorDefaultCallback); -#endif /* __WIN32__ */ - -#ifdef GLIDE_DEBUG - GDBG_INFO(0,"GLIDE DEBUG LIBRARY\n"); /* unconditional display */ -#endif - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { /* GMT: display the DLL pathname for sanity checking */ - char buf[132]; - if (GetModuleFileName(GetModuleHandle("glide2x.dll"), buf, sizeof(buf))) { -#ifdef GLIDE_DEBUG - GDBG_INFO(0,"DLL path: %s\n",buf); /* unconditional display */ -#else - GDBG_INFO(80,"DLL path: %s\n",buf); -#endif - } /* silent failure */ - } -#endif - - _GlideRoot.CPUType = _cpu_detect_asm(); - if (GETENV("FX_CPU")) _GlideRoot.CPUType = atoi(GETENV("FX_CPU")); - - /* Check for user environment tweaks */ - { - const char* envStr; - -#define GLIDE_GETENV(__envVar, __defVal) \ - (((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : atol(envStr)) - - _GlideRoot.environment.triBoundsCheck = (GETENV("FX_GLIDE_BOUNDS_CHECK") != NULL); - _GlideRoot.environment.noSplash = (GETENV("FX_GLIDE_NO_SPLASH") != NULL); - _GlideRoot.environment.shamelessPlug = (GETENV("FX_GLIDE_SHAMELESS_PLUG") != NULL); - _GlideRoot.environment.ignoreReopen = (GETENV("FX_GLIDE_IGNORE_REOPEN") != NULL); - _GlideRoot.environment.disableDitherSub = (GETENV("FX_GLIDE_NO_DITHER_SUB") != NULL); - _GlideRoot.environment.texLodDither = ((GETENV("FX_GLIDE_LOD_DITHER") == NULL) - ? 0x00UL - : SST_TLODDITHER); - - _GlideRoot.environment.nColorBuffer = GLIDE_GETENV("FX_GLIDE_ALLOC_COLOR", -1L); - _GlideRoot.environment.nAuxBuffer = GLIDE_GETENV("FX_GLIDE_ALLOC_AUX", -1L); - _GlideRoot.environment.swFifoLWM = GLIDE_GETENV("FX_GLIDE_LWM", -1L); - - _GlideRoot.environment.swapInterval = GLIDE_GETENV("FX_GLIDE_SWAPINTERVAL", -1L); - if ((envStr != NULL) && (_GlideRoot.environment.swapInterval < 0)) { - _GlideRoot.environment.swapInterval = 0; - } - - _GlideRoot.environment.snapshot = GLIDE_GETENV("FX_SNAPSHOT", 0); - - GDBG_INFO(80," triBoundsCheck: %d\n",_GlideRoot.environment.triBoundsCheck); - GDBG_INFO(80," swapInterval: %d\n",_GlideRoot.environment.swapInterval); - GDBG_INFO(80," noSplash: %d\n",_GlideRoot.environment.noSplash); - GDBG_INFO(80," shamelessPlug: %d\n",_GlideRoot.environment.shamelessPlug); - GDBG_INFO(80," cpu: %d\n",_GlideRoot.CPUType); - GDBG_INFO(80," snapshot: %d\n",_GlideRoot.environment.snapshot); - GDBG_INFO(80," disableDitherSub: %d\n",_GlideRoot.environment.disableDitherSub); - } - - /* constant pool */ - _GlideRoot.pool.f0 = 0.0F; - _GlideRoot.pool.fHalf= 0.5F; - _GlideRoot.pool.f1 = 1.0F; - _GlideRoot.pool.f255 = 255.0F; - -#if GLIDE_PACKED_RGB - _GlideRoot.pool.fBiasHi = (float)(0x01 << 15); - _GlideRoot.pool.fBiasLo = (float)(0x01 << 23); -#endif /* GLIDE_PACKED_RGB */ - - _GlideRoot.current_sst = 0; /* make sure there's a valid GC */ - _GlideRoot.curGC = &_GlideRoot.GCs[0]; /* just for 'booting' the library */ - { - const FxBool hwDetectP = _grSstDetectResources(); - - if (!hwDetectP) { - char s[128]; - const char* errStr = s; - - if (pciGetErrorCode() == PCI_ERR_NOERR) { -#ifndef __linux__ - sprintf(s, "%s: glide2x.dll expected %s, none detected\n", - FN_NAME, GLIDE_DRIVER_NAME); -#else - sprintf(s, "%s: libglide2x.so expected %s, none detected\n", - FN_NAME, GLIDE_DRIVER_NAME); -#endif - } else { - errStr = pciGetErrorString(); - } - - GrErrorCallback(errStr, FXTRUE); - } - - /* GMT: this isn't really necessary since GlideRoot is static */ - for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - _GlideRoot.GCs[i].mm_table.free_mmid = 0; - displayBoardInfo(i, &_GlideRoot.hwConfig); - } - - _grMipMapInit(); - _GlideRoot.initialized = hwDetectP; /* save this for the end */ - } -} /* _GlideInitEnvironment */ diff --git a/glide2x/cvg/glide/src/gsplash.c b/glide2x/cvg/glide/src/gsplash.c deleted file mode 100644 index 70ad877..0000000 --- a/glide2x/cvg/glide/src/gsplash.c +++ /dev/null @@ -1,958 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - ** Revision 1.1.1.1 1999/12/07 21:49:11 joseph - ** Initial checkin into SourceForge. - ** -** -** 26 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 25 2/17/98 3:21p Peter -** no splash w/o deepth buffer -** -** 24 1/28/98 1:12p Peter -** Stupid swap state form gratuitous splash screen - * - * 23 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 21 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 20 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 19 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 18 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 17 11/14/97 5:03p Peter - * picking up the torch... removed #!@#$% c++ comments - * - * 16 10/23/97 5:30p Peter - * packed rgb happiness - * - * 15 7/31/97 11:14a Peter - * merge w/ sst1 glide tree, hopefully - * - * 13 7/07/97 3:05p Dow - * Moved fouled clears - * - * 12 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 11 3/16/97 12:42a Jdt - * Removed watcom warning - * - * 10 3/13/97 10:53p Jdt - * Rewrote with simple optimizations. Changed prototype for - * multi-resolution, and running as a better shameless plug. - * - * 9 3/13/97 2:52a Jdt - * Added arguments to splash. - * - * 8 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 7 3/01/97 6:24p Jdt - * Made splash force yorigin. - * - * 6 1/02/97 1:06p Dow - * Fixed state bug - * - * 3 11/17/96 11:16p Garymct - * Updated grSplash code to set all of the necessary state itself rather - * than expecting the caller to do so. - */ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -/*----------------------------- - Constants - -----------------------------*/ -#define MAX_NUM_VERTS 2556 - -#define FADEIN_END_PERCENT (0.3f) -#define FADEOUT_BEGIN_PERCENT (0.8f) - -#define SPIN_FRAMES 25 -#define SPIN_START 26 - -#define NO_TABLE ((GrTexTable_t)(~0)) - -/*----------------------------- - Macros - -----------------------------*/ -#define SNAP_BIAS ((float)(3<<18)) -#define SNAP_COORD(X) ((X)+SNAP_BIAS) - -/*----------------------------- - Types - -----------------------------*/ -typedef struct { - float x, y, z; /* object space coordinates */ - float nx, ny, nz; /* object space vertex normal for lighting */ - float s, t; /* pre-glide-ified texture coordinates */ -} Vert; - -typedef struct { - int v[3]; /* vertex indices into array of vertes for face */ - int mat_index; /* material index */ - int aa_edge_flags; -} Face; - -typedef float Vector[3]; -typedef float Matrix[16]; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -/*----------------------------- - Globals - -----------------------------*/ -/* xScale, xOffset, yScale, yOffset */ -static float viewPort[4] = { - 480.0f, 320.0f, - 480.0f, 240.0f -}; - -typedef struct { - GrTexInfo info; - FxU32 addr; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -static int do_phong = 0; -static int pass; -static int fog; -static int useTextures; -static Vector light = { -0.57735f, -0.57735f, -0.57735f }; -static Vector transformed_verts[MAX_NUM_VERTS]; -static Vector transformed_norms[MAX_NUM_VERTS]; - -#include "splshdat.c" - -static Texture textImage; -static Texture hiliteImage; -static Texture shadowImage; - -static FxU32 nextFreeBase; - -/*----------------------------- - Privates - -----------------------------*/ -static void -sourceTexture(Texture *texture) -{ - static Texture *lastTexture; - - if (texture != lastTexture && useTextures) { - grTexSource(GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - if (texture->tableType != NO_TABLE) { - grTexDownloadTable(GR_TMU0, - texture->tableType, - &texture->tableData); - } - lastTexture = texture; - } -} - -static GrTexTable_t -texTableType(GrTextureFormat_t format) -{ - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - - switch(format) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - - return rv; -} - -static void -downloadTexture(Texture *texture, Gu3dfInfo *info) -{ - texture->info.data = info->data; - texture->info.smallLod = info->header.small_lod; - texture->info.largeLod = info->header.large_lod; - texture->info.aspectRatio = info->header.aspect_ratio; - texture->info.format = info->header.format; - - texture->addr = nextFreeBase; - nextFreeBase += grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - grTexDownloadMipMap(GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - - texture->tableType = texTableType(info->header.format); - switch(texture->tableType) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - texture->tableData = *(TextureTable*)(&info->table); - break; - default: - break; - } -} - -static void -createTextures(void) -{ - Gu3dfInfo *info; - - /* Download the texture for the "3D" part of the model. */ - info = (Gu3dfInfo*)&text_3dfinfo; - info->data = (void *)text_3dfinfo_image; - - downloadTexture(&textImage, info); - - /* Download the texture for the specular highlight. */ - info = (Gu3dfInfo *)&hilite_3dfinfo; - info->data = (void *)hilite_3dfinfo_image; - downloadTexture(&hiliteImage, info); - - /* Download the texture for the shadow. */ - info = (Gu3dfInfo *)&shadow_3dfinfo; - info->data = (void *)shadow_3dfinfo_image; - downloadTexture(&shadowImage, info); -} - -static void -vecMatMult(float *dstVec, float *srcVec, float *matrix) -{ - dstVec[0] = (srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8] + - matrix[12]); - - dstVec[1] = (srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9] + - matrix[13]); - - dstVec[2] = (srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10] + - matrix[14]); -} - -static void -normMatMult(float *dstVec, float *srcVec, float *matrix) -{ - dstVec[0] = (srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8]); - - dstVec[1] = (srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9]); - - dstVec[2] = (srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10]); -} - -static void -xfAndProj(int frame, int obj) -{ - int vertex; - float *matrix; - - matrix = &mat[frame][obj][0]; - - for(vertex = 0; vertex < num_verts[obj]; vertex++) { - float *srcVec; - float *dstVec; - float oow; - - /* transform point */ - srcVec = (float*)&(vert[obj][vertex].x); - dstVec = (float*)transformed_verts[vertex]; - vecMatMult(dstVec, srcVec, matrix); - - /* project point */ - oow = 1.0f / dstVec[2]; - dstVec[0] = dstVec[0] * oow * viewPort[0] + viewPort[1] + SNAP_BIAS; - dstVec[1] = dstVec[1] * oow * viewPort[2] + viewPort[3] + SNAP_BIAS; - - /* transform normal */ - srcVec = (float*)&(vert[obj][vertex].nx); - dstVec = (float*)transformed_norms[vertex]; - normMatMult(dstVec, srcVec, matrix); - } -} - -static void -setupMaterial(int material_index) -{ - switch(material_index) { - case 0: /* 3d */ - if(pass == 1) { - sourceTexture(&textImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - do_phong = 1; - } else if (pass == 0xbeef) { - /* Pantone 320C - 3D Green */ - grConstantColorValue(0x00989100); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - } else { - sourceTexture(&hiliteImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - } - break; - case 1: /* fx */ - if (pass == 0xbeef) { - /* Black - fx */ - grConstantColorValue(0x00); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - do_phong = 1; - } else { - sourceTexture(&hiliteImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - do_phong = 1; - } - break; - case 2: - case 3: - case 4: - grColorCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE); - do_phong = 0; - break; - } -} - -static void -calculateIntensity(int material_index, - Vector intensity_factor, - int frame) -{ - switch(material_index) { - case 0: - /* 3d */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 1: - /* fx */ - intensity_factor[0] = 0.125f; - intensity_factor[1] = 0.125f; - intensity_factor[2] = 0.125f; - break; - case 2: - /* cyan */ - intensity_factor[0] = (10.0f / 255.0f); - intensity_factor[1] = (75.0f / 255.0f); - intensity_factor[2] = (120.0f / 255.0f); - break; - case 3: - /* white */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 4: - /* yellow */ - intensity_factor[0] = (248.0f / 255.0f); - intensity_factor[1] = (204.0f / 255.0f); - intensity_factor[2] = 0.0f; - break; - } -} - -static void -drawFaces(int frame, int objnum) -{ - int facenum; - int material_index; - float intensity_factor[3]; - GrVertex gvert[3]; - static int prev_mat_index = 0xffff; - int i; - FxBool aa_a, aa_b, aa_c; - - for(facenum = 0; facenum < num_faces[objnum]; facenum++) { - material_index = face[objnum][facenum].mat_index; - if(material_index != prev_mat_index) { - setupMaterial(material_index); - calculateIntensity(material_index, - intensity_factor, frame); - prev_mat_index = material_index; - } - - if((material_index != 0) && (pass == 2)) - continue; - - aa_a = aa_b = aa_c = FXFALSE; - if(face[objnum][facenum].aa_edge_flags & 4) - aa_a = FXTRUE; - if(face[objnum][facenum].aa_edge_flags & 2) - aa_b = FXTRUE; - if(face[objnum][facenum].aa_edge_flags & 1) - aa_c = FXTRUE; - - for(i = 0; i < 3; i++) { - float *transformed_vert, *transformed_norm; - Vert *v; - int vertnum; - float factor; - - vertnum = face[objnum][facenum].v[i]; - transformed_vert = transformed_verts[vertnum]; - transformed_norm = transformed_norms[vertnum]; - v = &vert[objnum][vertnum]; - - gvert[i].x = transformed_vert[0]; - gvert[i].y = transformed_vert[1]; - gvert[i].oow = 1.0f / transformed_vert[2]; - gvert[i].tmuvtx[0].oow = gvert[i].oow; - gvert[i].tmuvtx[0].sow = v->s * gvert[i].oow; - gvert[i].tmuvtx[0].tow = v->t * gvert[i].oow; - - factor = ((light[0] * transformed_norm[0] + - light[1] * transformed_norm[1] + - light[2] * transformed_norm[2])+ 1.0f) * 127.5f; - - gvert[i].r = factor * intensity_factor[0]; - gvert[i].g = factor * intensity_factor[1]; - gvert[i].b = factor * intensity_factor[2]; - gvert[i].a = 255.0f; - } - - if(pass == 2) { - for(i = 0; i < 3; i++) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - (128.0f + transformed_norm[0] * 128.0f); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - (128.0f + transformed_norm[1] * 128.0f); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - - grDrawTriangle(&gvert[0], &gvert[1], &gvert[2]); - - continue; - } - - grAlphaBlendFunction(GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO); - /* Do this if 3D. */ - if(material_index == 0) { - /* - * Draw the textured 3D without specular. - */ - sourceTexture(&textImage); -#if 0 - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); -#endif - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } else if(material_index != 1) { - /* - * Just go ahead and draw for things that don't - * have specular highlights. - */ - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } - - if(do_phong && (material_index != 0)) { - /* - * figure out texture coords in [0..255.0f] based on the normal - * the specular highlight. - */ - for(i = 0; i < 3; i++) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - (128.0f + transformed_norm[0] * 128.0f); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - (128.0f + transformed_norm[1] * 128.0f); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } - } -} - -static void -intersectLineWithZPlane(Vector result, Vector p1, - Vector p2, float z) -{ - float t; - - t = (z - p1[2]) / (p2[2] - p1[2]); - result[0] = p1[0] + (p2[0] - p1[0]) * t; - result[1] = p1[1] + (p2[1] - p1[1]) * t; - result[2] = z; -} - -static float -vectorMag(float *v) -{ - return (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); -} - -static void -drawShadow(int frame, int shadow_object_index, - int receiver_object_index, Vector light_position) -{ - float *shadow_object_matrix; - float *receiver_object_matrix; - Vector view_verts[4]; - Vector projected_view_verts[4]; - int i; - - Vector local_verts[4] = { - { -280.0f, 0.0f, -160.0f }, - { -280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, -160.0f } - }; - - float texcoords[4][2] = { - { 10.5f, 127.5f }, - { 10.5f, 0.5f }, - { 255.0f, 0.5f }, - { 255.0f, 127.5f } - }; - - GrVertex gvert[4]; - GrVertex projected_gvert[4]; - GrVertex light_gvert; - - /* - * The point relative to the back part of the shield that - * the shadow is going to be projected onto. - */ - Vector shadow_light; - - shadow_light[0] = light_position[0]; - shadow_light[1] = light_position[1]; - shadow_light[2] = light_position[2]; - - shadow_object_matrix = &mat[frame][shadow_object_index][0]; - receiver_object_matrix = &mat[frame][receiver_object_index][0]; - - /* - * Offset the light by the Z position of - * the backplane that we are projected - * onto. - */ - shadow_light[2] += receiver_object_matrix[14]; - - for(i = 0; i < 4; i++) { - vecMatMult(view_verts[i], local_verts[i], shadow_object_matrix); - - /* - * project . . . - */ - gvert[i].oow = 1.0f / view_verts[i][2]; - gvert[i].x = - view_verts[i][0] * gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS; - gvert[i].y = - view_verts[i][1] * gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS; - - /* - * Set up texture coordinates. - */ - gvert[i].tmuvtx[0].sow = texcoords[i][0] * gvert[i].oow; - gvert[i].tmuvtx[0].tow = texcoords[i][1] * gvert[i].oow; - } - - - /* - * Intersect each line formed by the light source and a - * particular corner of the shadow object with the - * plane which the texture is to be projected onto. - */ - for(i = 0; i < 4; i++) { - Vector tmpvect; - float q; - -#if GLIDE_PACKED_RGB - /* dpc - 22 oct 1997 - FixMe! - * These are left uninitialized, yet they are being sent to the - * hw, probably because some other state is not being correctly - * setup. This doesn't seem to affect the 'correctness' of the - * splash screen so I'm not investigating it any more. - */ - projected_gvert[i].r = - projected_gvert[i].g = - projected_gvert[i].b = - projected_gvert[i].a = 0.0f; -#endif /* GLIDE_PACKED_RGB */ - - intersectLineWithZPlane(projected_view_verts[i], - shadow_light, - view_verts[i], - receiver_object_matrix[14] - 26.0f); - projected_gvert[i].oow = 1.0f / projected_view_verts[i][2]; - projected_gvert[i].x = (projected_view_verts[i][0] * projected_gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS); - projected_gvert[i].y = (projected_view_verts[i][1] * projected_gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS); - - tmpvect[0] = projected_view_verts[i][0] - shadow_light[0]; - tmpvect[1] = projected_view_verts[i][1] - shadow_light[1]; - tmpvect[2] = projected_view_verts[i][2] - shadow_light[2]; - q = vectorMag(tmpvect); - - /* - * Set up texture coordinates. - */ - projected_gvert[i].tmuvtx[0].oow = projected_gvert[i].oow * q; - projected_gvert[i].tmuvtx[0].sow = texcoords[i][0] * projected_gvert[i].oow; - projected_gvert[i].tmuvtx[0].tow = texcoords[i][1] * projected_gvert[i].oow; - } - - light_gvert.oow = 1.0f / shadow_light[2]; - light_gvert.x = shadow_light[0] * light_gvert.oow * viewPort[0] + viewPort[1] + SNAP_BIAS; - light_gvert.y = shadow_light[1] * light_gvert.oow * viewPort[2] + viewPort[3] + SNAP_BIAS; - - /* - * Draw a segment between the light and the point which hits - * the surface that the light is being projected onto. - */ - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - sourceTexture(&shadowImage); - - grAlphaBlendFunction(GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grDrawTriangle(&projected_gvert[0], - &projected_gvert[1], - &projected_gvert[2]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[2], - &projected_gvert[3]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[2], - &projected_gvert[1]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[3], - &projected_gvert[2]); - - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - -} - - -/*------------------------------------------------------------------- - Function: grSplash - Date: 3/13 - Implementor(s): GaryMcT - Library: Glide - Description: - Render the opening splash screen animation, or render - a single frame of the splash screen. - Arguments: - x, y - upper left hand coord of window - w, h - width and height of window to render - _frame - frame number to render (~0 to render all frames) - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grSplash,void,(float x,float y,float w,float h,FxU32 _frame)) -{ - GrState oldState; - int frame; - Vector lights[] = { - { 5.0f, 300.0f, -1500.0f }, - { 5.0f, 150.0f, -1000.0f }, - { -30.0f, 150.0f, -1000.0f }, - { -30.0f, 100.0f, -1000.0f }, - { 30.0f, 70.0f, -1000.0f }, - }; - GrFog_t fogTable[kInternalFogTableEntryCount]; - int fadeInFrames, fadeOutFrames; - - GR_BEGIN_NOFIFOCHECK("grSplash", 85); - GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", x, y, w, h, _frame); - - /* Check Screen Dimensions and Check Avail of Depth Buffer */ - if ((x > gc->state.screen_width) || - ((x+w) > gc->state.screen_width) || - (y > gc->state.screen_height) || - ((y+h) > gc->state.screen_height)) - return; - - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return; - } - } - - if (gc->grAuxBuf == 0) return; - - if (!(gc->state.fbi_config.fbzMode & SST_YORIGIN)) { - y = ((gc->state.screen_height - 1.0f) - (h-1.0f)) - y; - } - - viewPort[0] = w * (480.0f / 640.0f); - viewPort[1] = x + (w / 2.0f); - viewPort[2] = h; - viewPort[3] = y + (h / 2.0f); - - grGlideGetState(&oldState); - - grSstOrigin(GR_ORIGIN_LOWER_LEFT); - - if (_frame == 0) { - createTextures(); - useTextures = 1; - } else { - useTextures = 0; - } - - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue(0xffffffff); - grDepthBufferMode(GR_DEPTHBUFFER_WBUFFER); - grDepthMask(FXTRUE); - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - if (useTextures) - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - else - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXTRUE, FXFALSE); - grTexMipMapMode(GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE); - grTexFilterMode(GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - grDepthBufferFunction(GR_CMP_LEQUAL); - grCullMode(GR_CULL_NEGATIVE); - /* grClipWindow((int)x, (int)y, (int)(x+w), (int)(y+h)); */ - grFogColorValue(0x0); - - fadeInFrames = (int)(((float)total_num_frames) * FADEIN_END_PERCENT); - fadeOutFrames = (int)(((float)total_num_frames) * - (1.0f - FADEOUT_BEGIN_PERCENT)); - - if (_frame == 0) { /* Render Whole Animation */ - for(frame = 1; frame < total_num_frames; frame++) { - int i; - - /* Set Fog Value For This Frame */ - if(frame < fadeInFrames) { - unsigned char fval = (((unsigned char)0xFF) - - ((unsigned char)(255.0f * (float)(frame + 1) / (float)fadeInFrames))); - for(i = 0; i < kInternalFogTableEntryCount; i++) fogTable[i] = fval; - grFogMode(GR_FOG_WITH_TABLE); - grFogTable(fogTable); - fog = 1; - } else if(frame > total_num_frames-fadeOutFrames) { - unsigned char fval = (((unsigned char)0xFF) - - (unsigned char)(255.0f* ((float)(total_num_frames - frame))/ - ((float)fadeOutFrames))); - for(i = 0; i < kInternalFogTableEntryCount; i++) - fogTable[i] = fval; - grFogMode(GR_FOG_WITH_TABLE); - grFogTable(fogTable); - fog = 1; - } else { - grFogMode(GR_FOG_DISABLE); - fog = 0; - } - - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - - pass = 1; - - /* - * Avoid Z-aliasing between the shield and the 3dfx by - * not writing Z for the shield. - */ - - grDepthMask(FXFALSE); - /* cyan part of shield */ - xfAndProj(frame, 2); - drawFaces(frame, 2); - - /* yellow and white part of shield. */ - xfAndProj(frame, 0); - drawFaces(frame, 0); - - /* - * Reanable writes to the depth-buffer. - */ - grDepthMask(FXTRUE); - - /* - * Draw the shadow projected from the 3Dfx logo onto - * the rest of the powershield. - */ - grDepthBufferFunction(GR_CMP_ALWAYS); - grFogMode(GR_FOG_DISABLE); - drawShadow(frame, 1, 0, lights[0]); - if (fog) grFogMode(GR_FOG_WITH_TABLE); /* hack around mp fog */ - grDepthBufferFunction(GR_CMP_LEQUAL); - - /* 3Dfx logo */ - xfAndProj(frame, 1); - drawFaces(frame, 1); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ONE, GR_BLEND_ZERO); - - pass = 2; - drawFaces(frame, 1); - pass = 1; - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grBufferSwap(2); - } - } else { /* Render One Frame */ - frame = ((_frame>>1) % SPIN_FRAMES)+SPIN_START; - - grColorMask(FXFALSE, FXFALSE); - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - grColorMask(FXTRUE, FXFALSE); - - pass = 0xbeef; - - /* 3Dfx logo */ - xfAndProj(frame, 1); - drawFaces(frame, 1); - } - - /* Get rid of the remnants on teh screen just in case - * the app (like PowerRender) doesn't do it itself yet - * assumes that the screen is clear. - */ - if (frame == 0) { - int i; - - for(i = 0; i < gc->grColBuf; i++) { - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - grBufferSwap(0); - } - } - - /* - * Clean up after yourself! - */ - grGlideSetState(&oldState); - -} - diff --git a/glide2x/cvg/glide/src/gsst.c b/glide2x/cvg/glide/src/gsst.c deleted file mode 100644 index 79c1e3e..0000000 --- a/glide2x/cvg/glide/src/gsst.c +++ /dev/null @@ -1,2069 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:11 joseph -** Initial checkin into SourceForge. -** -** -** 168 6/30/98 6:08p Jeske -** fixed bug where we tried to setup MTRRs on old (curRenderBuf for clarity -** -** 118 1/24/98 12:29p Peter -** more caching fun -** -** 117 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 116 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 115 1/16/98 10:47a Peter - * fixed idle muckage - * - * 114 1/16/98 10:16a Atai - * fixed grSstIldle - * - * 113 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 110 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 109 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 107 12/18/97 2:12p Peter - * grSstControl on v2 - * - * 106 12/17/97 4:48p Peter - * groundwork for CrybabyGlide - * - * 105 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 104 12/16/97 1:33p Atai - * added grGammaCorrectionRGB() - * - * 103 12/16/97 10:03a Atai - * fixed gutexmemreset for glide2 - * - * 101 12/09/97 12:20p Peter - * mac glide port - * - * 100 12/05/97 4:26p Peter - * watcom warnings - * - * 99 12/03/97 11:35a Peter - * is busy thing - * - * 98 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 97 11/21/97 1:02p Peter - * v^2 supported resolutions - * - * 96 11/21/97 11:19a Dow - * Added RESOLUTION_NONE hack for Banshee - * - * 95 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 94 11/19/97 2:22p Dow - * gsst.c - * - * 93 11/18/97 4:50p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 92 11/18/97 4:00p Atai - * fixed the GR_BEGIN and GR_END error in previous check-in - * - * 91 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 90 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 89 11/16/97 2:20p Peter - * cleanup - * - * 88 11/15/97 7:43p Peter - * more comdex silliness - * - * 87 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 86 11/14/97 5:02p Peter - * more comdex stuff - * - * 85 11/14/97 4:47p Dow - * New splash screen - * - * 84 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 83 11/12/97 9:37p Dow - * Banshee crap - * - * 82 11/12/97 2:27p Peter - * - * 81 11/12/97 1:09p Dow - * H3 Stuf - * - * 80 11/12/97 9:22a Dow - * H3 Mods - * - * 79 11/06/97 3:46p Peter - * sli shutdown problem - * - * 78 11/06/97 3:38p Dow - * More banshee stuff - * - * 77 11/04/97 5:04p Peter - * cataclysm part deux - * - * 76 11/04/97 3:58p Dow - * Banshee stuff - * - * 75 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 74 10/29/97 4:59p Peter - * - * 73 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 72 10/23/97 5:28p Peter - * sli fifo thing - * - * 71 10/17/97 3:15p Peter - * grSstVidMode thingee - * - * 70 10/14/97 2:44p Peter - * moved close flag set - * - * 69 10/09/97 8:02p Dow - * State Monster 1st Cut - * -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Mutator: dpc - Library: Glide - Description: - - Initialize the selected SST - - Initialization has 4 Steps - - Video Init - - In the full screen case this includes setting the requested - resolution/refresh state and allocating any necessary OS - resource for the GC. - - In the windowed case, this involves acquiring all necessary - surfaces for rendering, back buffer and memory fifo - - Also perform any work necessary to enable access to 3D - registers - - Command Transport Init: - Assuming video registers are in a reset state, initialize - the appropriate command transport mechanism. All writes - to hardware prior to this action are direct writes, - afterwards, most commands will go throught the command - transport - - GC Init - - Initialize the current GC based on the user requested - open parameters and command transport data reported - during initialization. - - 3D State Init - - Push an initial state onto all of the 3D state registers. - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer (unsup) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( - FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ -#define FN_NAME "grSstWinOpen" - FxBool rv = FXTRUE; - int tmu; - int xres = 0, yres = 0, fbStride; - FxDeviceInfo devInfo; -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - sst1VideoTimingStruct *sstVideoRez = NULL, tvVidtiming; - FxBool tv_swap_board = FXFALSE; -#endif - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE(gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers); - GR_CHECK_F(FN_NAME, !gc, "no SST selected as current (gc==NULL)"); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Voodoo^2 has a bug in sli mode where the video cannot really - * support resolutions less than 512x384 on pc monitors. Rather than - * saying sli is not fully compatible w/ single board systems the - * 'solution' is to just not allow these resolutions. - * - * NB: The current assumption here is taht if the user passes - * their own video timing structure then they know what the hell - * they are doing for some weird-ass arcade monitor. - */ - rv = !((gc->vidTimings == NULL) && - ((resolution < GR_RESOLUTION_512x384) || - (resolution == GR_RESOLUTION_512x256) || - (resolution == GR_RESOLUTION_400x300) || - (resolution == GR_RESOLUTION_NONE))); - if (!rv) { - GDBG_INFO(gc->myLevel, " Incompatible Voodoo^2 resolution.\n"); - goto BAILOUT; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - GR_CHECK_COMPATABILITY(FN_NAME, - ((hWnd == 0x00UL) && (GetActiveWindow() == NULL)), - "A valid active window or hWnd parameter is required."); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ -#endif /* (GLIDE_PLATFORM & GLODE_HW_CVG) */ - -#if !GLIDE_INIT_HAL -__tryReOpen: - /* If we've been closed via grSstWinClose then we need to re-init - * the hw registers etc before init-ing video etc or bad ju-ju is - * in our future. - * - * NB: These are in the same order that they are done in the same - * order as in _grDetectResources. They should match, so don't mess - * it up. - */ - if (!gc->hwInitP) { - FxU32* sstRegs = NULL; - - rv = pciOpen(); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: pci bus could not be opened\n", FN_NAME); - goto BAILOUT; - } - - sstRegs = sst1InitMapBoard(_GlideRoot.current_sst); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: re-map of board failed (0x%X : 0x%x)\n", - FN_NAME, sstRegs, gc->reg_ptr); - goto BAILOUT; - } - - /* Re-enabled write combining */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(sstRegs, FXTRUE); - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init hw registers\n", FN_NAME); - goto BAILOUT; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - gc->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - gc->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - gc->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - gc->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - /* Make sure that the sli-slave gets re-initted too. - * - * NB: This makes the same assumption as the sli-pairing code - * that the sli slave is the next one discovered in the - * set of GC's. - */ - if (gc->scanline_interleaved) { - sstRegs = sst1InitMapBoard(_GlideRoot.current_sst + 1); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-map slave.\n", FN_NAME); - goto BAILOUT; - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init slave registers\n", FN_NAME); - goto BAILOUT; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - (gc + 1)->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - (gc + 1)->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - (gc + 1)->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - (gc + 1)->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - gc->slave_ptr = sstRegs; - } - - gc->hwInitP = FXTRUE; - } else if (gc->open) { - /* If this device is already open then it is probably an error to - * call grSstWinOpen again. Rather than letting all hell break - * loose as we re-init the video and (especially) command fifo - * shutdown the hw and do a full re-init. - * - * NB: This is here for TombRaider which is not going to be reved - * as far as I know. - */ - GR_CHECK_COMPATABILITY(FN_NAME, gc->open, "This context is already open"); - grSstWinClose(); - goto __tryReOpen; - } -#endif /* !GLIDE_INIT_HAL */ - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** load fxoem2x.dll and map board - */ - { - gc->oemInit = NULL; - rv = sst1InitGetDeviceInfo(gc->reg_ptr, &devInfo); - if (rv) { - char* boardIDStr; - FxU32 boardID; - char* requireOEMDLLStr; - FxU32 requireOEMDLL; - - gc->oemi.version = OEMINIT_VERSION; - gc->oemi.vendorID = devInfo.vendorID; - gc->oemi.subvendorID = OEMINIT_INVALID_BOARD_ID; - gc->oemi.deviceID = devInfo.deviceID; - gc->oemi.boardID = devInfo.fbiBoardID | (devInfo.fbiConfig << FX_OEM_FBI_CONFIG_SHIFT); - gc->oemi.linearAddress = gc->base_ptr; - gc->oemi.slaveAddress = gc->slave_ptr; - gc->oemi.fxoemPciWriteConfig = (PciConfigProc)pciSetConfigData; - gc->oemi.fxoemPciReadConfig = (PciConfigProc)pciGetConfigData; - - boardIDStr = GETENV("FX_GLIDE_BOARDID"); - boardID = (boardIDStr == NULL) ? 0 : atol(boardIDStr); - if ((boardID) && (devInfo.fbiBoardID != boardID)) { - /* if boardID is defined and does not match */ - GrErrorCallback("Undefined boardID", FXTRUE); - grSstWinClose(); - exit(0); - } - - requireOEMDLLStr = GETENV("FX_GLIDE_REQUIREOEMDLL"); - requireOEMDLL = (requireOEMDLLStr == NULL) ? 0 : atol(requireOEMDLLStr); - if (requireOEMDLL == GR_SKIP_OEMDLL) { - /* skip oem dll */ - gc->oemInit = NULL; - } - else if (requireOEMDLL == GR_NO_OEMDLL) { - /* no oemdll is allowed */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - if (gc->oemInit) { - GrErrorCallback("Please remove fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } - } - else if ( requireOEMDLL == 0) { - /* FX_GLIDE_REQUIREOEMDLL is not defined, load oemdll if it exist */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - } - else { - /* oem dll is required */ - gc->oemInit = LoadLibrary("fxoem2x.dll"); - if (gc->oemInit == NULL) { - GrErrorCallback("Missing fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } - } - - /* - ** oem map board - */ - if (gc->oemInit) { - FARPROC oemInitMapBoard = NULL; - oemInitMapBoard = GetProcAddress(gc->oemInit, "_fxoemInitMapBoard@4"); - if (oemInitMapBoard != NULL) - oemInitMapBoard(&gc->oemi); - else - gc->oemInit = NULL; - } - } - else { - GDBG_INFO(gc->myLevel, " XXXGetDeviceInfo failed. (0x%X)\n", gc->reg_ptr); - goto BAILOUT; - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /*------------------------------------------------------ - Video Init - ------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize video timing data for oemdll - ** if tv out component exist, the oem dll need to modify the vidtiming - ** data in oemi. Glide will take the changes and pass it to - ** sst1InitVideoBuffers() - */ - { - if((gc->oemInit) && (sstVideoRez = sst1InitFindVideoTimingStruct(resolution, refresh))) { - tvVidtiming = *sstVideoRez; - gc->oemi.vid.res = resolution; - gc->oemi.vid.refresh = refresh; - gc->oemi.vid.depth = 16; - gc->oemi.vid.hSyncOn = tvVidtiming.hSyncOn; - gc->oemi.vid.hSyncOff = tvVidtiming.hSyncOff; - gc->oemi.vid.vSyncOn = tvVidtiming.vSyncOn; - gc->oemi.vid.vSyncOff = tvVidtiming.vSyncOff; - gc->oemi.vid.hBackPorch = tvVidtiming.hBackPorch; - gc->oemi.vid.vBackPorch = tvVidtiming.vBackPorch; - gc->oemi.vid.xDimension = tvVidtiming.xDimension; - gc->oemi.vid.yDimension = tvVidtiming.yDimension; - gc->oemi.vid.clkFreq16bpp = tvVidtiming.clkFreq16bpp; - gc->oemi.vid.clkFreq24bpp = tvVidtiming.clkFreq24bpp; - - if (gc->oemInit) { - FARPROC oemInitVideoTiming = NULL; - if (oemInitVideoTiming = GetProcAddress(gc->oemInit, "_fxoemInitVideoTiming@4")) { - if (oemInitVideoTiming(&gc->oemi.vid)) { - /* - ** video timing is updated by oem dll - */ - tvVidtiming.hSyncOn = gc->oemi.vid.hSyncOn; - tvVidtiming.hSyncOff = gc->oemi.vid.hSyncOff; - tvVidtiming.vSyncOn = gc->oemi.vid.vSyncOn; - tvVidtiming.vSyncOff = gc->oemi.vid.vSyncOff; - tvVidtiming.hBackPorch = gc->oemi.vid.hBackPorch; - tvVidtiming.vBackPorch = gc->oemi.vid.vBackPorch; - tvVidtiming.xDimension = gc->oemi.vid.xDimension; - tvVidtiming.yDimension = gc->oemi.vid.yDimension; - tvVidtiming.clkFreq16bpp = gc->oemi.vid.clkFreq16bpp; - tvVidtiming.clkFreq24bpp = gc->oemi.vid.clkFreq24bpp; - refresh = tvVidtiming.refreshRate = gc->oemi.vid.refresh; - grSstVidMode(_GlideRoot.current_sst, &tvVidtiming); - } - } - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - -#if GLIDE_INIT_HAL - { - GDBG_INFO(gc->myLevel, " HAL Video Init\n"); - - rv = fxHalInitVideo((SstRegs*)gc->reg_ptr, - ((resolution == GR_RESOLUTION_NONE) - ? GR_RESOLUTION_640x480 - : resolution), - refresh, - NULL); - if (!rv) goto BAILOUT; - } -#else - GDBG_INFO(gc->myLevel, " Video Init\n"); - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* CVG cannot just do one color buffer (Well, I guess it could, but - * not if you have the aux buffer too) so just force the allocation - * of two buffers. This does have consequences for swap since we - * need to ignore them too. - */ - gc->hwDep.cvgDep.singleBufferP = (nColBuffers == 1); - if (gc->hwDep.cvgDep.singleBufferP) nColBuffers = 2; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - /* If the user has buffer allocation set in their environment. Try - * those settings before trying the actual program settings. - * - * NB: We cannot fail the allocation on the env settings since the - * user could have messed up and set something ridiculous. - */ - { - FxI32 curColorBuffers = ((_GlideRoot.environment.nColorBuffer == -1L) - ? nColBuffers - : _GlideRoot.environment.nColorBuffer); - FxI32 curAuxBuffers = ((_GlideRoot.environment.nAuxBuffer == -1L) - ? nAuxBuffers - : _GlideRoot.environment.nAuxBuffer); - FxBool triedParamsP; - - do { - triedParamsP = ((curColorBuffers == nColBuffers) && - (curAuxBuffers == nAuxBuffers)); - - rv = sst1InitVideoBuffers(gc->reg_ptr, - resolution, refresh, - ((curColorBuffers == 1) ? 2 : curColorBuffers), - curAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv && !triedParamsP) { - curColorBuffers = nColBuffers; - curAuxBuffers = nAuxBuffers; - } - } while(!rv && !triedParamsP); - - /* Reset the parameters for the possible sli-slave video init and - * internal bookkeeping. - */ - nColBuffers = curColorBuffers; - nAuxBuffers = curAuxBuffers; - } - - /* If sli is on then we need to init the slave board's video */ - if (rv && gc->scanline_interleaved) { - rv = (gc->slave_ptr != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, " Invalid slave base address.\n"); - goto __errSliExit; - } - - rv = sst1InitVideoBuffers(gc->slave_ptr, - resolution, refresh, - nColBuffers, nAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitVideoBuffers failed for sli slave.\n"); - goto __errSliExit; - } - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize oem vedio after master and slave board - */ - if (gc->oemInit) { - FARPROC oemInitSetVideo = NULL; - FARPROC oemGet; - FxI32 tv_connected = 0; - FxI32 slimaster[2], slislave[2]; - if (oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4")) - oemInitSetVideo(&gc->oemi); - - if (oemGet = GetProcAddress(gc->oemInit, "_fxoemGet@12")) { - oemGet(FX_OEM_TVOUT, 4, &tv_connected); - /* Is tv connected to the board? */ - if (tv_connected) { - oemGet(FX_OEM_SLIMASTER, 8, slimaster); - oemGet(FX_OEM_SLISLAVE, 8, slislave); - if (((FxU32 *)slimaster[1] == gc->slave_ptr) && - ((FxU32 *)slislave[1] == gc->base_ptr)) - tv_swap_board = FXTRUE; - else - tv_swap_board = FXFALSE; - } - } - } -#endif - - if (rv) { - /* Check to see that we have a monitor attached to the board taht we - * expect to be driving the video. There are two cases here: sli and - * non-sli. - * - * In the sli case we expect the master to be driving the video so if - * the slave has the monitor plugged into it then we swap the sense of - * the master and slave. - * - * In the non-sli case there are two sub-cases: the user does not - * have a monitor attached at all to the card (read: moron) or that - * they have explicitly disabled sli with the monitor plugged into - * the slave. In the moron case there's nothing we can do, except - * finish up the init and let the user deal w/ the fact that they - * can't see anything. In the sli-disable case we need to initialize - * the video of the would be slave (this was not done before since - * sli was not auto-detected by the init code), swap the sense of - * the boards and continue w/ the rest of the initialization. - * - * NB: The calls to sst1InitGetDeviceInfo *MUST* come after - * sst1InitVideoBuffers for each card since that is where the - * monitor detection is done. - */ - rv = sst1InitGetDeviceInfo(gc->reg_ptr, &devInfo); - if (!rv) { - GDBG_INFO(gc->myLevel, - " sst1InitGetDeviceInfo failed to determine master monitor connectivness.\n"); - goto __errSliExit; - } - if (!devInfo.monitorDetected) { - if (gc->scanline_interleaved) { - rv = sst1InitGetDeviceInfo(gc->slave_ptr, &devInfo); - if (!rv) { - GDBG_INFO(gc->myLevel, - " sst1InitGetDeviceInfo failed to determine slave monitor connectivness.\n"); - goto __errSliExit; - } - - rv = FXTRUE; - if (devInfo.monitorDetected) { - GDBG_INFO(gc->myLevel, " Swapping sli slave and master"); - } else { - /* no monitors attached. - * Just do the default init w/o any swapping. - */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** We need to check the if tv is connected. - ** If not, then there is no output. - */ - if (tv_swap_board) - GDBG_INFO(gc->myLevel, " TV is connected. Swapping sli slave and master"); - else -#endif - { - GDBG_INFO(gc->myLevel, " No monitor attached to slave or master.\n"); - goto __errSliExit; - } - } - } else { - if (!gc->sliPairP) { - /* If there isn't a next board then there is not output. */ - rv = FXTRUE; - goto __errSliExit; - } else -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (!tv_swap_board) -#endif - { - /* Shutdown the logical master so that the new master will - * really own the video. - * - * NB: We don't have to shutdown the command fifo here since - * it is not on yet. - */ - { - sst1InitIdle(gc->base_ptr); - - /* Make sure that the caching is toggled. - * - * NB: The order of the caching changes is relevant here since - * we don't want to waste mtrr's, even briefly. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->base_ptr, FXFALSE); - sst1InitCaching((gc + 1)->base_ptr, FXTRUE); - } - - sst1InitShutdown(gc->base_ptr); - - /* We want to let the oem that video has shutdown here so - * that they can do the 'right' thing when we re-init - * video w/ the current slave as the master. - * - * NB: However, we don't do this currently because it requires - * odd semantics to the calling conventions of the oem dll. - */ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) && 0 - if (gc->oemInit) { - FARPROC oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@4"); - if (oemRestoreVideo != NULL) oemRestoreVideo(&gc->oemi); - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - gc->hwInitP = FXFALSE; - } - - /* dpc - 14 feb 1997 - HackAlert!!!! - * The sst1InitShutdown above will close the pci library which - * then prevents other pci library calls which we need to init - * video next. - */ - pciOpen(); - - /* Re-init the new master */ - { - FxU32* sstRegs = sst1InitMapBoard(_GlideRoot.current_sst + 1); - rv = (sstRegs != NULL); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-map 'monitor swap slave'.\n", FN_NAME); - goto __errSliExit; - } - - rv = sst1InitRegisters(sstRegs); - if (!rv) { - GDBG_INFO(gc->myLevel, "%s: Could not re-init 'monitor swap slave' registers\n", FN_NAME); - goto __errSliExit; - } - - /* Reset up pointers to the various address spaces within the hw - * since the hw base address can be different from the original - * map board. - */ - (gc + 1)->base_ptr = (FxU32*)HW_BASE_PTR(sstRegs); - (gc + 1)->reg_ptr = (FxU32*)HW_REG_PTR(sstRegs); - (gc + 1)->lfb_ptr = (FxU32*)HW_LFB_PTR(sstRegs); - (gc + 1)->tex_ptr = (FxU32*)HW_TEX_PTR(sstRegs); - - /* We're done setting up the new master's hw */ - (gc + 1)->hwInitP = FXTRUE; - } - - rv = sst1InitVideoBuffers((gc + 1)->base_ptr, - resolution, refresh, - nColBuffers, nAuxBuffers, - gc->vidTimings, - FXTRUE); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitVideoBuffers failed for 'monitor swap slave'.\n"); - goto __errSliExit; - } - } - } - - /* Switch the senses of the master and slave in the gc's. - * - * NB: This only has to swap the hw addresses since the rest of - * the information has to be the same in order for the boards to - * be sli-able. - */ -#define SwapPtrVal(__a, __b) do { FxU32* temp = (__a); (__a) = (__b); (__b) = temp; } while(0); - SwapPtrVal(gc->base_ptr, (gc + 1)->base_ptr); - SwapPtrVal(gc->reg_ptr, (gc + 1)->reg_ptr); - SwapPtrVal(gc->tex_ptr, (gc + 1)->tex_ptr); - SwapPtrVal(gc->lfb_ptr, (gc + 1)->lfb_ptr); -#undef SwapPtrVal - - if (gc->scanline_interleaved) { - /* The slave pointer, however, needs to be set by hand again. */ - gc->slave_ptr = (gc + 1)->base_ptr; - (gc + 1)->slave_ptr = NULL; - - /* Swap the caching characteristics too. The old master is now - * the slave, and the old slave is now the master. The caching - * on the old master was set when the board was mapped the - * first time. - * - * NB: The order of the caching changes is relevant here since - * we don't want to waste mtrr's, even briefly. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->slave_ptr, FXFALSE); - sst1InitCaching(gc->base_ptr, FXTRUE); - } - } - - /* Save that we swapped teh master sense so that we can - * restore these settings when we shut down. - */ - gc->swapMasterSenseP = FXTRUE; - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* NB: We need to make sure that the oem structure reflects the - * 'new' sense of the master/slave relationship. - */ - gc->oemi.linearAddress = gc->base_ptr; - gc->oemi.slaveAddress = gc->slave_ptr; - - /* re-initialize oem vedio for the board */ - if (gc->oemInit) { - FARPROC oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4"); - if (oemInitSetVideo != NULL) oemInitSetVideo(&gc->oemi); - } -#endif - } - } - - /* If we have an sli configuration then start it up. - * - * NB: There are two ways to get here. In the case that a monitor - * was detected we will get here straightline. If no monitors are - * detected (sli or no) we will get here via an error goto to - * the label __errSliExit. - */ -__errSliExit: - if (rv && gc->scanline_interleaved) { - rv = sst1InitSli(gc->reg_ptr, gc->slave_ptr); - if (!rv) { - GDBG_INFO(gc->myLevel, " sst1InitSli failed.\n"); - goto __errSliExit; - } - - /* If the user has not set FX_GLIDE_SWAPINTERVAL == 0 then - * override the swapInterval for grBufferSwap so that it always - * goes w/ vsync. Otherwise it can look bad as the boards swap out - * of sync w/ each other. - */ - if (_GlideRoot.environment.swapInterval < 0) _GlideRoot.environment.swapInterval = 1; - } - - /* Explicitly set the pass through address that the vxd will be - * using to toggle the passthrough. In sli mode this is the master, - * and otherwise it is the card driving the monitor's vidoe. - * Currently, we set this to be a 16mb address space. - */ -#if 0 - if (rv) pciSetPassThroughBase(gc->base_ptr, 0x1000000); -#endif -#endif - - if (!rv) goto BAILOUT; - - /* Doh! Don't forget to set the resolution conversions. */ - if (gc->vidTimings == NULL) { - switch(resolution) { -#if !(GLIDE_PLATFORM & GLIDE_HW_CVG) - case GR_RESOLUTION_320x200: - xres = 320; yres = 200; - break; - - case GR_RESOLUTION_320x240: - xres = 320; yres = 240; - break; - - case GR_RESOLUTION_400x256: - xres = 400; yres = 256; - break; -#endif /* !(GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - case GR_RESOLUTION_512x384: - xres = 512; yres = 384; - break; - - case GR_RESOLUTION_640x200: - xres = 640; yres = 200; - break; - - case GR_RESOLUTION_640x350: - xres = 640; yres = 350; - break; - - case GR_RESOLUTION_640x400: - xres = 640; yres = 400; - break; - - case GR_RESOLUTION_640x480: - xres = 640; yres = 480; - break; - - case GR_RESOLUTION_800x600: - xres = 800; yres = 600; - break; - - case GR_RESOLUTION_960x720: - xres = 960; yres = 720; - break; - - case GR_RESOLUTION_856x480: - xres = 856; yres = 480; - break; - - case GR_RESOLUTION_512x256: - xres = 512; yres = 256; - break; - - case GR_RESOLUTION_1024x768: - xres = 1024; yres = 768; - break; - - case GR_RESOLUTION_1280x1024: - xres = 1280; yres = 1024; - break; - - case GR_RESOLUTION_1600x1200: - xres = 1600; yres = 1200; - break; - - default: - GR_ASSERT(0); - } - } else { - xres = gc->vidTimings->xDimension; - yres = gc->vidTimings->yDimension; - } - - /* Stash these, mostly for error checking type things */ - gc->grColBuf = nColBuffers; - gc->grAuxBuf = nAuxBuffers; - - /* The current init code always sets this to 1024. */ - fbStride = 1024; - - GDBG_INFO(gc->myLevel, - " Video init succeeded. xRes:%.04d yRes:%.04d nCol:%d nAux:%d\n", - xres, yres, gc->grColBuf, gc->grAuxBuf); - - /*------------------------------------------------------ - Command Transport Init - ------------------------------------------------------*/ - { -#if !((GLIDE_PLATFORM & GLIDE_HW_CVG)) - InitFIFOData fifoInfo; - - GDBG_INFO(gc->myLevel, " Command Transport Init\n"); - rv = initEnableTransport(&fifoInfo); - if (!rv) goto BAILOUT; -#endif - -#if ((GLIDE_PLATFORM & GLIDE_HW_H3) || (GLIDE_PLATFORM & GLIDE_HW_CVG)) - /* Place cmd fifo into fbi memory. There are actually two - * 'placements' here, hw memory and virtual address space. In hw - * memory, the fifo is placed after any buffers that the user has - * requested (color and aux). If there is any memory left after - * these buffer allocations, we grab it all, otherwise this is an - * error. In virtual address space, the fifo is always placed at - * HW_FIFO_OFFSET. - */ - { - FxU32 xTileNum = 0; - FxU32 fifoSize = 0x00UL; - -#if GLIDE_INIT_HAL - rv = fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo); -#else - rv = sst1InitGetDeviceInfo(gc->base_ptr, &devInfo); -#endif - if (!rv) { - GDBG_INFO(gc->myLevel, " XXXGetDeviceInfo failed. (0x%X)\n", gc->reg_ptr); - goto BAILOUT; - } - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - xTileNum = devInfo.fbiVideoTilesInX; -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR - { - /* Cache the # of pages for video tiles in the x direction - * for use in grBufferClear (gglide.c). - */ - gc->hwDep.cvgDep.tileSlopP = ((xTileNum & 0x01) != 0x00); - gc->hwDep.cvgDep.xTilePages = (xTileNum >> 1); - - gc->hwDep.cvgDep.yTileShift = (gc->scanline_interleaved ? 6 : 5); - - /* Get the # of pages per buffer. */ - gc->hwDep.cvgDep.numBufferPages = devInfo.fbiVideoMemOffset; - - /* Set logical buffer -> physical buffer translations */ - gc->hwDep.cvgDep.frontBuf = 0; - gc->hwDep.cvgDep.backBuf = (gc->scanline_interleaved ? gc->grColBuf - 1 : 1); - - /* Initially current buffer == back buffer. */ - gc->hwDep.cvgDep.renderBuf = gc->hwDep.cvgDep.backBuf; - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_BLIT_CLEAR */ - -#if USE_PACKET_FIFO - /* Place fifo in hw memory */ - { - /* Init hw */ -#define MB2B(__b) (((FxU32)(__b)) << 20) -#if GLIDE_INIT_HAL - /* Allocate the fifo on a page boundary */ -#define kPageBoundarySlop 0x1000UL -#define kPageBoundaryMask (kPageBoundarySlop - 1) - - const FxU32 memEnd = MB2B(gc->fbuf_size); /* size of hw memory */ - FxU32 maxOffset = ((xTileNum * yres) << 6) * (nColBuffers + nAuxBuffers); /* Bytes for buffers */ - - /* Align on a page boundary */ - if ((maxOffset & kPageBoundaryMask) != 0x00) { - maxOffset = ((maxOffset + kPageBoundarySlop) & ~kPageBoundaryMask); - } - -#if GLIDE_USE_DEBUG_FIFO - fifoSize = 0x1000UL; -#else /* !GLIDE_USE_DEBUG_FIFO */ - /* Too much memory claimed for other stuff? */ - fifoSize = MIN(memEnd - maxOffset, (0x01 << 18)); - rv = (maxOffset < memEnd); - if (!rv) { - GDBG_INFO(0, "Error: Tried to place cmd fifo (0x%X) past end of fbi mem (0x%X).\n", - maxOffset, memEnd); - goto BAILOUT; - } -#endif /* !GLIDE_USE_DEBUG_FIFO */ - - /* Place fifo in hw. Taking all of the remainging memory up to the - * byte swizzling bit in the cmd fifo address. - */ - gc->cmdTransportInfo.fifoOffset = memEnd - fifoSize; - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - rv = fxHalInitCmdFifo(hw, /* sst */ - 0, /* which fifo - always 0 for cvg */ - /* V fifoStart - offset from hw base V */ - gc->cmdTransportInfo.fifoOffset, - fifoSize, /* size - in bytes */ - FXFALSE, /* directExec */ - FXFALSE, /* disableHoles */ - _grSet32); -#else -#error "Need HAL command fifo init routine for this hw" -#endif -#else /* !GLIDE_INIT_HAL */ - { - /* NB: This is a dummy since fifoStart is always hwBase + - * HW_FIFO_OFFSET (0x200000) - */ - FxU32 fifoStart = 0; - - rv = sst1InitCmdFifo(gc->reg_ptr, FXTRUE, - &fifoStart, - &gc->cmdTransportInfo.fifoOffset, - &fifoSize, - _grSet32); - } -#if GLIDE_USE_DEBUG_FIFO - { - const char* envVar = GETENV("FX_GLIDE_DEBUG_FIFO"); - const FxU32 debugFifoSize = ((envVar == NULL) - ? kDebugFifoSize - : atoi(envVar)); - if (fifoSize > debugFifoSize) fifoSize = debugFifoSize; - } -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#if GLIDE_USE_SHADOW_FIFO - /* If we're debugging its nice to know what we really wrote - * into the fifo space, just in case tracing is off. - */ - { - FxU32* shadowPtr = (FxU32*)calloc(fifoSize + kPageBoundarySlop, sizeof(FxU32)); - - if (shadowPtr == NULL) { - gdbg_printf("Could not allocate shadow fifo\n"); - } else if (((FxU32)shadowPtr & kPageBoundaryMask) != 0x00) { - shadowPtr = (FxU32*)(((FxU32)shadowPtr + kPageBoundarySlop) & ~kPageBoundaryMask); - } - gc->cmdTransportInfo.fifoShadowBase = - gc->cmdTransportInfo.fifoShadowPtr = shadowPtr; - } -#endif /* GLIDE_USE_SHADOW_FIFO */ -#endif /* !GLIDE_INIT_HAL */ - - if (!rv) { - GDBG_INFO(0, "Error: fxHalInitCmdFifo failed.\n"); - goto BAILOUT; - } - GR_ASSERT(fifoSize > 0); - - /* Pre-compute the packet to return us back to the start. - * - * NB: This is an actual hw address. - */ - gc->cmdTransportInfo.fifoJmpHdr = (SSTCP_PKT0_JMP_LOCAL | - (gc->cmdTransportInfo.fifoOffset << (SSTCP_PKT0_ADDR_SHIFT - 2))); - } - - /* Setup virtual fifo addressing */ - { - gc->cmdTransportInfo.fifoStart = (FxU32*)((FxU32)gc->base_ptr + HW_FIFO_OFFSET); - gc->cmdTransportInfo.fifoEnd = (FxU32*)((FxU32)gc->cmdTransportInfo.fifoStart + fifoSize); - gc->cmdTransportInfo.fifoSize = fifoSize; - - /* Adjust room values. - * RoomToEnd needs enough room for the jmp packet since we - * never allow the hw to auto-wrap. RoomToRead needs to be - * adjusted so that we never acutally write onto the read ptr. - * - * fifoRoom is generally the min of roomToEnd and roomToRead, - * but we 'know' here that roomToRead < roomToEnd. - */ - gc->cmdTransportInfo.roomToEnd = fifoSize - FIFO_END_ADJUST; - gc->cmdTransportInfo.fifoRoom = - gc->cmdTransportInfo.roomToReadPtr = - gc->cmdTransportInfo.roomToEnd - sizeof(FxU32); - - /* Set initial fifo state. hw read and sw write pointers at - * start of the fifo. - */ - gc->cmdTransportInfo.fifoPtr = gc->cmdTransportInfo.fifoStart; - gc->cmdTransportInfo.fifoRead = HW_FIFO_PTR(FXTRUE); - - GDBG_INFO(gc->myLevel, - "Fifo Parameters:\n" - "\tStart: 0x%X\n" - "\tHW Read: 0x%X\n" - "\tHW Offset: 0x%X\n" - "\tSW Write: 0x%X\n", - gc->cmdTransportInfo.fifoStart, - gc->cmdTransportInfo.fifoRead, - gc->cmdTransportInfo.fifoOffset, - gc->cmdTransportInfo.fifoPtr); - } -#endif /* USE_PACKET_FIFO */ - - /* We expect that lfb writes will *NOT* go through the fifo, and that the - * fifo is ready for commands. - */ - gc->cmdTransportInfo.fifoLfbP = FXFALSE; - gc->cmdTransportInfo.lfbLockCount = 0; -#undef MB2B - } - -#if !GLIDE_INIT_HAL && 0 - /* dpc - 24 jan 1998 - FixMe! - * This is currently being done in _grDetectResources so that we - * can match the nt driver semantics in win95. - */ - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->reg_ptr, FXTRUE); - } -#endif /* !GLIDE_INIT_HAL */ -#else -#error "Need to write command transport init for glide for this hw" -#endif - } - - /* We're effectively open now */ - gc->open = FXTRUE; - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " GC Init\n"); - gc->state.screen_width = xres; - gc->state.screen_height = yres; - gc->state.num_buffers = nColBuffers; - gc->state.color_format = format; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - gc->fbStride = fbStride; - - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - - for (tmu = 0; tmu < gc->num_tmu; tmu += 1) { - const GrHwConfiguration* hwConfig = &_GlideRoot.hwConfig; - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - - if ((hwConfig->SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_VOODOO) && - (hwConfig->SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev == 0)) { - textureMode = 0; - } - - gc->state.tmu_config[tmu].textureMode = textureMode; - gc->state.tmu_config[tmu].tLOD = 0x00000000; - gc->state.tmu_config[tmu].tDetail = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[tmu].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[tmu].smallLod = GR_LOD_1; - gc->state.tmu_config[tmu].largeLod = GR_LOD_1; - gc->state.tmu_config[tmu].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[tmu].nccTable = GR_NCCTABLE_NCC0; - } - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " 3D State Init\n"); - gc->state.fbi_config.fbzMode = (SST_ENRECTCLIP | - SST_ENZBIAS | - SST_DRAWBUFFER_BACK); - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin(origin); - grAlphaBlendFunction(GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grAlphaTestReferenceValue(0); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue((FxU32) ~0); - grClipWindow(0, 0, gc->state.screen_width, - gc->state.screen_height); - _grColorCombineDelta0Mode(FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask(FXTRUE, FXFALSE); - grCullMode(GR_CULL_DISABLE); - grDepthBiasLevel(0); - grDepthMask(FXFALSE); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grDepthBufferFunction(GR_CMP_LESS); - grDepthBiasLevel(0); - grDitherMode(GR_DITHER_4x4); - grFogMode(GR_FOG_DISABLE); - grFogColorValue(0x00000000); -#ifdef ENABLE_REGISTRY_GAMMA_RGB_AND_GAMMA_TABLE - { - char* gammaRGBTableStr; - char* gammaRGBStr; - char* str; - /* - ** if we decided to enable gammargb and gammatable, we need to - ** bump the buffer size in GETENV - */ - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_SIZE")) { - FxU32 entries, i; - float red[256], green[256], blue[256]; - FxBool useGammaTable = FXTRUE; - GR_BEGIN_NOFIFOCHECK("Hack for Gamma Table",80); - str = strtok(gammaRGBTableStr, " "); - entries = atol(str); - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_RED")) { - str = strtok(gammaRGBTableStr, " "); - red[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - red[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_GREEN")) { - str = strtok(gammaRGBTableStr, " "); - green[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - green[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (gammaRGBTableStr = GETENV("FX_GLIDE_GAMMATABLE_BLUE")) { - str = strtok(gammaRGBTableStr, " "); - blue[0] = (float)atof(str); - for (i = 1; i < entries; i++) { - str = strtok(NULL, " "); - blue[i] = (float)atof(str); - } - } - else - useGammaTable = FXFALSE; - if (useGammaTable) - sst1InitGammaTable(gc->reg_ptr, entries, (FxU32 *)red, (FxU32 *)green, (FxU32 *)blue); - else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); - GR_END(); - } - else if (gammaRGBStr = GETENV("FX_GLIDE_GAMMARGB")) { - float r, g, b; - GR_BEGIN_NOFIFOCHECK("Hack for Gamma RGB",80); - str = strtok(gammaRGBStr, " "); - r = (float)atof(str); - str = strtok(NULL, " "); - g = (float)atof(str); - str = strtok(NULL, " "); - b = (float)atof(str); - sst1InitGammaRGB(gc->reg_ptr, r, g, b); - GR_END(); - } - else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); - } -#else - grGammaCorrectionValue(GLIDE_DEFAULT_GAMMA); -#endif - - guTexMemReset(); - - switch (gc->num_tmu) { - case 3: - grTexClampMode(GR_TMU2, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU2, 0, 1, 1.0F); - grTexFilterMode(GR_TMU2, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU2, 0.0F); - grTexMipMapMode(GR_TMU2, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombineFunction(GR_TMU2, GR_TEXTURECOMBINE_ZERO); - grTexCombine(GR_TMU2, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 2: - grTexClampMode(GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU1, 0, 1, 1.0F); - grTexFilterMode(GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU1, 0.0F); - grTexMipMapMode(GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 1: - grTexClampMode(GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU0, 0, 1, 1.0F); - grTexFilterMode(GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU0, 0.0F); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - } - grLfbConstantAlpha(0xFF); - grLfbConstantDepth(0); - - /* -------------------------------------------------------- - Splash Screen - --------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (!_GlideRoot.environment.noSplash) { - HMODULE newSplash; - - if (newSplash = LoadLibrary("3dfxsplash2.dll")) { - FARPROC fxSplash; - - if (fxSplash = GetProcAddress(newSplash, "_fxSplash@16")) { - fxSplash(hWnd, gc->state.screen_width, gc->state.screen_height, nAuxBuffers); - _GlideRoot.environment.noSplash = 1; - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /* If it's still 0, then do the old one */ - if (!_GlideRoot.environment.noSplash) { - grSplash(0.0f, 0.0f, - (float) gc->state.screen_width, - (float) gc->state.screen_height, - 0); - _GlideRoot.environment.noSplash = 1; - } - - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - -BAILOUT: - GR_RETURN(rv); -#undef FN_NAME -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - (nosup) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinClose, void, (void)) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose", 80); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - if ((gc != NULL) && gc->open) { -#if GLIDE_INIT_HAL - /* dpc - 22 may 1997 - FixMe! - * We need the equivilant stuff in the hal layer too. - */ -#else /* !GLIDE_INIT_HAL */ -#if GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY - /* Make sure that linear memory is back to the 'happy' state - * before shutting down so that any re-inits are not going to die - * on access violations. - */ - grHints(GR_HINT_LFB_RESET, 0); -#endif /* GLIDE_DEBUG || GLIDE_CHECK_COMPATABILITY */ - - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(gc->myLevel, " 3D Idle"); - /* dpc - 5 sep 1997 - * The old way. - * - * initIdle(); - */ - sst1InitIdle(gc->reg_ptr); - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(gc->myLevel, " Command Transport Disable"); - /* dpc - 5 sep 1997 - * The old way. - * - * initDisableTransport(); - */ - /* When disabling all of the parameters other than sstBase and the - * enable flag are ignored. - */ - sst1InitCmdFifo(gc->reg_ptr, FXFALSE, NULL, NULL, NULL, NULL); - - /*-------------------------- - Video Restore - --------------------------*/ - GDBG_INFO(gc->myLevel, " Restore Video"); - /* dpc - 5 sep 1997 - FixMe! - * Uhhh.... what is the new call to do this? - * - * initRestoreVideo(); - */ - /* The shutdown takes care of restoring the video etc. The - * shutdown also takes care of cleaning up sli now just in case - * someone (test27) tries to re-open the sli pair later because - * the init sequence has trouble sometimes re-initting if the - * boards are still paired. - * - * NB: We do have to cleanup any processor caching characteristics - * here because sst1InitShutdown will unlink the connection - * between our hw address and its internal structures which keep - * track of the mtrr's. - */ - sst1InitIdle(gc->reg_ptr); - if (_GlideRoot.CPUType >= 6) { - sst1InitCaching(gc->base_ptr, FXFALSE); - } - sst1InitShutdown(gc->reg_ptr); -#endif /* !GLIDE_INIT_HAL */ - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(gc->myLevel, " GC Reset"); - - /* open and hwInitP are really two different things. - * - * hwInitP indicates whether the init code mapping/init sequence - * is active for this hw. - * - * open includes setting up video, command transport, and the - * initial glide state. - */ - gc->hwInitP = FXFALSE; - if (gc->scanline_interleaved) (gc + 1)->hwInitP = FXFALSE; - - /* If we swapped the monitor sense on open then switch these - * back so that any later re-mappings of the board are in sync - * w/ the init code's mappings. - */ - if (gc->swapMasterSenseP) { -#define SwapPtrVal(__a, __b) do { FxU32* temp = (__a); (__a) = (__b); (__b) = temp; } while(0); - SwapPtrVal(gc->base_ptr, (gc + 1)->base_ptr); - SwapPtrVal(gc->reg_ptr, (gc + 1)->reg_ptr); - SwapPtrVal(gc->tex_ptr, (gc + 1)->tex_ptr); - SwapPtrVal(gc->lfb_ptr, (gc + 1)->lfb_ptr); -#undef SwapPtrVal - - /* Again, reset the slave pointers by hand */ - if (gc->scanline_interleaved) { - gc->slave_ptr = (gc + 1)->base_ptr; - (gc + 1)->slave_ptr = NULL; - } - - gc->swapMasterSenseP = FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - FARPROC oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@4"); - - if (oemRestoreVideo != NULL) oemRestoreVideo(&gc->oemi); - FreeLibrary(gc->oemInit); - } -#endif - } - gc->open = FXFALSE; - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, (GrControl_t code)) -{ - GR_DCL_GC; -#define FN_NAME "grSstControl" - GDBG_INFO(41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit); - - if (_GlideRoot.windowsInit && gc->open) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - xRes = initControl(code); - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ > 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXFALSE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - return initControl(code); -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - { - FxBool isValidP = FXTRUE; - FxBool passFlag = 0; - - switch ( code ) { - case GR_CONTROL_DEACTIVATE: - passFlag = FXTRUE; - break; - - case GR_CONTROL_ACTIVATE: - passFlag = FXFALSE; - break; - - default: - isValidP = FXFALSE; - } - - if (isValidP) sst1InitVgaPassCtrl(gc->base_ptr, passFlag); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - - } -#endif - } - - GDBG_INFO(41, "%s: Returning TRUE\n", FN_NAME); - return FXTRUE; -#undef FN_NAME -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#define FN_NAME "grSstPerfStats" - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",pStats); - GR_CHECK_F(FN_NAME, !pStats, "NULL pointer"); - - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - - GR_END(); -#undef FN_NAME -} /* grSstPerfStats */ - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -GR_ENTRY(grSstResetPerfStats, void, (void)) -{ -#define FN_NAME "grSstResetPerfStats" - GR_BEGIN("grSstResetPerfStats",83,4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_SET(BROADCAST_ID, hw, nopCMD, 1); - GR_END(); -#undef FN_NAME -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -GR_ENTRY(grSstStatus, FxU32, (void)) -{ - GR_BEGIN_NOFIFOCHECK("grSstStatus", 85); - - { - const FxU32 stat = GR_GET(hw->status); - - GDBG_INFO(84,"grSstStatus() => 0x%x\n", stat); - - return stat; - } -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -GR_ENTRY(grSstVideoLine, FxU32, (void)) -{ - FxU32 vline = 1; -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - GR_DCL_GC; - GR_DCL_HW; - - vline = GR_GET(hw->vRetrace); - GDBG_INFO(84,"grSstVideoLine() => 0x%x (%d)\n",vline,vline); -#endif - return vline; -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -{ - return ((grSstStatus() & SST_VRETRACE) == 0); -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIdle/grFinish -*/ -GR_ENTRY(grSstIdle, void, (void)) -#define FN_NAME "grSstIdle" -{ - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - IDLE_HW(hw); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ -GR_ENTRY(grSstIsBusy, FxBool, (void)) -{ -#define FN_NAME "grSstIsBusy" - static FxBool nopP = FXTRUE; - FxBool busy; - GR_BEGIN_NOFIFOCHECK("grSstIsBusy", 80); - - /* dpc - 22 may 1997 - FixMe! - * Seems like the simplest way to do it, but is this really the way - * to do it? - */ - if (nopP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - - busy = ((grSstStatus() & SST_BUSY) != 0); - nopP = !busy; - - GDBG_INFO(84,"grSstIsBusy() => 0x%x\n", busy); - - return busy; -#undef FN_NAME -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gamma)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE(gc->myLevel,"(%g)\n",gamma); - -#if GLIDE_INIT_HAL - fxHalInitGamma(hw, gamma); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * The old way - * - * initGamma(gam); - */ - sst1InitGamma(gc->reg_ptr, gamma); -#endif /* !GLIDE_INIT_HAL */ - - GR_END(); -} /* grGammaCorrectionValue */ - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_STATE_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin)) -{ -#define FN_NAME "grSstOrigin" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grSstOrigin", 83); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", origin); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - /* dpc - 22 may 1997 - FixMe! - * Do we need to do anything here for the HAL? - */ -#if !GLIDE_INIT_HAL - /* dpc - 5 sep 1997 - FixMe! - * This is the old way. Is there anything else we - * need to do here? - * - * initOrigin(origin); - */ -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) - /* Sli has an 'interesting' feature where the physical scanlines - * that are being rendered is dependent on the location of the y - * origin. We always clear the overlap bit to black here so that - * no one ever notices. This needs to be done for all of the allocated - * color buffers that could have possibly have been rendered to since - * the last origin swap. Rather than beeing really tricky I just do - * it for every allocated color buffer. - * - * Origin_Lower_Left: 0:Black [1 .. screenRezY]:Rendered screenRez+1:Black - * Origin_Upper_Left: [0 .. screenRezY - 1]:Rendered [screenRez-screenRez+1]:Black - */ - if (gc->scanline_interleaved) gc->hwDep.cvgDep.sliOriginBufCount = gc->grColBuf; -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) */ - - gc->state.fbi_config.fbzMode = fbzMode; -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif -#undef FN_NAME -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - * CHD: No. - * JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - * if you are talking about SstConfigPipeline, it is evil and must - * be destroyed. :) - * dpc: There is one user that I know of. This 'Nature' demo that Scott just - * gave me. - * chd: It's a stub now. - */ - - -extern FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, FxU32 reg, FxU32 value); - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, FxU32 reg, FxU32 value)) -{ -} /* grSstConfigPipeline */ - diff --git a/glide2x/cvg/glide/src/gsstdef.h b/glide2x/cvg/glide/src/gsstdef.h deleted file mode 100644 index d1801b6..0000000 --- a/glide2x/cvg/glide/src/gsstdef.h +++ /dev/null @@ -1,241 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 4 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 3 5/21/97 6:05a Peter -** -*/ -#ifndef __GSSTDEF_H__ -#define __GSSTDEF_H__ - - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#include -#endif - -/*----------------- SST chip layout -----------------------*/ -typedef enum -{ - SSTR_STATUS, - SSTR_RESERVED0, - SSTR_VAX, - SSTR_VAY, - SSTR_VBX, - SSTR_VBY, - SSTR_VCX, - SSTR_VCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_R, - SSTR_DRDX, - SSTR_DRDY, - - SSTR_G, - SSTR_DGDX, - SSTR_DGDY, - - SSTR_B, - SSTR_DBDX, - SSTR_DBDY, - - SSTR_Z, - SSTR_DZDX, - SSTR_DZDY, - - SSTR_A, - SSTR_DADX, - SSTR_DADY, - - SSTR_S, - SSTR_DSDX, - SSTR_DSDY, - - SSTR_T, - SSTR_DTDX, - SSTR_DTDY, - - SSTR_W, - SSTR_DWDX, - SSTR_DWDY, -#else - SSTR_R, - SSTR_G, - SSTR_B, - SSTR_Z, - SSTR_A, - SSTR_S, - SSTR_T, - SSTR_W, - - SSTR_DRDX, - SSTR_DGDX, - SSTR_DBDX, - SSTR_DZDX, - SSTR_DADX, - SSTR_DSDX, - SSTR_DTDX, - SSTR_DWDX, - - SSTR_DRDY, - SSTR_DGDY, - SSTR_DBDY, - SSTR_DZDY, - SSTR_DADY, - SSTR_DSDY, - SSTR_DTDY, - SSTR_DWDY, -#endif - SSTR_TRIANGLECMD, - SSTR_RESERVED1, - - SSTR_FVAX, - SSTR_FVAY, - SSTR_FVBX, - SSTR_FVBY, - SSTR_FVCX, - SSTR_FVCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_FR, - SSTR_FDRDX, - SSTR_FDRDY, - - SSTR_FG, - SSTR_FDGDX, - SSTR_FDGDY, - - SSTR_FB, - SSTR_FDBDX, - SSTR_FDBDY, - - SSTR_FZ, - SSTR_FDZDX, - SSTR_FDZDY, - - SSTR_FA, - SSTR_FDADX, - SSTR_FDADY, - - SSTR_FS, - SSTR_FDSDX, - SSTR_FDSDY, - - SSTR_FT, - SSTR_FDTDX, - SSTR_FDTDY, - - SSTR_FW, - SSTR_FDWDX, - SSTR_FDWDY, -#else - SSTR_FR, - SSTR_FG, - SSTR_FB, - SSTR_FZ, - SSTR_FA, - SSTR_FS, - SSTR_FT, - SSTR_FW, - - SSTR_FDRDX, - SSTR_FDGDX, - SSTR_FDBDX, - SSTR_FDZDX, - SSTR_FDADX, - SSTR_FDSDX, - SSTR_FDTDX, - SSTR_FDWDX, - - SSTR_FDRDY, - SSTR_FDGDY, - SSTR_FDBDY, - SSTR_FDZDY, - SSTR_FDADY, - SSTR_FDSDY, - SSTR_FDTDY, - SSTR_FDWDY, -#endif - SSTR_FTRIANGLECMD, - SSTR_FBZCOLORPATH, - SSTR_FOGMODE, - SSTR_ALPHAMODE, - SSTR_FBZMODE, - SSTR_LFBMODE, - SSTR_CLIPLEFTRIGHT, - SSTR_CLIPBOTTOMTOP, - - SSTR_NOPCMD, - SSTR_FASTFILLCMD, - SSTR_SWAPBUFFERCMD, - SSTR_FOGCOLOR, - SSTR_ZACOLOR, - SSTR_CHROMAKEY, - SSTR_RESERVED2, - SSTR_RESERVED3, - - SSTR_STIPPLE, - SSTR_C0, - SSTR_C1, - - SSTR_FBIPIXELSIN, - SSTR_FBICHROMAFAIL, - SSTR_FBIZFUNCFAIL, - SSTR_FBIAFUNCFAIL, - SSTR_FBIPIXELSOUT, - - SSTR_FOGTABLE, - SSTR_RESERVED8 = SSTR_FOGTABLE + 32, - - SSTR_FBIINIT4 = SSTR_RESERVED8 + 8, - SSTR_VRETRACE, - SSTR_BACKPORCH, - SSTR_VIDEODIMENSIONS, - SSTR_FBIINIT0, - SSTR_FBIINIT1, - SSTR_FBIINIT2, - SSTR_FBIINIT3, - - SSTR_HSYNC, - SSTR_VSYNC, - SSTR_CLUTDATA, - SSTR_DACDATA, - SSTR_MAX_RGB_DELTA, - SSTR_RESERVED51, - - SSTR_TEXTUREMODE = SSTR_RESERVED51 + 51, - SSTR_TLOD, - SSTR_TDETAIL, - SSTR_TEXBASEADDR, - SSTR_TEXBASEADDR1, - SSTR_TEXBASEADDR2, - SSTR_TEXBASEADDR38, - SSTR_TEXINIT0, - SSTR_TEXINIT1, - - SSTR_NCCTABLE0, - SSTR_NCCTABLE1 = SSTR_NCCTABLE0 + 12, - SSTR_END_OF_REGISTER_SET -} GrSstRegister; - -#endif /* __GSSTDEF_H__ */ diff --git a/glide2x/cvg/glide/src/gstrip.c b/glide2x/cvg/glide/src/gstrip.c deleted file mode 100644 index 6076ebf..0000000 --- a/glide2x/cvg/glide/src/gstrip.c +++ /dev/null @@ -1,302 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 19 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 17 12/08/97 10:38a Atai - * added grDrawVertexArrayLinear() - * - * 16 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 15 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 14 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 13 11/04/97 4:57p Atai - * use byte offset - * - * 12 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 11 10/17/97 2:11p Atai - * added grContinueArray. We only support non aa mode for now. - * - * 10 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 9 10/14/97 6:16p Atai - * reverse triangle order in _grAADrawVertexList - * - * 8 10/14/97 5:41p Atai - * added _grAADrawVertexList() - * - * 7 10/14/97 4:57p Dow - * Clamping - * - * 6 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 5 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 4 9/29/97 1:26p Dow - * Fixed packed color strips/fans - * - * 3 9/26/97 10:24a Dow - * Fixed state Muckage in Glide3 parameter data - * - * 2 9/23/97 2:35p Dow - * One less loop - * - * 1 9/23/97 2:04p Dow - * DD code for strips -** -*/ -#ifdef GLIDE3 -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - Function: _grDrawVertexList - Date: 18-Sep-97 - Implementor(s): dow - Description: - Sends a triangle strip to CVG. - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawVertexList" - - /* - ** simplified code - */ - FxU32 - vNum = 0, - vSize; - float - **lPtrs = (float **) pointers; - FxI32 stride = mode; - FxU32 - sCount = count, set = 0, pktype = SSTCP_PKT3_BDDDDD; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(type = 0x%x, count = %d, pointers = 0x%x)\n", - type, count, pointers); - - GR_FLUSH_STATE(); - - vSize = gc->state.vData.vSize; - if (stride == 0) - stride = gc->state.vData.vStride; - - /* Draw the first (or possibly only) set. This is necessary because - the packet is 3_BDDDDDD, and in the next set, the packet is - 3_DDDDDD */ - /* - ** We try to make tstrip code simple to read. We combine the original code - ** into a single loop by adding an extra packet type assignment at the end of the loop. - ** Also, the debugging code are removed temporarily. - */ - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - FxI32 k, vcount = count >= 15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * vSize, 1); - TRI_STRIP_BEGIN(type, vcount, vSize, pktype); - /* - ** If we use a while loop, the compiler will increment vNum and store the value back - ** to the memory at every loop. In a for loop, vNum data are kept in a register. - ** After the loop complete, the vNum data are written back to memory. - */ - for (k = 0; k < vcount; k++) { - FxU32 i, dataElem; - float *vPtr; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - (float *)pointers += stride; - - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - pktype = SSTCP_PKT3_DDDDDD; - } - } - else { - /* - * first cut of clip space coordinate code, no optimization. - */ - float oow; - - while (count > 0) { - FxI32 k, vcount = count >= 15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * vSize, 1); - TRI_STRIP_BEGIN(type, vcount, vSize, pktype); - for (k = 0; k < vcount; k++) { - float *vPtr; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset); - /* x, y */ - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) - *oow*gc->state.Viewport.hwidth + gc->state.Viewport.ox); - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) - *oow*gc->state.Viewport.hheight + gc->state.Viewport.oy); - (float *)pointers += stride; - - TRI_VP_SETFS(vPtr, oow); - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - pktype = SSTCP_PKT3_DDDDDD; - } - } - -#undef FN_NAME -} /* _grDrawVertexList */ - -/*------------------------------------------------------------------- - Function: _grAADrawVertexList - Date: 14-Oct-97 - Implementor(s): atai - Description: - Sends an aa triangle strip/fan to CVG. - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawVertexList" - - GR_DCL_GC; - FxU32 vNum = 0; - FxU32 sCount = count; - float - **lPtrs = (float **) pointers; - float *v[3]; - FxBool flip = FXFALSE; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - if (sCount <= 2) return; - - _grDrawVertexList(type, mode, count, pointers); - - fbzModeOld = gc->state.fbi_config.fbzMode; - gc->state.fbi_config.fbzMode &= ~(SST_ZAWRMASK); - /* gc->state.invalid |= fbzModeBIT; */ - GR_FLUSH_STATE(); - if (stride == 0) - stride = gc->state.vData.vStride; - - sCount-=2; - if (type == kSetupFan) { - v[0] = (mode == 0) ? pointers : *(float **)pointers; - while (sCount--) { - (float *)pointers += stride; - if (mode) { - v[1] = *(float **)pointers; - v[2] = *((float **)pointers+1); - } else { - v[1] = pointers; - v[2] = (float *)pointers+stride; - } - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(1, type, 3, v); - else - _grAAVpDrawTriangles(1, type, 3, v); - } - } - else if (type == kSetupStrip){ - while (sCount--) { - if (flip) { - if (mode) { - v[0] = *((float **)pointers+1); - v[1] = *(float **)pointers; - v[2] = *((float **)pointers+2); - } else { - v[0] = (float *)pointers+stride; - v[1] = pointers; - v[2] = (float *)pointers+(stride<<1); - } - } - else { - if (mode) { - v[0] = *(float **)pointers; - v[1] = *((float **)pointers+1); - v[2] = *((float **)pointers+2); - } else { - v[0] = pointers; - v[1] = (float *)pointers+stride; - v[2] = (float *)pointers+(stride<<1); - } - } - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(1, type, 3, v); - else - _grAAVpDrawTriangles(1, type, 3, v); - (float *)pointers += stride; - flip = ~flip; - } - flip = ~flip; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAADrawVertexList */ - -#endif diff --git a/glide2x/cvg/glide/src/gtex.c b/glide2x/cvg/glide/src/gtex.c deleted file mode 100644 index 0e598ac..0000000 --- a/glide2x/cvg/glide/src/gtex.c +++ /dev/null @@ -1,1102 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 42 6/24/98 5:19p Peter -** cleanedup version merged w/ banshee -** -** 41 6/23/98 5:39p Peter -** gary's trilinear hell bug -** -** 40 6/06/98 12:06p Peter -** gmt's trilinear hell bug -** -** 39 5/18/98 12:14p Peter -** crybaby check in grTexCombine -** -** 38 5/07/98 4:12p Peter -** lbe texture thing -** -** 37 4/16/98 3:54p Peter -** 1x1 lod fix, sorry John -** -** 36 4/01/98 1:51p Peter -** fixed resetting unused tmu muckage -** -** 35 3/13/98 1:27p Peter -** lodDither vs tri-linear -** -** 34 2/20/98 5:31p Peter -** crybaby glide -** -** 33 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 32 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 31 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 30 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 29 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 28 1/07/98 10:22a Peter - * lod dithering env var - * - * 27 1/05/98 6:06p Atai - * glide extension stuff - * - * 26 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 25 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 24 12/11/97 4:15p Peter - * fixed assertions - * - * 23 12/05/97 4:26p Peter - * watcom warnings - * - * 22 11/20/97 6:57p Dow - * baseaddress for banshee - * - * 21 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 20 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 19 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 18 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 17 9/05/97 12:31p Peter - * more reg write grouping - * - * 16 7/08/97 2:48p Peter - * - * 15 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 14 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 13 5/21/97 6:05a Peter - * - * 12 3/04/97 9:08p Dow - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern FxU32 _gr_aspect_xlate_table[]; - -/* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must be called after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - * - * FixMe: This should eventually get merged in w/ the texture - * statemonster. When/If that ever happens. - */ -static void -_grTexCheckTriLinear(GrChipID_t tmu) -{ -#define FN_NAME "_grTexCheckTriLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", tmu); - -#if (GLIDE_NUM_TMU > 2) -#error "(GLIDE_NUM_TMU > 2): Write this code" -#endif - -/* NB: The factor mask needs to include the factor bits as - * well as the reverse bit so that we can differentiate - * between the lodfrac and the (1 - lodfrac) case. - */ -#define SST_TC_FACTOR_MASK (SST_TC_MSELECT | SST_TC_REVERSE_BLEND) - -#define SST_MIPMAP_LEVEL_MASK (SST_LOD_ODD | SST_LOD_TSPLIT) - - /* Is this tmu on? */ - if (!gc->hwDep.cvgDep.tmuLodDisable[tmu]) { - const struct tmu_config_t* tmu0 = gc->state.tmu_config; - const struct tmu_config_t* tmu1 = gc->state.tmu_config + 1; - const struct tmu_config_t* curTmu = gc->state.tmu_config + tmu; - const struct tmu_config_t* otherTmu = gc->state.tmu_config + !tmu; - - /* This is the 'tricky' state where we have to manage the states - * of teh tmu's together to get the correct effect. Within this - * state there are two sub-states: two-pass trilinear and single - * pass using both tmu's w/ split levels. - * - * Case 1 - TMU set for lod blending and has both even/odd levels - */ - if (((curTmu->textureMode & SST_TRILINEAR) == SST_TRILINEAR) && - (curTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH)) { - - /* Check the 'other' tmu to see if it is active, if not then we - * are doing two pass trilinear so check that we have the - * correct even/odd things set based on the factor where one - * pass will use GR_COMBINE_FACTOR_LOD_FRACTION and the other - * will use (1 - GR_COMBINE_FACTOR_LOD_FRACTION). - */ - if (gc->hwDep.cvgDep.tmuLodDisable[!tmu]) { - /* NB: In this case the rgb/alpha factors need to match so - * checking for only one of them is fine. - */ - const FxU32 levelMask = (((curTmu->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - - GDBG_INFO(gc->myLevel, FN_NAME": Two-pass trilinear fixup (0x%X) : tLOD : (0x%X : 0x%X)\n", - tmu, curTmu->tLOD, ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - GR_CHECK_SIZE(); - } else { - /* One pass trilinear - * - * Make sure that the tmu's have the levels split across the - * two tmu's. There are basically three cases based on what - * the user might have already set on the other tmu. - */ - if (((tmu0->textureMode & SST_TC_BLEND) == SST_TC_BLEND) && - ((tmu1->textureMode & SST_TC_REPLACE) == SST_TC_REPLACE)) { - FxU32 evenOdd[GLIDE_NUM_TMU]; - FxU32* curEvenOdd = evenOdd + tmu; - - { - FxU32 i; - - for(i = 0; i < GLIDE_NUM_TMU; i++) { - evenOdd[i] = gc->state.tmu_config[i].tLOD & SST_LOD_ODD; - } - } - - /* 1 - The other tmu already has the even levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_EVEN) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_ODD)) { - *curEvenOdd = SST_LOD_ODD; - goto __tmuRegUpdate; - } - - /* 2 - The other tmu already has the odd levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_ODD) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_EVEN)) { - *curEvenOdd = 0; - goto __tmuRegUpdate; - } - - /* 3 - The other tmu already has both the levels. If the - * downstream tmu's factor is lodFrac then the upstream tmu - * needs to be (1 - lodFrac) and vice-versa. - */ - if (otherTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH) { - evenOdd[0] = (((tmu0->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? 0 - : SST_LOD_ODD); - evenOdd[1] = ~evenOdd[0] & SST_LOD_ODD; - - goto __tmuRegUpdate; - } - - /* Do the register updates */ - if (0) { - __tmuRegUpdate: - GDBG_INFO(gc->myLevel, FN_NAME": Tri-linear fixup (0x%X : 0x%X) : (0x%X : 0x%X)\n", - tmu0->tLOD, tmu1->tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0]), - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 1), 2); - { - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0])); - GR_SET(eChipTMU1, SST_TMU(hw, 1), tLOD, - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - } - GR_CHECK_SIZE(); - } - } - } - } - } - - GR_END(); -#undef FN_NAME -} - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ -GR_ENTRY(grTexClampMode, void, - (GrChipID_t tmu, - GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode)) -{ -#define FN_NAME "grTexClampMode" - FxU32 texturemode; - FxU32 clampMode =((s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)); - - GR_BEGIN("grTexClampMode",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode); - GR_CHECK_TMU(FN_NAME, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCLAMPS | SST_TCLAMPT); - texturemode |= clampMode; - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texturemode); - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -#undef FN_NAME -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ -GR_ENTRY(grTexCombine, void, - (GrChipID_t tmu, - GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, - FxBool rgb_invert, FxBool alpha_invert)) -{ -#define FN_NAME "grTexCombine" - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - FxBool localColorP = FXFALSE; - FxBool localAlphaP = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grTexCombine",88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_W(FN_NAME, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function"); - GR_CHECK_W(FN_NAME, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function"); - GR_CHECK_W(FN_NAME, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor"); - GR_CHECK_W(FN_NAME, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor"); - - - GR_CHECK_COMPATABILITY(FN_NAME, - (rgb_factor != alpha_factor) && - (((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)) && - (((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)), - "Incompatible texture combine factors (rgb vs alpha) based on lod"); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - * the ccFunc requires texture mapping - */ - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= (rgb_factor & 0x7) << SST_TC_MSELECT_SHIFT; - if (!(rgb_factor & 0x8)) texturemode |= SST_TC_REVERSE_BLEND; - if (((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - texturemode |= (alpha_factor & 0x7) << SST_TCA_MSELECT_SHIFT; - if (!(alpha_factor & 0x8)) texturemode |= SST_TCA_REVERSE_BLEND; - if (((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - if (rgb_invert) texturemode |= SST_TC_INVERT_OUTPUT; - if (alpha_invert) texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (rgb_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - switch (alpha_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - /* Hack to enable TWO-PASS Trilinear */ - if (texturemode & SST_TRILINEAR) { - if ((texturemode & SST_TC_ZERO_OTHER) && - (texturemode & SST_TC_BLEND_LODFRAC) && - !(texturemode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* Update shadows */ - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - -#if 1 - /* If the state of a tmu changes from active then make sure that it - * is addressing some valid tiny texture so taht it does not spend - * time thrashing on a large texture access. - * - * NB: We don't update the shadow here so the other bits in the - * register shadow should be unchanged. - */ - { - const FxI32 upstreamTmu = tmu + 1; - - if (upstreamTmu < gc->num_tmu) { - if (localColorP && localAlphaP) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1)); - GR_CHECK_SIZE(); - - gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu] = FXTRUE; - - GDBG_INFO(gc->myLevel, FN_NAME": Disabling tmu(%ld) : (0x%X : 0x%X)\n", - upstreamTmu, rgb_function, alpha_function); - } else if (gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu]) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, gc->state.tmu_config[upstreamTmu].tLOD); - GR_CHECK_SIZE(); - - gc->hwDep.cvgDep.tmuLodDisable[upstreamTmu] = FXFALSE; - } - } - /* If this tmu is inactive then also do the reset for the register - * write, but not in the shadow so that the remaining bits are - * retained. - */ - if ((gc->state.tmuMask & tmuMask) == 0) { - tLod = SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1); - } - } -#endif - - /* update register */ - { - SstRegs* tmuHw = SST_TMU(hw, tmu); - - REG_GROUP_BEGIN((0x02 << tmu), textureMode, 2, 0x3); - { - REG_GROUP_SET(tmuHw, textureMode , texturemode); - REG_GROUP_SET(tmuHw, tLOD, tLod); - } - REG_GROUP_END(); - } - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, (GrChipID_t tmu, FxU32 detail)) -{ -#define FN_NAME "_grTexDetailControl" - GR_BEGIN(FN_NAME,88,4, 1); - GDBG_INFO_MORE(gc->myLevel, "(%d, 0x%X)\n", tmu, detail); - GR_CHECK_TMU(FN_NAME, tmu); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tDetail, detail); - gc->state.tmu_config[tmu].tDetail = detail; - - GR_END(); -#undef FN_NAME -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, - (GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter)) -{ -#define FN_NAME "grTexFilterMode" - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter); - GR_CHECK_TMU(FN_NAME, tmu); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TMINFILTER | SST_TMAGFILTER); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, - (GrChipID_t tmu, float fvalue)) -{ -#define FN_NAME "grTexLodBiasValue" - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%g)\n",tmu,fvalue); - GR_CHECK_TMU(FN_NAME, tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODBIAS); - tLod |= _grTexFloatLODToFixedLOD(fvalue) << SST_LODBIAS_SHIFT; - - GR_SET((0x02 << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, - (GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend)) -{ -#define FN_NAME "grTexMipMapMode" - FxU32 - tLod, - texMode; - - GR_BEGIN_NOFIFOCHECK("grTexMipMapMode",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend); - GR_CHECK_TMU(FN_NAME, tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER | SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch (mmMode) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - - default: - GrErrorCallback("grTexMipMapMode: invalid mode passed", FXFALSE); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /* Force LOD dithering if the user asked for it. - * - * NB: There is a performance hit for this, but it does - * look better. - */ - texMode |= _GlideRoot.environment.texLodDither; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if (lodBlend) { - /* If we're doing trilinear for real then nuke the lod dithering - * at the same time because it just looks bad. - */ - texMode = ((texMode & ~SST_TLODDITHER) | SST_TRILINEAR); - - if ((texMode & SST_TC_ZERO_OTHER) && - (texMode & SST_TC_BLEND_LODFRAC) && - !(texMode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 2, 0x03); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - } - REG_GROUP_END(); - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexNCCTable, void, - (GrChipID_t tmu, GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grTexSource, void, - (GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexSource" - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN_NOFIFOCHECK("grTexSource",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress >= gc->tmu_state[tmu].total_mem, - "invalid startAddress"); - - GR_CHECK_COMPATABILITY(FN_NAME, - (startAddress + grTexTextureMemRequired(evenOdd, info) >= - gc->tmu_state[tmu].total_mem), - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !info, "invalid info pointer"); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress(startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd) >> 3; -#if (GLIDE_PLATFORM & GLIDE_HW_H3) - baseAddress = ((baseAddress << 3) & ~0x0F); - baseAddress += 0x200000; -#endif - - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= (info->format << SST_TFORMAT_SHIFT) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | - SST_LODMAX | - SST_LOD_ASPECT | - SST_LOD_TSPLIT | - SST_LOD_ODD | - SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - ((gc->state.tmu_config[tmu].mmMode == GR_MIPMAP_DISABLE) - ? info->largeLod - : info->smallLod)); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* Write relevant registers out to hardware */ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - REG_GROUP_SET(hw, texBaseAddr , baseAddress); - } - REG_GROUP_END(); - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, - (GrChipID_t tmu, FxBool enable)) -{ -#define FN_NAME "grTexMultibase" - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",tmu,enable); - GR_CHECK_TMU(FN_NAME,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if (enable) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, - (GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexMultibaseAddress" - FxU32 baseAddress; - const FifoChipField tmuChip = (FifoChipField)(0x02UL << tmu); - GR_BEGIN("grTexMultibaseAddress",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x)\n",tmu,range,startAddress); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, range > GR_TEXBASE_32_TO_1, "invalid range"); - GR_CHECK_F(FN_NAME, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, info, "invalid info pointer"); - - - /* Write relevant registers out to hardware and shadows */ - hw = SST_TMU(hw,tmu); - switch (range) { - case GR_TEXBASE_256: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_256, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - break; - - case GR_TEXBASE_128: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_128, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr1, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_1 = baseAddress; - break; - - case GR_TEXBASE_64: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_64, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr2, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_2 = baseAddress; - break; - - case GR_TEXBASE_32_TO_1: - baseAddress = _grTexCalcBaseAddress(startAddress, - GR_LOD_32, - info->aspectRatio, - info->format, - evenOdd) >> 3; - GR_SET(tmuChip, hw, texBaseAddr38, baseAddress); - gc->state.tmu_config[tmu].texBaseAddr_3_8 = baseAddress; - break; - } - - GR_END(); -#undef FN_NAME -} /* grTexMultibaseAddress */ diff --git a/glide2x/cvg/glide/src/gtexdl.c b/glide2x/cvg/glide/src/gtexdl.c deleted file mode 100644 index b0ec6f6..0000000 --- a/glide2x/cvg/glide/src/gtexdl.c +++ /dev/null @@ -1,825 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:11 joseph -** Initial checkin into SourceForge. -** -** -** 61 5/18/98 12:11p Peter -** removed unnecesasry fencing -** -** 60 4/29/98 2:32p Peter -** fixed texture palette broadcast -** -** 59 3/30/98 2:46p Peter -** fixed texture download muckage -** -** 58 3/29/98 10:54p Jdt -** Unset GLIDE_POINTCAST_PALETTE -** -** 57 2/20/98 5:31p Peter -** crybaby glide -** -** 56 2/20/98 11:00a Peter -** removed glide3 from glid2 tree -** -** 55 2/02/98 2:14p Atai -** fixed palette broadcasts in _grTexDownloadNccTable and -** _grTexDownloadPalette - * - * 54 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 53 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 52 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 51 1/08/98 11:06a Dow - * Set palette downloads to broadcast. - * - * 50 12/11/97 4:15p Peter - * fixed assertions - * - * 49 12/09/97 12:20p Peter - * mac glide port - * - * 48 12/05/97 4:26p Peter - * watcom warnings - * - * 47 12/02/97 9:48a Dow - * Got rid of Texelfx rev 0 warning - * - * 46 11/21/97 1:03p Peter - * small texture download problem - * - * 45 11/20/97 6:57p Dow - * Texture Downloads for Banshee - * - * 44 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 43 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 42 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 41 11/12/97 11:16a Peter - * cleaned up assertions - * - * 40 11/05/97 1:50p Peter - * fixed partial palette downloads - * - * 39 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 38 10/08/97 11:33a Peter - * reg group for palette download - * - * 37 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 36 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 35 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 34 7/26/97 5:18p Peter - * fixed macro muckage - * - * 33 7/08/97 2:49p Peter - * - * 32 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 31 6/30/97 3:22p Peter - * cmd fifo sanity - * -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from gtex.c */ -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; - -/*--------------------------------------------------------------------------- -** _grTexDownloadNccTable -** -** Downloads an ncctable to the specified _physical_ TMU(s). This -** function is called internally by Glide and should not be executed -** by an application. -*/ -GR_DDFUNC(_grTexDownloadNccTable, - void, - (GrChipID_t tmu, FxU32 which, const GuNccTable *table, int start, int end)) -{ -#define FN_NAME "_grTexDownloadNccTable" - GR_BEGIN_NOFIFOCHECK(FN_NAME,89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d, 0x%x, %d,%d)\n",tmu,which,table,start,end); - GR_ASSERT(start==0); - GR_ASSERT(end==11); - - /* check for null pointer */ - if (table == NULL) return; - - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - if (gc->tmu_state[tmu].ncc_table[which] != table) { - SstRegs* texHW; - int i; -#ifdef GLIDE_POINTCAST_PALETTE - texHW = SST_TMU(hw,tmu); -#else - texHW = SST_CHIP(hw,0xe); -#endif - - if (which == 0) { -#ifdef GLIDE_POINTCAST_PALETTE - REG_GROUP_BEGIN((0x02UL << tmu), nccTable0, 12, 0x0FFF); -#else - REG_GROUP_BEGIN(0x0EUL, nccTable0, 12, 0x0FFF); -#endif - for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable0[i], table->packed_data[i]); - REG_GROUP_END(); - } else { -#ifdef GLIDE_POINTCAST_PALETTE - REG_GROUP_BEGIN((0x02UL << tmu), nccTable1, 12, 0x0FFF); -#else - REG_GROUP_BEGIN(0x0EUL, nccTable1, 12, 0x0FFF); -#endif - for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable1[i], table->packed_data[i]); - REG_GROUP_END(); - } - - gc->tmu_state[tmu].ncc_table[which] = table; - } - - GR_END(); -#undef FN_NAME -} /* _grTexDownloadNccTable */ - -/*------------------------------------------------------------------- - Function: _grTexDownloadPalette - Date: 6/9 - Implementor(s): jdt - Library: Glide - Description: - Private function to download a palette to the specified tmu - Arguments: - tmu - which tmu to download the palette to - pal - the pallete data - start - beginning index to download - end - ending index to download - Return: - none - -------------------------------------------------------------------*/ -GR_DDFUNC(_grTexDownloadPalette, - void, - (GrChipID_t tmu, GuTexPalette *pal, int start, int end)) -{ -#define FN_NAME "_grTexDownloadPalette" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d)\n",tmu,pal,start,end); - - GR_CHECK_F(FN_NAME, pal == NULL, "pal invalid"); - GR_CHECK_F(FN_NAME, start < 0, "invalid start index"); - GR_CHECK_F(FN_NAME, end > 255, "invalid end index"); - - /* NOTE: - ** - ** This code broadcasts the palette because in the future, we will - ** only support one global texture palette no matter how many TMUs - ** there are. This is fallout from the fact that future hardware - ** has a unified memory architecture. - ** - ** Source licensees (meaning arcade or LBE vendors that) require the - ** one palette/tmu mode should define GLIDE_POINTCAST_PALETTE on - ** the command line for this file. Understand, however, that this - ** will not work on future hardware. - */ - -#ifdef GLIDE_POINTCAST_PALETTE - /* - ** FURTHER NOTE: - ** There is a sublety (nice way of saying BUG) here. - ** If TMU0 is specified, then the palette will be broadcast to all - ** TMUS. So, if the user downloads TMU1's palette, then TMU0's - ** palette, TMU0's palette will be on *both* TMUs. This is a - ** pretty strong indicator that no one is using separate palettes - ** on different TMUs. - */ - hw = SST_TMU(hw,tmu); -#else - hw = SST_CHIP(hw,0xE); -#endif - - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += ((end - start + 1) << 2); - - /* We divide the writes into 3 chunks trying to group things into - * complete 8 word grouped packets to fit the nccTable palette - * format: stuff before the 8 word alignment, aligned writes, and - * stuff after the 8 word alignment to the end. The slop regions - * are one packet apiece. - */ - { -#ifdef GLIDE_POINTCAST_PALETTE - const FifoChipField chipId = (FifoChipField)(0x02UL << tmu); -#else - const FifoChipField chipId = (FifoChipField)0x0EUL; -#endif - const int endSlop = (end & ~0x07); - const int startSlop = MIN(((start + 8) & ~0x07) - 1, end); - int i = start; - - /* Is the start of the palette range unaligned or is the end of - * the range less than a completely aligned range? - */ - if (((start & 0x07) != 0) || (end < ((start + 8) & ~0x07))) { - const FxI32 slopCount = startSlop - start + 1; - GR_ASSERT((slopCount > 0) && (slopCount <= 8)); - - REG_GROUP_BEGIN(chipId, nccTable0[4 + (start & 0x07)], - slopCount, (0xFF >> (8 - slopCount))); - while(i < start + slopCount) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - - /* Do all of the aligned palette ranges. */ - while(i < endSlop) { - const int endIndex = i + 8; - - REG_GROUP_BEGIN(chipId, nccTable0[4], 8, 0xFF); - while(i < endIndex) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - - /* Do we have any more slop at the end of the ragne? */ - if (i <= end) { - const FxU32 slopCount = end - endSlop + 1; - - REG_GROUP_BEGIN(chipId, nccTable0[4], - slopCount, (0xFF >> (8 - slopCount))); - while(i <= end) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - } - - GR_END(); -#undef FN_NAME -} /* _grTexDownloadPalette */ - -/*------------------------------------------------------------------- - Function: grTexDownloadTable - Date: 6/3 - Implementor(s): jdt, GaryMcT - Library: glide - Description: - download look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grTexDownloadTable, - void, - (GrChipID_t tmu, GrTexTable_t type, void *data)) -{ -#define FN_NAME "grTexDownloadTable" - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x)\n",tmu,type,data); - GR_CHECK_TMU(FN_NAME,tmu); - GR_CHECK_F(FN_NAME, type > GR_TEXTABLE_PALETTE, "invalid table specified"); - GR_CHECK_F(FN_NAME, !data, "invalid data pointer"); - - if (type == GR_TEXTABLE_PALETTE) /* Need Palette Download Code */ - _grTexDownloadPalette(tmu, (GuTexPalette *)data, 0, 255); - else { /* Type is an ncc table */ - _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); - /* _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); */ - } - GR_END(); -#undef FN_NAME -} /* grTexDownloadTable */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMapLevelPartial - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a mipmap level to the specified tmu at the given - texture start address - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - this should be some value between grTexMinAddress() - and grTexMaxAddress() - thisLod - lod constant that describes the mipmap level - to be downloaded - largeLod - largest level of detail in complete mipmap to - be downloaded at startAddress of which level to - be downloaded is a part - aspectRatio - aspect ratio of this mipmap - format - format of mipmap image data - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - data - pointer to mipmap data - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexDownloadMipMapLevelPartial, - void, - (GrChipID_t tmu, FxU32 startAddress, - GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, void *data, int t, int max_t)) -{ - const FifoChipField chipId = (FifoChipField)(0x02UL << tmu); - FxI32 sh; - FxU32 max_s, width, tmu_baseaddress; -#define FN_NAME "grTexDownloadMipMapLevelPartial" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d,%d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data,t,max_t); - - /* Check fo silly things */ - { - const FxU32 size = _grTexTextureMemRequired(thisLod, thisLod, - aspectRatio, format, evenOdd); - - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress"); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress & 0x7, - "unaligned startAddress"); - GR_CHECK_F(FN_NAME, thisLod > GR_LOD_1, - "thisLod invalid"); - GR_CHECK_F(FN_NAME, largeLod > GR_LOD_1, - "largeLod invalid"); - GR_CHECK_F(FN_NAME, thisLod < largeLod, - "thisLod may not be larger than largeLod"); - GR_CHECK_F(FN_NAME, aspectRatio > GR_ASPECT_1x8 || - aspectRatio < GR_ASPECT_8x1, - "aspectRatio invalid"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, - "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !data, - "invalid data pointer"); - GR_CHECK_F(FN_NAME, max_t >= _grMipMapHostWH[aspectRatio][thisLod][1], - "invalid end row"); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) - GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary", - FXTRUE); - } - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - { - /*------------------------------------------------------------ - Compute Base Address Given Start Address Offset - ------------------------------------------------------------*/ - const FxU32 baseAddress = _grTexCalcBaseAddress(startAddress, - largeLod, - aspectRatio, - format, - evenOdd) >> 3; - - /*------------------------------------------------------------ - Compute pertinant contents of tLOD and texMode registers - ------------------------------------------------------------*/ - FxU32 tLod = SST_TLOD_MINMAX_INT(largeLod, GR_LOD_1); - FxU32 texMode = format << SST_TFORMAT_SHIFT; - - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[aspectRatio]; - - if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) { - sh = 2; - texMode |= SST_SEQ_8_DOWNLD; - } else { - sh = 3; - } - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - hw = SST_TMU(hw,tmu); - REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, texMode); - REG_GROUP_SET(hw, tLOD, tLod); - REG_GROUP_SET(hw, texBaseAddr, baseAddress); - } - REG_GROUP_END(); - } - - /*------------------------------------------------------------ - Determine max_s - ------------------------------------------------------------*/ - width = _grMipMapHostWH[aspectRatio][thisLod][0]; - max_s = width >> ((format < GR_TEXFMT_16BIT) - ? 2 /* 8-bit texture */ - : 1); /* 16-bit texture */ - if (max_s <= 0) max_s = 1; - - _GlideRoot.stats.texBytes += max_s * (max_t - t + 1) * 4; - - /*------------------------------------------------------------ - Compute Physical Write Pointer - ------------------------------------------------------------*/ - tmu_baseaddress = (FxU32)gc->tex_ptr; - tmu_baseaddress += (((FxU32)tmu) << 21) + (((FxU32)thisLod) << 17); - - /*------------------------------------------------------------ - Handle 8-bit Textures - ------------------------------------------------------------*/ - if (format < GR_TEXFMT_16BIT) { /* 8 bit textures */ - /* Hoisted initialization */ - FxU32 tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - const FxU8* src8 = (const FxU8*)data; - - switch(width) { - case 1: - for (; t <= max_t; t++) { - LINEAR_WRITE_BEGIN(1, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU8*)src8); - LINEAR_WRITE_END(); - - src8 += width; - tex_address += TEX_ROW_ADDR_INCR(1, thisLod); - } - break; - - case 2: - for (; t <= max_t; t++) { - LINEAR_WRITE_BEGIN(1, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU16*)src8); - LINEAR_WRITE_END(); - - src8 += width; - tex_address += TEX_ROW_ADDR_INCR(1, thisLod); - } - break; - - case 4: - for (; t <= max_t; t++) { - LINEAR_WRITE_BEGIN(1, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - LINEAR_WRITE_SET_8(tex_address, *(const FxU32*)src8); - LINEAR_WRITE_END(); - - src8 += width; - tex_address += TEX_ROW_ADDR_INCR(1, thisLod); - } - break; - - default: { /* >4xN texture */ - const FxU32 texAddrInc = ((sh == 3) - ? 16 /* Old TMUs */ - : 8);/* New TMUs */ - - for (; t <= max_t; t++) { - FxU32 s; - - tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - - LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - for (s = 0; s < max_s; s+=2) { - const FxU32 t0 = *(const FxU32*)(src8 ); - const FxU32 t1 = *(const FxU32*)(src8 + sizeof(FxU32)); - - LINEAR_WRITE_SET_8(tex_address , t0); - LINEAR_WRITE_SET_8(tex_address + sizeof(FxU32), t1); - - tex_address += texAddrInc; - src8 += (sizeof(FxU32) << 1); - } - LINEAR_WRITE_END(); - } - break; - } - } - } else { /* 16-bit Textures */ - /* Hoisted initialization */ - FxU32 tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - const FxU16* src16 = (const FxU16*)data; - - /* Cases 1, 2 don't need inner loops for s */ - switch(width) { - case 1: - for (; t <= max_t; t++) { - LINEAR_WRITE_BEGIN(1, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - LINEAR_WRITE_SET_16(tex_address, (const FxU32)*(const FxU16*)src16); - LINEAR_WRITE_END(); - - src16 += width; - tex_address += TEX_ROW_ADDR_INCR(1, thisLod); - } - break; - - case 2: - for (; t <= max_t; t++) { - LINEAR_WRITE_BEGIN(1, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - LINEAR_WRITE_SET_16(tex_address, *(const FxU32*)src16); - LINEAR_WRITE_END(); - - src16 += width; - tex_address += TEX_ROW_ADDR_INCR(1, thisLod); - } - break; - - default: - for (; t <= max_t; t++) { - FxU32 s; - - tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - - /* Loop unrolled to process 2 dwords per iteration */ - LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - for (s = 0; s < max_s; s += 2) { - const FxU32 t0 = *(const FxU32*)(src16 ); - const FxU32 t1 = *(const FxU32*)(src16 + 2); - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", - s, t, (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - LINEAR_WRITE_SET_16(tex_address , t0); - LINEAR_WRITE_SET_16(tex_address + 4, t1); - - tex_address += 8; - src16 += 4; - } - - LINEAR_WRITE_END(); - } - - break; - } - } - - /*------------------------------------------------------------ - Restore TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(hw, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(hw, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - } - REG_GROUP_END(); - -all_done: - _GlideRoot.stats.texDownloads++; -#undef FN_NAME -} /* grTexDownloadMipmapLevelPartial */ - -/* - Let me take this opportunity to register my formal opposition to - this function. Either we do this or we don't. Let's not hack like - this. - - CHD -*/ - -GR_ENTRY(ConvertAndDownloadRle, - void, - (GrChipID_t tmu, FxU32 startAddress, - GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, - FxU8 *bm_data, long bm_h, - FxU32 u0, FxU32 v0, - FxU32 width, FxU32 height, FxU32 dest_width, FxU32 dest_height, FxU16 *tlut)) -{ - const FifoChipField chipId = (FifoChipField)(0x02UL << tmu); - FxI32 sh; - FxU32 max_s,s,t,max_t,tex_address, tmu_baseaddress; - FxU32 tLod, texMode, baseAddress,size; - FxU32 offset,expected_size; - unsigned long i; - FxU16 *src; - extern FxU16 rle_line[256]; /* diTex.c */ - extern FxU16 *rle_line_end; /* ditex.c */ -#define FN_NAME "ConvertAndDownloadRLE" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - - /* make sure even number */ - width&=0xFFFFFFFE; - - max_s=width>>1; - max_t=height; - - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,bm_data,max_t); - - size = _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(FN_NAME, thisLod > GR_LOD_1, "thisLod invalid"); - GR_CHECK_F(FN_NAME, largeLod > GR_LOD_1, "largeLod invalid"); - GR_CHECK_F(FN_NAME, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(FN_NAME, aspectRatio > GR_ASPECT_1x8 || - aspectRatio < GR_ASPECT_8x1, - "aspectRatio invalid"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !bm_data, "invalid data pointer"); - GR_CHECK_F(FN_NAME, (dest_height-1) >= (FxU32)_grMipMapHostWH[aspectRatio][thisLod][1], - "invalid end row"); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) - GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary", - FXTRUE); - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - /*------------------------------------------------------------ - Compute Base Address Given Start Address Offset - ------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress(startAddress, - largeLod, - aspectRatio, - format, - evenOdd); - baseAddress >>= 3; -#if H3 - baseAddress = ((baseAddress << 3) & ~0x0F); -#endif - - /*------------------------------------------------------------ - Compute Physical Write Pointer - ------------------------------------------------------------*/ - tmu_baseaddress = (FxU32)gc->tex_ptr; - tmu_baseaddress += (((FxU32)tmu)<<21) + (((FxU32)thisLod)<<17); - - /*------------------------------------------------------------ - Compute pertinant contents of tLOD and texMode registers - ------------------------------------------------------------*/ - tLod = SST_TLOD_MINMAX_INT(largeLod, GR_LOD_1); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[aspectRatio]; - texMode = format << SST_TFORMAT_SHIFT; - if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) { - sh = 2; - texMode |= SST_SEQ_8_DOWNLD; - } else { - sh = 3; - } - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - hw = SST_TMU(hw,tmu); - REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, texMode); - REG_GROUP_SET(hw, tLOD, tLod); - REG_GROUP_SET(hw, texBaseAddr, baseAddress); - } - REG_GROUP_END(); - - _GlideRoot.stats.texBytes += dest_width * (dest_height) * 2; - - /* here I can do my writes and conversion and I will be so happy */ - offset=4+bm_h; - for (i=0; i>1; - expected_size=max_s*5; - - rle_line_end=rle_line+width+u0; - for(t=0;ttex_ptr, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(tex_address + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - - offset+=bm_data[4+i++]; - } - - if (dest_height>height) { - tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t, thisLod); - src=rle_line+u0; - - LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex, - (FxU32)tex_address - (FxU32)gc->tex_ptr, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(tex_address + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - } - - /*------------------------------------------------------------ - Restore TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(hw, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(hw, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - } - REG_GROUP_END(); - -all_done: - _GlideRoot.stats.texDownloads++; -#undef FN_NAME -} - - - - - - diff --git a/glide2x/cvg/glide/src/gu.c b/glide2x/cvg/glide/src/gu.c deleted file mode 100644 index dddb669..0000000 --- a/glide2x/cvg/glide/src/gu.c +++ /dev/null @@ -1,449 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 14 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 13 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 12 5/21/97 6:05a Peter - * - * 11 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 10 3/05/97 9:36p Jdt - * Added guEncodeRLE16 - * - * 9 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#endif - -#include "fxinline.h" - -/*--------------------------------------------------------------------------- -** guAlphaSource -*/ -GR_DIENTRY(guAlphaSource, void, ( GrAlphaSource_t mode )) -{ - GDBG_INFO(99,"guAlphaSource(%d)\n",mode); - switch ( mode ) { - case GR_ALPHASOURCE_CC_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - - default: - GR_CHECK_F("grAlphaSource", 1, "unknown alpha source mode"); - break; - } - - /* xxx not needed at the moment, should update grFogxxx - _grVerifyNeedForITAlpha(); - */ -} /* guAlphaSource */ - -/*--------------------------------------------------------------------------- -** guColorCombineFunction -*/ -GR_DIENTRY(guColorCombineFunction, void, ( GrColorCombineFnc_t fnc )) -{ - GDBG_INFO(99,"guColorCombineFunction(%d)\n",fnc); - - /* gross hack to get ITRGB_DELTA0 modes working */ - _grColorCombineDelta0Mode( FXFALSE ); - - switch ( fnc ) - { - case GR_COLORCOMBINE_ZERO: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DECAL_TEXTURE: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA: - grColorCombine( GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_TEXTURE_ALPHA, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_ITERATED, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_A: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_B: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ONE: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXTRUE ); - break; - - default: - GR_CHECK_F("grColorCombineFunction", 1, "unsupported color combine function"); - break; - } -} /* guColorCombineFunction */ - -/*--------------------------------------------------------------------------- -** guEndianSwapWords -*/ -GR_DIENTRY(guEndianSwapWords, FxU32, ( FxU32 value )) -{ - return ( ( value & 0xFFFF0000 ) >> 16 ) | ( value << 16 ); -} - -/*--------------------------------------------------------------------------- -** guEndianSwapBytes -*/ -GR_DIENTRY(guEndianSwapBytes, FxU16, ( FxU16 value )) -{ - return ( ( value & 0xFF00 ) >> 8 ) | ( value << 8 ); -} - -/*--------------------------------------------------------------------------- -** guFogTableIndexToW -*/ -GR_DIENTRY(guFogTableIndexToW, float, ( int i )) -{ - return (float)pow(2.0,3.0+(double)(i>>2)) / (8-(i&3)); -} - -/*--------------------------------------------------------------------------- -** guFogGenerateExp -*/ -GR_DIENTRY(guFogGenerateExp, void, - ( GrFog_t fogtable[], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO(99,"guFogGenerateExp(0x%x,%g)\n",fogtable,density); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -dp ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -dp ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp */ - -/*--------------------------------------------------------------------------- -** guFogGenerateExp2 -*/ -GR_DIENTRY(guFogGenerateExp2, void, - ( GrFog_t fogtable[], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO(99,"guFogGenerateExp2(0x%x,%g)\n",fogtable,density); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -( dp * dp ) ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -( dp * dp ) ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp2 */ - -/*--------------------------------------------------------------------------- -** guFogGenerateLinear -*/ -GR_DIENTRY(guFogGenerateLinear, void, - ( GrFog_t fogtable[kInternalFogTableEntryCount], - float nearZ, float farZ )) -{ - int i; - float world_w; - float f; - - GDBG_INFO(99,"guFogGenerateLinear(0x%x,%g,%g)\n",fogtable,nearZ,farZ); - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - world_w = guFogTableIndexToW( i ); - if ( world_w > 65535.0F ) - world_w = 65535.0F; - - f = ( world_w - nearZ ) / ( farZ - nearZ ); - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateLinear */ - -/* -** setlevel -*/ -static void -setlevel( FxU16 *data, FxU16 color, int width, int height ) -{ - int s, t; - - for ( t = 0; t < height; t++ ) - { - for ( s = 0; s < width; s++ ) - { - *data = color; - data++; - } - } -} /* setlevel */ - -/*--------------------------------------------------------------------------- -** guTexCreateColorMipMap -*/ -GR_DIENTRY(guTexCreateColorMipMap, FxU16 *, ( void )) -{ - FxU32 memrequired; - FxU16 *data; - FxU16 *start; - - GDBG_INFO(99,"guTexCreateColorMipMap()\n"); - memrequired = 2 * ( 256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 ); - start = data = malloc( memrequired ); - if ( !data ) - return 0; - - setlevel( data, 0xF800, 256, 256 ); - setlevel( data += 256*256, 0x07e0, 128, 128 ); - setlevel( data += 128*128, 0x001F, 64, 64 ); - setlevel( data += 64*64, 0xFFFF, 32, 32); - setlevel( data += 32*32, 0x0000, 16, 16 ); - setlevel( data += 16*16, 0xF800, 8, 8); - setlevel( data += 8*8, 0x07e0, 4, 4 ); - setlevel( data += 4*4, 0x001f, 2, 2 ); - setlevel( data += 2*2, 0xFFFF, 1, 1 ); - - return start; -} /* guTexCreateColoMipMap */ - -/* GMT: this code used to be in the code above but I removed it for - readability, the first section was case(1) the second section - was a replacement for the simple 32-bit copy loop -*/ -#if 0 - - /* GMT: from what I can tell its not bad to perform unaligned DWORD - loads on a P5, so we use the case 2) all the time - in fact, its twice as fast as doing aligned short copies - */ -if ((dstX ^ (((FxU32)src)>>1)) & 1) { - /* case 1) a simple 16-bit copy loop */ - for (x=0; x < w; x++) { - GR_SET16(lfbPtr[x], ((FxU16 *)src)[x]); - } -} -#endif - -#if 0 -/* GMT: I tried to unroll the loop but for some reason the - code scheduling was such that it was slower - I think it had to do with the way the 2 mov instructions paired - Perhaps they were unaligned in the cache? - */ -FxU32 a,b; -FxU32 *s = (FxU32 *)src; -FxU32 *d = lfbPtr; - -while (d < &lfbPtr[w-1]) { - a = s[0]; - b = s[1]; - GR_SET(d[0], a); - GR_SET(d[1], b); - s += 2; - d += 2; -} -if (w & 1) { - GR_SET(d[0], s[0]); -} -#endif - -/*------------------------------------------------------------------- - Function: guEncodeRle - Date: 3/5/96 - Implementor(s): jdt - Library: Glide Utilities - Description: - Encode an RGB565 image into RLE16 format - Arguments: - dst - destination rle image data ( NULL for bytecount only ) - src - source rgb565 image data - width - width of source data - height - height of source data - Return: - number of bytes in encoded rle image - -------------------------------------------------------------------*/ -GR_ENTRY( guEncodeRLE16, int, ( void *dst, void *src, FxU32 width, FxU32 height )) -{ - int byteCount = 0; - int sourceImageSizeInWords; - FxU16 *srcPixels; - FxU32 *dstPixels; - - sourceImageSizeInWords = width * height; - - srcPixels = src; - - if ( dst ) { - dstPixels = dst; - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - *dstPixels = ((((FxU32)length)<<16) | ((FxU32)color)); - dstPixels++; - - byteCount+=4; - - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } else { - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - byteCount+=4; - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } - return byteCount; -} diff --git a/glide2x/cvg/glide/src/guclip.c b/glide2x/cvg/glide/src/guclip.c deleted file mode 100644 index 8b5d156..0000000 --- a/glide2x/cvg/glide/src/guclip.c +++ /dev/null @@ -1,444 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 12 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 11 12/09/97 12:20p Peter - * mac glide port - * - * 10 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 9 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 8 7/31/97 11:14a Peter - * merge w/ sst1 glide tree, hopefully - * - * 5 6/27/97 4:16p Atai - * fixed guDrawTriangleWithClip bug (#484) by removing +1.0F and -1.0F in - * intersectTop(), intersectBottom(), intersectLeft(), and - * intersectRight() routine - * - * 4 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Moved per GMT cleanup */ -#define GU_PRIM_MAX_VERTICES 100 - -static void -calcParams(const GrVertex *a, const GrVertex *b, GrVertex *isect, float d) -{ - GR_DCL_GC; - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { - isect->r = a->r + d * ( b->r - a->r ); - isect->g = a->g + d * ( b->g - a->g ); - isect->b = a->b + d * ( b->b - a->b ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { - isect->a = a->a + d * ( b->a - a->a ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { - isect->ooz = a->ooz + d * ( b->ooz - a->ooz ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { - isect->oow = a->oow + d * ( b->oow - a->oow); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU0) { - isect->tmuvtx[0].oow = - a->tmuvtx[0].oow + d * ( b->tmuvtx[0].oow - a->tmuvtx[0].oow ); - isect->tmuvtx[0].sow = - a->tmuvtx[0].sow + d * ( b->tmuvtx[0].sow - a->tmuvtx[0].sow ); - isect->tmuvtx[0].tow = - a->tmuvtx[0].tow + d * ( b->tmuvtx[0].tow - a->tmuvtx[0].tow ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU1) { - isect->tmuvtx[1].oow = - a->tmuvtx[1].oow + d * ( b->tmuvtx[1].oow - a->tmuvtx[1].oow ); - isect->tmuvtx[1].sow = - a->tmuvtx[1].sow + d * ( b->tmuvtx[1].sow - a->tmuvtx[1].sow ); - isect->tmuvtx[1].tow = - a->tmuvtx[1].tow + d * ( b->tmuvtx[1].tow - a->tmuvtx[1].tow ); - } - -#if (GLIDE_NUM_TMU > 2) - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU2) { - isect->tmuvtx[2].oow = - a->tmuvtx[2].oow + d * ( b->tmuvtx[2].oow - a->tmuvtx[2].oow ); - isect->tmuvtx[2].sow = - a->tmuvtx[2].sow + d * ( b->tmuvtx[2].sow - a->tmuvtx[2].sow ); - isect->tmuvtx[2].tow = - a->tmuvtx[2].tow + d * ( b->tmuvtx[2].tow - a->tmuvtx[2].tow ); - } -#endif - -} /* calcParams */ - -static void -intersectTop( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymin - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymin; - - calcParams(a, b, intersect, d); - -} /* intersectTop */ - -static void -intersectBottom( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymax - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymax; - - calcParams(a, b, intersect, d); - -} /* intersectBottom */ - -static void -intersectRight( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmax - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmax; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectRight */ - -static void -intersectLeft( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmin - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmin; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectLeft */ - -static FxBool -aboveYMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y > gc->state.clipwindowf_ymin ) ? FXTRUE : FXFALSE); -} /* aboveYMin */ - - -static FxBool -belowYMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y < gc->state.clipwindowf_ymax ) ? FXTRUE : FXFALSE); -} /* belowYMax */ - -static FxBool -aboveXMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x > gc->state.clipwindowf_xmin ) ? FXTRUE : FXFALSE ); -} /* aboveXMin */ - -static FxBool -belowXMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x < gc->state.clipwindowf_xmax ) ? FXTRUE : FXFALSE ); -} /* belowXMax */ - -/* -** shClipPolygon -*/ -static void -shClipPolygon( - const GrVertex invertexarray[], - GrVertex outvertexarray[], - int inlength, int *outlength, - FxBool (*inside)(const GrVertex *p), - void (*intersect)( - const GrVertex *a, - const GrVertex *b, - GrVertex *intersect ) - ) -{ - GrVertex - s, p /*, intersection */; - int - j; - - *outlength = 0; - - s = invertexarray[inlength-1]; - for ( j = 0; j < inlength; j++ ) { - p = invertexarray[j]; - if ( inside( &p ) ) { - if ( inside( &s ) ) { - outvertexarray[*outlength] = p; - (*outlength)++; - }else { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - outvertexarray[*outlength] = p; - (*outlength)++; - } - } else { - if ( inside( &s ) ) { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - } - } - s = p; - } -} /* shClipPolygon */ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** guDrawTriangleWithClip -** -** NOTE: This routine snaps vertices by adding a large number then -** subtracting that same number again. In order for this to work -** you MUST set up the FPU to work in single precision mode. Code -** to perform this is listed in the Appendix to the Glide Programmer's -** Guide. -*/ -static const float vertex_snap_constant = ( float ) ( 1L << 19 ); - -GR_DIENTRY(guDrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - outlength; - - GDBG_INFO_MORE(99,"guDrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { -#ifdef GLIDE3 - grDrawTriangle( (void *)a, (void *)b, (void *)c ); -#else - grDrawTriangle( a, b, c ); -#endif - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || defined(__DJGPP__) || \ - defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawTriangleWithClip */ - -/*--------------------------------------------------------------------------- -** guAADrawTriangleWithClip -*/ -GR_DIENTRY(guAADrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - ilist[10], - outlength; - - GDBG_INFO_MORE(99,"guAADrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { - grAADrawTriangle( a, b, c, FXTRUE, FXTRUE, FXTRUE ); - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined(__WATCOMC__) || defined(__MSC__) || defined (__DJGPP__) || \ - defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - ilist[i] = i; - } - - ilist[outlength] = 0; -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grAADrawPolygon( outlength, ilist, output_array2 ); -} /* guAADrawTriangleWithClip */ - - -/*--------------------------------------------------------------------------- -** guDrawPolygonVertexListWithClip -*/ -GR_DIENTRY(guDrawPolygonVertexListWithClip, void, - ( int nverts, const GrVertex vlist[] )) -{ - GrVertex - output_array[GU_PRIM_MAX_VERTICES+8], - output_array2[GU_PRIM_MAX_VERTICES+8]; - int - i, - outlength; - - GDBG_INFO_MORE(99,"guDrawPolygonVertexListWithClip(%d,0x%x)\n",nverts,vlist); - /* - ** go ahead and clip and render - */ - shClipPolygon( vlist, output_array, nverts, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined(__WATCOMC__) || defined(__MSC__) || defined(__DJGPP__) || \ - defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawPolygonVertexListWithClip */ - -#endif /* !GLIDE3_ALPHA */ diff --git a/glide2x/cvg/glide/src/gump.c b/glide2x/cvg/glide/src/gump.c deleted file mode 100644 index 513d644..0000000 --- a/glide2x/cvg/glide/src/gump.c +++ /dev/null @@ -1,105 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 10 12/09/97 12:20p Peter - * mac glide port - * - * 9 11/12/97 5:12p Pgj - * stubs for evil guFb{Read|Write}Region() calls - * - * 8 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 7 5/21/97 6:05a Peter - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 5 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -/* CHD BUG this belongs in fxglide.h */ -void FX_CSTYLE -_gumpTexCombineFunction( int virtual_tmu ); - -GrMPState _gumpState; - -GR_DIENTRY(guMPInit, void, ( void )) -{ - int i; - - GDBG_INFO(98,"guMPInit()\n"); - for (i = 0; i < GLIDE_NUM_VIRTUAL_TMU; i += 1) - { - _gumpState.mmid[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - } - _gumpState.tc_fnc = GR_MPTEXTURECOMBINE_ADD; -} - -GR_DIENTRY(guMPTexCombineFunction, void, - ( GrMPTextureCombineFnc_t tc_fnc )) -{ - GDBG_INFO(98,"guMPTexCombineFunction(%d)\n",tc_fnc); - _gumpState.tc_fnc = tc_fnc; -} - -GR_DIENTRY(guMPTexSource, void, - ( GrChipID_t virtual_tmu, GrMipMapId_t mmid )) -{ - GR_DCL_GC; - FXUNUSED( gc ); - GDBG_INFO(98,"guMPTexSource(%d,%d)\n",virtual_tmu,mmid); - GR_CHECK_TMU("guMPTexSource",virtual_tmu); - _gumpState.mmid[virtual_tmu] = mmid; -} - -extern FX_ENTRY void FX_CALL -guFbReadRegion( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ); - -extern FX_ENTRY void FX_CALL -guFbWriteRegion( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes); - - -/*--------------------------------------------------------------------------- -** guFbReadRegion XXX obsolete -*/ -GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) ) -{ -} - -/*--------------------------------------------------------------------------- -** guFbWriteRegion XXX obsolete -*/ -GR_ENTRY(guFbWriteRegion, void, ( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes)) -{ -} diff --git a/glide2x/cvg/glide/src/gump.h b/glide2x/cvg/glide/src/gump.h deleted file mode 100644 index b8f6404..0000000 --- a/glide2x/cvg/glide/src/gump.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -*/ - -/* Multipass drawing */ - -#ifndef __GUMP_H__ -#define __GUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define GLIDE_NUM_VIRTUAL_TMU 2 /* Number of virtual TMUs */ - -typedef FxU32 GrMPTextureCombineFnc_t; -#define GR_MPTEXTURECOMBINE_ADD 0x0 /* */ -#define GR_MPTEXTURECOMBINE_MULTIPLY 0x1 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL0 0x2 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL1 0x3 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR0 0x4 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR1 0x5 /* */ -#define GR_MPTEXTURECOMBINE_SUBTRACT 0x6 /* */ - -typedef struct { - GrMipMapId_t mmid[GLIDE_NUM_VIRTUAL_TMU]; - GrMPTextureCombineFnc_t tc_fnc; -} GrMPState; - -FX_ENTRY void FX_CALL guMPInit( void ); -FX_ENTRY void FX_CALL guMPTexCombineFunction( GrMPTextureCombineFnc_t tc ); -FX_ENTRY void FX_CALL guMPTexSource( GrChipID_t virtual_tmu, GrMipMapId_t mmid ); -FX_ENTRY void FX_CALL guMPDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); - -#ifdef __cplusplus -} -#endif - -#endif /* __GUMP_H__ */ diff --git a/glide2x/cvg/glide/src/gutex.c b/glide2x/cvg/glide/src/gutex.c deleted file mode 100644 index 2ad1eef..0000000 --- a/glide2x/cvg/glide/src/gutex.c +++ /dev/null @@ -1,211 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 22 2/20/98 5:31p Peter -** crybaby glide -** -** 21 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 20 1/07/98 10:22a Peter - * lod dithering env var - * - * 19 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 18 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 17 12/02/97 9:49a Dow - * rid the world of the "Setting the same state twice" message - * - * 16 11/20/97 6:59p Dow - * Fixed baseAddress for Banshee (the Devil's Own Test still uses guTex - * Stuff). - * - * 15 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 14 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 13 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 12 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 11 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 10 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:05a Peter - * - * 7 3/04/97 9:08p Dow - * - * 6 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 5 11/18/96 9:14a Sellers - * added checking for crossing of 2 MByte texture boundry -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from gtex.c and gtexdl.c */ -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; - -/*--------------------------------------------------------------------------- -** guTexSource -*/ - -GR_ENTRY(guTexSource, void, (GrMipMapId_t mmid)) -{ -#define FN_NAME "guTexSource" - FxU32 texMode, tLod; - FxU32 oldtexMode; - FxU32 baseAddress; - int tmu; - const GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexSource",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mmid); - - /* Make sure that mmid is not NULL */ - if (mmid == GR_NULL_MIPMAP_HANDLE) return; - - /* get a pointer to the relevant GrMipMapInfo struct */ - mminfo = &gc->mm_table.data[mmid]; - tmu = mminfo->tmu; - - GR_CHECK_TMU(FN_NAME, tmu); - - gc->state.current_mm[tmu] = mmid; - - /* Set up new glide state for this mmid */ - gc->state.tmu_config[tmu].mmMode = mminfo->mipmap_mode; - gc->state.tmu_config[tmu].smallLod = mminfo->lod_min; - gc->state.tmu_config[tmu].largeLod = mminfo->lod_max; - gc->state.tmu_config[tmu].evenOdd = mminfo->odd_even_mask; - gc->state.tmu_config[tmu].nccTable = 0; - - /* Set up base address, texMode, and tLod registers */ -#if (GLIDE_PLATFORM & GLIDE_HW_H3) - baseAddress = mminfo->tmu_base_address + 0x200000; -#else - baseAddress = mminfo->tmu_base_address >> 3; -#endif - texMode = mminfo->tTextureMode; - tLod = mminfo->tLOD; - - oldtexMode = gc->state.tmu_config[tmu].textureMode; - oldtexMode &= ~(SST_TFORMAT | SST_TCLAMPT | - SST_TCLAMPS | SST_TNCCSELECT | - SST_TLODDITHER | SST_TCLAMPW | - SST_TMAGFILTER | SST_TMINFILTER | - SST_TRILINEAR); - texMode |= oldtexMode; - if (!gc->state.allowLODdither) texMode &= ~SST_TLODDITHER; - - /* Download the NCC table, if needed. */ - if ((mminfo->format == GR_TEXFMT_YIQ_422) || - (mminfo->format == GR_TEXFMT_AYIQ_8422)) { - int table; /* ncc table we'll use */ - - /* See if it's already down there */ - if (gc->tmu_state[tmu].ncc_mmids[0] == mmid) { - /* Table 0 has what we need, so make it current */ - table = 0; - } else if (gc->tmu_state[tmu].ncc_mmids[1] == mmid) { - /* Table 1 has what we need, so make it current */ - table = 1; - } else { - /* - ** it's not down there, so we need to pick the table and - ** download it - */ - /* Which table should we use? */ - table = gc->tmu_state[tmu].next_ncc_table; - - /* Download NCC table */ - _grTexDownloadNccTable(tmu, table, &mminfo->ncc_table, 0, 11); - - /* Set the mmid so we known it's down there */ - gc->tmu_state[tmu].ncc_mmids[table] = mmid; - - /* Set the state to know which table was the LRA */ - gc->tmu_state[tmu].next_ncc_table = (table == 0 ? 1 : 0); - } /* we had to download it */ - - /* - ** Setting the TNCCSelect bit to 0 selects table 0, setting it to 1 - ** selects table 1 - */ - if (table == 0) - texMode &= ~(SST_TNCCSELECT); - else - texMode |= SST_TNCCSELECT; - } /* if it's an NCC texture */ - - /* Force LOD dithering if the user asked for it. - * - * NB: There is a performance hit for this, but it does - * look better. - */ - texMode |= _GlideRoot.environment.texLodDither; - - /* Write relevant registers out to hardware */ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, texMode); - REG_GROUP_SET(hw, tLOD, tLod); - REG_GROUP_SET(hw, texBaseAddr, baseAddress); - } - REG_GROUP_END(); - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* guTexSource */ - - diff --git a/glide2x/cvg/glide/src/gxdraw.c b/glide2x/cvg/glide/src/gxdraw.c deleted file mode 100644 index b208cda..0000000 --- a/glide2x/cvg/glide/src/gxdraw.c +++ /dev/null @@ -1,583 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 61 3/17/98 3:00p Peter -** removed vertex sorting - * - * 60 12/01/97 6:13p Peter - * non-packet3 tsu triangles ooz vs z - * - * 59 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 58 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 57 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 56 11/12/97 9:54p Peter - * fixed all the muckage from new config - * - * 55 11/03/97 4:38p Peter - * yapc fix - * - * 54 11/01/97 10:01a Peter - * tri dispatch stuff - * - * 53 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 52 10/27/97 5:59p Peter - * removed some debugging code - * - * 51 10/21/97 3:22p Peter - * hand pack rgb - * - * 50 10/19/97 12:51p Peter - * no tsu happiness - * - * 49 10/19/97 10:59a Peter - * fixed p1 tsu writes - * - * 48 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 47 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 46 10/16/97 5:33p Peter - * argb != rgba - * - * 45 10/16/97 3:40p Peter - * packed rgb - * - * 44 10/16/97 10:31a Peter - * fixed hoopti tsu-subtractor unsorted - * - * 43 10/15/97 5:53p Peter - * hoopti tri compare code - * - * 42 10/10/97 4:33p Peter - * non-packet3 tsu triangles - * - * 41 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 40 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 39 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 38 9/16/97 2:50p Peter - * fixed watcom unhappiness w/ static initializers - * - * 37 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 36 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 35 9/03/97 2:11p Peter - * start gdbg_info cleanup, fixed zero area no-tsu triangle muckage - * - * 34 9/01/97 3:19p Peter - * no-tsu w from vertex not tmuvtx - * - * 33 8/31/97 4:06p Peter - * no tsu fix - * - * 32 8/31/97 12:04p Peter - * hacked no-tsu code - * - * 31 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 30 6/30/97 3:22p Peter - * cmd fifo sanity - * - * 29 6/24/97 4:02p Peter - * proper cmd fifo placement - * - * 28 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree - ** - */ - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GDBG_INFO_ON -/* Some debugging information */ -static char *indexNames[] = { - "GR_VERTEX_X_OFFSET", /* 0 */ - "GR_VERTEX_Y_OFFSET", /* 1 */ - "GR_VERTEX_Z_OFFSET", /* 2 */ - "GR_VERTEX_R_OFFSET", /* 3 */ - "GR_VERTEX_G_OFFSET", /* 4 */ - "GR_VERTEX_B_OFFSET", /* 5 */ - "GR_VERTEX_OOZ_OFFSET", /* 6 */ - "GR_VERTEX_A_OFFSET", /* 7 */ - "GR_VERTEX_OOW_OFFSET", /* 8 */ - "GR_VERTEX_SOW_TMU0_OFFSET", /* 9 */ - "GR_VERTEX_TOW_TMU0_OFFSET", /* 10 */ - "GR_VERTEX_OOW_TMU0_OFFSET", /* 11 */ - "GR_VERTEX_SOW_TMU1_OFFSET", /* 12 */ - "GR_VERTEX_TOW_TMU1_OFFSET", /* 13 */ - "GR_VERTEX_OOW_TMU1_OFFSET" /* 14 */ -}; -#endif - -/* - ** _trisetup_nogradients - ** - ** This routine does all the setup needed for drawing a triangle. It - ** is intended to be an exact specification for the mechanisim used - ** to pass vertices to the assembly language triangle setup code, and - ** as such has no optimizations at all. Whenever a 'shortcut' - ** routine to draw triangles (such as for antialiasing, fast lines, - ** fast spans, polygons, etc) is needed, this code should be used as - ** the starting point. - ** - */ -GR_DDFUNC(_trisetup_nogradients, - FxI32, - (const GrVertex *va, const GrVertex *vb, const GrVertex *vc)) -{ -#define FN_NAME "_trisetup_nogradients" - GR_DCL_GC; - - _GlideRoot.stats.trisProcessed++; - -#if GLIDE_TRI_CULLING - { - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* Stash the area in the float pool for easy access */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - -#define FloatVal(__f) (((__f) < 786432.875) ? (__f) : ((__f) - 786432.875)) - { - const FxI32 j = *(FxI32*)&_GlideRoot.pool.ftemp1; - const FxU32 culltest = (gc->state.cull_mode << 31UL); - - /* Zero-area triangles are BAD!! */ - if ((j & 0x7FFFFFFF) == 0) { - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[0]), FloatVal(fa[1]), - FloatVal(fb[0]), FloatVal(fb[1]), - FloatVal(fc[0]), FloatVal(fc[1]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - return 0; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && (((FxI32)(j ^ culltest)) >= 0)) { - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[0]), FloatVal(fa[1]), - FloatVal(fb[0]), FloatVal(fb[1]), - FloatVal(fc[0]), FloatVal(fc[1]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - return -1; - } - } - } -#endif /* GLIDE_TRI_CULLING */ - - /* Stuff for using hw tsu */ -#if GLIDE_HW_TRI_SETUP - { - const float* vectorArray[3]; - - /* Load up the real vertices */ - vectorArray[0] = &va->x; - vectorArray[1] = &vb->x; - vectorArray[2] = &vc->x; - -#if GLIDE_PACKET3_TRI_SETUP - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, 1); - TRI_BEGIN(); - { - int vectorIndex; - - for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) { - const float* const vector = vectorArray[vectorIndex]; - - /* Triangle vertex coordinages (x, y) */ - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - /* Other triangle parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_R_OFFSET << 2)), R)); - dataList++; - doColorP = FXTRUE; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - doColorP = FXTRUE; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vector, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vector, *dataList)); - dataList++; - } - } - } - } - TRI_END; - GR_CHECK_SIZE(); -#else /* !GLIDE_PACKET3_TRI_SETUP */ - { - GR_DCL_HW; - int vectorIndex; - FxU32 sMode = (gc->cmdTransportInfo.paramMask >> SSTCP_PKT3_PMASK_SHIFT); - FxU32 paramMask = (sMode & 0xFF); - FxU32 paramCount; - - /* Convert packet 3 paramMask into sMode format */ - sMode = (paramMask | ((sMode & 0xF000) << 4)); - - { - const FxBool hasColor = ((sMode & 0x01) != 0); - const FxBool hasAlpha = ((sMode & 0x02) != 0); - const FxBool hasZ = ((sMode & 0x04) != 0); - const FxBool hasWb = ((sMode & 0x08) != 0); - const FxBool hasW0 = ((sMode & 0x10) != 0); - const FxBool hasST0 = ((sMode & 0x20) != 0); - const FxBool hasW1 = ((sMode & 0x40) != 0); - const FxBool hasST1 = ((sMode & 0x80) != 0); - - /* We always send vertex XY */ - paramCount = 2; - paramMask = 0x03; - - /* Build parameter data for reg group packet */ -#if GLIDE_PACKED_RGB - if (hasColor || hasAlpha) { - paramCount += 1; - paramMask |= 0x04; - } -#else /* !GLIDE_PACKED_RGB */ - if (hasColor) { - paramCount += 3; - paramMask |= 0x38; - } - if (hasAlpha) { - paramCount += 1; - paramMask |= 0x40; - } -#endif /* !GLIDE_PACKED_RGB */ - - if (hasZ) { - paramCount += 1; - paramMask |= 0x80; - } - if (hasWb) { - paramCount += 1; - paramMask |= 0x100; - } - if (hasW0) { - paramCount += 1; - paramMask |= 0x200; - } - if (hasST0) { - paramCount += 2; - paramMask |= 0xC00; - } - if (hasW1) { - paramCount += 1; - paramMask |= 0x1000; - } - if (hasST1) { - paramCount += 2; - paramMask |= 0x6000; - } - - /* Set mode once for teh whole triangle */ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, sSetupMode, sMode); - GR_CHECK_SIZE(); - - for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) { - const GrVertex* curVertex = (const GrVertex*)vectorArray[vectorIndex]; - - REG_GROUP_BEGIN(BROADCAST_ID, sVx, paramCount, paramMask); - { - REG_GROUP_SETF(hw, sVx, curVertex->x); - REG_GROUP_SETF(hw, sVy, curVertex->y); - -#if GLIDE_PACKED_RGB - if (hasColor || hasAlpha) { - FxU32 packedVal = 0x00; - - if (hasColor) packedVal = ((RGBA_COMP_CLAMP(curVertex->b) << 0UL) | - (RGBA_COMP_CLAMP(curVertex->g) << 8UL) | - (RGBA_COMP_CLAMP(curVertex->r) << 16UL)); - if (hasAlpha) packedVal |= (RGBA_COMP_CLAMP(curVertex->a) << 24UL); - - REG_GROUP_SET(hw, sARGB, packedVal); - } -#else /* !GLIDE_PACKED_RGB */ - if (hasColor) { - REG_GROUP_SETF(hw, sRed, curVertex->r); - REG_GROUP_SETF(hw, sGreen, curVertex->g); - REG_GROUP_SETF(hw, sBlue, curVertex->b); - } - if (hasAlpha) REG_GROUP_SETF(hw, sAlpha, curVertex->a); -#endif /* !GLIDE_PACKED_RGB */ - - if (hasZ) REG_GROUP_SETF(hw, sVz, curVertex->ooz); - if (hasWb) REG_GROUP_SETF(hw, sOowfbi, curVertex->oow); - - /* TMU0 */ - if (hasW0) REG_GROUP_SETF(hw, sOow0, curVertex->tmuvtx[0].oow); - if (hasST0) { - REG_GROUP_SETF(hw, sSow0, curVertex->tmuvtx[0].sow); - REG_GROUP_SETF(hw, sTow0, curVertex->tmuvtx[0].tow); - } - - /* TMU1 */ - if (hasW1) REG_GROUP_SETF(hw, sOow1, curVertex->tmuvtx[1].oow); - if (hasST1) { - REG_GROUP_SETF(hw, sSow1, curVertex->tmuvtx[1].sow); - REG_GROUP_SETF(hw, sTow1, curVertex->tmuvtx[1].tow); - } - } - REG_GROUP_END(); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - if (vectorIndex == 0) { - GR_SET(BROADCAST_ID, hw, sBeginTriCMD, 0); - } else { - GR_SET(BROADCAST_ID, hw, sDrawTriCMD, 0); - } - GR_CHECK_SIZE(); - } - } - } -#endif /* !GLIDE_PACKET3_TRI_SETUP */ - - goto __triDrawn; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP -#if !defined(GLIDE_TRI_CULLING) || !GLIDE_TRI_CULLING -#error "GLIDE_TRI_CULLING must be enabled to sort vertices" -#endif - - { - GR_DCL_HW; - - TRI_NO_TSU_BEGIN(FXTRUE); - { - const float ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - volatile FxU32* hwAddr = &hw->FvA.x; - - /* Divide the deltas by the area for gradient calculation. */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GDBG_INFO(85, FN_NAME": No-TSU Triangle area: (%g %g) : (%g %g %g %g)\n", - _GlideRoot.pool.ftemp1, ooa, - dxAB, dxBC, dyAB, dyBC); - - /* write out X & Y for vertex A */ - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_Y_OFFSET]); - - /* write out X & Y for vertex B */ - TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_Y_OFFSET]); - - /* write out X & Y for vertex C */ - TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_Y_OFFSET]); - - /* Send down the starting parameter values, these come from - * the sorted vertex A. - */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - TRI_NO_TSU_SETF(hwAddr++, fa[i++]); - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - TRI_NO_TSU_SETF(hwAddr++, fa[i]); - i++; - } - - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_OOW_OFFSET]); - } - - /* Send the x gradients */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - const float curGrad = (((fa[i] - fb[i]) * dyBC) - - ((fb[i] - fc[i]) * dyAB)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - const float curGrad = (((fa[i] - fb[i]) * dyBC) - - ((fb[i] - fc[i]) * dyAB)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - { - const float curGrad = (((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dyBC) - - ((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dyAB)); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - } - } - - /* Send the y gradients */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - const float curGrad = (((fb[i] - fc[i]) * dxAB) - - ((fa[i] - fb[i]) * dxBC)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - const float curGrad = (((fb[i] - fc[i]) * dxAB) - - ((fa[i] - fb[i]) * dxBC)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - { - const float curGrad = (((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dxAB) - - ((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dxBC)); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - TRI_NO_TSU_SETF(hwAddr, _GlideRoot.pool.ftemp1); - _GlideRoot.stats.trisDrawn++; - } - TRI_NO_TSU_END(); - } - - goto __triDrawn; -#endif /* !GLIDE_HW_TRI_SETUP */ - -__triDrawn: - /* If we made it this far then we drew the triangle */ - _GlideRoot.stats.trisDrawn++; - GR_CHECK_SIZE(); - - return 1; - -#undef FN_NAME -} /* _trisetup_nogradients */ diff --git a/glide2x/cvg/glide/src/makefile b/glide2x/cvg/glide/src/makefile deleted file mode 100644 index 7685543..0000000 --- a/glide2x/cvg/glide/src/makefile +++ /dev/null @@ -1,314 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -TAG_REGEXP = $(BUILD_ROOT)\$(FX_GLIDE_HW)\glide\src\glide.rx - -# Compile for specific hardware -!if "$(FX_GLIDE_HW)" == "CVG" -FX_GLIDE_REAL_HW= 1 - -!if "$(FX_GLIDE_CTRISETUP)" == "" -FX_GLIDE_CTRISETUP = 0 -!endif - -HWSPEC = fifo.c -LCDEFS = $(LCDEFS) -DCVG \ - -DGLIDE_CHIP_BROADCAST=1 -DGLIDE_DEFAULT_GAMMA=1.3f -LCDEFS = $(LCDEFS) \ - -DGLIDE_BLIT_CLEAR=1 \ -!else if "$(FX_GLIDE_HW)" == "H3" -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 -FX_GLIDE_CTRISETUP = 1 -HWSPEC = fifo.c -LCDEFS = $(LCDEFS) -DH3 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -!else -!error "FX_GLIDE_HW == unknown value (H3|CVG)" -!endif - - -!if "$(FX_GLIDE_VTUNE)"!="" -OTSOPTS = /Zi -LLDOPTS = /DEBUG -!endif - -!if "$(DEBUG)" == "1" -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -!endif - -!if "$(FX_COMPILER)" == "MICROSOFT" -DBGOPTS = $(DBGOPTS) /WX -!endif - -!if "$(FX_GLIDE_HW)" == "" -!error "FX_GLIDE_HW not defined" -!endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = -!if ("$(HAL_HW)" != "") -DSPOPTS = $(DSPOPTS) -DHAL_HW=1 -SUBLIBRARIES = $(SUBLIBRARIES) $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\sst1init.lib -!endif -!if !defined(DSPOPTS) -!error "Unknown HAL_* configuration" -!endif - -# GLIDE_HW_TRI_SETUP: Use the hw TSU for triangle rendering. -!if "$(FX_GLIDE_SW_SETUP)" == "1" -LCDEFS = $(LCDEFS) -DGLIDE_HW_TRI_SETUP=0 -DGLIDE_TRI_CULLING=1 -FX_GLIDE_CTRISETUP = 1 -!else # HW Setup -# Do culling test in sw for independent triangles -CULL_MODE = -DGLIDE_TRI_CULLING=0 -!if "$(FX_GLIDE_HW_CULL)" != "1" -CULL_MODE = -DGLIDE_TRI_CULLING=1 -!endif -DSPOPTS = $(DSPOPTS) $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -!if "$(FX_GLIDE_PACK_RGB)" == "1" -LCDEFS = $(LCDEFS) -DGLIDE_PACKED_RGB=1 -!endif - -!endif # HW Tri Setup - -!if "$(FX_GLIDE_NO_FIFO)" != "1" -FIFODEFS = -DUSE_PACKET_FIFO=1 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=1 \ - -!if "$(FX_GLIDE_DEBUG_FIFO)" == "1" -# GLIDE_USE_DEBUG_FIFO: Run w/ the small fifo to cause me/glide more stress -# FIFO_ASSERT_FULL: Check hw depth/fifo a lot (slow) -LCDEFS = $(LCDEFS) \ - -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 \ - -DASSERT_FAULT=0 #-DGLIDE_SANITY_SIZE=1 -!endif # FX_GLIDE_DEBUG_FIFO -!else # FX_GLIDE_NO_FIFO == 1 -FX_GLIDE_CTRISETUP = 1 -FIFODEFS = -DGLIDE_HW_TRI_SETUP=1 -!endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -!if "$(FX_GLIDE_CTRISETUP)" == "1" -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = gxdraw.c -!else -ASMTRISETUP = xdraw2.asm -DSPOPTS = $(DSPOPTS) -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 -!endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS = $(LCDEFS) -DGLIDE_LIB - -!if "$(FX_GLIDE_CRYBABY)" == "1" -LCDEFS = $(LCDEFS) -DGLIDE_CHECK_COMPATABILITY=1 -!endif - -# Turn Off/On compilation of shameless plug -!if "$(FX_GLIDE_NO_PLUG)" == "1" -!else -LCDEFS = $(LCDEFS) -DGLIDE_PLUG -!endif - -# Turn Off/On splash screen -!if "$(FX_GLIDE_NO_SPLASH)" == "1" -!else -LCDEFS = $(LCDEFS) -DGLIDE_SPLASH -!endif - -!if "$(FX_PCI_TARGET)" == "NT" -LCDEFS = $(LCDEFS) -DNT_BUILD -!endif - -#Glide 3 Stuff, for migration all -!if "$(FX_GLIDE3)" != "" -LCDEFS = $(LCDEFS) -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -!endif - -#Glide 3. remove migration stuff -!if "$(FX_GLIDE3_ALPHA)" != "" -LCDEFS = $(LCDEFS) -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -!endif - -!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_SIZE) -LCDEFS = $(LCDEFS) -DGLIDE_SANITY_SIZE -!endif -!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_ASSERT) -LCDEFS = $(LCDEFS) -DGLIDE_SANITY_ASSERT -!endif - -# Local Defs, Includes, and Options (C) -LCINCS = $(LCINCS) -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS = $(LADEFS) $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) /Fl /Sa - -AFILES = $(ASMTRISETUP) cpudtect.asm - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h - -INSTALL_DESTINATION = $(BUILD_ROOT)\$(FX_GLIDE_HW) - -CFILES = $(CFILES) gsplash.c g3df.c gu.c guclip.c gpci.c gump.c\ - diglide.c disst.c ditex.c gbanner.c gerror.c\ - gmovie.c digutex.c ddgump.c gaa.c gdraw.c\ - gglide.c glfb.c gsst.c gtex.c gtexdl.c\ - gutex.c $(HWSPEC) $(GLIDE3FILES) - -OFILES = $(CFILES:.c=.obj) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -CODFILES = $(CFILES:.c=.cod) - -# targets -LDIRT = fxgasm.obj fxgasm.exe fxgasm.h fxinline.h fxbldno.obj fxbldno.exe fxbldno.h - -!if "$(FX_GLIDE3)" == "1" -LIBRARIES = glide3x.lib -!else -LIBRARIES = glide2x.lib -!endif -RCFILE = glide.rc - -# Make a static link library for things like the diags. -!if "$(FX_DLL_BUILD)" == "1" -FX_DLL_LIBRARY = 1 -!else -LCDEFS = $(LCDEFS) -DFX_STATIC_BUILD -!endif - - -LCDEFS = $(LCDEFS) $(FIFODEFS) - -!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak - -codfiles: $(CODFILES) -xdraw2.obj : xdraw2.asm xdraw2.inc fxgasm.h fxinline.h - -ctags: $(CFILES) - ctags $(CFILES) - -gbanner.obj : banner.inc -gsplash.obj : splshdat.c - -!if "$(FX_TARGET)" == "WIN32" -!if "$(FX_DLL_BUILD)" != "" -glide2x.dll: - del fxbldno.h -!endif -!endif - -!if "$(FX_TARGET)" == "DOS" -!if "$(FX_DLL_BUILD)" != "" - -glimport.obj: glimport.asm - -IMPORT_DEPS = $(BUILD_ROOT)\swlibs\lib\dllload.lib \ - $(DLLLOADS) glimport.obj - -glide2x.lib: $(IMPORT_DEPS) - if exist glide2x.lib del glide2x.lib - wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllload.lib +glimport.obj -!if "$(FX_WATCOM_REG_CALL)" != "1" - wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllloads.obj -!endif - if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib attrib -r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib del $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - xcopy /d /k /r /i /s /q glide2x.lib $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib - attrib +r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - - -!endif -!endif - -!if "$(FX_COMPILER)" == "WATCOM" -#------------------------------------------------------------ -# special rul for makeing glideapi.obj under WATCOM -# - -glideapi.obj : glideapi.c - set $(CC_ENV_VAR)=-d2 $(GCFLAGS) $(LCFLAGS) $(VCFLAGS) - $(CC) glideapi.c -!endif - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm.exe: fxgasm.c $(HEADERS) gsstdef.h fxglide.h Makefile -!if "$(FX_COMPILER)" == "MICROSOFT" - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -I$(BUILD_ROOT)\swlibs\include $(LDFLAGS) -!else if "$(FX_COMPILER)" == "WATCOM" - set WCC386=$(CFLAGS) - wcl386 fxgasm.c -!endif -fxgasm.h: fxgasm.exe - fxgasm -hex > fxgasm.h -fxinline.h: fxgasm.exe - fxgasm -inline > fxinline.h - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno.exe: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) -!if "$(FX_COMPILER)" == "MICROSOFT" - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) -!else if "$(FX_COMPILER)" == "WATCOM" - set WCC386=$(CFLAGS) - wcl386 fxbldno.c -!endif - -fxbldno.h: fxbldno.exe - fxbldno > fxbldno.h - -glide.res: rcver.h fxbldno.h -gglide.obj: rcver.h - -!if "$(FX_GLIDE_CTRISETUP)" != "1" -gdraw.obj: fxinline.h -!endif - diff --git a/glide2x/cvg/glide/src/makefile.linux b/glide2x/cvg/glide/src/makefile.linux deleted file mode 100644 index 44f990b..0000000 --- a/glide2x/cvg/glide/src/makefile.linux +++ /dev/null @@ -1,263 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -TAG_REGEXP = $(BUILD_ROOT)/$(FX_GLIDE_HW)/glide/src/glide.rx - - -# Compile for specific hardware -ifeq ($(FX_GLIDE_HW),cvg) -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_CTRISETUP = 0 - -HWSPEC = fifo.c -LCDEFS += -DCVG \ - -DGLIDE_CHIP_BROADCAST=1 -DGLIDE_DEFAULT_GAMMA=1.3 \ - -DGLIDE_BLIT_CLEAR=1 - -else -ifeq ($(FX_GLIDE_HW),H3) -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 -FX_GLIDE_CTRISETUP = 1 -HWSPEC = fifo.c -LCDEFS += -DH3 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -else -error "FX_GLIDE_HW == unknown value (H3|CVG)" -endif -endif - -ifeq ($(DEBUG),1) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -ifeq ($(FX_GLIDE_HW),) -error "FX_GLIDE_HW not defined" -endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = - -ifeq ($(HAL_HW),1) -DSPOPTS += -DHAL_HW=1 -SUBLIBRARIES += $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib/libsst1init.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -endif -ifeq ($(DSPOPTS),) -error "Unknown HAL_* configuration" -endif - -# GLIDE_HW_TRI_SETUP: Use the hw TSU for triangle rendering. -# GLIDE_TRI_CULLING: Cull backfaced/zero area triangles in sw before the fifo. -# NB: This must be set if GLIDE_HW_TRI_SETUP=0 -ifeq ($(FX_GLIDE_SW_SETUP),1) -LCDEFS += -DGLIDE_HW_TRI_SETUP=0 -DGLIDE_TRI_CULLING=1 -FX_GLIDE_CTRISETUP = 1 -else -# Do culling test in sw for independent triangles -CULL_MODE = -DGLIDE_TRI_CULLING=0 -ifeq ($(FX_GLIDE_HW_CULL),1) -CULL_MODE = -DGLIDE_TRI_CULLING=1 -endif -DSPOPTS += $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -ifeq ($(FX_GLIDE_PACK_RGB),1) -LCDEFS += -DGLIDE_PACKED_RGB=1 -endif - -endif - -ifneq ($(FX_GLIDE_NO_FIFO),1) -FIFODEFS = -DUSE_PACKET_FIFO=1 \ - -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=1 - -ifeq ($(FX_GLIDE_DEBUG_FIFO),1) -# GLIDE_USE_DEBUG_FIFO: Run w/ the small fifo to cause me/glide more stress -# FIFO_ASSERT_FULL: Check hw depth/fifo a lot (slow) -LCDEFS += -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 \ - -DASSERT_FAULT=0 #-DGLIDE_SANITY_SIZE=1 -endif -else -FX_GLIDE_CTRISETUP = 1 -FIFODEFS = -DGLIDE_HW_TRI_SETUP=1 -endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = gxdraw.c -else -ASMTRISETUP = xdraw2.S -DSPOPTS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -ifeq ($(FX_GLIDE_CRYBABY),1) -LCDEFS += -DGLIDE_CHECK_COMPATABILITY=1 -endif - -# Turn Off/On compilation of shameless plug -ifeq ($(FX_GLIDE_NO_PLUG),1) -else -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifeq ($(FX_GLIDE_NO_SPLASH),1) -else -LCDEFS += -DGLIDE_SPLASH -endif - -#Glide 3 Stuff, for migration all -ifneq ($(FX_GLIDE3),) -LCDEFS += -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -#Glide 3. remove migration stuff -ifneq ($(FX_GLIDE3_ALPHA),) -LCDEFS += -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_SIZE),) -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_ASSERT),) -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS += -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -CFILES += gsplash.c g3df.c gu.c guclip.c gpci.c gump.c\ - diglide.c disst.c ditex.c gbanner.c gerror.c\ - gmovie.c digutex.c ddgump.c gaa.c gdraw.c\ - gglide.c glfb.c gsst.c gtex.c gtexdl.c\ - gutex.c $(HWSPEC) $(GLIDE3FILES) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -CODFILES = $(CFILES:.c=.cod) - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h fxinline.h fxbldno.o fxbldno fxbldno.h - -ifeq ($(FX_GLIDE3),1) -LIBRARIES = libglide3.a -SHARED_LIBRARY = libglide3.so.3.01 -else -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.53 -endif -RCFILE = glide.rc - -# Make a static link library for things like the diags. -ifeq ($(FX_DLL_BUILD),1) -FX_DLL_LIBRARY = 1 -else -LCDEFS += -DFX_STATIC_BUILD -endif - - -LCDEFS += $(FIFODEFS) - -include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak - -codfiles: $(CODFILES) - -ctags: $(CFILES) - ctags $(CFILES) - -gbanner.o : banner.inc -gsplash.o : splshdat.c - - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm: fxgasm.c $(HEADERS) gsstdef.h fxglide.h - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -I$(BUILD_ROOT)/swlibs/include $(LDFLAGS) - -fxgasm.h: fxgasm - ./fxgasm > fxgasm.h -fxinline.h: fxgasm - ./fxgasm -inline > fxinline.h - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) - -fxbldno.h: fxbldno.exe - fxbldno > fxbldno.h - -glide.res: rcver.h fxbldno.h -gglide.obj: rcver.h - -ifeq ($(FX_GLIDE_CTRISETUP),1) -gdraw.o: fxinline.h -endif - -xdraw2.o : xdraw2.S xdraw2.inc.S fxgasm.h fxinline.h - gasp xdraw2.S $(ASM_OPTS) $(LAOPTS) | as -V -Qy -o xdraw2.o - -cpudtect.o : - gasp cpudtect.S $(LAOPTS) | as -V -Qy -o cpudtect.o diff --git a/glide2x/cvg/glide/src/rcver.h b/glide2x/cvg/glide/src/rcver.h deleted file mode 100644 index 83b66e1..0000000 --- a/glide2x/cvg/glide/src/rcver.h +++ /dev/null @@ -1,28 +0,0 @@ - -#define MANVERSION 2 -#define MANREVISION 53 - -#ifndef GLIDE3 -#define VERSIONSTR "2.53\0" -#else -#define VERSIONSTR "3.0\0" -#endif - -#if defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(H3) -# define HWSTR " Banshee(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#else -# define PRODNAME "Something really, really important\0" -# define HWSTR "Unknown Chip\0" -#endif diff --git a/glide2x/cvg/glide/src/readme b/glide2x/cvg/glide/src/readme deleted file mode 100644 index 35875f3..0000000 --- a/glide2x/cvg/glide/src/readme +++ /dev/null @@ -1,41 +0,0 @@ -GDEBUG levels: - -Level Description ------ ------------------------------------------------ - 80 init routines - 81 gu3df* - 82 grLfb* - 83 grSst* - 84 grSstStatus, grSstIsBusy, grSstVideoLine - 85 gr* misc state routines - 86 grBuffer* - 87 grDisableAllEffects, grGlide?etState - 88 grTex* attribute routines - 89 grTex* download routines - 90 grDrawPoint - 91 grDrawLine - 92 grDrawTriangle - 93 grDrawPolygon* - 94 grDrawAAPoint - 95 grDrawAALine - 96 grDrawAATriangle - 97 grDrawAAPolygon* - 98 guMP* routines - 99 gu* misc. routines -280 internal init routines -281 routine exit traces -282 dataList values - -GLIDE_PLATFORM: - - GLIDE_HARDWARE: - Defined if GLIDE should use the actual SST hardware. - - GLIDE_HW_*: - GLIDE_HW_SST1: - This macro is for compiling - GLIDE_HW_SST96: - This macro is for compiling Glide for SST96 - GLIDE_HW_H3: - This macro is for compiling Glide for H3 - diff --git a/glide2x/cvg/glide/src/splshdat.c b/glide2x/cvg/glide/src/splshdat.c deleted file mode 100644 index 34e7133..0000000 --- a/glide2x/cvg/glide/src/splshdat.c +++ /dev/null @@ -1,14791 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:13 joseph -** Initial checkin into SourceForge. -** -** -** 7 2/20/98 11:00a Peter -** removed glide3 from glid2 tree - * - * 6 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 5 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 4 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 3 5/21/97 6:05a Peter -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ { 61, 60, 59 }, 3, 0 }, -{ { 55, 54, 53 }, 3, 0 }, -{ { 57, 56, 55 }, 3, 0 }, -{ { 39, 38, 37 }, 3, 0 }, -{ { 37, 36, 35 }, 3, 0 }, -{ { 53, 52, 51 }, 3, 0 }, -{ { 41, 40, 39 }, 3, 0 }, -{ { 43, 42, 41 }, 3, 0 }, -{ { 59, 58, 57 }, 3, 0 }, -{ { 63, 62, 61 }, 3, 0 }, -{ { 45, 44, 43 }, 3, 0 }, -{ { 35, 34, 67 }, 3, 0 }, -{ { 67, 66, 65 }, 3, 0 }, -{ { 51, 50, 49 }, 3, 0 }, -{ { 49, 48, 47 }, 3, 0 }, -{ { 65, 64, 63 }, 3, 0 }, -{ { 47, 46, 45 }, 3, 0 }, -{ { 41, 39, 37 }, 3, 0 }, -{ { 43, 41, 37 }, 3, 0 }, -{ { 43, 37, 35 }, 3, 0 }, -{ { 45, 43, 35 }, 3, 0 }, -{ { 45, 35, 67 }, 3, 0 }, -{ { 47, 45, 67 }, 3, 0 }, -{ { 47, 67, 65 }, 3, 0 }, -{ { 49, 47, 65 }, 3, 0 }, -{ { 49, 65, 63 }, 3, 0 }, -{ { 51, 49, 63 }, 3, 0 }, -{ { 51, 63, 61 }, 3, 0 }, -{ { 53, 51, 61 }, 3, 0 }, -{ { 53, 61, 59 }, 3, 0 }, -{ { 53, 59, 57 }, 3, 0 }, -{ { 53, 57, 55 }, 3, 0 }, -{ { 61, 27, 26 }, 4, 2 }, -{ { 26, 60, 61 }, 4, 0 }, -{ { 60, 26, 25 }, 4, 2 }, -{ { 25, 59, 60 }, 4, 0 }, -{ { 55, 21, 20 }, 4, 2 }, -{ { 20, 54, 55 }, 4, 0 }, -{ { 54, 20, 19 }, 4, 2 }, -{ { 19, 53, 54 }, 4, 0 }, -{ { 57, 23, 22 }, 4, 2 }, -{ { 22, 56, 57 }, 4, 0 }, -{ { 56, 22, 21 }, 4, 2 }, -{ { 21, 55, 56 }, 4, 0 }, -{ { 39, 5, 4 }, 4, 2 }, -{ { 4, 38, 39 }, 4, 0 }, -{ { 38, 4, 3 }, 4, 2 }, -{ { 3, 37, 38 }, 4, 0 }, -{ { 37, 3, 2 }, 4, 2 }, -{ { 2, 36, 37 }, 4, 0 }, -{ { 36, 2, 1 }, 4, 2 }, -{ { 1, 35, 36 }, 4, 0 }, -{ { 53, 19, 18 }, 4, 2 }, -{ { 18, 52, 53 }, 4, 0 }, -{ { 52, 18, 17 }, 4, 2 }, -{ { 17, 51, 52 }, 4, 0 }, -{ { 41, 7, 6 }, 4, 2 }, -{ { 6, 40, 41 }, 4, 0 }, -{ { 40, 6, 5 }, 4, 2 }, -{ { 5, 39, 40 }, 4, 0 }, -{ { 43, 9, 8 }, 4, 2 }, -{ { 8, 42, 43 }, 4, 0 }, -{ { 42, 8, 7 }, 4, 2 }, -{ { 7, 41, 42 }, 4, 0 }, -{ { 59, 25, 24 }, 4, 2 }, -{ { 24, 58, 59 }, 4, 0 }, -{ { 58, 24, 23 }, 4, 2 }, -{ { 23, 57, 58 }, 4, 0 }, -{ { 63, 29, 28 }, 4, 2 }, -{ { 28, 62, 63 }, 4, 0 }, -{ { 62, 28, 27 }, 4, 2 }, -{ { 27, 61, 62 }, 4, 0 }, -{ { 45, 11, 10 }, 4, 2 }, -{ { 10, 44, 45 }, 4, 0 }, -{ { 44, 10, 9 }, 4, 2 }, -{ { 9, 43, 44 }, 4, 0 }, -{ { 35, 1, 0 }, 4, 2 }, -{ { 0, 34, 35 }, 4, 0 }, -{ { 34, 0, 33 }, 4, 2 }, -{ { 33, 67, 34 }, 4, 0 }, -{ { 67, 33, 32 }, 4, 2 }, -{ { 32, 66, 67 }, 4, 0 }, -{ { 66, 32, 31 }, 4, 2 }, -{ { 31, 65, 66 }, 4, 0 }, -{ { 51, 17, 16 }, 4, 2 }, -{ { 16, 50, 51 }, 4, 0 }, -{ { 50, 16, 15 }, 4, 2 }, -{ { 15, 49, 50 }, 4, 0 }, -{ { 49, 15, 14 }, 4, 2 }, -{ { 14, 48, 49 }, 4, 0 }, -{ { 48, 14, 13 }, 4, 2 }, -{ { 13, 47, 48 }, 4, 0 }, -{ { 65, 31, 30 }, 4, 2 }, -{ { 30, 64, 65 }, 4, 0 }, -{ { 64, 30, 29 }, 4, 2 }, -{ { 29, 63, 64 }, 4, 0 }, -{ { 47, 13, 12 }, 4, 2 }, -{ { 12, 46, 47 }, 4, 0 }, -{ { 46, 12, 11 }, 4, 2 }, -{ { 11, 45, 46 }, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ { 1, 2, 350 }, 0, 4 }, -{ { 1, 350, 349 }, 0, 3 }, -{ { 2, 3, 351 }, 0, 4 }, -{ { 2, 351, 350 }, 0, 2 }, -{ { 3, 4, 352 }, 0, 4 }, -{ { 3, 352, 351 }, 0, 2 }, -{ { 4, 5, 353 }, 0, 4 }, -{ { 4, 353, 352 }, 0, 2 }, -{ { 5, 6, 354 }, 0, 4 }, -{ { 5, 354, 353 }, 0, 2 }, -{ { 6, 7, 355 }, 0, 4 }, -{ { 6, 355, 354 }, 0, 2 }, -{ { 7, 8, 356 }, 0, 4 }, -{ { 7, 356, 355 }, 0, 2 }, -{ { 8, 9, 357 }, 0, 4 }, -{ { 8, 357, 356 }, 0, 2 }, -{ { 9, 10, 358 }, 0, 4 }, -{ { 9, 358, 357 }, 0, 2 }, -{ { 10, 11, 359 }, 0, 4 }, -{ { 10, 359, 358 }, 0, 2 }, -{ { 11, 12, 360 }, 0, 4 }, -{ { 11, 360, 359 }, 0, 2 }, -{ { 12, 13, 361 }, 0, 4 }, -{ { 12, 361, 360 }, 0, 2 }, -{ { 13, 14, 362 }, 0, 4 }, -{ { 13, 362, 361 }, 0, 2 }, -{ { 14, 15, 363 }, 0, 4 }, -{ { 14, 363, 362 }, 0, 2 }, -{ { 15, 16, 364 }, 0, 4 }, -{ { 15, 364, 363 }, 0, 2 }, -{ { 16, 17, 365 }, 0, 4 }, -{ { 16, 365, 364 }, 0, 2 }, -{ { 17, 18, 366 }, 0, 4 }, -{ { 17, 366, 365 }, 0, 2 }, -{ { 18, 19, 367 }, 0, 6 }, -{ { 18, 367, 366 }, 0, 2 }, -{ { 20, 21, 369 }, 0, 4 }, -{ { 20, 369, 368 }, 0, 3 }, -{ { 21, 22, 370 }, 0, 4 }, -{ { 21, 370, 369 }, 0, 2 }, -{ { 22, 23, 371 }, 0, 4 }, -{ { 22, 371, 370 }, 0, 2 }, -{ { 23, 24, 372 }, 0, 4 }, -{ { 23, 372, 371 }, 0, 2 }, -{ { 24, 25, 373 }, 0, 4 }, -{ { 24, 373, 372 }, 0, 2 }, -{ { 25, 26, 374 }, 0, 4 }, -{ { 25, 374, 373 }, 0, 2 }, -{ { 26, 27, 375 }, 0, 4 }, -{ { 26, 375, 374 }, 0, 2 }, -{ { 27, 28, 376 }, 0, 4 }, -{ { 27, 376, 375 }, 0, 2 }, -{ { 28, 29, 377 }, 0, 4 }, -{ { 28, 377, 376 }, 0, 2 }, -{ { 29, 30, 378 }, 0, 4 }, -{ { 29, 378, 377 }, 0, 2 }, -{ { 30, 31, 379 }, 0, 4 }, -{ { 30, 379, 378 }, 0, 2 }, -{ { 31, 32, 380 }, 0, 4 }, -{ { 31, 380, 379 }, 0, 2 }, -{ { 32, 33, 381 }, 0, 4 }, -{ { 32, 381, 380 }, 0, 2 }, -{ { 33, 34, 382 }, 0, 4 }, -{ { 33, 382, 381 }, 0, 2 }, -{ { 34, 35, 383 }, 0, 4 }, -{ { 34, 383, 382 }, 0, 2 }, -{ { 35, 36, 384 }, 0, 4 }, -{ { 35, 384, 383 }, 0, 2 }, -{ { 36, 37, 385 }, 0, 4 }, -{ { 36, 385, 384 }, 0, 2 }, -{ { 37, 38, 386 }, 0, 4 }, -{ { 37, 386, 385 }, 0, 2 }, -{ { 38, 39, 387 }, 0, 4 }, -{ { 38, 387, 386 }, 0, 2 }, -{ { 39, 40, 388 }, 0, 4 }, -{ { 39, 388, 387 }, 0, 2 }, -{ { 40, 41, 389 }, 0, 4 }, -{ { 40, 389, 388 }, 0, 2 }, -{ { 41, 42, 390 }, 0, 4 }, -{ { 41, 390, 389 }, 0, 2 }, -{ { 42, 43, 391 }, 0, 4 }, -{ { 42, 391, 390 }, 0, 2 }, -{ { 43, 44, 392 }, 0, 4 }, -{ { 43, 392, 391 }, 0, 2 }, -{ { 44, 45, 393 }, 0, 4 }, -{ { 44, 393, 392 }, 0, 2 }, -{ { 45, 46, 394 }, 0, 4 }, -{ { 45, 394, 393 }, 0, 2 }, -{ { 46, 47, 395 }, 0, 4 }, -{ { 46, 395, 394 }, 0, 2 }, -{ { 47, 48, 396 }, 0, 4 }, -{ { 47, 396, 395 }, 0, 2 }, -{ { 48, 49, 397 }, 0, 4 }, -{ { 48, 397, 396 }, 0, 2 }, -{ { 49, 50, 398 }, 0, 4 }, -{ { 49, 398, 397 }, 0, 2 }, -{ { 50, 51, 399 }, 0, 4 }, -{ { 50, 399, 398 }, 0, 2 }, -{ { 51, 52, 400 }, 0, 4 }, -{ { 51, 400, 399 }, 0, 2 }, -{ { 52, 53, 401 }, 0, 4 }, -{ { 52, 401, 400 }, 0, 2 }, -{ { 53, 54, 402 }, 0, 4 }, -{ { 53, 402, 401 }, 0, 2 }, -{ { 54, 55, 403 }, 0, 4 }, -{ { 54, 403, 402 }, 0, 2 }, -{ { 55, 56, 404 }, 0, 6 }, -{ { 55, 404, 403 }, 0, 2 }, -{ { 57, 58, 406 }, 0, 4 }, -{ { 57, 406, 405 }, 0, 3 }, -{ { 58, 59, 407 }, 0, 4 }, -{ { 58, 407, 406 }, 0, 2 }, -{ { 59, 60, 408 }, 0, 4 }, -{ { 59, 408, 407 }, 0, 2 }, -{ { 60, 61, 409 }, 0, 4 }, -{ { 60, 409, 408 }, 0, 2 }, -{ { 61, 62, 410 }, 0, 4 }, -{ { 61, 410, 409 }, 0, 2 }, -{ { 62, 63, 411 }, 0, 4 }, -{ { 62, 411, 410 }, 0, 2 }, -{ { 63, 64, 412 }, 0, 4 }, -{ { 63, 412, 411 }, 0, 2 }, -{ { 64, 65, 413 }, 0, 4 }, -{ { 64, 413, 412 }, 0, 2 }, -{ { 65, 66, 414 }, 0, 4 }, -{ { 65, 414, 413 }, 0, 2 }, -{ { 66, 67, 415 }, 0, 4 }, -{ { 66, 415, 414 }, 0, 2 }, -{ { 67, 68, 416 }, 0, 4 }, -{ { 67, 416, 415 }, 0, 2 }, -{ { 68, 69, 417 }, 0, 4 }, -{ { 68, 417, 416 }, 0, 2 }, -{ { 69, 70, 418 }, 0, 4 }, -{ { 69, 418, 417 }, 0, 2 }, -{ { 70, 71, 419 }, 0, 4 }, -{ { 70, 419, 418 }, 0, 2 }, -{ { 71, 72, 420 }, 0, 4 }, -{ { 71, 420, 419 }, 0, 2 }, -{ { 72, 73, 421 }, 0, 4 }, -{ { 72, 421, 420 }, 0, 2 }, -{ { 73, 74, 422 }, 0, 4 }, -{ { 73, 422, 421 }, 0, 2 }, -{ { 74, 0, 348 }, 0, 6 }, -{ { 74, 348, 422 }, 0, 2 }, -{ { 75, 76, 424 }, 0, 4 }, -{ { 75, 424, 423 }, 0, 3 }, -{ { 76, 77, 425 }, 0, 4 }, -{ { 76, 425, 424 }, 0, 2 }, -{ { 77, 78, 426 }, 0, 4 }, -{ { 77, 426, 425 }, 0, 2 }, -{ { 78, 79, 427 }, 0, 4 }, -{ { 78, 427, 426 }, 0, 2 }, -{ { 79, 80, 428 }, 0, 4 }, -{ { 79, 428, 427 }, 0, 2 }, -{ { 80, 81, 429 }, 0, 4 }, -{ { 80, 429, 428 }, 0, 2 }, -{ { 81, 82, 430 }, 0, 4 }, -{ { 81, 430, 429 }, 0, 2 }, -{ { 82, 83, 431 }, 0, 4 }, -{ { 82, 431, 430 }, 0, 2 }, -{ { 83, 84, 432 }, 0, 4 }, -{ { 83, 432, 431 }, 0, 2 }, -{ { 84, 85, 433 }, 0, 4 }, -{ { 84, 433, 432 }, 0, 2 }, -{ { 85, 86, 434 }, 0, 4 }, -{ { 85, 434, 433 }, 0, 2 }, -{ { 86, 87, 435 }, 0, 4 }, -{ { 86, 435, 434 }, 0, 2 }, -{ { 87, 88, 436 }, 0, 4 }, -{ { 87, 436, 435 }, 0, 2 }, -{ { 88, 89, 437 }, 0, 6 }, -{ { 88, 437, 436 }, 0, 2 }, -{ { 90, 91, 439 }, 0, 4 }, -{ { 90, 439, 438 }, 0, 2 }, -{ { 91, 92, 440 }, 0, 4 }, -{ { 91, 440, 439 }, 0, 2 }, -{ { 92, 93, 441 }, 0, 4 }, -{ { 92, 441, 440 }, 0, 2 }, -{ { 93, 94, 442 }, 0, 4 }, -{ { 93, 442, 441 }, 0, 2 }, -{ { 94, 95, 443 }, 0, 4 }, -{ { 94, 443, 442 }, 0, 2 }, -{ { 95, 96, 444 }, 0, 4 }, -{ { 95, 444, 443 }, 0, 2 }, -{ { 96, 97, 445 }, 0, 4 }, -{ { 96, 445, 444 }, 0, 2 }, -{ { 97, 98, 446 }, 0, 4 }, -{ { 97, 446, 445 }, 0, 2 }, -{ { 98, 99, 447 }, 0, 4 }, -{ { 98, 447, 446 }, 0, 2 }, -{ { 99, 100, 448 }, 0, 4 }, -{ { 99, 448, 447 }, 0, 2 }, -{ { 100, 101, 449 }, 0, 4 }, -{ { 100, 449, 448 }, 0, 2 }, -{ { 101, 102, 450 }, 0, 4 }, -{ { 101, 450, 449 }, 0, 2 }, -{ { 102, 103, 451 }, 0, 4 }, -{ { 102, 451, 450 }, 0, 2 }, -{ { 103, 104, 452 }, 0, 4 }, -{ { 103, 452, 451 }, 0, 2 }, -{ { 104, 90, 438 }, 0, 4 }, -{ { 104, 438, 452 }, 0, 2 }, -{ { 106, 107, 455 }, 1, 6 }, -{ { 106, 455, 454 }, 1, 3 }, -{ { 108, 109, 457 }, 1, 4 }, -{ { 108, 457, 456 }, 1, 3 }, -{ { 109, 110, 458 }, 1, 4 }, -{ { 109, 458, 457 }, 1, 2 }, -{ { 110, 111, 459 }, 1, 4 }, -{ { 110, 459, 458 }, 1, 2 }, -{ { 111, 112, 460 }, 1, 4 }, -{ { 111, 460, 459 }, 1, 2 }, -{ { 112, 113, 461 }, 1, 4 }, -{ { 112, 461, 460 }, 1, 2 }, -{ { 113, 114, 462 }, 1, 4 }, -{ { 113, 462, 461 }, 1, 2 }, -{ { 114, 115, 463 }, 1, 4 }, -{ { 114, 463, 462 }, 1, 2 }, -{ { 115, 116, 464 }, 1, 4 }, -{ { 115, 464, 463 }, 1, 2 }, -{ { 116, 117, 465 }, 1, 4 }, -{ { 116, 465, 464 }, 1, 2 }, -{ { 117, 118, 466 }, 1, 4 }, -{ { 117, 466, 465 }, 1, 2 }, -{ { 118, 119, 467 }, 1, 4 }, -{ { 118, 467, 466 }, 1, 2 }, -{ { 119, 120, 468 }, 1, 4 }, -{ { 119, 468, 467 }, 1, 2 }, -{ { 120, 121, 469 }, 1, 4 }, -{ { 120, 469, 468 }, 1, 2 }, -{ { 121, 122, 470 }, 1, 4 }, -{ { 121, 470, 469 }, 1, 2 }, -{ { 122, 123, 471 }, 1, 4 }, -{ { 122, 471, 470 }, 1, 2 }, -{ { 123, 124, 472 }, 1, 4 }, -{ { 123, 472, 471 }, 1, 2 }, -{ { 124, 125, 473 }, 1, 4 }, -{ { 124, 473, 472 }, 1, 2 }, -{ { 125, 126, 474 }, 1, 4 }, -{ { 125, 474, 473 }, 1, 2 }, -{ { 126, 127, 475 }, 1, 4 }, -{ { 126, 475, 474 }, 1, 2 }, -{ { 127, 128, 476 }, 1, 4 }, -{ { 127, 476, 475 }, 1, 2 }, -{ { 128, 129, 477 }, 1, 4 }, -{ { 128, 477, 476 }, 1, 2 }, -{ { 129, 130, 478 }, 1, 4 }, -{ { 129, 478, 477 }, 1, 2 }, -{ { 130, 131, 479 }, 1, 4 }, -{ { 130, 479, 478 }, 1, 2 }, -{ { 131, 132, 480 }, 1, 4 }, -{ { 131, 480, 479 }, 1, 2 }, -{ { 132, 133, 481 }, 1, 4 }, -{ { 132, 481, 480 }, 1, 2 }, -{ { 133, 134, 482 }, 1, 4 }, -{ { 133, 482, 481 }, 1, 2 }, -{ { 134, 135, 483 }, 1, 4 }, -{ { 134, 483, 482 }, 1, 2 }, -{ { 135, 136, 484 }, 1, 4 }, -{ { 135, 484, 483 }, 1, 2 }, -{ { 136, 137, 485 }, 1, 6 }, -{ { 136, 485, 484 }, 1, 2 }, -{ { 138, 139, 487 }, 1, 6 }, -{ { 138, 487, 486 }, 1, 3 }, -{ { 140, 105, 453 }, 1, 6 }, -{ { 140, 453, 488 }, 1, 3 }, -{ { 141, 142, 490 }, 1, 4 }, -{ { 141, 490, 489 }, 1, 2 }, -{ { 142, 143, 491 }, 1, 4 }, -{ { 142, 491, 490 }, 1, 2 }, -{ { 143, 144, 492 }, 1, 4 }, -{ { 143, 492, 491 }, 1, 2 }, -{ { 144, 145, 493 }, 1, 4 }, -{ { 144, 493, 492 }, 1, 2 }, -{ { 145, 146, 494 }, 1, 4 }, -{ { 145, 494, 493 }, 1, 2 }, -{ { 146, 147, 495 }, 1, 4 }, -{ { 146, 495, 494 }, 1, 2 }, -{ { 147, 148, 496 }, 1, 4 }, -{ { 147, 496, 495 }, 1, 2 }, -{ { 148, 149, 497 }, 1, 4 }, -{ { 148, 497, 496 }, 1, 2 }, -{ { 149, 150, 498 }, 1, 4 }, -{ { 149, 498, 497 }, 1, 2 }, -{ { 150, 151, 499 }, 1, 4 }, -{ { 150, 499, 498 }, 1, 2 }, -{ { 151, 152, 500 }, 1, 4 }, -{ { 151, 500, 499 }, 1, 2 }, -{ { 152, 141, 489 }, 1, 4 }, -{ { 152, 489, 500 }, 1, 2 }, -{ { 153, 154, 502 }, 1, 4 }, -{ { 153, 502, 501 }, 1, 2 }, -{ { 154, 155, 503 }, 1, 4 }, -{ { 154, 503, 502 }, 1, 2 }, -{ { 155, 156, 504 }, 1, 4 }, -{ { 155, 504, 503 }, 1, 2 }, -{ { 156, 157, 505 }, 1, 4 }, -{ { 156, 505, 504 }, 1, 2 }, -{ { 157, 158, 506 }, 1, 4 }, -{ { 157, 506, 505 }, 1, 2 }, -{ { 158, 159, 507 }, 1, 4 }, -{ { 158, 507, 506 }, 1, 2 }, -{ { 159, 160, 508 }, 1, 4 }, -{ { 159, 508, 507 }, 1, 2 }, -{ { 160, 153, 501 }, 1, 4 }, -{ { 160, 501, 508 }, 1, 2 }, -{ { 161, 162, 510 }, 1, 4 }, -{ { 161, 510, 509 }, 1, 2 }, -{ { 162, 163, 511 }, 1, 4 }, -{ { 162, 511, 510 }, 1, 2 }, -{ { 163, 164, 512 }, 1, 4 }, -{ { 163, 512, 511 }, 1, 2 }, -{ { 164, 165, 513 }, 1, 4 }, -{ { 164, 513, 512 }, 1, 2 }, -{ { 165, 166, 514 }, 1, 4 }, -{ { 165, 514, 513 }, 1, 2 }, -{ { 166, 167, 515 }, 1, 4 }, -{ { 166, 515, 514 }, 1, 2 }, -{ { 167, 168, 516 }, 1, 4 }, -{ { 167, 516, 515 }, 1, 2 }, -{ { 168, 169, 517 }, 1, 4 }, -{ { 168, 517, 516 }, 1, 2 }, -{ { 169, 170, 518 }, 1, 4 }, -{ { 169, 518, 517 }, 1, 2 }, -{ { 170, 161, 509 }, 1, 4 }, -{ { 170, 509, 518 }, 1, 2 }, -{ { 171, 172, 520 }, 1, 4 }, -{ { 171, 520, 519 }, 1, 2 }, -{ { 172, 173, 521 }, 1, 4 }, -{ { 172, 521, 520 }, 1, 2 }, -{ { 173, 174, 522 }, 1, 4 }, -{ { 173, 522, 521 }, 1, 2 }, -{ { 174, 171, 519 }, 1, 4 }, -{ { 174, 519, 522 }, 1, 2 }, -{ { 175, 176, 524 }, 1, 4 }, -{ { 175, 524, 523 }, 1, 2 }, -{ { 176, 177, 525 }, 1, 4 }, -{ { 176, 525, 524 }, 1, 2 }, -{ { 177, 178, 526 }, 1, 4 }, -{ { 177, 526, 525 }, 1, 2 }, -{ { 178, 179, 527 }, 1, 4 }, -{ { 178, 527, 526 }, 1, 2 }, -{ { 179, 180, 528 }, 1, 4 }, -{ { 179, 528, 527 }, 1, 2 }, -{ { 180, 181, 529 }, 1, 4 }, -{ { 180, 529, 528 }, 1, 2 }, -{ { 181, 182, 530 }, 1, 4 }, -{ { 181, 530, 529 }, 1, 2 }, -{ { 182, 183, 531 }, 1, 4 }, -{ { 182, 531, 530 }, 1, 2 }, -{ { 183, 184, 532 }, 1, 4 }, -{ { 183, 532, 531 }, 1, 2 }, -{ { 184, 185, 533 }, 1, 4 }, -{ { 184, 533, 532 }, 1, 2 }, -{ { 185, 186, 534 }, 1, 4 }, -{ { 185, 534, 533 }, 1, 2 }, -{ { 186, 187, 535 }, 1, 4 }, -{ { 186, 535, 534 }, 1, 2 }, -{ { 187, 188, 536 }, 1, 4 }, -{ { 187, 536, 535 }, 1, 2 }, -{ { 188, 189, 537 }, 1, 4 }, -{ { 188, 537, 536 }, 1, 2 }, -{ { 189, 190, 538 }, 1, 4 }, -{ { 189, 538, 537 }, 1, 2 }, -{ { 190, 191, 539 }, 1, 4 }, -{ { 190, 539, 538 }, 1, 2 }, -{ { 191, 192, 540 }, 1, 4 }, -{ { 191, 540, 539 }, 1, 2 }, -{ { 192, 193, 541 }, 1, 4 }, -{ { 192, 541, 540 }, 1, 2 }, -{ { 193, 175, 523 }, 1, 4 }, -{ { 193, 523, 541 }, 1, 2 }, -{ { 194, 195, 543 }, 1, 4 }, -{ { 194, 543, 542 }, 1, 2 }, -{ { 195, 196, 544 }, 1, 4 }, -{ { 195, 544, 543 }, 1, 2 }, -{ { 196, 197, 545 }, 1, 4 }, -{ { 196, 545, 544 }, 1, 2 }, -{ { 197, 198, 546 }, 1, 4 }, -{ { 197, 546, 545 }, 1, 2 }, -{ { 198, 199, 547 }, 1, 4 }, -{ { 198, 547, 546 }, 1, 2 }, -{ { 199, 200, 548 }, 1, 4 }, -{ { 199, 548, 547 }, 1, 2 }, -{ { 200, 201, 549 }, 1, 4 }, -{ { 200, 549, 548 }, 1, 2 }, -{ { 201, 202, 550 }, 1, 4 }, -{ { 201, 550, 549 }, 1, 2 }, -{ { 202, 203, 551 }, 1, 4 }, -{ { 202, 551, 550 }, 1, 2 }, -{ { 203, 204, 552 }, 1, 4 }, -{ { 203, 552, 551 }, 1, 2 }, -{ { 204, 205, 553 }, 1, 4 }, -{ { 204, 553, 552 }, 1, 2 }, -{ { 205, 206, 554 }, 1, 4 }, -{ { 205, 554, 553 }, 1, 2 }, -{ { 206, 207, 555 }, 1, 4 }, -{ { 206, 555, 554 }, 1, 2 }, -{ { 207, 208, 556 }, 1, 4 }, -{ { 207, 556, 555 }, 1, 2 }, -{ { 208, 209, 557 }, 1, 4 }, -{ { 208, 557, 556 }, 1, 2 }, -{ { 209, 210, 558 }, 1, 4 }, -{ { 209, 558, 557 }, 1, 2 }, -{ { 210, 211, 559 }, 1, 4 }, -{ { 210, 559, 558 }, 1, 2 }, -{ { 211, 212, 560 }, 1, 4 }, -{ { 211, 560, 559 }, 1, 2 }, -{ { 212, 213, 561 }, 1, 4 }, -{ { 212, 561, 560 }, 1, 2 }, -{ { 213, 214, 562 }, 1, 4 }, -{ { 213, 562, 561 }, 1, 2 }, -{ { 214, 215, 563 }, 1, 4 }, -{ { 214, 563, 562 }, 1, 2 }, -{ { 215, 216, 564 }, 1, 4 }, -{ { 215, 564, 563 }, 1, 2 }, -{ { 216, 194, 542 }, 1, 4 }, -{ { 216, 542, 564 }, 1, 2 }, -{ { 217, 218, 566 }, 1, 4 }, -{ { 217, 566, 565 }, 1, 2 }, -{ { 218, 219, 567 }, 1, 4 }, -{ { 218, 567, 566 }, 1, 2 }, -{ { 219, 220, 568 }, 1, 4 }, -{ { 219, 568, 567 }, 1, 2 }, -{ { 220, 221, 569 }, 1, 4 }, -{ { 220, 569, 568 }, 1, 2 }, -{ { 221, 222, 570 }, 1, 4 }, -{ { 221, 570, 569 }, 1, 2 }, -{ { 222, 223, 571 }, 1, 4 }, -{ { 222, 571, 570 }, 1, 2 }, -{ { 223, 217, 565 }, 1, 4 }, -{ { 223, 565, 571 }, 1, 2 }, -{ { 224, 225, 573 }, 1, 4 }, -{ { 224, 573, 572 }, 1, 2 }, -{ { 225, 226, 574 }, 1, 4 }, -{ { 225, 574, 573 }, 1, 2 }, -{ { 226, 227, 575 }, 1, 4 }, -{ { 226, 575, 574 }, 1, 2 }, -{ { 227, 228, 576 }, 1, 4 }, -{ { 227, 576, 575 }, 1, 2 }, -{ { 228, 229, 577 }, 1, 4 }, -{ { 228, 577, 576 }, 1, 2 }, -{ { 229, 230, 578 }, 1, 4 }, -{ { 229, 578, 577 }, 1, 2 }, -{ { 230, 231, 579 }, 1, 4 }, -{ { 230, 579, 578 }, 1, 2 }, -{ { 231, 232, 580 }, 1, 4 }, -{ { 231, 580, 579 }, 1, 2 }, -{ { 232, 233, 581 }, 1, 4 }, -{ { 232, 581, 580 }, 1, 2 }, -{ { 233, 234, 582 }, 1, 4 }, -{ { 233, 582, 581 }, 1, 2 }, -{ { 234, 235, 583 }, 1, 4 }, -{ { 234, 583, 582 }, 1, 2 }, -{ { 235, 236, 584 }, 1, 4 }, -{ { 235, 584, 583 }, 1, 2 }, -{ { 236, 237, 585 }, 1, 4 }, -{ { 236, 585, 584 }, 1, 2 }, -{ { 237, 238, 586 }, 1, 4 }, -{ { 237, 586, 585 }, 1, 2 }, -{ { 238, 239, 587 }, 1, 4 }, -{ { 238, 587, 586 }, 1, 2 }, -{ { 239, 240, 588 }, 1, 4 }, -{ { 239, 588, 587 }, 1, 2 }, -{ { 240, 241, 589 }, 1, 4 }, -{ { 240, 589, 588 }, 1, 2 }, -{ { 241, 224, 572 }, 1, 4 }, -{ { 241, 572, 589 }, 1, 2 }, -{ { 242, 243, 591 }, 1, 4 }, -{ { 242, 591, 590 }, 1, 2 }, -{ { 243, 244, 592 }, 1, 4 }, -{ { 243, 592, 591 }, 1, 2 }, -{ { 244, 245, 593 }, 1, 4 }, -{ { 244, 593, 592 }, 1, 2 }, -{ { 245, 246, 594 }, 1, 4 }, -{ { 245, 594, 593 }, 1, 2 }, -{ { 246, 247, 595 }, 1, 4 }, -{ { 246, 595, 594 }, 1, 2 }, -{ { 247, 248, 596 }, 1, 4 }, -{ { 247, 596, 595 }, 1, 2 }, -{ { 248, 249, 597 }, 1, 4 }, -{ { 248, 597, 596 }, 1, 2 }, -{ { 249, 250, 598 }, 1, 4 }, -{ { 249, 598, 597 }, 1, 2 }, -{ { 250, 251, 599 }, 1, 4 }, -{ { 250, 599, 598 }, 1, 2 }, -{ { 251, 252, 600 }, 1, 4 }, -{ { 251, 600, 599 }, 1, 2 }, -{ { 252, 253, 601 }, 1, 4 }, -{ { 252, 601, 600 }, 1, 2 }, -{ { 253, 254, 602 }, 1, 4 }, -{ { 253, 602, 601 }, 1, 2 }, -{ { 254, 255, 603 }, 1, 4 }, -{ { 254, 603, 602 }, 1, 2 }, -{ { 255, 256, 604 }, 1, 4 }, -{ { 255, 604, 603 }, 1, 2 }, -{ { 256, 257, 605 }, 1, 4 }, -{ { 256, 605, 604 }, 1, 2 }, -{ { 257, 258, 606 }, 1, 4 }, -{ { 257, 606, 605 }, 1, 2 }, -{ { 258, 259, 607 }, 1, 4 }, -{ { 258, 607, 606 }, 1, 2 }, -{ { 259, 260, 608 }, 1, 4 }, -{ { 259, 608, 607 }, 1, 2 }, -{ { 260, 261, 609 }, 1, 4 }, -{ { 260, 609, 608 }, 1, 2 }, -{ { 261, 262, 610 }, 1, 4 }, -{ { 261, 610, 609 }, 1, 2 }, -{ { 262, 263, 611 }, 1, 4 }, -{ { 262, 611, 610 }, 1, 2 }, -{ { 263, 264, 611 }, 1, 4 }, -{ { 264, 612, 611 }, 1, 2 }, -{ { 264, 265, 613 }, 1, 4 }, -{ { 264, 613, 612 }, 1, 2 }, -{ { 265, 266, 614 }, 1, 4 }, -{ { 265, 614, 613 }, 1, 2 }, -{ { 266, 267, 615 }, 1, 4 }, -{ { 266, 615, 614 }, 1, 2 }, -{ { 267, 268, 616 }, 1, 4 }, -{ { 267, 616, 615 }, 1, 2 }, -{ { 268, 269, 617 }, 1, 4 }, -{ { 268, 617, 616 }, 1, 2 }, -{ { 269, 270, 618 }, 1, 4 }, -{ { 269, 618, 617 }, 1, 2 }, -{ { 270, 271, 619 }, 1, 4 }, -{ { 270, 619, 618 }, 1, 2 }, -{ { 271, 272, 620 }, 1, 4 }, -{ { 271, 620, 619 }, 1, 2 }, -{ { 272, 273, 621 }, 1, 4 }, -{ { 272, 621, 620 }, 1, 2 }, -{ { 273, 274, 622 }, 1, 4 }, -{ { 273, 622, 621 }, 1, 2 }, -{ { 274, 275, 623 }, 1, 4 }, -{ { 274, 623, 622 }, 1, 2 }, -{ { 275, 276, 624 }, 1, 4 }, -{ { 275, 624, 623 }, 1, 2 }, -{ { 276, 242, 590 }, 1, 4 }, -{ { 276, 590, 624 }, 1, 2 }, -{ { 277, 278, 626 }, 1, 4 }, -{ { 277, 626, 625 }, 1, 2 }, -{ { 278, 279, 627 }, 1, 4 }, -{ { 278, 627, 626 }, 1, 2 }, -{ { 279, 280, 628 }, 1, 4 }, -{ { 279, 628, 627 }, 1, 2 }, -{ { 280, 281, 629 }, 1, 4 }, -{ { 280, 629, 628 }, 1, 2 }, -{ { 281, 630, 629 }, 1, 2 }, -{ { 281, 282, 631 }, 1, 4 }, -{ { 281, 631, 630 }, 1, 2 }, -{ { 282, 632, 631 }, 1, 2 }, -{ { 282, 283, 633 }, 1, 4 }, -{ { 282, 633, 632 }, 1, 2 }, -{ { 283, 284, 634 }, 1, 4 }, -{ { 283, 634, 633 }, 1, 2 }, -{ { 284, 285, 635 }, 1, 4 }, -{ { 284, 635, 634 }, 1, 2 }, -{ { 285, 286, 636 }, 1, 4 }, -{ { 285, 636, 635 }, 1, 2 }, -{ { 286, 287, 637 }, 1, 4 }, -{ { 286, 637, 636 }, 1, 2 }, -{ { 287, 288, 638 }, 1, 4 }, -{ { 287, 638, 637 }, 1, 2 }, -{ { 288, 277, 625 }, 1, 4 }, -{ { 288, 625, 638 }, 1, 2 }, -{ { 289, 290, 640 }, 1, 4 }, -{ { 289, 640, 639 }, 1, 2 }, -{ { 290, 291, 641 }, 1, 4 }, -{ { 290, 641, 640 }, 1, 2 }, -{ { 291, 292, 642 }, 1, 4 }, -{ { 291, 642, 641 }, 1, 2 }, -{ { 292, 293, 643 }, 1, 4 }, -{ { 292, 643, 642 }, 1, 2 }, -{ { 293, 294, 644 }, 1, 4 }, -{ { 293, 644, 643 }, 1, 2 }, -{ { 294, 295, 645 }, 1, 4 }, -{ { 294, 645, 644 }, 1, 2 }, -{ { 295, 296, 646 }, 1, 4 }, -{ { 295, 646, 645 }, 1, 2 }, -{ { 296, 297, 647 }, 1, 4 }, -{ { 296, 647, 646 }, 1, 2 }, -{ { 297, 298, 648 }, 1, 4 }, -{ { 297, 648, 647 }, 1, 2 }, -{ { 298, 299, 649 }, 1, 4 }, -{ { 298, 649, 648 }, 1, 2 }, -{ { 299, 300, 650 }, 1, 4 }, -{ { 299, 650, 649 }, 1, 2 }, -{ { 300, 301, 651 }, 1, 4 }, -{ { 300, 651, 650 }, 1, 2 }, -{ { 301, 302, 652 }, 1, 4 }, -{ { 301, 652, 651 }, 1, 2 }, -{ { 302, 303, 653 }, 1, 4 }, -{ { 302, 653, 652 }, 1, 2 }, -{ { 303, 304, 654 }, 1, 4 }, -{ { 303, 654, 653 }, 1, 2 }, -{ { 304, 305, 655 }, 1, 4 }, -{ { 304, 655, 654 }, 1, 2 }, -{ { 305, 306, 656 }, 1, 4 }, -{ { 305, 656, 655 }, 1, 2 }, -{ { 306, 307, 657 }, 1, 4 }, -{ { 306, 657, 656 }, 1, 2 }, -{ { 307, 308, 658 }, 1, 4 }, -{ { 307, 658, 657 }, 1, 2 }, -{ { 308, 309, 659 }, 1, 4 }, -{ { 308, 659, 658 }, 1, 2 }, -{ { 309, 310, 660 }, 1, 4 }, -{ { 309, 660, 659 }, 1, 2 }, -{ { 310, 289, 639 }, 1, 4 }, -{ { 310, 639, 660 }, 1, 2 }, -{ { 311, 312, 662 }, 1, 4 }, -{ { 311, 662, 661 }, 1, 2 }, -{ { 312, 313, 663 }, 1, 4 }, -{ { 312, 663, 662 }, 1, 2 }, -{ { 313, 314, 664 }, 1, 4 }, -{ { 313, 664, 663 }, 1, 2 }, -{ { 314, 315, 665 }, 1, 4 }, -{ { 314, 665, 664 }, 1, 2 }, -{ { 315, 316, 666 }, 1, 4 }, -{ { 315, 666, 665 }, 1, 2 }, -{ { 316, 317, 667 }, 1, 4 }, -{ { 316, 667, 666 }, 1, 2 }, -{ { 317, 318, 668 }, 1, 4 }, -{ { 317, 668, 667 }, 1, 2 }, -{ { 318, 319, 669 }, 1, 4 }, -{ { 318, 669, 668 }, 1, 2 }, -{ { 319, 320, 670 }, 1, 4 }, -{ { 319, 670, 669 }, 1, 2 }, -{ { 320, 321, 671 }, 1, 4 }, -{ { 320, 671, 670 }, 1, 2 }, -{ { 321, 322, 672 }, 1, 4 }, -{ { 321, 672, 671 }, 1, 2 }, -{ { 322, 323, 673 }, 1, 4 }, -{ { 322, 673, 672 }, 1, 2 }, -{ { 323, 324, 674 }, 1, 4 }, -{ { 323, 674, 673 }, 1, 2 }, -{ { 324, 325, 675 }, 1, 4 }, -{ { 324, 675, 674 }, 1, 2 }, -{ { 325, 326, 676 }, 1, 4 }, -{ { 325, 676, 675 }, 1, 2 }, -{ { 326, 327, 677 }, 1, 4 }, -{ { 326, 677, 676 }, 1, 2 }, -{ { 327, 328, 678 }, 1, 4 }, -{ { 327, 678, 677 }, 1, 2 }, -{ { 328, 329, 679 }, 1, 4 }, -{ { 328, 679, 678 }, 1, 2 }, -{ { 329, 330, 680 }, 1, 4 }, -{ { 329, 680, 679 }, 1, 2 }, -{ { 330, 331, 681 }, 1, 4 }, -{ { 330, 681, 680 }, 1, 2 }, -{ { 331, 332, 681 }, 1, 4 }, -{ { 332, 682, 681 }, 1, 2 }, -{ { 332, 333, 683 }, 1, 4 }, -{ { 332, 683, 682 }, 1, 2 }, -{ { 333, 334, 683 }, 1, 4 }, -{ { 334, 335, 684 }, 1, 4 }, -{ { 334, 684, 683 }, 1, 2 }, -{ { 335, 311, 661 }, 1, 4 }, -{ { 335, 661, 684 }, 1, 2 }, -{ { 336, 337, 686 }, 1, 4 }, -{ { 336, 686, 685 }, 1, 2 }, -{ { 337, 338, 687 }, 1, 4 }, -{ { 337, 687, 686 }, 1, 2 }, -{ { 338, 339, 688 }, 1, 4 }, -{ { 338, 688, 687 }, 1, 2 }, -{ { 339, 336, 685 }, 1, 4 }, -{ { 339, 685, 688 }, 1, 2 }, -{ { 340, 341, 690 }, 1, 4 }, -{ { 340, 690, 689 }, 1, 2 }, -{ { 341, 342, 691 }, 1, 4 }, -{ { 341, 691, 690 }, 1, 2 }, -{ { 342, 343, 692 }, 1, 4 }, -{ { 342, 692, 691 }, 1, 2 }, -{ { 343, 344, 693 }, 1, 4 }, -{ { 343, 693, 692 }, 1, 2 }, -{ { 344, 345, 694 }, 1, 4 }, -{ { 344, 694, 693 }, 1, 2 }, -{ { 345, 346, 695 }, 1, 4 }, -{ { 345, 695, 694 }, 1, 2 }, -{ { 346, 347, 696 }, 1, 4 }, -{ { 346, 696, 695 }, 1, 2 }, -{ { 347, 340, 689 }, 1, 4 }, -{ { 347, 689, 696 }, 1, 2 }, -{ { 706, 698, 697 }, 1, 2 }, -{ { 705, 706, 697 }, 1, 4 }, -{ { 707, 699, 698 }, 1, 2 }, -{ { 706, 707, 698 }, 1, 4 }, -{ { 708, 700, 699 }, 1, 2 }, -{ { 707, 708, 699 }, 1, 4 }, -{ { 709, 701, 700 }, 1, 2 }, -{ { 708, 709, 700 }, 1, 4 }, -{ { 710, 702, 701 }, 1, 2 }, -{ { 709, 710, 701 }, 1, 4 }, -{ { 711, 703, 702 }, 1, 2 }, -{ { 710, 711, 702 }, 1, 4 }, -{ { 712, 704, 703 }, 1, 2 }, -{ { 711, 712, 703 }, 1, 4 }, -{ { 705, 697, 704 }, 1, 2 }, -{ { 712, 705, 704 }, 1, 4 }, -{ { 722, 714, 713 }, 1, 2 }, -{ { 721, 722, 713 }, 1, 4 }, -{ { 723, 715, 714 }, 1, 2 }, -{ { 722, 723, 714 }, 1, 4 }, -{ { 724, 716, 715 }, 1, 2 }, -{ { 723, 724, 715 }, 1, 4 }, -{ { 725, 717, 716 }, 1, 2 }, -{ { 724, 725, 716 }, 1, 4 }, -{ { 726, 718, 717 }, 1, 2 }, -{ { 725, 726, 717 }, 1, 4 }, -{ { 727, 719, 718 }, 1, 2 }, -{ { 726, 727, 718 }, 1, 4 }, -{ { 728, 720, 719 }, 1, 2 }, -{ { 727, 728, 719 }, 1, 4 }, -{ { 721, 713, 720 }, 1, 2 }, -{ { 728, 721, 720 }, 1, 4 }, -{ { 729, 730, 750 }, 1, 4 }, -{ { 729, 750, 749 }, 1, 2 }, -{ { 730, 731, 751 }, 1, 4 }, -{ { 730, 751, 750 }, 1, 2 }, -{ { 731, 732, 752 }, 1, 4 }, -{ { 731, 752, 751 }, 1, 2 }, -{ { 732, 733, 753 }, 1, 4 }, -{ { 732, 753, 752 }, 1, 2 }, -{ { 733, 734, 754 }, 1, 4 }, -{ { 733, 754, 753 }, 1, 2 }, -{ { 734, 735, 755 }, 1, 4 }, -{ { 734, 755, 754 }, 1, 2 }, -{ { 735, 736, 756 }, 1, 4 }, -{ { 735, 756, 755 }, 1, 2 }, -{ { 736, 737, 757 }, 1, 4 }, -{ { 736, 757, 756 }, 1, 2 }, -{ { 737, 738, 758 }, 1, 4 }, -{ { 737, 758, 757 }, 1, 2 }, -{ { 738, 739, 759 }, 1, 4 }, -{ { 738, 759, 758 }, 1, 2 }, -{ { 739, 740, 760 }, 1, 4 }, -{ { 739, 760, 759 }, 1, 2 }, -{ { 740, 741, 761 }, 1, 4 }, -{ { 740, 761, 760 }, 1, 2 }, -{ { 741, 742, 762 }, 1, 4 }, -{ { 741, 762, 761 }, 1, 2 }, -{ { 742, 743, 763 }, 1, 4 }, -{ { 742, 763, 762 }, 1, 2 }, -{ { 743, 744, 764 }, 1, 4 }, -{ { 743, 764, 763 }, 1, 2 }, -{ { 744, 745, 765 }, 1, 4 }, -{ { 744, 765, 764 }, 1, 2 }, -{ { 745, 746, 766 }, 1, 4 }, -{ { 745, 766, 765 }, 1, 2 }, -{ { 746, 747, 767 }, 1, 4 }, -{ { 746, 767, 766 }, 1, 2 }, -{ { 747, 748, 768 }, 1, 4 }, -{ { 747, 768, 767 }, 1, 2 }, -{ { 748, 729, 749 }, 1, 4 }, -{ { 748, 749, 768 }, 1, 2 }, -{ { 769, 770, 800 }, 1, 4 }, -{ { 769, 800, 799 }, 1, 2 }, -{ { 770, 771, 801 }, 1, 4 }, -{ { 770, 801, 800 }, 1, 2 }, -{ { 771, 772, 802 }, 1, 4 }, -{ { 771, 802, 801 }, 1, 2 }, -{ { 772, 773, 803 }, 1, 4 }, -{ { 772, 803, 802 }, 1, 2 }, -{ { 773, 774, 804 }, 1, 4 }, -{ { 773, 804, 803 }, 1, 2 }, -{ { 774, 775, 805 }, 1, 4 }, -{ { 774, 805, 804 }, 1, 2 }, -{ { 775, 776, 806 }, 1, 4 }, -{ { 775, 806, 805 }, 1, 2 }, -{ { 776, 777, 807 }, 1, 4 }, -{ { 776, 807, 806 }, 1, 2 }, -{ { 777, 778, 808 }, 1, 4 }, -{ { 777, 808, 807 }, 1, 2 }, -{ { 778, 779, 809 }, 1, 4 }, -{ { 778, 809, 808 }, 1, 2 }, -{ { 779, 780, 810 }, 1, 4 }, -{ { 779, 810, 809 }, 1, 2 }, -{ { 780, 781, 811 }, 1, 4 }, -{ { 780, 811, 810 }, 1, 2 }, -{ { 781, 782, 812 }, 1, 4 }, -{ { 781, 812, 811 }, 1, 2 }, -{ { 782, 783, 813 }, 1, 4 }, -{ { 782, 813, 812 }, 1, 2 }, -{ { 783, 784, 814 }, 1, 4 }, -{ { 783, 814, 813 }, 1, 2 }, -{ { 784, 785, 815 }, 1, 4 }, -{ { 784, 815, 814 }, 1, 2 }, -{ { 785, 786, 816 }, 1, 4 }, -{ { 785, 816, 815 }, 1, 2 }, -{ { 786, 787, 817 }, 1, 4 }, -{ { 786, 817, 816 }, 1, 2 }, -{ { 787, 788, 818 }, 1, 4 }, -{ { 787, 818, 817 }, 1, 2 }, -{ { 788, 789, 819 }, 1, 4 }, -{ { 788, 819, 818 }, 1, 2 }, -{ { 789, 790, 820 }, 1, 4 }, -{ { 789, 820, 819 }, 1, 2 }, -{ { 790, 791, 821 }, 1, 4 }, -{ { 790, 821, 820 }, 1, 2 }, -{ { 791, 769, 799 }, 1, 4 }, -{ { 791, 799, 821 }, 1, 2 }, -{ { 792, 793, 823 }, 1, 4 }, -{ { 792, 823, 822 }, 1, 2 }, -{ { 793, 794, 824 }, 1, 4 }, -{ { 793, 824, 823 }, 1, 2 }, -{ { 794, 795, 825 }, 1, 4 }, -{ { 794, 825, 824 }, 1, 2 }, -{ { 795, 796, 826 }, 1, 4 }, -{ { 795, 826, 825 }, 1, 2 }, -{ { 796, 797, 827 }, 1, 4 }, -{ { 796, 827, 826 }, 1, 2 }, -{ { 797, 798, 828 }, 1, 4 }, -{ { 797, 828, 827 }, 1, 2 }, -{ { 798, 792, 822 }, 1, 4 }, -{ { 798, 822, 828 }, 1, 2 }, -{ { 829, 830, 846 }, 0, 6 }, -{ { 829, 846, 845 }, 0, 3 }, -{ { 831, 832, 848 }, 0, 6 }, -{ { 831, 848, 847 }, 0, 3 }, -{ { 833, 834, 850 }, 0, 6 }, -{ { 833, 850, 849 }, 0, 3 }, -{ { 836, 835, 851 }, 0, 6 }, -{ { 836, 851, 852 }, 0, 3 }, -{ { 837, 838, 854 }, 1, 6 }, -{ { 837, 854, 853 }, 1, 3 }, -{ { 839, 840, 856 }, 1, 6 }, -{ { 839, 856, 855 }, 1, 3 }, -{ { 841, 842, 858 }, 1, 6 }, -{ { 841, 858, 857 }, 1, 3 }, -{ { 843, 844, 860 }, 1, 6 }, -{ { 843, 860, 859 }, 1, 3 }, -{ { 919, 918, 917 }, 0, 6 }, -{ { 881, 880, 879 }, 0, 6 }, -{ { 920, 919, 917 }, 0, 4 }, -{ { 881, 879, 878 }, 0, 2 }, -{ { 882, 881, 878 }, 0, 4 }, -{ { 882, 878, 877 }, 0, 2 }, -{ { 883, 882, 877 }, 0, 4 }, -{ { 883, 877, 876 }, 0, 2 }, -{ { 884, 883, 876 }, 0, 4 }, -{ { 920, 917, 916 }, 0, 2 }, -{ { 921, 920, 916 }, 0, 4 }, -{ { 921, 916, 915 }, 0, 2 }, -{ { 922, 921, 915 }, 0, 4 }, -{ { 922, 915, 914 }, 0, 2 }, -{ { 884, 876, 875 }, 0, 2 }, -{ { 885, 884, 875 }, 0, 4 }, -{ { 923, 922, 914 }, 0, 4 }, -{ { 923, 914, 913 }, 0, 2 }, -{ { 885, 875, 874 }, 0, 2 }, -{ { 886, 885, 874 }, 0, 4 }, -{ { 923, 913, 912 }, 0, 2 }, -{ { 924, 923, 912 }, 0, 4 }, -{ { 924, 912, 911 }, 0, 2 }, -{ { 925, 924, 911 }, 0, 4 }, -{ { 925, 911, 910 }, 0, 2 }, -{ { 926, 925, 910 }, 0, 4 }, -{ { 926, 910, 909 }, 0, 2 }, -{ { 927, 926, 909 }, 0, 4 }, -{ { 927, 909, 908 }, 0, 2 }, -{ { 928, 927, 908 }, 0, 4 }, -{ { 928, 908, 907 }, 0, 2 }, -{ { 929, 928, 907 }, 0, 4 }, -{ { 929, 907, 906 }, 0, 2 }, -{ { 929, 906, 905 }, 0, 2 }, -{ { 930, 929, 905 }, 0, 4 }, -{ { 930, 905, 904 }, 0, 2 }, -{ { 930, 904, 903 }, 0, 2 }, -{ { 931, 930, 903 }, 0, 4 }, -{ { 931, 903, 902 }, 0, 2 }, -{ { 931, 902, 901 }, 0, 2 }, -{ { 932, 931, 901 }, 0, 4 }, -{ { 932, 901, 900 }, 0, 2 }, -{ { 932, 900, 899 }, 0, 2 }, -{ { 933, 932, 899 }, 0, 4 }, -{ { 934, 933, 899 }, 0, 4 }, -{ { 887, 886, 874 }, 0, 4 }, -{ { 887, 874, 873 }, 0, 2 }, -{ { 888, 887, 873 }, 0, 4 }, -{ { 888, 873, 872 }, 0, 2 }, -{ { 889, 888, 872 }, 0, 4 }, -{ { 889, 872, 871 }, 0, 2 }, -{ { 890, 889, 871 }, 0, 4 }, -{ { 890, 871, 870 }, 0, 2 }, -{ { 891, 890, 870 }, 0, 4 }, -{ { 892, 891, 870 }, 0, 4 }, -{ { 892, 870, 869 }, 0, 2 }, -{ { 893, 892, 869 }, 0, 4 }, -{ { 894, 893, 869 }, 0, 4 }, -{ { 894, 869, 868 }, 0, 2 }, -{ { 895, 894, 868 }, 0, 4 }, -{ { 896, 895, 868 }, 0, 4 }, -{ { 896, 868, 867 }, 0, 2 }, -{ { 897, 896, 867 }, 0, 4 }, -{ { 898, 897, 867 }, 0, 4 }, -{ { 898, 867, 866 }, 0, 2 }, -{ { 899, 898, 866 }, 0, 4 }, -{ { 899, 866, 865 }, 0, 2 }, -{ { 934, 899, 865 }, 0, 0 }, -{ { 934, 865, 864 }, 0, 2 }, -{ { 935, 934, 864 }, 0, 4 }, -{ { 935, 864, 863 }, 0, 2 }, -{ { 861, 935, 863 }, 0, 4 }, -{ { 862, 861, 863 }, 0, 5 }, -{ { 959, 943, 942 }, 0, 2 }, -{ { 960, 959, 942 }, 0, 4 }, -{ { 960, 942, 941 }, 0, 2 }, -{ { 961, 960, 941 }, 0, 4 }, -{ { 961, 941, 940 }, 0, 2 }, -{ { 962, 961, 940 }, 0, 4 }, -{ { 962, 940, 939 }, 0, 2 }, -{ { 963, 962, 939 }, 0, 4 }, -{ { 963, 939, 938 }, 0, 2 }, -{ { 964, 963, 938 }, 0, 4 }, -{ { 964, 938, 937 }, 0, 2 }, -{ { 965, 964, 937 }, 0, 4 }, -{ { 937, 936, 951 }, 0, 4 }, -{ { 951, 965, 937 }, 0, 4 }, -{ { 951, 936, 950 }, 0, 2 }, -{ { 952, 951, 950 }, 0, 4 }, -{ { 952, 950, 949 }, 0, 2 }, -{ { 953, 952, 949 }, 0, 4 }, -{ { 944, 943, 959 }, 0, 4 }, -{ { 944, 959, 958 }, 0, 2 }, -{ { 945, 944, 958 }, 0, 4 }, -{ { 945, 958, 957 }, 0, 2 }, -{ { 946, 945, 957 }, 0, 4 }, -{ { 946, 957, 956 }, 0, 2 }, -{ { 947, 946, 956 }, 0, 4 }, -{ { 947, 956, 955 }, 0, 2 }, -{ { 948, 947, 955 }, 0, 4 }, -{ { 948, 955, 954 }, 0, 2 }, -{ { 949, 948, 954 }, 0, 4 }, -{ { 953, 949, 954 }, 0, 1 }, -{ { 984, 983, 982 }, 1, 6 }, -{ { 984, 982, 981 }, 1, 2 }, -{ { 984, 981, 980 }, 1, 2 }, -{ { 985, 984, 980 }, 1, 4 }, -{ { 985, 980, 979 }, 1, 2 }, -{ { 986, 985, 979 }, 1, 4 }, -{ { 987, 986, 979 }, 1, 4 }, -{ { 987, 979, 978 }, 1, 2 }, -{ { 988, 987, 978 }, 1, 4 }, -{ { 988, 978, 977 }, 1, 2 }, -{ { 989, 988, 977 }, 1, 4 }, -{ { 989, 977, 976 }, 1, 2 }, -{ { 990, 989, 976 }, 1, 4 }, -{ { 991, 990, 976 }, 1, 4 }, -{ { 992, 991, 976 }, 1, 4 }, -{ { 992, 976, 975 }, 1, 2 }, -{ { 993, 992, 975 }, 1, 4 }, -{ { 966, 1001, 1000 }, 1, 6 }, -{ { 967, 966, 1000 }, 1, 4 }, -{ { 1000, 999, 998 }, 1, 6 }, -{ { 1000, 998, 997 }, 1, 2 }, -{ { 967, 1000, 997 }, 1, 0 }, -{ { 970, 969, 968 }, 1, 6 }, -{ { 970, 968, 967 }, 1, 2 }, -{ { 970, 967, 997 }, 1, 0 }, -{ { 970, 997, 996 }, 1, 2 }, -{ { 971, 970, 996 }, 1, 4 }, -{ { 972, 971, 996 }, 1, 4 }, -{ { 973, 972, 996 }, 1, 4 }, -{ { 973, 996, 995 }, 1, 2 }, -{ { 974, 973, 995 }, 1, 4 }, -{ { 974, 995, 994 }, 1, 2 }, -{ { 975, 974, 994 }, 1, 4 }, -{ { 993, 975, 994 }, 1, 1 }, -{ { 1003, 1002, 1013 }, 1, 6 }, -{ { 1003, 1013, 1012 }, 1, 2 }, -{ { 1011, 1010, 1009 }, 1, 6 }, -{ { 1012, 1011, 1009 }, 1, 4 }, -{ { 1009, 1008, 1007 }, 1, 6 }, -{ { 1009, 1007, 1006 }, 1, 2 }, -{ { 1005, 1004, 1003 }, 1, 6 }, -{ { 1006, 1005, 1003 }, 1, 4 }, -{ { 1006, 1003, 1012 }, 1, 0 }, -{ { 1006, 1012, 1009 }, 1, 0 }, -{ { 1014, 1021, 1020 }, 1, 6 }, -{ { 1015, 1014, 1020 }, 1, 4 }, -{ { 1020, 1019, 1018 }, 1, 6 }, -{ { 1020, 1018, 1017 }, 1, 2 }, -{ { 1015, 1020, 1017 }, 1, 0 }, -{ { 1016, 1015, 1017 }, 1, 5 }, -{ { 1022, 1031, 1030 }, 1, 6 }, -{ { 1023, 1022, 1030 }, 1, 4 }, -{ { 1024, 1023, 1030 }, 1, 4 }, -{ { 1024, 1030, 1029 }, 1, 2 }, -{ { 1024, 1029, 1028 }, 1, 2 }, -{ { 1025, 1024, 1028 }, 1, 4 }, -{ { 1026, 1025, 1028 }, 1, 4 }, -{ { 1026, 1028, 1027 }, 1, 3 }, -{ { 1032, 1035, 1034 }, 1, 6 }, -{ { 1033, 1032, 1034 }, 1, 5 }, -{ { 1036, 1054, 1053 }, 1, 6 }, -{ { 1037, 1036, 1053 }, 1, 4 }, -{ { 1053, 1052, 1039 }, 1, 4 }, -{ { 1048, 1047, 1046 }, 1, 6 }, -{ { 1048, 1046, 1045 }, 1, 2 }, -{ { 1048, 1045, 1044 }, 1, 2 }, -{ { 1049, 1048, 1044 }, 1, 4 }, -{ { 1049, 1044, 1043 }, 1, 2 }, -{ { 1050, 1049, 1043 }, 1, 4 }, -{ { 1050, 1043, 1042 }, 1, 2 }, -{ { 1050, 1042, 1041 }, 1, 2 }, -{ { 1050, 1041, 1040 }, 1, 2 }, -{ { 1051, 1050, 1040 }, 1, 4 }, -{ { 1051, 1040, 1039 }, 1, 2 }, -{ { 1039, 1038, 1037 }, 1, 6 }, -{ { 1039, 1037, 1053 }, 1, 0 }, -{ { 1051, 1039, 1052 }, 1, 1 }, -{ { 1063, 1062, 1078 }, 1, 4 }, -{ { 1064, 1063, 1078 }, 1, 4 }, -{ { 1064, 1078, 1084 }, 1, 2 }, -{ { 1056, 1055, 1077 }, 1, 6 }, -{ { 1065, 1064, 1084 }, 1, 4 }, -{ { 1065, 1084, 1083 }, 1, 2 }, -{ { 1066, 1065, 1083 }, 1, 4 }, -{ { 1066, 1083, 1082 }, 1, 2 }, -{ { 1067, 1066, 1082 }, 1, 4 }, -{ { 1068, 1067, 1082 }, 1, 4 }, -{ { 1069, 1068, 1082 }, 1, 4 }, -{ { 1069, 1082, 1081 }, 1, 2 }, -{ { 1070, 1069, 1081 }, 1, 4 }, -{ { 1070, 1081, 1080 }, 1, 2 }, -{ { 1071, 1070, 1080 }, 1, 4 }, -{ { 1071, 1080, 1079 }, 1, 2 }, -{ { 1072, 1071, 1079 }, 1, 4 }, -{ { 1073, 1072, 1079 }, 1, 4 }, -{ { 1073, 1079, 1078 }, 1, 2 }, -{ { 1073, 1078, 1062 }, 1, 0 }, -{ { 1073, 1062, 1061 }, 1, 2 }, -{ { 1073, 1061, 1060 }, 1, 2 }, -{ { 1074, 1073, 1060 }, 1, 4 }, -{ { 1074, 1060, 1059 }, 1, 2 }, -{ { 1075, 1074, 1059 }, 1, 4 }, -{ { 1075, 1059, 1058 }, 1, 2 }, -{ { 1076, 1075, 1058 }, 1, 4 }, -{ { 1076, 1058, 1057 }, 1, 2 }, -{ { 1076, 1057, 1056 }, 1, 2 }, -{ { 1077, 1076, 1056 }, 1, 4 }, -{ { 1085, 1102, 1101 }, 1, 6 }, -{ { 1086, 1085, 1101 }, 1, 4 }, -{ { 1086, 1101, 1100 }, 1, 2 }, -{ { 1100, 1099, 1088 }, 1, 4 }, -{ { 1088, 1087, 1086 }, 1, 6 }, -{ { 1088, 1086, 1100 }, 1, 0 }, -{ { 1088, 1099, 1098 }, 1, 2 }, -{ { 1089, 1088, 1098 }, 1, 4 }, -{ { 1089, 1098, 1097 }, 1, 2 }, -{ { 1090, 1089, 1097 }, 1, 4 }, -{ { 1096, 1095, 1094 }, 1, 6 }, -{ { 1090, 1097, 1096 }, 1, 2 }, -{ { 1091, 1090, 1096 }, 1, 4 }, -{ { 1096, 1094, 1093 }, 1, 2 }, -{ { 1092, 1091, 1096 }, 1, 4 }, -{ { 1093, 1092, 1096 }, 1, 4 }, -{ { 1133, 1149, 1148 }, 1, 2 }, -{ { 1107, 1106, 1133 }, 1, 4 }, -{ { 1108, 1107, 1133 }, 1, 4 }, -{ { 1109, 1108, 1133 }, 1, 4 }, -{ { 1110, 1109, 1133 }, 1, 4 }, -{ { 1148, 1110, 1133 }, 1, 0 }, -{ { 1104, 1103, 1137 }, 1, 6 }, -{ { 1104, 1137, 1136 }, 1, 2 }, -{ { 1126, 1125, 1124 }, 1, 6 }, -{ { 1127, 1126, 1124 }, 1, 4 }, -{ { 1127, 1124, 1123 }, 1, 2 }, -{ { 1128, 1127, 1123 }, 1, 4 }, -{ { 1128, 1123, 1122 }, 1, 2 }, -{ { 1129, 1128, 1122 }, 1, 4 }, -{ { 1130, 1129, 1122 }, 1, 4 }, -{ { 1130, 1122, 1121 }, 1, 2 }, -{ { 1131, 1130, 1121 }, 1, 4 }, -{ { 1132, 1131, 1121 }, 1, 4 }, -{ { 1132, 1121, 1120 }, 1, 2 }, -{ { 1132, 1120, 1119 }, 1, 2 }, -{ { 1132, 1119, 1139 }, 1, 0 }, -{ { 1104, 1136, 1135 }, 1, 2 }, -{ { 1110, 1148, 1147 }, 1, 2 }, -{ { 1111, 1110, 1147 }, 1, 4 }, -{ { 1111, 1147, 1146 }, 1, 2 }, -{ { 1105, 1104, 1135 }, 1, 4 }, -{ { 1112, 1111, 1146 }, 1, 4 }, -{ { 1112, 1146, 1145 }, 1, 2 }, -{ { 1113, 1112, 1145 }, 1, 4 }, -{ { 1113, 1145, 1144 }, 1, 2 }, -{ { 1114, 1113, 1144 }, 1, 4 }, -{ { 1115, 1114, 1144 }, 1, 4 }, -{ { 1115, 1144, 1143 }, 1, 2 }, -{ { 1116, 1115, 1143 }, 1, 4 }, -{ { 1117, 1116, 1143 }, 1, 4 }, -{ { 1117, 1143, 1142 }, 1, 2 }, -{ { 1117, 1142, 1141 }, 1, 2 }, -{ { 1118, 1117, 1141 }, 1, 4 }, -{ { 1118, 1141, 1140 }, 1, 2 }, -{ { 1119, 1118, 1140 }, 1, 4 }, -{ { 1119, 1140, 1139 }, 1, 2 }, -{ { 1132, 1139, 1138 }, 1, 2 }, -{ { 1138, 1133, 1132 }, 1, 2 }, -{ { 1133, 1138, 1149 }, 1, 2 }, -{ { 1134, 1133, 1106 }, 1, 4 }, -{ { 1135, 1134, 1106 }, 1, 4 }, -{ { 1135, 1106, 1105 }, 1, 2 }, -{ { 1163, 1165, 1164 }, 1, 3 }, -{ { 1165, 1163, 1162 }, 1, 2 }, -{ { 1151, 1150, 1171 }, 1, 6 }, -{ { 1165, 1162, 1161 }, 1, 2 }, -{ { 1166, 1165, 1161 }, 1, 4 }, -{ { 1166, 1161, 1160 }, 1, 2 }, -{ { 1167, 1166, 1160 }, 1, 4 }, -{ { 1167, 1160, 1159 }, 1, 2 }, -{ { 1168, 1167, 1159 }, 1, 4 }, -{ { 1168, 1159, 1158 }, 1, 2 }, -{ { 1169, 1168, 1158 }, 1, 4 }, -{ { 1169, 1158, 1157 }, 1, 2 }, -{ { 1170, 1169, 1157 }, 1, 4 }, -{ { 1170, 1157, 1156 }, 1, 2 }, -{ { 1170, 1156, 1155 }, 1, 2 }, -{ { 1170, 1155, 1154 }, 1, 2 }, -{ { 1170, 1154, 1153 }, 1, 2 }, -{ { 1171, 1170, 1153 }, 1, 4 }, -{ { 1171, 1153, 1152 }, 1, 2 }, -{ { 1171, 1152, 1151 }, 1, 2 }, -{ { 1191, 1190, 1189 }, 1, 6 }, -{ { 1191, 1189, 1188 }, 1, 2 }, -{ { 1188, 1187, 1186 }, 1, 6 }, -{ { 1188, 1186, 1185 }, 1, 2 }, -{ { 1184, 1183, 1182 }, 1, 6 }, -{ { 1173, 1172, 1196 }, 1, 6 }, -{ { 1174, 1173, 1196 }, 1, 4 }, -{ { 1175, 1174, 1196 }, 1, 4 }, -{ { 1175, 1196, 1195 }, 1, 2 }, -{ { 1176, 1175, 1195 }, 1, 4 }, -{ { 1176, 1195, 1194 }, 1, 2 }, -{ { 1177, 1176, 1194 }, 1, 4 }, -{ { 1178, 1177, 1194 }, 1, 4 }, -{ { 1179, 1178, 1194 }, 1, 4 }, -{ { 1179, 1194, 1193 }, 1, 2 }, -{ { 1180, 1179, 1193 }, 1, 4 }, -{ { 1181, 1180, 1193 }, 1, 4 }, -{ { 1181, 1193, 1192 }, 1, 2 }, -{ { 1182, 1181, 1192 }, 1, 4 }, -{ { 1182, 1192, 1191 }, 1, 2 }, -{ { 1182, 1191, 1188 }, 1, 0 }, -{ { 1182, 1188, 1185 }, 1, 0 }, -{ { 1182, 1185, 1184 }, 1, 2 }, -{ { 1197, 1200, 1199 }, 1, 6 }, -{ { 1198, 1197, 1199 }, 1, 5 }, -{ { 1203, 1202, 1201 }, 1, 6 }, -{ { 1204, 1203, 1201 }, 1, 4 }, -{ { 1208, 1207, 1206 }, 1, 6 }, -{ { 1208, 1206, 1205 }, 1, 2 }, -{ { 1201, 1208, 1205 }, 1, 4 }, -{ { 1204, 1201, 1205 }, 1, 1 }, -{ { 1265, 1266, 1267 }, 0, 6 }, -{ { 1227, 1228, 1229 }, 0, 6 }, -{ { 1265, 1267, 1268 }, 0, 2 }, -{ { 1226, 1227, 1229 }, 0, 4 }, -{ { 1226, 1229, 1230 }, 0, 2 }, -{ { 1225, 1226, 1230 }, 0, 4 }, -{ { 1225, 1230, 1231 }, 0, 2 }, -{ { 1224, 1225, 1231 }, 0, 4 }, -{ { 1224, 1231, 1232 }, 0, 2 }, -{ { 1264, 1265, 1268 }, 0, 4 }, -{ { 1264, 1268, 1269 }, 0, 2 }, -{ { 1263, 1264, 1269 }, 0, 4 }, -{ { 1263, 1269, 1270 }, 0, 2 }, -{ { 1262, 1263, 1270 }, 0, 4 }, -{ { 1223, 1224, 1232 }, 0, 4 }, -{ { 1223, 1232, 1233 }, 0, 2 }, -{ { 1262, 1270, 1271 }, 0, 2 }, -{ { 1261, 1262, 1271 }, 0, 4 }, -{ { 1222, 1223, 1233 }, 0, 4 }, -{ { 1222, 1233, 1234 }, 0, 2 }, -{ { 1260, 1261, 1271 }, 0, 4 }, -{ { 1260, 1271, 1272 }, 0, 2 }, -{ { 1259, 1260, 1272 }, 0, 4 }, -{ { 1259, 1272, 1273 }, 0, 2 }, -{ { 1258, 1259, 1273 }, 0, 4 }, -{ { 1258, 1273, 1274 }, 0, 2 }, -{ { 1257, 1258, 1274 }, 0, 4 }, -{ { 1257, 1274, 1275 }, 0, 2 }, -{ { 1256, 1257, 1275 }, 0, 4 }, -{ { 1256, 1275, 1276 }, 0, 2 }, -{ { 1255, 1256, 1276 }, 0, 4 }, -{ { 1255, 1276, 1277 }, 0, 2 }, -{ { 1254, 1255, 1277 }, 0, 4 }, -{ { 1253, 1254, 1277 }, 0, 4 }, -{ { 1253, 1277, 1278 }, 0, 2 }, -{ { 1252, 1253, 1278 }, 0, 4 }, -{ { 1251, 1252, 1278 }, 0, 4 }, -{ { 1251, 1278, 1279 }, 0, 2 }, -{ { 1250, 1251, 1279 }, 0, 4 }, -{ { 1249, 1250, 1279 }, 0, 4 }, -{ { 1249, 1279, 1280 }, 0, 2 }, -{ { 1248, 1249, 1280 }, 0, 4 }, -{ { 1247, 1248, 1280 }, 0, 4 }, -{ { 1247, 1280, 1281 }, 0, 2 }, -{ { 1247, 1281, 1282 }, 0, 2 }, -{ { 1222, 1234, 1235 }, 0, 2 }, -{ { 1221, 1222, 1235 }, 0, 4 }, -{ { 1221, 1235, 1236 }, 0, 2 }, -{ { 1220, 1221, 1236 }, 0, 4 }, -{ { 1220, 1236, 1237 }, 0, 2 }, -{ { 1219, 1220, 1237 }, 0, 4 }, -{ { 1219, 1237, 1238 }, 0, 2 }, -{ { 1218, 1219, 1238 }, 0, 4 }, -{ { 1218, 1238, 1239 }, 0, 2 }, -{ { 1218, 1239, 1240 }, 0, 2 }, -{ { 1217, 1218, 1240 }, 0, 4 }, -{ { 1217, 1240, 1241 }, 0, 2 }, -{ { 1217, 1241, 1242 }, 0, 2 }, -{ { 1216, 1217, 1242 }, 0, 4 }, -{ { 1216, 1242, 1243 }, 0, 2 }, -{ { 1216, 1243, 1244 }, 0, 2 }, -{ { 1215, 1216, 1244 }, 0, 4 }, -{ { 1215, 1244, 1245 }, 0, 2 }, -{ { 1215, 1245, 1246 }, 0, 2 }, -{ { 1214, 1215, 1246 }, 0, 4 }, -{ { 1214, 1246, 1247 }, 0, 2 }, -{ { 1213, 1214, 1247 }, 0, 4 }, -{ { 1213, 1247, 1282 }, 0, 0 }, -{ { 1212, 1213, 1282 }, 0, 4 }, -{ { 1212, 1282, 1283 }, 0, 2 }, -{ { 1211, 1212, 1283 }, 0, 4 }, -{ { 1211, 1283, 1209 }, 0, 2 }, -{ { 1211, 1209, 1210 }, 0, 3 }, -{ { 1290, 1291, 1307 }, 0, 4 }, -{ { 1290, 1307, 1308 }, 0, 2 }, -{ { 1289, 1290, 1308 }, 0, 4 }, -{ { 1289, 1308, 1309 }, 0, 2 }, -{ { 1288, 1289, 1309 }, 0, 4 }, -{ { 1288, 1309, 1310 }, 0, 2 }, -{ { 1287, 1288, 1310 }, 0, 4 }, -{ { 1287, 1310, 1311 }, 0, 2 }, -{ { 1286, 1287, 1311 }, 0, 4 }, -{ { 1286, 1311, 1312 }, 0, 2 }, -{ { 1285, 1286, 1312 }, 0, 4 }, -{ { 1285, 1312, 1313 }, 0, 2 }, -{ { 1284, 1285, 1313 }, 0, 4 }, -{ { 1284, 1313, 1299 }, 0, 2 }, -{ { 1298, 1284, 1299 }, 0, 4 }, -{ { 1298, 1299, 1300 }, 0, 2 }, -{ { 1297, 1298, 1300 }, 0, 4 }, -{ { 1297, 1300, 1301 }, 0, 2 }, -{ { 1307, 1291, 1292 }, 0, 2 }, -{ { 1306, 1307, 1292 }, 0, 4 }, -{ { 1306, 1292, 1293 }, 0, 2 }, -{ { 1305, 1306, 1293 }, 0, 4 }, -{ { 1305, 1293, 1294 }, 0, 2 }, -{ { 1304, 1305, 1294 }, 0, 4 }, -{ { 1304, 1294, 1295 }, 0, 2 }, -{ { 1303, 1304, 1295 }, 0, 4 }, -{ { 1303, 1295, 1296 }, 0, 2 }, -{ { 1302, 1303, 1296 }, 0, 4 }, -{ { 1302, 1296, 1297 }, 0, 2 }, -{ { 1302, 1297, 1301 }, 0, 1 }, -{ { 1330, 1331, 1332 }, 1, 6 }, -{ { 1329, 1330, 1332 }, 1, 4 }, -{ { 1328, 1329, 1332 }, 1, 4 }, -{ { 1328, 1332, 1333 }, 1, 2 }, -{ { 1327, 1328, 1333 }, 1, 4 }, -{ { 1327, 1333, 1334 }, 1, 2 }, -{ { 1327, 1334, 1335 }, 1, 2 }, -{ { 1326, 1327, 1335 }, 1, 4 }, -{ { 1326, 1335, 1336 }, 1, 2 }, -{ { 1325, 1326, 1336 }, 1, 4 }, -{ { 1325, 1336, 1337 }, 1, 2 }, -{ { 1324, 1325, 1337 }, 1, 4 }, -{ { 1324, 1337, 1338 }, 1, 2 }, -{ { 1324, 1338, 1339 }, 1, 2 }, -{ { 1324, 1339, 1340 }, 1, 2 }, -{ { 1323, 1324, 1340 }, 1, 4 }, -{ { 1323, 1340, 1341 }, 1, 2 }, -{ { 1348, 1349, 1314 }, 1, 6 }, -{ { 1348, 1314, 1315 }, 1, 2 }, -{ { 1346, 1347, 1348 }, 1, 6 }, -{ { 1345, 1346, 1348 }, 1, 4 }, -{ { 1345, 1348, 1315 }, 1, 0 }, -{ { 1316, 1317, 1318 }, 1, 6 }, -{ { 1315, 1316, 1318 }, 1, 4 }, -{ { 1345, 1315, 1318 }, 1, 0 }, -{ { 1344, 1345, 1318 }, 1, 4 }, -{ { 1344, 1318, 1319 }, 1, 2 }, -{ { 1344, 1319, 1320 }, 1, 2 }, -{ { 1344, 1320, 1321 }, 1, 2 }, -{ { 1343, 1344, 1321 }, 1, 4 }, -{ { 1343, 1321, 1322 }, 1, 2 }, -{ { 1342, 1343, 1322 }, 1, 4 }, -{ { 1342, 1322, 1323 }, 1, 2 }, -{ { 1342, 1323, 1341 }, 1, 1 }, -{ { 1361, 1350, 1351 }, 1, 6 }, -{ { 1360, 1361, 1351 }, 1, 4 }, -{ { 1357, 1358, 1359 }, 1, 6 }, -{ { 1357, 1359, 1360 }, 1, 2 }, -{ { 1355, 1356, 1357 }, 1, 6 }, -{ { 1354, 1355, 1357 }, 1, 4 }, -{ { 1351, 1352, 1353 }, 1, 6 }, -{ { 1351, 1353, 1354 }, 1, 2 }, -{ { 1360, 1351, 1354 }, 1, 0 }, -{ { 1357, 1360, 1354 }, 1, 0 }, -{ { 1368, 1369, 1362 }, 1, 6 }, -{ { 1368, 1362, 1363 }, 1, 2 }, -{ { 1366, 1367, 1368 }, 1, 6 }, -{ { 1365, 1366, 1368 }, 1, 4 }, -{ { 1365, 1368, 1363 }, 1, 0 }, -{ { 1365, 1363, 1364 }, 1, 3 }, -{ { 1378, 1379, 1370 }, 1, 6 }, -{ { 1378, 1370, 1371 }, 1, 2 }, -{ { 1378, 1371, 1372 }, 1, 2 }, -{ { 1377, 1378, 1372 }, 1, 4 }, -{ { 1376, 1377, 1372 }, 1, 4 }, -{ { 1376, 1372, 1373 }, 1, 2 }, -{ { 1376, 1373, 1374 }, 1, 2 }, -{ { 1375, 1376, 1374 }, 1, 5 }, -{ { 1382, 1383, 1380 }, 1, 6 }, -{ { 1382, 1380, 1381 }, 1, 3 }, -{ { 1401, 1402, 1384 }, 1, 6 }, -{ { 1401, 1384, 1385 }, 1, 2 }, -{ { 1400, 1401, 1385 }, 1, 4 }, -{ { 1394, 1395, 1396 }, 1, 6 }, -{ { 1393, 1394, 1396 }, 1, 4 }, -{ { 1392, 1393, 1396 }, 1, 4 }, -{ { 1392, 1396, 1397 }, 1, 2 }, -{ { 1391, 1392, 1397 }, 1, 4 }, -{ { 1391, 1397, 1398 }, 1, 2 }, -{ { 1390, 1391, 1398 }, 1, 4 }, -{ { 1389, 1390, 1398 }, 1, 4 }, -{ { 1388, 1389, 1398 }, 1, 4 }, -{ { 1388, 1398, 1399 }, 1, 2 }, -{ { 1387, 1388, 1399 }, 1, 4 }, -{ { 1385, 1386, 1387 }, 1, 6 }, -{ { 1400, 1385, 1387 }, 1, 0 }, -{ { 1400, 1387, 1399 }, 1, 1 }, -{ { 1426, 1410, 1411 }, 1, 2 }, -{ { 1426, 1411, 1412 }, 1, 2 }, -{ { 1432, 1426, 1412 }, 1, 4 }, -{ { 1425, 1403, 1404 }, 1, 6 }, -{ { 1432, 1412, 1413 }, 1, 2 }, -{ { 1431, 1432, 1413 }, 1, 4 }, -{ { 1431, 1413, 1414 }, 1, 2 }, -{ { 1430, 1431, 1414 }, 1, 4 }, -{ { 1430, 1414, 1415 }, 1, 2 }, -{ { 1430, 1415, 1416 }, 1, 2 }, -{ { 1430, 1416, 1417 }, 1, 2 }, -{ { 1429, 1430, 1417 }, 1, 4 }, -{ { 1429, 1417, 1418 }, 1, 2 }, -{ { 1428, 1429, 1418 }, 1, 4 }, -{ { 1428, 1418, 1419 }, 1, 2 }, -{ { 1427, 1428, 1419 }, 1, 4 }, -{ { 1427, 1419, 1420 }, 1, 2 }, -{ { 1427, 1420, 1421 }, 1, 2 }, -{ { 1426, 1427, 1421 }, 1, 4 }, -{ { 1410, 1426, 1421 }, 1, 0 }, -{ { 1409, 1410, 1421 }, 1, 4 }, -{ { 1408, 1409, 1421 }, 1, 4 }, -{ { 1408, 1421, 1422 }, 1, 2 }, -{ { 1407, 1408, 1422 }, 1, 4 }, -{ { 1407, 1422, 1423 }, 1, 2 }, -{ { 1406, 1407, 1423 }, 1, 4 }, -{ { 1406, 1423, 1424 }, 1, 2 }, -{ { 1405, 1406, 1424 }, 1, 4 }, -{ { 1404, 1405, 1424 }, 1, 4 }, -{ { 1404, 1424, 1425 }, 1, 2 }, -{ { 1449, 1450, 1433 }, 1, 6 }, -{ { 1449, 1433, 1434 }, 1, 2 }, -{ { 1448, 1449, 1434 }, 1, 4 }, -{ { 1447, 1448, 1434 }, 1, 4 }, -{ { 1434, 1435, 1436 }, 1, 6 }, -{ { 1447, 1434, 1436 }, 1, 0 }, -{ { 1446, 1447, 1436 }, 1, 4 }, -{ { 1446, 1436, 1437 }, 1, 2 }, -{ { 1445, 1446, 1437 }, 1, 4 }, -{ { 1445, 1437, 1438 }, 1, 2 }, -{ { 1442, 1443, 1444 }, 1, 6 }, -{ { 1444, 1445, 1438 }, 1, 4 }, -{ { 1444, 1438, 1439 }, 1, 2 }, -{ { 1441, 1442, 1444 }, 1, 4 }, -{ { 1444, 1439, 1440 }, 1, 2 }, -{ { 1444, 1440, 1441 }, 1, 2 }, -{ { 1499, 1486, 1454 }, 1, 4 }, -{ { 1499, 1454, 1455 }, 1, 2 }, -{ { 1499, 1455, 1456 }, 1, 2 }, -{ { 1499, 1456, 1457 }, 1, 2 }, -{ { 1499, 1457, 1458 }, 1, 2 }, -{ { 1498, 1499, 1458 }, 1, 4 }, -{ { 1485, 1451, 1452 }, 1, 6 }, -{ { 1472, 1473, 1474 }, 1, 6 }, -{ { 1484, 1485, 1452 }, 1, 4 }, -{ { 1472, 1474, 1475 }, 1, 2 }, -{ { 1471, 1472, 1475 }, 1, 4 }, -{ { 1471, 1475, 1476 }, 1, 2 }, -{ { 1470, 1471, 1476 }, 1, 4 }, -{ { 1470, 1476, 1477 }, 1, 2 }, -{ { 1470, 1477, 1478 }, 1, 2 }, -{ { 1469, 1470, 1478 }, 1, 4 }, -{ { 1469, 1478, 1479 }, 1, 2 }, -{ { 1469, 1479, 1480 }, 1, 2 }, -{ { 1468, 1469, 1480 }, 1, 4 }, -{ { 1468, 1480, 1481 }, 1, 2 }, -{ { 1467, 1468, 1481 }, 1, 4 }, -{ { 1483, 1484, 1452 }, 1, 4 }, -{ { 1497, 1498, 1458 }, 1, 4 }, -{ { 1497, 1458, 1459 }, 1, 2 }, -{ { 1496, 1497, 1459 }, 1, 4 }, -{ { 1483, 1452, 1453 }, 1, 2 }, -{ { 1496, 1459, 1460 }, 1, 2 }, -{ { 1495, 1496, 1460 }, 1, 4 }, -{ { 1495, 1460, 1461 }, 1, 2 }, -{ { 1494, 1495, 1461 }, 1, 4 }, -{ { 1494, 1461, 1462 }, 1, 2 }, -{ { 1494, 1462, 1463 }, 1, 2 }, -{ { 1493, 1494, 1463 }, 1, 4 }, -{ { 1493, 1463, 1464 }, 1, 2 }, -{ { 1492, 1493, 1464 }, 1, 4 }, -{ { 1492, 1464, 1465 }, 1, 2 }, -{ { 1491, 1492, 1465 }, 1, 4 }, -{ { 1490, 1491, 1465 }, 1, 4 }, -{ { 1489, 1490, 1465 }, 1, 4 }, -{ { 1489, 1465, 1466 }, 1, 2 }, -{ { 1488, 1489, 1466 }, 1, 4 }, -{ { 1488, 1466, 1467 }, 1, 2 }, -{ { 1487, 1488, 1467 }, 1, 4 }, -{ { 1487, 1467, 1481 }, 1, 0 }, -{ { 1486, 1487, 1481 }, 1, 4 }, -{ { 1454, 1486, 1481 }, 1, 0 }, -{ { 1454, 1481, 1482 }, 1, 2 }, -{ { 1454, 1482, 1483 }, 1, 2 }, -{ { 1453, 1454, 1483 }, 1, 4 }, -{ { 1513, 1514, 1515 }, 1, 6 }, -{ { 1512, 1513, 1515 }, 1, 4 }, -{ { 1521, 1500, 1501 }, 1, 6 }, -{ { 1511, 1512, 1515 }, 1, 4 }, -{ { 1511, 1515, 1516 }, 1, 2 }, -{ { 1510, 1511, 1516 }, 1, 4 }, -{ { 1510, 1516, 1517 }, 1, 2 }, -{ { 1509, 1510, 1517 }, 1, 4 }, -{ { 1509, 1517, 1518 }, 1, 2 }, -{ { 1508, 1509, 1518 }, 1, 4 }, -{ { 1508, 1518, 1519 }, 1, 2 }, -{ { 1507, 1508, 1519 }, 1, 4 }, -{ { 1507, 1519, 1520 }, 1, 2 }, -{ { 1506, 1507, 1520 }, 1, 4 }, -{ { 1505, 1506, 1520 }, 1, 4 }, -{ { 1504, 1505, 1520 }, 1, 4 }, -{ { 1503, 1504, 1520 }, 1, 4 }, -{ { 1503, 1520, 1521 }, 1, 2 }, -{ { 1502, 1503, 1521 }, 1, 4 }, -{ { 1501, 1502, 1521 }, 1, 4 }, -{ { 1539, 1540, 1541 }, 1, 6 }, -{ { 1538, 1539, 1541 }, 1, 4 }, -{ { 1536, 1537, 1538 }, 1, 6 }, -{ { 1535, 1536, 1538 }, 1, 4 }, -{ { 1532, 1533, 1534 }, 1, 6 }, -{ { 1545, 1522, 1523 }, 1, 6 }, -{ { 1545, 1523, 1524 }, 1, 2 }, -{ { 1545, 1524, 1525 }, 1, 2 }, -{ { 1544, 1545, 1525 }, 1, 4 }, -{ { 1544, 1525, 1526 }, 1, 2 }, -{ { 1544, 1526, 1527 }, 1, 2 }, -{ { 1544, 1527, 1528 }, 1, 2 }, -{ { 1544, 1528, 1529 }, 1, 2 }, -{ { 1543, 1544, 1529 }, 1, 4 }, -{ { 1543, 1529, 1530 }, 1, 2 }, -{ { 1543, 1530, 1531 }, 1, 2 }, -{ { 1542, 1543, 1531 }, 1, 4 }, -{ { 1542, 1531, 1532 }, 1, 2 }, -{ { 1541, 1542, 1532 }, 1, 4 }, -{ { 1538, 1541, 1532 }, 1, 0 }, -{ { 1535, 1538, 1532 }, 1, 0 }, -{ { 1534, 1535, 1532 }, 1, 4 }, -{ { 1548, 1549, 1546 }, 1, 6 }, -{ { 1548, 1546, 1547 }, 1, 3 }, -{ { 1550, 1551, 1552 }, 1, 6 }, -{ { 1550, 1552, 1553 }, 1, 2 }, -{ { 1555, 1556, 1557 }, 1, 6 }, -{ { 1554, 1555, 1557 }, 1, 4 }, -{ { 1554, 1557, 1550 }, 1, 2 }, -{ { 1554, 1550, 1553 }, 1, 1 }, -{ { 1575, 1558, 1559 }, 0, 2 }, -{ { 1575, 1559, 1560 }, 0, 2 }, -{ { 1575, 1560, 1561 }, 0, 2 }, -{ { 1575, 1561, 1562 }, 0, 2 }, -{ { 1575, 1562, 1563 }, 0, 2 }, -{ { 1575, 1563, 1564 }, 0, 2 }, -{ { 1575, 1564, 1565 }, 0, 2 }, -{ { 1575, 1565, 1558 }, 0, 2 }, -{ { 1574, 1567, 1566 }, 0, 2 }, -{ { 1574, 1568, 1567 }, 0, 2 }, -{ { 1574, 1569, 1568 }, 0, 2 }, -{ { 1574, 1570, 1569 }, 0, 2 }, -{ { 1574, 1571, 1570 }, 0, 2 }, -{ { 1574, 1572, 1571 }, 0, 2 }, -{ { 1574, 1573, 1572 }, 0, 2 }, -{ { 1574, 1566, 1573 }, 0, 2 }, -{ { 1593, 1576, 1577 }, 0, 2 }, -{ { 1593, 1577, 1578 }, 0, 2 }, -{ { 1593, 1578, 1579 }, 0, 2 }, -{ { 1593, 1579, 1580 }, 0, 2 }, -{ { 1593, 1580, 1581 }, 0, 2 }, -{ { 1593, 1581, 1582 }, 0, 2 }, -{ { 1593, 1582, 1583 }, 0, 2 }, -{ { 1593, 1583, 1576 }, 0, 2 }, -{ { 1592, 1585, 1584 }, 0, 2 }, -{ { 1592, 1586, 1585 }, 0, 2 }, -{ { 1592, 1587, 1586 }, 0, 2 }, -{ { 1592, 1588, 1587 }, 0, 2 }, -{ { 1592, 1589, 1588 }, 0, 2 }, -{ { 1592, 1590, 1589 }, 0, 2 }, -{ { 1592, 1591, 1590 }, 0, 2 }, -{ { 1592, 1584, 1591 }, 0, 2 }, -{ { 1610, 1609, 1608 }, 1, 6 }, -{ { 1610, 1608, 1607 }, 1, 2 }, -{ { 1607, 1606, 1605 }, 1, 6 }, -{ { 1607, 1605, 1604 }, 1, 2 }, -{ { 1603, 1602, 1601 }, 1, 6 }, -{ { 1595, 1594, 1613 }, 1, 6 }, -{ { 1596, 1595, 1613 }, 1, 4 }, -{ { 1596, 1613, 1612 }, 1, 2 }, -{ { 1597, 1596, 1612 }, 1, 4 }, -{ { 1598, 1597, 1612 }, 1, 4 }, -{ { 1599, 1598, 1612 }, 1, 4 }, -{ { 1599, 1612, 1611 }, 1, 2 }, -{ { 1600, 1599, 1611 }, 1, 4 }, -{ { 1601, 1600, 1611 }, 1, 4 }, -{ { 1601, 1611, 1610 }, 1, 2 }, -{ { 1601, 1610, 1607 }, 1, 0 }, -{ { 1601, 1607, 1604 }, 1, 0 }, -{ { 1601, 1604, 1603 }, 1, 2 }, -{ { 1628, 1629, 1630 }, 1, 6 }, -{ { 1627, 1628, 1630 }, 1, 4 }, -{ { 1625, 1626, 1627 }, 1, 6 }, -{ { 1624, 1625, 1627 }, 1, 4 }, -{ { 1621, 1622, 1623 }, 1, 6 }, -{ { 1633, 1614, 1615 }, 1, 6 }, -{ { 1633, 1615, 1616 }, 1, 2 }, -{ { 1632, 1633, 1616 }, 1, 4 }, -{ { 1632, 1616, 1617 }, 1, 2 }, -{ { 1632, 1617, 1618 }, 1, 2 }, -{ { 1632, 1618, 1619 }, 1, 2 }, -{ { 1631, 1632, 1619 }, 1, 4 }, -{ { 1631, 1619, 1620 }, 1, 2 }, -{ { 1631, 1620, 1621 }, 1, 2 }, -{ { 1630, 1631, 1621 }, 1, 4 }, -{ { 1627, 1630, 1621 }, 1, 0 }, -{ { 1624, 1627, 1621 }, 1, 0 }, -{ { 1623, 1624, 1621 }, 1, 4 }, -{ { 1642, 1641, 1657 }, 1, 4 }, -{ { 1643, 1642, 1657 }, 1, 4 }, -{ { 1643, 1657, 1663 }, 1, 2 }, -{ { 1635, 1634, 1656 }, 1, 6 }, -{ { 1644, 1643, 1663 }, 1, 4 }, -{ { 1644, 1663, 1662 }, 1, 2 }, -{ { 1645, 1644, 1662 }, 1, 4 }, -{ { 1645, 1662, 1661 }, 1, 2 }, -{ { 1646, 1645, 1661 }, 1, 4 }, -{ { 1647, 1646, 1661 }, 1, 4 }, -{ { 1648, 1647, 1661 }, 1, 4 }, -{ { 1648, 1661, 1660 }, 1, 2 }, -{ { 1649, 1648, 1660 }, 1, 4 }, -{ { 1649, 1660, 1659 }, 1, 2 }, -{ { 1650, 1649, 1659 }, 1, 4 }, -{ { 1650, 1659, 1658 }, 1, 2 }, -{ { 1651, 1650, 1658 }, 1, 4 }, -{ { 1652, 1651, 1658 }, 1, 4 }, -{ { 1652, 1658, 1657 }, 1, 2 }, -{ { 1652, 1657, 1641 }, 1, 0 }, -{ { 1652, 1641, 1640 }, 1, 2 }, -{ { 1652, 1640, 1639 }, 1, 2 }, -{ { 1653, 1652, 1639 }, 1, 4 }, -{ { 1653, 1639, 1638 }, 1, 2 }, -{ { 1654, 1653, 1638 }, 1, 4 }, -{ { 1654, 1638, 1637 }, 1, 2 }, -{ { 1655, 1654, 1637 }, 1, 4 }, -{ { 1655, 1637, 1636 }, 1, 2 }, -{ { 1655, 1636, 1635 }, 1, 2 }, -{ { 1656, 1655, 1635 }, 1, 4 }, -{ { 1687, 1671, 1672 }, 1, 2 }, -{ { 1687, 1672, 1673 }, 1, 2 }, -{ { 1693, 1687, 1673 }, 1, 4 }, -{ { 1686, 1664, 1665 }, 1, 6 }, -{ { 1693, 1673, 1674 }, 1, 2 }, -{ { 1692, 1693, 1674 }, 1, 4 }, -{ { 1692, 1674, 1675 }, 1, 2 }, -{ { 1691, 1692, 1675 }, 1, 4 }, -{ { 1691, 1675, 1676 }, 1, 2 }, -{ { 1691, 1676, 1677 }, 1, 2 }, -{ { 1691, 1677, 1678 }, 1, 2 }, -{ { 1690, 1691, 1678 }, 1, 4 }, -{ { 1690, 1678, 1679 }, 1, 2 }, -{ { 1689, 1690, 1679 }, 1, 4 }, -{ { 1689, 1679, 1680 }, 1, 2 }, -{ { 1688, 1689, 1680 }, 1, 4 }, -{ { 1688, 1680, 1681 }, 1, 2 }, -{ { 1688, 1681, 1682 }, 1, 2 }, -{ { 1687, 1688, 1682 }, 1, 4 }, -{ { 1671, 1687, 1682 }, 1, 0 }, -{ { 1670, 1671, 1682 }, 1, 4 }, -{ { 1669, 1670, 1682 }, 1, 4 }, -{ { 1669, 1682, 1683 }, 1, 2 }, -{ { 1668, 1669, 1683 }, 1, 4 }, -{ { 1668, 1683, 1684 }, 1, 2 }, -{ { 1667, 1668, 1684 }, 1, 4 }, -{ { 1667, 1684, 1685 }, 1, 2 }, -{ { 1666, 1667, 1685 }, 1, 4 }, -{ { 1665, 1666, 1685 }, 1, 4 }, -{ { 1665, 1685, 1686 }, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ { 18, 17, 16 }, 2, 6 }, -{ { 8, 7, 6 }, 2, 6 }, -{ { 20, 19, 18 }, 2, 6 }, -{ { 22, 21, 20 }, 2, 6 }, -{ { 4, 3, 2 }, 2, 6 }, -{ { 10, 9, 8 }, 2, 6 }, -{ { 6, 5, 4 }, 2, 6 }, -{ { 26, 25, 24 }, 2, 6 }, -{ { 28, 27, 26 }, 2, 6 }, -{ { 24, 23, 22 }, 2, 6 }, -{ { 30, 29, 28 }, 2, 6 }, -{ { 12, 11, 10 }, 2, 6 }, -{ { 2, 1, 0 }, 2, 6 }, -{ { 0, 33, 32 }, 2, 6 }, -{ { 32, 31, 30 }, 2, 6 }, -{ { 14, 13, 12 }, 2, 6 }, -{ { 16, 15, 14 }, 2, 6 }, -{ { 4, 2, 0 }, 2, 0 }, -{ { 6, 4, 0 }, 2, 0 }, -{ { 8, 6, 0 }, 2, 0 }, -{ { 10, 8, 0 }, 2, 0 }, -{ { 12, 10, 0 }, 2, 0 }, -{ { 12, 0, 32 }, 2, 0 }, -{ { 14, 12, 32 }, 2, 0 }, -{ { 14, 32, 30 }, 2, 0 }, -{ { 16, 14, 30 }, 2, 0 }, -{ { 16, 30, 28 }, 2, 0 }, -{ { 16, 28, 26 }, 2, 0 }, -{ { 18, 16, 26 }, 2, 0 }, -{ { 20, 18, 26 }, 2, 0 }, -{ { 20, 26, 24 }, 2, 0 }, -{ { 20, 24, 22 }, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -static Matrix mat[][3] = -{ - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 22198.351563f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.0000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -32.104950f, -4.568500f, 21760.089844f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 22230.794922f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 21601.316406f, 1.000000f, - }, - { - 0.881000f, 0.187100f, 0.434500f, 0.000000f, - -0.178600f, -0.718900f, 0.671800f, 0.000000f, - -0.438000f, 0.669500f, 0.600000f, 0.000000f, - -40.679047f, 57.105099f, 21262.400391f, 1.000000f, - }, - { - 1.008900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.008900f, 0.000000f, - 0.000000f, 1.008900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 21633.759766f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20863.496094f, 1.000000f, - }, - { - 0.759600f, 0.187100f, 0.622900f, 0.000000f, - -0.326300f, -0.718900f, 0.613800f, 0.000000f, - -0.562600f, 0.669500f, 0.485100f, 0.000000f, - -35.966850f, 57.105099f, 20524.212891f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20895.939453f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20000.533203f, 1.000000f, - }, - { - 0.598200f, 0.187100f, 0.779200f, 0.000000f, - -0.457200f, -0.718900f, 0.523600f, 0.000000f, - -0.658100f, 0.669500f, 0.344500f, 0.000000f, - -31.281849f, 57.105099f, 19661.962891f, 1.000000f, - }, - { - 1.025100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.025100f, 0.000000f, - 0.000000f, 1.025100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20032.976563f, 1.000000f, - }, - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 19028.070313f, 1.000000f, - }, - { - 0.406500f, 0.187100f, 0.894300f, 0.000000f, - -0.563800f, -0.718900f, 0.406600f, 0.000000f, - -0.719000f, 0.669500f, 0.186800f, 0.000000f, - -26.903849f, 57.105099f, 18691.248047f, 1.000000f, - }, - { - 1.031600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031600f, 0.000000f, - 0.000000f, 1.031600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 19060.513672f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 17961.750000f, 1.000000f, - }, - { - 0.196700f, 0.187100f, 0.962400f, 0.000000f, - -0.640300f, -0.718900f, 0.270600f, 0.000000f, - -0.742500f, 0.669500f, 0.021700f, 0.000000f, - -23.081848f, 57.105099f, 17627.578125f, 1.000000f, - }, - { - 1.036500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036500f, 0.000000f, - 0.000000f, 1.036500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 17994.193359f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 16817.216797f, 1.000000f, - }, - { - -0.018200f, 0.187100f, 0.982200f, 0.000000f, - -0.683900f, -0.718900f, 0.124300f, 0.000000f, - -0.729300f, 0.669500f, -0.141000f, 0.000000f, - -20.007050f, 57.105099f, 16486.400391f, 1.000000f, - }, - { - 1.039500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.039500f, 0.000000f, - 0.000000f, 1.039500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 16849.660156f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 15610.111328f, 1.000000f, - }, - { - -0.225800f, 0.187100f, 0.956000f, 0.000000f, - -0.694700f, -0.718900f, -0.023400f, 0.000000f, - -0.682900f, 0.669500f, -0.292300f, 0.000000f, - -17.795149f, 57.105099f, 15283.111328f, 1.000000f, - }, - { - 1.040000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.040000f, 0.000000f, - 0.000000f, 1.040000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 15642.555664f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 14356.078125f, 1.000000f, - }, - { - -0.414200f, 0.187100f, 0.890800f, 0.000000f, - -0.675700f, -0.718900f, -0.163200f, 0.000000f, - -0.609900f, 0.669500f, -0.424100f, 0.000000f, - -16.485548f, 57.105099f, 14033.073242f, 1.000000f, - }, - { - 1.037200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037200f, 0.000000f, - 0.000000f, 1.037200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 14388.522461f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 13070.758789f, 1.000000f, - }, - { - -0.577800f, 0.187100f, 0.794500f, 0.000000f, - -0.631700f, -0.718900f, -0.290100f, 0.000000f, - -0.516900f, 0.669500f, -0.533500f, 0.000000f, - -16.012848f, 57.105099f, 12751.730469f, 1.000000f, - }, - { - 1.031000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031000f, 0.000000f, - 0.000000f, 1.031000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 13103.203125f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 11769.795898f, 1.000000f, - }, - { - -0.715900f, 0.187100f, 0.672600f, 0.000000f, - -0.566400f, -0.718900f, -0.402900f, 0.000000f, - -0.408200f, 0.669500f, -0.620600f, 0.000000f, - -16.293648f, 57.105099f, 11454.640625f, 1.000000f, - }, - { - 1.022700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022700f, 0.000000f, - 0.000000f, 1.022700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 11802.240234f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 10468.833984f, 1.000000f, - }, - { - -0.827900f, 0.187100f, 0.528800f, 0.000000f, - -0.482200f, -0.718900f, -0.500600f, 0.000000f, - -0.286500f, 0.669500f, -0.685400f, 0.000000f, - -17.278248f, 57.105099f, 10157.392578f, 1.000000f, - }, - { - 1.013400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.013400f, 0.000000f, - 0.000000f, 1.013400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 10501.278320f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 9183.513672f, 1.000000f, - }, - { - -0.912000f, 0.187100f, 0.365100f, 0.000000f, - -0.380400f, -0.718900f, -0.581800f, 0.000000f, - -0.153600f, 0.669500f, -0.726800f, 0.000000f, - -18.951847f, 57.105099f, 8875.574219f, 1.000000f, - }, - { - 1.004100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004100f, 0.000000f, - 0.000000f, 1.004100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 9215.958008f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 7929.480957f, 1.000000f, - }, - { - -0.965100f, 0.187100f, 0.183100f, 0.000000f, - -0.261500f, -0.718900f, -0.644000f, 0.000000f, - -0.011100f, 0.669500f, -0.742800f, 0.000000f, - -21.328348f, 57.105099f, 7624.758301f, 1.000000f, - }, - { - 0.996000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.996000f, 0.000000f, - 0.000000f, 0.996000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 7961.925293f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 6722.375488f, 1.000000f, - }, - { - -0.982200f, 0.187100f, -0.015200f, 0.000000f, - -0.126300f, -0.718900f, -0.683500f, 0.000000f, - 0.138800f, 0.669500f, -0.729800f, 0.000000f, - -24.438049f, 57.105099f, 6420.471191f, 1.000000f, - }, - { - 0.990300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.990300f, 0.000000f, - 0.000000f, 0.990300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 6754.819824f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 5577.841309f, 1.000000f, - }, - { - -0.956000f, 0.187100f, -0.225800f, 0.000000f, - 0.023400f, -0.718900f, -0.694700f, 0.000000f, - 0.292300f, 0.669500f, -0.682900f, 0.000000f, - -28.305548f, 57.105099f, 5278.185547f, 1.000000f, - }, - { - 0.988000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.988000f, 0.000000f, - 0.000000f, 0.988000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 5610.285645f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 4511.521484f, 1.000000f, - }, - { - -0.878200f, 0.187100f, -0.440200f, 0.000000f, - 0.183000f, -0.718900f, -0.670600f, 0.000000f, - 0.441900f, 0.669500f, -0.597100f, 0.000000f, - -32.898449f, 57.105099f, 4213.296387f, 1.000000f, - }, - { - 0.991400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.991400f, 0.000000f, - 0.000000f, 0.991400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 4543.965332f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 3539.058594f, 1.000000f, - }, - { - -0.743400f, 0.187100f, -0.642200f, 0.000000f, - 0.341900f, -0.718900f, -0.605200f, 0.000000f, - 0.574900f, 0.669500f, -0.470500f, 0.000000f, - -38.008450f, 57.105099f, 3241.149658f, 1.000000f, - }, - { - 1.000100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000100f, 0.000000f, - 0.000000f, 1.000100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 3571.502441f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 2676.096436f, 1.000000f, - }, - { - -0.553100f, 0.187100f, -0.811800f, 0.000000f, - 0.486100f, -0.718900f, -0.496800f, 0.000000f, - 0.676600f, 0.669500f, -0.306700f, 0.000000f, - -43.285347f, 57.105099f, 2377.160400f, 1.000000f, - }, - { - 1.011600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.011600f, 0.000000f, - 0.000000f, 1.011600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 2708.540283f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1938.275757f, 1.000000f, - }, - { - -0.316400f, 0.187100f, -0.930000f, 0.000000f, - 0.601100f, -0.718900f, -0.349100f, 0.000000f, - 0.733900f, 0.669500f, -0.115000f, 0.000000f, - -48.290947f, 57.105099f, 1636.875488f, 1.000000f, - }, - { - 1.023400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.023400f, 0.000000f, - 0.000000f, 1.023400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1970.719727f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.049500f, 0.187100f, -0.981100f, 0.000000f, - 0.673700f, -0.718900f, -0.171100f, 0.000000f, - 0.737300f, 0.669500f, 0.090500f, 0.000000f, - -52.555748f, 57.105099f, 1036.013794f, 1.000000f, - }, - { - 1.032800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.032800f, 0.000000f, - 0.000000f, 1.032800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.225800f, 0.187100f, -0.956000f, 0.000000f, - 0.694700f, -0.718900f, 0.023400f, 0.000000f, - 0.682900f, 0.669500f, 0.292300f, 0.000000f, - -55.649448f, 57.105099f, 1031.074585f, 1.000000f, - }, - { - 1.037400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037400f, 0.000000f, - 0.000000f, 1.037400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.491100f, 0.187100f, -0.850800f, 0.000000f, - 0.658600f, -0.718900f, 0.222200f, 0.000000f, - 0.570100f, 0.669500f, 0.476300f, 0.000000f, - -57.270248f, 57.105099f, 1025.276733f, 1.000000f, - }, - { - 1.037900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037900f, 0.000000f, - 0.000000f, 1.037900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.723400f, 0.187100f, -0.664600f, 0.000000f, - 0.561800f, -0.718900f, 0.409300f, 0.000000f, - 0.401200f, 0.669500f, 0.625200f, 0.000000f, - -57.111149f, 57.105099f, 1019.001221f, 1.000000f, - }, - { - 1.036800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036800f, 0.000000f, - 0.000000f, 1.036800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.892600f, 0.187100f, -0.410300f, 0.000000f, - 0.409000f, -0.718900f, 0.562000f, 0.000000f, - 0.189800f, 0.669500f, 0.718200f, 0.000000f, - -55.002949f, 57.105099f, 1012.916504f, 1.000000f, - }, - { - 1.034500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.034500f, 0.000000f, - 0.000000f, 1.034500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.975800f, 0.187100f, -0.113200f, 0.000000f, - 0.214500f, -0.718900f, 0.661200f, 0.000000f, - -0.042300f, 0.669500f, 0.741600f, 0.000000f, - -51.079346f, 57.105099f, 1007.726318f, 1.000000f, - }, - { - 1.031200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031200f, 0.000000f, - 0.000000f, 1.031200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.963000f, 0.187100f, 0.193800f, 0.000000f, - -0.000200f, -0.718900f, 0.695100f, 0.000000f, - -0.269300f, 0.669500f, 0.692300f, 0.000000f, - -45.765148f, 57.105099f, 1004.021790f, 1.000000f, - }, - { - 1.027000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.027000f, 0.000000f, - 0.000000f, 1.027000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.859000f, 0.187100f, 0.476600f, 0.000000f, - -0.210900f, -0.718900f, 0.662300f, 0.000000f, - -0.466500f, 0.669500f, 0.578100f, 0.000000f, - -39.690350f, 57.105099f, 1002.157410f, 1.000000f, - }, - { - 1.022400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022400f, 0.000000f, - 0.000000f, 1.022400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.681700f, 0.187100f, 0.707300f, 0.000000f, - -0.395700f, -0.718900f, 0.571500f, 0.000000f, - -0.615400f, 0.669500f, 0.416100f, 0.000000f, - -33.554749f, 57.105099f, 1002.187256f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.458000f, 0.187100f, 0.869100f, 0.000000f, - -0.539100f, -0.718900f, 0.438800f, 0.000000f, - -0.706900f, 0.669500f, 0.228400f, 0.000000f, - -27.984049f, 57.105099f, 1003.876953f, 1.000000f, - }, - { - 1.012300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.012300f, 0.000000f, - 0.000000f, 1.012300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.217300f, 0.187100f, 0.958000f, 0.000000f, - -0.634300f, -0.718900f, 0.284200f, 0.000000f, - -0.741900f, 0.669500f, 0.037500f, 0.000000f, - -23.418049f, 57.105099f, 1006.781006f, 1.000000f, - }, - { - 1.007400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.007400f, 0.000000f, - 0.000000f, 1.007400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.011500f, 0.187100f, 0.982300f, 0.000000f, - -0.683000f, -0.718900f, 0.128900f, 0.000000f, - -0.730300f, 0.669500f, -0.136000f, 0.000000f, - -20.090649f, 57.105099f, 1010.310059f, 1.000000f, - }, - { - 1.001600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.001600f, 0.000000f, - 0.000000f, 1.001600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.214400f, 0.187100f, 0.958700f, 0.000000f, - -0.694900f, -0.718900f, -0.015100f, 0.000000f, - -0.686400f, 0.669500f, -0.284100f, 0.000000f, - -17.896347f, 57.105099f, 1014.017090f, 1.000000f, - }, - { - 0.994300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.994300f, 0.000000f, - 0.000000f, 0.994300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.391300f, 0.187100f, 0.901000f, 0.000000f, - -0.679600f, -0.718900f, -0.145900f, 0.000000f, - -0.620500f, 0.669500f, -0.408500f, 0.000000f, - -16.604847f, 57.105099f, 1017.721558f, 1.000000f, - }, - { - 0.986100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.986100f, 0.000000f, - 0.000000f, 0.986100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.545300f, 0.187100f, 0.817100f, 0.000000f, - -0.642900f, -0.718900f, -0.264400f, 0.000000f, - -0.538000f, 0.669500f, -0.512300f, 0.000000f, - -16.047749f, 57.105099f, 1021.376709f, 1.000000f, - }, - { - 0.977700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.977700f, 0.000000f, - 0.000000f, 0.977700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.679500f, 0.187100f, 0.709400f, 0.000000f, - -0.586800f, -0.718900f, -0.372600f, 0.000000f, - -0.440300f, 0.669500f, -0.598300f, 0.000000f, - -16.141548f, 57.105099f, 1025.005493f, 1.000000f, - }, - { - 0.969900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.969900f, 0.000000f, - 0.000000f, 0.969900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.795500f, 0.187100f, 0.576300f, 0.000000f, - -0.510700f, -0.718900f, -0.471600f, 0.000000f, - -0.326100f, 0.669500f, -0.667400f, 0.000000f, - -16.893848f, 57.105099f, 1028.650513f, 1.000000f, - }, - { - 0.963300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963300f, 0.000000f, - 0.000000f, 0.963300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.890900f, 0.187100f, 0.413900f, 0.000000f, - -0.411300f, -0.718900f, -0.560400f, 0.000000f, - -0.192700f, 0.669500f, -0.717400f, 0.000000f, - -18.402348f, 57.105099f, 1032.325195f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.958000f, 0.187100f, 0.217300f, 0.000000f, - -0.284200f, -0.718900f, -0.634300f, 0.000000f, - -0.037500f, 0.669500f, -0.741900f, 0.000000f, - -20.845448f, 57.105099f, 1035.962158f, 1.000000f, - }, - { - 0.957000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.957000f, 0.000000f, - 0.000000f, 0.957000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.982300f, 0.187100f, -0.013000f, 0.000000f, - -0.127900f, -0.718900f, -0.683200f, 0.000000f, - 0.137100f, 0.669500f, -0.730100f, 0.000000f, - -24.399748f, 57.105099f, 1039.308228f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.947100f, 0.187100f, -0.260700f, 0.000000f, - 0.048800f, -0.718900f, -0.693400f, 0.000000f, - 0.317100f, 0.669500f, -0.671800f, 0.000000f, - -29.005148f, 57.105099f, 1041.880859f, 1.000000f, - }, - { - 0.963900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963900f, 0.000000f, - 0.000000f, 0.963900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.844400f, 0.187100f, -0.502000f, 0.000000f, - 0.230600f, -0.718900f, -0.655700f, 0.000000f, - 0.483600f, 0.669500f, -0.563900f, 0.000000f, - -34.367550f, 57.105099f, 1043.237793f, 1.000000f, - }, - { - 0.971800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.971800f, 0.000000f, - 0.000000f, 0.971800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.677300f, 0.187100f, -0.711500f, 0.000000f, - 0.399200f, -0.718900f, -0.569000f, 0.000000f, - 0.618000f, 0.669500f, -0.412200f, 0.000000f, - -40.015949f, 57.105099f, 1043.108643f, 1.000000f, - }, - { - 0.981700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.981700f, 0.000000f, - 0.000000f, 0.981700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.460700f, 0.187100f, -0.867600f, 0.000000f, - 0.537700f, -0.718900f, -0.440500f, 0.000000f, - 0.706200f, 0.669500f, -0.230600f, 0.000000f, - -45.402149f, 57.105099f, 1041.465820f, 1.000000f, - }, - { - 0.993000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.993000f, 0.000000f, - 0.000000f, 0.993000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.217300f, 0.187100f, -0.958000f, 0.000000f, - 0.634300f, -0.718900f, -0.284200f, 0.000000f, - 0.741900f, 0.669500f, -0.037500f, 0.000000f, - -50.026550f, 57.105099f, 1038.534790f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.034900f, 0.187100f, -0.981700f, 0.000000f, - 0.685900f, -0.718900f, -0.112600f, 0.000000f, - 0.726800f, 0.669500f, 0.153400f, 0.000000f, - -53.643948f, 57.105099f, 1034.605103f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.284000f, 0.187100f, -0.940400f, 0.000000f, - 0.692000f, -0.718900f, 0.066000f, 0.000000f, - 0.663700f, 0.669500f, 0.333600f, 0.000000f, - -56.130249f, 57.105099f, 1029.897339f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.513800f, 0.187100f, -0.837300f, 0.000000f, - 0.652400f, -0.718900f, 0.239800f, 0.000000f, - 0.557100f, 0.669500f, 0.491400f, 0.000000f, - -57.333046f, 57.105099f, 1024.724487f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.709500f, 0.187100f, -0.679400f, 0.000000f, - 0.570200f, -0.718900f, 0.397500f, 0.000000f, - 0.414100f, 0.669500f, 0.616700f, 0.000000f, - -57.182648f, 57.105099f, 1019.425110f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.858600f, 0.187100f, -0.477300f, 0.000000f, - 0.450800f, -0.718900f, 0.529100f, 0.000000f, - 0.244200f, 0.669500f, 0.701600f, 0.000000f, - -55.694046f, 57.105099f, 1014.342407f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.951600f, 0.187100f, -0.244000f, 0.000000f, - 0.301900f, -0.718900f, 0.626100f, 0.000000f, - 0.058300f, 0.669500f, 0.740600f, 0.000000f, - -52.966049f, 57.105099f, 1009.804321f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.982300f, 0.187100f, 0.005300f, 0.000000f, - 0.133200f, -0.718900f, 0.682200f, 0.000000f, - -0.131400f, 0.669500f, 0.731100f, 0.000000f, - -49.174549f, 57.105099f, 1006.104492f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - } -}; - -static Gu3dfInfo text_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000040, /* height */ - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ - GR_TEXFMT_YIQ_422 /* format */ - }, - { /* table */ - { /* nccTable */ - { /* yRGB */ - 0x22, 0x22, 0x2b, 0x3c, - 0x44, 0x44, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, - 0xcc, 0xdd, 0xee, 0xff - }, - { /* iRGB */ - { 0x01cf, 0x0027, 0x0023 }, - { 0x0001, 0x0000, 0x01ef }, - { 0x01e2, 0x000e, 0x0012 }, - { 0x01f4, 0x01ff, 0x01fc } - }, - { /* qRGB */ - { 0x01ee, 0x0019, 0x0010 }, - { 0x01e5, 0x0011, 0x0006 }, - { 0x01e8, 0x0009, 0x0008 }, - { 0x01eb, 0x0001, 0x0004 } - }, - { /* packed_data */ - 0x3c2b2222, 0x77664444, 0xbbaa9988, 0xffeeddcc, - 0x073c4e23, 0x000401ef, 0x07881c12, 0x07d3fffc, - 0x07b83210, 0x07942206, 0x07a01208, 0x07ac0204 - } - } - }, - NULL, /* data */ - 0x00001558 /* mem_required */ -}; - -unsigned char text_3dfinfo_image[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo hilite_3dfinfo = { - { /* header */ - 0x00000020, /* width */ - 0x00000020, /* height */ - 0x00000008, /* small_lod */ - 0x00000003, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x0000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char hilite_3dfinfo_image[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo shadow_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000020, /* height */ - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x00000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char shadow_3dfinfo_image[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0, -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/cvg/glide/src/xdraw2.S b/glide2x/cvg/glide/src/xdraw2.S deleted file mode 100644 index 8c2fae3..0000000 --- a/glide2x/cvg/glide/src/xdraw2.S +++ /dev/null @@ -1,259 +0,0 @@ -## THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -## PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -## TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -## INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -## DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -## THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -## EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -## FULL TEXT OF THE NON-WARRANTY PROVISIONS. -## -## USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -## RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -## TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -## AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -## SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -## THE UNITED STATES. -## -## COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -## -## $Header$ -## $Revision$ -## $Log$ -## Revision 1.2 1999/12/11 00:42:21 joseph -## Changed \(.data) to .section .data to fix build errors with binutils 2.9.5. -## -## Revision 1.1.1.1 1999/12/07 21:49:13 joseph -## Initial checkin into SourceForge. -## -## -## -## 7 5/18/98 12:16p Peter -## culling enabling -# -# 6 1/15/98 1:12p Peter -# dispatch w/o packing -# -# 5 11/06/97 3:47p Peter -# -# 4 11/04/97 5:04p Peter -# cataclysm part deux -# -# 3 11/01/97 10:01a Peter -# tri dispatch stuff -# -# 2 10/30/97 6:53p Peter -# first real cut at tri asm -# -# 1 10/30/97 4:29p Peter -# asm tri code -# -# 2 7/07/97 2:14p Jdt -# assembly now on par with C code. -# -# 1 7/07/97 8:37a Jdt -# B4 Chip field fix. -## - -.file "xdraw2.s" -#OPTION OLDSTRUCTS -# 586P - -# This was xdraw2.s but I renamed it for now to work with the shared -# swlibs. It hasn't changed to the format used in the .S files for -# the Voodoo3 Glide soruces. - -# some useful floating load and store macros -#flds TEXTEQU -#fsubs TEXTEQU -#fmuls TEXTEQU - - .align 4 -.section .data -One .DATA 0x03f800000 -Area .DATA 0 -dxAB .DATA 0 -dxBC .DATA 0 -dyAB .DATA 0 -dyBC .DATA 0 -culltest .DATA 0 - - ## Extra junk to pad out to the next cache line. -bias0 .DATA 0 -pad1 .DATA 0 -pad2 .DATA 0 -pad3 .DATA 0 -pad4 .DATA 0 -pad5 .DATA 0 -pad6 .DATA 0 -pad7 .DATA 0 -bias1 .DATA 0 - -# _DATA ENDS - -# Ugly, but seems to workaround the problem with locally defined -# data segment globals not getting relocated properly when using -# djgpp. - -zArea .EQU One+0x04 -zdxAB .EQU One+0x08 -zdxBC .EQU One+0x0c -zdyAB .EQU One+0x10 -zdyBC .EQU One+0x14 -zculltest .EQU One+0x18 - -### Definitions of cvg regs and glide root structures. -.INCLUDE "fxgasm.h" - -## enables/disables trisProcessed and trisDrawn counters -STATS .ASSIGNA 1 - -#-------------------------------------------------------------------------- -# Arguments : STKOFF = 16 from 4 pushes -#.AIF \&GLIDE_DEBUG EQ 1 -#STKOFF .EQU 20 -#.AELSE -STKOFF .EQU 16 -#.AENDI -_va$ .EQU 4 + STKOFF -_vb$ .EQU 8 + STKOFF -_vc$ .EQU 12 + STKOFF - -X .EQU 0 -Y .EQU 4 - # edx is used as index, loading from *src -gc .REG (%esi) # points to graphics context - -.text - - .align 4 - .globl _trisetup_cull - .type _trisetup_cull, @function -_trisetup_cull: -# .code - -.MACRO SYMNAME prefix - .LCULL\prefix: -.ENDM - -.MACRO SYMNAMEOP op prefix - \op .LCULL\prefix -.ENDM - -GLIDE_CULLING .ASSIGNA 1 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -.INCLUDE "xdraw2.inc.S" -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup_cull: - .size _trisetup_cull,.L_end_trisetup_cull-_trisetup_cull - -.MACRO SYMNAME prefix - .LNOCULL\prefix: -.ENDM - -.MACRO SYMNAMEOP op prefix - \op .LNOCULL\prefix -.ENDM -.AIF \&GLIDE_PACKED_RGB EQ 1 - .align 4 - .globl _trisetup_cull_rgb - .type _trisetup_cull_rgb, @function -_trisetup_cull_rgb: -# .code - -GLIDE_CULLING .ASSIGNA 1 -GLIDE_PACK_RGB .ASSIGNA 1 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -.INCLUDE "xdraw2.inc.S" -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup_cull_rgb: - .size _trisetup_cull_rgb,.L_end_trisetup_cull_rgb-_trisetup_cull_rgb - - .align 4 - .globl _trisetup_cull_argb - .type _trisetup_cull_argb, @function -_trisetup_cull_argb: -# .code - -GLIDE_CULLING .ASSIGNA 1 -GLIDE_PACK_RGB .ASSIGNA 1 -GLIDE_PACK_ALPHA .ASSIGNA 1 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -.INCLUDE "xdraw2.inc.S" -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup_cull_argb: - .size _trisetup_cull_argb,.L_end_trisetup_cull_argb-_trisetup_cull_argb - -.AENDI - .align 4 - .global _trisetup - .type _trisetup, @function -_trisetup: -# .code - -GLIDE_CULLING .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -.INCLUDE "xdraw2.inc.S" -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup: - .size _trisetup,.L_end_trisetup-_trisetup - -.AIF \&GLIDE_PACKED_RGB EQ 1 - .align 4 - .globl _trisetup_rgb - .type _trisetup_rgb, @function -_trisetup_rgb: -# .code - -GLIDE_CULLING .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 1 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -.INCLUDE "xdraw2.inc.S" -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup_rgb: - .size _trisetup_rgb,.L_end_trisetup_rgb-_trisetup_rgb - - .align 4 - .globl _trisetup_argb - .type _trisetup_argb, @function -_trisetup_argb: -# .code - -GLIDE_CULLING .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 1 -GLIDE_PACK_ALPHA .ASSIGNA 1 -GLIDE_GENERIC_SETUP .ASSIGNA 0 -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP .ASSIGNA 0 -GLIDE_PACK_ALPHA .ASSIGNA 0 -GLIDE_PACK_RGB .ASSIGNA 0 -GLIDE_CULLING .ASSIGNA 0 -.L_end_trisetup_argb: - .size _trisetup_argb,.L_end_trisetup_argb-_trisetup_argb -.AENDI - -#_TEXT ENDS -.END - - - diff --git a/glide2x/cvg/glide/src/xdraw2.asm b/glide2x/cvg/glide/src/xdraw2.asm deleted file mode 100644 index b79ea38..0000000 --- a/glide2x/cvg/glide/src/xdraw2.asm +++ /dev/null @@ -1,220 +0,0 @@ -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -;; -;; 7 5/18/98 12:16p Peter -;; culling enabling -; -; 6 1/15/98 1:12p Peter -; dispatch w/o packing -; -; 5 11/06/97 3:47p Peter -; -; 4 11/04/97 5:04p Peter -; cataclysm part deux -; -; 3 11/01/97 10:01a Peter -; tri dispatch stuff -; -; 2 10/30/97 6:53p Peter -; first real cut at tri asm -; -; 1 10/30/97 4:29p Peter -; asm tri code -; -; 2 7/07/97 2:14p Jdt -; assembly now on par with C code. -; -; 1 7/07/97 8:37a Jdt -; B4 Chip field fix. -;; - -TITLE xdraw2.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - - ;; Extra junk to pad out to the next cache line. - bias0 DD 0 - pad1 DD 0 - pad2 DD 0 - pad3 DD 0 - pad4 DD 0 - pad5 DD 0 - pad6 DD 0 - pad7 DD 0 - bias1 DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context - -_TEXT SEGMENT - - align 4 - PUBLIC _trisetup_cull@12 -_trisetup_cull@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull@12 ENDP - -IF GLIDE_PACKED_RGB - align 4 - PUBLIC _trisetup_cull_rgb@12 -_trisetup_cull_rgb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull_rgb@12 ENDP - - align 4 - PUBLIC _trisetup_cull_argb@12 -_trisetup_cull_argb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_cull_argb@12 ENDP -ENDIF ; GLIDE_PACKED_RGB - - align 4 - PUBLIC _trisetup@12 -_trisetup@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup@12 ENDP - -IF GLIDE_PACKED_RGB - align 4 - PUBLIC _trisetup_rgb@12 -_trisetup_rgb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_rgb@12 ENDP - - align 4 - PUBLIC _trisetup_argb@12 -_trisetup_argb@12 PROC NEAR - .code - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -_trisetup_argb@12 ENDP -ENDIF ; GLIDE_PACKED_RGB - -_TEXT ENDS -END diff --git a/glide2x/cvg/glide/src/xdraw2.inc b/glide2x/cvg/glide/src/xdraw2.inc deleted file mode 100644 index 1bbd2c3..0000000 --- a/glide2x/cvg/glide/src/xdraw2.inc +++ /dev/null @@ -1,310 +0,0 @@ -;; -*-asm-*- -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -; -; 2 10/30/97 6:53p Peter -; first real cut at tri asm -; -; 1 10/30/97 4:29p Peter -; asm tri code -; -; 2 7/07/97 2:14p Jdt -; assembly now on par with C code. -; -; 1 7/07/97 8:37a Jdt -; B4 Chip field fix. -;; - -TITLE xdraw2.inc -.586P - -EXTRN _GlideRoot:DWORD -EXTRN _FifoMakeRoom:NEAR - - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -gc TEXTEQU ; points to graphics context - - ;; Prologue stuff - push esi - push edi - - push ebx - push ebp - - mov gc, [_GlideRoot + curGC] ;; GR_DCL_GC - - align 4 -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - -cull TEXTEQU -intArea TEXTEQU ; temp Y storage - - ;; Pre-load the current culling mode before all of the - ;; floating point area stuff. - mov cull, [gc + cull_mode] - mov fa, [esp + _va$] - - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - - shl cull, 31 ; culltest << 31 - -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - fst zArea ; | | | | area - - ;; Pop temp things from the sw culling off the fp stack - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - - mov intArea, zArea ; j = *(long *)&area - xor eax, eax ; Clear the return value (0 == culled) - - ; Zero Area Triangle Check - and intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __triDone - - ;; Triangle area check vs culling mode - mov intArea, zArea ; reload area just in case we're culling - xor intArea, cull ; if (j ^ (culltest << 31)) - - jge __triDone -ENDIF ; GLIDE_CULLING - - align 4 - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - mov eax, [_GlideRoot + curTriSize] - mov ebx, [gc + fifoRoom] - - add eax, 4 - cmp ebx, eax - - jge __triBegin - - push @Line - push 0h - - push eax - call _FifoMakeRoom - - add esp, 12 - - ;; Send triangle parameters - -dlp TEXTEQU ; points to dataList structure -fifo TEXTEQU ; points to next entry in fifo -vertex TEXTEQU ; the current vertex -vOffset TEXTEQU ; Current vertex offset - -packCol TEXTEQU -tempVal TEXTEQU - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - align 4 -__triBegin: - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vOffset, 4 ; Starting vertex - - mov eax, [gc + triPacketHdr] ; Packet 3 header - nop - - GR_FIFO_WRITE fifo, 0, eax ; Write packet header to fifo - add fifo, 4 ; Advance fifo for hdr & x/y coordinate - - align 4 -__vertexStart: - mov vertex, [esp + STKOFF + vOffset] ; Current vertex - add fifo, 8 - - nop ; Avoid p5 agi w/ load of vertex ptr - nop - - mov eax, DWORD PTR [vertex + x] ; X - lea dlp, [gc + tsuDataList] ; Reset the dataList - - GR_FIFO_WRITE fifo, -8, eax ; PCI write X - mov eax, DWORD PTR [vertex + y] ; Y - - xor packCol, packCol ; Clear packed color - GR_FIFO_WRITE fifo, -4, eax ; PCI write Y - -IF GLIDE_PACK_RGB - fld DWORD PTR [vertex + b] ; B - fadd DWORD PTR _GlideRoot + fBiasLo ; BC GC - - fld DWORD PTR [vertex + g] ; G B - fadd DWORD PTR _GlideRoot + fBiasHi ; GC B - - fld DWORD PTR [vertex + r] ; R GC BC - fadd DWORD PTR _GlideRoot + fBiasHi ; RC GC BC - - fxch st(2) ; BC GC RC - fstp DWORD PTR bias0 ; GC RC - - fstp DWORD PTR bias1 ; RC - mov packCol, DWORD PTR bias0 ; B + bias - - fstp DWORD PTR bias0 - mov eax, DWORD PTR bias1 ; G + bias - -IF GLIDE_PACK_ALPHA - fld DWORD PTR [vertex + a] - fadd DWORD PTR _GlideRoot + fBiasHi - - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 8 ; Packed RGB + A dataList entry - nop - - or packCol, eax ; 0000GGBB - nop - - fstp DWORD PTR bias1 - mov eax, DWORD PTR bias0 ; R + bias - - mov esi, DWORD PTR bias1 ; A + bias - and eax, 0000FF00h ; R component << 8 - - and esi, 0FFFFFF00h ; A component << 8 - shl eax, 8 ; R << 16 - - or packCol, eax ; 00RRGGBB - shl esi, 16 ; A << 16 - - or packCol, esi ; AARRGGBB - nop -ELSE ; !GLIDE_PACK_ALPHA - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 4 ; Next dataList item - or packCol, eax - - mov eax, DWORD PTR bias0 ; R + bias - and eax, 0000FF00h ; R component << 8 - - shl eax, 8 ; R << 16 - or packCol, eax ; 00RRGGBB -ENDIF ; !GLIDE_PACK_ALPHA - - GR_FIFO_WRITE fifo, 0, packCol ; PCI write packed color value - add fifo, 4 -ENDIF ; GLIDE_PACK_RGB - -__doParams: - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - je __nextVertex - - ;; Not using align directive here because it sometimes - ;; introduces an agi for the eax use below. - nop - nop - -__paramLoop: - mov tempVal, DWORD PTR [eax + vertex] ; Get the parameter from teh vertex - add fifo, 4 ; fifoPtr += sizeof(FxU32) - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - GR_FIFO_WRITE fifo, -4, tempVal ; *fifoPtr = data - - jne SHORT __paramLoop - - align 4 -__nextVertex: - ;; On to the next vertex - add vOffset, 4 - mov gc, [_GlideRoot + curGC] ; Reload gc incase we trashed it as a temp - - cmp vOffset, 16 ; Offset of one past last vertex? - jne __vertexStart - - ;; Update gc->fifoPtr and gc->fifoRoom - mov eax, fifo - mov ebx, [gc + fifoPtr] - - mov [gc + fifoPtr], fifo - sub eax, ebx - - mov ebx, [_GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn++; - sub [gc + fifoRoom], eax - - add ebx, 1 - mov [_GlideRoot + trisDrawn], ebx - - ;; return 1 (triangle drawn) - mov eax, 1h - -__triDone: - ;; Restore trashed registers - mov esi, [_GlideRoot + trisProcessed] - pop ebp - - add esi, 1 ; _GlideRoot.stats.trisProcessed++; - pop ebx - - pop edi - mov [_GlideRoot + trisProcessed], esi - - pop esi - ret 12 \ No newline at end of file diff --git a/glide2x/cvg/glide/src/xdraw2.inc.S b/glide2x/cvg/glide/src/xdraw2.inc.S deleted file mode 100644 index 4996e7d..0000000 --- a/glide2x/cvg/glide/src/xdraw2.inc.S +++ /dev/null @@ -1,315 +0,0 @@ -## -*-asm-*- -## THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -## PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -## TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -## INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -## DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -## THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -## EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -## FULL TEXT OF THE NON-WARRANTY PROVISIONS. -## -## USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -## RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -## TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -## AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -## SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -## THE UNITED STATES. -## -## COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -## -## $Header$ -## $Revision$ -## $Log$ -## Revision 1.1.1.1 1999/12/07 21:49:13 joseph -## Initial checkin into SourceForge. -## -# -# 2 10/30/97 6:53p Peter -# first real cut at tri asm -# -# 1 10/30/97 4:29p Peter -# asm tri code -# -# 2 7/07/97 2:14p Jdt -# assembly now on par with C code. -# -# 1 7/07/97 8:37a Jdt -# B4 Chip field fix. -## - -.file "xdraw2.inc.s" -#.586P - -#EXTRN _GlideRoot:DWORD -#EXTRN _FifoMakeRoom:NEAR - -# Ugly, but seems to workaround the problem with locally defined -# data segment globals not getting relocated properly when using -# djgpp. - -#zArea .EQU One+4 -#zdxAB .EQU One+8 -#zdxBC .EQU One+12 -#zdyAB .EQU One+16 -#zdyBC .EQU One+20 -#zculltest .EQU One+24 - -gc .REG (%esi) # points to graphics context - - ## Prologue stuff - push %esi - push %edi - - push %ebx - push %ebp - - mov (_GlideRoot + curGC), gc ## GR_DCL_GC - -.align 4 -.AIF \&GLIDE_CULLING EQ 1 -fa .REG (%eax) # vtx a from caller -fb .REG (%ebx) # vtx b from caller -fc .REG (%ecx) # vtx c from caller - -cull .REG (%edx) -intArea .REG (%ebp) # temp Y storage - - ## Pre-load the current culling mode before all of the - ## floating point area stuff. - mov cull_mode(gc), cull - mov _va$(%esp), fa - - mov _vb$(%esp), fb - mov _vc$(%esp), fc - - shl $31, cull - - SYMNAME Area_Computation -# 47-3 -# jmp ret_pop0f - flds X(fa) # xa - fsubs X(fb) # dxAB - flds X(fb) # | xb - fsubs X(fc) # | dxBC - flds Y(fb) # | | yb - fsubs Y(fc) # | | dyBC - flds Y(fa) # | | | ya - fsubs Y(fb) # | | | dyAB - fld %st(3) # | | | | dxAB - fmul %st(2), %st # | | | | t0 t0=dxAB*dyBC - fld %st(3) # | | | | | dxBC - fmul %st(2), %st # | | | | | t1 t1=dxBC*dyAB - fsubrp %st, %st(1) # | | | | area - fsts zArea # | | | | area - - ## Pop temp things from the sw culling off the fp stack - fstp %st # 4 - fstp %st # 3 - fstp %st # 2 - fstp %st # 1 - fstp %st # 0 - - mov zArea, intArea # j = *(long *)&area - xor %eax, %eax # Clear the returnv value (0 == culled) - - # Zero Area Triangle Check - and $0x7fffffff, intArea # if ((j & 0x7FFFFFFF) == 0) - SYMNAMEOP jz, __triDone - - ## Triangle area check vs culling mode - mov zArea, intArea - xor cull, intArea - - SYMNAMEOP jge, __triDone - -.AENDI -.align 4 - ## Check to make sure that we have enough room for - ## the complete triangle packet. - mov (_GlideRoot + curTriSize), %eax - mov fifoRoom(gc), %ebx - - add $4, %eax - cmp %eax, %ebx - - SYMNAMEOP jge, __triBegin - - push $0 - push $0 - - push %eax - call _FifoMakeRoom - - add $12, %esp - - ## Send triangle parameters - -dlp .REG (%ebx) # points to dataList structure -fifo .REG (%ebp) # points to next entry in fifo -vertex .REG (%edx) # the current vertex -vOffset .REG (%ecx) # Current vertex offset - -packCol .REG (%edi) -tempVal .REG (%edi) - -.MACRO GR_FIFO_WRITE __addr __offset __data - mov \__data, \__offset(\__addr) -.ENDM # GR_FIFO_WRITE - -.align 4 - SYMNAME __triBegin - mov fifoPtr(gc), fifo # Fetch Fifo Ptr - mov $4, vOffset # Starting vertex - - mov triPacketHdr(gc), %eax # Packet 3 header - nop - - # Write packet header to fifo - GR_FIFO_WRITE fifo, 0, %eax - add $4, fifo # Advance fifo for hdr & x/y coordinate - -.align 4 - SYMNAME __vertexStart - mov STKOFF(%esp,vOffset), vertex # Current vertex - add $8, fifo - - nop # Avoid p5 agi w/ load of vertex ptr - nop - - movl X(vertex), %eax # X - lea tsuDataList(gc), dlp # Reset the dataList - # PCI write X - GR_FIFO_WRITE fifo, -8, %eax - movl Y(vertex), %eax # Y - - xor packCol, packCol # Clear packed color - # PCI write Y - GR_FIFO_WRITE fifo, -4, %eax - -.AIF \&GLIDE_PACK_RGB EQ 1 - fldl b(vertex) # B - faddl (_GlideRoot + fBiasLo) # BC GC - - fldl g(vertex) # G B - faddl (_GlideRoot + fBiasHi) # GC B - - fldl r(vertex) # R GC BC - faddl (_GlideRoot + fBiasHi) # RC GC BC - - fxch %st(2) # BC GC RC - fstpl bias0 # GC RC - - fstpl bias1 # RC - movl bias0, packCol # B + bias - - fstpl bias0 - movl bias1, %eax # G + bias - -.AIF \&GLIDE_PACK_ALPHA EQ 1 - fldl a(vertex) - faddl (_GlideRoot + fBiasHi) - - and $0x00FF, packCol # B color component - and $0x0000FF00, %eax # G component << 8 - - add $8, dlp # Packed RGB + A dataList entry - nop - - or %eax, packCol # 0000GGBB - nop - - fstpl bias1 - movl bias0, %eax # R + bias - - movl bias1, %esi # A + bias - and $0x0000FF00, %eax # R component << 8 - - and $0x0FFFFFF00, %esi # A component << 8 - shl $8, eax # R << 16 - - or %eax, packCol # 00RRGGBB - shl $16, %esi # A << 16 - - or %esi, packCol # AARRGGBB - nop -.AELSE # !GLIDE_PACK_ALPHA - and $0x00FF, packCol # B color component - and $0x0000FF00, %eax # G component << 8 - - add $4, dlp # Next dataList item - or %eax, packCol - - movl bias0, %eax # R + bias - and $0x0000FF00, %eax # R component << 8 - - shl $8, eax # R << 16 - or %eax, packCol # 00RRGGBB -.AENDI # !GLIDE_PACK_ALPHA - - # PCI write packed color value - GR_FIFO_WRITE fifo, 0, packCol - add $4, fifo -.AENDI # GLIDE_PACK_RGB - - SYMNAME __doParams - movl (dlp), %eax # Get first offset from the data list - add $4, dlp # dlp++ - - cmp $0, %eax # Are we done? - SYMNAMEOP je, __nextVertex - - ## Not using align directive here because it sometimes - ## introduces an agi for the eax use below. - nop - nop - SYMNAME __paramLoop - movl (%eax, vertex), tempVal - add $4, fifo - - movl (dlp), %eax - add $4, dlp - - cmp $0, %eax - GR_FIFO_WRITE fifo, -4, tempVal - - SYMNAMEOP jne, __paramLoop - -.align 4 - SYMNAME __nextVertex - ## On to the next vertex - add $4, vOffset - mov (_GlideRoot + curGC), gc # Reload gc incase we trashed it as a temp - - cmp $16, vOffset # Offset of one past last vertex? - - SYMNAMEOP jne, __vertexStart - - ## Update gc->fifoPtr and gc->fifoRoom - mov fifo, %eax - mov fifoPtr(gc), %ebx - - mov fifo, fifoPtr(gc) - sub %ebx, %eax - - mov (_GlideRoot + trisDrawn), %ebx - sub %eax, fifoRoom(gc) - - add $1, %ebx - mov %ebx, (_GlideRoot + trisDrawn) - - ## return 1 (triangle drawn) - mov $1, %eax - - SYMNAME __triDone - ## Restore trashed registers - mov (_GlideRoot + trisProcessed), %esi - pop %ebp - - add $1, %esi - pop %ebx - - pop %edi - mov %esi, (_GlideRoot + trisProcessed) - - pop %esi - ret diff --git a/glide2x/cvg/glide/tests/alpha.3df b/glide2x/cvg/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a9ee75ce97391cec7bac11305d047b3acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87428 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 L61sFi+%Ekew>Xrd diff --git a/glide2x/cvg/glide/tests/ap88.3df b/glide2x/cvg/glide/tests/ap88.3df deleted file mode 100644 index f465e2df4deec381148203ac5d9ff3f2370606da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173903 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 diff --git a/glide2x/cvg/glide/tests/argb8888.3df b/glide2x/cvg/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df633f2e90395be95f86eb0f6f0670a4bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349577 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%0A5(baphZ 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%0A=HIet5DnK{@e?*Z2PH#*4Aem^}i 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 diff --git a/glide2x/cvg/glide/tests/ayiq.3df b/glide2x/cvg/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d1402b10d51d74ba63f7ea7aa4b1160957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174705 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 QXs@qLeEaF!!yVt< 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 ZrJMHKeXyJB+SRu@`QP!pdo}ao{{eY~5NZGb diff --git a/glide2x/cvg/glide/tests/cmp.bat b/glide2x/cvg/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/cvg/glide/tests/cmp.bat +++ /dev/null @@ -1,65 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_SRCIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DIFFIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DIFFIMG%]==[] goto Default1 - -goto Output1 - -:Default1 -set FX_GLIDE_TEST_DIFFIMG=%BUILD_ROOT_SST1%\glide\images - -:Output1 -set ddir=%FX_GLIDE_TEST_DIFFIMG% - -if [%FX_GLIDE_TEST_SRCIMG%]==[] goto Default2 - -goto Output2 - -:Default2 -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output2 -set sdir=%FX_GLIDE_TEST_SRCIMG% - -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default3 - -goto Output3 - -:Default3 -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output3 -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -isub -v %sdir%\test00.vgm %tdir%\test00.tst %ddir%\test00.tga -isub -v %sdir%\test01.vgm %tdir%\test01.tst %ddir%\test01.tga -isub -v %sdir%\test02.vgm %tdir%\test02.tst %ddir%\test02.tga -isub -v %sdir%\test03.vgm %tdir%\test03.tst %ddir%\test03.tga -isub -v %sdir%\test04.vgm %tdir%\test04.tst %ddir%\test04.tga -isub -v %sdir%\test05.vgm %tdir%\test05.tst %ddir%\test05.tga -isub -v %sdir%\test06.vgm %tdir%\test06.tst %ddir%\test06.tga -isub -v %sdir%\test07.vgm %tdir%\test07.tst %ddir%\test07.tga -isub -v %sdir%\test08.vgm %tdir%\test08.tst %ddir%\test08.tga -isub -v %sdir%\test09_0.vgm %tdir%\test09_0.tst %ddir%\test09_0.tga -isub -v %sdir%\test09_1.vgm %tdir%\test09_1.tst %ddir%\test09_1.tga -isub -v %sdir%\test10_0.vgm %tdir%\test10_0.tst %ddir%\test10_0.tga -isub -v %sdir%\test10_1.vgm %tdir%\test10_1.tst %ddir%\test10_1.tga -isub -v %sdir%\test13.vgm %tdir%\test13.tst %ddir%\test13.tga -isub -v %sdir%\test16.vgm %tdir%\test16.tst %ddir%\test16.tga -isub -v %sdir%\test17_0.vgm %tdir%\test17_0.tst %ddir%\test17_0.tga -isub -v %sdir%\test17_1.vgm %tdir%\test17_1.tst %ddir%\test17_1.tga -isub -v %sdir%\test17_2.vgm %tdir%\test17_2.tst %ddir%\test17_2.tga -isub -v %sdir%\test17_3.vgm %tdir%\test17_3.tst %ddir%\test17_3.tga -isub -v %sdir%\test17_4.vgm %tdir%\test17_4.tst %ddir%\test17_4.tga -isub -v %sdir%\test18.vgm %tdir%\test18.tst %ddir%\test18.tga -isub -v %sdir%\test19_0.vgm %tdir%\test19_0.tst %ddir%\test19_0.tga -isub -v %sdir%\test19_1.vgm %tdir%\test19_1.tst %ddir%\test19_1.tga -isub -v %sdir%\test19_2.vgm %tdir%\test19_2.tst %ddir%\test19_2.tga -isub -v %sdir%\test19_3.vgm %tdir%\test19_3.tst %ddir%\test19_3.tga diff --git a/glide2x/cvg/glide/tests/decal1.3df b/glide2x/cvg/glide/tests/decal1.3df deleted file mode 100644 index f999d3f881cb05e7ebb992c1567a7db09069e12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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 JBDH46{|8XK8>9dL diff --git a/glide2x/cvg/glide/tests/display.c b/glide2x/cvg/glide/tests/display.c deleted file mode 100644 index 3862bbe..0000000 --- a/glide2x/cvg/glide/tests/display.c +++ /dev/null @@ -1,442 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -typedef struct { - FxU32 signature; - FxU16 width; - FxU16 height; - FxU8 depth; - FxU8 type; - void *data; -} LFB_Img; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "display"; -static const char purpose[] = "display a 16 bit frame buffer (565 format) dump out"; -static const char usage[] = "-n -r -s srcimage -t testimage"; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -int main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - char srcfname[80], dstfname[80]; - FILE *fp; - void *mem; - FxU32 filesize; - LFB_Img src, dst, diff; - FxBool txtdisplay = FXTRUE; - - void *image = NULL; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - srcfname[0] = 0; - dstfname[0] = 0; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrst", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 's': - strcpy(srcfname, remArgs[0]); - break; - case 't': - strcpy(dstfname, remArgs[0]); - break; - } - } - - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load src image from disk */ - - if (srcfname[0]) { - fp = fopen(srcfname, "rb"); - if (fp == NULL) - srcfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&src.signature, 4, 1, fp); - if (src.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n", srcfname); - exit(1); - } - fread(&src.width, 2, 1, fp); - fread(&src.height, 2, 1, fp); - fread(&src.depth, 1, 1, fp); - fread(&src.type, 1, 1, fp); - - mem = malloc(filesize-6); - src.data = malloc(src.width*src.height*(src.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - /* Simple16BitDecode(src.width,src.height,mem,src.data); */ - SimpleRleDecode(src.width,src.height,2,mem,src.data); - - free(mem); - fclose(fp); - } - } - - /* Load dst image from disk */ - - if (dstfname[0]) { - fp = fopen(dstfname, "rb"); - if (fp == NULL) - dstfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&dst.signature, 4, 1, fp); - if (dst.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n", dstfname); - exit(1); - } - fread(&dst.width, 2, 1, fp); - fread(&dst.height, 2, 1, fp); - fread(&dst.depth, 1, 1, fp); - fread(&dst.type, 1, 1, fp); - - mem = malloc(filesize-6); - dst.data = malloc(dst.width*dst.height*(dst.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - SimpleRleDecode(dst.width,dst.height,2,mem,dst.data); - - free(mem); - fclose(fp); - } - } - - diff.width = 0; - diff.height = 0; - - if (srcfname[0] && dstfname[0]) { - FxU32 count; - FxU16 *srcptr, *dstptr, *difptr; - - if ((src.width == dst.width) && (src.height == dst.height)) { - diff.width = src.width; - diff.height = src.height; - diff.depth = src.depth; - diff.data = malloc(diff.width*diff.height*(diff.depth/8)); - count = diff.width * diff.height; - srcptr = src.data; - dstptr = dst.data; - difptr = diff.data; - while (count) { - if (*srcptr == *dstptr) - *difptr = 0; - else - *difptr = *srcptr ^ *dstptr; - srcptr++; dstptr++; difptr++; - count--; - } - } - } - - - - sourceFormat = GR_LFB_SRC_FMT_565; - - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, src.data, sourceFormat, &bpp ); - } - else if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) - exit(1); - - while( frames-- ) { - - grBufferClear( 0x00303030, 0, 0 ); - - - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - 0, 0, sourceFormat, - imageWidth, imageHeight, imageWidth*bpp, image ); - tlConClear(); - if (txtdisplay) { - tlConOutput("1 - lfb source format (%s)\n", - sourceFormatString[sourceFormat] ); - if (srcfname[0]) - tlConOutput("s - display source image\n"); - else - tlConOutput("no source image\n"); - if (dstfname[0]) - tlConOutput("t - display test image\n"); - else - tlConOutput("no test image\n"); - if (srcfname[0] && dstfname[0]) { - if (diff.width > 0) - tlConOutput("d - display differences\n"); - else - tlConOutput("source and test image size are not the same\n"); - } - - tlConOutput("space - turn on/off text display\n"); - - tlConOutput("any other key to quit\n\n"); - } - - /* - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "s - display source image\n" - "t - display test image\n" - "d - display differences\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - */ - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - break; - case '+': - break; - case '-': - break; - case 's': - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - imageConvert( image, src.data, sourceFormat, &bpp ); - } - break; - case 't': - if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - break; - case 'd': - if (diff.width > 0) - imageConvert( image, diff.data, sourceFormat, &bpp ); - break; - case ' ': - txtdisplay = !txtdisplay; - break; - default: - frames = 0; - break; - } - } - } - - - grGlideShutdown(); - if (srcfname[0]) - free(src.data); - if (dstfname[0]) - free(dst.data); - if (srcfname[0] && dstfname[0]) - free(diff.data); - free(image); - exit(0); -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 640; - FxU32 shortStride = 640; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 480; y++ ) { - for( x = 0; x < 640; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = - srcData[y*640+x]; - break; - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*640+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*640+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*640+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*640+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - } - } - return; -} - - - diff --git a/glide2x/cvg/glide/tests/h3dtst01.c b/glide2x/cvg/glide/tests/h3dtst01.c deleted file mode 100644 index 066b624..0000000 --- a/glide2x/cvg/glide/tests/h3dtst01.c +++ /dev/null @@ -1,200 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef __linux__ -#include -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#include "tlib.h" - -#define H3D_RED 0x000000ff -#define H3D_GREEN 0x0000ff00 -#define H3D_YELLOW 0x0000ffff -#define H3D_BLACK 0x00000000 - -GrHwConfiguration hwconfig; -static char version[80]; -static int scrWidth, scrHeight, boxwidth, boxheight, origin; - -void init(void) { - GrState state; - - grGlideGetState(&state); - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - - grColorMask(FXTRUE,0); // make sure color buf is on - grDepthBufferFunction( GR_CMP_ALWAYS ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - grGlideSetState(&state); -} - -void drawBoxes(int w, int h, unsigned long c1, unsigned long c2) { - GrVertex p1,p2,p3,p4; - - p1.x = 1.f; - p1.y = 1.f; - p2.x = (float)w; - p2.y = 1.f; - p3.x = 1.f; - p3.y = (float)h; - p4.x = (float)w; - p4.y = (float)h; - grConstantColorValue( c1 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); - - p1.y += origin; - p2.y += origin; - p3.y += origin; - p4.y += origin; - grConstantColorValue( c2 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); -} - -int main( int argc, char **argv) { - int keepworking = 1; - GrScreenResolution_t resolution; - int redraw = 1; - int redrawPattern = 0; - int patternon = 1; - -#ifdef H3D - resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; -#else - resolution = GR_RESOLUTION_640x480; -#endif - - /* Initialize Glide */ - grGlideInit(); - grGlideGetVersion( version ); - grSstQueryHardware( &hwconfig ); - grSstSelect( 0 ); - if ( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2,1 ) ) { - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - } else { - keepworking = 0; - } - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - scrWidth = grSstScreenWidth(); - scrHeight = grSstScreenHeight(); - origin = (int)scrHeight-240; // top of right eye buffer - boxheight = (int)240; - boxwidth = (int)scrWidth; - - while( keepworking) { - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '=' : - case '+' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - redraw = 1; - } - break; - case '_': - case '-' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - redraw = 1; - } - break; - case '.' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - } - break; - case ',' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - } - break; - case 'p': - patternon ^= 1; - redrawPattern = 1; - break; - case 'q': - keepworking = 0; - break; - case ' ': - redraw = 1; - default: - break; - } - } - - if (redraw) { - grColorMask(FXTRUE,0); - grBufferClear( 0, 0, 0 ); - drawBoxes(boxwidth,boxheight,H3D_RED,H3D_YELLOW); - redraw = 0; - grBufferSwap( 1 ); - } else if (redrawPattern) { -#ifdef H3D - grHints(GR_HINT_H3DENABLE,patternon); // set the pattern on or off -#endif - redrawPattern = 0; - } - } - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/cvg/glide/tests/h3dtst02.c b/glide2x/cvg/glide/tests/h3dtst02.c deleted file mode 100644 index f8bbbe3..0000000 --- a/glide2x/cvg/glide/tests/h3dtst02.c +++ /dev/null @@ -1,292 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - -#ifdef H3D - GrScreenResolution_t resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; - float scrWidth = 640.0f; - float scrHeight = 240.0f; -#else - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#endif - int frames = -1; - - Mode mode; - - int i; -#ifdef H3D - int eye,offset; -#endif - static TlVertex3D srcVerts[100]; - float angle; - -// GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - -// if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); -#ifdef H3D - grClipWindow(0, 0, grSstScreenWidth(), grSstScreenHeight()); -#else - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); -#endif -// } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - -#ifdef H3D - for( eye = 0; eye < 2; eye++) { - offset = (int)(eye * (grSstScreenHeight() - scrHeight)); // y offset for right eye - grClipWindow(0, offset, (FxU32) scrWidth, (FxU32) scrHeight + offset); - - for( i = 0; i < 100; i+=2 ) { - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.x = (tlScaleX( prjVerts[i].x ) + (((eye*2)-1)*(vtxA.oow-.5f)*16)); - vtxA.x += SNAP_BIAS; - vtxA.y = tlScaleY( prjVerts[i].y ) + offset; - vtxA.y += SNAP_BIAS; - vtxA.a = 255.0f; - - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.x = SNAP_BIAS + (tlScaleX( prjVerts[i+1].x ) + (((eye*2)-1)*(vtxB.oow-.5f)*16)); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ) + offset; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - } -#else - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } -#endif - - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/cvg/glide/tests/lava.3df b/glide2x/cvg/glide/tests/lava.3df deleted file mode 100644 index f6aef2e7cc5c29c2be89a677527e474449cf7a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88450 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 diff --git a/glide2x/cvg/glide/tests/light.3df b/glide2x/cvg/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/cvg/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/cvg/glide/tests/makefile b/glide2x/cvg/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/cvg/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/cvg/glide/tests/makefile.distrib b/glide2x/cvg/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/cvg/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/cvg/glide/tests/makefile.linux b/glide2x/cvg/glide/tests/makefile.linux deleted file mode 100644 index ce0a9c7..0000000 --- a/glide2x/cvg/glide/tests/makefile.linux +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) - diff --git a/glide2x/cvg/glide/tests/matt1.3df b/glide2x/cvg/glide/tests/matt1.3df deleted file mode 100644 index c02118d70b7a09cd4e8c812890313d3ca7e66bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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%0A@@9x?#-118Xy2(9)_v$Ki zUZ9yI)cg);B0LeTh!v4dBwe$tX~9e_Cy*yKT4pP&y?as1o)37Nch$D_IeyV2SA78A zMz-mk=IpOut#!a_nhQX&{|ZkoT&%^9Q9@%>1vR zCgiXAHsmg2;Gm))j{T?vl$(JlbRhD=x#B8zLlpx0+XP1zGjmsw-K!_Az4i(v@N`qB zu6-kX5DFKwPsxaxW8hdstJl@ici##mmxAwe{lYxFu{UtJ=yU)V7q}l^HO$#hI-|^C zo%&bzNu?J)L<;g&aY_=0{kvM{yV$(Pxf;9StEg91;QJ-N=fL?2c^Ts6fqclEr4%j- zp(BMFT+sPKQqwse$?ZS~<4J0giy1g6k`&v}K0((UZ_*#^6f8H3oXn@8K{| zK5#~eqMySL`idsenby?mwNT7-8Dt8M+m-bWT10||g5pt{u; zaBzs{9}0~eyv*P@w}tE<>rZnH_LbHsdIF9$(NdXzk4hIv=3*|!bA%;bOE-8fA!7v3 zP`bu>f+?pi^Ha`zxKUl>9<%qYQSkK*VBd9xdJd&<99uGA9x&5K5mRM&!hMOJ5Ge9) zdf|Px6&^?0b~s1J@>A2h7qj(TANO{H^3R zu0fk)r|fZbEn+TB_=c;HD&U|4&m#MinXus4+bwUG_jF1-5gGSM-+0&f(P7uu;~o|7 zdI(6de>NdBhe>tZAt=8r-0sM2YiNh#C+L;9nX>{0|L> zsKYVniRMM!WKIwzzTI}&lmtqn;!86BD_TwR)_a_MthN1*fZ2U z0#1Hg&nTZLKmVac9%mndex63$RCjjLw$*mgm}R@^Oj#%dzmJg-r?!xY4Vo0)bn8C~ zr!%{&SY0p+(LwQSWR^~i;C(iHo4aDEOT0kT1Gb~)cib(0yB6DozV~vH+x2tDn}GT> z_hi;Zp`vS3pZ@cTg$S?_+X;=O<$=K2(oSpW=xDoyx7ba*!;K3OE`uvuid2lERtYNS z)hvyyFKw*1ih(|zdk5a7e)h8XjN73^%0|51v8LbJujHUExV|&w*;b}s+$N+5iuA#s zHoIP1Z3jni_l&R-90}JJ))jVVzq^y2WKN(W-e`@-`f(Ee!28%5bo%oCb@cD8+(%QL zbOgLg5V?6g-RP+H0$GAm>1DI$myWI~qt^2?HhJC0q$^zfUK;xV!#gW~3yIAJ+LP4kaHN!KofE`%VeM10*7`YN=k_{}K0 z1=?ZkO2{mty2b5?n{wPcn3L2@TlnYgm40c3T-q+fakTN5Bsa}>3B5`q99{dRMz_fw zX$g96z%wyT?d4KEsZU4JWkK<-LB2IPdzY>5>99S;HZA4Rzey%0m5b%Jt1G0Ho?iKx zvW2<mDI7!A^szg~zES|y%+|arar<~b)y)TG LO^IZu`0oD&YPtbf diff --git a/glide2x/cvg/glide/tests/miro.3df b/glide2x/cvg/glide/tests/miro.3df deleted file mode 100644 index 313b6748691df72d531253612e431081598eba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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

m7cIAS4V0eG5 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 CG9h*V diff --git a/glide2x/cvg/glide/tests/p8.3df b/glide2x/cvg/glide/tests/p8.3df deleted file mode 100644 index 391f60b980b30a1b82c595f812e38f9aa34e610d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86520 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%0ANqU_0^sOTJ2K~;|W!-tA(zeB_;G4IJP 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 diff --git a/glide2x/cvg/glide/tests/plib.c b/glide2x/cvg/glide/tests/plib.c deleted file mode 100644 index aac8164..0000000 --- a/glide2x/cvg/glide/tests/plib.c +++ /dev/null @@ -1,1397 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - -/* static helper prototypes */ -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/cvg/glide/tests/plib.h b/glide2x/cvg/glide/tests/plib.h deleted file mode 100644 index 933e272..0000000 --- a/glide2x/cvg/glide/tests/plib.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/qatest00.c b/glide2x/cvg/glide/tests/qatest00.c deleted file mode 100644 index 0690717..0000000 --- a/glide2x/cvg/glide/tests/qatest00.c +++ /dev/null @@ -1,1239 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre = 0, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre = 0, /* last algo texture */ - hFstDwnlTxtre = 0, /* first lod download texture */ - hLstDwnlTxtre = 0, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) - { - if ( rv == -1 ) - { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", tlGetResolutionList() ); - exit(1); - } - - switch( match ) - { - case 'n': - frames = atoi( remArgs[0] ); - break; - - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], &scrWidth, &scrHeight ); - break; - } - } /* while */ - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - - if ( frames == -1 ) - { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, 60, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - exit(1); -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/cvg/glide/tests/qatest00.h b/glide2x/cvg/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/cvg/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/qatest01.c b/glide2x/cvg/glide/tests/qatest01.c deleted file mode 100644 index b31e9f9..0000000 --- a/glide2x/cvg/glide/tests/qatest01.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -** -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -int main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/rgb332.3df b/glide2x/cvg/glide/tests/rgb332.3df deleted file mode 100644 index f06219ae82ac55624b8fa021bacc569e2afc0956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87432 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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while(( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) )) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/cvg/glide/tests/test01.c b/glide2x/cvg/glide/tests/test01.c deleted file mode 100644 index 94e50ed..0000000 --- a/glide2x/cvg/glide/tests/test01.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test02.c b/glide2x/cvg/glide/tests/test02.c deleted file mode 100644 index 03a74a3..0000000 --- a/glide2x/cvg/glide/tests/test02.c +++ /dev/null @@ -1,159 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test03.c b/glide2x/cvg/glide/tests/test03.c deleted file mode 100644 index 2205235..0000000 --- a/glide2x/cvg/glide/tests/test03.c +++ /dev/null @@ -1,154 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen(0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test04.c b/glide2x/cvg/glide/tests/test04.c deleted file mode 100644 index 3c33d77..0000000 --- a/glide2x/cvg/glide/tests/test04.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test05.c b/glide2x/cvg/glide/tests/test05.c deleted file mode 100644 index 11829a4..0000000 --- a/glide2x/cvg/glide/tests/test05.c +++ /dev/null @@ -1,191 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test06.c b/glide2x/cvg/glide/tests/test06.c deleted file mode 100644 index 9ef1cd6..0000000 --- a/glide2x/cvg/glide/tests/test06.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test07.c b/glide2x/cvg/glide/tests/test07.c deleted file mode 100644 index 6541771..0000000 --- a/glide2x/cvg/glide/tests/test07.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -** -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + alpha blend on constant alpha */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test08.c b/glide2x/cvg/glide/tests/test08.c deleted file mode 100644 index 90d26ec..0000000 --- a/glide2x/cvg/glide/tests/test08.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test09.c b/glide2x/cvg/glide/tests/test09.c deleted file mode 100644 index 9a9d0de..0000000 --- a/glide2x/cvg/glide/tests/test09.c +++ /dev/null @@ -1,212 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) )) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test10.c b/glide2x/cvg/glide/tests/test10.c deleted file mode 100644 index f3f58a1..0000000 --- a/glide2x/cvg/glide/tests/test10.c +++ /dev/null @@ -1,207 +0,0 @@ -/* -** -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/cvg/glide/tests/test11.c b/glide2x/cvg/glide/tests/test11.c deleted file mode 100644 index 305bc66..0000000 --- a/glide2x/cvg/glide/tests/test11.c +++ /dev/null @@ -1,260 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(0); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - exit(1); - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/cvg/glide/tests/test12.c b/glide2x/cvg/glide/tests/test12.c deleted file mode 100644 index 4abd5e1..0000000 --- a/glide2x/cvg/glide/tests/test12.c +++ /dev/null @@ -1,345 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - exit(1); - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} /* main */ - - - diff --git a/glide2x/cvg/glide/tests/test13.c b/glide2x/cvg/glide/tests/test13.c deleted file mode 100644 index 740c29c..0000000 --- a/glide2x/cvg/glide/tests/test13.c +++ /dev/null @@ -1,174 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test14.c b/glide2x/cvg/glide/tests/test14.c deleted file mode 100644 index 42170ed..0000000 --- a/glide2x/cvg/glide/tests/test14.c +++ /dev/null @@ -1,184 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - short zBias; - short zDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test15.c b/glide2x/cvg/glide/tests/test15.c deleted file mode 100644 index 95d820d..0000000 --- a/glide2x/cvg/glide/tests/test15.c +++ /dev/null @@ -1,217 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test16.c b/glide2x/cvg/glide/tests/test16.c deleted file mode 100644 index a696250..0000000 --- a/glide2x/cvg/glide/tests/test16.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test17.c b/glide2x/cvg/glide/tests/test17.c deleted file mode 100644 index d2e7a01..0000000 --- a/glide2x/cvg/glide/tests/test17.c +++ /dev/null @@ -1,292 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test18.c b/glide2x/cvg/glide/tests/test18.c deleted file mode 100644 index 20bdaa5..0000000 --- a/glide2x/cvg/glide/tests/test18.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test19.c b/glide2x/cvg/glide/tests/test19.c deleted file mode 100644 index 7867175..0000000 --- a/glide2x/cvg/glide/tests/test19.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; - -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} diff --git a/glide2x/cvg/glide/tests/test20.c b/glide2x/cvg/glide/tests/test20.c deleted file mode 100644 index f99640f..0000000 --- a/glide2x/cvg/glide/tests/test20.c +++ /dev/null @@ -1,320 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test21.c b/glide2x/cvg/glide/tests/test21.c deleted file mode 100644 index 1fc7ad3..0000000 --- a/glide2x/cvg/glide/tests/test21.c +++ /dev/null @@ -1,374 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test22.c b/glide2x/cvg/glide/tests/test22.c deleted file mode 100644 index 042cf3d..0000000 --- a/glide2x/cvg/glide/tests/test22.c +++ /dev/null @@ -1,306 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/test23.c b/glide2x/cvg/glide/tests/test23.c deleted file mode 100644 index ff48f4d..0000000 --- a/glide2x/cvg/glide/tests/test23.c +++ /dev/null @@ -1,260 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - int speed; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/cvg/glide/tests/test24.c b/glide2x/cvg/glide/tests/test24.c deleted file mode 100644 index 1d6b088..0000000 --- a/glide2x/cvg/glide/tests/test24.c +++ /dev/null @@ -1,255 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/cvg/glide/tests/test25.c b/glide2x/cvg/glide/tests/test25.c deleted file mode 100644 index 7864a0f..0000000 --- a/glide2x/cvg/glide/tests/test25.c +++ /dev/null @@ -1,898 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - */ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime = 0; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame = 0, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrbtea", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( remArgs[0] ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %ld\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/cvg/glide/tests/test26.c b/glide2x/cvg/glide/tests/test26.c deleted file mode 100644 index 08a09e9..0000000 --- a/glide2x/cvg/glide/tests/test26.c +++ /dev/null @@ -1,370 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "bdnr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - exit(1); - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - exit(0); -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 256; - FxU32 shortStride = 256; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+x]; - shortColor = ((0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f)); - shortData[y*shortStride+x] = shortColor; - break; - - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*256+x]; - longColor = ((0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8)); - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/cvg/glide/tests/test27.c b/glide2x/cvg/glide/tests/test27.c deleted file mode 100644 index 95cbf3a..0000000 --- a/glide2x/cvg/glide/tests/test27.c +++ /dev/null @@ -1,204 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "Nnr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'N': - doNothing = 1; - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/cvg/glide/tests/test28.c b/glide2x/cvg/glide/tests/test28.c deleted file mode 100644 index 79e5d32..0000000 --- a/glide2x/cvg/glide/tests/test28.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/cvg/glide/tests/testdesc.txt b/glide2x/cvg/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/cvg/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/cvg/glide/tests/testimg.bat b/glide2x/cvg/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/cvg/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/cvg/glide/tests/tldata.inc b/glide2x/cvg/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/cvg/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/cvg/glide/tests/tlib.c b/glide2x/cvg/glide/tests/tlib.c deleted file mode 100644 index 408d306..0000000 --- a/glide2x/cvg/glide/tests/tlib.c +++ /dev/null @@ -1,1787 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#include -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = (float)fontTable[(int) character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = (float)fontTable[(int) character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - return !!fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/cvg/glide/tests/tlib.h b/glide2x/cvg/glide/tests/tlib.h deleted file mode 100644 index d21dce9..0000000 --- a/glide2x/cvg/glide/tests/tlib.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#define NDEBUG -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/cvg/glide/tests/yiq.3df b/glide2x/cvg/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5d95988c8b3e6585f30064d68b6ed2fe5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87319 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 Gmia$yEDt#V diff --git a/glide2x/cvg/include/makefile b/glide2x/cvg/include/makefile deleted file mode 100644 index 28ecd22..0000000 --- a/glide2x/cvg/include/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = *.h - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/cvg/include/makefile.linux b/glide2x/cvg/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/cvg/include/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/cvg/incsrc/cvg.h b/glide2x/cvg/incsrc/cvg.h deleted file mode 100644 index 19a3096..0000000 --- a/glide2x/cvg/incsrc/cvg.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include <3dfx.h> -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/cvg/incsrc/cvgdefs.h b/glide2x/cvg/incsrc/cvgdefs.h deleted file mode 100644 index 759b569..0000000 --- a/glide2x/cvg/incsrc/cvgdefs.h +++ /dev/null @@ -1,944 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __CVGDEFS_H__ -#define __CVGDEFS_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- - -// CVG/H3 abstraction -#define SST_IS_CMDFIFO_ENABLED(sst) (sst->fbiInit7 & SST_EN_CMDFIFO) - -//----------------- SST cmdFifoBase bits --------------------------- -#define SST_CMDFIFO_START_SHIFT 0 -#define SST_CMDFIFO_START (0x3FF<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000L) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -#define BIT(n) (1UL<<(n)) -#define SST_MASK(n) (0xFFFFFFFFL >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST status bits --------------------------- -#define SST_FIFOLEVEL 0x3F -#define SST_VRETRACE BIT(6) -#define SST_FBI_BUSY BIT(7) -#define SST_TMU_BUSY BIT(8) -#define SST_TREX_BUSY SST_TMU_BUSY -#define SST_BUSY BIT(9) -#define SST_DISPLAYED_BUFFER_SHIFT 10 -#define SST_DISPLAYED_BUFFER (0x3< - -#include - -// Allow SourceSafe to track Revision values -#define HAL_H_REV "$Revision$" - -// Just to unconfuse myself: -// -// CHIP FBI-REV TMU-REV DEV-ID -// SST1-0.6u 1 0 1 -// SST1-0.5u 2 1 1 -// SST-96 2 (1) 2 -// H3 3 4 4 -// H4 ? ? 4? -#define SST_DEVICE_ID_SST1 1 -#define SST_DEVICE_ID_SST96 2 -#define SST_DEVICE_ID_H3 3 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 16 - -//---------------------------------------------------------------------- -// the root of all Hal information -//---------------------------------------------------------------------- -typedef struct { - int csim; - int hsim; - int hw; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -//---------------------------------------------------------------------- -/* -** SST Hardware Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 0. fxHalInit(); -** 1. fxHalMapBoard(); -** 2. fxHalInitRegisters(); -** 3. fxHalInitGamma(); -** 4. fxHalInitVideo(); -** 5. fxHalShutdown(); -** -** fxHalShutdown() is called at the end of an application to turn off -** the graphics subsystem -** -*/ - -FX_ENTRY void FX_CALL fxHalPutenv(char *buf); -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); -FX_ENTRY FxU32 FX_CALL fxHalNumBoardsInSystem(void); -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); -FX_ENTRY FxBool FX_CALL fxHalInitCmdFifo( SstRegs *sst, int which, - FxU32 fifoStart, FxU32 size, - FxBool directExec, FxBool disableHoles, - FxSet32Proc set32); -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitRenderingRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitGamma(SstRegs *sst, FxFloat gamma); -FX_ENTRY FxBool FX_CALL fxHalInitGammaRGB(SstRegs *sst, FxFloat r, FxFloat g, FxFloat b); -FX_ENTRY FxBool FX_CALL fxHalInitVideo(SstRegs *sst, FxU32 resolution, - FxU32 refresh, sst1VideoTimingStruct *); -FX_ENTRY FxBool FX_CALL fxHalIdle(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNOP(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleFBINoNOP( SstRegs *sst ); -FX_ENTRY FxBool FX_CALL fxHalShutdown(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitUSWC(SstRegs *sst); -FX_ENTRY void FX_CALL fxHalShutdownAll(void); -FX_ENTRY FxBool FX_CALL fxHalGetDeviceInfo(SstRegs *sst, FxDeviceInfo *); -FX_ENTRY FxBool FX_CALL fxHalInitSLI(SstRegs *sst, SstRegs *sst1); - -FX_ENTRY FxBool FX_CALL fxHalVsync(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalVsyncNot(SstRegs *sst); - - - #define GET8(s) s - #define GET16(s) s - #define GET(s) s - #define SET8(d,s) d = s - #define SET16(d,s) d = s - #define SET(d,s) d = s - #define SETF(d,s) (*(float *)&(d)) = s - -//--------------------------------------------------------------------------- -// internal HAL stuff not meant for external use -//--------------------------------------------------------------------------- -#if defined(BUILD_HAL) || defined(BUILD_DIAGS) - -// GMT: Init code SET/GET always go thru subroutines (allows for P6 fencing) -#define IGET(A) fxHalRead32((FxU32 *) &(A)) -#define ISET(A,D) fxHalWrite32((FxU32 *) &(A), D) - -// this is the FAKE address where the hardware lives -// we use a large address so attempts to write to it get an access violation -// and it has 28 zero bits so that we can easily figure out the board number -// and the offset into the board -#define SST_FAKE_ADDRESS_MAKE(i) (SstRegs *)((i+1)<<28) -#define SST_FAKE_ADDRESS_GET_BOARD(a) ((((FxU32)a>>28)&0xF)-1) -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE(a) ((FxI32)a&~0x0FFFFFFF) - -extern HalInfo halInfo; - -// internal HAL routines -FxU32 fxHalRead32(FxU32 *addr); -void fxHalWrite32(FxU32 *addr, FxU32 data); - -FxBool fxHalIdleFBI( SstRegs *sst ); - -void fxHalResetBoardInfo( FxDeviceInfo *info ); -FxBool fxHalFillDeviceInfo( SstRegs *sst ); -// FxBool fxHalGetFbiInfo( SstRegs *sst, FxDeviceInfo *info ); -// FxBool fxHalGetTmuInfo( SstRegs *sst, FxDeviceInfo *info ); -FxBool fxHalVaddrToBoardNumber( SstRegs *sst, FxU32 *boardNumber ); - -// GUI interface -FX_ENTRY void FX_CALL guiNewViewWindow(FxU32 boardNumber, const char *name); -void guiReadMessageQueue(void); -FxBool guiOpen( FxU32 boardNumber ); -void guiShutdown( SstRegs *sst ); - -#endif /* BUILD_HAL */ - -#endif /* !__FXHAL_H__ */ diff --git a/glide2x/cvg/incsrc/gdebug.h b/glide2x/cvg/incsrc/gdebug.h deleted file mode 100644 index 0889b47..0000000 --- a/glide2x/cvg/incsrc/gdebug.h +++ /dev/null @@ -1,138 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include - -#if defined(FX_DLL_ENABLE) -#define FX_DLL_DEFINITION - -#endif -#include - -#define GDBG_MAX_LEVELS 512 - -#ifndef GETENV -#define GETENV(a) getenv(a) -#endif - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) \ - gdbg_info(level, format , ## args) -#define GDBG_INFO_MORE(level, format, args...) \ - gdbg_info_more(level, format , ## args) -#define GDBG_PRINTF(format, args...) \ - gdbg_printf(format , ## args) - -#else - -#define GDBG_INFO gdbg_info -#define GDBG_INFO_MORE gdbg_info_more -#define GDBG_PRINTF gdbg_printf - -#endif - -#define GDBG_ERROR_SET_CALLBACK gdbg_error_set_callback -#define GDBG_ERROR_CLEAR_CALLBACK gdbg_error_clear_callback - -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel - -// otherwise GDBG_INFO does nothing -#else - -#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) -/* Turn off the dead code warnings. Also changed the macro definitions - * to use an 'if' rather than the ternary operator because the - * type of the result sub-expressions must match. - * - * w111: Meaningless use of an expression - * w201: Unreachable code - */ -#pragma disable_message (111, 201) -#endif /* defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) */ - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) -#define GDBG_INFO_MORE(level, format, args...) -#define GDBG_PRINTF(format, args...) - -#else - -#define GDBG_INFO 0 && (unsigned long) -#define GDBG_INFO_MORE 0 && (unsigned long) -#define GDBG_PRINTF 0 && (unsigned long) - -#define GDBG_ERROR_SET_CALLBACK 0 && (unsigned long) -#define GDBG_ERROR_CLEAR_CALLBACK 0 && (unsigned long) - -#endif - -#define GDBG_GET_DEBUGLEVEL(x) 0 -#define GDBG_SET_DEBUGLEVEL(a,b) - - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_SHUTDOWN gdbg_shutdown -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_parse(const char *env); -FX_ENTRY void FX_CALL gdbg_shutdown(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); - -// these routines allow for a library (like Glide) to get called back -typedef void (*GDBGErrorProc)(const char* const procName, - const char* const format, - va_list args); -FX_ENTRY int FX_CALL gdbg_error_set_callback(GDBGErrorProc p); -FX_ENTRY void FX_CALL gdbg_error_clear_callback(GDBGErrorProc p); - -// these routines allow for some GUI code to get called once in a while -// so that it can keep the UI alive by reading the message queue -typedef void (*GDBGKeepAliveProc)(int adjust); -FX_ENTRY void FX_CALL gdbg_set_keepalive(GDBGKeepAliveProc p); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/cvg/incsrc/h3.h b/glide2x/cvg/incsrc/h3.h deleted file mode 100644 index 19a3096..0000000 --- a/glide2x/cvg/incsrc/h3.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include <3dfx.h> -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/cvg/incsrc/makefile b/glide2x/cvg/incsrc/makefile deleted file mode 100644 index f57770c..0000000 --- a/glide2x/cvg/incsrc/makefile +++ /dev/null @@ -1,29 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -HEADERS=cvg.h cvgdefs.h cvginfo.h cvgregs.h fxhal.h gdebug.h h3.h sst1vid.h vxd.h - -INSTALL_DESTINATION=$(BUILD_ROOT)\cvg - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/cvg/incsrc/makefile.linux b/glide2x/cvg/incsrc/makefile.linux deleted file mode 100644 index fd733c1..0000000 --- a/glide2x/cvg/incsrc/makefile.linux +++ /dev/null @@ -1,29 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -HEADERS=$(wildcard *.h) - -INSTALL_DESTINATION=$(BUILD_ROOT)/cvg - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/cvg/incsrc/sst1vid.h b/glide2x/cvg/incsrc/sst1vid.h deleted file mode 100644 index 5112a0b..0000000 --- a/glide2x/cvg/incsrc/sst1vid.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 5 3/10/98 2:33p Psmith -** separating cvg tree from h3/h4 trees - * - * 4 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_1600x1200 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/cvg/incsrc/vxd.h b/glide2x/cvg/incsrc/vxd.h deleted file mode 100644 index 02eedff..0000000 --- a/glide2x/cvg/incsrc/vxd.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#ifndef _VXD_H_ -#define _VXD_H_ - -#if defined(KERNEL) && !defined(KERNEL_NT) -#define WANTVXDWRAPS -#define DEBUG -#include -#include -#include -#include -#pragma VxD_LOCKED_CODE_SEG -//#pragma VxD_LOCKED_DATA_SEG -#endif /* #ifdef KERNEL */ - -#endif /* #ifndef _VXD_H_ */ diff --git a/glide2x/cvg/init/canopus.c b/glide2x/cvg/init/canopus.c deleted file mode 100644 index 701468b..0000000 --- a/glide2x/cvg/init/canopus.c +++ /dev/null @@ -1,182 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing canpus cards w/ assymetric -** inter-chip buses. -** -*/ - -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* - * Syntax: LarsF (8/2/97) - * sst1InitComputeClkParamsATT_Int(Frequ, *clkTiming); - * - *---------------------------------------------------------------------------- - * Description: - * Calculates the PLL Parameter for the given Frequency in Hz - * - * Input : Frequ - Frequency in Hz - * *clkTiming - pointer to timing structure - * Output: *clkTiming - pointer to timing structure which would be filled - * Return: 1 - Sucess, 0 - Error - */ -FxBool -sst1InitComputeClkParamsATT_Int(FFLOAT dwFreq, sst1ClkTimingStruct *clkTiming) -{ -#define MMAX (126+2) /* physical limit of the M parameter */ -#define NMID 18 /* PLL: middle N test range */ -#define NDELTA 15 /* PLL: +/- N test range */ -#define FI (14318180l) /* PLL: PLL frequenz in HZ */ - - FxU32 lPDiv, lRatio; - FxU16 sN, sM, sP; - FxU16 sNBest, sMBest; - FxU32 lError, lActual; - FxU32 lBestErr, lBestFreq; - - // first check range of Frequ - if ((dwFreq < 15000000) || (dwFreq > 240000000)) return FXFALSE; - - // get the best P divider for the given Frequency - if (dwFreq < 30000000) { - sP = 3; /* divide by 16 */ - lPDiv = 8; - } else if ( dwFreq < 60000000 ) { - sP = 2; /* divide by 8 */ - lPDiv = 4; - } else if ( dwFreq < 120000000 ) { - sP = 1; /* divide by 4 */ - lPDiv = 2; - } else { - sP = 0; /* divide by 1 */ - lPDiv = 1; - } - - // next find the best N/M combination - lBestErr = 99999999; - sNBest = 0; - sMBest = 0; - lRatio = (unsigned long)((dwFreq*10l)/(FI/100l)) * lPDiv; // lRatio in [1/1000] - for ( sN= (NMID-NDELTA); sN <= (NMID+NDELTA); sN++ ) { - sM = (unsigned short)((lRatio * sN + 500) / 1000l); - if (sM > MMAX) sM = MMAX; - - lActual = (unsigned long)((FI * sM) / (sN * lPDiv)); - lError = (lActual > dwFreq) ? (lActual - dwFreq) : (dwFreq - lActual); - if ( lError < lBestErr ) { - sNBest = sN; - sMBest = sM; - lBestErr = lError; - lBestFreq = lActual; - } /* if best */ - - /* increment M also */ - sM++; - if (sM > MMAX) sM = MMAX; - - lActual = (unsigned long)((FI * sM) / (sN * lPDiv)); - lError = (lActual > dwFreq) ? (lActual - dwFreq) : (dwFreq - lActual); - if ( lError < lBestErr) { - sNBest = sN; - sMBest = sM; - lBestErr = lError; - lBestFreq = lActual; - } /* if best */ - } /* for sN */ - - if(sNBest == 0) return(FXFALSE); - - sM = sMBest-2; - sN = sNBest-2; - - clkTiming->freq = (float)(dwFreq / 1000000.0f); - clkTiming->clkTiming_M = sM; - clkTiming->clkTiming_P = sP; - clkTiming->clkTiming_N = sN; - if(dwFreq < 37000000) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(dwFreq < 45000000) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(dwFreq < 58000000) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(dwFreq < 66000000) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } - - return FXTRUE; -} /* sst1InitComputeClkParamsATT_Int() */ - -/* -** sst1UsrSetGrxClk(): -** Initialize FBI and TREX Memory clocks to a user value -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FxBool -sst1SetGrxClk_Canopus(FxU32* sstbase, FFLOAT grxclk) -{ - FxBool RetVal; - sst1ClkTimingStruct sstGrxClk; - - if(!sst1InitCheckBoard(sstbase)) - return(FXFALSE); - - if(!sst1InitComputeClkParamsATT_Int(grxclk * CLOCK_MULTIPLIER, &sstGrxClk)) - return(FXFALSE); - - sst1CurrentBoard->initGrxClkDone = 0; // Allow clk to be reset to user value. - - RetVal = sst1InitSetGrxClk(sstbase, &sstGrxClk); - - sst1CurrentBoard->initGrxClkDone = 0; // Allow clk to be set to the choosen value again - - return(RetVal); -} - diff --git a/glide2x/cvg/init/canopus.h b/glide2x/cvg/init/canopus.h deleted file mode 100644 index e9a3385..0000000 --- a/glide2x/cvg/init/canopus.h +++ /dev/null @@ -1,45 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#ifndef _CANOPUS_H_ -#define _CANOPUS_H_ - -// if we use FFLOAT as an integer, we need to handle clocks in Hz -#define CLOCK_MULTIPLIER 1000000L -typedef unsigned long FFLOAT; -typedef unsigned long DDOUBLE; - -/* FixMe!! Is this right? */ -#define CANOPUS_ID 0x10UL - -/* whacked.c */ -extern FxBool -sst1InitComputeClkParamsATT_Int(FFLOAT freq, sst1ClkTimingStruct* clkTiming); - -extern FxBool -sst1SetGrxClk_Canopus(FxU32* sstbase, FFLOAT grxclk); - -#endif /* _CANOPUS_H_ */ diff --git a/glide2x/cvg/init/dac.c b/glide2x/cvg/init/dac.c deleted file mode 100644 index f924bd2..0000000 --- a/glide2x/cvg/init/dac.c +++ /dev/null @@ -1,1374 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing supported SST-1 DACs -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* -** sst1InitDacRd(): -** Read external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** fbiInit23 register remapping (PCI config. initEnable[2]=1) must be -** enabled before calling this routine -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitDacRd(FxU32 *sstbase, FxU32 addr) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 retVal; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, ((addr) << SST_DACDATA_ADDR_SHIFT) | SST_DACDATA_RD); - sst1InitIdleFBINoNOP(sstbase); - retVal = IGET(sst->fbiInit2) & SST_DACDATA_DATA; - if(helper) - INIT_PRINTF(("dacRd(0x%x,0x%x)\n", addr, retVal)); - - return(retVal); -} - -/* -** sst1InitDacWr(): -** Write to external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitDacWr(FxU32 *sstbase, FxU32 addr, FxU32 data) -{ - SstRegs *sst = (SstRegs *) sstbase; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, - (data & SST_DACDATA_DATA) | - ((addr) << SST_DACDATA_ADDR_SHIFT) | - SST_DACDATA_WR); - sst1InitIdleFBINoNOP(sstbase); - - if(helper) - INIT_PRINTF(("dacWr(0x%x,0x%x)\n", addr, data)); -} - -/* -** sst1InitExecuteDacRdWr(): -** Execute DAC read/write command sequence defined in "voodoo2.ini" file -** -*/ -FxBool sst1InitExecuteDacRdWr(FxU32 *sstbase, sst1InitDacRdWrStruct - *dacRdWrBase) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - FxU32 data; - FxBool retVal = FXTRUE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - sst1InitDacWr(sstbase, dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - if(helper) - INIT_PRINTF(("dacRdWr(Read=0x%x)\n", data)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_WRMOD_POP) { - data = iniStack[--iniStackPtr]; - if(iniStackPtr < 0) { - retVal = FXFALSE; - break; - } - if(helper) - INIT_PRINTF(("dacWrModPop(Stack=0x%x,Mask=0x%x)\n", data, - dacRdWrPtr->mask)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - sst1InitDacRd(sstbase, dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDPUSH) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - iniStack[iniStackPtr++] = data; - if(iniStackPtr == DACRDWR_MAX_PUSH) { - retVal = FXFALSE; - break; - } - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - if(sst1InitDacRd(sstbase, dacRdWrPtr->addr) != dacRdWrPtr->data) { - retVal = FXFALSE; - break; - } - } else { - retVal = FXFALSE; - break; - } - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - return(retVal); -} - -/* -** sst1InitDacDetect(): -** Detect type of on-board DAC -** NOTE: sst1InitDacDetect() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacDetect(FxU32 * sstbase) -{ - FxU32 n; - FxU32 fbiInit1_save; - FxU32 fbiInit2_save; - SstRegs *sst = (SstRegs *) sstbase; - FxBool retVal = FXFALSE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(!sst) - return(FXFALSE); - - if(helper) - INIT_PRINTF(("sst1InitDacDetect(): Entered...\n")); - - if (sst1InitCheckBoard(sstbase) == FXFALSE) - return (FXFALSE); - - /* check to see if we are a single board SLI slave, if - * so we have no dac... - */ - //if (sst1CurrentBoard->singleBrdSLISlave) { - // sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_PROXY; - // return FXTRUE; - //} - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitDacDetectINI(sstbase); - } else { - if((retVal = sst1InitDacDetectICS(sstbase)) == FXTRUE) - goto done; - if((retVal = sst1InitDacDetectATT(sstbase)) == FXTRUE) - goto done; - retVal = sst1InitDacDetectTI(sstbase); - } - -done: - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(retVal); -} - -/* -** sst1InitDacDetectINI(): -** Detect DAC based on rules supplied in "voodoo2.ini" -** -*/ -FxBool sst1InitDacDetectINI(FxU32 * sstbase) -{ - sst1InitDacStruct *dacPtr; - FxU32 j; - FxBool retVal = FXFALSE; - - dacPtr = dacStructBase; - while(dacPtr) { - if(dacPtr->detect) { - /* Loop multiple times, as some DACs go into never-never land... */ - for(j=0; j<100; j++) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, dacPtr->detect)) - == FXTRUE) { - iniDac = dacPtr; - break; - } - } - if(retVal == FXTRUE) - break; - } - dacPtr = dacPtr->nextDac; - } - return(retVal); -} - -FxBool sst1InitDacDetectATT(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Entered...\n")); - - /* Detect ATT */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found ATT DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_ATT; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectTI(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Entered...\n")); - - /* Detect TI */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found TI DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_TI; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectICS(FxU32 * sstbase) -{ - FxU32 n; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Entered...\n")); - - /* Detect ICS... */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - FxU32 gclk1, vclk1, vclk7; - - if(++n > 100) - break; - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_GCLK1); - gclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK1); - vclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK7); - vclk7 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - if((gclk1 == SST_DACREG_ICS_PLLADDR_GCLK1_DEFAULT) && - (vclk1 == SST_DACREG_ICS_PLLADDR_VCLK1_DEFAULT) && - (vclk7 == SST_DACREG_ICS_PLLADDR_VCLK7_DEFAULT)) { - /* found ICS DAC... */ - sst1CurrentBoard->fbiVideoDacType = SST_FBI_DACTYPE_ICS; - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXTRUE); - } - } - - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXFALSE); -} - -/* -** sst1InitCalcGrxClk(): -** Determine graphics clock frequency -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcGrxClk(FxU32 *sstbase) -{ - FxU32 clkFreq; - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_GRXCLK"))) { - INIT_PRINTF(("sst1InitCalcGrxClk(): Overriding default clk frequency with SST_GRXCLK\n")); - clkFreq = ATOI(GETENV(("SSTV2_GRXCLK"))); - if(clkFreq < 16) - clkFreq = 16; - } else { - if(sst1CurrentBoard->numberTmus == 1 && - sst1CurrentBoard->fbiMemSize == 2 && - sst1CurrentBoard->tmuMemSize[0] == 2) - clkFreq = 83; - else - // clkFreq = 50 + (value of fb_data[63:58] latched during reset) - clkFreq = 50 + ((IGET(sst->fbiInit7) >> 2) & 0x3f); - } - sst1CurrentBoard->fbiGrxClkFreq = clkFreq; - sst1CurrentBoard->tmuGrxClkFreq = clkFreq; - return(FXTRUE); -} - -/* -** sst1InitGrxClk(): -** Initialize FBI and TREX Memory clocks -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGrxClk(FxU32 *sstbase) -{ - sst1ClkTimingStruct sstGrxClk; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - if(sst1CurrentBoard->initGrxClkDone) - return(FXTRUE); - sst1CurrentBoard->initGrxClkDone = 1; - - INIT_PRINTF(("sst1InitGrxClk(): Setting up %d MHz Graphics Clock...\n", - sst1CurrentBoard->fbiGrxClkFreq)); - if(sst1CurrentBoard->sliDetected) { - sst1CurrentBoard->fbiGrxClkFreq -= 5; - sst1CurrentBoard->tmuGrxClkFreq -= 5; - } - if(sst1InitComputeClkParams((float) sst1CurrentBoard->fbiGrxClkFreq, - &sstGrxClk) == FXFALSE) - return(FXFALSE); - - return(sst1InitSetGrxClk(sstbase, &sstGrxClk)); -} - -/* -** sst1InitComputeClkParams(): -** Compute PLL parameters for given clock frequency -** -*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitComputeClkParams(float freq, sst1ClkTimingStruct* clkTiming) -{ - /* If we're using a canopus board then we need to use the - * integer-ized version of the clock parameter computation. This - * only supports the att dac. - * - * NB: The bits in fbiInit5 are only moderatly documented as being - * the value of the power-on strapping bits. fbiInit5[8:5] is what - * sst1GetFbiInfo uses to set the internal fbiBoardID, but the - * canopus board currently does not seem to have these set to - * anything while other boards (including the reference design) - * return non-zero values. - * - * NB: There is also a possible race condition here in reading these - * bits before the hw is actually reset. I don't think it could - * happen, but the value could be whacky if the hw was in some - * really horrible state when this is called to set the initial - * clock to 16mhz before doing the rest of the reset. - */ - sst1CurrentBoard->fbiBoardID = ((IGET(sst1CurrentBoard->virtAddr[0]->fbiInit5) >> 0x05UL) & 0x0FUL); - if (sst1CurrentBoard->fbiBoardID == CANOPUS_ID) { - return sst1InitComputeClkParamsATT_Int((FFLOAT)(freq * CLOCK_MULTIPLIER), clkTiming); - } else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI) { - return sst1InitComputeClkParamsTI(freq, clkTiming); - } else if (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) { - FxU32 i; - FxBool retval; - sst1DeviceInfoStruct *saveBoard; - - /* if we are a single board SLI (proxy dac) we need to do all changes - * to the master's dac, since it's also ours... - */ - for (i=0;i 0) && (&sst1BoardInfo[i] == sst1CurrentBoard)) { - saveBoard = sst1CurrentBoard; - sst1CurrentBoard = &sst1BoardInfo[i-1]; - retval = sst1InitComputeClkParams(freq, clkTiming); - sst1CurrentBoard = saveBoard; - } - } - - return retval; - } else { - return sst1InitComputeClkParamsATT(freq, clkTiming); - } -} - -/* -** sst1InitComputeClkParamsATT(): -** Compute PLL parameters for given clock frequency (ATT DACs) -** -*/ -FxBool sst1InitComputeClkParamsATT(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float vcoFreqDivide, freqMultRatio, clkError; - float clkErrorMin; - FxU32 p, n, m, nPlusTwo; - int mPlusTwo; - - /* Calculate P parameter */ - p = 4; - if(((freq * (float) 1.) >= (float) 120.) && - ((freq * (float) 1.) <= (float) 240.)) { - vcoFreqDivide = (float) 1.; - p = 0; - } - if(((freq * (float) 2.) >= (float) 120.) && - ((freq * (float) 2.) <= (float) 240.)) { - vcoFreqDivide = (float) 2.; - p = 1; - } - if(((freq * (float) 4.) >= (float) 120.) && - ((freq * (float) 4.) <= (float) 240.)) { - vcoFreqDivide = (float) 4.; - p = 2; - } - if(((freq * (float) 8.) >= (float) 120.) && - ((freq * (float) 8.) <= (float) 240.)) { - vcoFreqDivide = (float) 8.; - p = 3; - } - if(p > 3) - return(FXFALSE); - - /* Divide by 14.318 */ - freqMultRatio = (freq * vcoFreqDivide) * (float) 0.06984216; - - /* Calculate proper N and M parameters which yield the lowest error */ - clkErrorMin = (float) 9999.; n = 0; - for(nPlusTwo = 3; nPlusTwo < 32; nPlusTwo++) { -#ifdef DIRECTX - mPlusTwo = FTOL( (((float) nPlusTwo * freqMultRatio) + (float) 0.5) ); - clkError = ((float) mPlusTwo * ITOF_INV( nPlusTwo ) ) - freqMultRatio; -#else - mPlusTwo = (int) (((float) nPlusTwo * freqMultRatio) + (float) 0.5); - clkError = ((float) mPlusTwo / (float) nPlusTwo) - freqMultRatio; -#endif - if(clkError < (float) 0.0) - clkError = -clkError; - if((clkError < clkErrorMin) && ((mPlusTwo - 2) < 127)) { - clkErrorMin = clkError; - n = nPlusTwo - 2; - m = mPlusTwo - 2; - } - } - if(n == 0) - return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = m; - clkTiming->clkTiming_P = p; - clkTiming->clkTiming_N = n; - if(freq < (float) 37.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(freq < (float) 45.) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 58.) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 66.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } -#if 0 - { - float calc; - - calc = ((float) 14.318 * (float) (m + 2)) / - ((float) (n + 2) * vcoFreqDivide); - printf("freq:%.3f calc:%.3f\n", freq, calc); - printf("m:%d p:%d n:%d\n", m, p, n); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitComputeClkParamsTI(): -** Compute PLL parameters for given clock frequency (TI DACs) -** -*/ -FxBool sst1InitComputeClkParamsTI(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float clkError, clkErrorMin; - FxU32 p, n, m, pBest, nBest, mBest; - float lowVCO, highVCO; - - //lowVCO = (float) 120.; highVCO = (float) 240.; - lowVCO = (float) 80.; highVCO = (float) 150.; - - /* Loop through all the possible combinations and find the frequency - with the least error */ - clkErrorMin = (float) 9999.; nBest = 9999; - for(p=0; p<4; p++) { - for(m=0; m<64; m++) { - for(n=0; n<5; n++) { - float clkFreq, vcoFreq; - float pFreqDivide; - float mPlusTwo = (float) m + (float) 2.0; - float nPlusTwo = (float) n + (float) 2.0; - - if(p == 0) pFreqDivide = (float) 1.0; - else if(p == 1) pFreqDivide = (float) 2.0; - else if(p == 2) pFreqDivide = (float) 4.0; - else pFreqDivide = (float) 8.0; - - clkFreq = ((float) 14.31818 * mPlusTwo) / (nPlusTwo * pFreqDivide); - vcoFreq = ((float) 14.31818 * mPlusTwo) / (nPlusTwo); - clkError = freq - clkFreq; - if(clkError < (float) 0.0) - clkError = -clkError; - if(clkError < clkErrorMin && vcoFreq >= lowVCO && - vcoFreq <= highVCO) { - clkErrorMin = clkError; - pBest = p; - mBest = m; - nBest = n; - } - } - } - } - - if(nBest == 9999) return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = mBest; - clkTiming->clkTiming_P = pBest; - clkTiming->clkTiming_N = nBest; - // L and IB params are not used by TI DACs... - clkTiming->clkTiming_L = 0; - clkTiming->clkTiming_IB = 0; - -#if 0 - { - float clkFreq, vcoFreq, pFreqDivide; - - if(clkTiming->clkTiming_P == 0) pFreqDivide = (float) 1.0; - else if(clkTiming->clkTiming_P == 1) pFreqDivide = (float) 2.0; - else if(clkTiming->clkTiming_P == 2) pFreqDivide = (float) 4.0; - else pFreqDivide = (float) 8.0; - - clkFreq = ((float) 14.31818 * (float) (clkTiming->clkTiming_M + 2)) / - ((float) (clkTiming->clkTiming_N + 2) * pFreqDivide); - vcoFreq = ((float) 14.31818 * (float) (clkTiming->clkTiming_M + 2)) / - ((float) (clkTiming->clkTiming_N + 2)); - - printf("freq:%.3f calc:%.3f\n", freq, clkFreq); - printf("m:%d p:%d n:%d vco:%.2f\n", clkTiming->clkTiming_M, - clkTiming->clkTiming_P, clkTiming->clkTiming_N, vcoFreq); - printf("lowVCO:%.2f highVCO:%.2f\n", lowVCO, highVCO); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitSetVidClkATT(): -** Set video clock for ATT Dacs -** -*/ -FxBool sst1InitSetVidClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD0); - DAC_INDEXWR((sstVidClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD1); - DAC_INDEXWR(((sstVidClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstVidClk->clkTiming_N) - << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD2); - DAC_INDEXWR(((sstVidClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstVidClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_ACLK_SEL_SHIFT) | - SST_DACREG_CC_ACLK_SELECT_AD)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkICS(): -** Set video clock for ICS Dacs -** -*/ -FxBool sst1InitSetVidClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_VCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstVidClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstVidClk->clkTiming_P) << 5) | sstVidClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - ((pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK0FREQ) | - SST_DACREG_ICS_PLLCTRL_CLK0SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkINI(): -** Set video clock for DACs defined in "voodoo2.ini" -** -*/ -FxBool sst1InitSetVidClkINI(FxU32 *sstbase, FxU32 width, - FxU32 height, FxU32 refresh, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetVideoStruct *setVideo; - SstRegs *sst = (SstRegs *) sstbase; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - FxBool retVal = FXFALSE; - - if(helper) - INIT_PRINTF(("sst1InitSetVidClkINI(): Entered...\n")); - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideo = iniDac->setVideo; - while(setVideo) { - if((setVideo->width == width) && (setVideo->height == height) && - (setVideo->refresh == refresh) && - (setVideo->video16BPP == video16BPP)) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideo->setVideoRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideo = setVideo->nextSetVideo; - } - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetGrxClkATT(): -** Set graphics clock for ATT Dacs -** NOTE: sst1InitSetGrxClkATT() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n; - SstRegs *sst = (SstRegs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable DAC indexed addressing */ - /* sst1InitDacIndexedEnable resets the video module, turns off dram refresh */ - /* and disallows writes to the PCI fifo */ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD0); - DAC_INDEXWR((sstGrxClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD1); - DAC_INDEXWR(((sstGrxClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstGrxClk->clkTiming_N) << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD2); - DAC_INDEXWR(((sstGrxClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstGrxClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_BCLK_SEL_SHIFT) | - SST_DACREG_CC_BCLK_SELECT_BD)); - sst1InitIdleFBINoNOP(sstbase); - - /* Turn off DAC indexed addressing */ - - /* Disabling dac indexed mode re-enables writes to pass through the */ - /* PCI fifo (and restores video refresh and dram refresh if previously */ - /* enabled) */ - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkICS(): -** Set graphics clock for ICS Dacs -** NOTE: sst1InitSetGrxClkICS() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_GCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstGrxClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstGrxClk->clkTiming_P) << 5) | sstGrxClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK1SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkINI(): -** Set graphics clock for dac specified in "voodoo2.ini" file -** NOTE: sst1InitSetGrxClkINI() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkINI(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetMemClkStruct *setMemClk; - FxBool retVal = FXFALSE; - SstRegs *sst = (SstRegs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setMemClk = iniDac->setMemClk; - while(setMemClk) { - if(setMemClk->frequency == (FxU32) sstGrxClk->freq) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setMemClk->setMemClkRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setMemClk = setMemClk->nextSetMemClk; - } - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - if(retVal == FXTRUE) { - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - } - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetVidModeATT(): -** Set video Mode for ATT dacs -** -*/ -FxBool sst1InitSetVidModeATT(FxU32 *sstbase, FxU32 video16BPP) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - /* Set 16 or 24-bit pixel output */ - if(video16BPP) { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_16BPP | SST_DACREG_CR0_8BITDAC); - } else { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_24BPP | SST_DACREG_CR0_8BITDAC); - } - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeICS(): -** Set video Mode for ICS dacs -** -*/ -FxBool sst1InitSetVidModeICS(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(video16BPP) - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_16BPP); - else - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_24BPP); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeINI(): -** Set video Mode for DACs defined in "voodoo2.ini" -** -*/ -FxBool sst1InitSetVidModeINI(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, cfgInitEnable; - sst1InitDacSetVideoModeStruct *setVideoMode; - FxBool retVal = FXFALSE; - SstRegs *sst = (SstRegs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideoMode = iniDac->setVideoMode; - while(setVideoMode) { - if(setVideoMode->video16BPP == video16BPP) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideoMode->setVideoModeRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideoMode = setVideoMode->nextSetVideoMode; - } - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitDacIndexedEnable(): -** Initialize DAC for indexed-mode addressing -** NOTE: When DAC indexed-mode addressing is enabled, video timing and -** DRAM refresh are both reset (disabled) -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacIndexedEnable(FxU32 *sstbase, - FxU32 Enable) -{ - FxU32 n, j, dacmir, dacdir, cr0_save; - static FxU32 fbiInit1_save = 0; - static FxU32 fbiInit2_save = 0; - static FxU32 cfgInitEnable; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - if(!Enable) { - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - if(fbiInit1_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit1, fbiInit1_save); - if(fbiInit2_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, cfgInitEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, cfgInitEnable | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) { - INIT_PRINTF(("sst1InitDacIndexedEnable() ERROR: Could not Initialize DAC\n")); - return(FXFALSE); - } - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - cr0_save = sst1InitDacRd(sstbase, SST_DACREG_RMR); - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, ((cr0_save & 0xf0) | - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC)); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID for sanity */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT)) - j++; - else - continue; - - /* Check the device ID for sanity */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT)) - j++; - else - continue; - if(j == 2) - break; - } - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/gamma.c b/glide2x/cvg/init/gamma.c deleted file mode 100644 index 329522e..0000000 --- a/glide2x/cvg/init/gamma.c +++ /dev/null @@ -1,256 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for loading SST-1 gamma tables -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -/* OK, so this should be 1.7, but sometime during the - * late stages of the original v2 release hell we changed - * it to 1.3 to make id (or someone happy). - */ -#define kDefaultVoodoo2Gamma 1.3 - -/* -** sst1InitGamma(): -** Load the video color-lookup tables with the specified gamma function -** -** Returns: -** FXTRUE if successfully initializes SST-1 gamma tables -** FXFALSE if cannot initialize SST-1 gamma tables -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGamma(FxU32 *sstbase, double gamma) -{ - if(sstbase == NULL) return(FXFALSE); - if(!sst1InitCheckBoard(sstbase)) return(FXFALSE); - - return sst1InitGammaRGB(sstbase, gamma, gamma, gamma); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaRGB(FxU32 *sstbase, - double gammaR, - double gammaG, - double gammaB) -{ - FxU32 - x, - gammaTableR[256], - gammaTableG[256], - gammaTableB[256]; - FxBool - sstVideoIsReset; - SstRegs * - sst = (SstRegs *) sstbase; - static FxBool - calledBefore = FXFALSE; - static double - userGammaR = kDefaultVoodoo2Gamma, - userGammaG = kDefaultVoodoo2Gamma, - userGammaB = kDefaultVoodoo2Gamma; - - if(sstbase == NULL) return(FXFALSE); - if(!sst1InitCheckBoard(sstbase)) return(FXFALSE); - - if(!sst1CurrentBoard->fbiInitGammaDone) - INIT_PRINTF(("sst1InitGammaRGB(): Setting GammaRGB = (%.2f,%.2f,%.2f)\n", - gammaR, gammaG, gammaB)); - - /* Get the user set definitions (cp or environment) */ - if(!calledBefore) { - calledBefore = FXTRUE; - - if(GETENV(("SSTV2_RGAMMA"))) { - userGammaR = (double) ATOF(GETENV(("SSTV2_RGAMMA"))); - } - if(GETENV(("SSTV2_GGAMMA"))) { - userGammaG = (double) ATOF(GETENV(("SSTV2_GGAMMA"))); - } - if(GETENV(("SSTV2_BGAMMA"))) { - userGammaB = (double) ATOF(GETENV(("SSTV2_BGAMMA"))); - } - if(GETENV(("SSTV2_GAMMA"))) { - userGammaR = (double) ATOF(GETENV(("SSTV2_GAMMA"))); - userGammaG = userGammaR; - userGammaB = userGammaR; - } - } - - gammaR *= (userGammaR / kDefaultVoodoo2Gamma); - gammaG *= (userGammaG / kDefaultVoodoo2Gamma); - gammaB *= (userGammaB / kDefaultVoodoo2Gamma); - - // Initialize the gamma table - for(x=0; x<256; x++) { - gammaTableR[x] = FTOL (POW(x/255.0F, 1.0F/gammaR) * 255.0F + 0.5F); - gammaTableG[x] = FTOL (POW(x/255.0F, 1.0F/gammaG) * 255.0F + 0.5F); - gammaTableB[x] = FTOL (POW(x/255.0F, 1.0F/gammaB) * 255.0F + 0.5F); - } - - // Store gamma values in board info structure - sst1CurrentBoard->fbiGammaRed = gammaR; - sst1CurrentBoard->fbiGammaGreen = gammaG; - sst1CurrentBoard->fbiGammaBlue = gammaB; - - // SST-1 video reset must be inactive to load gamma tables - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) { - sstVideoIsReset = FXTRUE; - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - // wait for video reset to be deasserted - sst1InitIdleFBINoNOP(sstbase); - } else { - sstVideoIsReset = FXFALSE; - } - - // SST-1 requires every eighth entry of the gamma table to be loaded, - // so only 32 basic writes are required. A 33rd write is used to load - // the top entry of the gamma table. The 33rd entry is necessary because - // SST-1 performs linear interpolation between each gamma table entry to - // generate 256 unique gamma-corrected values. - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, ((32 << SST_CLUTDATA_INDEX_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableR[255]) << SST_CLUTDATA_RED_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableG[255]) << SST_CLUTDATA_RED_SHIFT) | - (GAMMA_COMP_FLOOR(gammaTableB[255]) << SST_CLUTDATA_RED_SHIFT))); -#undef GAMMA_COMP_FLOOR - - if(sstVideoIsReset) { - // wait for gamma table writes to complete - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - if(!sst1CurrentBoard->fbiInitGammaDone) { - sst1CurrentBoard->fbiInitGammaDone = 1; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - - return FXTRUE; -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaTable(FxU32 *sstbase, FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b) -{ - FxU32 x; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Initialize the gamma table - for(x=0; x < nentries; x++) { - gammaTableR[x] = *r; - gammaTableG[x] = *g; - gammaTableB[x] = *b; - r++; g++; b++; - } - - // SST-1 video reset must be inactive to load gamma tables - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) { - sstVideoIsReset = FXTRUE; - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - // wait for video reset to be deasserted - sst1InitIdleFBINoNOP(sstbase); - } else - sstVideoIsReset = FXFALSE; - - // SST-1 requires every eighth entry of the gamma table to be loaded, - // so only 32 basic writes are required. A 33rd write is used to load - // the top entry of the gamma table. The 33rd entry is necessary because - // SST-1 performs linear interpolation between each gamma table entry to - // generate 256 unique gamma-corrected values. - for(x=0; x < nentries; x++) { - FxU32 gcR = gammaTableR[(x)]; - FxU32 gcG = gammaTableG[(x)]; - FxU32 gcB = gammaTableB[(x)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - return(FXTRUE); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/gdebug.c b/glide2x/cvg/init/gdebug.c deleted file mode 100644 index 8791d6d..0000000 --- a/glide2x/cvg/init/gdebug.c +++ /dev/null @@ -1,491 +0,0 @@ -/*-*-c++-*-*/ -#include "vxd.h" - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include -#include -#include -#include - -#include <3dfx.h> - -#if __MWERKS__ -/* Dork w/ the console window */ -#include - -/* So the debug level comes from the right place */ -#include -#include -#endif /* __MWERKS__ */ - -#define FX_DLL_DEFINITION -#include -#include -#include - -#if defined(__WIN32__) && !defined(KERNEL) -#include -#endif /* defined(__WIN32__) && !defined(KERNEL) */ - -#define USE_DEBUG_STRING (__DOS32__ || __WIN32__) -#if USE_DEBUG_STRING -static FxBool UseDebugString = 0; -#endif /* USE_DEBUG_STRING */ - -#ifdef KERNEL_NT - -void __stdcall -EngDebugPrint( - char * StandardPrefix, - const char * DebugMessage, - va_list ap - ); - -#endif - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - - -#ifdef KERNEL -// gdbgout is array to store strings for debug output -//#include -static char gdbgout[512]; - -// for setting levels interactively through the debugger while you're -// running in the KERNEL mode -void setLevel(int level, int value) -{ - if (level >= GDBG_MAX_LEVELS) - level = GDBG_MAX_LEVELS - 1; - - gdbg_debuglevel[level] = value; -} - - -#ifndef KERNEL_NT -// when the simulator runs in kernal mode there is no C runtime library -// so we need to call a kernal printf. -extern int __cdecl klvfprintf(FILE *stream, - const char *format, - va_list arg ) ; -#endif - -static FILE *gdbg_msgfile; // GDBG info/error file -#else /* #ifdef KERNEL */ - -static FILE *gdbg_msgfile = NULL; /* stdout; */ // GDBG info/error file - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static const char *setRange(const char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') { // if there's a second - buf += pos+1; - sscanf(buf,"%i%n",&r1,&pos); // then parse it - } - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -FX_EXPORT void FX_CSTYLE -gdbg_parse(const char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (sscanf(env,"%i%n",&level,&pos) <= 0) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -#endif /* #ifndef KERNEL */ - -FX_EXPORT void FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - - /* I can't init gdbg_msgfile to stdout since it isn't constant so - * I do it now */ - gdbg_msgfile = stdout; - - -#if __MWERKS__ - SIOUXSettings.standalone = false; - SIOUXSettings.setupmenus = false; - SIOUXSettings.autocloseonquit = true; - SIOUXSettings.asktosaveonclose = false; -#endif - -#ifdef KERNEL - // put code in here to set the default level - gdbg_debuglevel[0] = 1; // always enable level 0 - gdbg_debuglevel[120] = 1; // always enable level 0 - done = 1; - env = 0; - return; -#else /* #ifdef KERNEL */ - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - gdbg_parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -#endif /* #ifndef KERNEL */ -} - -FX_EXPORT void FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); -#ifndef KERNEL - if (gdbg_msgfile != stdout) { // close any existing output file -#if USE_DEBUG_STRING - if (!UseDebugString) -#endif /* USE_DEBUG_STRING */ - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#endif /* #ifndef KERNEL */ -} - -#if defined(KERNEL) && !defined(KERNEL_NT) - extern void MyPrintf(); -#endif /* #ifdef KERNEL */ - -#ifdef KERNEL_NT -//---------------------------------------------------------------------- -// NT Debug print helper routine -//---------------------------------------------------------------------- -static void gdbg_NTPrint( const char *format, ... ) -{ - va_list arglist; - - va_start(arglist, format); - EngDebugPrint( "\nHAL: ", format, arglist ); - va_end(arglist); -} -#endif // KERNEL_NT - -static GDBGKeepAliveProc keepAliveProc; - -FX_EXPORT void FX_CSTYLE gdbg_set_keepalive(GDBGKeepAliveProc p) -{ - keepAliveProc = p; -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - if (gdbg_msgfile != NULL) { -#ifdef KERNEL - // shouldn't get here now - //commented out for now -KMW - //nwvsprintf(gdbgout,format,args); - //OutputDebugString("\n"); - //OutputDebugString("HAL: "); - //OutputDebugString(gdbgout); -#else -#if USE_DEBUG_STRING - if (UseDebugString) { - static char msgBuf[1024]; - - vsprintf(msgBuf, format, args); - -#if __DOS32__ - pciOutputDebugString(msgBuf); -#elif __WIN32 - OutputDebugString(msgBuf); -#else - fprintf(stderr, msgBuf); -#endif /* !__DOS32__ */ - } else -#endif /* USE_DEBUG_STRING */ - { - vfprintf(gdbg_msgfile,format,args); - // if there is a keepAlive callback, then call it - fflush(gdbg_msgfile); - } - - if (keepAliveProc) keepAliveProc(100); -#endif /* !KERNEL */ - } -} - -FX_EXPORT void FX_CSTYLE -gdbg_printf (const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_list args; - - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ - -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; -#ifndef KERNEL_NT - char newformat[4095]; -#endif - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); -#elif defined( KERNEL_NT ) - gdbg_NTPrint( "%s.%d:\t", gdbg_myname, level ); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else /* #ifndef KERNEL */ - Debug_Printf("%s.%d:\t", gdbg_myname, level); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); - FXUNUSED(newformat[0]); -#endif /* #ifndef KERNEL */ - - return (1); -} - - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); -#endif /* #ifndef KERNEL */ - return (1); -} - -static GDBGErrorProc errorProcList[3]; - -FX_EXPORT int FX_CSTYLE gdbg_error_set_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - break; - } else if (errorProcList[i] == NULL) { - errorProcList[i] = p; - break; - } - } - - return (i < count); -} - -FX_EXPORT void FX_CSTYLE gdbg_error_clear_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - errorProcList[i] = NULL; - break; - } - } -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); - - { - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] != NULL) { - va_start(args, format); - (*errorProcList[i])(kind, newformat, args); - va_end(args); - } - } - } -#elif defined( KERNEL_NT ) - va_list args; - - gdbg_NTPrint( "%s error (%s): ", gdbg_myname, kind); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else - Debug_Printf("%s error (%s): ", gdbg_myname, kind); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ -} - -// return the error counter -FX_EXPORT int FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -FX_EXPORT int FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -FX_EXPORT void FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -FX_EXPORT int FX_CSTYLE -gdbg_set_file(const char *name) -{ -#ifndef KERNEL - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } - -#if USE_DEBUG_STRING - if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } else -#endif /* USE_DEBUG_STRING */ - { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - } - - return (outf != NULL); -#else /* #ifndef KERNEL */ - return 0; -#endif /* #ifndef KERNEL */ -} diff --git a/glide2x/cvg/init/info.c b/glide2x/cvg/init/info.c deleted file mode 100644 index f4f36b1..0000000 --- a/glide2x/cvg/init/info.c +++ /dev/null @@ -1,657 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Routines to detect memory size, strapping pin, and other initialization -** configuration information. -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#define XY_ONE (1<lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - sst1InitIdle(sstbase); - if (x & 1) { - INIT_PRINTF(("ERROR: readAndSum4x4 must have an even X (%d)\n", x)); - return(FXFALSE); - } - - /* get 16 pixels (4 x 4 array) from frame buffer and sum the colors */ - *r_sum = 0; - *g_sum = 0; - *b_sum = 0; - - for (rd_y = 0; rd_y < 4; rd_y++) { /* read 4 scanlines */ - for (rd_x = 0; rd_x < 4; rd_x ++) { - if ((rd_x & 1)==0) { /* read 2 pixels at a time */ - rd_col = - IGET(sstbase[(SST_LFB_ADDR + (y+rd_y)*2048 + (x+rd_x)*2) >> 2]); - } - else rd_col >>= 16; - rd_r = ((rd_col >> 11) & 0x1f) << 3; - rd_g = ((rd_col >> 5) & 0x3f) << 2; - rd_b = ((rd_col >> 0) & 0x1f) << 3; - *r_sum += rd_r; - *g_sum += rd_g; - *b_sum += rd_b; - INIT_INFO((4,"%d,%d = rd_col: 0x%04x rgb: %02x %02x %02x\n", - rd_x, rd_y, (rd_col & 0xffff), rd_r, rd_g, rd_b)); - } - } - INIT_INFO((3,"sums: r_sum=0x%03x g_sum=0x%03x b_sum=0x%03x\n", - *r_sum, *g_sum, *b_sum)); - return(FXTRUE); -} - -/* xxx - Give these guys some meaningful comments */ -static FxI32 rb_tbl[0xFFF+1]; -static FxI32 g_tbl[0xFFF+1]; - -/* draw a right angle triangle */ -static void -drawTriangle(SstRegs *sst, int x, int y, int tSize) -{ - ISET(sst->vA.x,x); - ISET(sst->vA.y,y); - ISET(sst->vB.x,x+XY_ONE*tSize); - ISET(sst->vB.y,y); - ISET(sst->vC.x,x); - ISET(sst->vC.y,y+XY_ONE*tSize); - ISET(sst->s,0); - ISET(sst->t,0); - ISET(sst->w,0); - ISET(sst->dsdx,1<dtdx,0); - ISET(sst->dwdx,0); - ISET(sst->dsdy,0); - ISET(sst->dtdy,1<dwdy,0); - ISET(sst->triangleCMD,0); -} - -static FxBool -initSumTables(FxU32 *sstbase) -{ - int x=0,y=0; - FxU32 tst_color; - FxU32 r_sum, g_sum, b_sum; - SstRegs *sst = (SstRegs *) sstbase; - - /* init sum array */ - for (r_sum = 0; r_sum <= 0xfff; r_sum++) { - rb_tbl[r_sum] = -1; - g_tbl[r_sum] = -1; - } - - ISET(sst->fbzColorPath, SST_RGBSEL_C1 | SST_CC_PASS); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK | SST_ENDITHER); - - /* fill sum array */ - for (tst_color = 0; tst_color <= 255; tst_color++) { - INIT_INFO((2,"tst_color=0x%02x\n", tst_color)); - ISET(sst->c1, (tst_color << 16) | (tst_color << 8) | tst_color); - - drawTriangle(sst, x,y,36); - if(readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum) == FXFALSE) - return(FXFALSE); - - /* check sums for uniqueness and then store away */ - if (r_sum != b_sum) { - INIT_PRINTF(("ERROR: b_sum=0x%03x r_sum=0x%03x\n", r_sum, b_sum)); - return(FXFALSE); - } - if (rb_tbl[r_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique r/b_sum=0x%03x\n", r_sum)); - return(FXFALSE); - } - rb_tbl[r_sum] = tst_color; - if (g_tbl[g_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique g_sum=0x%03x\n", g_sum)); - return(FXFALSE); - } - g_tbl[g_sum] = tst_color; - } - return(FXTRUE); -} - -/* remove dither to derive actual 24-bit RGB value */ -static FxBool -unDither(FxU32 r_sum, FxU32 g_sum, FxU32 b_sum, FxU32 *result) -{ - if (rb_tbl[r_sum] == -1 || g_tbl[g_sum] == -1 || rb_tbl[b_sum] == -1) - { - INIT_PRINTF(("ERROR: unDither: invalid color sum\n")); - return(FXFALSE); - } - *result = (rb_tbl[r_sum] << 16) | (g_tbl[g_sum] << 8) | rb_tbl[b_sum]; - return(FXTRUE); -} - -static FxBool -getTmuConfigData(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - int x=0, y=0; - FxU32 r_sum, g_sum, b_sum; - SstRegs *sst = (SstRegs *) sstbase; - FxU32 tmuRevision; - - /* set trex's (all 3) to output configuration bits */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) { - info->tmuConfig = 0x0; - } else { - if(unDither(r_sum,g_sum,b_sum,&info->tmuConfig) == FXFALSE) - return(FXFALSE); - } - - ///////////////////////// - // Get new revision... - ///////////////////////// - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18) | - (5 << SST_TEX_SEND_CONFIG_SEL_SHIFT)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(unDither(r_sum,g_sum,b_sum,&tmuRevision) == FXFALSE) - return(FXFALSE); - - info->tmuFab[0] = (tmuRevision >> 4) & 0xf; - info->tmuFab[1] = (tmuRevision >> 12) & 0xf; - info->tmuFab[2] = (tmuRevision >> 20) & 0xf; - - /* Adjust configuration structure for "new" revision ID */ - info->tmuConfig &= ~(0x7 | (0x7<<7) | (0x7<<14)); - info->tmuConfig |= (((tmuRevision & 0x7) + 3) | - ((((tmuRevision >> 8) & 0x7) + 3) << 7) | - ((((tmuRevision >> 16) & 0x7) + 3) << 14)); - - /* reset trex's init registers */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1]); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2]); - - if(GETENV(("SSTV2_TMUCFG"))) - SSCANF(GETENV(("SSTV2_TMUCFG")), "%ld", &info->tmuConfig); - - return(FXTRUE); -} - -#define SENSE2 0x92F56EB0 -#define SENSE1 0xF2A916B5 -#define SENSE0 0xBADBEEF1 - -static FxU32 sense(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 *texAddr = (tmu<<(21-2)) + (FxU32 *)SST_TEX_ADDRESS(sst); - - /* set the Init0 register to enable ? MBytes of memory */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, init | (info->tmuInit0[tmu] & ~0x7000)); - sst1InitIdle(sstbase); - - ISET(sst->texBaseAddr, 0x200000>>3); /* set to 2 MB */ - ISET(texAddr[0], SENSE2); /* write a random value */ - - ISET(sst->texBaseAddr, 0x100000>>3); /* set to 1 MB */ - ISET(texAddr[0], SENSE1); /* write a random value */ - - ISET(sst->texBaseAddr, 0x000000>>3); /* set to 0 MB */ - ISET(texAddr[0], SENSE0); /* write a random value */ - - ISET(sst->texBaseAddr, mem>>3); /* reset to 2 MB */ - drawTriangle(sst,0,0,4); /* draw a 4x4 right triangle */ - sst1InitIdle(sstbase); - - mem = IGET(sstbase[SST_LFB_ADDR>>2]); - INIT_INFO((2,"data=0x%08x\n", mem)); - - /* reset the Init0 register back to its previous value */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - return mem; -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuMemory(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 i,data; - SstRegs *sst = (SstRegs *) sstbase; - - INIT_INFO((1,"sst1InitGetTmuMemory(0x%x, , %d)\n", sstbase,tmu)); - - if(GETENV(("SSTV2_TMU_MEMSIZE"))) { - *TmuMemorySize = ATOI(GETENV(("SSTV2_TMU_MEMSIZE"))); - // If user specifies 2 MBytes on a 4 MBytes board, disable the - // second RAS so that apps which may incorrectly store data in the - // upper 2 Mbytes will not function properly... - if(*TmuMemorySize == 2) { - info->tmuInit0[tmu] &= ~SST_EN_TEX_MEM_SECOND_RAS; - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - } - return(FXTRUE); - } - - ISET(sst->lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK); - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - ISET(sst->tLOD, 0); - - /* setup all downstream TMUs to be in pass-thru mode */ - for (i=0; itextureMode, SST_TC_PASS | SST_TCA_PASS); - - /* first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, 0x5000); - if (data == SENSE2) {*TmuMemorySize = 4; return(FXTRUE);} - - /* set the Init0 register to enable 2 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x100000, 0x2000); - if (data == SENSE1) {*TmuMemorySize = 2; return(FXTRUE);} - - /* set the Init0 register to enable 1 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x000000, 0x2000); - if (data == SENSE0) {*TmuMemorySize = 1; return(FXTRUE);} - - INIT_PRINTF(("sst1InitGetTmuMemory() ERROR: Could not detect memory size.\n")); - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - FxU32 trev; - - if(initSumTables(sstbase) == FXFALSE) - return(FXFALSE); - if(getTmuConfigData(sstbase,info) == FXFALSE) - return(FXFALSE); - - info->numberTmus = 1; - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) { - info->tmuRevision = 4; - sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]); - info->tmuMemSize[0] = 2; - } else { - /* Get TMU memory size */ - info->tmuRevision = info->tmuConfig & 0x7; - if(sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]) == - FXFALSE) - return(FXFALSE); - } - - INIT_INFO((1,"TMU0 memory = %d MB\n", info->tmuMemSize[0])); - if (info->tmuConfig & FXBIT(6)) { /* if TMU 1 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>7) & 0x7; /* get its revision */ -#if 0 // Ignore for now... - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } -#endif - if(sst1InitGetTmuMemory(sstbase, info, 1, &info->tmuMemSize[1]) == FXFALSE) - return(FXFALSE); - } - if (info->tmuConfig & FXBIT(13)) { /* if TMU 2 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>14) & 0x7; /* get its revision */ -#if 0 // Ignore for now... - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } -#endif - if(sst1InitGetTmuMemory(sstbase, info, 2, &info->tmuMemSize[2]) == FXFALSE) - return(FXFALSE); - } - if(GETENV(("SSTV2_NUM_TMUS"))) - info->numberTmus = ATOI(GETENV(("SSTV2_NUM_TMUS"))); - - INIT_INFO((1,"numberTMus = %d\n", info->numberTmus)); - return(FXTRUE); -} - -/* -** fbiMemSize(): -** Returns size (in MBytes) of FBI frame buffer memory -** Returns 0 on error -** NOTE: fbiMemSize() destroys the contents in memory -** -*/ -#define LFB_PUTPIXEL(X, Y, DATA) \ - ISET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)], DATA) -#define LFB_GETPIXEL(X, Y) \ - IGET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)]) - -static int fbiMemSize(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - volatile unsigned short *lfbptr = (unsigned short *) sstbase; - FxU32 init0Save = IGET(sst->fbiInit0); - FxU32 init1Save = IGET(sst->fbiInit1); - FxU32 init2Save = IGET(sst->fbiInit2); - int retval = 0; - - if(GETENV(("SSTV2_FBI_MEMSIZE"))) - return(ATOI(GETENV(("SSTV2_FBI_MEMSIZE")))); - - /* Enable dram refresh, disable memory fifo, and setup memory */ - /* for rendering */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBI(sstbase); - - /* Setup Basic rendering datapath */ - ISET(sst->fbzColorPath, SST_CC_MONE); - ISET(sst->fogMode, 0x0); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK | SST_DRAWBUFFER_FRONT); - sst1InitIdleFBI(sstbase); - - sst1InitSetResolution(sstbase, &SST_VREZ_800X600_60, 1); - sst1InitIdleFBI(sstbase); - - ISET(sst->lfbMode, SST_LFB_ZZ | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READDEPTHABUFFER); - sst1InitIdleFBI(sstbase); - - /* Check for 4 MBytes... */ - /* Write to Zbuffer in 800x600 resolution in upper 2 MBytes of memory */ - LFB_PUTPIXEL(128, 100, 0xdead); /* maps to row:0x216, col:0x80, bank:0x1 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(798, 599, 0xffff); - LFB_PUTPIXEL(200, 200, 0x55aa); /* maps to row:0x23d, col:0x104, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0xffff); - LFB_PUTPIXEL(400, 400, 0x0); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(128, 100) == 0xdead) && - (LFB_GETPIXEL(200, 200) == 0x55aa)) { - retval = 4; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - goto fbiMemSizeDone; - } - - /* Check for 2 MBytes... */ - /* Write to color buffer in 640x480 resolution */ - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(50, 100, 0xdead); /* maps to row:0x1e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(638, 479, 0xffff); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEBACKBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(178, 436, 0xaa55); /* maps to row:0x11e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0x0); - LFB_PUTPIXEL(400, 400, 0xffff); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(50, 100) != 0xdead) - goto check1MByte; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(178, 436) == 0xaa55) { - retval = 2; - goto fbiMemSizeDone; - } - -check1MByte: - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(10, 10, 0xdead); /* maps to row:0x0, col:0x145, bank:0x0 */ - LFB_PUTPIXEL(8, 8, 0x0); - LFB_PUTPIXEL(340, 340, 0xffff); - LFB_PUTPIXEL(100, 200, 0x5a5a); /* maps to row:0x3c, col:0x112, bank:0x1 */ - LFB_PUTPIXEL(66, 0, 0x0); - LFB_PUTPIXEL(360, 360, 0xffff); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(10, 10) == 0xdead) && - (LFB_GETPIXEL(100, 200) == 0x5a5a)) - retval = 1; - -fbiMemSizeDone: - /* Restore init registers to original state */ - ISET(sst->fbiInit0, init0Save); - ISET(sst->fbiInit1, init1Save); - ISET(sst->fbiInit2, init2Save); - sst1InitIdleFBI(sstbase); - - return(retval); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetFbiInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - SstRegs *sst = (SstRegs *) sstbase; - - info->fbiMemSize = fbiMemSize(sstbase); - - /* Detect board identification and memory speed */ - if(GETENV(("SSTV2_FBICFG"))) - SSCANF(GETENV(("SSTV2_FBICFG")), "%ld", &info->fbiConfig); - else - info->fbiConfig = (IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - SST_FBI_MEM_TYPE_SHIFT; - - info->fbiBoardID = (IGET(sst->fbiInit5) >> 5) & 0xf; - if(IGET(sst->fbiInit7) & BIT(0)) - info->fbiBoardID |= 0x10; - - /* Detect scanline interleaving */ - info->sliPaired = sst1InitSliPaired(sstbase); - info->sliDetected = sst1InitSliDetect(sstbase); - - return FXTRUE; -} - -/* -** sst1InitGetDeviceInfo(): -** Read device specific information -** NOTE: info pointer must point to an Info structure which has already -** been allocated -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGetDeviceInfo(FxU32 *sstbase, - sst1DeviceInfoStruct *info) -{ - FxBool retval; - - if((retval = sst1InitCheckBoard(sstbase)) == FXTRUE) - *info = *sst1CurrentBoard; - return(retval); -} - -/* -** sst1InitFillDeviceInfo(): -** Fill in device information -** NOTE: This routine destroys current contents in frame buffer memory -** -** -*/ -FxBool sst1InitFillDeviceInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - if(!sstbase) - return(FXFALSE); - - if(info->tmuRevision != 0xdead) - return FXTRUE; /* if already got it, return */ - - if(GETENV(("SSTV2_NODEVICEINFO"))) { - /* fill device info struct with sane values... */ - INIT_PRINTF(("sst1DeviceInfo: Filling info Struct with default values...\n")); - - if(GETENV(("SSTV2_FBICFG"))) - SSCANF(GETENV(("SSTV2_FBICFG")), "%ld", &info->fbiConfig); - else - info->fbiConfig = 0x0; - - if(GETENV(("SSTV2_TMUCFG"))) - SSCANF(GETENV(("SSTV2_TMUCFG")), "%ld", &info->tmuConfig); - else - info->tmuConfig = 0x0; - - info->numberTmus = 1; - if (info->tmuConfig & FXBIT(6)) /* if TMU 1 exists */ - info->numberTmus++; - if (info->tmuConfig & FXBIT(13)) /* if TMU 2 exists */ - info->numberTmus++; - - info->tmuRevision = info->tmuConfig & 0x7; - - if(GETENV(("SSTV2_FBI_MEMSIZE"))) - info->fbiMemSize = ATOI(GETENV(("SSTV2_FBI_MEMSIZE"))); - else - info->fbiMemSize = 2; - - if(GETENV(("SSTV2_TMU_MEMSIZE"))) - info->tmuMemSize[0] = ATOI(GETENV(("SSTV2_TMU_MEMSIZE"))); - else - info->tmuMemSize[0] = 2; - info->tmuMemSize[1] = info->tmuMemSize[0]; - info->tmuMemSize[2] = info->tmuMemSize[0]; - } else { - int i; - - for(i=0; i<5; i++) { - if(i) - INIT_PRINTF(("sst1InitFillDeviceInfo(): Retry #%d for chip GetInfo()...\n", i)); - /* GetFbiInfo() must be called before GetTmuInfo() */ - if(sst1InitGetFbiInfo(sstbase, info) == FXFALSE) - continue; - /* get the revision ID of each TMU and verify that they are all the - same */ - if(sst1InitGetTmuInfo(sstbase, info) == FXFALSE) - continue; - break; - } - if(i == 5) - return(FXFALSE); - } - // Measure silicon performance - sst1InitMeasureSiProcess(sstbase, 0); // measure NAND-tree - sst1InitMeasureSiProcess(sstbase, 1); // measure NOR-tree - - INIT_PRINTF(("sst1DeviceInfo: Board ID: %d\n", info->fbiBoardID)); - INIT_PRINTF(("sst1DeviceInfo: FbiConfig:0x%x, TmuConfig:0x%x\n", - info->fbiConfig, info->tmuConfig)); - INIT_PRINTF(("sst1DeviceInfo: FBI Revision:%d, TMU Revison:%d, Num TMUs:%d\n", - info->fbiRevision, info->tmuRevision, info->numberTmus)); - INIT_PRINTF(("sst1DeviceInfo: FBI Memory:%d, TMU[0] Memory:%d", - info->fbiMemSize, info->tmuMemSize[0])); - if(info->numberTmus > 1) - INIT_PRINTF((", TMU[1] Memory:%d", info->tmuMemSize[1])); - if(info->numberTmus > 2) - INIT_PRINTF((", TMU[2] Memory:%d", info->tmuMemSize[2])); - INIT_PRINTF(("\n")); - if(sst1InitUseVoodooFile == FXTRUE) { - if(iniDac == (sst1InitDacStruct *) NULL) - INIT_PRINTF(("sst1DeviceInfo: Dac Type: Unknown")); - else - INIT_PRINTF(("sst1DeviceInfo: Dac Type: %s %s\n", - iniDac->dacManufacturer, iniDac->dacDevice)); - } else { - INIT_PRINTF(("sst1DeviceInfo: Dac Type: ")); - if(info->fbiVideoDacType == SST_FBI_DACTYPE_ATT) - INIT_PRINTF(("AT&T ATT20C409\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - INIT_PRINTF(("ICS ICS5342\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_TI) - INIT_PRINTF(("TI TVP3409\n")); - else if(info->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - INIT_PRINTF(("(SLI PROXY)\n")); - else - INIT_PRINTF(("Unknown\n")); - } - INIT_PRINTF(("sst1DeviceInfo: SLI Detected:%d\n", info->sliDetected)); - - return(FXTRUE); -} -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/init.rc b/glide2x/cvg/init/init.rc deleted file mode 100644 index 5e37b40..0000000 --- a/glide2x/cvg/init/init.rc +++ /dev/null @@ -1,65 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#define VERSIONNAME "sst1init.dll\0" - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3Dfx Interactive, Inc.\0" - VALUE "FileDescription", "3Dfx Interactive, Inc. InitCode DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1996\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", "InitCode for Voodoo Graphics\251 and Windows\256 95\0" - VALUE "ProductVersion", VERSIONSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/cvg/init/makefile b/glide2x/cvg/init/makefile deleted file mode 100644 index c6f25d0..0000000 --- a/glide2x/cvg/init/makefile +++ /dev/null @@ -1,48 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_DOS -LCOPTS = -LCINCS = -I$(BUILD_ROOT)\cvg\include -I$(BUILD_ROOT_SWLIBS)\include - -# sources -HEADERS = sst1init.h -INSTALL_DESTINATION = $(BUILD_ROOT)\cvg -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib - -!if "$(FX_DLL_BUILD_INIT)"=="1" -FX_DLL_LIBRARY = 1 -!endif - -# targets -LIBRARIES = sst1init.lib -RCFILE = init.rc - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h diff --git a/glide2x/cvg/init/makefile.linux b/glide2x/cvg/init/makefile.linux deleted file mode 100644 index e5f47e3..0000000 --- a/glide2x/cvg/init/makefile.linux +++ /dev/null @@ -1,56 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DINIT_LINUX -LCOPTS = -LCINCS = -I$(BUILD_ROOT)/cvg/include -I$(BUILD_ROOT_SWLIBS)/include - -# sources -HEADERS = sst1init.h -INSTALL_DESTINATION = $(BUILD_ROOT)/cvg -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c canopus.c - -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a - -ifeq ($(FX_DLL_BUILD_INIT),1) -FX_DLL_LIBRARY = 1 -endif - -# targets -LIBRARIES = libsst1init.a -RCFILE = init.rc - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -g $(GCFLAGS) $(LCFLAGS) $(VCFLAGS) -endif diff --git a/glide2x/cvg/init/parse.c b/glide2x/cvg/init/parse.c deleted file mode 100644 index 5a3d4af..0000000 --- a/glide2x/cvg/init/parse.c +++ /dev/null @@ -1,1024 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Parsing code for grabbing information from "voodoo2.ini" initialization file -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#include - -#if __WIN32__ -#include - -/* Path relative to HKEY_LOCAL_MACHINE */ -#define REGSTR_PATH_3DFXSW "Software\\3Dfx Interactive\\Voodoo2" -#define REGSTR_PATH_GLIDE REGSTR_PATH_3DFXSW"\\Glide" -#endif /* __WIN32__ */ - -#include <3dfx.h> -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -static int sst1InitFgets(char *, FILE *); -static int sst1InitFgetc(FILE *); -#ifndef INIT_LINUX -static int sst1InitParseFieldDac(char *); -#endif -static int sst1InitParseFieldCfg(char *); -#ifndef INIT_LINUX -static int sst1InitParseDacRdWrString(char *, sst1InitDacStruct *); -static int sst1InitParseDacRdWr(char *, sst1InitDacRdWrStruct *); -static int sst1InitParseSetVideoString(char *, sst1InitDacStruct *); -static int sst1InitParseSetMemClkString(char *, sst1InitDacStruct *); -static int sst1InitParseSetVideoModeString(char *, sst1InitDacStruct *); -#endif -static void sst1InitToLower(char *string); -#if __DOS32__ -static void sst1InitFixFilename(char *dst, char *src); -#endif - -static FxBool checkedFileP = FXFALSE; - -#ifndef INIT_LINUX -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() -{ - static FxBool retVal = FXFALSE; - -#ifndef DIRECTX - int inCfg, inDac; - FILE *file = (FILE *) NULL; - char buffer[1024], filename[256]; - int helper = (getenv(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - filename[0] = '\0'; - if (checkedFileP) goto __errExit; - -#if __DOS32__ - { - char fixedFilename[512], *tmpPtr; - char path[512]; - int i; - - - if(getenv("VOODOO2_FILE")) { - /* Override voodoo2.ini name */ - strncpy(filename, getenv("VOODOO2_FILE"), 255); - if(!(file = fopen(filename, "r"))) goto __errExit; - } else { - /* Override path setting */ - if(getenv("VOODOO2_PATH")) - strncpy(path, getenv("VOODOO2_PATH"), 511); - else if(getenv("PATH")) { - strcpy(path, ".;"); - strncat(path, getenv("PATH"), 511 - strlen (path)); - } else - strcpy(path, ".;"); - - i = 0; - while(1) { - if(!i) { - if((tmpPtr = strtok(path, ";")) == NULL) - break; - } else { - if((tmpPtr = strtok(NULL, ";")) == NULL) - break; - } - strcpy(filename, tmpPtr); - sst1InitFixFilename(fixedFilename, filename); - if(fixedFilename[strlen(fixedFilename)-1] == '\\') - sprintf(filename, "%svoodoo2.var", filename); - else - sprintf(filename, "%s\\voodoo2.var", filename); - i++; - if((file = fopen(filename, "r"))) - break; - } - } - } -#elif __MWERKS__ - { - FSSpec iniSpec = { - 0, 0, - "\pvoodoo2.var" - }; - Boolean foundP = false; - - /* Check the app's directory */ - if (!foundP) { - ProcessSerialNumber curApp; - ProcessInfoRec appInfo; - FSSpec appSpec; - - if (GetCurrentProcess(&curApp) != noErr) goto __errAppDir; - - /* We only care about the app's location */ - appInfo.processInfoLength = sizeof(ProcessInfoRec); - appInfo.processName = NULL; - appInfo.processAppSpec = &appSpec; - if (GetProcessInformation(&curApp, &appInfo) != noErr) goto __errAppDir; - - { - CInfoPBRec thePB; - - thePB.hFileInfo.ioCompletion = NULL; - thePB.hFileInfo.ioNamePtr = iniSpec.name; - thePB.hFileInfo.ioVRefNum = appSpec.vRefNum; - thePB.hFileInfo.ioDirID = appSpec.parID; - - thePB.hFileInfo.ioFDirIndex = 0; - - foundP = ((PBGetCatInfoSync(&thePB) == noErr) && - ((thePB.hFileInfo.ioFlAttrib & (0x01 << 4)) == 0)); - if (foundP) { - iniSpec.vRefNum = appSpec.vRefNum; - iniSpec.parID = appSpec.parID; - } - } - - __errAppDir: - ; - } - - /* Check the mac's version of the 'search path' */ - if (!foundP) { - OSType folderList[] = { kPreferencesFolderType, kExtensionFolderType }; - int i; - - for(i = 0; i < sizeof(folderList) / sizeof(folderList[0]); i++) { - short vRefNum; - long dirId; - - if (FindFolder(kOnSystemDisk, folderList[i], false, - &vRefNum, &dirId) == noErr) { - - CInfoPBRec thePB; - - thePB.hFileInfo.ioCompletion = NULL; - thePB.hFileInfo.ioNamePtr = iniSpec.name; - thePB.hFileInfo.ioVRefNum = vRefNum; - thePB.hFileInfo.ioDirID = dirId; - - thePB.hFileInfo.ioFDirIndex = 0; - - foundP = ((PBGetCatInfoSync(&thePB) == noErr) && - ((thePB.hFileInfo.ioFlAttrib & (0x01 << 4)) == 0)); - if (foundP) { - iniSpec.vRefNum = vRefNum; - iniSpec.parID = dirId; - - break; - } - } - } - } - - if (foundP) { - short wdRefNum; - long wdDirId; - - /* Change working directories, just in case the app did something else */ - if (HGetVol(NULL, &wdRefNum, &wdDirId) != noErr) goto __errFile; - if (HSetVol(NULL, iniSpec.vRefNum, iniSpec.parID) != noErr) goto __errFile; - - /* NB: We leave the name trashed after this */ - p2cstr(iniSpec.name); - file = fopen((const char*)iniSpec.name, "r"); - - HSetVol(NULL, wdRefNum, wdDirId); - - __errFile: - ; - } - } -#endif - - if(file == NULL) goto __errExit; - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[VOODOO2]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - retVal = FXTRUE; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) { - if(helper) INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [CFG] section of .ini file...\n")); - retVal = FXFALSE; - break; - } - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) { - if(helper) INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [DAC] section of .ini file...\n")); - retVal = FXFALSE; - break; - } - } - } - if (file != NULL) fclose(file); - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - checkedFileP = FXTRUE; -#endif /* !DIRECTX */ - - return retVal; -} - -#else - -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() { - static FxBool retVal = FXFALSE; - FILE *file = 0; - char buffer[1024], filename[256]; - char *tmpPtr; - char path[512]; - int i; - - filename[0] = '\0'; - if (checkedFileP) goto __errExit; - - if (getenv("VOODOO2_FILE")) { - /* Override voodoo2.ini name */ - strncpy(filename, getenv("VOODOO2_FILE"), 255); - if (!(file = fopen(filename, "r"))) - goto __errExit; - } else { - /* Override path setting */ - if (getenv("VOODOO2_PATH")) { - strncpy(path, getenv("VOODOO2_PATH"), 511); - } else { - strcpy(path, "/etc/conf.3dfx"); - } - - i = 0; - while(1) { - if (!i) { - if ((tmpPtr = strtok(path, ":")) == NULL) - break; - } else { - if ((tmpPtr = strtok(NULL, ":")) == NULL) - break; - } - strncpy(filename, tmpPtr, 255); - if (filename[strlen(filename)-1] == '\\') - snprintf(filename, 255, "%s/voodoo2", filename); - else - snprintf(filename, 255, "%s/voodoo2", filename); - i++; - if ((file = fopen(filename, "r"))) - break; - } - } - if (!file) { - retVal = FXFALSE; - goto __errExit; - } - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = 0; - if (buffer[0]=='#') continue; - if (!sst1InitParseFieldCfg(buffer)) { - retVal = FXFALSE; - break; - } - } - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - if (file) fclose(file); - checkedFileP = FXTRUE; - - return retVal; -} -#endif - -#if defined(INIT_DOS) || defined(INIT_LINUX) - -#if __DOS32__ -static void sst1InitFixFilename(char *dst, char *src) -{ - while(*src) { - *dst++ = *src; - if(*src == '\\') - *dst++ = *src; - src++; - } - *dst = (char) NULL; -} -#endif - - -static int sst1InitFgets(char *string, FILE *stream) -{ - int validChars = 0; - char *ptr = string; - int charRead; - - while(0 != ((charRead = sst1InitFgetc(stream)))) { - *ptr++ = (char) charRead; - validChars++; - if(charRead == '\n') { - *ptr++ = (char) NULL; - break; - } - } - return(validChars); -} - -static int sst1InitFgetc(FILE *stream) -{ - static int column = 0; - static int validChars = 0; - int charRead, charReadL; - int inComment; - - inComment = 0; - while(1) { - charRead = fgetc(stream); - if(inComment == 1) { - if(charRead <= 0) - return(0); - else if(charRead == '\n') - inComment = 0; - column = 0; - validChars = 0; - continue; - } else if(column == 0 && charRead == '#') { - /* Comment line */ - inComment = 1; - column = 0; - validChars = 0; - } else if(charRead <= 0) { - return(0); - } else { - if(charRead == '\n') { - if(validChars > 0) { - validChars = 0; - column = 0; - return(charRead); - } else - continue; - } else { - if(isspace(charRead)) - continue; - validChars++; - column++; - charReadL = (islower(charRead)) ? toupper(charRead) : charRead; - return(charReadL); - } - } - } -} - -static int sst1InitParseFieldCfg(char *string) -{ - char *envName, *envVal; - sst1InitEnvVarStruct *envVarsPtr; - - if((envName = strtok(string, "=")) == NULL) - return(0); - if((envVal = strtok((char *) NULL, "=")) == NULL) - /* Valid environment variable, NULL value */ - return(1); - - /* .ini canonical form is now lower case */ - sst1InitToLower(envName); - sst1InitToLower(envVal); - - if(envVarsBase == (sst1InitEnvVarStruct *) NULL) { - if((envVarsPtr = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsBase = envVarsPtr; - } else { - envVarsPtr = envVarsBase; - while(1) { - if(envVarsPtr->nextVar == (sst1InitEnvVarStruct *) NULL) - break; - else - envVarsPtr = envVarsPtr->nextVar; - } - if((envVarsPtr->nextVar = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsPtr = envVarsPtr->nextVar; - } - envVarsPtr->nextVar = (sst1InitEnvVarStruct *) NULL; - strcpy(envVarsPtr->envVariable, envName); - strcpy(envVarsPtr->envValue, envVal); - - return(1); -} - -#ifndef INIT_LINUX -static int sst1InitParseFieldDac(char *string) -{ - char *dacFieldReference, *dacFieldValue; - static sst1InitDacStruct *dacPtr = (sst1InitDacStruct *) NULL; - - if((dacFieldReference = strtok(string, "=")) == NULL) - return(0); - if(!strcmp(dacFieldReference, "MANUFACTURER")) { - /* Add new dac device */ - if(dacStructBase == (sst1InitDacStruct *) NULL) { - if((dacPtr = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacStructBase = dacPtr; - } else { - dacPtr = dacStructBase; - while(1) { - if(dacPtr->nextDac == (sst1InitDacStruct *) NULL) - break; - else - dacPtr = dacPtr->nextDac; - } - if((dacPtr->nextDac = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacPtr = dacPtr->nextDac; - } - dacPtr->nextDac = (sst1InitDacStruct *) NULL; - dacPtr->dacManufacturer[0] = (char) NULL; - dacPtr->dacDevice[0] = (char) NULL; - dacPtr->detect = (sst1InitDacRdWrStruct *) NULL; - dacPtr->setVideo = (sst1InitDacSetVideoStruct *) NULL; - dacPtr->setMemClk = (sst1InitDacSetMemClkStruct *) NULL; - dacPtr->setVideoMode = (sst1InitDacSetVideoModeStruct *) NULL; - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacManufacturer, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DEVICE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacDevice, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DETECT")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseDacRdWrString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEO")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETMEMCLK")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetMemClkString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEOMODE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoModeString(dacFieldValue, dacPtr)) - return(0); - } else - return(0); - - return(1); -} - -static int sst1InitParseDacRdWrString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!(dacBase->detect = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacBase->detect; - } else { - for(i=0; i<(cntr-1); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseDacRdWr(char *string, sst1InitDacRdWrStruct *dacRdWrPtr) -{ - char *addr, *data, *mask, *addrDataCmd; - char stringCpy[2048]; - - strcpy(stringCpy, string); - - if(stringCpy[5] == '(') { - stringCpy[5] = (char) NULL; - addrDataCmd = &stringCpy[6]; - } else if(stringCpy[7] == '(') { - stringCpy[7] = (char) NULL; - addrDataCmd = &stringCpy[8]; - } else if(stringCpy[8] == '(') { - stringCpy[8] = (char) NULL; - addrDataCmd = &stringCpy[9]; - } else if(stringCpy[9] == '(') { - stringCpy[9] = (char) NULL; - addrDataCmd = &stringCpy[10]; - } else - return(0); - - if(!strcmp(stringCpy, "dacwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacwrpop")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WRMOD_POP; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrdwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_RDMODWR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrd")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDNOCHECK; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else { - dacRdWrPtr->type = DACRDWR_TYPE_RDCHECK; - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } - } else if(!strcmp(stringCpy, "dacrdpush")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDPUSH; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else - return(0); - } else { - return(0); - } - - return(1); -} - -static int sst1InitParseSetVideoString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoStruct *dacSetVideoPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideo) { - if(!(dacBase->setVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacBase->setVideo; - } else { - dacSetVideoPtr = dacBase->setVideo; - while(1) { - if(!dacSetVideoPtr->nextSetVideo) - break; - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - if(!(dacSetVideoPtr->nextSetVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - dacSetVideoPtr->nextSetVideo = (sst1InitDacSetVideoStruct *) NULL; - /* Width */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->width); - /* Height */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->height); - /* Refresh */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->refresh); - /* video16BPP */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->video16BPP); - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoPtr->setVideoRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoPtr->setVideoRdWr; - } else { - for(i=0; i<(cntr+3); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetMemClkString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetMemClkStruct *dacSetMemClkPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setMemClk) { - if(!(dacBase->setMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacBase->setMemClk; - } else { - dacSetMemClkPtr = dacBase->setMemClk; - while(1) { - if(!dacSetMemClkPtr->nextSetMemClk) - break; - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - if(!(dacSetMemClkPtr->nextSetMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - dacSetMemClkPtr->nextSetMemClk = (sst1InitDacSetMemClkStruct *) - NULL; - /* Frequency */ - SSCANF(dacRdWrCmd, "%i", &dacSetMemClkPtr->frequency); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetMemClkPtr->setMemClkRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetMemClkPtr->setMemClkRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetVideoModeString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoModeStruct *dacSetVideoModePtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideoMode) { - if(!(dacBase->setVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacBase->setVideoMode; - } else { - dacSetVideoModePtr = dacBase->setVideoMode; - while(1) { - if(!dacSetVideoModePtr->nextSetVideoMode) - break; - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - if(!(dacSetVideoModePtr->nextSetVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - dacSetVideoModePtr->nextSetVideoMode = - (sst1InitDacSetVideoModeStruct *) NULL; - /* video16BPP */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoModePtr->video16BPP); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoModePtr->setVideoModeRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoModePtr->setVideoModeRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} -#endif - -static void sst1InitToLower(char *string) -{ - char *ptr = string; - - while(*ptr) { - *ptr = (isupper(*ptr)) ? tolower(*ptr) : *ptr; - ptr++; - } -} - -#if __WIN32__ -FxBool GetRegistryKey(HKEY hKey, const char* keyName, - char* regValBuf, FxU32 bufSize) -{ - DWORD type; - DWORD tsize = bufSize; - FxBool retVal = FXFALSE; - - // Don't worry about default if query fails, its handled higher up - if(!RegQueryValueEx(hKey, keyName, NULL, &type, (CONST LPBYTE)regValBuf, &tsize)) { - switch(type) { - case REG_DWORD: - { - DWORD dValue = *(DWORD*)regValBuf; - sprintf(regValBuf, "%d", dValue); - } - /* Fall through */ - - case REG_SZ: - retVal = FXTRUE; - break; - } - } - - return retVal; -} -#endif /* __WIN32__ */ - -static const char* -myGetenv(const char* envKey) -{ - FxBool callRealGetenvP = FXTRUE; - -#if __WIN32__ - /* NB: If were being called from cya code in - * DllMain(DLL_PROCESS_DETACH) because the current app has called - * exit() or dropped off of the end of main the per dll environ - * string table has been freed by the c runtime but has not been set - * to NULL. Bad things happen if this memory has been unmapped by - * the system or if the string cannot be found. - */ - { - HANDLE curProcessHandle = GetCurrentProcess(); - DWORD exitCode = STILL_ACTIVE; - - callRealGetenvP = ((curProcessHandle != NULL) && - GetExitCodeProcess(curProcessHandle, &exitCode) && - (exitCode == STILL_ACTIVE)); - } -#endif /* __WIN32__ */ - - return (callRealGetenvP - ? getenv(envKey) - : NULL); -} - -/* -** sst1InitGetenv(): -** Getenv() for INIT routines. -** -** If the actual environment variable exists (determined by a call to -** the system getenv() routine), then that pointer is returned. Otherwise, -** if the variable is defined in the [CFG] section of "voodoo2.ini", then -** a pointer to the value defined in "voodoo2.ini" is returned. Otherwise, -** NULL is returned -** -*/ -FX_ENTRY char* FX_CALL sst1InitGetenv(char *string) -{ - const char* retVal; - - /* Does the real environment variable exist? - * This overrides everything for glide. - */ - retVal = myGetenv(string); - if (retVal == NULL) { -#if __WIN32__ - /* On windows check to see if the control panel thingee - * has added entries for glide or voodoo^2. - */ - { - /* List of the various registry paths to check. These - * should be in the order that you want them checked in. - */ - static const char* regPathList[] = { - REGSTR_PATH_GLIDE, - REGSTR_PATH_3DFXSW - }; - HKEY hKey; - int i; - - for(i = 0; (retVal == NULL) && (i < sizeof(regPathList) / sizeof(regPathList[0])); i++) { - if (!RegOpenKey(HKEY_LOCAL_MACHINE, regPathList[i], &hKey)) { -#define kRegKeyBufSize 256 - static char regKeyBuf[kRegKeyBufSize]; - - regKeyBuf[0] = '\0'; - if (GetRegistryKey(hKey, string, regKeyBuf, kRegKeyBufSize)) retVal = regKeyBuf; - RegCloseKey(hKey); - } - } - } -#endif /* __WIN32__ */ - - /* Does the requested environment variable exist in "voodoo2.ini"? */ - /* Dump CFG Data... */ - if (!checkedFileP) { - static FxBool inProc = FXFALSE; - - if (!inProc) { - inProc = FXTRUE; - sst1InitVoodooFile(); - inProc = FXFALSE; - } - } - - { - sst1InitEnvVarStruct *envVarsPtr = envVarsBase; - char tempSearchString[kMaxEnvVarLen]; - - /* Put the search into canonical form */ - strcpy(tempSearchString, string); - sst1InitToLower(tempSearchString); - - while(envVarsPtr) { - if(!strcmp(tempSearchString, envVarsPtr->envVariable)) { - retVal = envVarsPtr->envValue; - break; - } - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - } - } - - return (char*)retVal; -} -#endif /* INIT_DOS */ - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/print.c b/glide2x/cvg/init/print.c deleted file mode 100644 index 15e5e39..0000000 --- a/glide2x/cvg/init/print.c +++ /dev/null @@ -1,88 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Print functions for SST-1 Initialization routines -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -#ifdef INIT_OUTPUT - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *, va_list); - -FX_ENTRY void FX_CALL sst1InitPrintf(const char *format, ...) -{ - va_list args; - static FxBool firstPass = FXTRUE; - static FxBool printIt = FXFALSE; - - if(firstPass == FXTRUE) { - sst1InitMsgFile = stdout; - firstPass = FXFALSE; - if(GETENV(("SSTV2_INITDEBUG")) || GDBG_GET_DEBUGLEVEL(5)) - printIt = FXTRUE; - if(GETENV(("SSTV2_INITDEBUG_FILE"))) { - printIt = ((sst1InitMsgFile = fopen(GETENV(("SSTV2_INITDEBUG_FILE")), "w")) != NULL); - if (!printIt) { - fprintf(stderr, "sst1InitPrintf(): Could not open file '%s' for logging...\n", - GETENV(("SSTV2_INITDEBUG_FILE"))); - } - } - } - - if(printIt == FXFALSE) - return; - - va_start(args, format); - sst1InitVPrintf(format, args); - va_end(args); -} - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *format, va_list args) -{ - vfprintf(sst1InitMsgFile, format, args); - fflush(sst1InitMsgFile); -} - -#endif - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/rcver.h b/glide2x/cvg/init/rcver.h deleted file mode 100644 index a041667..0000000 --- a/glide2x/cvg/init/rcver.h +++ /dev/null @@ -1,5 +0,0 @@ -#define MANVERSION 1 -#define MANREVISION 1 -#define BUILD_NUMBER 1 - -#define VERSIONSTR "Voodoo2 InitCode " "$Revision$" "\0" diff --git a/glide2x/cvg/init/sli.c b/glide2x/cvg/init/sli.c deleted file mode 100644 index de62b5c..0000000 --- a/glide2x/cvg/init/sli.c +++ /dev/null @@ -1,741 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing scanline interleaving -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitSli(): -** Setup Multiple SST-1 subsystems for Scanline Interleaving -** sstbase0 defined to be the SLI Master -** sstbase1 defined to be the SLI Slave -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSli(FxU32 *sstbase0, FxU32 *sstbase1) -{ - FxU32 j, n, MasterPhysAddr, cntr; - SstRegs *sstMaster = (SstRegs *) sstbase0; - SstRegs *sstSlave = (SstRegs *) sstbase1; - FxU32 masterVInClkDel, masterVOutClkDel; - FxU32 slaveVInClkDel, slaveVOutClkDel; - FxU32 masterPVOutClkDel, slavePVOutClkDel; - FxU32 pciFifoLwm, memFifoLwm; - FxU32 memOffsetOrig, tilesInXOrig; - FxU32 memOffsetNew; - int memFifoEntriesNew; - FxU32 memSizeInPages; - FxU32 memFifoRowBaseNew; - FxU32 swapAlgorithm = SST_SWAP_SLISYNC; - FxU32 videoWindowActive = 0x1; - FxU32 videoWindowActiveDrag = 0xf; - sst1DeviceInfoStruct *sst1M, *sst1S; - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - if(!sst1CurrentBoard->sliDetected) - return(FXFALSE); - sst1S = sst1CurrentBoard; - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - if(!sst1CurrentBoard->sliDetected) - return(FXFALSE); - sst1M = sst1CurrentBoard; - - // Verify that the board configurations are identical - // - // NB: Some of the tests are no longer necessary because - // the init code clients are doing the magic to make the - // board appear as the minimum value for things like memory. - if(/* (sst1M->fbiMemSize != sst1S->fbiMemSize) || */ - /*(sst1M->tmuMemSize[0] != sst1S->tmuMemSize[0]) || */ - (sst1M->numberTmus != sst1S->numberTmus) || - (sst1M->fbiBoardID != sst1S->fbiBoardID) || - /* (sst1M->fbiRevision != sst1S->fbiRevision) || */ - /* (sst1M->tmuRevision != sst1S->tmuRevision) || */ - (sst1M->fbiVideoStruct != sst1S->fbiVideoStruct)) { - INIT_PRINTF(("sst1InitSli() ERROR: Boards types must be identical...\n")); - return(FXFALSE); - } - - // Verify that no video scanline doubling is being used... - if(sst1M->fbiVideoStruct->miscCtrl & BIT(1)) { - INIT_PRINTF(("sst1InitSli() ERROR: Scanline doubling not supported with SLI...\n")); - return(FXFALSE); - } - - INIT_PRINTF(("sst1InitSli(): Enabling Scanline Interleaving...\n")); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - // User override of swap algorithm... - if(GETENV(("SSTV2_SLISWAP"))) { - FxU32 swapAlg = ATOI(GETENV(("SSTV2_SLISWAP"))); - - if(swapAlg == 1) { - INIT_PRINTF(("sst1InitSli(): Using dac_data[0] for swapping(%d, %d)...\n", videoWindowActive, videoWindowActiveDrag)); - swapAlgorithm = SST_SWAP_DACDATA0; - } - } - - // Get values setup by sst1InitVideo()... - memOffsetOrig = (IGET(sstMaster->fbiInit2) & SST_VIDEO_BUFFER_OFFSET) >> - SST_VIDEO_BUFFER_OFFSET_SHIFT; - tilesInXOrig = (IGET(sstMaster->fbiInit1) & SST_VIDEO_TILES_IN_X) >> - SST_VIDEO_TILES_IN_X_SHIFT; - if(IGET(sstMaster->fbiInit1) & SST_VIDEO_TILES_IN_X_MSB) - tilesInXOrig += 16; - - if(tilesInXOrig & 0x1) { - // (e.g. 800x600 resolution) - /* - Integer formula for: - memOffset = - (TRUNC((xDimension/64)+.99) * - TRUNC((((yDimension/2)+1)/32)+.99)) - */ - memOffsetNew = (tilesInXOrig * - ((((sst1CurrentBoard->fbiVideoHeight>>1)+1) + 31) >> 5)); - } else { - // (e.g. 640x480 resolution) - // Calculate number of tiles in the vertical dimension - // Must add entire row of tiles at the bottom for fixes for - // Y-Origin at lower left - memOffsetNew = tilesInXOrig * - (((sst1CurrentBoard->fbiVideoHeight >> 1) + 32) >> 5); - } - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - - memFifoRowBaseNew = (sst1CurrentBoard->fbiVideoColBuffs + - sst1CurrentBoard->fbiVideoAuxBuffs) * memOffsetNew; - - memFifoEntriesNew = (65536 - (int) - (((int) (memSizeInPages - 1) - - (int) memFifoRowBaseNew) * 512)) >> 5; - if(memFifoEntriesNew <= 256) - memFifoEntriesNew = 0x100; // max. memory fifo size... - else if(memFifoEntriesNew >= 2048) { - INIT_PRINTF(("sst1InitSli(): Invalid memFifoEntriesNew 0x%x\n", - memFifoEntriesNew)); - return(FXFALSE); - } - - INIT_PRINTF(("sst1InitSli(): Allocating %d Color Buffers and %d Aux Buffer(s)...\n", sst1CurrentBoard->fbiVideoColBuffs, sst1CurrentBoard->fbiVideoAuxBuffs)); - INIT_PRINTF(("sst1InitSli(): Allocating Memory/Command Fifo starting at page %d...\n", memFifoRowBaseNew)); - INIT_PRINTF(("sst1InitSli(): Memory FIFO Entries: %d...\n", - 65536 - (memFifoEntriesNew << 5))); -#if 0 - INIT_PRINTF(("sst1InitSli(): memOffsetOrig:%d, tilesInXOrig:%d\n", - memOffsetOrig, tilesInXOrig)); - INIT_PRINTF(("sst1InitSli(): memOffsetNew:%d, memFifoEntriesNew:0x%x\n", - memOffsetNew, memFifoEntriesNew)); -#endif - - // Setup SLI Slave... - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~SST_SCANLINE_SLV_OWNPCI) | SST_SCANLINE_SLI_SLV)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_VIDEO_RESET | SST_EN_SCANLINE_INTERLEAVE)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(SST_TREX(sstSlave,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_SWAP_ALGORITHM) | swapAlgorithm); - sst1InitIdleFBINoNOP(sstbase1); - // Initialize Y-Origin - ISET(sstSlave->fbiInit3, (IGET(sstSlave->fbiInit3) & ~SST_YORIGIN_TOP) | - (sst1CurrentBoard->fbiVideoHeight << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffsetNew << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1CurrentBoard->fbiVideoMemOffset = memOffsetNew; - sst1InitIdleFBINoNOP(sstbase1); - // Initialize memory fifo - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_HWM) | (memFifoEntriesNew << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - (memFifoRowBaseNew << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - // Fix video dimensions - ISET(sstSlave->videoDimensions, - (((sst1CurrentBoard->fbiVideoHeight+2) << SST_VIDEO_YDIM_SHIFT) | - ((sst1CurrentBoard->fbiVideoWidth-1) << SST_VIDEO_XDIM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - // Setup video clocks - ISET(sstSlave->fbiInit5, (IGET(sstSlave->fbiInit5) & - ~(SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN)) | - SST_VID_CLK_DAC_DATA16_SEL); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_VIDEO_VID_CLK_SLAVE); - sst1CurrentBoard->fbiInit6 &= ~SST_SLI_SYNC_MASTER; - sst1CurrentBoard->fbiInit6 = ((sst1CurrentBoard->fbiInit6 & - ~(SST_SLI_SWAP_VACTIVE | SST_SLI_SWAP_VACTIVE_DRAG)) | - (videoWindowActive<fbiInit6, sst1CurrentBoard->fbiInit6); - - slaveVInClkDel = 0; - slaveVOutClkDel = 0; - slavePVOutClkDel = 0; - - if(GETENV(("SSTV2_SLIS_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_VOUT_CLKDEL")), "%ld", &slaveVOutClkDel); - if(GETENV(("SSTV2_SLIS_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_PVOUT_CLKDEL")), "%ld", &slavePVOutClkDel); - if(GETENV(("SSTV2_SLIS_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIS_VIN_CLKDEL")), "%ld", &slaveVInClkDel); - INIT_PRINTF(("sst1InitSli(): slaveVinClkdel=0x%x, slaveVOutClkDel=0x%x, slavePVOutClkDel=0x%x\n", - slaveVInClkDel, slaveVOutClkDel, slavePVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - // 16-bit Video Output - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_SLAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - SST_VIDEO_VCLK_SEL | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - // 24-bit Video Output - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_SLAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_BLANK_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN)); - sst1InitIdleFBINoNOP(sstbase1); - // Initialize pci and memory fifos... - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SSTV2_PCIFIFO_LWM"))) - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - if(!GETENV(("SSTV2_MEMFIFO_LWM"))) - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - INIT_PRINTF(("sst1InitSli(): Slave pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstSlave->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstSlave->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_EN_SCANLINE_INTERLEAVE | SST_VIDEO_RESET)); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - if(IGET(sstSlave->fbiInit1) & SST_VIDEO_RESET) { - INIT_PRINTF(("sst1InitSli(): Could not unReset Slave Video...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - if(!(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE)) { - INIT_PRINTF(("sst1InitSli(): Could not setup SLI Slave...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - break; - } - - // Setup SLI Master... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - ISET(SST_TREX(sstMaster,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_SWAP_ALGORITHM) | swapAlgorithm); - sst1InitIdleFBINoNOP(sstbase0); - // Initialize Y-Origin - ISET(sstMaster->fbiInit3, (IGET(sstMaster->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(sst1CurrentBoard->fbiVideoWidth == 960) - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffsetNew << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1CurrentBoard->fbiVideoMemOffset = memOffsetNew; - sst1InitIdleFBINoNOP(sstbase0); - // // Initialize memory fifo - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_HWM) | - (memFifoEntriesNew << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - (memFifoRowBaseNew << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - // Fix video dimensions - ISET(sstMaster->videoDimensions, - (((sst1CurrentBoard->fbiVideoHeight+2) << SST_VIDEO_YDIM_SHIFT) | - ((sst1CurrentBoard->fbiVideoWidth-1) << SST_VIDEO_XDIM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase0); - // Setup video clocks - ISET(sstMaster->fbiInit5, IGET(sstMaster->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN | - SST_VID_CLK_DAC_DATA16_SEL); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_VIDEO_VID_CLK_SLAVE); - sst1CurrentBoard->fbiInit6 |= SST_SLI_SYNC_MASTER; - sst1CurrentBoard->fbiInit6 = ((sst1CurrentBoard->fbiInit6 & - ~(SST_SLI_SWAP_VACTIVE | SST_SLI_SWAP_VACTIVE_DRAG)) | - (videoWindowActive<fbiInit6, sst1CurrentBoard->fbiInit6); - - // Following work well up to around 100 MHz... - // masterVInClkDel = 2; - // masterVOutClkDel = 0; - // masterPVOutClkDel = 0; - // Following seem to work up to 800x600@85 Hz (112 MHz) - masterVInClkDel = 3; - masterVOutClkDel = 2; - masterPVOutClkDel = 0; - if(GETENV(("SSTV2_SLIM_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_VOUT_CLKDEL")), "%ld", &masterVOutClkDel); - if(GETENV(("SSTV2_SLIM_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_PVOUT_CLKDEL")), "%ld", &masterPVOutClkDel); - if(GETENV(("SSTV2_SLIM_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_SLIM_VIN_CLKDEL")), "%ld", &masterVInClkDel); - INIT_PRINTF(("sst1InitSli(): masterVinClkdel=0x%x, masterVOutClkDel=0x%x, masterPVOutClkDel=0x%x\n", - masterVInClkDel, masterVOutClkDel, masterPVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - // 16-bit Video Output - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL | - SST_VIDEO_BLANK_EN)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - SST_VIDEO_VCLK_SEL | - SST_PCI_WRWS_1 | - SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else { - // 24-bit Video Output - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL | - SST_VIDEO_BLANK_EN)) | - SST_EN_SCANLINE_INTERLEAVE | - // SST_VIDEO_VID_CLK_2X | - // SST_VIDEO_INVERT_VID_CLK_2X | - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitReturnStatus(sstbase0); - ISET(sstMaster->fbiInit5, IGET(sstMaster->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN); - } - sst1InitIdleFBINoNOP(sstbase0); - // Initialize pci and memory fifos... - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SSTV2_PCIFIFO_LWM"))) - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(!GETENV(("SSTV2_MEMFIFO_LWM"))) - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - INIT_PRINTF(("sst1InitSli(): Master pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstMaster->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstMaster->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - - // Master - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - MasterPhysAddr = sst1CurrentBoard->physAddr[0]; - sst1InitReturnStatus(sstbase0); // flush pci packer with reads - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - // Slave - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~(SST_SCANLINE_SLV_OWNPCI)) | SST_SCANLINE_SLI_SLV)); - - /* dpc - 19 may 1998 - FixMe - * Min the clock values for the two boards so that they are - * happy running together. - */ -#define MIN(__a, __b) (((__a) < (__b)) ? (__a) : (__b)) - { - sst1DeviceInfoStruct* infoMaster; - sst1DeviceInfoStruct* infoSlave; - - if (!sst1InitCheckBoard(sstbase0)) return FXFALSE; - infoMaster = sst1CurrentBoard; - - if (!sst1InitCheckBoard(sstbase1)) return FXFALSE; - infoSlave = sst1CurrentBoard; - - /* fbi and tmu clock freqs should be equal since they are - * both set from sst1InitCalcGrxClk. - */ - if (infoMaster->fbiGrxClkFreq != infoSlave->fbiGrxClkFreq) { - /* Recompute the actual clock rates before any clocking down - * due to sli for some board revisions. - */ - if (!sst1InitCalcGrxClk(sstbase0)) return FXFALSE; - if (!sst1InitCalcGrxClk(sstbase1)) return FXFALSE; - - /* Save the min clock of the two boards */ - infoMaster->fbiGrxClkFreq = - infoMaster->tmuGrxClkFreq = - infoSlave->fbiGrxClkFreq = - infoSlave->tmuGrxClkFreq = MIN(infoMaster->fbiGrxClkFreq, infoSlave->fbiGrxClkFreq); - - /* Clear the clock setting bits */ - infoMaster->initGrxClkDone = - infoSlave->initGrxClkDone = FXFALSE; - - /* Reset the clocks for each board */ - if (!sst1InitGrxClk(sstbase0)) return FXFALSE; - if (!sst1InitGrxClk(sstbase1)) return FXFALSE; - - /* Now check for the memory configurations of the devices. - * They no longer need to match, but any future calls to - * sst1InitGetDeviceInfo should now reflect the current - * minimized state of the world. - */ - { - FxU32 memSize, i; - - if (infoMaster->fbiMemSize != infoSlave->fbiMemSize) { - memSize = MIN(infoMaster->fbiMemSize, infoSlave->fbiMemSize); - infoMaster->fbiMemSize = - infoSlave->fbiMemSize = memSize; - } - - for(i = 0; i < infoMaster->numberTmus; i++) { - if (infoMaster->tmuMemSize[i] != infoSlave->tmuMemSize[i]) { - memSize = MIN(infoMaster->tmuMemSize[i], infoSlave->tmuMemSize[i]); - infoMaster->tmuMemSize[i] = - infoSlave->tmuMemSize[i] = memSize; - } - } - } - } - } -#undef MIN - - // Enable SLI Bus Snooping for the Slave - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, (j & ~SST_SLI_SNOOP_MEMBASE) | - ((MasterPhysAddr>>24 & 0xff) << SST_SLI_SNOOP_MEMBASE_SHIFT)); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SLI_SNOOP_EN); - sst1InitReturnStatus(sstbase1); // flush pci packer with reads - sst1InitReturnStatus(sstbase1); - sst1InitReturnStatus(sstbase1); - - // Reset video unit in both Master and Slave - // Then, reset graphics unit in both Master and Slave - // Finally, deassert both resets to guarantee that Master and Slave - // see the same vsyncs (and maintain the same swap buffer counter) - - // Probit writes to PCI fifo while resetting graphics core - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_PCI_FIFOWR_EN); - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_PCI_FIFOWR_EN); - - // Reset Video core... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase1); - - // Reset Graphics core... - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) | SST_GRX_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) | SST_GRX_RESET); - sst1InitReturnStatus(sstbase1); - - // Allow resets to propogate... - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase1); - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase1); - - // De-assert reset to Graphics core... - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_GRX_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) & ~SST_GRX_RESET); - sst1InitReturnStatus(sstbase1); - - // De-assert reset to Video core... - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase0); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitReturnStatus(sstbase1); - - // Allow writes to PCI fifo... - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_PCI_FIFOWR_EN); - // Update info structure for initEnable - sst1CurrentBoard->fbiInitEnable = j | SST_PCI_FIFOWR_EN; - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_PCI_FIFOWR_EN); - // Update info structure for initEnable - sst1CurrentBoard->fbiInitEnable = j | SST_PCI_FIFOWR_EN; - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - - // Clear fbistat registers after clearing screen - ISET(sstMaster->nopCMD, 0x1); - - sst1CurrentBoard->sliSlaveVirtAddr = sstbase1; - - sst1InitIdle(sstbase0); - - // Synchronize Boards - for(j=0; j<3; j++) { - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x0); // Do not wait for vRetrace... - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - } - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x1); // Sync to vRetrace... - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - - if(GETENV(("SSTV2_IGNORE_IDLE"))) - initIdleEnabled = 0; - - INIT_PRINTF(("sst1InitSli() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitShutdownSli(): -** Shutdown SLI configuration -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdownSli(FxU32 *sstbase) -{ - SstRegs *sstMaster = (SstRegs *) sstbase; - SstRegs *sstSlave; - FxU32 n, j, cntr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sstSlave = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - - if(sst1CurrentBoard->sliSlaveVirtAddr != (FxU32 *) NULL) { - INIT_PRINTF(("sst1InitShutdownSli(): Disabling Scanline Interleaving...\n")); - sst1CurrentBoard->sliSlaveVirtAddr = (FxU32 *) NULL; - - cntr = 0; - while(1) { - if(sst1InitCheckBoard((FxU32 *) sstSlave) == FXFALSE) - return(FXFALSE); - // Turn off scanline interleaving and snooping in slave... - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~(SST_SCANLINE_SLV_OWNPCI | - SST_SCANLINE_SLI_SLV | SST_SLI_SNOOP_EN | - SST_SLI_SNOOP_MEMBASE)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstSlave); - - if(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - if(++cntr < 10) - continue; - else { - INIT_PRINTF(("sst1InitShutdown(): Could not disable Slave SLI...\n")); - return(FXFALSE); - } - } - break; - } - if(sst1InitCheckBoard((FxU32 *) sstMaster) == FXFALSE) - return(FXFALSE); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstMaster); - } - return(FXTRUE); -} - -/* -** sst1InitSliDetect(): -** Determine if scanline interleave has been detected (either through -** power-up settings or through SST_SLIDETECT) -** -*/ -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *sstbase) -{ - FxU32 sliDetected; - - if(GETENV(("SSTV2_SLIDETECT"))) - sliDetected = ATOI(GETENV(("SSTV2_SLIDETECT"))); - else - sliDetected = sst1InitSliPaired(sstbase); - - return sliDetected; -} - -/* -** sst1InitSliPaired(): -** Determine if scanline interleave has been detected through -** power-up settings. -** -*/ -FX_ENTRY FxU32 FX_CALL -sst1InitSliPaired(FxU32 *sstbase) -{ - static int firstTime = 1; - static FxU32 sliPaired = 0; - - if(firstTime) { - SstRegs* sst = (SstRegs *) sstbase; - - sliPaired = (((IGET(sst->fbiInit5) & SST_SLI_DETECT) == SST_SLI_DETECT) && - (boardsInSystem > 1)); - firstTime = 0; - } - - return sliPaired; -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/sst1init.c b/glide2x/cvg/init/sst1init.c deleted file mode 100644 index 340e13a..0000000 --- a/glide2x/cvg/init/sst1init.c +++ /dev/null @@ -1,1332 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -/* -** Initialization code for SST-1 board. -** -** NOTE: This code must compiled with optimizations DISABLED!! -** -** The following environment variables can optionally be used to alter -** functionality (A value of X is a "don't care"): -** -** Variable Value Description -** -------- ----- ----------- -** SSTV2_ARCADE X Allow special configs for arcade use -** SSTV2_ALLOC_AUX {0,1} Number of aux. buffers to allocate -** SSTV2_ALLOC_COLOR {2,3} Number of color buffers to allocate -** SSTV2_BACKPORCH hex Specify value of backPorch video register -** SSTV2_BOARDS val Specify number of SST-1 boards in system -** SSTV2_CMDFIFO_DIRECT X Enable Direct Execution of CMDFIFO -** SSTV2_CMDFIFO_NOHOLES X Disable hole counting feature in CMDFIFO -** SSTV2_DEBUGDAC X Print out debug information for DAC -** reads and writes -** SSTV2_DEVICEID X Specify the device ID value passed to -** the PCI library -** SSTV2_DIMENSIONS hex Specify value of videoDimensions register -** SSTV2_FASTMEM_RAS_READS X Allow fast ras reads -** SSTV2_FASTPCIRD X Enable fast PCI reads -** SSTV2_FBICFG hex Specify FBI configuration strapping bits -** SSTV2_FBI_MEMSIZE val Specify amount of frame buffer memory -** SSTV2_FT_CLKDEL hex Fbi-to-Trex clock delay value -** SSTV2_GAMMA float Floating point value for gamma correction -** SSTV2_GRXCLK val 16 <= Frequency < 80 (50 is default) -** SSTV2_HSYNC hex Specify value of hSync video register -** SSTV2_IGNORE_CLKDELAYS X Ignore calls to sst1InitSetClkDelays() -** SSTV2_IGNORE_IDLE X Ignore calls to sst1InitIdle*() -** SSTV2_IGNORE_INIT_GAMMA X Bypass sst1InitGamma call and return -** SSTV2_IGNORE_INIT_REGISTERS X Bypass sst1InitRegisters call and return -** SSTV2_IGNORE_INIT_VIDEO X Bypass sst1InitVideo call and return -** SSTV2_INITDEBUG X Enable debug output -** SSTV2_INITDEBUG_FILE file File to direct all debug output -** SSTV2_MEMFIFO 0 Disable FBI Memory FIFO -** SSTV2_MEMFIFO 1 Enable FBI Memory FIFO -** SSTV2_MEMFIFO_ENTRIES hex Set number of entries in memory fifo -** SSTV2_MEMFIFO_HWM hex Set memory fifo high water mark -** SSTV2_MEMFIFO_LFB {0,1} Specify LFB writes through Memory FIFO -** SSTV2_MEMFIFO_LWM hex Set memory fifo low water mark -** SSTV2_MEMFIFO_TEX {0,1} Specify Texture writes through Mem FIFO -** SSTV2_MEMOFFSET hex Specify value of memoffset video register -** SSTV2_NOCHECKHANG X Do not Check for FBI Hangs for texturing -** SSTV2_NODEVICEINFO X Ignore calls to sst1InitFillDeviceInfo() -** SSTV2_NOSHUTDOWN X Do not turn off monitor refresh on call -** to sst1InitShutdown() -** SSTV2_NUM_TMUS {1,2,3} Specify number of TMUs detected -** SSTV2_PCIFIFO_LWM hex Set pci fifo low water mark -** SSTV2_PFT_CLKDEL hex Preliminary Fbi-to-Trex clock delay value -** SSTV2_PTF0_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #0) -** SSTV2_PTF1_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #1) -** SSTV2_PTF2_CLKDEL hex Prelim TMU2Fbi clock delay value (TMU #2) -** SSTV2_SIPROCESS_CNTR hex Silicon process monitor PCI counter load -** SSTV2_SLIDETECT {0,1} Specify Scanline Interleaving detection -** SSTV2_SLIM_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Master) -** SSTV2_SLIM_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Master) -** SSTV2_SLIS_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Slave) -** SSTV2_SLIS_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Slave) -** SSTV2_SCREENREFRESH {60,75, Select monitor refresh rate -** 85,120} -** SSTV2_SCREENREZ {512, Select monitor resolution (512x384) -** 512256, (512x256) -** 640400, (640x400) -** 640, (640x480) -** 800, (800x600) -** 856, (856x600) -** 960, (960x720) -** 1024} (1024x768) -** SSTV2_SLOWMEM_RTW X Insert wait state for read-to-write -** transitions -** SSTV2_SLOWMEM_WTR X Insert wait state for write-to-read -** transitions -** SSTV2_SLOWPCIWR X Enable 1 wait-state PCI writes -** SSTV2_SLISWAP 1 Use dac_data[0] for SLI swapping -** SSTV2_SWAPBOARDS X Swap order of mapping boards -** SSTV2_TEXMAP_DISABLE X Disable texture mapping -** SSTV2_TF0_CLKDEL hex Trex-to-Fbi clock delay value (TMU #0) -** SSTV2_TF1_CLKDEL hex Trex-to-Fbi clock delay value (TMU #1) -** SSTV2_TF2_CLKDEL hex Trex-to-Fbi clock delay value (TMU #2) -** SSTV2_TF_FIFO_THRESH hex Set TREX-to-FBI FIFO threshold -** SSTV2_TILESINX hex Specify value of tilesInX video register -** SSTV2_TMUCFG hex Specify TMU configuration strapping bits -** SSTV2_TMUMEM X Enable accurate determination of TMU mem -** SSTV2_TMU_MEMSIZE val Specify amount of texture memory -** SSTV2_TREX0INIT0 hex Set trexInit0 register value - TMU #0 -** SSTV2_TREX0INIT1 hex Set trexInit1 register value - TMU #0 -** SSTV2_TREX1INIT0 hex Set trexInit0 register value - TMU #1 -** SSTV2_TREX1INIT1 hex Set trexInit1 register value - TMU #1 -** SSTV2_TREX2INIT0 hex Set trexInit0 register value - TMU #2 -** SSTV2_TREX2INIT1 hex Set trexInit1 register value - TMU #2 -** SSTV2_VIN_CLKDEL hex Specify FBI internal video clock delay -** SSTV2_VOUT_CLKDEL hex Specify FBI external video clock delay -** SSTV2_VGA_PASS {0,1} Force VGA_PASS output to {0,1} -** SSTV2_VIDCLK2X val Video clock frequency (2x dot clock) -** SSTV2_VIDEO_24BPP 0 Select 16-bit video output -** SSTV2_VIDEO_24BPP 1 Select 24-bit video output -** SSTV2_VIDEO_DISABLE X Turn off Video/Monitor refresh in FBI -** SSTV2_VIDEO_FILTER_DISABLE X Disable video filtering -** SSTV2_VIDEO_FILTER_THRESHOLD hex Set video filtering threshold -** SSTV2_VIDEO_NOCLEAR X Do not clear buffers in sst1InitVideo() -** SSTV2_VIDEO_CLEARCOLOR hex Clear screen color -** SSTV2_VFIFO_THRESH {0-31} Select video fifo threshold -** SSTV2_VSYNC hex Specify value of vSync video register -** SSTV2_NOREMAP 0 Don't try to remap single board sli. -** -** VOODOO2_FILE name Filename used in place of "voodoo2.ini" -** VOODOO2_PATH path Path used to locate "voodoo2.ini" file -** -*/ - -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#include -#define SST1INIT_ALLOCATE // Allocate variables in sst1init.h -#define FX_DLL_DEFINITION -#include -#if !macintosh && !__linux__ -#include -#endif -#include -#include -#include "rcver.h" - -#ifdef __WIN32__ -#include -#endif - -// Allow SourceSafe to track Revision -static char codeIdent[] = "@#%" VERSIONSTR ; - -/* -** sst1InitMapBoard(): -** Find and map SST-1 board into virtual memory -** -** Returns: -** FxU32 pointer to base of SST-1 board if successful mapping occurs -** FXFALSE if cannot map or find SST-1 board -** -*/ -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoard(FxU32 BoardNumber) -{ - return(sst1InitMapBoardDirect(BoardNumber, FXTRUE)); -} - -// Use this flag to force a info clear when doing a -// sst1InitMapBoard() for the first time. sst1InitShutdown() -// will also set this flag to TRUE to force a clear -// next time around. -static FxU32 clearBoardInfo = FXTRUE; - -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoardDirect(FxU32 BoardNumber, - FxBool resetSLI) -{ - static FxU32 firstTime = 1; - FxU32 vendorID = _3DFX_PCI_ID; // 3Dfx Vendor ID - FxU32 deviceID; // 0x0002 - Look for a Voodoo2 board (0xFFFF - Find any 3Dfx board) - FxU32 sizeOfCard = 0x1000000; // 16 MBytes of addr space for SST-1 - FxU32 *sstbase; - FxU32 n; - FxU32 j; - FxU32 sstv2_noremap = 0; - - if( GETENV( ("SSTV2_DEVICEID") ) ) - SSCANF(GETENV(("SSTV2_DEVICEID")), "%ld", &deviceID); - else - deviceID = 0x0002; - - // Open PCI library (necessary for multiple calls to init routines, after - // PCI library is closed by pciClose() call in sst1InitShutdown(). - // - // NB: It is safe to do this even if we never called pciClose. - pciOpen(); - - /* NB: firstTime does not get cleared until we actually find a - * board and get one mapped (A little weird to begin w/, but - * probably not worth changing at this late date). However, - * sst1InitMapBoard usually gets called up to MAX_PCI_DEVICES - * which means that we'll be re-counting and re-mapping boards - * over and over which is just whacked. Now, if we fail to find - * any suitable boards via sst1InitNumBoardsInSystem we clear the - * firstTime flag, and carry on checking for the non-existant - * board which will (of course) fail to map. - */ - if(firstTime) { - // Make Watcom happy - codeIdent[0] = '@'; - headersIdent[0] = '@'; - - // Find "voodoo2.ini" file if it exists... - sst1InitUseVoodooFile = sst1InitVoodooFile(); - - if( GETENV( ("SSTV2_NOREMAP") ) ) { - SSCANF(GETENV(("SSTV2_NOREMAP")), "%ld", &sstv2_noremap); - } else { - sstv2_noremap = 0; - } -#if !macintosh && !__linux__ - if (!sstv2_noremap) { - fxremap(); /* remap single board SLI */ - } -#endif - if(!(boardsInSystem = sst1InitNumBoardsInSystem())) { - firstTime = FXTRUE; - return(NULL); - } - } - - if( clearBoardInfo ) { - INIT_PRINTF(("sst1Init Routines")); -#ifdef FX_DLL_ENABLE - INIT_PRINTF(("(DLL)")); -#endif - INIT_PRINTF((": %s\n", VERSIONSTR)); - INIT_PRINTF(("sst1InitMapBoard(): BoardsInSystem = %d\n", - boardsInSystem)); - - // Clear board info structure - sst1InitClearBoardInfo(); - - clearBoardInfo = FXFALSE; - -#if !DIRECTX - /* dpc - 26 feb 1998 - * If glide is running on windows the a pciClose will close - * the vxd etc. This is not functionally longer fatal, but w/o - * it we will not be able to do things like set the caching on - * the board's memory etc. This is bad. - * - * The actual cost of doing the re-mapping again is pretty low - * because both the pci library and the init code are caching the - * addresses of the board. However, the call to the pciLibrary - * to map the board has the side affect of causing the vxd to be - * loaded. It is this that is responsible for setting up caching. - */ - firstTime = FXTRUE; -#endif /* !DIRECTX */ - } - - if(firstTime) { - int boardLoopStart = 0; - int boardLoopStop = SST1INIT_MAX_BOARDS; - int boardLoopInc = 1; - int index = 0; - - sst1InitClearBoardInfo(); - if(GETENV(("SSTV2_SWAPBOARDS"))) { - boardLoopStart = SST1INIT_MAX_BOARDS-1; - boardLoopStop = -1; - boardLoopInc = -1; - } - - for(j=0; j> 13) & 0x7); - { - FxU32 oldFbiRevision, newFbiRevision; - - PCICFG_RD(PCI_REVISION_ID, oldFbiRevision); - PCICFG_RD(SST1_PCI_INIT_ENABLE, newFbiRevision); - sst1BoardInfo[index].fbiFab = - (newFbiRevision & SST_CHUCK_MFTG_ID) >> - SST_CHUCK_MFTG_ID_SHIFT; - newFbiRevision = (newFbiRevision & SST_CHUCK_REVISION_ID) >> - SST_CHUCK_REVISION_ID_SHIFT; - if(oldFbiRevision != 0x2 && newFbiRevision < 4) - return(NULL); - sst1BoardInfo[index].fbiRevision = newFbiRevision; - } - PCICFG_RD(PCI_DEVICE_ID, sst1BoardInfo[index].deviceID); - PCICFG_RD(PCI_VENDOR_ID, sst1BoardInfo[index].vendorID); - - // Enable Memory accesses to SST-1 - // Must be set for PnP BIOS which do not enable memory mapped - // accesses (sst1InitSliDetect reads memory mapped regs) - PCICFG_WR(PCI_COMMAND, SST_PCIMEM_ACCESS_EN); - index++; - } else { - FxU32 code = pciGetErrorCode(); - if (code != PCI_ERR_NOERR) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); - INIT_PRINTF(("sst1InitMapBoard(): 0x%X\n", GetLastError())); -#endif // __WIN32__ - - - INIT_PRINTF(("pciError(): %s", pciGetErrorString())); - - exit(-1); - } - } - } - } - - if(resetSLI) { - // Search through all known boards for SLI enabled... - FxU32 k; - SstRegs *sst; - - for(k=0; kfbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - INIT_PRINTF(("sst1InitMapBoard(): Disabling Scanline Interleaving (board #%d)...\n", (k+1))); - // Disable SLI Snooping... - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & - ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV | - SST_SLI_SNOOP_EN | SST_SLI_SNOOP_MEMBASE)); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitReturnStatus(sstbase); - } - - // Tristate video output signals, so two boards connected as SLI - // do not have contention problems when SSTV2_SLIDETECT=0 - if(firstTime) - sst1InitVideoShutdown(sstbase, FXFALSE); - } - } - firstTime = 0; - - // Max number of supported boards in system - if(BoardNumber > SST1INIT_MAX_BOARDS) return(NULL); - - if(!(sstbase = (FxU32 *) sst1BoardInfo[BoardNumber].virtAddr[0])) - return (NULL); - - INIT_PRINTF(("sst1InitMapBoard(): vAddr:0x%x pAddr:0x%x Dev:0x%x Board:%d\n", - (FxU32) sst1BoardInfo[BoardNumber].virtAddr[0], - (FxU32) sst1BoardInfo[BoardNumber].physAddr[0], - (FxU32) sst1BoardInfo[BoardNumber].deviceNumber, BoardNumber)); - - // Default settings - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - sst1BoardInfo[BoardNumber].fbiVideo16BPP = 0; - - if(GETENV(("SSTV2_VGA_PASS"))) { - INIT_PRINTF(("sst1InitMapBoard(): Using SST_VGA_PASS=%d\n", - ATOI(GETENV(("SSTV2_VGA_PASS"))))); - if(ATOI(GETENV(("SSTV2_VGA_PASS")))) { - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - } - } - - return(sstbase); -} - -/* -** sst1InitRegisters(): -** Initialize registers and memory and return to power-on state -** -** Returns: -** FXTRUE if successfully initializes SST-1 -** FXFALSE if cannot initialize SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitRegisters(FxU32 *sstbase) -{ - FxU32 n, tf_fifo_thresh; - FxU32 ft_clkdel, tf0_clkdel, tf1_clkdel, tf2_clkdel; - sst1ClkTimingStruct sstGrxClk; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_REGISTERS"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitRegisters()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(GETENV(("SSTV2_TEXMAP_DISABLE"))) - INIT_PRINTF(("sst1InitRegisters() WARNING: Disabling texture mapping\n")); - // Open PCI library (necessary for multiple calls to init routines, after - // PCI library is closed by pciClose() call in sst1InitShutdown() - pciOpen(); - - // Enable writes to the FBIINIT registers - // Do not allow writes into the pci fifo until everything is reset - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN); - - // Reset Snoop registers to default values - PCICFG_WR(SST1_PCI_BUS_SNOOP0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP1, SST_PCI_BUS_SNOOP_DEFAULT); - sst1InitReturnStatus(sstbase); // Stall - can't call IdleFbi because - sst1InitReturnStatus(sstbase); // FBI could be hung at this stage - sst1InitReturnStatus(sstbase); - - // Adjust Trex-to-Fbi FIFO - if(GETENV(("SSTV2_TF_FIFO_THRESH"))) - SSCANF(GETENV(("SSTV2_TF_FIFO_THRESH")), "%ld", &tf_fifo_thresh); - else - tf_fifo_thresh = 0x8; - INIT_PRINTF(("sst1InitRegisters(): Setting TREX-to-FBI FIFO THRESHOLD to 0x%x...\n", - tf_fifo_thresh)); - - // Set ft_clkdel for 16 MHz bringup - ft_clkdel = 0x8; // Okay for 16 MHz startup... - if(GETENV(("SSTV2_PFT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_PFT_CLKDEL")), "%ld", &ft_clkdel); - INIT_PRINTF(("sst1InitRegisters(): Setting PRELIM FT-CLK delay to 0x%x...\n", ft_clkdel)); - - // SST_FBIINIT3_DEFAULT is set to disable texture mapping, so if - // TMUs are hung, it will not affect FBI - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - - // Wait for Fbi-to-Trex clock delay value to propogate - sst1InitReturnStatus(sstbase); // Stall - can't call IdleFbi because - sst1InitReturnStatus(sstbase); // FBI could be hung at this stage - sst1InitReturnStatus(sstbase); - - // Reset graphics and video units - // Must reset video unit before graphics unit, otherwise video unit could - // potentially hang waiting for the graphics unit to respond - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - // Don't wait for idle because graphics could be hung... - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, - IGET(sst->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - - sst1InitIdleFBINoNOP(sstbase); - - // Unreset PCI FIFO... - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - // Unreset graphics subsystem - // THIS MUST BE PRESENT OTHERWISE THE PCI FIFO WILL NEVER DRAIN! - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - // Reset all FBI and TREX Init registers - ISET(sst->fbiInit0, SST_FBIINIT0_DEFAULT); - ISET(sst->fbiInit1, SST_FBIINIT1_DEFAULT); - ISET(sst->fbiInit2, SST_FBIINIT2_DEFAULT); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - ISET(sst->fbiInit4, SST_FBIINIT4_DEFAULT); - ISET(sst->fbiInit5, SST_FBIINIT5_DEFAULT); - ISET(sst->fbiInit6, SST_FBIINIT6_DEFAULT); - sst1CurrentBoard->fbiInit6 = SST_FBIINIT6_DEFAULT; - ISET(sst->fbiInit7, SST_FBIINIT7_DEFAULT); - sst1InitIdleFBINoNOP(sstbase); // Wait until init regs are reset - - // Enable writes to the FBIINIT registers and allow pushes onto PCI FIFO - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - // Determine DAC Type - if(sst1InitDacDetect(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): Could not detect DAC...\n")); - return(FXFALSE); - } - - // set TREX0 init values - if(GETENV(("SSTV2_TREX0INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX0INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[0]); - } else - sst1CurrentBoard->tmuInit0[0] = SST_TREX0INIT0_DEFAULT; - - INIT_PRINTF(("sst1InitRegisters(): Storing TREX0INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[0])); - if(GETENV(("SSTV2_TREX0INIT1"))) { - - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX0INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[0]); - } else - sst1CurrentBoard->tmuInit1[0] = SST_TREX0INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF0_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF0_CLKDEL")), "%ld", &tf0_clkdel); - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf0_clkdel<tmuInit1[0])); - - // set TREX1 init values - if(GETENV(("SSTV2_TREX1INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX1INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[1]); - } else - sst1CurrentBoard->tmuInit0[1] = SST_TREX1INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX1INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[1])); - if(GETENV(("SSTV2_TREX1INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX1INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[1]); - } else - sst1CurrentBoard->tmuInit1[1] = SST_TREX1INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF1_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF1_CLKDEL")), "%ld", &tf1_clkdel); - sst1CurrentBoard->tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf1_clkdel<tmuInit1[1])); - - - // set TREX2 init values - if(GETENV(("SSTV2_TREX2INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT0 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX2INIT0")), "%ld", - &sst1CurrentBoard->tmuInit0[2]); - } else - sst1CurrentBoard->tmuInit0[2] = SST_TREX2INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX2INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[2])); - if(GETENV(("SSTV2_TREX2INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT1 environment variable\n")); - SSCANF(GETENV(("SSTV2_TREX2INIT1")), "%ld", - &sst1CurrentBoard->tmuInit1[2]); - } else - sst1CurrentBoard->tmuInit1[2] = SST_TREX2INIT1_DEFAULT; - if(GETENV(("SSTV2_PTF2_CLKDEL"))) { - SSCANF(GETENV(("SSTV2_PTF2_CLKDEL")), "%ld", &tf2_clkdel); - sst1CurrentBoard->tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf2_clkdel<tmuInit1[2])); - - // Set clock at 16 MHz to properly transmit TREX configuration registers - // Note that setting the clock will automatically reset the TMUs... - // sst1InitResetTmus() also will de-assert TEXMAP_DISABLE in fbiInit3 - // unless SSTV2_TEXMAP_DISABLE is set - if(!sst1InitComputeClkParams(16.0f, &sstGrxClk)) - return(FXFALSE); - if(!sst1InitSetGrxClk(sstbase, &sstGrxClk)) - return(FXFALSE); - sst1CurrentBoard->initGrxClkDone = 0; - - // Set PCI wait-states - if(GETENV(("SSTV2_SLOWPCIWR"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up SLOW PCI Writes...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_PCI_WRWS_1); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_PCI_WRWS_1); - - if(GETENV(("SSTV2_FASTPCIRD"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST PCI Reads...\n")); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & ~SST_PCI_RDWS_2); - } - sst1InitIdleFBINoNOP(sstbase); - - // Enable Linear frame buffer reads - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_LFB_READ_EN); - - // Swapbuffer algorithm is based on VSync initially - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_SWAP_ALGORITHM) | - SST_SWAP_VSYNC); - - // Enable LFB read-aheads - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | SST_EN_LFB_RDAHEAD); - - // Enable triangle alternate register mapping - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_ALT_REGMAPPING); - - // Enable Endian Byte Swapping - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_ENDIAN_SWAPPING); - - // Setup DRAM Refresh - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_DRAM_REFRESH_CNTR) | - SST_DRAM_REFRESH_16MS); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - { - // Setup memory timings... - FxU32 fbiInit1 = IGET(sst->fbiInit1); - FxU32 fbiInit2 = IGET(sst->fbiInit2) | - SST_EN_DRAM_RD_AHEAD_FIFO | SST_EN_FAST_RD_AHEAD_WR; - - if(GETENV(("SSTV2_SLOWMEM_WTR"))) { - INIT_PRINTF(("sst1InitRegisters(): Running slow write-to-read memory timing...\n")); - fbiInit1 |= SST_DISEN_RD_AHEAD_WR_RD; - } - if(GETENV(("SSTV2_SLOWMEM_RTW"))) { - INIT_PRINTF(("sst1InitRegisters(): Running slow read-to-write memory timing...\n")); - fbiInit2 &= ~SST_EN_FAST_RD_AHEAD_WR; - } - if(GETENV(("SSTV2_FASTMEM_RAS_READS"))) { - INIT_PRINTF(("sst1InitRegisters(): Enabling fast RAS read memory timing...\n")); - fbiInit2 |= SST_EN_FAST_RAS_READ; - } - ISET(sst->fbiInit1, fbiInit1); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit2, fbiInit2); - sst1InitReturnStatus(sstbase); - } - - // Return all other registers to their power-on state - sst1InitIdleFBINoNOP(sstbase); - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - sst1InitIdleFBINoNOP(sstbase); - - // Get DRAMs up and running (refresh is already enabled)... - ISET(sst->c1, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, 100); // draw into 50x50 area - ISET(sst->clipBottomTop, 100); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); // Frontbuffer & Z/A - ISET(sst->nopCMD, 0x1); // Clear fbistat registers after clearing screen - sst1InitIdleFBINoNOP(sstbase); - - sst1InitRenderingRegisters(sstbase); - sst1CurrentBoard->tmuRevision = 0xdead; // Force sst1InitFillDeviceInfo() - if(sst1InitFillDeviceInfo(sstbase, sst1CurrentBoard) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): ERROR filling DeviceInfo...\n")); - - return(FXFALSE); - } - - sst1InitIdleFBINoNOP(sstbase); - sst1InitRenderingRegisters(sstbase); - sst1InitIdleFBINoNOP(sstbase); - - // LFB writes stored in memory FIFO? - if(GETENV(("SSTV2_MEMFIFO_LFB"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO_LFB"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): LFB Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_LFB_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - // Texture memory writes stored in memory FIFO? - if(GETENV(("SSTV2_MEMFIFO_TEX"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO_TEX"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): TEXTURE Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_TEX_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - ISET(sst->vRetrace, 0x0); - ISET(sst->backPorch, 0x0); - ISET(sst->videoDimensions, 0x0); - ISET(sst->hSync, 0x0); - ISET(sst->vSync, 0x0); - ISET(sst->videoFilterRgbThreshold, 0x0); - - sst1InitIdleFBINoNOP(sstbase); // Wait until init regs are reset - - // Update info structure for initEnable - PCICFG_RD(SST1_PCI_INIT_ENABLE, sst1CurrentBoard->fbiInitEnable); - - INIT_PRINTF(("sst1InitRegisters(): exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -FX_EXPORT void FX_CSTYLE sst1InitRenderingRegisters(FxU32 *sstbase) -{ - FxU32 i; - SstRegs *sst = (SstRegs *) sstbase; - - ISET(sst->vA.x, 0x0); ISET(sst->vA.y, 0x0); - ISET(sst->vB.x, 0x0); ISET(sst->vB.y, 0x0); - ISET(sst->vC.x, 0x0); ISET(sst->vC.y, 0x0); - - ISET(sst->r, 0x0); ISET(sst->g, 0x0); - ISET(sst->b, 0x0); ISET(sst->z, 0x0); - ISET(sst->a, 0x0); ISET(sst->s, 0x0); - ISET(sst->t, 0x0); ISET(sst->w, 0x0); - - ISET(sst->drdx, 0x0); ISET(sst->dgdx, 0x0); - ISET(sst->dbdx, 0x0); ISET(sst->dzdx, 0x0); - ISET(sst->dadx, 0x0); ISET(sst->dsdx, 0x0); - ISET(sst->dtdx, 0x0); ISET(sst->dwdx, 0x0); - - ISET(sst->drdy, 0x0); ISET(sst->dgdy, 0x0); - ISET(sst->dbdy, 0x0); ISET(sst->dzdy, 0x0); - ISET(sst->dady, 0x0); ISET(sst->dsdy, 0x0); - ISET(sst->dtdy, 0x0); ISET(sst->dwdy, 0x0); - - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->clipLeftRight, 0x0); - ISET(sst->clipBottomTop, 0x0); - - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->chromaRange, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - ISET(sst->sSetupMode, 0x0); - ISET(sst->sVx, 0x0); - ISET(sst->sVy, 0x0); - ISET(sst->sARGB, 0x0); - ISET(sst->sRed, 0x0); - ISET(sst->sGreen, 0x0); - ISET(sst->sBlue, 0x0); - ISET(sst->sAlpha, 0x0); - ISET(sst->sVz, 0x0); - ISET(sst->sOowfbi, 0x0); - ISET(sst->sOow0, 0x0); - ISET(sst->sSow0, 0x0); - ISET(sst->sTow0, 0x0); - ISET(sst->sOow1, 0x0); - ISET(sst->sSow1, 0x0); - ISET(sst->sTow1, 0x0); - - ISET(sst->nopCMD, 0x3); // Clear fbistat and trianglesOut registers - - for(i=0; i<32; i++) - ISET(sst->fogTable[i], 0x0); - - ISET(sst->bltSrcBaseAddr, 0x0); - ISET(sst->bltDstBaseAddr, 0x0); - ISET(sst->bltXYstrides, 0x0); - ISET(sst->bltSrcChromaRange, 0x0); - ISET(sst->bltDstChromaRange, 0x0); - ISET(sst->bltClipX, 0x0); - ISET(sst->bltClipY, 0x0); - ISET(sst->bltSrcXY, 0x0); - ISET(sst->bltDstXY, 0x0); - ISET(sst->bltSize, 0x0); - ISET(sst->bltRop, 0x0); - ISET(sst->bltColor, 0x0); - ISET(sst->bltCommand, 0x0); - - // clear TMU registers - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - for(i=0; i<12; i++) - ISET(sst->nccTable0[i], 0x0); - for(i=0; i<12; i++) - ISET(sst->nccTable1[i], 0x0); - sst1InitIdle(sstbase); - - ISET(sst->tchromaKey, 0x0); - ISET(sst->tchromaRange, 0x0); - -} - -/* -** sst1InitShutdown(): -** Shutdown SST-1 -** Resets state of VGA_PASS to return monitor control back to the VGA -** Powers-down the DAC -** Resets the graphics clock in FBI to conserve power -** -** Returns: -** FXTRUE if successfully shuts down SST-1 -** FXFALSE if cannot shut down the SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdown(FxU32 *sstbase) -{ - SstRegs *sstMaster = (SstRegs *) sstbase; - SstRegs *sstSlave; - SstRegs *sstPtr; - FxU32 n; - FxU32 sliEnabled; - sst1ClkTimingStruct sstGrxClk; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard((FxU32 *) sstbase) == FXFALSE) - return(FXFALSE); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - sliEnabled = (sst1CurrentBoard->sliSlaveVirtAddr != (FxU32 *) NULL) ? 1 : 0; - sstSlave = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - -#if 0 - // If the command fifo is enabled, we can't issue a NOP first, so wait - // until the PCI fifo is empty... - sst1InitPciFifoIdleLoop(sstbase); - if(sst1CurrentBoard->sliSlaveVirtAddr) - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); -#else - sst1InitIdle(sstbase); -#endif - - // Disable the command fifo if enabled... - if(sst1CurrentBoard->fbiCmdFifoEn || - (IGET(sstMaster->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitCmdFifo(sstbase, FXFALSE, (void *) NULL, (void *) NULL, - (void *) NULL, NULL); - - sst1InitIdle(sstbase); - - if(sliEnabled && !GETENV(("SSTV2_NOSHUTDOWN"))) { - if(sst1InitShutdownSli(sstbase) == FXFALSE) - return(FXFALSE); - } - - if(GETENV(("SSTV2_NOSHUTDOWN"))) - INIT_PRINTF(("sst1InitShutdown(): Bypassing shutdown with SSTV2_NOSHUTDOWN\n")); - - n = 0; - while(!GETENV(("SSTV2_NOSHUTDOWN"))) { - if(!n) - sstPtr = sstMaster; - else - sstPtr = sstSlave; - - if(sst1InitCheckBoard((FxU32 *) sstPtr) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitShutdown(): Shutting down SST-1 #%d...\n", n)); - - // Reset video unit to guarantee no contentions on the memory bus - // Blank DAC so VGA Passthru works properly - ISET(sstPtr->fbiInit1, - IGET(sstPtr->fbiInit1) | (SST_VIDEO_RESET | SST_VIDEO_BLANK_EN)); - // Turn off dram refresh to guarantee no contentions on the - // memory bus - ISET(sstPtr->fbiInit2, IGET(sstPtr->fbiInit2) & ~SST_EN_DRAM_REFRESH); - - // Reset graphics subsystem - ISET(sstPtr->fbiInit0, - IGET(sstPtr->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_PCI_FIFO_RESET); - - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - // Turnaround VGA_PASS to allow VGA monitor - sst1InitVgaPassCtrl((FxU32 *) sstPtr, 1); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - // Set clock at 30 MHz to reduce power consumption... - sst1InitComputeClkParams((float) 30.0, &sstGrxClk); - if(sst1InitSetGrxClk((FxU32 *) sstPtr, &sstGrxClk) == FXFALSE) - INIT_PRINTF(("sst1InitShutdown() WARNING: sst1InitSetGrxClk failed...Continuing...\n")); - sst1CurrentBoard->initGrxClkDone = 0; - -#ifndef __linux__ - pciUnmapPhysical((FxU32)sst1CurrentBoard->virtAddr[0], 0x1000000UL); -#endif - if((++n > 1) || !sliEnabled) - break; - } - - /* sst1InitIdle(sstbase); */ - -#if !DIRECTX - // - // HACK alert. - // - // There's a pciClose(), but nobody calls it. This is needed by the - // DOS DPMI services to close fxmemmap.vxd. - // - // Note that the call to pciClose must be after the shutdown sequence, - // as the shutdown sequence uses PCI configuration reads/writes... - // - pciClose(); -#endif /* !DIRECTX */ - - INIT_PRINTF(("sst1InitShutdown(): Returning with status %d...\n", FXTRUE)); -#ifdef INIT_OUTPUT - if ( sst1InitMsgFile != stdout ) - fclose(sst1InitMsgFile); -#endif - - // Make sure that the board info structures are - // cleared next time sst1InitMapBoard() is called. - clearBoardInfo = FXTRUE; - - return(FXTRUE); -} - -/* -** sst1InitCheckBoard(): -** Set internal global variables for multiple SST-1 support -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCheckBoard(FxU32 *sstbase) -{ - FxU32 n; - FxBool returnVal = FXFALSE; - - for(n=0; n 0) { - if (sst1BoardInfo[boardNum - 1].sliSlaveVirtAddr == (FxU32*)sstBaseAddr) { - tempAddr = sst1BoardInfo[boardNum - 1].virtAddr[0]; - } - } - - if ((tempAddr == NULL) && (boardNum < boardsInSystem)) { - if (sst1BoardInfo[boardNum + 1].sliSlaveVirtAddr == (FxU32*)sstBaseAddr) { - tempAddr = sst1BoardInfo[boardNum + 1].virtAddr[0]; - } - } - - if (tempAddr != NULL) sstBaseAddr = tempAddr; - } - - return (FxU32*)sstBaseAddr; -} - -/* -** sst1InitClearBoardInfo(): -** Clear board configuration information -** -*/ -void sst1InitClearBoardInfo(void) -{ - FxU32 n, j; - - for(n=0; nphysAddr[0]? - */ - pciGetConfigData(PCI_BASE_ADDRESS_0, sst1CurrentBoard->deviceNumber, &physAddr); - - // For some reason, there sometimes is a 008 at the end of the - // physical address, so mask that puppy RTF out - physAddr &= 0xfffff000; - - /* dpc - 23 jan 1998 - Warning!!!!! - * We are no longer mapping the entire board range as uswc because - * this causes weird problems on some systems. We are now mapping - * the 3d register area as uncacheable (since no one should be - * writing here anyway, except to bump the swapbufferCMD register) - * and the command fifo range and lfb range as uswc. - * - * NB: It is still unclear why this is happening because the - * memory page containing the registers is never really explicitly - * written to until we are shutting down so changing its caching - * characteristics should have no bearing on anything. */ - { -#define kCacheSizeWriteCombine (0x08UL << 20UL) -#define kCacheSizeUncacheable (0x1000UL) - FxBool hasWC = pciFindMTRRMatch(physAddr, kCacheSizeWriteCombine, - PciMemTypeWriteCombining, - &sst1CurrentBoard->mtrrWriteCombine); - FxBool hasUC = pciFindMTRRMatch(physAddr, kCacheSizeUncacheable, - PciMemTypeUncacheable, - &sst1CurrentBoard->mtrrUncacheable); - - if (!hasWC) { - if (pciFindFreeMTRR(&sst1CurrentBoard->mtrrWriteCombine)) { - hasWC = pciSetMTRR(sst1CurrentBoard->mtrrWriteCombine, - physAddr, kCacheSizeWriteCombine, - PciMemTypeWriteCombining); - if (!hasWC) INIT_PRINTF(("sst1InitCaching(): Could not set wc mtrr\n")); - } else { - INIT_PRINTF(("sst1InitCaching(): Could not find wc mtrr\n")); - } - } else { - INIT_PRINTF(("sst1InitCaching(): Already have wc\n")); - } - - if (!hasUC) { - if (pciFindFreeMTRR(&sst1CurrentBoard->mtrrUncacheable)) { - hasUC = pciSetMTRR(sst1CurrentBoard->mtrrUncacheable, - physAddr, kCacheSizeUncacheable, - PciMemTypeUncacheable); - if (!hasUC) INIT_PRINTF(("sst1InitCaching(): Could not set uc mtrr\n")); - } else { - INIT_PRINTF(("sst1InitCaching(): Could not find uc mtrr\n")); - } - } else { - INIT_PRINTF(("sst1InitCaching(): Already have uc\n")); - } - - /* We only succeed if we have them both since having only uswc - * seems to cause problems. - */ - retVal = (hasWC && hasUC); - if (!retVal) goto __errExit; - - INIT_PRINTF(("sst1InitCaching(): wc(0x%X) : uc(0x%X)\n", - sst1CurrentBoard->mtrrWriteCombine, - sst1CurrentBoard->mtrrUncacheable)); - } - } else { - /* This always succeeds */ - retVal = FXTRUE; - -__errExit: - if (sst1CurrentBoard->mtrrUncacheable != 0) { - pciSetMTRR(sst1CurrentBoard->mtrrUncacheable, 0, 0, 0); - sst1CurrentBoard->mtrrUncacheable = 0; - } - - if (sst1CurrentBoard->mtrrWriteCombine != 0) { - pciSetMTRR(sst1CurrentBoard->mtrrWriteCombine, 0, 0, 0); - sst1CurrentBoard->mtrrWriteCombine = 0; - } - } - - return retVal; -} // sst1InitSetCaching - - - -/* -** sst1InitCachingAMD -** -** Sets up memory caching for AMD K6 and AMD K7 systems for the entire -** 16mb virtual address space of the card. For K7, goes through -** sst1InitCaching -** -*/ - -#define kCacheSizeWriteCombineAMD (0x08UL << 20UL) /* 8 MB */ -#define kCacheSizeUncacheableAMD (0x20000UL) /* 128 KB */ - -FX_ENTRY FxBool FX_CSTYLE -sst1InitCachingAMD(FxU32* sstBase, FxBool enableP, FxBool hasP2MTRR) -{ - FxBool retVal = sst1InitCheckBoard(sstBase); - - if (!retVal) return FXFALSE; - - /* The K7 has MTRRs that are exactly compatible to the P6/PII, so - we just do the work through the existing sst1InitCaching function - */ - - if (hasP2MTRR) { - return sst1InitCaching(sstBase, enableP); - } - - /* If it's not a K7, we must have a K6 with WC support, i.e. a K6-2 with - CXT core or a Sharptooth, otherwise we wouldn't have gotten here. - */ - - if (enableP && (GETENV("SSTV2_IGNORE_CACHING") == NULL)) { - FxU32 physAddr; - - /* Get the board's base. Isn't this the same as what we - * carry around in sst1CurrentBoard->physAddr[0]? - */ - - pciGetConfigData(PCI_BASE_ADDRESS_0, sst1CurrentBoard->deviceNumber, &physAddr); - - /* For some reason, there sometimes is a 008 at the end of the - * physical address, so mask that puppy RTF out - */ - - physAddr &= 0xfffff000; - - /* dpc - 23 jan 1998 - Warning!!!!! - * We are no longer mapping the entire board range as uswc because - * this causes weird problems on some systems. We are now mapping - * the 3d register area as uncacheable (since no one should be - * writing here anyway, except to bump the swapbufferCMD register) - * and the command fifo range and lfb range as uswc. - * - * NB: It is still unclear why this is happening because the - * memory page containing the registers is never really explicitly - * written to until we are shutting down so changing its caching - * characteristics should have no bearing on anything. - * - * This might no be necessary for K6, as K6 maintains strong write - * ordering in WC regions. We do this here compatible to PII just in - * case. Note: Overlapping WC and UC regions results in UC type on K6, - * just like on PII. Note: the smallest MTRR region size on K6 is 128 KB, - * while on PII it is 4 KB. We make the UC region as small as we can. - */ - - /* For K6, we don't do any elaborate allocation, as it only has two - * variable size memory regions, and we need both for Voodoo2. So, we - * just jam the data into the two available MTRRs. - */ - - pciSetMTRRAmdK6 (0, physAddr, kCacheSizeWriteCombineAMD, PciMemTypeWriteCombining); - pciSetMTRRAmdK6 (1, physAddr, kCacheSizeUncacheableAMD, PciMemTypeUncacheable); - - } else { /* disable MTRRs */ - - /* This always succeeds */ - - retVal = FXTRUE; - - /* Since AMD recommends a "free for all" policy for allocating MTRRs - on K6, we do nothing for "disable". Any software that wants to grab - the MTRRs can just do so. Leaving the MTRR enabled might actually - beneficial in a situation like the following: We run a D3D app, then - a Glide app, then a D3D app, but the second time around D3D doesn't - re-initialize, since it's still active, so it doesn't reprogram the - MTRRs. - */ - - // pciSetMTRRAmdK6 (0, 0, 0, 0); /* size == 0 implies disable */ - // pciSetMTRRAmdK6 (1, 0, 0, 0); /* size == 0 implies disable */ - - } - - return retVal; -} // sst1InitSetCachingAMD - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/sst1init.h b/glide2x/cvg/init/sst1init.h deleted file mode 100644 index 3356272..0000000 --- a/glide2x/cvg/init/sst1init.h +++ /dev/null @@ -1,1839 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#ifndef __SST1INIT_H__ -#define __SST1INIT_H__ - -/* -** -** $Revision$ -** $Date$ -** -** SST-1 Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 1. sst1InitMapBoard(); -** 2. sst1InitRegisters(); -** 3. sst1InitGamma(); -** 4. sst1InitVideoBuffers(); -** 5. sst1InitSli(); [Optional] -** 6. sst1InitCmdFifo(); -** -** sst1InitShutdown() is called at the end of an application to turn off -** the SST-1 graphics subsystem -** -*/ - -/* sst1init.h assumes "glide.h" and "sst.h" are already included */ - -/* Init code debug print routine */ -#ifdef INIT_DOS /* Glide version... */ -#define INIT_OUTPUT -#define INIT_PRINTF(a) sst1InitPrintf a -#define INIT_INFO(A) -#endif -#ifdef INIT_LINUX -#define INIT_OUTPUT -#define INIT_PRINTF(a) sst1InitPrintf a -#define INIT_INFO(A) -#endif - -#ifndef DIRECTX -#undef GETENV -#undef ATOI -#undef ATOF -#undef SSCANF -#undef POW -#define GETENV(A) sst1InitGetenv(A) -#define ATOI(A) atoi(A) -#define ATOF(A) atof(A) -#define SSCANF( A, B, C ) sscanf( A, B, C ) -#define POW( A, B ) pow( A, B ) -#define FTOL( X ) ((FxU32)(X)) - -// Video resolution declarations -#include "sst1vid.h" - -// Info Structure declaration -#include "cvginfo.h" - -#else /* DIRECTX */ -#include "ddglobal.h" -#ifdef _WIN32 -#pragma optimize ("",off) /* ddglobal.h tuns this on for retail builds */ -#endif -#undef INIT_PRINTF -#undef INIT_INFO -#undef GETENV -#undef ATOI -#undef ATOF -#undef FTOL -#undef ITOF_INV -#undef SSCANF -#undef POW -/* #define INIT_PRINTF(a) */ -#ifdef FXTRACE - #define INIT_PRINTF DDPRINTF -#else - #define INIT_PRINTF 1 ? (void) 0 : (void) -#endif -#define INIT_INFO(A) -#define GETENV(A) ddgetenv(A) -#define ATOI(A) ddatoi(A) -#define ATOF(A) ddatof(A) -#define FTOL(A) ddftol(A) -#define ITOF_INV(A) dd_itof_inv(A) -#define SSCANF( A, B, C ) ddsscanf( A, B, C ) -#define POW( A, B ) ddpow( A, B ) - -#endif /* DIRECTX */ - -/* Defines to writing to/reading from SST-1 */ -#if 0 -#define IGET(A) A -#define ISET(A,D) A = (D) -#else -#define IGET(A) sst1InitRead32((FxU32 *) &(A)) -#define ISET(A,D) sst1InitWrite32((FxU32 *) &(A), D) -#endif - -/* -** P6 Fence -** -** Here's the stuff to do P6 Fencing. This is required for the -** certain things on the P6 -*/ -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - FxU32 p6FenceVar; -#else - extern FxU32 p6FenceVar; -#endif - -#if defined(__WATCOMC__) -void -p6Fence(void); -# pragma aux p6Fence = \ - "xchg eax, p6FenceVar" \ - modify [eax]; -# define P6FENCE p6Fence() -#elif defined(__MSC__) -# define P6FENCE {_asm xchg eax, p6FenceVar} -#elif defined(macintosh) && __POWERPC__ && defined(__MWERKS__) -# define P6FENCE __eieio() -#elif defined (__GNUC__) && defined(__i386__) -# define P6FENCE asm("xchg %%eax,%0" : /*outputs*/ : "m" (p6FenceVar) : \ - "eax"); -#else -# error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif - -#ifdef __cplusplus -} -#endif - -#ifndef _FXPCI_H_ -#include -#endif -#include - -/*--------------------------------------------------------*/ -/* Following defines need to go in "cvgdefs.h" eventually */ -#define SST_CMDFIFO_ADDR BIT(21) - -/*--------- SST PCI Configuration Command bits --------------*/ -#define SST_PCIMEM_ACCESS_EN BIT(1) - -/*------- SST PCI Configuration Register defaults -----------*/ -#define SST_PCI_INIT_ENABLE_DEFAULT 0x0 -#define SST_PCI_BUS_SNOOP_DEFAULT 0x0 - -/*--- SST PCI Init Enable Configuration Register defaults ---*/ -#define SST_SLI_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_SLI_MASTER_OWNPCI 0x0 -#define SST_SLI_SLAVE_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_CHUCK_REVISION_ID_SHIFT 12 -#define SST_CHUCK_REVISION_ID (0xF< -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - FILE *sst1InitMsgFile = NULL; /*stdout;*/ -#else -extern FILE *sst1InitMsgFile; -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/* Maximum number of SST-1 boards supported in system */ -#define SST1INIT_MAX_BOARDS 16 - -/* Maximum number of read pushes in "voodoo.ini" file */ -#define DACRDWR_MAX_PUSH 16 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - static char headersIdent[] = "@#%Voodoo2 InitHeaders $Revision$"; - FxBool sst1InitUseVoodooFile = FXFALSE; - sst1InitEnvVarStruct *envVarsBase = (sst1InitEnvVarStruct *) NULL; - sst1InitDacStruct *dacStructBase = (sst1InitDacStruct *) NULL; - sst1InitDacStruct *iniDac = (sst1InitDacStruct *) NULL; - sst1InitDacSetVideoStruct *iniVideo = (sst1InitDacSetVideoStruct *) NULL; - sst1InitDacSetMemClkStruct *iniMemClk = (sst1InitDacSetMemClkStruct *) NULL; - FxU32 iniStack[DACRDWR_MAX_PUSH]; - int iniStackPtr = 0; - sst1DeviceInfoStruct *sst1CurrentBoard; - FxU32 sst1InitDeviceNumber; - sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - FxU32 boardsInSystem; - FxU32 boardsInSystemReally; - FxU32 initIdleEnabled = 1; - - - const PciRegister SST1_PCI_CFG_SCRATCH = { 0x50, 4, READ_WRITE }; - const PciRegister SST1_PCI_SIPROCESS = { 0x54, 4, READ_WRITE }; -#else - extern FxBool sst1InitUseVoodooFile; - extern sst1InitEnvVarStruct *envVarsBase; - extern sst1InitDacStruct *dacStructBase; - extern sst1InitDacStruct *iniDac; - extern sst1InitDacSetVideoStruct *iniVideo; - extern sst1InitDacSetMemClkStruct *iniMemClk; - extern FxU32 iniStack[]; - extern int iniStackPtr; - extern sst1DeviceInfoStruct *sst1CurrentBoard; - extern FxU32 sst1InitDeviceNumber; - extern sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - extern FxU32 boardsInSystem; - extern FxU32 boardsInSystemReally; - extern FxU32 initIdleEnabled; - - extern PciRegister SST1_PCI_CFG_SCRATCH; - extern PciRegister SST1_PCI_SIPROCESS; -#endif /* SST1INIT_ALLOCATE */ - -#ifdef __3Dfx_PCI_CFG__ -/* This is really ugly, but it makes us happy w/ the top of the tree - * pci library which is happier than Gary's library. - */ -#define SST1_PCI_INIT_ENABLE PCI_SST1_INIT_ENABLE -#define SST1_PCI_BUS_SNOOP0 PCI_SST1_BUS_SNOOP_0 -#define SST1_PCI_BUS_SNOOP1 PCI_SST1_BUS_SNOOP_1 -#define SST1_PCI_CFG_STATUS PCI_SST1_CFG_STATUS -#else /* !__3Dfx_PCI_CFG__ */ -#define SST1_PCI_BUS_SNOOP0 SST1_PCI_BUS_SNOOP_0 -#define SST1_PCI_BUS_SNOOP1 SST1_PCI_BUS_SNOOP_1 -#endif /* !__3Dfx_PCI_CFG__ */ - -#ifdef __cplusplus -} -#endif - -#ifdef SST1INIT_VIDEO_ALLOCATE -/* SST1INIT_VIDEO_ALLOCATE is only #defined in video.c - - Define useful clock and video timings - Clocks generated are follows: - Clock Freq. (MHz) = - [14.318 * (clkTiming_M+2)] / [(clkTiming_N+2) * (2^clkTiming_P)] - - Solving for clkTiming_M yields: - clkTiming_M = - [ [(Clock Freq (Mhz)) * (clkTiming_N+2) * (2^clkTiming_P)] / 14.318 ] - 2 - - NOTE: [14.318 * (clkTiming_M+2)] / (clkTiming_N+2) should be between - 120 and 240 - NOTE: Max. M is 127 - NOTE: Max. N is 31 - NOTE: Max. P is 3 - NOTE: Max. L is 15 - NOTE: Max. IB is 15 -*/ - - -/* H3D video timing structures */ -#ifdef H3D -/* This guy's not used anywhere */ -sst1VideoTimingStruct SST_VREZ_640X502_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 15, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 160, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - - -/* Line doubled 640x480...line doubling done externally */ -sst1VideoTimingStruct SST_VREZ_640X960LD_60 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 1044, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 160, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - - -/* Full resolution 640x480... */ -sst1VideoTimingStruct SST_VREZ_640X960_60 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 1044, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 1004, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 320, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - - -/* Line doubled 800x600...line doubling done externally */ -sst1VideoTimingStruct SST_VREZ_800X1200LD_45 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 1242, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 608, /* yDimension */ - 42, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X630_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 656, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 630, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 260, /* memOffset */ - 26, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - - -/* Full res 800x600...so far, ain't nobody got enough memory */ -sst1VideoTimingStruct SST_VREZ_800X1200_45 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 1244, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 1216, /* yDimension */ - 42, /* refreshRate */ - 0, /* miscCtrl */ - 494, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X742_60 = { - 103, /* hSyncOn */ - 1151, /* hSyncOff */ - 3, /* vSyncOn */ - 765, /* vSyncOff */ - 142, /* hBackPorch */ - 22, /* vBackPorch */ - 960, /* xDimension */ - 742, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 360, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.219F, /* clkFreq16bpp */ - 112.437F /* clkFreq24bpp */ -}; - -#endif - - -sst1VideoTimingStruct SST_VREZ_320X200_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 70, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 75, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 85, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X200_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 320, /* xDimension */ - 200, /* yDimension */ - 120, /* refreshRate */ - 0x3, /* miscCtrl */ - 35, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 60, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 75, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 85, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_320X240_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 320, /* xDimension */ - 240, /* yDimension */ - 120, /* refreshRate */ - 0x3, /* miscCtrl */ - 40, /* memOffset */ - 10, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_60 = { - 39, /* hSyncOn */ - 471, /* hSyncOff */ - 3, /* vSyncOn */ - 619, /* vSyncOff */ - 54, /* hBackPorch */ - 18, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 60, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 19.108F, /* clkFreq16bpp */ - 38.216F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_75 = { - 39, /* hSyncOn */ - 487, /* hSyncOff */ - 3, /* vSyncOn */ - 624, /* vSyncOff */ - 62, /* hBackPorch */ - 23, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 75, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 24.829F, /* clkFreq16bpp */ - 49.658F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_85 = { - 39, /* hSyncOn */ - 487, /* hSyncOff */ - 3, /* vSyncOn */ - 627, /* vSyncOff */ - 62, /* hBackPorch */ - 26, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 85, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 28.274F, /* clkFreq16bpp */ - 56.548F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_400X300_120 = { - 39, /* hSyncOn */ - 503, /* hSyncOff */ - 3, /* vSyncOn */ - 640, /* vSyncOff */ - 70, /* hBackPorch */ - 39, /* vBackPorch */ - 400, /* xDimension */ - 300, /* yDimension */ - 120, /* refreshRate */ - 0x2, /* miscCtrl */ - 70, /* memOffset */ - 14, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 41.975F, /* clkFreq16bpp */ - 83.950F /* clkFreq24bpp */ -}; - -/* 512x256@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X256_60 = { - 41, /* hSyncOn */ - 626, /* hSyncOff */ - 4, /* vSyncOn */ - 286, /* vSyncOff */ - 65, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 256, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 64, /* memOffset */ - 16, /* tilesInX */ - 25, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 23.334F, /* clkFreq16bpp */ - 23.334F /* clkFreq24bpp */ -}; - -#if 0 -// For Arcade monitors... -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 23, /* hSyncOn */ - 640, /* hSyncOff */ - 3, /* vSyncOn */ - 411, /* vSyncOff */ - 90, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.0F, /* clkFreq16bpp */ - 33.0F /* clkFreq24bpp */ -}; -#else -// For PC monitors... -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 55, /* hSyncOn */ - 615, /* hSyncOff */ - 3, /* vSyncOn */ - 792, /* vSyncOff */ - 78, /* hBackPorch */ - 23, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 60, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 32.054F, /* clkFreq16bpp */ - 64.108F /* clkFreq24bpp */ -}; -#endif - -sst1VideoTimingStruct SST_VREZ_512X384_72 = { - 51, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 430, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 72, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.093F, /* clkFreq16bpp */ - 40.186F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_75 = { - 55, /* hSyncOn */ - 631, /* hSyncOff */ - 3, /* vSyncOn */ - 799, /* vSyncOff */ - 86, /* hBackPorch */ - 30, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 75, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 41.383F, /* clkFreq16bpp */ - 82.766F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_75_NOSCANDOUBLE = { - 47, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 399, /* vSyncOff */ - 62, /* hBackPorch */ - 14, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 19.296F, /* clkFreq16bpp */ - 38.592F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_85 = { - 55, /* hSyncOn */ - 631, /* hSyncOff */ - 3, /* vSyncOn */ - 804, /* vSyncOff */ - 86, /* hBackPorch */ - 35, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 85, /* refreshRate */ - 0x2, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 47.193F, /* clkFreq16bpp */ - 94.386F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_85_NOSCANDOUBLE = { - 55, /* hSyncOn */ - 599, /* hSyncOff */ - 3, /* vSyncOn */ - 401, /* vSyncOff */ - 70, /* hBackPorch */ - 16, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 22.527F, /* clkFreq16bpp */ - 45.054F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_512X384_120 = { - 25, /* hSyncOn */ - 650, /* hSyncOff */ - 3, /* vSyncOn */ - 409, /* vSyncOff */ - 110, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 96, /* memOffset */ - 16, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.5F, /* clkFreq16bpp */ - 67.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 70, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 130, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_60 = { - 96, /* hSyncOn */ - - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 25, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 150, /* memOffset */ - 20, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -// 800x600 requires 832x608 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_800X600_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_75 = { - 79, /* hSyncOn */ - 975, /* hSyncOff */ - 3, /* vSyncOn */ - 622, /* vSyncOff */ - 158, /* hBackPorch */ - 21, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 49.5F, /* clkFreq16bpp */ - 99.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_85 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 628, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X600_120 = { - 87, /* hSyncOn */ - 999, /* hSyncOff */ - 3, /* vSyncOn */ - 640, /* vSyncOff */ - 142, /* hBackPorch */ - 39, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 120, /* refreshRate */ - 0, /* miscCtrl */ - 247, /* memOffset */ - 26, /* tilesInX */ - 17, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 83.950F, /* clkFreq16bpp */ - 83.950F /* clkFreq24bpp -- unsupported */ -}; - -// 856x480 requires 896x480 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_856X480_60 = { - 136, /* hSyncOn */ - 1008, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 100, /* hBackPorch */ - 23, /* vBackPorch */ - 856, /* xDimension */ - 480, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 210, /* memOffset */ - 28, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -// 960x720 requires 960x736 amount of memory usage... -sst1VideoTimingStruct SST_VREZ_960X720_60 = { - 103, /* hSyncOn */ - 1151, /* hSyncOff */ - 3, /* vSyncOn */ - 743, /* vSyncOff */ - 142, /* hBackPorch */ - 22, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.219F, /* clkFreq16bpp */ - 112.437F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_75 = { - 103, /* hSyncOn */ - 1183, /* hSyncOff */ - 3, /* vSyncOn */ - 749, /* vSyncOff */ - 158, /* hBackPorch */ - 28, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 72.643F, /* clkFreq16bpp */ - 72.643F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_85 = { - 103, /* hSyncOn */ - 1199, /* hSyncOff */ - 3, /* vSyncOn */ - 753, /* vSyncOff */ - 166, /* hBackPorch */ - 32, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 345, /* memOffset */ - 30, /* tilesInX */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 83.795F, /* clkFreq16bpp */ - 83.795F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_60 = { - 136, /* hSyncOn */ - 1208, /* hSyncOff */ - 6, /* vSyncOn */ - 800, /* vSyncOff */ - 160, /* hBackPorch */ - 29, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 60, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 65.0F, /* clkFreq16bpp */ - 130.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_75 = { - 96, /* hSyncOn */ - 1216, /* hSyncOff */ - 3, /* vSyncOn */ - 797, /* vSyncOff */ - 176, /* hBackPorch */ - 28, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 75, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 78.75F, /* clkFreq16bpp */ - 78.75F /* clkFreq24bpp -- unsupported */ -}; - -sst1VideoTimingStruct SST_VREZ_1024X768_85 = { - 96, /* hSyncOn */ - 1280, /* hSyncOff */ - 3, /* vSyncOn */ - 805, /* vSyncOff */ - 208, /* hBackPorch */ - 36, /* vBackPorch */ - 1024, /* xDimension */ - 768, /* yDimension */ - 85, /* refreshRate */ - 0, /* miscCtrl */ - 384, /* memOffset */ - 32, /* tilesInX */ - 16, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXFALSE, /* video24BPPIsOK */ - 94.5F, /* clkFreq16bpp */ - 94.5F /* clkFreq24bpp -- unsupported */ -}; - -#else /* SST1INIT_VIDEO_ALLOCATE */ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern sst1VideoTimingStruct SST_VREZ_640X480_60; -extern sst1VideoTimingStruct SST_VREZ_800X600_60; - -#ifdef __cplusplus -} -#endif - -#endif /* SST1INIT_VIDEO_ALLOCATE */ - -#endif /* !__SST1INIT_H__ */ diff --git a/glide2x/cvg/init/util.c b/glide2x/cvg/init/util.c deleted file mode 100644 index a42c750..0000000 --- a/glide2x/cvg/init/util.c +++ /dev/null @@ -1,1185 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Utility routines for SST-1 Initialization code -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#include -#include - -#include "canopus.h" - -/* -** sst1InitIdle(): -** Return idle condition of SST-1 -** -** Returns: -** FXTRUE if SST-1 is idle (fifos are empty, graphics engines are idle) -** FXFALSE if SST-1 has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdle(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!initIdleEnabled) - return(FXTRUE); - - if(sst1CurrentBoard->fbiLfbLocked) { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitPciFifoIdleLoop(sstbase); - else { - // Check idle for Master... - sst1InitPciFifoIdleLoop(sstbase); - // Check idle for Slave... - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); - } - } else { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitIdleLoop(sstbase, FXTRUE); - else { - // Check idle for Master... - sst1InitIdleLoop(sstbase, FXTRUE); - - // Check idle for Slave... - // Note that the Slave does not need another NOP command, because - // it will snoop the NOP command sent to the Master above. - // Sending a NOP command to the Slave also confuses the callback - // write routines for the command fifo which are not setup to - // handle any other base addresses other than the Master's... - sst1InitIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr, FXFALSE); - } - } - return(FXTRUE); -} - -static FxBool -sst1InitIdleWithTimeoutLoop(FxU32 *sstbase, FxBool issueNOP, FxU32 timeout) -{ - FxU32 cntr, loop; - SstRegs *sst = (SstRegs *) sstbase; - - if(issueNOP) ISET(sst->nopCMD, 0x0); - - cntr = loop = 0; - while(++loop < timeout) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - - return (loop < timeout); -} - -FxBool -sst1InitIdleFBIWithTimeout(FxU32 *sstbase, FxBool issueNop, FxU32 timeout) -{ - int retVal; - - if(!sstbase) - return(FXFALSE); - - if(!sst1InitCheckBoard(sstbase)) - return(FXFALSE); - - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) { - // SLI not enabled... - retVal = sst1InitIdleWithTimeoutLoop(sstbase, issueNop, timeout); - } else { - // Check idle for Master... - if(!sst1InitIdleWithTimeoutLoop(sstbase, issueNop, timeout)) - return(FXFALSE); - - // Check idle for Slave... - // Note that the Slave does not need another NOP command, because - // it will snoop the NOP command sent to the Master above. - // Sending a NOP command to the Slave also confuses the callback - // write routines for the command fifo which are not setup to - // handle any other base addresses other than the Master's... - retVal = sst1InitIdleWithTimeoutLoop(sst1CurrentBoard->sliSlaveVirtAddr, - FXFALSE, - timeout); - } - - return retVal; -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleNoNOP(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!initIdleEnabled) - return(FXTRUE); - - if(sst1CurrentBoard->fbiLfbLocked) { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitPciFifoIdleLoop(sstbase); - else { - // Check idle for Master... - sst1InitPciFifoIdleLoop(sstbase); - // Check idle for Slave... - sst1InitPciFifoIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr); - } - } else { - if(sst1CurrentBoard->sliSlaveVirtAddr == (FxU32 *) NULL) - // SLI not enabled... - sst1InitIdleLoop(sstbase, FXFALSE); - else { - // Check idle for Master... - sst1InitIdleLoop(sstbase, FXFALSE); - // Check idle for Slave... - sst1InitIdleLoop(sst1CurrentBoard->sliSlaveVirtAddr, FXFALSE); - } - } - return(FXTRUE); -} - -void sst1InitIdleLoop(FxU32 *sstbase, FxBool issueNOP) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(issueNOP) - ISET(sst->nopCMD, 0x0); - - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } -} - -void sst1InitPciFifoIdleLoop(FxU32 *sstbase) -{ - FxU32 cntr; - - cntr = 0; - while(1) { - if(((sst1InitReturnStatus(sstbase) & SST_FIFOLEVEL)) == 0x3f) { - // Since sst1InitPciFifoIdleLoop is only called when we're trying - // to "fake" idle during lfb locks, wait for 6 passes to give the - // hardware time to drain - if(++cntr >= 6) - break; - } else - cntr = 0; - } -} - -/* -** sst1InitIdleFBI(): -** Return idle condition of FBI (ignoring idle status of TMU) -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBI(FxU32 *sstbase) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* -** sst1InitIdleFBINoNOP(): -** Return idle condition of FBI (ignoring idle status of TMU) -** sst1InitIdleFBINoNOP() differs from sst1InitIdleFBI() in that no NOP command -** is issued to flush the graphics pipeline. -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBINoNOP(FxU32 *sstbase) -{ - FxU32 cntr; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - // ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr > 5) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -// Included so compiler doesn't optimize out loop code waiting on status bits -FX_EXPORT FxU32 FX_CSTYLE sst1InitReturnStatus(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - return(IGET(sst->status)); -} - - -/* -** sst1InitClearSwapPending(): -** Clear any swaps pending in the status register -** NOTE: The video unit of FBI must be initialized before calling this routine -** -** Returns: -** FXTRUE -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 displayedBuffer, i; - - INIT_PRINTF(("sst1InitClearSwapPending() WARNING: Clearing pending swapbufferCMDs...\n")); - - sst1InitIdle(sstbase); - displayedBuffer = - (IGET(sst->status) & SST_DISPLAYED_BUFFER) >> - SST_DISPLAYED_BUFFER_SHIFT; - - // Wait until vsync is inactive to guarantee that swaps queue in the - // PCI fifo properly - while(!(IGET(sst->status) & SST_VRETRACE) || - ((IGET(sst->vRetrace) & 0xfff) > 100) || ((IGET(sst->vRetrace) & 0xfff) - < 10)) - ; - - // First swap syncs to Vsync...Subsequent ones do not... - ISET(sst->swapbufferCMD, 0x1); - ISET(sst->nopCMD, 0x0); - for(i=0; i<17; i++) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - if(displayedBuffer) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitVgaPassCtrl(): -** Control VGA passthrough setting -** -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVgaPassCtrl(FxU32 *sstbase, FxU32 enable) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - //if (sst1CurrentBoard->singleBrdSLISlave) { - // enable = 1; - //} - - if(enable) { - // VGA controls monitor - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruEnable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_BLANK_EN); - } else { - // SST-1 controls monitor - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruDisable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_BLANK_EN); - } - - return(FXTRUE); -} - -/* -** sst1InitResetTmus(): -** Reset TMUs -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitResetTmus(FxU32 *sstbase) -{ - volatile int delay; - SstRegs *sst = (SstRegs *) sstbase; - FxU32 allowTexturing = (GETENV(("SSTV2_TEXMAP_DISABLE"))) ? 0 : 1; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Ignore stalls on FT Bus - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_TEXMAP_DISABLE); - // Delay - for(delay=0;delay<10000;) - delay++; - -// while(++cntr < 6) { - - INIT_PRINTF(("sst1InitResetTmus(): Reset Graphics ")); - - do - { - INIT_PRINTF((".")); - - // Set Default initialization values for all TMUs... - ISET(SST_TREX(sst,0)->trexInit0, sst1CurrentBoard->tmuInit0[0]); - ISET(SST_TREX(sst,1)->trexInit0, sst1CurrentBoard->tmuInit0[1]); - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - // Delay - for(delay=0;delay<10000;) - delay++; - - // Reset TMU FIFOs and graphics core for all TMUs... - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | SST_TEX_RESET_FIFO | SST_TEX_RESET_GRX); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | SST_TEX_RESET_FIFO | SST_TEX_RESET_GRX); - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - - // Allow unreset to propagate backwards... - // Delay - for(delay=0;delay<10000;) - delay++; - - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - // Delay - for(delay=0;delay<10000;) - delay++; - - // Reset in the downstream TMU may cause glitches in FBI's TF FIFO - // Waiting for Idle in FBI will not stall on something in the TF FIFO, - // as the TF FIFO empty signal is not part of FBI's "busy" bit -// sst1InitIdleFBIWithTimeout(sstbase, FXTRUE, 100000); - sst1InitResetFbi(sstbase); -/* - fbiInit0 = IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET; - - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_PCI_FIFO_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_GRX_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; -*/ - - if(allowTexturing) - { - ISET(sst->fbiInit3, IGET(sst->fbiInit3) & ~SST_TEXMAP_DISABLE); - for(delay=0;delay<10000;) - delay++; - } - - delay = 0; - - while( sst1InitReturnStatus(sstbase) & (SST_TMU_BUSY | SST_FBI_BUSY) && (delay < 50000) ) - delay++; - - }while( delay == 50000 ); - - INIT_PRINTF(("\n")); - -// INIT_PRINTF(("sst1InitResetTmus(): Could not reset graphics (0x%08lx)\n", ret)); -// else -// break; -// } -// if(cntr == 6) { -// INIT_PRINTF(("sst1InitResetTmus(): Could not reset TMUs...\n")); -// return(FXFALSE); -// } - - // Fix problem where first Texture downloads to TMU weren't being - // received properly - ISET(*(long *) (0xf00000 + (long) sstbase), 0xdeadbeef); - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitResetFbi(): -** Reset FBI graphics engine and frontend PCI Fifo... -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitResetFbi(FxU32 *sstbase) -{ - volatile int delay; -// int i; - FxU32 fbiInit0; - SstRegs *sst = (SstRegs *) sstbase; -/* - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - for(i=0;i<20000;i++) sst1InitReturnStatus(sstbase); -*/ - fbiInit0 = IGET(sst->fbiInit0) | SST_GRX_RESET | SST_PCI_FIFO_RESET; - - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_PCI_FIFO_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - fbiInit0 &= ~SST_GRX_RESET; - ISET(sst->fbiInit0, fbiInit0); - // Delay - for(delay=0;delay<10000;) - delay++; - - return(FXTRUE); -} - -#if SET_BSWAP -#if __POWERPC__ && defined(__MWERKS__) -#define GET(s) __lwbrx(s, 0 ) -#define SET(d, s) __stwbrx((s), (d), 0); -#else /* !__MWERKS__ */ -#error "Define byte swapped macros for GET/SET" -#endif /* !__MWERKS__ */ -#else /* !SET_BSWAP */ -#ifdef GET -#undef GET -#endif -#ifdef SET -#undef SET -#endif -#define GET(s) (*s) -#define SET(d, s) ((*d) = s) -#endif /* !SET_BSWAP */ - -/* -** sst1InitWrite32(): -** Write 32-bit Word to specified address -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitWrite32(FxU32 *addr, FxU32 data) -{ - /* If the client software is using the command fifo then they are - * responsible for passing a callback that can be used to put - * register writes from the init code into the command fifo that - * they are managing. However, some registers cannot be accessed via - * the command fifo, and, inconveniently, these are not contiguously - * allocated. - */ - const FxU32 addrOffset = ((const FxU32)addr - (const FxU32)sst1CurrentBoard->virtAddr[0]); - FxBool directWriteP = ((sst1CurrentBoard == NULL) || - (sst1CurrentBoard->set32 == NULL) || - sst1CurrentBoard->fbiLfbLocked || - (addrOffset == 0x004) || /* intrCtrl */ - ((addrOffset >= 0x1E0) && (addrOffset <= 0x200)) || /* cmdFifoBase ... fbiInit4 */ - ((addrOffset >= 0x208) && (addrOffset <= 0x224)) || /* backPorch ... vSync */ - ((addrOffset >= 0x22C) && (addrOffset <= 0x23C)) || /* dacData ... borderColor */ - ((addrOffset >= 0x244) && (addrOffset <= 0x24C))); /* fbiInit5 ... fbiInit7 */ - - if (directWriteP) { - P6FENCE; - SET(addr, data); - P6FENCE; - } else { - (*sst1CurrentBoard->set32)(addr, data); - } -} - -/* -** sst1InitRead32(): -** Read 32-bit Word from specified address -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitRead32(FxU32 *addr) -{ - P6FENCE; - return GET(addr); -} - -/* -** -** sst1InitCmdFifo(): - -** Setup Command Fifo. -** -** The 'enable' parameter either enables or disables the Command Fifo. -** -** Upon return, the 'virtAddrStart' parameter is filled with the starting -** virtual address where command fifo packets should be stored. The -** 'memAddrStart' parameter is filled with the address of where the command -** fifo is stored in frame buffer memory. The 'memAddrStart' value is often -** used by the JMP command to jump to the beginning of the command fifo. -** The 'size' parameter is filled with the size of the command fifo. -** The values of 'virtAddrstart', 'memAddrStart' and 'size' -** are dependent on the amount of frame buffer memory detected as well as the -** video resolution setup by sst1InitVideo(). 'virtAddrstart', -** 'memAddrStart' and 'size' are all specified in bytes. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitCmdFifo(FxU32 *sstbase, FxBool enable, - FxU32 *virtAddrStart, FxU32 *memAddrStart, FxU32 *size, FxSet32Proc set32Proc) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 fbiInit, fifoStart, fifoSize; - FxBool directExec = (GETENV(("SSTV2_CMDFIFO_DIRECT"))) ? FXTRUE : FXFALSE; - FxBool disableHoles = (GETENV(("SSTV2_CMDFIFO_NOHOLES"))) ? FXTRUE : FXFALSE; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1CurrentBoard->fbiCmdFifoEn || (IGET(sst->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitIdleNoNOP(sstbase); - else - sst1InitIdle(sstbase); - - if(enable == FXFALSE) { - // Remove any client set callbacks before continuing since - // these must go straight to the hw. - sst1CurrentBoard->set32 = NULL; - sst1CurrentBoard->fbiCmdFifoEn = 0; - - // Disable Command Fifo - INIT_PRINTF(("sst1InitCmdFifo(): Disabling Command Fifo...\n")); - ISET(sst->fbiInit7, IGET(sst->fbiInit7) & ~SST_EN_CMDFIFO); - - // Reset graphics core to force disable to take effect... - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_GRX_RESET | - SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - SstRegs *slaveSst = (SstRegs *) sst1CurrentBoard->sliSlaveVirtAddr; - - ISET(slaveSst->fbiInit7, IGET(slaveSst->fbiInit7) & ~SST_EN_CMDFIFO); - // Reset graphics core to force disable to take effect... - ISET(slaveSst->fbiInit0, IGET(slaveSst->fbiInit0) | SST_GRX_RESET | - SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - sst1InitReturnStatus(sst1CurrentBoard->sliSlaveVirtAddr); - ISET(slaveSst->fbiInit0, IGET(slaveSst->fbiInit0) & ~SST_GRX_RESET); - - if(sst1InitCheckBoard(sst1CurrentBoard->sliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - sst1CurrentBoard->set32 = NULL; - sst1CurrentBoard->fbiCmdFifoEn = 0; - } - return(FXTRUE); - } - - sst1InitIdle(sstbase); - fbiInit = IGET(sst->fbiInit4); - fifoStart = - (fbiInit & SST_MEM_FIFO_ROW_BASE) >> SST_MEM_FIFO_ROW_BASE_SHIFT; - fifoStart <<= 12; // Convert page-address into byte-address - - if(sst1CurrentBoard->fbiMemSize == 4) - fifoSize = (1024 - (fifoStart >> 12)) << 12; - else if(sst1CurrentBoard->fbiMemSize == 2) - fifoSize = (512 - (fifoStart >> 12)) << 12; - else - fifoSize = (256 - (fifoStart >> 12)) << 12; - if(fifoSize > (256<<10)) - fifoSize = (256<<10); - - *virtAddrStart = (FxU32) (((FxU32) sstbase) + SST_CMDFIFO_ADDR); - *memAddrStart = fifoStart; - *size = fifoSize; - - if(!sst1InitCmdFifoDirect(sstbase, 0, - fifoStart, fifoSize, - directExec, disableHoles, - set32Proc)) { - INIT_PRINTF(("sst1InitCmdFifo(): sst1InitCmdFifoDirect() failed...\n")); - return(FXFALSE); - } - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - if(!sst1InitCmdFifoDirect(sst1CurrentBoard->sliSlaveVirtAddr, 0, - fifoStart, fifoSize, - directExec, disableHoles, - set32Proc)) { - INIT_PRINTF(("sst1InitCmdFifo(): sst1InitCmdFifoDirect() failed for SLI Slave...\n")); - return(FXFALSE); - } - } - - INIT_PRINTF(("sst1InitCmdFifo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** -** sst1InitCmdFifoDirect(): -** Explicitly initialize Command FIFO. This routine is typically not -** called directly from apps, but is included so that csim diags can -** call it directly. -** -** The 'start' and 'size' parameters are specified in bytes. -** The 'which' parameter is not used, but is included for H3 compatibility. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitCmdFifoDirect(FxU32 *sstbase, FxU32 which, - FxU32 start, FxU32 size, FxBool directExec, FxBool disableHoles, - FxSet32Proc set32Proc) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 fbiInit7, initEnable, n; - FxU32 pageStart = start >> 12; - FxU32 pageEnd = (start+size-1) >> 12; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // sst1Initidle() routines must be properly executed... - initIdleEnabled = 1; - - INIT_PRINTF(("sst1InitCmdFifoDirect(): Start:0x%x bytes, Size:%d(0x%x) bytes\n", - start, size, size)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): DirectExec:%d, DisableHoles:%d\n", - directExec, disableHoles)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): pageStart:%d, pageEnd:%d\n", - pageStart, pageEnd)); - INIT_PRINTF(("sst1InitCmdFifoDirect(): set32Proc: 0x%X\n", - (FxU32)set32Proc)); - - if(sst1CurrentBoard->fbiCmdFifoEn || (IGET(sst->fbiInit7) & SST_EN_CMDFIFO)) - sst1InitIdleNoNOP(sstbase); - else - sst1InitIdle(sstbase); - // Disable memory-backed fifo, and disallow lfb and texture writes - // through command fifo... - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & - ~(SST_MEM_FIFO_EN | SST_EN_LFB_MEMFIFO | SST_EN_TEX_MEMFIFO))); - sst1InitReturnStatus(sstbase); - - fbiInit7 = IGET(sst->fbiInit7); - fbiInit7 &= ~(SST_EN_CMDFIFO | - SST_EN_CMDFIFO_OFFSCREEN | SST_CMDFIFO_DISABLE_HOLES | - SST_CMDFIFO_REGS_SYNC_WRITES | SST_CMDFIFO_REGS_SYNC_READS | - SST_CMDFIFO_RDFETCH_THRESH | SST_CMDFIFO_PCI_TIMEOUT); - fbiInit7 |= SST_CMDFIFO_REGS_SYNC_WRITES | SST_CMDFIFO_REGS_SYNC_READS | - (0x10<fbiInit7, fbiInit7); // turn off the command fifo - sst1InitReturnStatus(sstbase); - - // Disable all writes to the PCI fifo while we're setting up CMDFIFO - PCICFG_RD(SST1_PCI_INIT_ENABLE, initEnable); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((initEnable & ~(SST_INITWR_EN | SST_PCI_FIFOWR_EN)) | SST_INITWR_EN)); - - // Setup command fifo... - ISET(sst->cmdFifoBase, (pageEnd << SST_CMDFIFO_END_SHIFT) | pageStart); - sst1InitReturnStatus(sstbase); // prevent PCI bursts... - ISET(sst->cmdFifoReadPtr, start); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoAmin, start-4); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoAmax, start-4); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoDepth, 0); - sst1InitReturnStatus(sstbase); - ISET(sst->cmdFifoHoles, 0); - sst1InitReturnStatus(sstbase); - sst1InitIdle(sstbase); - - // Turn on command fifo... - ISET(sst->fbiInit7, fbiInit7 | SST_EN_CMDFIFO | - (directExec ? 0 : SST_EN_CMDFIFO_OFFSCREEN) | - (disableHoles ? SST_CMDFIFO_DISABLE_HOLES : 0)); - // Can't perform sst1InitIdle() here because it will generate - // writes to the CMDFIFO since the CMDFIFO is now enabled... - sst1InitReturnStatus(sstbase); - - // Enable writes to be pushed onto the CMDFIFO... - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (initEnable | SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - sst1CurrentBoard->fbiCmdFifoEn = 1; - if(GETENV(("SSTV2_IGNORE_IDLE"))) - initIdleEnabled = 0; - - /* Set the client callbacks, if necessary. */ - sst1CurrentBoard->set32 = set32Proc; - - return(FXTRUE); -} - -/* -** -** sst1InitLfbLock(): -** Used to workaround a hw bug when performing lfb and texture writes when -** the command fifo is enabled. The routines sst1InitLfbLock() and -** sst1InitLfbUnlock() dynamically disable the command fifo so that lfb -** and texture accesses do not pass through the command fifo. -** WARNING: No register writes of any kind may be performed between a -** sst1InitLfbLock() and sst1InitLfbUnlock() pair -- only lfb reads and -** writes are allowed. -*/ -FX_ENTRY FxBool FX_CALL sst1InitLfbLock(FxU32* sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Idle the hardware... - sst1InitIdle(sstbase); - - if(sst1InitLfbLockDirect(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - // SLI Enabled - if(sst1InitLfbLockDirect(sst1CurrentBoard->sliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - } - - return(FXTRUE); -} - -FX_ENTRY FxBool FX_CALL sst1InitLfbLockDirect(FxU32* sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if((!(IGET(sst->fbiInit7) & SST_EN_CMDFIFO) && - !sst1CurrentBoard->fbiCmdFifoEn) || sst1CurrentBoard->fbiLfbLocked) - return(FXTRUE); - - // Force direct writes... - sst1CurrentBoard->fbiLfbLocked = 1; - - ISET(sst->fbiInit7, IGET(sst->fbiInit7) & ~SST_EN_CMDFIFO_OFFSCREEN); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -/* -** -** sst1InitLfbUnlock(): -** Used to workaround a hw bug when performing lfb and texture writes when -** the command fifo is enabled. The routines sst1InitLfbLock() and -** sst1InitLfbUnlock() dynamically disable the command fifo so that lfb -** and texture accesses do not pass through the command fifo. -** WARNING: No register writes of any kind may be performed between a -** sst1InitLfbLock() and sst1InitLfbUnlock() pair -- only lfb reads and -** writes are allowed. -*/ - -FX_ENTRY FxBool FX_CALL sst1InitLfbUnlock(FxU32* sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - // Idle the hardware. Since lfb lock is set, a NOP will not be issued, and - // sst1InitPciFifoIdleLoop() will be used instead of sst1InitIdleLoop()... - sst1InitIdle(sstbase); - - if(sst1CurrentBoard->sliSlaveVirtAddr) { - // SLI Enabled - if(sst1InitLfbUnlockDirect(sst1CurrentBoard->sliSlaveVirtAddr) == - FXFALSE) - return(FXFALSE); - } - if(sst1InitLfbUnlockDirect(sstbase) == FXFALSE) - return(FXFALSE); - - // After the command fifo is re-enabled, make sure the chip is really idle... - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -FX_ENTRY FxBool FX_CALL sst1InitLfbUnlockDirect(FxU32* sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(!sst1CurrentBoard->fbiCmdFifoEn || !sst1CurrentBoard->fbiLfbLocked) - return(FXTRUE); - - ISET(sst->fbiInit7, IGET(sst->fbiInit7) | SST_EN_CMDFIFO_OFFSCREEN); - - sst1CurrentBoard->fbiLfbLocked = 0; - - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -/* -** -** sst1InitPrintInitRegs(): -** Print Initialization Registers -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitPrintInitRegs(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - - INIT_PRINTF(("FBI Initialization Registers:\n")); - INIT_PRINTF(("-----------------------------\n")); - INIT_PRINTF(("fbiInit0:0x%08x fbiInit1:0x%08x\n", - IGET(sst->fbiInit0), IGET(sst->fbiInit1))); - INIT_PRINTF(("fbiInit2:0x%08x fbiInit3:0x%08x\n", - IGET(sst->fbiInit2), IGET(sst->fbiInit3))); - INIT_PRINTF(("fbiInit4:0x%08x fbiInit5:0x%08x\n", - IGET(sst->fbiInit4), IGET(sst->fbiInit5))); - INIT_PRINTF(("fbiInit6:0x%08x fbiInit7:0x%08x\n", - IGET(sst->fbiInit6), IGET(sst->fbiInit7))); - INIT_PRINTF(("videoDimensions:0x%08x\n\n", - IGET(sst->videoDimensions))); - INIT_PRINTF(("FBI Command Fifo Registers:\n")); - INIT_PRINTF(("---------------------------\n")); - INIT_PRINTF(("cmdFifoBase: 0x%08x\tcmdFifoBump:0x%x\n", - IGET(sst->cmdFifoBase), IGET(sst->cmdFifoBump))); - INIT_PRINTF(("cmdFifoReadPtr: 0x%08x\tcmdFifoAmin:0x%x\n", - IGET(sst->cmdFifoReadPtr), IGET(sst->cmdFifoAmin))); - INIT_PRINTF(("cmdFifoAmax: 0x%08x\tcmdFifoDepth:0x%x\n", - IGET(sst->cmdFifoAmax), IGET(sst->cmdFifoDepth))); - INIT_PRINTF(("cmdFifoHoles: 0x%08x\n", IGET(sst->cmdFifoHoles))); -} - -/* -** -** sst1InitMeasureSiProcess(): -** Use silicon process register to measure silicon performance -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitMeasureSiProcess(FxU32 *sstbase, FxU32 which) -{ - FxU32 n, siProcess, nandOsc, norOsc; - FxU32 pciCntrLoad = 0xfff; - FxU32 cntr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_SIPROCESS_CNTR"))) { - SSCANF(GETENV(("SSTV2_SIPROCESS_CNTR")), "%ld", &pciCntrLoad); - INIT_PRINTF(("sst1InitMeasureSiProcess(): Using PCI Counter preload value of 0x%x...\n", pciCntrLoad)); - } - - if(!which) { - //////////////////////////////// - // Test NAND oscillator tree... - //////////////////////////////// - PCICFG_WR(SST1_PCI_SIPROCESS, - (pciCntrLoad<fbiNandTree = nandOsc; - - INIT_PRINTF(("sst1InitInfo(): NAND-tree: %d\n", nandOsc)); - } else { - //////////////////////////////// - // Test NOR oscillator tree... - //////////////////////////////// - PCICFG_WR(SST1_PCI_SIPROCESS, - (pciCntrLoad<fbiNorTree = norOsc; - - INIT_PRINTF(("sst1InitInfo(): NOR-tree : %d\n", norOsc)); - } - return(siProcess); -} - -/* -** -** sst1InitCalcTClkDelay() -** Calculate optimal TF/TT Clock delay values -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcTClkDelay(FxU32 *sstbase, - FxU32 tmuNumber, FxU32 tClkDelay) -{ - SstRegs *sst = (SstRegs *) sstbase; - volatile FxU32 *texAddr; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, SST_ENCHROMAKEY); - ISET(sst->fbzColorPath, SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - //texAddr = (numTmu<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - texAddr = (0<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - texAddr = (1<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - texAddr = (2<<(21-2)) + (FxU32 *) SST_TEX_ADDRESS(sst); - ISET(texAddr[0], 0x0); - - ISET(SST_TREX(sst,tmuNumber)->trexInit1, - (sst1CurrentBoard->tmuInit1[tmuNumber] & ~SST_TEX_TF_CLK_DEL_ADJ) | - (tClkDelay<nopCMD, 0x3); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xff0000); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x00ffff); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xf0f0f0); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x0f0f0f); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x55aa55); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xaa55aa); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0x5a5a5a); - sst1InitCheckTmuMemConst(sstbase, tmuNumber, 0xa5a5a5); - - if(!sst1InitIdleFBIWithTimeout(sstbase, FXTRUE, 10000)) - return(FXFALSE); - - if(IGET(sst->stats.fbiChromaFail)) - return(FXFALSE); - else - return(FXTRUE); -} - -#define COLOR32TOCOLOR24_6666(X) \ - ((((X >> 2) & 0x3F) << 0) | \ - (((X >> 10) & 0x3F) << 6) | \ - (((X >> 18) & 0x3F) << 12) | \ - (((X >> 26) & 0x3F) << 18)) -#define COLOR24_6666TOCOLOR32(X) \ - (((((X >> 0) & 0x3F) << 2) | (((X >> 4) & 0x3) << 0)) | \ - ((((X >> 6) & 0x3F) << 10) | (((X >> 10) & 0x3) << 8)) | \ - ((((X >> 12) & 0x3F) << 18) | (((X >> 16) & 0x3) << 16)) | \ - ((((X >> 18) & 0x3F) << 26) | (((X >> 22) & 0x3) << 24))) - -void sst1InitCheckTmuMemConst(FxU32 *sstbase, FxU32 tmuNumber, - FxU32 dataExpect32) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 dataExpect6666 = COLOR32TOCOLOR24_6666(dataExpect32); - FxU32 dataExpect6666To32 = COLOR24_6666TOCOLOR32(dataExpect6666) & 0xffffff; - - ISET(sst->chromaKey, dataExpect6666To32); - ISET(sst->chromaRange, dataExpect6666To32 | SST_ENCHROMARANGE | - SST_CHROMARANGE_BLUE_EX | SST_CHROMARANGE_GREEN_EX | - SST_CHROMARANGE_RED_EX | SST_CHROMARANGE_BLOCK_OR); - - if(!tmuNumber) { - ISET(sst->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | SST_TCA_ZERO); - } else if(tmuNumber == 1) { - // Force downstream TMU to passthrough upstream data - ISET(SST_TREX(sst,0)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,1)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - ISET(SST_TREX(sst,2)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - } else { - // Force downstream TMUs to passthrough upstream data - ISET(SST_TREX(sst,0)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,1)->textureMode, SST_P8_ARGB6666 | SST_TC_PASS | - SST_TCA_PASS); - ISET(SST_TREX(sst,2)->textureMode, SST_P8_ARGB6666 | SST_TC_REPLACE | - SST_TCA_ZERO); - } - // Specify color in palette entry 0... - //sst->nccTable0[4]=BIT(31) | ((index>>1)<<24) | (palette[index] & 0xffffff); - ISET(sst->nccTable0[4], BIT(31) | COLOR32TOCOLOR24_6666(dataExpect32)); - sst1InitDrawRectUsingTris(sstbase, 0, 0, 128); - - return; -} - -void sst1InitDrawRectUsingTris(FxU32 *sstbase, FxU32 x, FxU32 y, FxU32 tSize) -{ - SstRegs *sst = (SstRegs *) sstbase; - - ISET(sst->vA.x, (x<vA.y, (y<vB.x, ((x+tSize)<vB.y, (y<vC.x, ((x+tSize)<vC.y, ((y+tSize)<s, 0); - ISET(sst->t, 0); - ISET(sst->w, 0); - ISET(sst->r, (0xff<g, 0); - ISET(sst->b, 0); - ISET(sst->dsdx, 0); - ISET(sst->dtdx, 0); - ISET(sst->dwdx, 0); - ISET(sst->dsdy, 0); - ISET(sst->dtdy, 0); - ISET(sst->dwdy, 0); - ISET(sst->triangleCMD, 0); - ISET(sst->vB.x, (x<vB.y, ((y+tSize)<triangleCMD, 0xFFFFFFFF); -} - -#ifdef _WIN32 -#pragma optimize ("",on) -#endif diff --git a/glide2x/cvg/init/video.c b/glide2x/cvg/init/video.c deleted file mode 100644 index fe7b1f5..0000000 --- a/glide2x/cvg/init/video.c +++ /dev/null @@ -1,1467 +0,0 @@ -/*-*-c++-*-*/ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing SST-1 video unit -** -*/ -#ifdef _WIN32 -#pragma optimize ("",off) -#endif -#include -#include -#include -#ifdef BUILD_FOR_SST1 -#include -#else -#include <3dfx.h> -#include -#include -#endif -#define FX_DLL_DEFINITION -#include -#define SST1INIT_VIDEO_ALLOCATE // allocate data structures for video timing -#include -#include - -#ifdef H3D -#include -#endif - -#include "canopus.h" - -/* -** sst1InitVideo(): -** Initialize video (including DAC setup) for the specified resolution -** -** Note: sst1InitVideo() is included for compatibility with SST-1 apps only -** and should not be used for Voodoo2. Use sst1InitVideoBuffers() instead. -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideo(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - void *placeHolder) -{ - FxU32 memSizeInPages; - sst1VideoTimingStruct *videoTiming; - FxU32 colorBuffs, auxBuffs; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(!(videoTiming = sst1InitFindVideoTimingStruct(screenResolution, - screenRefresh))) - return(FXFALSE); - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - if(sst1CurrentBoard->sliDetected) - memSizeInPages <<= 1; - - // Do we have enough memory for the desired resolution? - if(memSizeInPages > (3 * videoTiming->memOffset)) { - colorBuffs = 2; - auxBuffs = 1; - } else if(memSizeInPages > (2 * videoTiming->memOffset)) { - colorBuffs = 2; - auxBuffs = 0; - } else { - INIT_PRINTF(("sst1InitVideo(): Insufficient memory available for desired resolution...\n")); - return(FXFALSE); - } - - return(sst1InitVideoBuffers(sstbase, screenResolution, screenRefresh, - colorBuffs, auxBuffs, (sst1VideoTimingStruct *) NULL, FXTRUE)); -} - -/* -** sst1InitVideoBuffers(): -** Initialize video (including DAC setup) for the specified resolution -** -** Returns: -** FXTRUE if successfully initializes specified SST-1 video resolution -** FXFALSE if cannot initialize SST-1 to specified video resolution -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoBuffers(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - FxU32 nColorBuffs, FxU32 nAuxBuffs, sst1VideoTimingStruct *altVideoTiming, - FxBool switchPassThru) -{ - FxU32 n, vtmp; - SstRegs *sst = (SstRegs *) sstbase; - sst1VideoTimingStruct *sstVideoRez; - FxU32 video16BPP; - FxU32 memFifoLwm, memFifoHwm, pciFifoLwm; - FxU32 vInClkDel, vOutClkDel; - FxU32 tf0_clkdel, tf1_clkdel, tf2_clkdel; - FxU32 ft_clkdel, memSizeInPages; - FxU32 nCol, nAux, miscCtrl; - int memFifoEntries; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SSTV2_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - if(altVideoTiming && !GETENV(("SSTV2_SCREENREZ")) && - !GETENV(("SSTV2_SCREENREFRESH"))) - sstVideoRez = altVideoTiming; - else { - if(!(sstVideoRez = sst1InitFindVideoTimingStruct(screenResolution, - screenRefresh))) - return(FXFALSE); - } - - nCol = nColorBuffs; - nAux = nAuxBuffs; - - // Disallow unsupported buffer combinations... - if(nCol < 2 || nCol > 3 || nAux > 1) - return(FXFALSE); - - if(sst1CurrentBoard->fbiMemSize == 1) - memSizeInPages = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - memSizeInPages = 512; - else - memSizeInPages = 1024; - if(sst1CurrentBoard->sliDetected) - memSizeInPages <<= 1; - - // To be compatible with Voodoo1, if there is enough memory to - // allocate an aux buffer, then do it... - if(nCol == 2 && nAux == 0) { - if(memSizeInPages > (3 * sstVideoRez->memOffset)) { - INIT_PRINTF(("sst1InitVideo(): Allocating 1 Aux Buffer for SST-1 Compatibility...\n")); - nAux++; - } - } - - if(GETENV(("SSTV2_ALLOC_COLOR"))) - nCol = ATOI(GETENV(("SSTV2_ALLOC_COLOR"))); - if(GETENV(("SSTV2_ALLOC_AUX"))) - nAux = ATOI(GETENV(("SSTV2_ALLOC_AUX"))); - - // Disallow unsupported buffer combinations (from environment vars)... - if(nCol < 2 || nCol > 3 || nAux > 1) - return(FXFALSE); - - // - // Do we have enough memory for the desired resolution? - // - if(memSizeInPages < ((nCol + nAux) * sstVideoRez->memOffset)) { - INIT_PRINTF(("sst1InitVideo(): Insufficient memory available for desired resolution.\n")); - return(FXFALSE); - } - if(GETENV(("SSTV2_VIDEO_24BPP"))) - sst1CurrentBoard->fbiVideo16BPP = - (ATOI(GETENV(("SSTV2_VIDEO_24BPP")))) ^ 0x1; - else { - sst1CurrentBoard->fbiVideo16BPP = 0; - - if(sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video16BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 0; - if(!sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video24BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 1; - - if(altVideoTiming == (sst1VideoTimingStruct *) NULL) { - // Determine when cannot output 24bpp video... - // Cannot run at high frequencies across SLI connector... - if(sst1CurrentBoard->sliDetected && - sstVideoRez->clkFreq24bpp > 90.0F) - sst1CurrentBoard->fbiVideo16BPP = 1; - } - } - video16BPP = sst1CurrentBoard->fbiVideo16BPP; - - // Reset Video Refresh Unit - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - // Setup SST video timing registers - if(GETENV(("SSTV2_HSYNC"))) { - SSCANF(GETENV(("SSTV2_HSYNC")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_HSYNC=0x%x\n", vtmp)); - ISET(sst->hSync, vtmp); - } else - ISET(sst->hSync, ((sstVideoRez->hSyncOff << SST_VIDEO_HSYNC_OFF_SHIFT) | - (sstVideoRez->hSyncOn << SST_VIDEO_HSYNC_ON_SHIFT))); - if(GETENV(("SSTV2_VSYNC"))) { - SSCANF(GETENV(("SSTV2_VSYNC")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_VSYNC=0x%x\n", vtmp)); - ISET(sst->vSync, vtmp); - } else - ISET(sst->vSync, ((sstVideoRez->vSyncOff << SST_VIDEO_VSYNC_OFF_SHIFT) | - (sstVideoRez->vSyncOn << SST_VIDEO_VSYNC_ON_SHIFT))); - if(GETENV(("SSTV2_BACKPORCH"))) { - SSCANF(GETENV(("SSTV2_BACKPORCH")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_BACKPORCH=0x%x\n", vtmp)); - ISET(sst->backPorch, vtmp); - } else - ISET(sst->backPorch, - ((sstVideoRez->vBackPorch << SST_VIDEO_VBACKPORCH_SHIFT) | - (sstVideoRez->hBackPorch << SST_VIDEO_HBACKPORCH_SHIFT))); - if(GETENV(("SSTV2_DIMENSIONS"))) { - SSCANF(GETENV(("SSTV2_DIMENSIONS")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_DIMENSIONS=0x%x\n", vtmp)); - sstVideoRez->yDimension = (vtmp >> SST_VIDEO_YDIM_SHIFT) & 0x3ff; - sstVideoRez->xDimension = vtmp & 0x3ff; - } - ISET(sst->videoDimensions, - ((sstVideoRez->yDimension << SST_VIDEO_YDIM_SHIFT) | - ((sstVideoRez->xDimension-1) << SST_VIDEO_XDIM_SHIFT))); - if(GETENV(("SSTV2_MEMOFFSET"))) { - SSCANF(GETENV(("SSTV2_MEMOFFSET")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video memOffset=0x%x\n", vtmp)); - sstVideoRez->memOffset = vtmp; - } - if(GETENV(("SSTV2_TILESINX"))) { - SSCANF(GETENV(("SSTV2_TILESINX")), "%ld", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video tilesInX=0x%x\n", vtmp)); - sstVideoRez->tilesInX = vtmp; - } - - // Update info structure - sst1CurrentBoard->fbiVideoWidth = sstVideoRez->xDimension; - sst1CurrentBoard->fbiVideoHeight = sstVideoRez->yDimension; - sst1CurrentBoard->fbiVideoRefresh = sstVideoRez->refreshRate; - sst1CurrentBoard->fbiVideoColBuffs = nCol; - sst1CurrentBoard->fbiVideoAuxBuffs = nAux; - sst1CurrentBoard->fbiVideoMemOffset = sstVideoRez->memOffset; - sst1CurrentBoard->fbiVideoTilesInX = sstVideoRez->tilesInX; - sst1CurrentBoard->fbiVideoStruct = sstVideoRez; - - // Setup SST memory mapper for desired resolution - if(sst1CurrentBoard->fbiMemSize == 4) - sst1InitSetResolution(sstbase, sstVideoRez, 1); - else - sst1InitSetResolution(sstbase, sstVideoRez, 0); - - // Calculate graphics clock frequency - if(sst1InitCalcGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - // Setup video fifo - // NOTE: Lower values for the video fifo threshold improve video fifo - // underflow problems - if(GETENV(("SSTV2_VFIFO_THRESH"))) { - INIT_PRINTF(("sst1InitVideo(): Overriding Default Video Fifo Threshold %d and Storing %d\n", - sstVideoRez->vFifoThreshold, ATOI(GETENV(("SSTV2_VFIFO_THRESH"))))); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - - ((ATOI(GETENV(("SSTV2_VFIFO_THRESH")))) - << SST_VIDEO_FIFO_THRESH_SHIFT)); - } else { - FxU32 vFifoThresholdVal = sstVideoRez->vFifoThreshold; - - if(sst1CurrentBoard->fbiGrxClkFreq < 45) - // Lower threshold value for slower graphics clocks - vFifoThresholdVal = sstVideoRez->vFifoThreshold - 4; - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - (vFifoThresholdVal << SST_VIDEO_FIFO_THRESH_SHIFT)); - } - - INIT_PRINTF(("sst1InitVideo() Setting up video for resolution (%d, %d), Refresh:%d Hz...\n", - sstVideoRez->xDimension, sstVideoRez->yDimension, - sstVideoRez->refreshRate)); - INIT_PRINTF(("sst1InitVideo(): Video Fifo Threshold = %d\n", - (IGET(sst->fbiInit3) & SST_VIDEO_FIFO_THRESH) >> - SST_VIDEO_FIFO_THRESH_SHIFT)); - - // Initialize Y-Origin - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sstVideoRez->yDimension - 1) << SST_YORIGIN_TOP_SHIFT)); - - sst1InitIdleFBINoNOP(sstbase); - - memFifoLwm = 23; - if(GETENV(("SSTV2_MEMFIFO_LWM"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_LWM")), "%ld", &memFifoLwm); - memFifoHwm = 54; - if(GETENV(("SSTV2_MEMFIFO_HWM"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_HWM")), "%ld", &memFifoHwm); - pciFifoLwm = 13; - if(GETENV(("SSTV2_PCIFIFO_LWM"))) - SSCANF(GETENV(("SSTV2_PCIFIFO_LWM")), "%ld", &pciFifoLwm); - INIT_PRINTF(("sst1InitVideo(): pciFifoLwm:%d memFifoLwm:%d memFifoHwm:%d\n", - pciFifoLwm, memFifoLwm, memFifoHwm)); - - // Setup Memory FIFO - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & - ~(SST_MEM_FIFO_ROW_BASE | SST_MEM_FIFO_ROW_ROLL | SST_MEM_FIFO_LWM)); - sst1InitIdleFBINoNOP(sstbase); - if(sst1CurrentBoard->fbiMemSize == 1) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0xff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else if (sst1CurrentBoard->fbiMemSize == 2) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x1ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else - // 4 MBytes frame buffer memory... - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x3ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Setup buffer management... - if(sst1InitAllocBuffers(sstbase, nCol, nAux) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitVideo(): Allocating %d Color Buffers and %d Aux Buffer(s)...\n", - sst1CurrentBoard->fbiVideoColBuffs, sst1CurrentBoard->fbiVideoAuxBuffs)); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (((nCol+nAux)*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Set PCI FIFO LWM - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_PCI_FIFO_LWM) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - // Enable Memory Fifo... - if(GETENV(("SSTV2_MEMFIFO"))) - n = ATOI(GETENV(("SSTV2_MEMFIFO"))); - else - n = 1; - - if(n) { - sst1CurrentBoard->fbiMemoryFifoEn = 1; - memFifoEntries = (65536 - (int) - (((int) (memSizeInPages - 1) - - (int) ((nCol+nAux) * sstVideoRez->memOffset)) * 512)) >> 5; - if(memFifoEntries <= 256) - memFifoEntries = 0x100; // max. memory fifo size... - else if(memFifoEntries >= 2048) { - INIT_PRINTF(("sst1InitVideo(): Invalid memFifoEntries 0x%x\n", - memFifoEntries)); - return(FXFALSE); - } - if(GETENV(("SSTV2_MEMFIFO_ENTRIES"))) - SSCANF(GETENV(("SSTV2_MEMFIFO_ENTRIES")), "%d", &memFifoEntries); - INIT_PRINTF(("sst1InitVideo(): Enabling Memory FIFO (Entries=%d)...\n", - 65536 - (memFifoEntries << 5))); - - sst1CurrentBoard->memFifoStatusLwm = (memFifoEntries << 5) | 0x1f; - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~(SST_MEM_FIFO_EN | - SST_MEM_FIFO_HWM | SST_PCI_FIFO_LWM | SST_MEM_FIFO_BURST_HWM)) | - (memFifoEntries << SST_MEM_FIFO_HWM_SHIFT) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT) | - (memFifoHwm << SST_MEM_FIFO_BURST_HWM_SHIFT) | - SST_MEM_FIFO_EN); - INIT_PRINTF(("sst1InitVideo(): Setting memory FIFO LWM to 0x%x (%d)\n", - sst1CurrentBoard->memFifoStatusLwm, - sst1CurrentBoard->memFifoStatusLwm)); - } - - vInClkDel = 1; - if(GETENV(("SSTV2_VIN_CLKDEL"))) - SSCANF(GETENV(("SSTV2_VIN_CLKDEL")), "%ld", &vInClkDel); - - vOutClkDel = 0; - if(GETENV(("SSTV2_VOUT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_VOUT_CLKDEL")), "%ld", &vOutClkDel); - - INIT_PRINTF(("sst1InitVideo(): vInClkDel=0x%x vOutClkDel=0x%x\n", - - vInClkDel, vOutClkDel)); - - // Setup miscellaneous control - miscCtrl = 0; - if(sstVideoRez->miscCtrl & BIT(0)) - miscCtrl |= SST_SCAN_DOUBLE_HORIZ; - if(sstVideoRez->miscCtrl & BIT(1)) - miscCtrl |= SST_SCAN_DOUBLE_VERT; - if(sstVideoRez->miscCtrl & BIT(2)) - miscCtrl |= SST_INVERT_HSYNC; - if(sstVideoRez->miscCtrl & BIT(3)) - miscCtrl |= SST_INVERT_VSYNC; - - // Drive dac output signals and select input video clock - if(video16BPP) { - INIT_PRINTF(("sst1InitVideo(): Setting 16BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_VCLK_SEL)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) | miscCtrl); - } else { - INIT_PRINTF(("sst1InitVideo(): Setting 24BPP video mode...\n")); -#if 0 - // Old clock settings -- probably use for true 24-bit dac output - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - SST_VIDEO_VCLK_DIV2 | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); -#else - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - // SST_VIDEO_VID_CLK_2X | // BIT(17) - // SST_VIDEO_VCLK_DIV2 | // MUX select 0x1 - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | // MUX select 0x0 - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) | - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN | - SST_VID_CLK_DAC_DATA16_SEL | miscCtrl); -#endif - sst1InitIdleFBINoNOP(sstbase); - if(!GETENV(("SSTV2_VIDEO_FILTER_DISABLE"))) { - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_FILTER_EN); - if(GETENV(("SSTV2_VIDEO_FILTER_THRESHOLD"))) { - SSCANF(GETENV(("SSTV2_VIDEO_FILTER_THRESHOLD")), "%ld", &n); - INIT_PRINTF(("sst1InitVideo(): Setting Video Filtering Treshold to 0x%x...\n", n)); - - ISET(sst->videoFilterRgbThreshold, n); - } else - // ISET(sst->videoFilterRgbThreshold, 0x180c18); - ISET(sst->videoFilterRgbThreshold, 0x080408); - } else - INIT_PRINTF(("sst1InitVideo(): Disabling Video Filtering...\n")); - } - - // Setup prelim. clock delay values... - if(sst1CurrentBoard->fbiBoardID == 0x3) { - // Early 4-layer 4220 board -- Runs at 83 MHz by default... - if(sst1CurrentBoard->fbiGrxClkFreq <= 80) { - ft_clkdel = 0x5; - tf0_clkdel = 0x7; - tf1_clkdel = 0x8; - tf2_clkdel = 0x8; - } else { - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x7; - tf2_clkdel = 0x7; - } - } else if(sst1CurrentBoard->fbiBoardID == 0x2) { - // 4400 8-layer bringup board -- Runs at 90 MHz by default... - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - } else { - // Setup basic values... - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - } - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clkdel<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clkdel<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clkdel<fbiBoardID == CANOPUS_ID) { - // Setup graphics clock to 90 MHz for clockdelay measurement - if (!sst1SetGrxClk_Canopus(sstbase, 90)) - return(FXFALSE); - - // Calculate final clock delay values... - if(!sst1InitSetClkDelays(sstbase)) { - INIT_PRINTF(("sst1InitVideo() ERROR: Could not calculate clock delay values...\n")); - return(FXFALSE); - } - } - - - // Setup graphics clock - if(sst1InitGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - // Setup video mode - if(sst1InitSetVidMode(sstbase, video16BPP) == FXFALSE) - return(FXFALSE); - - // Adjust Video Clock -#ifndef DIRECTX - if(GETENV(("SSTV2_VIDCLK2X"))) { - float vidClkFreq; - - SSCANF(GETENV(("SSTV2_VIDCLK2X")), "%f", &vidClkFreq); - if(sst1InitSetVidClk(sstbase, vidClkFreq) == FXFALSE) - return(FXFALSE); - } else { -#endif - if(sst1InitUseVoodooFile == FXTRUE) { - if(sst1InitSetVidClkINI(sstbase, sst1CurrentBoard->fbiVideoWidth, - sst1CurrentBoard->fbiVideoHeight, - sst1CurrentBoard->fbiVideoRefresh, video16BPP) == FXFALSE) - return(FXFALSE); - } else { - if(video16BPP) { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq16bpp) == - FXFALSE) - return(FXFALSE); - } else { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq24bpp) == - FXFALSE) - return(FXFALSE); - } - } -#ifndef DIRECTX - } -#endif - - // Wait for video clock to stabilize - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - // Run Video Reset Module - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - - sst1InitIdleFBINoNOP(sstbase); - - // Calculate final clock delay values... - if(sst1InitSetClkDelays(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitVideo() ERROR: Could not calculate clock delay values...\n")); - return(FXFALSE); - } - - // Clear memory... - if(!GETENV(("SSTV2_VIDEO_NOCLEAR"))) { - FxU32 clearColor = 0x0; - FxU32 pagesToFill; - - if(GETENV(("SSTV2_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SSTV2_VIDEO_CLEARCOLOR")), "%ld", &clearColor); - - if(sst1CurrentBoard->fbiMemSize == 1) - pagesToFill = 256; - else if(sst1CurrentBoard->fbiMemSize == 2) - pagesToFill = 512; - else - pagesToFill = 1024; - - ISET(sst->bltColor, clearColor); - ISET(sst->bltDstXY, 0x0); - ISET(sst->bltSize, ((pagesToFill-1)<<16) | 511); - ISET(sst->bltCommand, SSTG_FRECTFILL | SSTG_GO); - sst1InitIdle(sstbase); - } else - INIT_PRINTF(("sst1InitVideo(): Not Clearing Frame Buffer...\n")); - - // Clear fbistat registers after clearing screen - ISET(sst->nopCMD, 0x3); - - // Only switch passthrough and do monitor detection if - // requested. - if(switchPassThru == FXTRUE) - { - // 3D now owns monitor... - sst1InitVgaPassCtrl(sstbase, 0); - - // Detect presence of monitor... - sst1InitMonitorDetect(sstbase); - INIT_PRINTF(("sst1InitVideo(): Monitor Detected:%d\n", - sst1CurrentBoard->monitorDetected)); - - // sst1InitMonitorDetect() trashes the gamma table. Reload to the - // original value if sst1InitGamma() has already been called -- otherwise - // load a 1.0 gamma table - if(sst1CurrentBoard->fbiInitGammaDone) - sst1InitGammaRGB(sstbase, sst1CurrentBoard->fbiGammaRed, - sst1CurrentBoard->fbiGammaGreen, sst1CurrentBoard->fbiGammaBlue); - else { - // Do not display gamma values when called by sst1InitVideo()... - sst1CurrentBoard->fbiInitGammaDone = 1; - sst1InitGammaRGB(sstbase, (double) 1.0, (double) 1.0, (double) 1.0); - sst1CurrentBoard->fbiInitGammaDone = 0; - } - } - - if(GETENV(("SSTV2_VIDEO_DISABLE"))) { - INIT_PRINTF(("sst1InitVideo(): Disabling video timing...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - sst1InitIdle(sstbase); - - if(((IGET(sst->status) & SST_SWAPBUFPENDING) >> - SST_SWAPBUFPENDING_SHIFT) > 0) - sst1InitClearSwapPending(sstbase); - - // Since initVideo() is the last init call, if the user wants to - // disable idling, do it here. This way, all the calls to initIdle - // required within the init code still idle the hardware. - if(GETENV(("SSTV2_IGNORE_IDLE"))) { - INIT_PRINTF(("sst1InitVideo(): Ignoring calls to sst1InitIdle()...\n")); - initIdleEnabled = 0; - } - - // Update info structure for initEnable - PCICFG_RD(SST1_PCI_INIT_ENABLE, sst1CurrentBoard->fbiInitEnable); - - // If this board is SLI-capable, tristate the video output signals so - // that monitor detection will work properly for the second board. The - // video output signals will be re-enabled during SLI initialization for - // the Master board - if(sst1CurrentBoard->sliDetected) { - INIT_PRINTF(("sst1InitVideo(): Disabling video output signals for proper monitor detection...\n")); - sst1InitVideoShutdown(sstbase, FXFALSE); - } - - INIT_PRINTF(("sst1InitVideo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitAllocBuffers(): -** Initialize video for buffer management -** -*/ -static FxBool -sst1InitAllocBuffersDirect(FxU32 *sstbase, FxU32 nColorBuffs, FxU32 nAuxBuffs) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 nCol = nColorBuffs; - FxU32 nAux = nAuxBuffs; - - if(!sst) - return(FXFALSE); - - // Setup buffer management... - if(nCol == 2 && nAux == 0) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_2C0Z); - else if(nCol == 2 && nAux == 1) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_2C1Z); - else if(nCol == 3 && nAux == 0) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_3C0Z); - else if(nCol == 3 && nAux == 1) - ISET(sst->fbiInit5, (IGET(sst->fbiInit5) & ~SST_BUFFER_ALLOC) | - SST_BUFFER_ALLOC_3C1Z); - else { - INIT_PRINTF(("sst1InitAllocBuffers(): Unsupported Color/Aux buffer combination (%d/%d)\n", - nCol, nAux)); - return(FXFALSE); - } - sst1InitReturnStatus(sstbase); - - return(FXTRUE); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitAllocBuffers(FxU32 *sstbase, FxU32 nColorBuffs, FxU32 nAuxBuffs) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxBool retVal; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - retVal = sst1InitAllocBuffersDirect(sstbase, - nColorBuffs, nAuxBuffs); - - if (retVal && sst1CurrentBoard->sliDetected) { - /* NB: When writing to the slave we need to make sure that it does - * not have a client callback installed. - */ - FxSet32Proc saveProc = sst1CurrentBoard->set32; - sst1CurrentBoard->set32 = NULL; - - sst1InitAllocBuffersDirect(sst1CurrentBoard->sliSlaveVirtAddr, - nColorBuffs, nAuxBuffs); - - sst1CurrentBoard->set32 = saveProc; - } - - return retVal; -} - -/* -** sst1InitVideoShutdown(): -** Shutdown video by not driving video outputs -** Do not reset the video engine -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoShutdown(FxU32 *sstbase, - FxBool switchPassThruToVGA) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_DCLK_OE_EN | SST_VIDEO_HVSYNC_OE_EN)) | SST_VIDEO_BLANK_EN); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit5, IGET(sst->fbiInit5) & ~( - SST_VIDEO_CLK_SLAVE_OE_EN | SST_VID_CLK_2X_OUT_OE_EN)); - sst1InitReturnStatus(sstbase); - - if(switchPassThruToVGA == FXTRUE) - // 2D/VGA now owns monitor... - sst1InitVgaPassCtrl(sstbase, 1); - - return(FXTRUE); -} - -/* -** sst1InitSetVidMode(): -** Set video Mode -** -*/ -FxBool sst1InitSetVidMode(FxU32 *sstbase, FxU32 video16BPP) -{ - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetVidMode(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - return(sst1InitSetVidModeINI(sstbase, video16BPP)); - } else { - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidModeATT(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidModeICS(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - return(FXTRUE); /* single board SLI - jeske */ - else - return(FXFALSE); - } -} - -/* -** sst1InitSetResolution(): -** Setup FBI video resolution registers -** This routine is used by sst1InitVideo() -** -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitSetResolution(FxU32 *sstbase, - sst1VideoTimingStruct *sstVideoRez, - FxU32 Banked) -{ - SstRegs *sst = (SstRegs *) sstbase; - - if(Banked) - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT) | - SST_DRAM_BANKING_CONFIG | SST_EN_DRAM_BANKED); - else - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_TILES_MASK) | - (((sstVideoRez->tilesInX>>1) & 0xF)<tilesInX>>5) & 0x1)<fbiInit6 = - (sst1CurrentBoard->fbiInit6 & ~SST_VIDEO_TILES_IN_X_LSB) | - ((sstVideoRez->tilesInX & 0x1)<fbiInit6, sst1CurrentBoard->fbiInit6); -} - -/* -** sst1InitSetVidClk(): -** Set video clock -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetVidClk(FxU32 *sstbase, float vidClkFreq) -{ - sst1ClkTimingStruct vidClkTiming; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - - if(helper) - - INIT_PRINTF(("sst1InitSetVidClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitComputeClkParams(vidClkFreq, &vidClkTiming) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitSetVidClk(): Setting up %.2f MHz Video Clock...\n", - vidClkFreq)); - - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidClkATT(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidClkICS(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) - return(FXTRUE); /* single board sli - jeske */ - else - return(FXFALSE); -} - -/* -** sst1InitSetGrxClk(): -** Set graphics clock -** NOTE: sst1InitSetGrxClk() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetGrxClk(FxU32 *sstbase, - sst1ClkTimingStruct *sstGrxClk) -{ - FxBool retVal = FXFALSE; - int helper = (GETENV(("SSTV2_DEBUGDAC"))) ? 1 : 0; - SstRegs *sst = (SstRegs *) sstbase; - - if(helper) - INIT_PRINTF(("sst1InitSetGrxClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitSetGrxClkINI(sstbase, sstGrxClk); - } else { - if((sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_TI)) - retVal = sst1InitSetGrxClkATT(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_ICS) - retVal = sst1InitSetGrxClkICS(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiVideoDacType == SST_FBI_DACTYPE_PROXY) { - /* single board SLI - jeske*/ - FxU32 i; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - - for (i=0;i 0) && (&sst1BoardInfo[i] == sst1CurrentBoard)) { - retVal = sst1InitSetGrxClk((FxU32 *)sst1BoardInfo[i-1].virtAddr[0], - sstGrxClk); - break; - } - } - - /* Wait for graphics clock to stabilize */ - { int n; - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - - } - } - if(retVal == FXFALSE) - return(FXFALSE); - - // Always reset TMUs after a clock change... - return(sst1InitResetTmus(sstbase)); -} - -/* -** sst1InitVideoBorder(): -** Initialize video color border -** -** The 'mask' parameter specifies which border(s) to enable: -** SST_COLOR_BORDER_LEFT_EN: Left edge -** SST_COLOR_BORDER_RIGHT_EN: Right edge -** SST_COLOR_BORDER_TOP_EN: Top edge -** SST_COLOR_BORDER_BOTTOM_EN: Bottom edge -** The 'color' parameter is in XXRRGGBB format -** -** Returns: -** FXTRUE if successfully initializes video color border -** FXFALSE if cannot initialize video color border -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideoBorder(FxU32 *sstbase, - FxU32 mask, - FxU32 color) -{ - - FxU32 fbiInit5; - SstRegs *sst = (SstRegs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitVideoBorder(): Setting border color to 0x%x...\n", - color)); - - fbiInit5 = IGET(sst->fbiInit5) & - ~(SST_COLOR_BORDER_LEFT_EN | SST_COLOR_BORDER_RIGHT_EN | - SST_COLOR_BORDER_TOP_EN | SST_COLOR_BORDER_BOTTOM_EN); - fbiInit5 |= - (mask & SST_COLOR_BORDER_LEFT_EN) ? SST_COLOR_BORDER_LEFT_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_RIGHT_EN) ? SST_COLOR_BORDER_RIGHT_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_TOP_EN) ? SST_COLOR_BORDER_TOP_EN : 0; - fbiInit5 |= - (mask & SST_COLOR_BORDER_BOTTOM_EN) ? SST_COLOR_BORDER_BOTTOM_EN : 0; - - ISET(sst->borderColor, color); - ISET(sst->fbiInit5, fbiInit5); - - return(FXTRUE); -} - -/* -** sst1InitFindVideoTimingStruct(): -** Find SST-1 video timing data structure from GrScreenResolution_t and -** GrScreenRefresh_t input params -** -*/ - -FX_EXPORT sst1VideoTimingStruct* FX_CSTYLE -sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh) -{ - GrScreenResolution_t screenRez = screenResolution; - GrScreenRefresh_t refreshRate = screenRefresh; - - // Override Screen resolution with environment variables - if(GETENV(("SSTV2_SCREENREZ"))) { - FxU32 screenRezEnv = ATOI(GETENV(("SSTV2_SCREENREZ"))); - - switch(screenRezEnv) { - case 512256: - screenRez = GR_RESOLUTION_512x256; - break; - case 512: - screenRez = GR_RESOLUTION_512x384; - break; - case 640400: - screenRez = GR_RESOLUTION_640x400; - break; - case 800: - screenRez = GR_RESOLUTION_800x600; - break; - case 856: - screenRez = GR_RESOLUTION_856x480; - break; - case 960: - screenRez = GR_RESOLUTION_960x720; - break; - case 1024: - screenRez = GR_RESOLUTION_1024x768; - break; - default: - screenRez = GR_RESOLUTION_640x480; - break; - } - } - - // Override Screen resolution with environment variables - if(GETENV(("SSTV2_SCREENREFRESH"))) { - FxU32 refreshRateEnv = ATOI(GETENV(("SSTV2_SCREENREFRESH"))); - - switch(refreshRateEnv) { - case 75: - refreshRate = GR_REFRESH_75Hz; - break; - case 85: - refreshRate = GR_REFRESH_85Hz; - break; - case 120: - refreshRate = GR_REFRESH_120Hz; - break; - default: - refreshRate = GR_REFRESH_60Hz; - break; - } - } - - switch(screenRez) { - - case(GR_RESOLUTION_512x256): - return(&SST_VREZ_512X256_60); - break; - - case(GR_RESOLUTION_512x384): - - if( GETENV( ("SSTV2_REFRESH_512x384") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_512x384") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_512X384_120); - else if(refreshRate == GR_REFRESH_85Hz) { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_85_NOSCANDOUBLE); - else - return(&SST_VREZ_512X384_85); - } else if(refreshRate == GR_REFRESH_75Hz) { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_75_NOSCANDOUBLE); - else - return(&SST_VREZ_512X384_75); - } else { - if(sst1CurrentBoard->sliDetected) - return(&SST_VREZ_512X384_72); - else - return(&SST_VREZ_512X384_60); - } - break; - - case(GR_RESOLUTION_640x400): - - if( GETENV( ("SSTV2_REFRESH_640x400") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_640x400") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_640X400_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_640X400_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_640X400_75); - else - return(&SST_VREZ_640X400_70); - break; - - case(GR_RESOLUTION_640x480): - - if( GETENV( ("SSTV2_REFRESH_640x480") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_640x480") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_640X480_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_640X480_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_640X480_75); - else - return(&SST_VREZ_640X480_60); - break; - - case(GR_RESOLUTION_800x600): - - if( GETENV( ("SSTV2_REFRESH_800x600") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_800x600") ) ) ); - - if(refreshRate == GR_REFRESH_120Hz) - return(&SST_VREZ_800X600_120); - else if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_800X600_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_800X600_75); - else - return(&SST_VREZ_800X600_60); - break; - - case(GR_RESOLUTION_856x480): - return(&SST_VREZ_856X480_60); - break; - - case(GR_RESOLUTION_960x720): - if( GETENV( ("SSTV2_REFRESH_960x720") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_960x720") ) ) ); - - if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_960X720_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_960X720_75); - else - return(&SST_VREZ_960X720_60); - break; - - case(GR_RESOLUTION_1024x768): - - if( GETENV( ("SSTV2_REFRESH_1024x768") ) ) - refreshRate = sst1InitConvertRefreshRate( ATOI( GETENV( ("SSTV2_REFRESH_1024x768") ) ) ); - - if(refreshRate == GR_REFRESH_85Hz) - return(&SST_VREZ_1024X768_85); - else if(refreshRate == GR_REFRESH_75Hz) - return(&SST_VREZ_1024X768_75); - else - return(&SST_VREZ_1024X768_60); - break; - -#ifdef H3D - /* In the following cases, sli can't handle line doubled LD modes */ - /* therefore, we need to return a non-line doubled mode if we're */ - /* sli-ing */ - - case (GR_RESOLUTION_640x240_AUTOFLIPPED): - case (GR_RESOLUTION_640x480_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_640X960_60); - else - return(&SST_VREZ_640X960LD_60); - break; - - case (GR_RESOLUTION_800x300_AUTOFLIPPED): - case (GR_RESOLUTION_800x600_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_800X630_60); - else - return(&SST_VREZ_800X1200LD_45); - break; - - case (GR_RESOLUTION_960x360_AUTOFLIPPED): - case (GR_RESOLUTION_960x720_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_960X742_60); - else - return((sst1VideoTimingStruct *) NULL); - break; - - case (GR_RESOLUTION_1024x384_AUTOFLIPPED): - case (GR_RESOLUTION_1024x768_AUTOFLIPPED): - if (sst1CurrentBoard->sliDetected) - return(&SST_VREZ_1024X768_60); - else - return((sst1VideoTimingStruct *) NULL); - break; - -#endif - - default: - INIT_PRINTF(("sst1InitFindVideoTimingStruc(): Unsupported Resolution...\n")); - return((sst1VideoTimingStruct *) NULL); - break; - } -} - -FxU32 sst1InitConvertRefreshRate( FxU32 refreshRate ) -{ - switch( refreshRate ) - { - case 75: - return( GR_REFRESH_75Hz ); - case 85: - return( GR_REFRESH_85Hz ); - case 120: - return( GR_REFRESH_120Hz ); - default: - return( GR_REFRESH_60Hz ); - } -} - -/* -** -** sst1InitMonitorDetect() -** Detect whether or not a monitor is connected to the board -** -*/ - -FX_EXPORT FxBool FX_CSTYLE sst1InitMonitorDetect(FxU32 *sstbase) -{ - SstRegs *sst = (SstRegs *) sstbase; - FxU32 gammaArray[32]; - FxU32 j, k; - FxU32 gammaCorrectConstant = 0x5c; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* check to see if we are a single board SLI slave, and if - * so, then don't detect a monitor - jeske - */ - //if (sst1CurrentBoard->singleBrdSLISlave) { - // sst1CurrentBoard->monitorDetected = 0; - // return (FXTRUE); - // } - - if(GETENV(("SSTV2_MDETECT_CONST"))) { - SSCANF(GETENV(("SSTV2_MDETECT_CONST")), "%ld", &gammaCorrectConstant); - INIT_PRINTF(("sst1InitMonitorDetect(): Using value 0x%x for constant gamma value...\n", gammaCorrectConstant)); - } - - // Force gamma to always output clearColor value... - for(j=0; j<32; j++) - gammaArray[j] = gammaCorrectConstant; - //gammaArray[j] = 0xff; // 0xff never detects monitor... - //gammaArray[j] = 0x0; // 0x0 always detects monitor... - sst1InitGammaTable(sstbase, 32, gammaArray, gammaArray, gammaArray); - - // Wait for for monitor to sync... - sst1InitIdle(sstbase); - for(k=0; k<(sst1CurrentBoard->fbiVideoRefresh>>2); k++) { - // Wait for inactive vsync... - do { - j = IGET(sst->status); - } while(!(j & SST_VRETRACE)); - - // Wait for active vsync - do { - j = IGET(sst->status); - } while(j & SST_VRETRACE); - } - - while(1) { - FxU32 firstInit6 = IGET(sst->fbiInit6) & SST_GPIO_3; - FxU32 hvRetrace = IGET(sst->hvRetrace); - FxU32 vBeam = hvRetrace & 0x1fff; - FxU32 hBeam = (hvRetrace>>16) & 0x7ff; - FxU32 secondInit6 = IGET(sst->fbiInit6) & SST_GPIO_3; - - if((vBeam > (sst1CurrentBoard->fbiVideoStruct->vBackPorch + 10)) && - (vBeam < (sst1CurrentBoard->fbiVideoStruct->vBackPorch + - sst1CurrentBoard->fbiVideoHeight - 10)) && - (hBeam > (sst1CurrentBoard->fbiVideoStruct->hBackPorch + - sst1CurrentBoard->fbiVideoStruct->hSyncOn + 10)) && - (hBeam < (sst1CurrentBoard->fbiVideoStruct->hBackPorch + - sst1CurrentBoard->fbiVideoStruct->hSyncOn + - sst1CurrentBoard->fbiVideoWidth - 10))) { - if(firstInit6 == secondInit6) { - if(firstInit6) - sst1CurrentBoard->monitorDetected = 1; - else - sst1CurrentBoard->monitorDetected = 0; - break; - } - } - } - - - // Override with environment variable... - if(GETENV(("SSTV2_MDETECT"))) - sst1CurrentBoard->monitorDetected = - (ATOI(GETENV(("SSTV2_MDETECT")))) ? 1 : 0; - - return(FXTRUE); -} - -/* -** -** sst1InitSetClkDelays(): -** Calculate FT, TF0, and TF1 clock delay values... -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetClkDelays(FxU32 *sstbase) -{ - FxU32 tf0_clkdel, tf1_clkdel, tf2_clkdel, ft_clkdel; - SstRegs *sst = (SstRegs *) sstbase; - - if(sst1CurrentBoard->fbiBoardID == 0x3) { - // Early 4-layer 4220 board -- Runs at 83 MHz by default... - if(sst1CurrentBoard->fbiGrxClkFreq <= 80) { - ft_clkdel = 0x5; - tf0_clkdel = 0x7; - tf1_clkdel = 0x8; - tf2_clkdel = 0x8; - } else { - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x7; - tf2_clkdel = 0x7; - } - goto setDelays; - } - - if(GETENV(("SSTV2_IGNORE_CLKDELAYS"))) { - INIT_PRINTF(("sst1InitSetClkDelays() WARNING: Bypassing dynamic clock delay detection...\n")); - ft_clkdel = 0x4; - tf0_clkdel = 0x6; - tf1_clkdel = 0x6; - tf2_clkdel = 0x6; - goto setDelays; - } - - // FT Clock Delay... - if(sst1CurrentBoard->fbiNandTree < 5000) - // Account for very slow processes... - ft_clkdel = 0x3; - else - ft_clkdel = 0x4; - - { - const char - *tf2Str = GETENV("SSTV2_INIT_TF2_RESET_DELAY"), - *tf1Str = GETENV("SSTV2_INIT_TF1_RESET_DELAY"), - *tf0Str = GETENV("SSTV2_INIT_TF0_RESET_DELAY"); - const FxU32 - tf2 = ((tf2Str == NULL) ? 11 : atoi(tf2Str)), - tf1 = ((tf1Str == NULL) ? 11 : atoi(tf1Str)), - tf0 = ((tf0Str == NULL) ? 9 : atoi(tf0Str)); - - // TF2 Clock Delay... - if(sst1CurrentBoard->numberTmus > 2) { - if(sst1InitCalcTClkDelay(sstbase, 2, tf2) == FXTRUE) - // Test failed. Fast process TMUs... - tf2_clkdel = 0x7; - else - tf2_clkdel = 0x6; - } else - tf2_clkdel = 0x6; - - // TF1 Clock Delay... - if(sst1CurrentBoard->numberTmus > 1) { - if(sst1InitCalcTClkDelay(sstbase, 1, tf1) == FXTRUE) - // Test failed. Fast process TMUs... - tf1_clkdel = 0x7; - else - tf1_clkdel = 0x6; - } else - tf1_clkdel = 0x6; - - // Reset FBI & TMU, and put TF1 clock delay value back to default... - if(sst1InitResetTmus(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitSetClkDelays() ERROR(1): Could not reset TMUs...\n")); - return(FXFALSE); - } - - // TF0 Clock Delay... - if(sst1InitCalcTClkDelay(sstbase, 0, tf0) == FXTRUE) - // Test failed. Fast process TMUs... - tf0_clkdel = 0x7; - else - tf0_clkdel = 0x6; - } - - // Reset FBI & TMU, and put TF0 clock delay value back to default... - if(sst1InitResetTmus(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitSetClkDelays() ERROR(2): Could not reset TMUs...\n")); - return(FXFALSE); - } - - // Adjust for lower frequencies... - if(sst1CurrentBoard->fbiGrxClkFreq < 80) { - ft_clkdel++; - tf0_clkdel++; - tf1_clkdel++; - tf2_clkdel++; - } - -setDelays: - - // Override with environment variables - if(GETENV(("SSTV2_FT_CLKDEL"))) - SSCANF(GETENV(("SSTV2_FT_CLKDEL")), "%ld", &ft_clkdel); - if(GETENV(("SSTV2_TF0_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF0_CLKDEL")), "%ld", &tf0_clkdel); - if(GETENV(("SSTV2_TF1_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF1_CLKDEL")), "%ld", &tf1_clkdel); - if(GETENV(("SSTV2_TF2_CLKDEL"))) - SSCANF(GETENV(("SSTV2_TF2_CLKDEL")), "%ld", &tf2_clkdel); - - INIT_PRINTF(("sst1InitSetClkDelays(): Setting FBI-to-TREX clock delay to 0x%x...\n", ft_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#0 TREX-to-FBI clock delay to 0x%x\n", - tf0_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#1 TREX-to-FBI clock delay to 0x%x\n", - tf1_clkdel)); - INIT_PRINTF(("sst1InitSetClkDelays(): Setting TREX#2 TREX-to-FBI clock delay to 0x%x\n", - tf2_clkdel)); - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clkdel << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clkdel<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clkdel<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clkdel< -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** guFbReadRegion -*/ -GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) ) -{ - int x, y; - FxU32 *lfbPtr, lfbReadAddr; - FxU32 *longPtr; - unsigned char *charPtr; - unsigned short *shortPtr; - - GR_BEGIN_NOFIFOCHECK("guFbReadRegion",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d, 0x%x,%d)\n",srcX,srcY,w,h,dst,strideInBytes); - GR_CHECK_F(myName, - (srcX < 0) || ((srcX + w) > (float) gc->state.screen_width), - "invalid combination of x & w"); - GR_CHECK_F(myName, - (srcY < 0) || ((srcY + h) > (float) gc->state.screen_height), - "invalid combination of y & h"); - GR_CHECK_F(myName, strideInBytes&1, "strideInBytes not a multiple of 2" ); - - grSstIdle(); - charPtr = (unsigned char *) dst; - lfbReadAddr = (FxU32) gc->lfb_ptr; - for(y=srcY; y<(srcY+h); y++) { - x = srcX; - shortPtr = (unsigned short *) charPtr; - lfbPtr = (FxU32 *) (lfbReadAddr + (y << 11) + ((x&0x3fe) << 1)); - - /* Left Edge */ - if(x & 1) { - x++; - *shortPtr++ = (unsigned short) (GR_GET(*lfbPtr++) >> 16); - } - - /* Middle */ - longPtr = (FxU32 *) shortPtr; - for( ; x < (srcX+w-1); x+=2) - *longPtr++ = GR_GET(*lfbPtr++); - - /* Right Edge */ - if(x < (srcX+w)) { - shortPtr = (unsigned short *) longPtr; - *shortPtr = (unsigned short) GR_GET(*lfbPtr); - } - charPtr = (unsigned char *) ((FxU32) charPtr + (FxU32) strideInBytes); - } /* Y loop */ - - GR_END(); -} /* guFbReadRegion */ - -/*--------------------------------------------------------------------------- -** guFbWriteRegion -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -** so grLfbWriteColorSwizzle() might break things -*/ -GR_ENTRY(guFbWriteRegion, void, - ( const int dstX, const int dstY, - const int w, const int h, - const void *src, const int strideInBytes)) -{ - FxU32 - lfbMode; /* lfbMode SST-1 register */ - int x,y=h; - - GR_BEGIN_NOFIFOCHECK("guFbWriteRegion",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d, 0x%x,%d)\n",dstX,dstY,w,h,src,strideInBytes); - GR_CHECK_F(myName, - (dstX < 0) || ((dstX + w) > (float) gc->state.screen_width), - "invalid combination of x & w"); - GR_CHECK_F(myName, - (dstY < 0) || ((dstY + h) > (float) gc->state.screen_height), - "invalid combination of y & h"); - GR_CHECK_F(myName, strideInBytes&1, "strideInBytes not a multiple of 2" ); - - /* - ** Get the format bits out of the lfbMode shadow register to determine - ** the size of pixels written to the frame buffer - */ - lfbMode = gc->state.fbi_config.lfbMode; - - /* We'll be reading an FxU32 at a time, so determine the pixel - ** increment by dividing the pixelSize by the size of FxU32 - */ - if ((lfbMode & SST_LFB_FORMAT) < GR_LFBWRITEMODE_888) { - FxU16 *lfbPtr; /* pointer for storing to lfb */ - const FxU16 *src16 = src; - - lfbPtr = (FxU16 *) (((FxU32) gc->lfb_ptr) + (dstY << 11) + (dstX << 1)); - while (y-- > 0) { /* for each row */ - /* 16-bit source pixels - * There are 2 cases that we have, - * 1) src & dst are offset by one short (see code below) - * 2) src & dst are aligned together - */ - GR_SET_EXPECTED_SIZE((((dstX & 0x01) + /* Unaligned start dest pixel */ - (w >> 1) + /* Aligned dest pixels */ - (w & 0x01)) << 2), /* Unaligned end src pixel */ - ((dstX & 0x01) + (w >> 1) + (w & 0x01))); - { - /* case 2) left, middle, right */ - x = 0; - if (dstX & 1) { - GR_SET16(lfbPtr[0], src16[0]); - x++; - } - - for (; x < w - 1; x += 2) GR_SET(*(FxU32*)&(lfbPtr[x]), *(const FxU32*)&(src16[x])); - if (x < w) GR_SET16(lfbPtr[w - 1], src16[w - 1]); - } - GR_CHECK_SIZE(); - - /* advance to next src and dst rows */ - src16 += (strideInBytes >> 1); - lfbPtr += 1024; - } - - } else { /* 32-bit source pixels */ - FxU32 *lfbPtr; /* pointer for storing to lfb */ - const FxU32 *src32 = src; - - GR_CHECK_F(myName, strideInBytes&2, "strideInBytes not a multiple of 4" ); - - lfbPtr = (FxU32 *) (((FxU32) gc->lfb_ptr) + (dstY << 12) + (dstX << 2)); - while (y-- > 0) { /* for each row */ - GR_SET_EXPECTED_SIZE(w << 2, w); - { - for (x = 0; x < w; x++) GR_SET(lfbPtr[x], src32[x]); - } - GR_CHECK_SIZE(); - - /* advance to next src and dst rows */ - src32 += strideInBytes >> 2; - lfbPtr += 1024; - } - } - GR_END(); -} /* guFbWriteRegion */ - diff --git a/glide2x/h3/glide/src/ddgump.c b/glide2x/h3/glide/src/ddgump.c deleted file mode 100644 index b06051c..0000000 --- a/glide2x/h3/glide/src/ddgump.c +++ /dev/null @@ -1,597 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:25 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 15 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 14 12/15/97 5:51p Atai - * disable obsolete glide2 api for glide3 - * - * 13 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 12 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 11 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 10 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 9 10/27/97 1:16p Peter - * fixed silliness - * - * 8 10/27/97 11:10a Peter - * starting cleanup - * - * 7 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 6 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 5 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 4 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 3 5/21/97 6:04a Peter - * - * 2 3/04/97 9:08p Dow - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -/* gump.c */ -extern GrMPState _gumpState; - -#ifndef GLIDE3_ALPHA -/* -** _gumpTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DDFUNC(_gumpTexCombineFunction, void, (int virtual_tmu)) -{ -#define FN_NAME "_gumpTexCombineFunction" - FxU32 texmode; - GrMPTextureCombineFnc_t tc; - - GR_BEGIN_NOFIFOCHECK("_gumpTexCombineFunction",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",virtual_tmu); - - texmode = gc->state.tmu_config[0].textureMode; - texmode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tc = _gumpState.tc_fnc; - - switch (tc) { - case GR_MPTEXTURECOMBINE_ADD: - /* tmu0: other + local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } else { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } - break; - - case GR_MPTEXTURECOMBINE_MULTIPLY: - /* tmu0: other * local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } else { - texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE); - } - break; - - case GR_MPTEXTURECOMBINE_DETAIL0: - /* tmu0: (other - local) * lod + local */ - /* = lod * other + (1 - lod) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lod + local */ - /* = (1 - lod) * local */ - /* pass1(tm1): (-local) * (1 - lod) + local */ - /* = lod * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_DETAIL1: - /* tmu0: (other - local) * (1 - lod) + local */ - /* = (1 - lod) * other + lod * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * (1 - lod) + local */ - /* = lod * local */ - /* pass1(tm1): (-local) * lod + local */ - /* = (1 - lod) * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_TRILINEAR0: - /* tmu0: (other - local) * lodbfrac + local */ - /* = lodbfrac * other + (1 - lodbfrac) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lodbfrac + local */ - /* = (1 - lodbfrac) * local */ - /* pass1(tm1): (-local) * (1 - lodbfrac) + local */ - /* = lodbfrac * local */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_TRILINEAR1: - /* tmu0: (other - local) * (1 - lodbfrac) + local - = (1 - lodbfrac) * other + lodbfrac * local - tmu1: local - pass0(tm0): (-local) * (1 - lodbfrac) + local - = lodbfrac * local - pass1(tm1): (-local) * lodbfrac + local - = (1 - lodbfrac) * local - */ - if (virtual_tmu == 0) { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } else { - texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER); - } - break; - - case GR_MPTEXTURECOMBINE_SUBTRACT: - /* - tmu0: other - local - tmu1: local - doesn't work, alpha blender can't subtract - */ - GrErrorCallback("_gumpTexCombineFunction: TEXTURE_SUBTRACT not supported", FXFALSE); - return; - break; - - default: - GrErrorCallback("_gumpTexCombineFunction: Unsupported function", FXFALSE); - return; - break; - } - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - { - SstRegs* tmuRegs = SST_TMU(hw, 0); - - GR_SET(eChipTMU0, tmuRegs, textureMode, texmode); - } - GR_CHECK_SIZE(); - - GR_END(); -#undef _gumpTexCombineFunction -} /* _gumpTexCombineFunction */ - -GR_ENTRY(guMPDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -{ - GR_BEGIN_NOFIFOCHECK("guMPDrawTriangle",98); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - /* check for multipass texture modes */ - /* xxx complex multipass mode checks should be moved into gtex/gglide */ - /* specific color combine modes use texture */ - /* this is equivalent to - fbzColorPath & SST_ENTEXTREMAP - cc_state & STATE_CC_REQUIRES_DECAL_STW */ - /* specific texture combine modes */ - /* xxx don't even check anymore, because you can't */ - - { - /* check for not possible on one tmu modes */ - /* alpha blend enabled (grAlphaBlendMode) - xxx some can work, with some cheats, even more - low bit alpha switches between iterated and constant rgb - (grAlphaControlsITRGBLighting) - alpha test (grAlphaTestFunction) - xxx actually, NEVER is ok too - chromakey - */ - - if ((gc->state.fbi_config.alphaMode & SST_ENALPHABLEND) || - (gc->state.fbi_config.fbzColorPath & SST_LOCALSELECT_OVERRIDE_WITH_ATEX) || - (gc->state.fbi_config.alphaMode & SST_ENALPHAFUNC) || - (gc->state.fbi_config.fbzMode & SST_ENCHROMAKEY)) { - GrErrorCallback("guMPDrawTriangle: Illegal state", FXFALSE); - } - - if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_ADD || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL1 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR1) { - /* render pass with all effects */ - /* select other texture map */ - /* set alpha blend to add to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine bias */ - /* render other pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig = 0; - FxU32 fogmode, fogmode_orig = 0; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - GR_CHECK_SIZE(); - - /* first pass */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[0]); - _gumpTexCombineFunction(0); - - /* render first pass */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* second pass */ - - /* xxx may need to copy texture coordinates, see - grTexCombineFunction's second parameter. if so, - we have to disable the second coordinate when drawing. */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[1]); - _gumpTexCombineFunction(1); - - { - const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER); - const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING); - const FxU32 regCount = (2 + depthP + fogP); - const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL)); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if (fogP) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - - REG_GROUP_SET(hw, fogMode, fogmode); - } - - /* enable alpha blend to add to destination buffers */ - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT)); - - REG_GROUP_SET(hw, alphaMode, alphamode); - - /* if depth buffering, set to z= mode and disable writes */ - if (depthP) { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - REG_GROUP_SET(hw, fbzMode, fbzmode); - } - } - REG_GROUP_END(); - - /* render other pass */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* restore */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* restore ccu/acu state */ - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig); - - /* restore fog state */ - if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig); - - /* restore alpha blending state */ - REG_GROUP_SET(hw, alphaMode, alphamode_orig); - - /* restore depth buffer state */ - if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig); - } - REG_GROUP_END(); - } - - goto all_done; - } else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_MULTIPLY) { - /* disable fog and color combine bias */ - /* render pass with all other effects */ - /* select other texture map */ - /* set alpha blend to multiply to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine factor */ - /* render other pass */ - /* if fog or color combine w/bias */ - /* disable tmu */ - /* set alpha blend to add to dest buffer */ - /* enable fog and color combine bias */ - /* render bias pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig = 0; - FxU32 fogmode, fogmode_orig = 0; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - - /* first pass */ - - /* tmu setup */ - - guTexSource(_gumpState.mmid[0]); - _gumpTexCombineFunction(0); - - /* disable bias */ - { - const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER); - const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING); - const FxU32 regCount = (2 + depthP + fogP); - const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL)); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, (1 + fogP), (0x01UL | MaskSelect(fogP, 0x02UL))); - { - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx consult add path for switch version */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if (fogP) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - - REG_GROUP_SET(hw, fogMode, fogmode); - } - } - REG_GROUP_END(); - - /* render first pass */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* second pass */ - /* xxx may sometimes need to copy texture coordinates */ - - /* tmu setup */ - guTexSource(_gumpState.mmid[1]); - _gumpTexCombineFunction(1); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* disable factor and bias in color combine-- - decal, except for the cases that need texture alpha */ - /* this can change the parameters output */ - fbzcolorpath = fbzcolorpath_orig; - fbzcolorpath &= ~( SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT | - SST_CC_REVERSE_BLEND ); - - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA ) - { - xxx see implementation notes on why this isn't implemented yet - GrErrorCallback("guDrawTriangleMP: " - "MULTIPLY and BLEND_ITRGB_ON_TEXALPHA not implemented yet!", FXFALSE ); - goto all_done; - } - */ - fbzcolorpath |= SST_RGBSEL_TMUOUT; - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath); - - /* disable fog */ - if (fogP) REG_GROUP_SET(hw, fogMode, 0); - - /* enable alpha blend to multiply to destination buffers */ - /* xxx alpha component blender can only handle factors of - 0 and 1 */ - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_COLOR << SST_RGBSRCFACT_SHIFT) | - (SST_A_ZERO << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ZERO << SST_ADSTFACT_SHIFT)); - - REG_GROUP_SET(hw, alphaMode, alphamode); - - /* if depth buffering, set to z= mode and disable writes */ - if (depthP) { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - REG_GROUP_SET(hw, fbzMode, fbzmode); - } - } - REG_GROUP_END(); - - /* render second pass */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - - /* if bias, third pass */ - if (fogP) { - /* enable alpha blend to add to destination buffers */ - REG_GROUP_BEGIN(BROADCAST_ID, fogMode, 2, 0x03); - { - /* disable fog factor, leave fog bias enabled */ - /* xxx setting ADD_MULT with fog disabled is harmless */ - fogmode = fogmode_orig; - fogmode |= SST_FOGMULT; - REG_GROUP_SET(hw, fogMode, fogmode); - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= (SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT)); - REG_GROUP_SET(hw, alphaMode, alphamode); - } - REG_GROUP_END(); - - /* render third pass */ -#ifdef GLIDE3 - grDrawTriangle((void *)a, (void *)b, (void *)c); -#else - grDrawTriangle(a, b, c); -#endif - } - - REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask); - { - /* restore ccu/acu state */ - REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig); - - /* restore fog state */ - if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig); - - /* restore alpha blending state */ - REG_GROUP_SET(hw, alphaMode, alphamode_orig); - - /* restore depth buffer state */ - if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig); - } - REG_GROUP_END(); - } - - goto all_done; - } else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_SUBTRACT) { - GrErrorCallback("gumpDrawTriangle: GR_MPTEXCOMBINE_SUBTRACT not implemented", FXFALSE); - goto all_done; - } - } - -all_done: - GR_END(); -} - -#endif /* GLIDE3_ALPHA */ diff --git a/glide2x/h3/glide/src/diglide.c b/glide2x/h3/glide/src/diglide.c deleted file mode 100644 index 6f0fbbb..0000000 --- a/glide2x/h3/glide/src/diglide.c +++ /dev/null @@ -1,400 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 38 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 37 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 36 3/28/98 11:24a Dow -** itwoç -** -** 35 1/20/98 10:50a Atai -** validate state in grGlideGetState - * - * 33 1/07/98 10:22a Peter - * lod dithering env var - * - * 32 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 31 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 30 12/09/97 12:20p Peter - * mac glide port - * - * 29 12/01/97 5:46p Peter - * fixed variable names in swizzle - * - * 28 12/01/97 5:17p Peter - * - * 27 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 26 11/14/97 5:02p Peter - * more comdex stuff - * - * 25 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 24 11/12/97 2:27p Peter - * - * 23 11/12/97 11:39a Dow - * H3 Stuff - * - * 22 11/12/97 9:21a Dow - * Changed CVG_FIFO to USE_PACKET_FIFO - * - * 21 11/04/97 4:00p Dow - * Banshee Mods - * - * 20 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 19 10/16/97 3:40p Peter - * packed rgb - * - * 18 9/20/97 10:53a Peter - * keep track of palette stats - * - * 17 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 16 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 15 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 14 7/08/97 2:48p Peter - * - * 13 6/30/97 3:20p Peter - * error callback - * - * 12 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree - * -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -/* the root of all EVIL */ -struct _GlideRoot_s GR_CDECL _GlideRoot; -/* This is global to speed up the function call wrappers */ - -/*--------------------------------------------------------------------------- -** -*/ -void -_grDisplayStats(void) -{ - int frames = _GlideRoot.stats.bufferSwaps; - - if (frames <= 0) frames = 1; - gdbg_info(80,"GLIDE STATISTICS:\n"); - gdbg_info(80," triangles processed: %7d tris drawn: %7d\n", - _GlideRoot.stats.trisProcessed, - _GlideRoot.stats.trisDrawn); - gdbg_info(80," buffer swaps: %7d tris/frame: %7d , %d\n", - _GlideRoot.stats.bufferSwaps, - _GlideRoot.stats.trisProcessed/frames, - _GlideRoot.stats.trisDrawn/frames); - gdbg_info(80," points: %7d pnts/frame: %7d\n", - _GlideRoot.stats.pointsDrawn, - _GlideRoot.stats.pointsDrawn/frames); - gdbg_info(80," lines: %7d lines/frame: %7d\n", - _GlideRoot.stats.linesDrawn, - _GlideRoot.stats.linesDrawn/frames); - gdbg_info(80," texture downloads: %7d texture bytes: %7d\n", - _GlideRoot.stats.texDownloads, _GlideRoot.stats.texBytes); - gdbg_info(80," palette downloads: %7d palette bytes: %7d\n", - _GlideRoot.stats.palDownloads, _GlideRoot.stats.palBytes); - gdbg_info(80," NCC downloads: %7d NCC bytes: %7d\n", - _GlideRoot.stats.nccDownloads, _GlideRoot.stats.nccBytes); - -#if USE_PACKET_FIFO - gdbg_info(80,"\tCommandFifo:\n"); - gdbg_info(80,"\t\tWraps: %ld\n", _GlideRoot.stats.fifoWraps); - if (_GlideRoot.stats.fifoWraps > 0) { - gdbg_info(80,"\t\tAvg Drain Depth: %g\n", - (double)_GlideRoot.stats.fifoWrapDepth / _GlideRoot.stats.fifoWraps); - } - gdbg_info(80,"\t\tStalls: %ld\n", _GlideRoot.stats.fifoStalls); - if (_GlideRoot.stats.fifoStalls > 0) { - gdbg_info(80,"\t\tAvg Stall Depth: %g\n", - (double)_GlideRoot.stats.fifoStallDepth / _GlideRoot.stats.fifoStalls); - } -#endif /* CVG_FIFO */ - -#if GLIDE_FP_CLAMP - gdbg_info(80, "\tTSU Value Clamping failures: %7ld\n", _GlideRoot.stats.tsuValClamp); -#if HOOPTI_TRI_SETUP_COMPARE - gdbg_info(80, "\tTSU Exponent Clamping failures: %7ld\n", _GlideRoot.stats.tsuExpClamp); -#endif /* HOOPTI_TRI_SETUP_COMPARE */ -#endif /* GLIDE_FP_CLAMP */ -} - -#if !USE_PACKET_FIFO -/* -** fifoFree is kept in bytes, each fifo entry is 8 bytes, but since there -** are headers involved, we assume an average of 2 registers per 8 bytes -** or 4 bytes of registers stored in every fifo entry -*/ -void -_grReCacheFifo(FxI32 n) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_H3) - GR_DCL_GC; - gc->state.fifoFree = ((grSstStatus() >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff)<<2; -#endif -} - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n) -{ - GR_DCL_GC; - do { - _grReCacheFifo(n); - } while (gc->state.fifoFree < 0); - return gc->state.fifoFree; -} -#endif /* !USE_PACKET_FIFO */ - -/*--------------------------------------------------------------------------- -** -*/ -void -_grSwizzleColor(GrColor_t *color) -{ - GR_DCL_GC; - FxU32 red, green, blue, alpha; - - switch(gc->state.color_format) { - case GR_COLORFORMAT_ARGB: - break; - - case GR_COLORFORMAT_ABGR: - red = *color & 0x00ff; - blue = (*color >> 16) & 0xff; - *color &= 0xff00ff00; - *color |= ((red << 16) | blue); - break; - - case GR_COLORFORMAT_RGBA: - blue = (*color & 0x0000ff00) >> 8; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0xff000000) >> 24; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - case GR_COLORFORMAT_BGRA: - blue = (*color & 0xff000000) >> 24; - green = (*color & 0x00ff0000) >> 16; - red = (*color & 0x0000ff00) >> 8; - alpha = (*color & 0x000000ff); - *color = (alpha << 24) | (red << 16) | (green << 8) | blue; - break; - - default: - GR_ASSERT(0); - break; - } -} /* _grSwizzleColor */ - -/*--------------------------------------------------------------------------- -** grGlideGetVersion -** NOTE: allow this to be called before grGlideInit() -*/ -GR_DIENTRY(grGlideGetVersion, void, (char version[80])) -{ - GDBG_INFO(87,"grGlideGetVersion(0x%x) => \"%s\"\n",version,glideIdent+3); - GR_ASSERT(version != NULL); - strcpy(version,glideIdent+3); -} /* grGlideGetVersion */ - -/*--------------------------------------------------------------------------- -** grGlideGetState -*/ -GR_DIENTRY(grGlideGetState, void, (GrState *state)) -{ - GR_BEGIN_NOFIFOCHECK("grGlideGetState",87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - GR_ASSERT(state != NULL); -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - *state = gc->state; - GR_END(); -} /* grGlideGetState */ - -#ifndef GLIDE_ALPHA -/*--------------------------------------------------------------------------- -** grHints -*/ -GR_DIENTRY(grHints, void, (GrHint_t hintType, FxU32 hints)) -{ - GR_BEGIN_NOFIFOCHECK("grHints",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",hintType,hints); - - switch (hintType) { - case GR_HINT_STWHINT: - if (gc->state.paramHints != hints) { - gc->state.paramHints = hints; - _grUpdateParamIndex(); - } - break; - - case GR_HINT_FIFOCHECKHINT: - /* swFifoLWM is kept internally in bytes, hints are in fifo entries */ - gc->state.checkFifo = hints; - break; - - case GR_HINT_FPUPRECISION: - hints ? double_precision_asm() : single_precision_asm(); - break; - - case GR_HINT_ALLOW_MIPMAP_DITHER: - /* Regardless of the game hint, force the user selection */ - gc->state.allowLODdither = ((_GlideRoot.environment.texLodDither != 0) || - hints); - break; - case GR_HINT_ENABLE_UMA: - _GlideRoot.environment.enUma = (hints) ? FXTRUE : FXFALSE; - break; - default: - GR_CHECK_F(myName, 1, "invalid hints type"); - } - GR_END(); -} /* grHints */ -#endif - -/*--------------------------------------------------------------------------- -** grGlideInit -*/ -GR_DIENTRY(grGlideInit, void, (void)) -{ - GDBG_INIT(); - - GDBG_INFO(80,"grGlideInit()\n"); - _GlideInitEnvironment(); /* the main init code */ - FXUNUSED(*glideIdent); - -#if GDBG_INFO_ON - gdbg_error_set_callback(_grErrorCallback); -#endif - -#if USE_PACKET_FIFO && (WTF_P_COMDEX || WTF_P_COMDEX_RESET) - /* Work around for apps that call some grXXX state call - * before calling grSstWinOpen which inits the command fifo. - * See gsst.c:grSstWinOpen for more of this. - */ - { - const FxBool fifoSwapP = _grDummyFifo(FXTRUE); - GR_ASSERT(fifoSwapP); - } -#endif /* USE_PACKET_FIFO && (WTF_P_COMDEX || WTF_P_COMDEX_RESET) */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grResetTriStats(); -#else - grResetTriStats(); -#endif - GDBG_INFO(281,"grGlideInit --done---------------------------------------\n"); -} /* grGlideInit */ - - -/*--------------------------------------------------------------------------- -** grGlideShamelessPlug - grGlideShamelessPlug -** -** Returns: -** -** Notes: -** -*/ -#ifndef GLIDE3_ALPHA -GR_DIENTRY(grGlideShamelessPlug, void, (const FxBool mode)) -{ - GDBG_INFO(80,"grGlideShamelessPlug(%d)\n",mode); - _GlideRoot.environment.shamelessPlug = mode; -} /* grGlideShamelessPlug */ -#endif - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void FX_CSTYLE -_grResetTriStats(void) -#else -GR_DIENTRY(grResetTriStats, void, (void)) -#endif -{ - GDBG_INFO(80,"grResetTriStats()\n"); - _GlideRoot.stats.bufferSwaps = 0; - _GlideRoot.stats.linesDrawn = 0; - _GlideRoot.stats.trisProcessed = 0; - _GlideRoot.stats.trisDrawn = 0; - _GlideRoot.stats.texDownloads = 0; - _GlideRoot.stats.texBytes = 0; - _GlideRoot.stats.palDownloads = 0; - _GlideRoot.stats.palBytes = 0; -} /* grResetTriStats */ - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -GR_DIENTRY(grTriStats, void, (FxU32 *trisProcessed, FxU32 *trisDrawn)) -{ - GDBG_INFO(80,"grTriStats() => %d %d\n", - _GlideRoot.stats.trisProcessed, - _GlideRoot.stats.trisDrawn); - *trisProcessed = _GlideRoot.stats.trisProcessed; - *trisDrawn = _GlideRoot.stats.trisDrawn; -} /* grTriStats */ - -void GR_CDECL -_grFence(void) -{ - GDBG_INFO(120,"\t\t\t\t\t\t\tFENCE\n"); - P6FENCE; -} diff --git a/glide2x/h3/glide/src/digutex.c b/glide2x/h3/glide/src/digutex.c deleted file mode 100644 index d4a06d8..0000000 --- a/glide2x/h3/glide/src/digutex.c +++ /dev/null @@ -1,603 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 11 2/16/99 4:14p Peter -** made texture table declarations consistent - * - * 9 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 8 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 7 12/15/97 5:51p Atai - * disable obsolete glide2 api for glide3 - * - * 6 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 5 5/21/97 6:04a Peter - * - * 4 5/05/97 4:24p Pgj - * Remove guTexDownloadMipMap error message - * - * 3 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 2 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** guTexAllocateMemory -*/ -GR_DIENTRY(guTexAllocateMemory, GrMipMapId_t, ( GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t format, - GrMipMapMode_t mipmap_mode, - GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect_ratio, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - )) -{ - FxU32 - memrequired, - memavail, - baseAddress, - tLod, - texturemode, - filterMode, /* filter mode bits */ - clampMode; /* clamp mode bits */ - - GrMipMapId_t - mmid = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - int - int_lod_bias; - GrTexInfo info; - - GR_BEGIN_NOFIFOCHECK("guTexAllocateMemory",99); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - tmu,odd_even_mask,width,height,format,mipmap_mode, - small_lod,large_lod,aspect_ratio, - s_clamp_mode,t_clamp_mode, minfilter_mode,magfilter_mode); - /* - ** The constants are actually reverse of each other so the following - ** test IS valid! - */ - GR_CHECK_F(myName, small_lod < large_lod, "smallest_lod is larger than large_lod"); - - info.smallLod = small_lod; - info.largeLod = large_lod; - info.aspectRatio = aspect_ratio; - info.format = format; - memrequired = grTexTextureMemRequired(odd_even_mask, &info); - - /* - ** Make sure to not cross 2 MByte texture boundry - */ - if ((gc->tmu_state[tmu].freemem_base < 0x200000) && - (gc->tmu_state[tmu].freemem_base + memrequired > 0x200000)) - gc->tmu_state[tmu].freemem_base = 0x200000; - - /* - ** If we have enough memory and a free mip map handle then go for it - */ - memavail = guTexMemQueryAvail( tmu ); - - if ( memavail < memrequired ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - if (gc->mm_table.free_mmid >= MAX_MIPMAPS_PER_SST ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - /* - ** Allocate the mip map id - */ - mmid = gc->mm_table.free_mmid++; - - /* - ** calculate baseAddress (where LOD 0 would go) - */ - baseAddress = _grTexCalcBaseAddress( gc->tmu_state[tmu].freemem_base, - large_lod, - aspect_ratio, - format, - odd_even_mask ); - - GDBG_INFO(gc->myLevel," baseAddress = 0x%x (in bytes)\n",baseAddress); - - /* - ** reduce available memory to reflect allocation - */ - gc->tmu_state[tmu].freemem_base += memrequired; - - /* - ** Create the tLOD register value for this mip map - */ - int_lod_bias = _grTexFloatLODToFixedLOD( lod_bias ); - tLod = mipmap_mode==GR_MIPMAP_DISABLE ? large_lod : small_lod; - tLod = SST_TLOD_MINMAX_INT(large_lod,tLod); - tLod |= _gr_evenOdd_xlate_table[odd_even_mask]; - tLod |= _gr_aspect_xlate_table[aspect_ratio]; - tLod |= int_lod_bias << SST_LODBIAS_SHIFT; - filterMode = ( - (minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - - clampMode = ( - (s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** Create the tTextureMode register value for this mip map - */ - texturemode = ( format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( trilinear ) { - texturemode |= SST_TRILINEAR; - - if ( odd_even_mask & GR_MIPMAPLEVELMASK_ODD ) - tLod |= SST_LOD_ODD; - - if ( odd_even_mask != GR_MIPMAPLEVELMASK_BOTH ) - tLod |= SST_LOD_TSPLIT; - } - - /* - ** Fill in the mm_table data for this mip map - */ - gc->mm_table.data[mmid].format = format; - gc->mm_table.data[mmid].mipmap_mode = mipmap_mode; - gc->mm_table.data[mmid].magfilter_mode = magfilter_mode; - gc->mm_table.data[mmid].minfilter_mode = minfilter_mode; - gc->mm_table.data[mmid].s_clamp_mode = s_clamp_mode; - gc->mm_table.data[mmid].t_clamp_mode = t_clamp_mode; - gc->mm_table.data[mmid].tLOD = tLod; - gc->mm_table.data[mmid].tTextureMode = texturemode; - gc->mm_table.data[mmid].lod_bias = int_lod_bias; - gc->mm_table.data[mmid].lod_min = small_lod; - gc->mm_table.data[mmid].lod_max = large_lod; - gc->mm_table.data[mmid].tmu = tmu; - gc->mm_table.data[mmid].odd_even_mask = odd_even_mask; - gc->mm_table.data[mmid].tmu_base_address = baseAddress; - gc->mm_table.data[mmid].trilinear = trilinear; - gc->mm_table.data[mmid].aspect_ratio = aspect_ratio; - gc->mm_table.data[mmid].data = 0; - /* gc->mm_table.data[mmid].ncc_table = 0; */ - gc->mm_table.data[mmid].sst = _GlideRoot.current_sst; - gc->mm_table.data[mmid].valid = FXTRUE; - gc->mm_table.data[mmid].width = width; - gc->mm_table.data[mmid].height = height; - - GR_RETURN(mmid); -} /* guTexAllocateMemory */ - -static void -_guTexRebuildRegisterShadows( GrMipMapId_t mmid ) -{ - GR_DCL_GC; - GrMipMapInfo *mminfo = &gc->mm_table.data[mmid]; - int texturemode = 0; - int tLod = 0; - FxU32 - filterMode, /* filter mode bits of texturemode */ - clampMode; /* clamp mode bits of texturemode */ - - /* build filterMode */ - filterMode = ( - (mminfo->minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (mminfo->magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - clampMode = ( - (mminfo->s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (mminfo->t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** build up tTextureMode - */ - texturemode |= ( mminfo->format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mminfo->mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( mminfo->trilinear ) - texturemode |= SST_TRILINEAR; - - /* - ** build up tLOD - */ - tLod = mminfo->mipmap_mode == GR_MIPMAP_DISABLE ? mminfo->lod_max : mminfo->lod_min; - tLod = SST_TLOD_MINMAX_INT(mminfo->lod_max,tLod); - tLod |= _gr_evenOdd_xlate_table[mminfo->odd_even_mask]; - tLod |= _gr_aspect_xlate_table[mminfo->aspect_ratio]; - tLod |= mminfo->lod_bias << SST_LODBIAS_SHIFT; - - /* - ** assign them - */ - mminfo->tTextureMode = texturemode; - mminfo->tLOD = tLod; -} /* guTexRebuildRegisterShadows */ - - -/*--------------------------------------------------------------------------- -** guTexChangeAttributes -*/ -GR_DIENTRY(guTexChangeAttributes, FxBool, ( GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - )) -{ - GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexChangeAttributes",88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - mmid,width,height,fmt,mm_mode, - smallest_lod,largest_lod,aspect, - s_clamp_mode,t_clamp_mode, minFilterMode,magFilterMode); - /* - ** Make sure that mmid is not NULL - */ - if ( mmid == GR_NULL_MIPMAP_HANDLE ) { - GR_RETURN(FXFALSE); - } - - mminfo = &gc->mm_table.data[mmid]; - - /* - ** Fill in the mm_table data for this mip map - */ - if ( fmt != -1 ) - mminfo->format = fmt; - - if ( mm_mode != -1 ) - mminfo->mipmap_mode = mm_mode; - - if ( smallest_lod != -1 ) - mminfo->lod_min = smallest_lod; - if ( largest_lod != -1 ) - mminfo->lod_max = largest_lod; - if ( minFilterMode != -1 ) - mminfo->minfilter_mode = minFilterMode; - if ( magFilterMode != -1 ) - mminfo->magfilter_mode = magFilterMode; - if ( s_clamp_mode != -1 ) - mminfo->s_clamp_mode = s_clamp_mode; - if ( t_clamp_mode != -1 ) - mminfo->t_clamp_mode = t_clamp_mode; - if ( aspect != -1 ) - mminfo->aspect_ratio = aspect; - if ( width != -1 ) - mminfo->width = width; - if ( height != -1 ) - mminfo->height = height; - - _guTexRebuildRegisterShadows( mmid ); - GR_RETURN(FXTRUE); -} /* guTexChangeAttributes */ - -/*--------------------------------------------------------------------------- -** grTexCombineFunction - obsolete -** -*/ -GR_DIENTRY(grTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - guTexCombineFunction( tmu, tc ); -} - -/*--------------------------------------------------------------------------- -** guTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DIENTRY(guTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - GDBG_INFO(99,"guTexCombineFunction(%d,%d)\n",tmu,tc); - switch ( tc ) { - case GR_TEXTURECOMBINE_ZERO: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DECAL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_ONE: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXTRUE, FXTRUE ); - break; - - case GR_TEXTURECOMBINE_ADD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_MULTIPLY: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_ODD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_EVEN: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_SUBTRACT: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - default: - GrErrorCallback( "guTexCombineFunction: Unsupported function", FXTRUE ); - break; - } -} /* guTexCombineFunction */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMap -** -** Downloads a mip map (previously allocated with guTexAllocateMemory) to -** the hardware using the given data and ncctble. The "data" is assumed -** to be in row major order from largest mip map to smallest mip map. -*/ -GR_DIENTRY(guTexDownloadMipMap, void, - (GrMipMapId_t mmid, const void *src, const GuNccTable - *ncc_table ) ) -{ - GR_DCL_GC; - GrLOD_t lod; - const void *ptr = src; - - GDBG_INFO(99,"guTexDownloadMipMap(%d,0x%x,0x%x)\n",mmid,src,ncc_table); - GR_ASSERT(gc != NULL); - GR_ASSERT(src != NULL); - GR_CHECK_F("guTexDownloadMipMap", - ( mmid == GR_NULL_MIPMAP_HANDLE ) || ( mmid >= gc->mm_table.free_mmid ), - "invalid mip map handle passed"); - -#if 0 /* Fixme!!! XXX ??? */ - GR_CHECK_F("guTexDownloadMipMap", - gc->mm_table.data[mmid].format == GR_TEXFMT_P_8, - "guTex* does not support palletted textures - use grTex* instead"); -#endif /* 0 */ - - /* - ** Bind data and ncc table to this mip map - */ - gc->mm_table.data[mmid].data = (void *) ptr; - if (gc->mm_table.data[mmid].format == GR_TEXFMT_YIQ_422) - gc->mm_table.data[mmid].ncc_table = *ncc_table; - - /* - ** Start downloading mip map levels, note that ptr is updated by the caller - */ - for ( lod = gc->mm_table.data[mmid].lod_max; lod <= gc->mm_table.data[mmid].lod_min; lod++ ) { - guTexDownloadMipMapLevel( mmid, lod, &ptr ); - } -} /* guTexDownloadMipMap */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMapLevel -** -** Downloads a single mip map level to a mip map. "src" is considered to be -** row major data of the correct aspect ratio and format. -*/ -GR_DIENTRY(guTexDownloadMipMapLevel, void, - (GrMipMapId_t mmid, GrLOD_t lod, - const void **src_base)) -{ - FxU32 i; - const GrMipMapInfo *mminfo; - GR_DCL_GC; - - GDBG_INFO(99,"guTexDownloadMipMapLevel(%d,%d,0x%x)\n",mmid,lod,src_base); - GR_ASSERT(src_base != NULL); - mminfo = &gc->mm_table.data[mmid]; - GR_CHECK_F( "guTexDownloadMipMapLevel", - ( lod > mminfo->lod_min ) || ( lod < mminfo->lod_max ), - "specified lod is out of range"); - - /* GMT: replace with array access */ - /* download this level */ - i = _grTexCalcBaseAddress( 0, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask); - grTexDownloadMipMapLevel( mminfo->tmu, - mminfo->tmu_base_address - i, - lod, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask, - (void *)*src_base ); - - /* update src_base to point to next mipmap level */ - *src_base = (void *) (((FxU32)*src_base) + - (_grMipMapHostSize[_gr_aspect_index_table[mminfo->aspect_ratio]][lod] - << (mminfo->format>=GR_TEXFMT_16BIT))); - -} /* guTexDownloadMipmapLevel */ - -/*--------------------------------------------------------------------------- -** guTexGetCurrentMipMap -*/ -GR_DIENTRY(guTexGetCurrentMipMap, GrMipMapId_t, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU( myName, tmu ); - - GR_RETURN(gc->state.current_mm[tmu]); -} /* guTexGetCurrentMipMap */ - -/*--------------------------------------------------------------------------- -** guTexGetMipMapInfo -*/ -GR_DIENTRY(guTexGetMipMapInfo, GrMipMapInfo *, ( GrMipMapId_t mmid )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetMipMapInfo",99); - GDBG_INFO_MORE(gc->myLevel,"(%d) => 0x%x\n",mmid,&gc->mm_table.data[mmid]); - return &( gc->mm_table.data[mmid] ); -} /* guTexGetMipMapInfo */ - -/*--------------------------------------------------------------------------- -** guTexMemQueryAvail -** -** returns the amount of available texture memory on a specified TMU. -*/ -GR_DIENTRY(guTexMemQueryAvail, FxU32, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base); -} /* guTexQueryMemAvail */ - -/*--------------------------------------------------------------------------- -** guTexMemReset -** -** Clears out texture buffer memory. -*/ -GR_DIENTRY(guTexMemReset, void, ( void )) -{ - int i; - - GR_BEGIN_NOFIFOCHECK("guTexMemReset",99); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) ); - gc->mm_table.free_mmid = 0; - - for ( i = 0; i < gc->num_tmu; i++ ) { - gc->state.current_mm[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].freemem_base = 0; - gc->tmu_state[i].ncc_mmids[0] = - gc->tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].ncc_table[0] = - gc->tmu_state[i].ncc_table[1] = 0; - } - GR_END(); -} /* guTexMemReset */ - -#endif /* !GLIDE3_ALPHA */ - -#if defined(GLIDE3) -/*--------------------------------------------------------------------------- -** guTexMemReset -** -** Clears out texture buffer memory. -*/ -void FX_CSTYLE -_guTexMemReset(void) -{ - int i; - - GR_BEGIN_NOFIFOCHECK("guTexMemReset",99); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - -#ifndef GLIDE3_ALPHA - memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) ); - gc->mm_table.free_mmid = 0; -#endif /* !GLIDE3_ALPHA */ - - for ( i = 0; i < gc->num_tmu; i++ ) { - gc->state.current_mm[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].freemem_base = 0; - gc->tmu_state[i].ncc_mmids[0] = - gc->tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].ncc_table[0] = - gc->tmu_state[i].ncc_table[1] = 0; - } - GR_END(); -} /* guTexMemReset */ -#endif /* defined(GLIDE3) */ diff --git a/glide2x/h3/glide/src/disst.c b/glide2x/h3/glide/src/disst.c deleted file mode 100644 index 645cb1f..0000000 --- a/glide2x/h3/glide/src/disst.c +++ /dev/null @@ -1,230 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 26 11/30/98 6:39p Mikec -** Make sure grSstQueryBoards returns the right num_sst. -** -** 25 5/22/98 2:37p Peter -** complete the lie that is glide2x on Banshee -** -** 24 5/08/98 10:58a Dow -** Fixed accvio in debug version -** -** 23 3/28/98 11:24a Dow -** itwoç -** -** 20 2/08/98 3:08p Dow -** FIFO Works - * - * 18 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 17 12/09/97 12:20p Peter - * mac glide port - * - * 16 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 15 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 14 10/31/97 9:15a Peter - * only lie about v2 boards - * - * 13 10/31/97 8:53a Peter - * last lying change, really - * - * 12 9/05/97 5:29p Peter - * changes for direct hw - * - * 11 6/20/97 9:56a Peter - * better lines/pts, hopefully - * - * 10 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:04a Peter - * - * 7 5/02/97 2:07p Pgj - * grSstScreenWidth/Height now FxU32 - * - * 6 3/17/97 6:25a Jdt - * Added initDeviceSelect to grSstSelect() - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 3 1/18/97 11:39p Dow - * Changed location of _curGCFuncs - * - * 2 1/16/97 3:39p Dow - * Added ref to _curGCFuncs during grSstSelect() - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** grSstQueryBoards -** -** NOTE: it is OK to call this routine before grGlideInit -*/ -#ifndef GLIDE3_ALPHA -GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc )) -{ - GDBG_INIT(); - GDBG_INFO(80,"grSstQueryBoards(0x%x)\n",hwc); - hwc->num_sst = (_grSstDetectResources() - ? _GlideRoot.hwConfig.num_sst - : 0); - return FXTRUE; -} /* grSstQueryBoards */ -#endif - -/*--------------------------------------------------------------------------- -** grSstQueryHardware -** -*/ -GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc )) -{ - FxBool retVal; - - GDBG_INFO(80, "grSstQueryHardware(0x%x)\n", hwc); - - /* init and copy the data back to the user's structure */ - retVal = _GlideRoot.hwConfig.num_sst > 0; - *hwc = _GlideRoot.hwConfig; - - return retVal; - -} /* grSstQueryHardware */ - -/*--------------------------------------------------------------------------- -** grSstSelect -*/ -GR_DIENTRY(grSstSelect, void, ( int which )) -{ - if ( which >= _GlideRoot.hwConfig.num_sst ) - GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE ); - - _GlideRoot.current_sst = which; - _GlideRoot.curGC = &_GlideRoot.GCs[which]; -#ifdef GLIDE_MULTIPLATFORM - _GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs; -#endif - - /* now begin a normal Glide routine's flow */ - { - GR_BEGIN_NOFIFOCHECK("grSstSelect",80); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",which); - - _GlideRoot.packerFixAddress = ( FxU32 ) gc->tex_ptr; - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 3 ) << 21 ); - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 1 ) << 17 ); - - /* Now that we have selected a board, we can build the offests and register - lists for the optimized triangle setup code */ - _grRebuildDataList(); - - /* dpc - 22 may 1997 - FixMe! - * We don't need to move around the driver init - * functions since we're using the hal crap. - * Is there anything else that we need to do? - */ -#if GLIDE_INIT_HAL - -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * initDeviceSelect( which ); - */ -#endif /* !GLIDE_INIT_HAL */ - - GR_END(); - } -} /* grSstSelect */ - -/*--------------------------------------------------------------------------- -** grSstScreenWidth -*/ -GR_DIENTRY(grSstScreenWidth, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_width; -} /* grSstScreenWidth */ - -/*--------------------------------------------------------------------------- -** grSstScreenHeight -*/ -GR_DIENTRY(grSstScreenHeight, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_height; -} - -/* this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/*--------------------------------------------------------------------------- -** grSstVidMode - override args to grSstOpen() -*/ -GR_DIENTRY(grSstVidMode, void, (FxU32 whichSst, FxVideoTimingInfo* vidTimings)) -{ - GDBG_INFO(80,"grSstVidMode(%d,0x%x)\n",whichSst,vidTimings); -#ifdef GLIDE_DEBUG - if (whichSst >= MAX_NUM_SST) { - char errStr[1028]; - sprintf(errStr, "grSstVidMode: %ld greater than MAX_NUM_SST (%d)\n", - whichSst, MAX_NUM_SST); - - GrErrorCallback(errStr, FXTRUE); - } -#endif - - _GlideRoot.GCs[whichSst].vidTimings = vidTimings; -} /* grSstVidMode */ - diff --git a/glide2x/h3/glide/src/distate.c b/glide2x/h3/glide/src/distate.c deleted file mode 100644 index f296689..0000000 --- a/glide2x/h3/glide/src/distate.c +++ /dev/null @@ -1,946 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 17 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 16 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 15 1/05/98 6:06p Atai - * glide extension stuff - * - * 14 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 13 12/16/97 11:38a Atai - * added grChromaRange() - * - * 12 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 10 12/12/97 1:30p Atai - * remove fp z buffer - * - * 8 12/08/97 10:44a Atai - * added entry point for grCoordinateSpace(), grDepthRange(), and - * grViewport() - * - * 7 11/13/97 4:38p Atai - * invalidate lfbMode and c0c1 - * - * 6 11/10/97 5:20p Atai - * added factor for grAlphaCombine and remove extra _grChromakeyMode - * - * 5 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 4 10/15/97 7:33a Dow - * Made _grValidateState use central routine for writing data - * - * 3 10/14/97 4:18p Atai - * added grEnable and grDisable - * - * 2 10/10/97 2:57p Dow - * Minor adjustments - * - * 1 10/09/97 5:19p Dow - * State Monster file - */ - -#ifdef GLIDE3 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*============================================================================= -** Replacement state routines. -** -** These routines store away their arguments, and mark a piece of glide state -** as invalid. The next time a rendering primitive is called, the state will -** be invalid, and grValidateState will be called. See that routine for more -** info. -**===========================================================================*/ - -/* - Some macros for use in this file only - */ - -#define STOREARG(function, arg) \ -gc->state.stateArgs.##function##Args.arg = arg - -#define LOADARG(function, arg) \ -gc->state.stateArgs.##function##Args.arg - -#define INVALIDATE(regset) \ -gc->state.invalid |= ##regset##BIT - -#define NOTVALID(regset) \ -(gc->state.invalid & ##regset##BIT) - -#define SETVALID(regset) \ -(gc->state.invalid &= ~(##regset##BIT)) - -#define ENABLEMODE(mode) \ -gc->state.grEnableArgs.##mode## = GR_MODE_ENABLE; - -#define DISABLEMODE(mode) \ -gc->state.grEnableArgs.##mode## = GR_MODE_DISABLE; - -/*------------------------------------------------------------------- - Function: grAlphaBlendFunction - Date: 06-Oct-97 - Implementor(s): dow - Description: - Inform Glide that the Alpha Blend Function has been modified. - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaBlendFunction, void , (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df) ) -{ - #define FN_NAME "grAlphaBlendFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - /* Invalidate AlphaMode */ - INVALIDATE(alphaMode); - - STOREARG(grAlphaBlendFunction, rgb_sf); - STOREARG(grAlphaBlendFunction, rgb_df); - STOREARG(grAlphaBlendFunction, alpha_sf); - STOREARG(grAlphaBlendFunction, alpha_df); - - #undef FN_NAME -} /* grAlphaBlendFunction */ - -/*------------------------------------------------------------------- - Function: grAlphaTestFunction - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaTestFunction, void , (GrCmpFnc_t fnc) ) -{ - #define FN_NAME "grAlphaTestFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - /* Invalidate AlphaMode */ - INVALIDATE(alphaMode); - - STOREARG(grAlphaTestFunction, fnc); - - #undef FN_NAME -} /* grAlphaTestFunction */ - -/*------------------------------------------------------------------- - Function: grAlphaTestReferenceValue - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaTestReferenceValue, void , (GrAlpha_t value) ) -{ - #define FN_NAME "grAlphaTestReferenceValue" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - - INVALIDATE(alphaMode); - - STOREARG(grAlphaTestReferenceValue,value); - - #undef FN_NAME -} /* grAlphaTestReferenceValue */ - -/*------------------------------------------------------------------- - Function: grAlphaCombine - Date: 06-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaCombine, void , - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert) ) -{ - #define FN_NAME "grAlphaCombine" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzColorPath); - - STOREARG(grAlphaCombine, function); - STOREARG(grAlphaCombine, factor); - STOREARG(grAlphaCombine, local); - STOREARG(grAlphaCombine, other); - STOREARG(grAlphaCombine, invert); - - #undef FN_NAME -} /* grAlphaCombine */ - -/*------------------------------------------------------------------- - Function: grAlphaControlsITRGBLighting - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grAlphaControlsITRGBLighting, void , (FxBool enable) ) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting",85); - - INVALIDATE(fbzColorPath); - - STOREARG(grAlphaControlsITRGBLighting, enable); - -#undef FN_NAME -} /* grAlphaControlsITRGBLighting */ - -/*------------------------------------------------------------------- - Function: grColorCombine - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grColorCombine, void , (GrCombineFunction_t function, - GrCombineFactor_t factor, - GrCombineLocal_t local, - GrCombineOther_t other, FxBool invert) ) -{ -#define FN_NAME "grColorCombine" - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - - INVALIDATE(fbzColorPath); - - STOREARG(grColorCombine, function); - STOREARG(grColorCombine, factor); - STOREARG(grColorCombine, local); - STOREARG(grColorCombine, other); - STOREARG(grColorCombine, invert); - -#undef FN_NAME -} /* grColorCombine */ - - -/*------------------------------------------------------------------- - Function: grChromakeyMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grChromakeyMode, void , (GrChromakeyMode_t mode) ) -{ -#define FN_NAME "grChromakeyMode" - GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85); - - INVALIDATE(fbzMode); - - STOREARG(grChromakeyMode, mode); - -#undef FN_NAME -} /* grChromakeyMode */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/*------------------------------------------------------------------- - Function: grChromaModeExt - Date: 05-Jan-98 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -void _grChromaModeExt(GrChromakeyMode_t mode) -{ -#define FN_NAME "_grChromaModeExt" - GR_BEGIN_NOFIFOCHECK("_grChromaModeExt",85); - - INVALIDATE(fbzMode); - - STOREARG(grChromakeyMode, mode); - -#undef FN_NAME -} /* _grChromaModeExt */ - -/*------------------------------------------------------------------- - Function: _grChromaRangeExt - Date: 15-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -void _grChromaRangeExt(GrColor_t color, GrColor_t range, GrChromaRangeMode_t mode) -{ -#define FN_NAME "_grChromaRangeExt" - GR_BEGIN_NOFIFOCHECK("_grChromaRangeExt",85); - - GR_CHECK_F(myName, - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type != GR_SSTTYPE_Voodoo2), - "grChromaRange not supported."); - - INVALIDATE(chromaKey); - - STOREARG(grChromakeyValue, color); - STOREARG(grChromaRange, range); - STOREARG(grChromaRange, mode); - -#undef FN_NAME -} /* _grChromaRangeExt */ -#endif - -/*------------------------------------------------------------------- - Function: grChromakeyValue - Date: 09-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_ENTRY(grChromakeyValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85); - - INVALIDATE(chromaKey); - - STOREARG(grChromakeyValue, color); - -#undef FN_NAME -} /* grChromakeyValue */ - -/*------------------------------------------------------------------- - Function: grDeptMask - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthMask, void , (FxBool enable) ) -{ - #define FN_NAME "grDepthMask" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthMask, enable); - - #undef FN_NAME -} /* grDeptMask */ - - -/*------------------------------------------------------------------- - Function: grDepthBufferFunction - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBufferFunction, void , (GrCmpFnc_t fnc) ) -{ - #define FN_NAME "grDepthBufferFunction" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthBufferFunction, fnc); - - #undef FN_NAME -} /* grDepthBufferFunction */ - - -/*------------------------------------------------------------------- - Function: grDepthBufferMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBufferMode, void , (GrDepthBufferMode_t mode) ) -{ - #define FN_NAME "grDepthBufferMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDepthBufferMode, mode); - - #undef FN_NAME -} /* grDepthBufferMode */ - - -/*------------------------------------------------------------------- - Function: grDitherMode - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDitherMode, void , (GrDitherMode_t mode) ) -{ - #define FN_NAME "grDitherMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grDitherMode, mode); - - #undef FN_NAME -} /* grDitherMode */ - -/*------------------------------------------------------------------- - Function: grRenderBuffer - Date: 07-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grRenderBuffer, void , (GrBuffer_t buffer) ) -{ - #define FN_NAME "grRenderBuffer" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grRenderBuffer, buffer); - - #undef FN_NAME -} /* grRenderBuffer */ - -/*------------------------------------------------------------------- - Function: grColorMask - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_ENTRY(grColorMask, void , (FxBool rgb, FxBool alpha) ) -{ -#define FN_NAME "grColorMask" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(fbzMode); - - STOREARG(grColorMask, rgb); - STOREARG(grColorMask, alpha); - - -#undef FN_NAME -} /* grColorMask */ - -/*------------------------------------------------------------------- - Function: grSstOrigin - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grSstOrigin, void , (GrOriginLocation_t origin) ) -{ - #define FN_NAME "grSstOrigin" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(chromaKey); - - STOREARG(grSstOrigin, origin); - -#undef FN_NAME -} /* grSstOrigin */ - -/*------------------------------------------------------------------- - Function: grClipWindow - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grClipWindow, void , (FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy) ) -{ -#define FN_NAME "grClipWindow" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(clipRegs); - - STOREARG(grClipWindow, minx); - STOREARG(grClipWindow, miny); - STOREARG(grClipWindow, maxx); - STOREARG(grClipWindow, maxy); - -#undef FN_NAME -} /* grClipWindow */ - -/*------------------------------------------------------------------- - Function: grDepthBiasLevel - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthBiasLevel, void , (FxI16 level) ) -{ -#define FN_NAME "grDepthBiasLevel" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(zaColor); - - STOREARG(grDepthBiasLevel, level); - -#undef FN_NAME -} /* grDepthBiasLevel */ - - -/*------------------------------------------------------------------- - Function: grFogMode - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grFogMode, void , (GrFogMode_t mode) ) -{ -#define FN_NAME "grFogMode" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(fogMode); - - STOREARG(grFogMode, mode); - -#undef FN_NAME -} /* grFogMode */ - - -/*------------------------------------------------------------------- - Function: grFogColorValue - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grFogColorValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - INVALIDATE(fogColor); - - STOREARG(grFogColorValue, color); - -#undef FN_NAME -} /* grFogColorValue */ - -/*------------------------------------------------------------------- - Function: grLfbWriteColorFormat - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grLfbWriteColorFormat, void , (GrColorFormat_t colorFormat) ) -{ -#define FN_NAME "grLfbWriteColorFormat" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - - INVALIDATE(lfbMode); - - STOREARG(grLfbWriteColorFormat, colorFormat); - -#undef FN_NAME -} /* grLfbWriteColorFormat */ - -/*------------------------------------------------------------------- - Function: grLfbWriteColorSwizzle - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grLfbWriteColorSwizzle, void , (FxBool swizzleBytes, FxBool - swapWords) ) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - - INVALIDATE(lfbMode); - - STOREARG(grLfbWriteColorSwizzle, swizzleBytes); - STOREARG(grLfbWriteColorSwizzle, swapWords); - -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - - -/*------------------------------------------------------------------- - Function: grConstantColorValue - Date: 08-Oct-97 - Implementor(s): dow - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grConstantColorValue, void , (GrColor_t color) ) -{ -#define FN_NAME "grConstantColorValue" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - INVALIDATE(c0c1); - - STOREARG(grConstantColorValue, color); - -#undef FN_NAME -} /* grConstantColorValue */ - - -/*==========================================================================*/ - - -/*------------------------------------------------------------------- - Function: grValidateState - Date: 08-Oct-97 - Implementor(s): dow - Description: - State Validation: - Once a rendering primitive has determined that the state is invalid, - it calls this routine. grValidateState then goes through valid - markers and flushes all invalid state. - -------------------------------------------------------------------*/ -void -_grValidateState() -{ -#define FN_NAME "_grValidateState" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - if (NOTVALID(alphaMode)) { - _grAlphaBlendFunction(LOADARG(grAlphaBlendFunction, rgb_sf), - LOADARG(grAlphaBlendFunction, rgb_df), - LOADARG(grAlphaBlendFunction, alpha_sf), - LOADARG(grAlphaBlendFunction, alpha_df)); - _grAlphaTestFunction(LOADARG(grAlphaTestFunction, fnc)); - _grAlphaTestReferenceValue(LOADARG(grAlphaTestReferenceValue, value)); - - } - - if (NOTVALID(fbzColorPath)) { - _grAlphaCombine(LOADARG(grAlphaCombine, function), - LOADARG(grAlphaCombine, factor), - LOADARG(grAlphaCombine, local), - LOADARG(grAlphaCombine, other), - LOADARG(grAlphaCombine, invert)); - _grAlphaControlsITRGBLighting(LOADARG(grAlphaControlsITRGBLighting, - enable)); - _grColorCombine(LOADARG(grColorCombine, function), - LOADARG(grColorCombine, factor), - LOADARG(grColorCombine, local), - LOADARG(grColorCombine, other), - LOADARG(grColorCombine, invert)); - - } - - if (NOTVALID(fbzMode)) { - _grChromakeyMode(LOADARG(grChromakeyMode, mode)); - _grDepthMask(LOADARG(grDepthMask, enable)); - _grDepthBufferFunction(LOADARG(grDepthBufferFunction, fnc)); - _grDepthBufferMode(LOADARG(grDepthBufferMode, mode)); - _grDitherMode(LOADARG(grDitherMode, mode)); - _grRenderBuffer(LOADARG(grRenderBuffer, buffer)); - _grColorMask(LOADARG(grColorMask, rgb), LOADARG(grColorMask, alpha)); - _grSstOrigin(LOADARG(grSstOrigin, origin)); - - } - - if (NOTVALID(chromaKey)) { -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grChromaRangeExt(LOADARG(grChromakeyValue, color),LOADARG(grChromaRange, range) - , LOADARG(grChromaRange, mode)); - -#else - _grChromakeyValue(LOADARG(grChromakeyValue, color)); -#endif - } - - if (NOTVALID(clipRegs)) { - _grClipWindow( - LOADARG(grClipWindow, minx), - LOADARG(grClipWindow, miny), - LOADARG(grClipWindow, maxx), - LOADARG(grClipWindow, maxy)); - } - - if (NOTVALID(zaColor)) { - _grDepthBiasLevel((FxI16) LOADARG(grDepthBiasLevel, level)); - } - - if (NOTVALID(fogMode)) { - _grFogMode(LOADARG(grFogMode, mode)); - } - - if (NOTVALID(fogColor)) { - _grFogColorValue(LOADARG(grFogColorValue, color)); - } - - if (NOTVALID(lfbMode)) { - _grLfbWriteColorFormat(LOADARG(grLfbWriteColorFormat, colorFormat)); - _grLfbWriteColorSwizzle(LOADARG(grLfbWriteColorSwizzle, swizzleBytes), - LOADARG(grLfbWriteColorSwizzle, swapWords)); - - } - - if (NOTVALID(c0c1)) { - _grConstantColorValue(LOADARG(grConstantColorValue, color)); - } - - _grUpdateParamIndex(); - - _grFlushCommonStateRegs(); - -#undef FN_NAME -} /* _grValidateState */ - -#define IARRAY(p,i) (*((FxU32 *)(p)+(i))) - -/*------------------------------------------------------------------- - Function: grEnable - Date: 10-Oct-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grEnable, void , (GrEnableMode_t mode) ) -{ -#define FN_NAME "grEnable" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_AA_ORDERED: - ENABLEMODE(primitive_smooth_mode); - break; - case GR_SHAMELESS_PLUG: - ENABLEMODE(shameless_plug_mode); - _GlideRoot.environment.shamelessPlug = mode; - break; - case GR_VIDEO_SMOOTHING: - ENABLEMODE(video_smooth_mode); - break; - case GR_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = GR_MODE_ENABLE; - break; - } - -#undef FN_NAME -} /* grEnable */ - -/*------------------------------------------------------------------- - Function: grDisable - Date: 10-Oct-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDisable, void , (GrEnableMode_t mode) ) -{ -#define FN_NAME "grDisable" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_AA_ORDERED: - DISABLEMODE(primitive_smooth_mode); - break; - case GR_SHAMELESS_PLUG: - DISABLEMODE(shameless_plug_mode); - break; - case GR_VIDEO_SMOOTHING: - DISABLEMODE(video_smooth_mode); - break; - case GR_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = GR_MODE_DISABLE; - break; - } - -#undef FN_NAME -} /* grDisable */ - -/*------------------------------------------------------------------- - Function: grCoordinateSpace - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grCoordinateSpace, void , (GrCoordinateSpaceMode_t mode) ) -{ -#define FN_NAME "grCoordinateSpace" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - switch (mode) { - case GR_WINDOW_COORDS: - gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_WINDOW_COORDS; - break; - case GR_CLIP_COORDS: - gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_CLIP_COORDS; - break; - } - -#undef FN_NAME -} /* grCoordinateSpace */ - -/*------------------------------------------------------------------- - Function: grDepthRange - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grDepthRange, void , (FxFloat n, FxFloat f) ) -{ -#define FN_NAME "grDepthRange" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - gc->state.Viewport.n = n; - gc->state.Viewport.f = f; - gc->state.Viewport.hdepth = (f - n) * 0.5f * 65535.f; - gc->state.Viewport.oz = (f + n) * 0.5f * 65535.f; - -#undef FN_NAME -} /* grDepthRange */ - -/*------------------------------------------------------------------- - Function: grViewport - Date: 01-Dec-97 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -GR_DIENTRY(grViewport, void , (FxI32 x, FxI32 y, FxI32 width, FxI32 height) ) -{ -#define FN_NAME "grViewport" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - gc->state.Viewport.ox = (FxFloat)(x + width * 0.5f); - gc->state.Viewport.oy = (FxFloat)(y + height *0.5f); - gc->state.Viewport.hwidth = width * 0.5f; - gc->state.Viewport.hheight = height * 0.5f; - -#undef FN_NAME -} /* grViewport */ - -#endif /* GLIDE3 */ diff --git a/glide2x/h3/glide/src/distrip.c b/glide2x/h3/glide/src/distrip.c deleted file mode 100644 index 43b925a..0000000 --- a/glide2x/h3/glide/src/distrip.c +++ /dev/null @@ -1,451 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 16 12/03/98 11:27p Dow -** Code 'cleanup' heç - * - * 14 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 13 12/12/97 10:59a Atai - * clip space and viewport - * - * 12 12/08/97 10:42a Atai - * added grDrawVertexArrayLinear() - * - * 11 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 10 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 9 11/18/97 3:24p Atai - * change grParameterData to grVertexLayout - * define GR_PARAM_* - * - * 8 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 7 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 6 10/21/97 8:36p Atai - * added gr_lines routines - * use dword offset - * - * 5 10/17/97 2:11p Atai - * added grContinueArray. We only support non aa mode for now. - * - * 4 10/14/97 4:34p Atai - * filled out the calls to different drawarray routines - * - * 3 9/29/97 1:26p Dow - * Fixed packed color strips/fans - * - * 2 9/26/97 10:24a Dow - * Fixed state effage in Glide3 parameter data - * - * 1 9/23/97 2:04p Dow - * DI code for strips -** -*/ -#ifdef GLIDE3 - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - Function: grVertexLayout - Date: 17-Sep-97 - Implementor(s): dow - Library: Init Code for - Description: - This routine defines the format for vertex arrays. - - Arguments: - param - Type of date-i.e. vertex, color, or texture info: - GR_COLOR, GR_VERTEX, GR_TEXTURE0, GR_TEXTURE1 - components - Which components are specified - Valid Components: - - - So, this table summarizes the legal combinations: - Param Type Size Description - ======================================================================================================= - GR_PARAM_XY FxFloat 8 X and Y coordinates. Offset must be zero. - GR_PARAM_Z FxFloat 4 Z coordinate. - GR_PARAM_A FxFloat 4 Alpha value. - GR_PARAM_RGB FxFloat 12 RGB triplet. - GR_PARAM_PARGB FxU32 4 Packed ARGB. High-order byte is A, followed by R, G, and B. - GR_PARAM_STn FxFloat 8 S and T coordinates for TMU , where n is in the range [0, TBD] - GR_PARAM_Wn FxFloat 4 - - Return: - Nothing ever. - -------------------------------------------------------------------*/ -GR_DIENTRY(grVertexLayout, void , (FxU32 param, FxI32 offset, FxU32 mode) ) -{ -#define FN_NAME "grParameterData" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 85); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x)\n", param, offset); - - gc->state.vData.vertexInfo.param = param; - - switch (param) { - case GR_PARAM_XY: - GR_CHECK_F(myName, - (offset != 0), - "Offset must be zero."); - - gc->state.vData.vertexInfo.offset = offset; - gc->state.vData.vertexInfo.mode = mode; - break; - - case GR_PARAM_Z: - - gc->state.vData.zInfo.offset = offset; - gc->state.vData.zInfo.mode = mode; - - break; - - case GR_PARAM_W: - - gc->state.vData.wInfo.offset = offset; - gc->state.vData.wInfo.mode = mode; - - break; - - case GR_PARAM_A: - - gc->state.vData.aInfo.offset = offset; - gc->state.vData.colorType = GR_FLOAT; - gc->state.vData.aInfo.mode = mode; - - break; - case GR_PARAM_RGB: - - gc->state.vData.rgbInfo.offset = offset; - gc->state.vData.colorType = GR_FLOAT; - gc->state.vData.rgbInfo.mode = mode; - - break; - case GR_PARAM_PARGB: - - gc->state.vData.pargbInfo.offset = offset; - gc->state.vData.colorType = GR_U8; - gc->state.vData.pargbInfo.mode = mode; - - break; - case GR_PARAM_ST0: - - gc->state.vData.st0Info.offset = offset; - gc->state.vData.st0Info.mode = mode; - - break; - case GR_PARAM_ST1: - - gc->state.vData.st1Info.offset = offset; - gc->state.vData.st1Info.mode = mode; - - break; - case GR_PARAM_Q: - - gc->state.vData.qInfo.offset = offset; - gc->state.vData.qInfo.mode = mode; - - break; - case GR_PARAM_Q0: - - gc->state.vData.q0Info.offset = offset; - gc->state.vData.q0Info.mode = mode; - - break; - case GR_PARAM_Q1: - - gc->state.vData.q1Info.offset = offset; - gc->state.vData.q1Info.mode = mode; - - break; - } - -#if !GLIDE3_VERTEX_LAYOUT - switch (param) { - case GR_VERTEX: - GR_CHECK_F(myName, - !((components == GR_VERTEX_XYZ) || - (components == GR_VERTEX_XYZW)), - "Bad Component for Vertex Parameter"); - gc->state.vData.vertexInfo.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Vertex Parameter"); - gc->state.vData.vertexInfo.type = type; - - gc->state.vData.vertexInfo.offset = offset; - - GDBG_INFO(gc->myLevel, "%s: Vertex Offset = %d\n", FN_NAME, - gc->state.vData.vertexInfo.offset); - - break; - - case GR_COLOR: - GR_CHECK_F(myName, - !((components == GR_COLOR_RGB) || (components == GR_COLOR_RGBA)), - "Bad Component for Color Parameter"); - gc->state.vData.colorInfo.components = components; - - GR_CHECK_F(myName, !((type == GR_FLOAT) || (type == GR_U8)), - "Bad Type for Color Parameter"); - gc->state.vData.colorInfo.type = type; - - gc->state.vData.colorInfo.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Color Offset = %d\n", FN_NAME, - gc->state.vData.colorInfo.offset); - - break; - - case GR_TEXTURE0: - GR_CHECK_F(myName, - !((components == GR_TEX_NONE) || (components == GR_TEX_ST) || - (components == GR_TEX_STW)), - "Bad Component for Texture Parameter"); - gc->state.vData.tex0Info.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter"); - gc->state.vData.tex0Info.type == type; - - gc->state.vData.tex0Info.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Tex0 Offset = %d\n", FN_NAME, - gc->state.vData.tex0Info.offset); - - break; - - case GR_TEXTURE1: - GR_CHECK_F(myName, - !((components == GR_TEX_NONE) || (components == GR_TEX_ST) || - (components == GR_TEX_STW)), - "Bad Component for Texture Parameter"); - gc->state.vData.tex1Info.components = components; - - GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter"); - gc->state.vData.tex1Info.type == type; - - gc->state.vData.tex1Info.offset = offset; - GDBG_INFO(gc->myLevel, "%s: Tex1 Offset = %d\n", FN_NAME, - gc->state.vData.tex1Info.offset); - break; - - default: - GR_CHECK_F(myName, 0, "Invalid Parameter"); - break; - - } -#endif /* !GLIDE3_VERTEX_LAYOUT */ - - _grRebuildDataList(); - - GR_END(); -#undef FN_NAME -} /* grParameterData */ - -/*------------------------------------------------------------------- - Function: grDrawVertexArray - Date: 18-Sep-97 - Implementor(s): dow - Description: - - Arguments: - mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP, - GR_TRIANGLE_FAN, GR_TRIANGLES - - Return: - Nothing ever - -------------------------------------------------------------------*/ -GR_DIENTRY(grDrawVertexArray, void , (FxU32 mode, FxU32 Count, void *pointers) ) -{ -#define FN_NAME "grDrawVertexArray" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n", - mode, Count, pointers); - -#ifdef GDBG_INFO_ON - { - FxU32 i; - for (i = 0; i < Count; i++) - GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n", - FN_NAME, i, ((float **)pointers)[i]); - } -#endif - - switch (mode) { - case GR_POINTS: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawPoints(GR_VTX_PTR_ARRAY, Count, pointers); - break; - case GR_LINE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers); - break; - case GR_LINES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers); - break; - case GR_POLYGON: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLE_FAN: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers); - break; - - case GR_TRIANGLES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers); - else - _grAAVpDrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers); - else - _grDrawTriangles(GR_VTX_PTR_ARRAY, Count, pointers); - break; - - } -#undef FN_NAME -} /* grDrawVertexArray */ - - -/*------------------------------------------------------------------- - Function: grDrawVertexArrayLinear - Date: 04-Dec-97 - Implementor(s): atai - Description: - - Arguments: - mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP, - GR_TRIANGLE_FAN, GR_TRIANGLES - - Return: - Nothing ever - -------------------------------------------------------------------*/ -GR_DIENTRY(grDrawVertexArrayLinear, void , (FxU32 mode, FxU32 Count, void *pointers, FxU32 stride) ) -{ -#define FN_NAME "grDrawVertexArrayLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n", - mode, Count, pointers); - -#ifdef GDBG_INFO_ON - { - FxU32 i; - for (i = 0; i < Count; i++) - GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n", - FN_NAME, i, (int)pointers + gc->state.vData.vStride * i); - } -#endif - - gc->state.vData.vStride = stride >> 2; - switch (mode) { - case GR_POINTS: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR, Count, pointers); - else - _grDrawPoints(GR_VTX_PTR, Count, pointers); - break; - case GR_LINE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers); - break; - case GR_LINES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers); - else - _grDrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers); - break; - case GR_POLYGON: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLE_STRIP: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLE_FAN: - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - else - _grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers); - break; - - case GR_TRIANGLES: - if (gc->state.grEnableArgs.primitive_smooth_mode) - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers); - else - _grAAVpDrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers); - else - _grDrawTriangles(GR_VTX_PTR, Count, pointers); - break; - - } -#undef FN_NAME -} /* grDrawVertexArrayLinear */ - -#endif /* GLIDE3 */ diff --git a/glide2x/h3/glide/src/ditex.c b/glide2x/h3/glide/src/ditex.c deleted file mode 100644 index 8d64848..0000000 --- a/glide2x/h3/glide/src/ditex.c +++ /dev/null @@ -1,698 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 24 2/16/99 4:14p Peter -** sanitized source/download -** -** 23 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 22 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 21 10/20/98 7:12p Peter -** static build hapiiness -** -** 20 7/19/98 4:34p Mikec -** Relaxed 2MB span constraint on downloadmipmap. -** -** 19 5/18/98 2:41p Dow -** 16-byte boundaries -** -** 18 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup - * - * 16 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 15 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 13 12/09/97 12:20p Peter - * mac glide port - * - * 12 12/02/97 9:49a Dow - * Got rid of Texelfx rev 0 warning - * - * 11 11/20/97 6:58p Dow - * Marked _grTexTextureMemRequired for movement - * - * 10 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 9 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 8 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 7 5/21/97 6:04a Peter - * - * 6 3/15/97 8:09p Jdt - * Remove grTexDownloadTable from this file because I added SST-1 only - * code to it - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 2/12/97 2:09p Hanson - * Hopefully removed the rest of my effage. - * - * 3 2/12/97 12:34p Dow - * Fixed Hanson effage - * - * 2 1/18/97 11:41p Dow - * Fixed Gary's "Last C Bug" analog - * Fixed usage of _grMipMapOffset_Tsplit - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -const FxU32 _gr_aspect_index_table[] = -{ - 3, - 2, - 1, - 0, - 1, - 2, - 3, -}; - -/* size in texels */ -const FxU32 _grMipMapHostSize[4][9] = -{ - { /* 1:1 aspect ratio */ - 65536, /* 0 : 256x256 */ - 16384, /* 1 : 128x128 */ - 4096, /* 2 : 64x64 */ - 1024, /* 3 : 32x32 */ - 256, /* 4 : 16x16 */ - 64, /* 5 : 8x8 */ - 16, /* 6 : 4x4 */ - 4, /* 7 : 2x2 */ - 1, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 32768, /* 0 : 256x128 */ - 8192, /* 1 : 128x64 */ - 2048, /* 2 : 64x32 */ - 512, /* 3 : 32x16 */ - 128, /* 4 : 16x8 */ - 32, /* 5 : 8x4 */ - 8, /* 6 : 4x2 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 16384, /* 0 : 256x64 */ - 4096, /* 1 : 128x32 */ - 1024, /* 2 : 64x16 */ - 256, /* 3 : 32x8 */ - 64, /* 4 : 16x4 */ - 16, /* 5 : 8x2 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 8:1 aspect ratio */ - 8192, /* 0 : 256x32 */ - 2048, /* 1 : 128x16 */ - 512, /* 2 : 64x8 */ - 128, /* 3 : 32x4 */ - 32, /* 4 : 16x2 */ - 8, /* 5 : 8x1 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - } -}; - -const int _grMipMapHostWH[G3_ASPECT_TRANSLATE(GR_ASPECT_1x8)+1][G3_LOD_TRANSLATE(GR_LOD_1)+1][2] = -{ - { - { 256 , 32 }, - { 128 , 16 }, - { 64 , 8 }, - { 32 , 4 }, - { 16 , 2 }, - { 8 , 1 }, - { 4 , 1 }, - { 2 , 1 }, - { 1 , 1 } - }, - { - { 256 , 64 }, - { 128 , 32 }, - { 64 , 16 }, - { 32 , 8 }, - { 16 , 4 }, - { 8 , 2 }, - { 4 , 1 }, - { 2 , 1 }, - { 1 , 1 } - } , - { - { 256 , 128 }, - { 128 , 64 }, - { 64 , 32 }, - { 32 , 16 }, - { 16 , 8 }, - { 8 , 4 }, - { 4 , 2 }, - { 2 , 1 }, - { 1 , 1 } - }, - { - { 256 , 256 }, - { 128 , 128 }, - { 64 , 64 }, - { 32 , 32 }, - { 16 , 16 }, - { 8 , 8 }, - { 4 , 4 }, - { 2 , 2 }, - { 1 , 1 } - }, - { - { 128, 256 }, - { 64, 128 }, - { 32, 64 }, - { 16, 32 }, - { 8, 16 }, - { 4, 8 }, - { 2, 4 }, - { 1, 2 }, - { 1, 1 } - }, - { - { 64, 256 }, - { 32, 128 }, - { 16, 64 }, - { 8, 32 }, - { 4, 16 }, - { 2, 8 }, - { 1, 4 }, - { 1, 2 }, - { 1, 1 } - }, - { - { 32, 256 }, - { 16, 128 }, - { 8, 64 }, - { 4, 32 }, - { 2, 16 }, - { 1, 8 }, - { 1, 4 }, - { 1, 2 }, - { 1, 1 } - } -}; - -/* translates GR_ASPECT_* to bits for the TLOD register */ -const FxU32 _gr_aspect_xlate_table[] = -{ - (3<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (2<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (1<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - 0<< SST_LOD_ASPECT_SHIFT, - 1<< SST_LOD_ASPECT_SHIFT, - 2<< SST_LOD_ASPECT_SHIFT, - 3<< SST_LOD_ASPECT_SHIFT -}; - -const FxU32 _gr_evenOdd_xlate_table[] = -{ - 0xFFFFFFFF, /* invalid */ - SST_LOD_TSPLIT, /* even */ - SST_LOD_TSPLIT | SST_LOD_ODD, /* odd */ - 0, /* both */ -}; - -/* the size of each mipmap level in texels, 4 is the minimum no matter what */ -/* index is [aspect_ratio][lod] */ -static const FxU32 _grMipMapSize[4][16] = { - { /* 8:1 aspect ratio */ - 0x02000, /* 0 : 256x32 */ - 0x00800, /* 1 : 128x16 */ - 0x00200, /* 2 : 64x8 */ - 0x00080, /* 3 : 32x4 */ - 0x00020, /* 4 : 16x2 */ - 0x00010, /* 5 : 8x1 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 0x04000, /* 0 : 256x64 */ - 0x01000, /* 1 : 128x32 */ - 0x00400, /* 2 : 64x16 */ - 0x00100, /* 3 : 32x8 */ - 0x00040, /* 4 : 16x4 */ - 0x00010, /* 5 : 8x2 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 0x08000, /* 0 : 256x128 */ - 0x02000, /* 1 : 128x64 */ - 0x00800, /* 2 : 64x32 */ - 0x00200, /* 3 : 32x16 */ - 0x00080, /* 4 : 16x8 */ - 0x00020, /* 5 : 8x4 */ - 0x00008, /* 6 : 4x2 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 1:1 aspect ratio */ - 0x10000, /* 0 : 256x256 */ - 0x04000, /* 1 : 128x128 */ - 0x01000, /* 2 : 64x64 */ - 0x00400, /* 3 : 32x32 */ - 0x00100, /* 4 : 16x16 */ - 0x00040, /* 5 : 8x8 */ - 0x00010, /* 6 : 4x4 */ - 0x00004, /* 7 : 2x2 */ - 0x00004, /* 8 : 1x1 */ - }, -}; - - -/* the offset from mipmap level 0 of each mipmap level in texels */ -/* index is [aspect_ratio][lod] */ -static FxU32 _grMipMapOffset[4][16]; -static FxU32 _grMipMapOffset_Tsplit[4][16]; - -/* initialize the MipMap Offset arrays */ -void -_grMipMapInit(void) -{ - int ar,lod; - - for(ar = 0; ar < 4; ar++) { /* for each aspect ratio */ - _grMipMapOffset[ar][0] = 0; /* start off with offset=0 */ - for(lod = 1; lod <= 9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset[ar][lod] = _grMipMapOffset[ar][lod - 1] + _grMipMapHostSize[3 - ar][lod - 1]; - } - - _grMipMapOffset_Tsplit[ar][0] = 0; /* start off with offset=0 */ - _grMipMapOffset_Tsplit[ar][1] = 0; /* start off with offset=0 */ - for (lod = 2; lod <= 9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset_Tsplit[ar][lod] = _grMipMapOffset_Tsplit[ar][lod - 2] + _grMipMapHostSize[3 - ar][lod - 2]; - } - } -} /* _grMipMapInit */ - -/*--------------------------------------------------------------------------- -** This is not DI anymore. Perhaps all of these size routines need -** to be in gtex.c now. -*/ -FxU32 -_grTexTextureMemRequired(GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd, - FxBool roundP) -{ -#define FN_NAME "_grTexTextureMemRequired" - FxU32 memrequired; - - GR_CHECK_W(FN_NAME, - small_lod < large_lod, - "small_lod bigger than large_lod"); - GR_CHECK_F(FN_NAME, - (evenOdd > GR_MIPMAPLEVELMASK_BOTH) || (evenOdd == 0), - "invalid evenOdd mask"); - - /* mirror aspect ratios because it does not matter for - * the size computation which dimension is shrunk. - */ - if ( aspect > GR_ASPECT_1x1 ) - aspect = GR_ASPECT_1x8 - aspect; - - if ( evenOdd == GR_MIPMAPLEVELMASK_BOTH ) { - memrequired = _grMipMapOffset[aspect][small_lod + 1]; - memrequired -= _grMipMapOffset[aspect][large_lod]; - } else { - memrequired = 0; - /* construct XOR mask */ - evenOdd = (evenOdd == GR_MIPMAPLEVELMASK_EVEN); - - /* Sum all the mipmap levels that match the xor mask for the lod */ - while (large_lod <= small_lod) { - if ((large_lod ^ evenOdd) & 1) { - memrequired += _grMipMapSize[aspect][large_lod]; - } - large_lod++; - } - } - - /* Convert from texels to bytes */ - if ( format >= GR_TEXFMT_16BIT ) - memrequired <<= 1; - - if (roundP) { - memrequired += SST_TEXTURE_ALIGN_MASK; - memrequired &= ~SST_TEXTURE_ALIGN_MASK; - } - - return memrequired; -#undef FN_NAME -} /* _grTexTextureMemRequired */ - -FxU16 -_grTexFloatLODToFixedLOD( float value ) -{ - float num_quarters; - int new_value; - - num_quarters = ( value + .125F ) / .25F; - new_value = ( int ) num_quarters; - - new_value &= 0x003F; - - return new_value; -} /* _grTexFloatLODToFixedLOD */ - -/*--------------------------------------------------------------------------- -** _grTexCalcBaseAddress -*/ -FxU32 -_grTexCalcBaseAddress( FxU32 start, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 odd_even_mask) -{ - FxU32 - sum_of_lod_sizes; - - if ( aspect > G3_ASPECT_TRANSLATE(GR_ASPECT_1x1) ) /* mirror aspect ratios */ - aspect = G3_ASPECT_TRANSLATE(GR_ASPECT_1x8) - aspect; - - if ( odd_even_mask == GR_MIPMAPLEVELMASK_BOTH ) { - sum_of_lod_sizes = _grMipMapOffset[aspect][large_lod]; - } else { - if (((odd_even_mask == GR_MIPMAPLEVELMASK_EVEN) && (large_lod & 1)) || - ((odd_even_mask == GR_MIPMAPLEVELMASK_ODD) && !(large_lod & 1))) - large_lod += 1; - sum_of_lod_sizes = _grMipMapOffset_Tsplit[aspect][large_lod]; - } - - if ( format >= GR_TEXFMT_16BIT ) - sum_of_lod_sizes <<= 1; - - /* Clamp the size down. The hw is still going to use the complete - * size computation, but it always starts from an aligned baseAddr - * so we need to take this into account before doing the subtraction - * otherwise we'll be on the wrong 'side' of the minimum aligned - * allocation unit. - */ - sum_of_lod_sizes &= ~SST_TEXTURE_ALIGN_MASK; - - return ( start - sum_of_lod_sizes ); -} /* _grTexCalcBaseAddress */ - -/*--------------------------------------------------------------------------- -** grTexCalcMemRequired -*/ -GR_DIENTRY(grTexCalcMemRequired, FxU32, - ( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format )) -{ - FxU32 memrequired; - - memrequired = _grTexTextureMemRequired(small_lod, large_lod, - aspect, format, - GR_MIPMAPLEVELMASK_BOTH, - FXTRUE); - GDBG_INFO(88,"grTexCalcMemRequired(%d,%d,%d,%d) => 0x%x(%d)\n", - small_lod,large_lod,aspect,format,memrequired,memrequired); - - return memrequired; -} /* grTexCalcMemRequired */ - - -/*--------------------------------------------------------------------------- -** grTexDetailControl -*/ -GR_DIENTRY(grTexDetailControl, void, - ( GrChipID_t tmu, int lod_bias, FxU8 detail_scale, - float detail_max )) -{ -#define FN_NAME "grTexDetailControl" - FxU32 tDetail; - FxU32 dmax = ( FxU32 ) ( detail_max * _GlideRoot.pool.f255 ); - FxU32 dscale = detail_scale; - - GR_BEGIN_NOFIFOCHECK("grTexDetailControl",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%g)\n",tmu,detail_scale,detail_max); - GR_CHECK_TMU( FN_NAME, tmu ); - GR_CHECK_F( myName, lod_bias < -32 || lod_bias > 31, "lod_bias out of range" ); - GR_CHECK_F( myName, detail_scale > 7, "detail_scale out of range" ); - GR_CHECK_F( myName, detail_max < 0.0 || detail_max > 1.0, "detail_max out of range" ); - - tDetail = ( ( lod_bias << SST_DETAIL_BIAS_SHIFT ) & SST_DETAIL_BIAS ); - tDetail |= ( ( dmax << SST_DETAIL_MAX_SHIFT ) & SST_DETAIL_MAX ); - tDetail |= ( ( dscale << SST_DETAIL_SCALE_SHIFT ) & SST_DETAIL_SCALE ); - - /* MULTIPLAT */ - _grTexDetailControl( tmu, tDetail ); - GR_END(); -#undef FN_NAME -} /* grTexDetailControl */ - -GR_DIENTRY(grTexMinAddress, FxU32, ( GrChipID_t tmu )) -{ -#define FN_NAME "grTexMinAddress" - GR_BEGIN_NOFIFOCHECK("grTexMinAddress",88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - FXUNUSED( tmu ); - GR_RETURN(0); -#undef FN_NAME -} /* grTexMinAddress */ - - -/*------------------------------------------------------------------- - Function: grTexMaxAddress - Date: 6/2 - Implementor(s): GaryT - Library: glide - Description: - Returns address of maximum extent of texture ram for a given TMU - Arguments: - tmu - Return: - the largest valid texture start Address - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexMaxAddress, FxU32, ( GrChipID_t tmu )) -{ -#define FN_NAME "grTexMaxAddress" - GR_BEGIN_NOFIFOCHECK("grTexMaxAddress",88); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - SST_TEXTURE_ALIGN); -#undef FN_NAME -} /* grTexMaxAddress */ - - -/*------------------------------------------------------------------- - Function: grTexTextureMemRequired - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns the tmu memory required to store the specified mipmap - ( Gary and I don't like the name of this function, but are - a little backed into a corner because of the existence - of grTexMemRequired() which does not imply any distinction - between texture memory and system ram ) - Arguments: - evenOdd - which set of mipmap levels are to be stored - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimensions - of texture - Return: - offset to be added to current texture base address to calculate next - valid texture memory download location - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexTextureMemRequired, FxU32, - ( FxU32 evenOdd, GrTexInfo *info)) -{ - FxU32 memrequired; - - GR_CHECK_F( "grTexTextureMemRequired", !info, "invalid info pointer" ); - memrequired = _grTexTextureMemRequired(info->smallLod, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd, - FXTRUE); - - GDBG_INFO(88,"grTexTextureMemRequired(%d,0x%x) => 0x%x(%d)\n", - evenOdd,info,memrequired,memrequired); - - return memrequired; -} /* grTexTextureMemRequired */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMap - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a texture mipmap to the specified tmu at the specified - base address. - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimension of - texture to be downloaded and containing texture data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadMipMap, void, - ( GrChipID_t tmu, FxU32 startAddress, FxU32 - evenOdd, GrTexInfo *info )) -{ - GR_DCL_GC; - GrLOD_t lod; - char *src_base; - - FXUNUSED(gc); - - GDBG_INFO(89,"grTexDownloadMipMap(%d,0x%x,%d,0x%x\n",tmu,startAddress,evenOdd,info); - GR_CHECK_TMU( "grTexDownloadMipMap", tmu ); - GR_CHECK_COMPATABILITY("grTexDownloadMipMap", - startAddress + grTexTextureMemRequired( evenOdd, info ) > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F( "grTexDownloadMipMap", evenOdd > 0x3, "evenOdd mask invalid" ); - GR_CHECK_F( "grTexDownloadMipMap", !info, "info invalid" ); - - src_base = (char *)info->data; - - /*--------------------------------------------------------------- - Download one mipmap level at a time - ---------------------------------------------------------------*/ - for( lod = info->largeLod; lod <= info->smallLod; lod++ ) { - grTexDownloadMipMapLevel( tmu, - startAddress, - lod, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd, - src_base ); - - src_base += _grMipMapHostSize[_gr_aspect_index_table[info->aspectRatio]][lod] << (info->format>=GR_TEXFMT_16BIT); - } -} /* grTexDownloadMipMap */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadTablePartial - Date: 6/3 - Implementor(s): GaryT - Library: glide - Description: - download part of a look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadTablePartial, void, - ( GrChipID_t tmu, GrTexTable_t type, - void *data, int start, int end )) -{ -#define FN_NAME "grTexDownloadTablePartial" - GR_BEGIN_NOFIFOCHECK("grTexDownloadTablePartial",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x, %d,%d)\n",tmu,type,data,start,end); - GR_CHECK_TMU(FN_NAME,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - - if ( type == GR_TEXTABLE_PALETTE ) /* Need Palette Download Code */ - _grTexDownloadPalette( tmu, (GuTexPalette *)data, start, end ); - else { /* Type is an ncc table */ - _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end ); - } - GR_END(); -#undef FN_NAME -} /* grTexDownloadTable */ - -/*--------------------------------------------------------------------------- -** grTexDownloadMipMapLevel -*/ -GR_DIENTRY(grTexDownloadMipMapLevel, void, - ( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, - GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, void *data )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevel",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data); - grTexDownloadMipMapLevelPartial( tmu, startAddress, - thisLod, largeLod, - aspectRatio, format, - evenOdd, data, - 0, _grMipMapHostWH[aspectRatio][thisLod][1] - 1 ); - GR_END(); -} /* grTexDownloadMipmapLevel */ - -FxU16 rle_line[256]; -FxU16 *rle_line_end; - -#if (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS | defined(__linux__))) -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) -{ - /* don't do anything just shut up the compiler */ -} -#endif /* (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) */ diff --git a/glide2x/h3/glide/src/fifo.c b/glide2x/h3/glide/src/fifo.c deleted file mode 100644 index 40e4988..0000000 --- a/glide2x/h3/glide/src/fifo.c +++ /dev/null @@ -1,861 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 39 3/14/99 1:42p Peter -** really invokve the ggggsoph -** -** 38 3/13/99 9:48p Dow -** -** 37 12/05/98 1:06p Dow -** Made some eschatology automatic -** -** 36 10/21/98 10:41a Atai -** -** 35 7/24/98 2:03p Dow -** AGP Stuff -** -** 34 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 33 7/23/98 1:17a Dow -** Bump & Grind -** -** 32 7/06/98 6:49p Jdt -** Protected in-memory command fifo code -** -** 31 6/15/98 5:55p Hanson -** Added ifdef for hpflip interface code -** -** 30 6/15/98 4:27p Hanson -** Fixed bug in my interface -** -** 29 6/15/98 3:52p Hanson -** Added interface for hpflip. Functions are not exported. -** Function added: -** _grGetCommandTransportInfo -** _grSetCommandTransportInfo -** -** No support for these functions is needed. It just makes my life a lot -** easier, to synch up with the latest glide. -** -** 28 5/29/98 4:30p Peter -** Chris's swap pending thing -** -** 27 4/22/98 11:48a Dow -** Fixed level -** -** 26 4/22/98 8:41a Dow -** AGP Workaround -** -** 25 4/05/98 2:32p Dow -** Fixed non-debug compiler error -** -** 24 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 23 3/28/98 11:24a Dow -** itwoç -** -** 21 2/17/98 12:50p Dow -** Added conditional fifo id. -** -** 20 2/08/98 3:08p Dow -** FIFO Works - * - * 18 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 17 12/09/97 12:20p Peter - * mac glide port - * - * 16 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 15 12/05/97 4:26p Peter - * watcom warnings - * - * 14 12/03/97 11:34a Peter - * dos debugging - * - * 13 11/21/97 3:53p Peter - * reset messages are controlled by gdbg_level - * - * 12 11/19/97 6:04p Peter - * actually exit if not reset - * - * 11 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 10 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 9 11/15/97 9:20p Peter - * I am the sorriest f*cker on the face of the planet - * - ** - */ - -#include -#include - -#if defined(__WIN32__) -#include -#endif - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -#if GDBG_INFO_ON - -static const char* h3SstRegNames[] = { - "status", - "intrCtrl", - "vAx", - "vAy", - "vBx", - "vBy", - "vCx", - "vCx", - "r", - "g", - "b", - "z", - "a", - "s", - "t", - "w", - "drdx", - "dgdx", - "dbdx", - "dzdx", - "dadx", - "dsdx", - "dtdx", - "dwdx", - "drdy", - "dgdy", - "dbdy", - "dzdy", - "dady", - "dsdy", - "dtdy", - "dwdy", - "triangleCMD", - "reservedA", - "FvAx", - "FvAy", - "FvBx", - "FvBy", - "FvCx", - "FvCy", - "Fr", - "Fg", - "Fb", - "Fz", - "Fa", - "Fs", - "Ft", - "Fw", - "Fdrdx", - "Fdgdx", - "Fdbdx", - "Fdzdx", - "Fdadx", - "Fdsdx", - "Fdtdx", - "Fdwdx", - "Fdrdy", - "Fdgdy", - "Fdbdy", - "Fdzdy", - "Fdady", - "Fdsdy", - "Fdtdy", - "Fdwdy", - "FtriangleCMD", - "fbzColorPath", - "fogMode", - "alphaMode", - "fbzMode", - "lfbMode", - "clipLeftRight", - "clipBottomTop", - "nopCMD", - "fastfillCMD", - "swapbufferCMD", - "fogColor", - "zaColor", - "chromaKey", - "chromaRange", - "userIntrCmd", - "stipple", - "c0", - "c1", - "fbiPixelsIn", - "fbiChromaFail", - "fbiZfuncFail", - "fbiAfuncFail", - "fbiPixelsOut", - "fogTable00", - "fogTable01", - "fogTable02", - "fogTable03", - "fogTable04", - "fogTable05", - "fogTable06", - "fogTable07", - "fogTable08", - "fogTable09", - "fogTable0a", - "fogTable0b", - "fogTable0c", - "fogTable0d", - "fogTable0e", - "fogTable0f", - "fogTable10", - "fogTable11", - "fogTable12", - "fogTable13", - "fogTable14", - "fogTable15", - "fogTable16", - "fogTable17", - "fogTable18", - "fogTable19", - "fogTable1a", - "fogTable1b", - "fogTable1c", - "fogTable1d", - "fogTable1e", - "fogTable1f", - "reservedB0", - "reservedB1", - "reservedB2", - "colBufferAddr", - "colBufferStride", - "auxBufferAddr", - "auxBufferStride", - "reservedC", - "clipLeftRight1", - "clipBottomTop1", - "reservedD0", - "reservedD1", - "reservedD2", - "reservedD3", - "reservedD4", - "reservedD5", - "reservedE0", - "reservedE1", - "reservedE2", - "reservedE3", - "reservedE4", - "reservedE5", - "reservedE6", - "reservedE7", - "reservedF0", - "reservedF1", - "reservedF2", - "swapBufferPend", - "leftOverlayBuf", - "rightOverlayBuf", - "fbiSwapHistory", - "fbiTrianglesOut", - "sSetupMode", - "sVx", - "sVy", - "sARGB", - "sRed", - "sGreen", - "sBlue", - "sAlpha", - "sVz", - "sOowfbi", - "sOow0", - "sSow0", - "sTow0", - "sOow1", - "sSow1", - "sTow1", - "sDrawTriCMD", - "sBeginTriCMD", - "reservedG0", - "reservedG1", - "reservedG2", - "reservedG3", - "reservedG4", - "reservedG5", - "reservedH0", - "reservedH1", - "reservedH2", - "reservedH3", - "reservedH4", - "reservedH5", - "reservedH6", - "reservedH7", - "reservedI0", - "reservedI1", - "reservedI2", - "reservedI3", - "reservedI4", - "reservedI5", - "reservedI6", - "reservedI7", - "textureMode", - "tLOD", - "tDetail", - "texBaseAddr", - "texBaseAddr1", - "texBaseAddr2", - "texBaseAddr38", - "trexInit0", - "trexInit1", - "nccTable0-0", - "nccTable0-1", - "nccTable0-2", - "nccTable0-3", - "nccTable0-4", - "nccTable0-5", - "nccTable0-6", - "nccTable0-7", - "nccTable0-8", - "nccTable0-9", - "nccTable0-a", - "nccTable0-b", - "nccTable1-0", - "nccTable1-1", - "nccTable1-2", - "nccTable1-3", - "nccTable1-4", - "nccTable1-5", - "nccTable1-6", - "nccTable1-7", - "nccTable1-8", - "nccTable1-9", - "nccTable1-a", - "nccTable1-b", - "tChromaKeyMin", - "tChromaKeyMax", -}; - -static const char * h3SstIORegNames[] = { - "status", - "pciInit0", - "sipMonitor", - "lfbMemoryConfig", - "miscInit0", - "miscInit1", - "dramInit0", - "dramInit1", - "agpInit", - "tmuGbeInit", - "vgaInit0", - "vgaInit1", - "dramCommand", - "dramData", - "reservedZ0" - "reservedZ0" - "pllCtrl0", - "pllCtrl1", - "pllCtrl2", - "dacMode", - "dacAddr", - "dacData", - "vidMaxRGBDelta", - "vidProcCfg", - "hwCurPatAddr", - "hwCurLoc", - "hwCurC0", - "hwCurC1", - "vidInFormat", - "vidInStatus", - "vidSerialParallelPort", - "vidInXDecimDeltas", - "vidInDecimInitErrs", - "vidInYDecimDeltas", - "vidPixelBufThold", - "vidChromaMin", - "vidChromaMax", - "vidCurrentLine", - "vidScreenSize", - "vidOverlayStartCoords", - "vidOverlayEndScreenCoord", - "vidOverlayDudx", - "vidOverlayDudxOffsetSrcWidth", - "vidOverlayDvdy", - "vgaRegister[0]", - "vgaRegister[1]", - "vgaRegister[2]", - "vgaRegister[3]", - "vgaRegister[4]", - "vgaRegister[5]", - "vgaRegister[6]", - "vgaRegister[7]", - "vgaRegister[8]", - "vgaRegister[9]", - "vgaRegister[a]", - "vgaRegister[b]", - "vidOverlayDvdyOffset", - "vidDesktopStartAddr", - "vidDesktopOverlayStride", - "vidInAddr0", - "vidInAddr1", - "vidInAddr2", - "vidInStride", - "vidCurrOverlayStartAddr", -} ; - - -#define GEN_INDEX(a) ((((FxU32) a) - ((FxU32) gc->reg_ptr)) >> 2) - -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 index = GEN_INDEX(addr); - - GDBG_INFO(gc->myLevel + 199, "Storing to FIFO:\n"); - GDBG_INFO(gc->myLevel + 199, " FIFO Ptr: 0x%x : 0x%X\n", fifoPtr, gc->cmdTransportInfo.fifoRoom); - if (index <= 0xff) { - GDBG_INFO(gc->myLevel + 199, " Reg Name: %s\n", h3SstRegNames[index]); - GDBG_INFO(gc->myLevel + 199, " Reg Num: 0x%X\n", index); - } else { - const char* strP; - const FxU32 offset = (addr - (FxU32)gc->reg_ptr); - - if (offset >= HW_TEXTURE_OFFSET) { - strP = "Texture"; - } else if (offset >= HW_LFB_OFFSET) { - strP = "LFB"; - index = addr; - } else if (offset >= HW_FIFO_OFFSET) { - strP = "Cmd FIFO"; - } else { - strP = "Woah!"; - } - GDBG_INFO(gc->myLevel + 199, " %s Addr: 0x%X\n", - strP, index); - } - GDBG_INFO(gc->myLevel + 199, " Value: 0x%X 0x%X\n", (index << 2), val); - - GDBG_INFO(120, " SET(0x%X, %ld(0x%X)) 0 %s (0x%X)\n", - 0x10000000UL + (FxU32)(index << 2), val, val, - h3SstRegNames[index & 0xFF], fifoPtr); -} /* _grFifoWriteDebug */ - -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 index = GEN_INDEX(addr); - - GDBG_INFO(gc->myLevel + 200, "Storing to FIFO:\n"); - GDBG_INFO(gc->myLevel + 200, " FIFO Ptr: 0x%x\n", fifoPtr); - if (index <= 0xff) { - GDBG_INFO(gc->myLevel + 200, " Reg Name: %s\n", h3SstRegNames[index]); - GDBG_INFO(gc->myLevel + 200, " Reg Num: 0x%x\n", index); - } - GDBG_INFO(gc->myLevel + 200, " Value: %4.2f\n", val); - - GDBG_INFO(120, " SET(0x%X, %4.2f (0x%X)) 0 %s\n", - 0x10000000UL + (FxU32)(index << 2), val, *(const FxU32*)&val, - h3SstRegNames[index & 0xFF]); -} /* _grFifoFWriteDebug */ - -extern void -_grH3FifoDump_TriHdr(const FxU32 hdrVal) -{ - GR_DCL_GC; - - /* Dump Packet Header */ - GDBG_INFO(gc->myLevel + 200, "CMD Fifo Triangle Packet (0x%X)\n", hdrVal); - GDBG_INFO(gc->myLevel + 200, " # Vertex: 0x%X\n", - (hdrVal & SSTCP_PKT3_NUMVERTEX) >> SSTCP_PKT3_NUMVERTEX_SHIFT); - GDBG_INFO(gc->myLevel + 200, " RGB: %s\n", - (hdrVal & SSTCP_PKT3_PACKEDCOLOR) ? "Packed" : "Separate"); - - GDBG_INFO(gc->myLevel + 200, " StripMode: %s\n", - (((hdrVal & (0x01 << 22)) == 0) ? "Strip" : "Fan")); - - GDBG_INFO(gc->myLevel + 200, " Culling: %s\n", - (((hdrVal & (0x01 << 23)) == 0) ? "Disable" : "Enable")); - - GDBG_INFO(gc->myLevel + 200, " CullingSign: %s\n", - (((hdrVal & (0x01 << 24)) == 0) ? "Positive" : "Negative")); - - GDBG_INFO(gc->myLevel + 200, " PingPongSign: %s\n", - (((hdrVal & (0x01 << 25)) == 0) ? "Normal" : "Disable")); - - if (GDBG_GET_DEBUGLEVEL(gc->myLevel + 200)) { - const FxU32 temp = (hdrVal & SSTCP_PKT3_PMASK); - int i; - - GDBG_INFO(gc->myLevel + 200, " Params: X Y"); - - for(i = 10; i <= 17; i++) { - static const char* paramSel[] = { "RGB", "Alpha", "Z", "Wb", "W0", "ST[0]", "W1", "ST[1]" }; - - if ((temp & (0x01UL << i)) != 0) GDBG_PRINTF("%s ", paramSel[i - 10]); - } - GDBG_INFO(gc->myLevel + 200, "\n"); - } - - { - const FxU32 temp = (hdrVal & SSTCP_PKT3_CMD) >> SSTCP_PKT3_CMD_SHIFT; - const char* tempStr; - - switch(temp) { - case 0x00: tempStr = "Independent"; break; - case 0x01: tempStr = "NewStrip"; break; - case 0x02: tempStr = "ContinueStrip"; break; - default: tempStr = "Reserved"; break; - } - GDBG_INFO(gc->myLevel + 200, " Command: 0x%X(%s)\n", temp, tempStr); - } -} - -void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args) -{ - static FxBool inProcP = FXFALSE; - - if (!inProcP) { - static char errMsgBuf[1024]; - - inProcP = FXTRUE; - { - extern void (*GrErrorCallback)( const char *string, FxBool fatal ); - - vsprintf(errMsgBuf, format, args); - (*GrErrorCallback)(errMsgBuf, (GETENV("FX_ERROR_FAIL") != NULL)); - } - inProcP = FXFALSE; - } -} - -#endif /* GDBG_INFO_ON */ - -#if USE_PACKET_FIFO - -/* Routines privately exported so that the manufacturing diags - * and other things can do register writes etc w/o having access - * to the glide internals etc. - */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val) -{ -#define FN_NAME "_grSet32" - GR_DCL_GC; - - GR_ASSERT(sstAddr >= gc->base_ptr); - GR_ASSERT(sstAddr < &SST_TMU(gc->reg_ptr, GR_TMU0)->status); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET_INDEX(BROADCAST_ID, gc->reg_ptr, (sstAddr - gc->reg_ptr), val); - GR_CHECK_SIZE(); -#undef FN_NAME -} - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr) -{ -#define FN_NAME "_grGet32" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 88); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", sstAddr); - GR_RETURN(GR_GET(*sstAddr)); -#undef FN_NAME -} /* _grGet32 */ - -#if FIFO_ASSERT_FULL -const FxU32 kFifoCheckMask = 0xFFFF; -FxU32 gFifoCheckCount = 0; -#endif - -void -_grBumpNGrind() -{ -#define FN_NAME "_grCheckForBump" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 400); - - P6FENCE; - GR_CAGP_SET(bump, gc->cmdTransportInfo.fifoPtr - gc->cmdTransportInfo.lastBump); - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoPtr; - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoPtr + (gc->cmdTransportInfo.bumpSize); - if (gc->cmdTransportInfo.bumpPos > gc->cmdTransportInfo.fifoEnd) - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoEnd; - - GR_ASSERT(gc->cmdTransportInfo.bumpPos != 0); - GR_ASSERT(gc->cmdTransportInfo.lastBump != 0); -#undef FN_NAME -} /* _grCheckForBump */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine) -{ -#define FN_NAME "_FifoMakeRoom" - FxU32 wrapAddr = 0x00UL; - FxU32 checks; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 400); - - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - - GR_ASSERT(blockSize > 0); - GR_ASSERT((FxU32)blockSize < gc->cmdTransportInfo.fifoSize); - FIFO_ASSERT(); - - /* Update the roomToXXX values w/ the # of writes since the last - * fifo stall/wrap. - */ - { - const FxI32 writes = (MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd) - - gc->cmdTransportInfo.fifoRoom); - - gc->cmdTransportInfo.roomToReadPtr -= writes; - gc->cmdTransportInfo.roomToEnd -= writes; - -#if GDBG_INFO_ON - GDBG_INFO_MORE(gc->myLevel, ": (%s : %d)\n" - "\tfifoBlock: (0x%X : 0x%X)\n" - "\tfifoRoom: (0x%X : 0x%X) : (0x%X : 0x%X)\n" - "\tfifo hw: (0x%X : 0x%X)\n", - ((fName == NULL) ? "Unknown" : fName), fLine, - (FxU32)gc->cmdTransportInfo.fifoPtr, blockSize, - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRoom, writes, - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead); - -#endif /* GDBG_INFO_ON */ - - ASSERT_FAULT_IMMED((gc->cmdTransportInfo.roomToReadPtr >= 0) && - (gc->cmdTransportInfo.roomToEnd >= 0)); - } - - checks = 0; - again: - /* do we need to stall? */ - { - FxU32 lastHwRead = gc->cmdTransportInfo.fifoRead; - FxI32 roomToReadPtr = gc->cmdTransportInfo.roomToReadPtr; - - while (roomToReadPtr < blockSize) { - FxU32 curReadPtr = HW_FIFO_PTR(FXTRUE); - FxU32 curReadDist = curReadPtr - lastHwRead; - - checks++; - -#ifdef GDBG_INFO_ON - if (checks > 1000) { - FxU32 - baseAddrL, - baseSize, - readPtrL, - aMin, - aMax, - depth, - holeCount; - - baseAddrL = GR_CAGP_GET(baseAddrL); - baseSize = GR_CAGP_GET(baseSize); - readPtrL = GR_CAGP_GET(readPtrL); - aMin = GR_CAGP_GET(aMin); - aMax = GR_CAGP_GET(aMax); - depth = GR_CAGP_GET(depth); - holeCount = GR_CAGP_GET(holeCount); - - GDBG_PRINTF("Fifo check timeout:\n"); - GDBG_PRINTF("\tbaseAddrL = 0x%x\n", baseAddrL); - GDBG_PRINTF("\tbaseSize = 0x%x\n", baseSize); - GDBG_PRINTF("\treadPtrL = 0x%x\n", readPtrL); - GDBG_PRINTF("\tdepth = 0x%x\n", depth); - GDBG_PRINTF("\tholeCount = 0x%x\n", holeCount); - GDBG_PRINTF("\taMin = 0x%x\n", aMin); - GDBG_PRINTF("\taMax = 0x%x\n", aMax); - - if ( - (readPtrL < (baseAddrL << 12)) || - (readPtrL > ((baseAddrL + baseSize + 1) << 12)) - ) { - GDBG_PRINTF("FATAL ERROR: Read Pointer out of command buffer extents\n"); - exit(-1); - } - checks = 0; - } -#endif - - GR_ASSERT((curReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (curReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd)); - - roomToReadPtr += curReadDist; - - _GlideRoot.stats.fifoStalls++; - _GlideRoot.stats.fifoStallDepth += GR_CAGP_GET(depth); - - /* Have we wrapped yet? */ - if (lastHwRead > curReadPtr) roomToReadPtr += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - lastHwRead = curReadPtr; - } - - GR_ASSERT((lastHwRead >= (FxU32)gc->cmdTransportInfo.fifoStart) && - (lastHwRead < (FxU32)gc->cmdTransportInfo.fifoEnd)); - - /* Update cached copies */ - gc->cmdTransportInfo.fifoRead = lastHwRead; - gc->cmdTransportInfo.roomToReadPtr = roomToReadPtr; - - GDBG_INFO(gc->myLevel, " Wait: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - } - - /* Do we need to wrap to front? */ - if (gc->cmdTransportInfo.roomToEnd <= blockSize) { - GDBG_INFO(gc->myLevel + 10, " Pre-Wrap: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - - - /* Set the jsr packet. - * NB: This command must be fenced. - */ - FIFO_ASSERT(); - { - P6FENCE; - if (!gc->cmdTransportInfo.autoBump) { - SET(*gc->cmdTransportInfo.fifoPtr++, gc->cmdTransportInfo.fifoJmpHdr[0]); - SET(*gc->cmdTransportInfo.fifoPtr++, gc->cmdTransportInfo.fifoJmpHdr[1]); - GR_CAGP_SET(bump, 2); - - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoStart; - } else - SET(*gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoJmpHdr[0]); - } - - P6FENCE; - - wrapAddr = (FxU32)gc->cmdTransportInfo.fifoPtr; - - /* Update roomXXX fields for the actual wrap */ - gc->cmdTransportInfo.roomToReadPtr -= gc->cmdTransportInfo.roomToEnd; - gc->cmdTransportInfo.roomToEnd = gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST; - -#if GLIDE_USE_DEBUG_FIFO - _GlideRoot.stats.fifoWraps++; - _GlideRoot.stats.fifoWrapDepth += GR_GET(hw->cmdFifoDepth); -#endif - - /* Reset fifo ptr to start */ - gc->cmdTransportInfo.fifoPtr = gc->cmdTransportInfo.fifoStart; - -#if GLIDE_USE_DEBUG_FIFO - { - FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowPtr; - - while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2)) - *fifoPtr++ = 0x00UL; - gc->cmdTransportInfo.fifoShadowPtr = gc->cmdTransportInfo.fifoShadowBase; - } -#endif - - GDBG_INFO(gc->myLevel + 10, " Post-Wrap: (0x%X : 0x%X) : 0x%X\n", - gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd, - gc->cmdTransportInfo.fifoRead); - - goto again; - } - - /* compute room left */ - gc->cmdTransportInfo.fifoRoom = MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd); - -#if GDBG_INFO_ON - GDBG_INFO(gc->myLevel, FN_NAME"_Done:\n" - "\tfifoBlock: (0x%X : 0x%X)\n" - "\tfifoRoom: (0x%X : 0x%X : 0x%X)\n" - "\tfifo hw: (0x%X : 0x%X) : (0x%X : 0x%X : 0x%X)\n", - (FxU32)gc->cmdTransportInfo.fifoPtr, blockSize, - gc->cmdTransportInfo.roomToReadPtr, - gc->cmdTransportInfo.roomToEnd, gc->cmdTransportInfo.fifoRoom, - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead, - GR_CAGP_GET(depth), GR_CAGP_GET(holeCount), GR_GET(hw->status)); -#endif /* GDBG_INFO_ON */ - - /* NB: Work around for the buffer swap pending bug in the status - * register. All of the logic for keeping track of that is in - * grBufferNumPending() - */ - grBufferNumPending(); - - FIFO_ASSERT(); - GR_TRACE_EXIT(FN_NAME); -#undef FN_NAME -} - -void -_grH3FifoDump_Linear(const FxU32* const linearPacketAddr) -{ -#ifdef GDBG_INFO_ON - FXUNUSED(h3SstIORegNames); -#endif -} - - -FxU32 -_grHwFifoPtr(FxBool ignored) -{ - FxU32 rVal; -#if 1 - FxU32 status, readPtrL1, readPtrL2; - GR_DCL_GC; - - FXUNUSED(ignored); - - do { - readPtrL1 = GET(gc->cRegs->cmdFifo0.readPtrL); - status = GET(gc->ioRegs->status); - readPtrL2 = GET(gc->cRegs->cmdFifo0.readPtrL); - } while (readPtrL1 != readPtrL2); - rVal = ((FxU32)gc->cmdTransportInfo.fifoStart) + readPtrL2 - - (FxU32) gc->cmdTransportInfo.fifoOffset; -#else - GR_DCL_GC; - rVal = - (FxU32) gc->cmdTransportInfo.fifoStart + - GET(gc->cRegs->cmdFifo0.readPtrL) - - gc->cmdTransportInfo.fifoOffset; -#endif - return rVal; - -} /* _grHwFifoPtr */ - -#endif /* USE_PACKET_FIFO */ diff --git a/glide2x/h3/glide/src/fxbldno.c b/glide2x/h3/glide/src/fxbldno.c deleted file mode 100644 index 9a94817..0000000 --- a/glide2x/h3/glide/src/fxbldno.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - * - * $Header$ - * $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 1 7/25/97 9:05a Pgj - * generate fxbldno.h which defines BUILD_NUMBER - * - */ - -#include -#include -#include - -main(int argc, char **argv) -{ - struct tm locTime; - time_t sysTime; - char *build; - - time(&sysTime); - locTime = *localtime(&sysTime); - - if (build = getenv("BUILD_NUMBER")) { - printf("#define BUILD_NUMBER %s\n", build); - } else { - unsigned short magic; - magic = (locTime.tm_yday << 7) | - (locTime.tm_hour << 2) | - (locTime.tm_min / 15); - printf("#define BUILD_NUMBER %d\n", magic); - } - return 0; - -} /* end main() */ diff --git a/glide2x/h3/glide/src/fxgasm.c b/glide2x/h3/glide/src/fxgasm.c deleted file mode 100644 index 42d59a1..0000000 --- a/glide2x/h3/glide/src/fxgasm.c +++ /dev/null @@ -1,271 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#define NEWLINE printf("\n") -#define COMMENT printf(";----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("; Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) -#else -#define NEWLINE printf("\n"); -#define COMMENT printf("#----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("# Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("#define %s\t 0x%08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("#define %s\t %10d\n",pname,((int)&p.o)-(int)&p) -#define OFFSET2(p,o,pname) if (hex) \ - printf("#define %s\t 0x%08x\n",pname,((int)&o)-(int)&p); \ - else printf("#define %s\t %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("#define SIZEOF_%s\t 0x%08x\n",pname,sizeof(p)); \ - else printf("#define SIZEOF_%s\t %10d\n",pname,sizeof(p)) -#endif - -int -main (int argc, char **argv) -{ - int hex=0; /* default is print in decimal */ - static struct _GlideRoot_s gr; - static GrGC gc; - -#if !GLIDE_HW_TRI_SETUP - static Sstregs sst; - static struct dataList_s dl; -#endif /* !GLIDE_HW_TRI_SETUP */ - - if (argc > 1) { - if (strcmp("-inline", argv[1]) == 0) { - SstRegs dummyRegs = { 0x00UL }; - - printf("#ifndef __FX_INLINE_H__\n"); - printf("#define __FX_INLINE_H__\n"); - printf("\n"); - -#if GLIDE_DISPATCH_SETUP - printf("#define kCurGCOffset 0x%XUL\n", - offsetof(struct _GlideRoot_s, curGC)); - - printf("#define kTriProcOffset 0x%XUL\n", - offsetof(struct GrGC_s, archDispatchProcs.triSetupProc)); -#endif /* GLIDE_DISPATCH_SETUP */ - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\n", - sizeof(dummyRegs.fogTable) >> 1); - - printf("\n"); - printf("#endif /* __FX_INLINE_H__ */\n"); - - return 0; - } - - hex = 1; - } - -#if !GLIDE_HW_TRI_SETUP - printf("SST_CHIP_MASK = 0%xh\n",SST_CHIP_MASK); -#endif - - HEADER ("SSTREGS"); - - NEWLINE; - HEADER ("GC"); - OFFSET (gc,base_ptr,"base_ptr\t"); - OFFSET (gc,reg_ptr,"reg_ptr\t\t"); - OFFSET (gc,lfb_ptr,"lfb_ptr\t\t"); - OFFSET (gc,tex_ptr,"tex_ptr\t\t"); - OFFSET (gc,state.cull_mode,"cull_mode\t"); - OFFSET (gc, regDataList,"regDataList\t"); - OFFSET (gc, tsuDataList,"tsuDataList\t"); - OFFSET (gc, cmdTransportInfo.triPacketHdr, "triPacketHdr"); - OFFSET (gc, cmdTransportInfo.cullStripHdr, "cullStripHdr"); - OFFSET (gc, cmdTransportInfo.paramMask, "paramMask"); - - OFFSET (gc, cmdTransportInfo.fifoStart, "fifoStart"); - OFFSET (gc, cmdTransportInfo.fifoEnd, "fifoEnd"); - OFFSET (gc, cmdTransportInfo.fifoOffset, "fifoOffset"); - OFFSET (gc, cmdTransportInfo.fifoSize, "fifoSize"); - OFFSET (gc, cmdTransportInfo.fifoJmpHdr, "fifoJmpHdr"); - OFFSET (gc, cmdTransportInfo.fifoPtr, "fifoPtr"); - OFFSET (gc, cmdTransportInfo.fifoRead, "fifoRead"); - - OFFSET (gc, cmdTransportInfo.fifoRoom, "fifoRoom"); - OFFSET (gc, cmdTransportInfo.roomToReadPtr, "roomToReadPtr"); - OFFSET (gc, cmdTransportInfo.roomToEnd, "roomToEnd"); - - OFFSET (gc, cmdTransportInfo.lfbLockCount, "lfbLockCount"); - - HEADER("GC Stuff for Chris"); - OFFSET(gc, totBuffers, "gc_totBuffers"); - OFFSET(gc, strideInTiles, " gc_strideInTiles"); - OFFSET(gc, heightInTiles, "gc_heightInTiles"); - OFFSET(gc, bufferStride, "gc_tileStride"); - OFFSET(gc, bufSizeInTiles, "gc_bufSizeInTiles"); - OFFSET(gc, bufSize, "gc_bufSize"); - OFFSET(gc, fbOffset, "gc_fbOffset"); - OFFSET(gc, tramOffset, "gc_tramOffset"); - OFFSET(gc, base_ptr, "gc_base_ptr"); - OFFSET(gc, reg_ptr, "gc_reg_ptr"); - OFFSET(gc, tex_ptr, "gc_tex_ptr"); - OFFSET(gc, lfb_ptr, "gc_lfb_ptr"); - -#ifdef GLIDE_INIT_HWC - OFFSET(gc, bInfo, "gc_bInfo"); -#endif - -#if GLIDE_MULTIPLATFORM - OFFSET(gc, gcFuncs, "gc_gcFuncs"); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - OFFSET(gc, oemInit, "gc_oemInit"); -#endif - - OFFSET(gc, cmdTransportInfo.fifoStart, "gc_cmdTransportInfo_fifoStart"); - OFFSET(gc, cmdTransportInfo.fifoEnd, "gc_cmdTransportInfo_fifoEnd"); - OFFSET(gc, cmdTransportInfo.fifoOffset, "gc_cmdTransportInfo_fifoOffset"); - OFFSET(gc, cmdTransportInfo.fifoSize, "gc_cmdTransportInfo_fifoSize"); - OFFSET(gc, cmdTransportInfo.fifoJmpHdr, "gc_cmdTransportInfo_fifoJmpHdr"); - - OFFSET(gc, cmdTransportInfo.fifoPtr, "gc_cmdTransportInfo_fifoPtr"); - OFFSET(gc, cmdTransportInfo.fifoRead, "gc_cmdTransportInfo_fifoRead"); - -#if GLIDE_USE_DEBUG_FIFO - OFFSET(gc, cmdTransportInfo.fifoShadowBase, "gc_cmdTransportInfo_fifoShadowBase"); - OFFSET(gc, cmdTransportInfo.fifoShadowPtr, "gc_cmdTransportInfo_fifoShadowPtr"); -#endif /* GLIDE_USE_DEBUG_FIFO */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - OFFSET(gc, cmdTransportInfo.fifoRoom, "gc_cmdTransportInfo_fifoRoom"); - OFFSET(gc, cmdTransportInfo.roomToReadPtr, "gc_cmdTransportInfo_roomToReadPtr"); - OFFSET(gc, cmdTransportInfo.roomToEnd, "gc_cmdTransportInfo_roomToEnd"); - - OFFSET(gc, cmdTransportInfo.lfbLockCount, "gc_cmdTransportInfo_lfbLockCount"); - - OFFSET(gc, ioRegs, "gc_ioRegs"); - OFFSET(gc, cRegs, "gc_cRegs"); - OFFSET(gc, gRegs, "gc_gRegs"); - OFFSET(gc, sstRegs, "gc_sstRegs"); - - OFFSET(gc, rawLfb, "gc_rawLfb"); - OFFSET(gc, nBuffers, "gc_nBuffers"); - OFFSET(gc, curBuffer, "gc_curBuffer"); - OFFSET(gc, frontBuffer, "gc_frontBuffer"); - OFFSET(gc, backBuffer, "gc_backBuffer"); - OFFSET(gc, buffers, "gc_buffers"); - - OFFSET(gc, counter, "gc_counter"); - - OFFSET(gc, expected_counter, "gc_expected_counter"); - - OFFSET(gc, checkCounter, "gc_checkCounter"); - OFFSET(gc, checkPtr, "gc_checkPtr"); - - - - SIZEOF (gr.GCs[0].state,"GrState\t"); - SIZEOF (gr.hwConfig,"GrHwConfiguration"); - SIZEOF (gr.GCs[0],"GC\t"); - NEWLINE; - - HEADER ("GlideRoot"); - OFFSET (gr,p6Fencer,"p6Fencer\t"); - OFFSET (gr,current_sst,"current_sst\t"); - OFFSET (gr,CPUType,"CPUType\t\t"); - OFFSET (gr,curGC,"curGC\t\t"); - OFFSET (gr,curTriSize,"curTriSize\t"); - - OFFSET (gr,stats.trisProcessed,"trisProcessed\t"); - OFFSET (gr,stats.trisDrawn,"trisDrawn\t"); - -#if GLIDE_PACKED_RGB - OFFSET (gr, pool.ftemp1, "fTemp1"); - OFFSET (gr, pool.ftemp2, "fTemp2"); - OFFSET (gr, pool.fBiasHi,"fBiasHi"); - OFFSET (gr, pool.fBiasLo,"fBiasLo"); -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_PACKED_RGB */ - - SIZEOF (gr,"GlideRoot"); - NEWLINE; - - HEADER ("GrVertex"); - { - GrVertex v; - - OFFSET(v, x, "x"); - OFFSET(v, y, "y"); - OFFSET(v, r, "r"); - OFFSET(v, g, "g"); - OFFSET(v, b, "b"); - OFFSET(v, a, "a"); - SIZEOF(v, "GrVertex"); - } - NEWLINE; - -#if !GLIDE_HW_TRI_SETUP - HEADER ("dataList"); - OFFSET (dl,i,"dl_i\t\t"); - OFFSET (dl,addr,"dl_addr\t\t"); - SIZEOF (dl,"dataList\t"); - NEWLINE; -#endif /* !GLIDE_HW_TRI_SETUP */ - - return 0; -} diff --git a/glide2x/h3/glide/src/fxglide.h b/glide2x/h3/glide/src/fxglide.h deleted file mode 100644 index bf512fe..0000000 --- a/glide2x/h3/glide/src/fxglide.h +++ /dev/null @@ -1,3378 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 243 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 242 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 241 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 240 3/15/99 10:51p Dow -** Vile Hack -** -** 239 3/14/99 1:42p Peter -** really invokve the ggggsoph -** -** 238 3/13/99 9:48p Dow -** -** 237 3/12/99 2:28p Dow -** Great-great-great grandson of packer workaround -** -** 236 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 235 3/04/99 3:15p Atai -** mods for direct write -** -** 234 3/02/99 2:21p Peter -** wax is a chip id -** -** 233 2/19/99 5:54p Peter -** new splash screen -** -** 232 2/18/99 7:11p Kcd -** Added P6FENCE for MacOS -** -** 231 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 230 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 229 12/09/98 2:07p Peter -** More Norbert's stuff for the other 3DNow!(tm) partners -** -** 228 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 227 12/02/98 2:53p Dow -** NT/9X Registry reading fix -** -** 226 11/18/98 7:57p Dow -** Added grxclk -** -** 225 11/12/98 2:50p Atai -** fixed register get -** -** 224 11/02/98 5:34p Atai -** merge direct i/o code -** -** 223 10/21/98 4:20p Atai -** gamma stuff -** -** 222 10/21/98 10:41a Atai -** -** 221 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 220 10/19/98 2:11p Peter -** ctrisetup happiness -** -** 219 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 218 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 217 8/27/98 6:33p Atai -** added environment.tmuMemory -** -** 216 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 215 7/24/98 2:03p Dow -** AGP Stuff -** -** 214 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 213 7/23/98 1:17a Dow -** Bump & Grind -** -** 212 7/14/98 2:48p Mikec -** Added Glide environment variable FX_GLIDE_EMUL_RUSH allow Banshee glide -** to report itself as Rush to the application. Set it to 1 to enable Rush -** reporting. By default Glide still reports itself as Voodoo Graphics. -** -** 211 7/09/98 12:00p Jdt -** -** 210 7/09/98 11:49a Jdt -** -** 209 7/09/98 11:33a Jdt -** fixed fencing for dos build -** -** 208 7/06/98 7:03p Jdt -** in-memory fifo test code, minor changes to init-time variables -** -** 207 7/02/98 12:12p Dow -** LFB Fixes -** -** 206 6/24/98 10:55a Peter -** gary's trilinear hell bug -** -** 205 6/19/98 2:33p Mikec -** Fixed my triple buffering effage when getting lfb buffers we need to -** re-allocate the size of the render buffer -** -** 204 6/16/98 6:12p Dow -** Rearranged texture memory -** -** 203 6/12/98 9:21a Peter -** lfb read for triple buffering -** -** 202 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 201 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 200 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 199 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes -** -** 198 5/13/98 11:42a Dow -** -** 197 5/12/98 2:42p Dow -** -** 196 5/12/98 1:36p Mc -** -** 195 5/06/98 5:34p Dow -** 2D FastFill Workaround -** -** 194 4/22/98 8:41a Dow -** AGP Workaround -** -** 193 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 192 4/05/98 2:18p Dow -** DOS Glide Stuff -** -** 191 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 190 3/28/98 12:31p Dow -** Added Fencing -** -** 189 3/28/98 11:24a Dow -** itwoç -** -** 184 2/17/98 12:50p Dow -** -** 183 2/08/98 3:08p Dow -** FIFO Works -** -** 182 2/03/98 8:45p Dow -** Prep for cmd fifo stuff -** -** 181 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 180 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems -** -** 179 1/29/98 9:54p Dow -** This is Banshee -** -** 178 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 176 1/16/98 7:03p Peter - * fixed volatile - * - * 175 1/16/98 10:47a Peter - * fixed idle effage - * - * 174 1/15/98 1:12p Peter - * dispatch w/o packing - * - * 173 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 172 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 168 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 167 1/07/98 10:22a Peter - * lod dithering env var - * - * 166 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 165 1/05/98 6:06p Atai - * glide extension stuff - * - * 164 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 163 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 162 12/17/97 4:05p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 160 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 156 12/09/97 12:20p Peter - * mac glide port - * - * 155 12/09/97 10:28a Peter - * cleaned up some frofanity - * - * 154 12/09/97 9:46a Atai - * added viewport varibales - * - * 152 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 151 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 150 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 149 11/19/97 4:33p Atai - * #define GLIDE3_VERTEX_LAYOUT 1 - * - * 148 11/19/97 3:51p Dow - * Tex stuff for h3, def of GETENV when using fxHal - * - * 147 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 146 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 145 11/18/97 3:25p Atai - * redefine vData - * - * 144 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 143 11/15/97 7:43p Peter - * more comdex silliness - * - * 142 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 141 11/14/97 5:02p Peter - * more comdex stuff - * - * 140 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 139 11/12/97 2:35p Peter - * fixed braino - * - * 138 11/12/97 2:27p Peter - * - * 137 11/12/97 11:38a Dow - * - * 136 11/12/97 11:15a Peter - * fixed tri/strip param send and used cvgdef.h constant - * - * 135 11/12/97 9:21a Dow - * Changed offset defs to those in h3defs.h - * - * 134 11/07/97 11:22a Atai - * remove GR_*_SMOOTH. use GR_SMOOTH - * - * 133 11/06/97 3:46p Peter - * dos ovl build problem - * - * 132 11/06/97 3:38p Dow - * More banshee stuff - * - * 131 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 130 11/04/97 5:04p Peter - * cataclysm part deux - * - * 129 11/04/97 4:00p Dow - * Banshee Mods - * - * 128 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 127 10/29/97 2:45p Peter - * C version of Taco's packing code - * -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include -#include -#include - -#include <3dfx.h> -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEANER_AND_MEANER -#include -#include "fxsplash.h" -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - -/* Compilation hacks for h3 */ - -/* Reserved fbzMode bits */ -#define SST_DRAWBUFFER_SHIFT 14 -#define SST_DRAWBUFFER (0x3 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_FRONT (0 << SST_DRAWBUFFER_SHIFT) -#define SST_DRAWBUFFER_BACK (1 << SST_DRAWBUFFER_SHIFT) - -/* Reserved textureMode bits */ -#define SST_SEQ_8_DOWNLD BIT(31) - -/* hack for UMA via grHints */ -#define GR_HINT_ENABLE_UMA 0x10000000 - -#if GLIDE_INIT_HAL - -#include - -#ifdef GETENV -#undef GETENV -#endif -#ifdef __linux__ -/* We want to allow file based initialization */ -#define GETENV hwcGetenv -#endif - -/* dpc - 2 june 1997 - * Moved the fence check out to avoid empty if body warning w/ gcc. - * This only applies to systems that require the p6 fencing. - */ -#define P6FENCE_CHECK if (i & 2) P6FENCE - - -#else /* !defined(GLIDE_INIT_HAL) */ - -#include - -/* HACK HACK HACK */ -#define IDLE_HW(__hwPtr) (while (gc->ioRegs->status & (0x1f << 8))) - -#define HWC_BASE_ADDR_MASK 0x03UL - -#endif /* !GLIDE_INIT_HAL */ - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 -/* -** grGet defines -*/ -#define VOODOO2_FOG_TABLE_SIZE 80 -#define VOODOO_FOG_TABLE_SIZE 64 -#define VOODOO_GAMMA_TABLE_SIZE 32 -#define SST1_BITS_DEPTH 16 -#define SST1_ZDEPTHVALUE_NEAREST 0xFFFF -#define SST1_ZDEPTHVALUE_FARTHEST 0x0000 -#define SST1_WDEPTHVALUE_NEAREST 0x0000 -#define SST1_WDEPTHVALUE_FARTHEST 0xFFFF - -/* -** ----------------------------------------------------------------------- -** STUFF FOR STRIPS -** ----------------------------------------------------------------------- -*/ - -#define GR_COLOR_OFFSET_RED (0 << 2) -#define GR_COLOR_OFFSET_GREEN (1 << 2) -#define GR_COLOR_OFFSET_BLUE (2 << 2) -#define GR_COLOR_OFFSET_ALPHA (3 << 2) - -#define GR_VERTEX_OFFSET_X (0 << 2) -#define GR_VERTEX_OFFSET_Y (1 << 2) -#define GR_VERTEX_OFFSET_Z (2 << 2) -#define GR_VERTEX_OFFSET_WFBI (3 << 2) - -#define GR_TEXTURE_OFFSET_S (0 << 2) -#define GR_TEXTURE_OFFSET_T (1 << 2) -#define GR_TEXTURE_OFFSET_W (2 << 2) - -#define GR_DLIST_END 0x00 -#define GR_VTX_PTR 0x00 -#define GR_VTX_PTR_ARRAY 0x01 -#define GR_SCALE_OOW 0x00 -#define GR_SCALE_COLOR 0x01 -#define GR_SCALE_STW 0x02 - -typedef struct { - FxU32 - param, /* vertex, color, textureN */ - components, /* which ones? */ - type, /* data type */ - mode; /* enable / disable */ - FxI32 - offset; -} GrVParamInfo; - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/* -** data structure for for oeminit dll -*/ -typedef struct { - FxU32 version; - FxU32 vendorID; - FxU32 deviceID; - FxU32 *linearAddress; - GrScreenResolution_t res; - GrScreenRefresh_t refresh; - FxU32 reserved[4]; -} OemInitInfo; -#endif - -/*============================================================ - ** State Monster Stuff: - **============================================================*/ -#define GR_FLUSH_STATE() \ -if (gc->state.invalid) _grValidateState() - - -/* Look in distate.c:grValidateState (NOTVALID macro) to see how these - are used I wanted to keep the mixed-case register names here, and - that's why they are mixed case */ -#define alphaModeBIT FXBIT(0) -#define fbzColorPathBIT FXBIT(1) -#define fbzModeBIT FXBIT(2) -#define chromaKeyBIT FXBIT(3) -#define clipRegsBIT FXBIT(4) -#define zaColorBIT FXBIT(5) -#define fogModeBIT FXBIT(6) -#define fogColorBIT FXBIT(7) -#define lfbModeBIT FXBIT(8) -#define c0c1BIT FXBIT(9) - -/*============================================================ - ** Video Stuff: - **============================================================*/ -#define VRETRACEMASK 0x00000fff -#define HRETRACEPOS 16 - -#else -/* Make sure GR_FLUSH_STATE is a noop if not Glide 3 */ -#define GR_FLUSH_STATE() -#endif /* GLIDE3 */ - - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s { - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct { - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - FxU32 chromaRange; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct tmu_config_t { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - -#ifdef GLIDE3 - FxU16 -#else - FxU32 -#endif - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxU32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrOriginLocation_t /* lower left, upper left */ - origin; - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ - -#ifdef GLIDE3 - /* viewport and clip space coordinate related stuff */ - - struct { - float - n, f; - FxFloat - ox, oy, oz; - FxFloat - hwidth, hheight, hdepth; - } Viewport; - -#endif - -#ifdef GLIDE3 - /* Strip Stuff */ -#if !GLIDE3_VERTEX_LAYOUT - struct { - GrVParamInfo - vertexInfo, /* Info about vertex data*/ - zInfo, - colorInfo, /* Info about color data */ - tex0Info, /* Info about tmu0 data */ - tex1Info; /* Info about tmu1 data */ - FxU32 - vSize, - vStride; - } vData; -#else /* GLIDE3_VERTEX_LAYOUT */ - struct { - GrVParamInfo - vertexInfo, /* xy */ - zInfo, /* z(ooz) */ - wInfo, /* w(oow) */ - aInfo, /* a float */ - rgbInfo, /* rgb float */ - pargbInfo, /* pargb byte */ - st0Info, /* st0 */ - st1Info, /* st1 */ - qInfo, /* q */ - q0Info, /* q0 */ - q1Info; /* q1 */ - FxU32 - vStride, /* vertex stride */ - vSize; /* vertex size */ - FxU32 - colorType; /* float or byte */ - } vData; -#endif /* GLIDE3_VERTEX_LAYOUT */ - - /*============================================================ - ** State Monster Stuff: - **============================================================*/ - /* - ** The following DWORD is used to determine what state (if any) needs to - ** be flushed when a rendering primative occurs. - */ - FxU32 - invalid; - /* invalid contains bits representing: - alphaMode register: - modified by grAlphaBlendFunction, grAlphaTestFunction, - grAlphaTestReferenceValue - - fbzColorPath register: - modified by grAlphaCombine, grAlphaControlsITRGBLighting, - grColorCombine - - fbzMode register: - modified by grChromaKeyMode, grDepthBufferFunction, - grDeptBufferMode, grDepthMask, grDitherMode, grRenderBuffer, - grSstOrigin, grColorMask - - chromaKey register: - modified by grChromaKeyValue - - clipLeftRight, clipBottomTop registers: - modified by grClipWindow - - zaColor register: - modified by grDepthBiasLevel - - fogMode register: - modified by grFogMode - - fogColor register: - modified by grFocColorValue - - lfbMode register: - modified by grLfbWriteColorFormat, grLfbWriteColorSwizzle - - c0 & c1 registers: - modified by grConstanColorValue - */ - - /* - ** Argument storage for State Monster: - ** - ** NOTE that the data structure element names are IDENTICAL to the function - ** argment names. This is very important, as there are macros in distate.c - ** that require that. - */ - struct { - struct { - GrAlphaBlendFnc_t rgb_sf; - GrAlphaBlendFnc_t rgb_df; - GrAlphaBlendFnc_t alpha_sf; - GrAlphaBlendFnc_t alpha_df; - } grAlphaBlendFunctionArgs; - struct { - GrCmpFnc_t fnc; - } grAlphaTestFunctionArgs; - struct { - GrAlpha_t value; - } grAlphaTestReferenceValueArgs; - struct { - GrCombineFunction_t function; - GrCombineFactor_t factor; - GrCombineLocal_t local; - GrCombineOther_t other; - FxBool invert; - } grAlphaCombineArgs; - struct { - FxBool enable; - } grAlphaControlsITRGBLightingArgs; - struct { - GrCombineFunction_t function; - GrCombineFactor_t factor; - GrCombineLocal_t local; - GrCombineOther_t other; - FxBool invert; - } grColorCombineArgs; - struct { - FxBool rgb; - FxBool alpha; - } grColorMaskArgs; - struct { - GrChromakeyMode_t mode; - } grChromakeyModeArgs; - struct { - GrColor_t color; - } grChromakeyValueArgs; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - struct { - GrColor_t range; - GrChromaRangeMode_t mode; - } grChromaRangeArgs; -#endif - struct { - FxBool enable; - } grDepthMaskArgs; - struct { - GrCmpFnc_t fnc; - } grDepthBufferFunctionArgs; - struct { - GrDepthBufferMode_t mode; - } grDepthBufferModeArgs; - struct { - GrDitherMode_t mode; - } grDitherModeArgs; - struct { - GrBuffer_t buffer; - } grRenderBufferArgs; - struct { - GrOriginLocation_t origin; - } grSstOriginArgs; - struct { - FxU32 minx; - FxU32 miny; - FxU32 maxx; - FxU32 maxy; - } grClipWindowArgs; - struct { - FxU32 level; - } grDepthBiasLevelArgs; - struct { - GrFogMode_t mode; - } grFogModeArgs; - struct { - GrColor_t color; - } grFogColorValueArgs; - struct { - GrColorFormat_t colorFormat; - } grLfbWriteColorFormatArgs; - struct { - FxBool swizzleBytes; - FxBool swapWords; - } grLfbWriteColorSwizzleArgs; - struct { - GrColor_t color; - } grConstantColorValueArgs; - } stateArgs; - struct{ - GrEnableMode_t primitive_smooth_mode; - GrEnableMode_t shameless_plug_mode; - GrEnableMode_t video_smooth_mode; - } grEnableArgs; - struct{ - GrCoordinateSpaceMode_t coordinate_space_mode; - } grCoordinateSpaceArgs; -#endif /* GLIDE3 end grenable mode*/ -}; - -#if GLIDE_DISPATCH_SETUP -/* gpci.c - * - * Set of procs for the current cpu type. These are selected out of - * the _archXXXX proc list that is selected at grGlideInit time. - * - * TriProc vector - * 0 - No Culling - * 1 - Culling (Postive/Negative) - * - * _GlideRoot.curTriProcs - * 0 - Generic dataList w/ all parameters - * 1 - Packed rgb (GLIDE_PACKED_RGB) - * 2 - Packed argb (GLIDE_PACKED_RGB) - */ - -#define NUM_TRI_PROC_LISTS 1 - -typedef FxI32 (FX_CALL* GrTriSetupProc)(const GrVertex*, const GrVertex*, const GrVertex*); -typedef GrTriSetupProc GrTriSetupProcVector[2]; -typedef GrTriSetupProcVector GrTriSetupProcArchVector[NUM_TRI_PROC_LISTS]; - -/* Decalrations of the dispatchable procs found in xdraw2.asm and - * xtexdl.c for teh triangle and texture download procs respectively. - */ -extern FxI32 FX_CALL _trisetup_Default_Default(const GrVertex*, const GrVertex*, const GrVertex*); -extern FxI32 FX_CALL _trisetup_Default_cull(const GrVertex*, const GrVertex*, const GrVertex*); - -#if GL_AMD3D -extern FxI32 FX_CALL _trisetup_3DNow_Default(const GrVertex*, const GrVertex*, const GrVertex*); -extern FxI32 FX_CALL _trisetup_3DNow_cull(const GrVertex*, const GrVertex*, const GrVertex*); -#endif /* GL_AMD3D */ -#endif /* GLIDE_DISPATCH_SETUP */ - -struct GrGC_s; - -/* _GlideRoot.curTexProcs is an array of (possibly specialized - * function pointers indexed by texture format size (8/16 bits) and - * texture line width (1/2/4/>4). - * - * xtexdl.c - */ -typedef void (FX_CALL* GrTexDownloadProc)(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -typedef GrTexDownloadProc GrTexDownloadProcVector[2][4]; - -extern void FX_CALL _grTexDownload_Default_8_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_8_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); - -extern void FX_CALL _grTexDownload_Default_16_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -extern void FX_CALL _grTexDownload_Default_16_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); - -#if GL_AMD3D -/* xtexdl.asm */ -extern void FX_CALL _grTexDownload_3DNow_MMX(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData); -#endif /* GL_AMD3D */ - -typedef struct GrGC_s { - FxU32 - totBuffers, - strideInTiles, - heightInTiles, - bufferStride, - bufSizeInTiles, - bufSize, - fbOffset, - tramOffset[2], - tramSize[2], - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#ifdef GLIDE_INIT_HWC - hwcBoardInfo - *bInfo; -#endif - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - void *oemInit; -#endif - - -#define kMaxVertexParam (20 + (12 * GLIDE_NUM_TMU) + 3) - struct dataList_s { - int i; - FxFloat* addr; - } regDataList[kMaxVertexParam]; - int tsuDataList[kMaxVertexParam]; - - struct { -#if GLIDE_DISPATCH_SETUP - /* Current triangle rendering proc specialized for culling/no - * culling and optionally for packed rgb at compile time. - */ - GrTriSetupProc triSetupProc; -#endif /* GLIDE_DISPATCH_SETUP */ - - /* Vector of texture download procs specialized by size - * and processor vendor type. - */ - GrTexDownloadProcVector* texDownloadProcs; - } archDispatchProcs; - -#ifdef GLIDE3 -#if 0 - /* scale factor for clip space and viewport code */ - int scaleDataList[kMaxVertexParam]; -#endif -#endif - - GrState - state; /* state of Glide/SST */ - - /* Here beginneth the Swap Pending Workaround (tm) */ -#define MAX_BUFF_PENDING 0x7 - FxU32 - swapsPending, /* swaps in unexecuted region of FIFO */ - lastSwapCheck, /* Position at last check */ - curSwap, /* Position in the array below */ - bufferSwaps[MAX_BUFF_PENDING];/* Position in FIFO of buffer swaps */ - /* Here endeth the Swap Pending Workaround */ - - struct cmdTransportInfo { - FxU32 triPacketHdr; /* Pre-computed packet header for - * independent triangles. - */ - - FxU32 cullStripHdr; /* Pre-computed packet header for generic - * case of packet 3 triangles. This needs - * command type and # of vertices to be complete. - */ - - FxU32 paramMask; /* Mask for specifying parameters of - * non-triangle packets. The parameter - * bits[21:10] mimic the packet3 header - * controlling which fields are sent, and - * pc[28] controls whether any color - * information is sent as packed. - */ - - /* Basic command fifo characteristics. These should be - * considered logically const after their initialization. - */ - FxU32* fifoStart; /* Virtual address of start of fifo */ - FxU32* fifoEnd; /* Virtual address of fba fifo */ - FxU32 fifoOffset; /* Offset from hw base to fifo start */ - FxU32 fifoSize; /* Size in bytes of the fifo */ - FxU32 fifoJmpHdr[2];/* Type0 packet for jmp to fifo start - only first DWORD is used for memory - fifo--both are used for AGP FIFO - */ - -#ifdef TACO_MEMORY_FIFO_HACK - FxU32 *vFifoStart; - FxU32 *vFifoEnd; -#endif - - FxU32* fifoPtr; /* Current write pointer into fifo */ - FxU32 fifoRead; /* Last known hw read ptr. - * This is the sli master, if enabled. - */ - -#if GLIDE_USE_DEBUG_FIFO - FxU32* fifoShadowBase; /* Buffer that shadows the hw fifo for debugging */ - FxU32* fifoShadowPtr; -#endif /* GLIDE_USE_DEBUG_FIFO */ - - /* Fifo checking information. In units of usuable bytes until - * the appropriate condition. - */ - FxI32 fifoRoom; /* Space until next fifo check */ - FxI32 roomToReadPtr;/* Bytes until last known hw ptr */ - FxI32 roomToEnd; /* # of bytes until last usable address before fifoEnd */ - - FxBool lfbLockCount; /* Have we done an lfb lock? Count of the locks. */ - FxBool - autoBump; /* Are we auto bumping (aka hole counting?) */ - FxU32 - *lastBump, /* Last ptr where we bumped. */ - *bumpPos; /* Nex place to bump */ - FxU32 - bumpSize; /* # of DWORDS per bump */ - - } cmdTransportInfo; - - - SstIORegs - *ioRegs; /* I/O remap regs */ - SstCRegs - *cRegs; /* AGP/Cmd xfer/misc regs */ - SstGRegs - *gRegs; /* 2D regs */ - SstRegs - *sstRegs; /* Graphics Regs (3D Regs) */ - FxU32 - *rawLfb, /* Poiinter to vAddr of baseAddress1 */ - nBuffers, - curBuffer, - frontBuffer, - backBuffer, - buffers[4], - lfbBuffers[4]; /* Tile relative addresses of the color/aux - * buffers for lfbReads. - */ - - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu, /* number of TMUs attached */ - grColBuf, - grAuxBuf, - grHwnd; - - /* Overlay Hack: This flag indicates if the overlay hack is on. - * This is probably the wrong place for this kind of thing*/ - int desktopOverlay; - - FxBool - scanline_interleaved; - -#ifndef GLIDE3_ALPHA - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ -#endif - - FxBool tmuLodDisable[GLIDE_NUM_TMU]; - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - FxU32 checkCounter; - FxU32 checkPtr; - - FxVideoTimingInfo* vidTimings;/* init code overrides */ - - FxU32 nColBuffers; - FxBool open; /* Has GC Been Opened? */ - FxBool hwInitP; /* Has the hw associated w/ GC been initted and - mapped? This is managed in - _grDetectResources:gpci.c the first time - that the board is detected, and in - grSstWinOpen:gsst.c if the hw has been - shutdown in a call to grSstWinClose. - */ - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* Splash screen/shameless plug crap */ - struct { - HMODULE - moduleHandle; - GrSplashInitProc - initProc; - GrSplashShutdownProc - shutdownProc; - GrSplashProc - splashProc; - GrSplashPlugProc - plugProc; - } pluginInfo; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ -} GrGC; - - -/* -** The Root Of All EVIL! -** -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - /* NOTE!!!! p6Fencer this must be the very first structure element always */ - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - - FxI32 curTriSize; /* the size in bytes of the current triangle */ -#if GLIDE_HW_TRI_SETUP - FxI32 curVertexSize; /* Size in bytes of a single vertex's parameters */ -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - FxU32 paramCount; - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - -#if GLIDE_PACKED_RGB -#define kPackBiasA _GlideRoot.pool.fBiasHi -#define kPackBiasR _GlideRoot.pool.fBiasHi -#define kPackBiasG _GlideRoot.pool.fBiasHi -#define kPackBiasB _GlideRoot.pool.fBiasLo - -#define kPackShiftA 16UL -#define kPackShiftR 8UL -#define kPackShiftG 0UL -#define kPackShiftB 0UL - -#define kPackMaskA 0x00FF00UL -#define kPackMaskR 0x00FF00UL -#define kPackMaskG 0x00FF00UL -#define kPackMaskB 0x00FFUL - - float fBiasHi; - float fBiasLo; -#endif /* GLIDE_PACKED_RGB */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - FxBool texLodDither; /* Always do lod-dithering */ - FxI32 tmuMemory; /* tmuMemory */ - FxBool enUma; /* enable uma */ - float gammaR, gammaG, gammaB; /* Gamma settings */ - - /* Force alternate buffer strategy */ - FxI32 nColorBuffer; - FxI32 nAuxBuffer; - FxI32 emulRush; /* Banshee reports as Rush flag */ - FxI32 grxClk; - FxBool autoBump; /* Auto bump or do it manually? */ - FxU32 bumpSize; - } environment; - - struct { - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - - FxU32 nccDownloads; /* # of NCC palette download calls */ - FxU32 nccBytes; /* # of NCC palette bytes downloaded */ - -#if USE_PACKET_FIFO - FxU32 fifoWraps; - FxU32 fifoWrapDepth; - FxU32 fifoStalls; - FxU32 fifoStallDepth; -#endif /* USE_PACKET_FIFO */ - } stats; - - GrHwConfiguration hwConfig; - - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ - -#if GLIDE_DISPATCH_SETUP -#define TRISETUP_NORGB (*_GlideRoot.curTriProcs + 0) -#if GLIDE_PACKED_RGB -#define TRISETUP_RGB (*_GlideRoot.curTriProcs + 1) -#define TRISETUP_ARGB (*_GlideRoot.curTriProcs + 2) -#else /* !GLIDE_PACKED_RGB */ -#define TRISETUP_RGB TRISETUP_NORGB -#define TRISETUP_ARGB TRISETUP_NORGB -#endif /* !GLIDE_PACKED_RGB */ -#define PROC_SELECT_TRISETUP(__procVector, __cullMode) (__procVector)[(__cullMode) != GR_CULL_DISABLE] - - GrTriSetupProcArchVector* curTriProcs; -#endif /* GLIDE_DISPATCH_SETUP */ - - GrTexDownloadProcVector* curTexProcs; -#define PROC_SELECT_TEXDOWNLOAD() _GlideRoot.curTexProcs - FxBool OSWin95; -}; - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif - -#if defined(__WATCOMC__) -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -extern FxU32 p6FenceVar; - -void -p6Fence(void); -#pragma aux p6Fence = \ -"xchg eax, p6FenceVar" \ -modify [eax]; - - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -/* Turn off the no return value warning for the function definition. - * - * NB: The function returns a value so that we can use it in places - * that require a value via the comma operator w/o resorting to casts - * everywhere the macro is invoked. - * - * NB: I checked the compiled code to make sure that it was inlined - * everywhere that we would possibly care that it was inlines. - */ -# pragma warning(disable : 4035) - __inline FxU32 _grP6Fence(void) - { - __asm xchg eax, _GlideRoot.p6Fencer - } -# define P6FENCE _grP6Fence() -# pragma warning(default : 4035) -#elif defined(macintosh) && defined(__POWERPC__) && defined(__MWERKS__) -#define P6FENCE __eieio() -#elif defined(__GNUC__) && defined(__i386__) -#define P6FENCE asm("xchg %%eax, %0" : : "m" (_GlideRoot.p6Fencer) : "eax"); -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ - -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ - type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ - FX_EXPORT type FX_CSTYLE name args - -#ifdef GLIDE3 -#define GR_STATE_ENTRY(name, type, args) \ - type _##name## args -#else -#define GR_STATE_ENTRY(name, type, args) \ - GR_ENTRY(name, type, args) -#endif - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define GLIDE_DRIVER_NAME "Voodoo^2" -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define GLIDE_DRIVER_NAME "Banshee" -#else -#define GLIDE_DRIVER_NAME "HOOPTI???" -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); - -#if GLIDE_DISPATCH_SETUP -#define TRISETUP (*gc->archDispatchProcs.triSetupProc) -#else /* !GLIDE_DISPATCH_SETUP */ -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc); - -/* GMT: BUG need to make this dynamically switchable - That is not a bug. It is an opinion! - */ -#if GLIDE_USE_C_TRISETUP -# if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO -# define TRISETUP _trisetup_nogradients -# else /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -# define TRISETUP _trisetup_nogradients -# endif /* !((GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO) */ -#else /* !GLIDE_USE_C_TRISETUP */ -# define TRISETUP _trisetup_asm -#endif /* !GLIDE_USE_C_TRISETUP */ -#endif /* !GLIDE_DISPATCH_SETUP */ - -#ifdef GLIDE3 -void -_grValidateState(); - -void FX_CSTYLE -_grDrawVertexList(FxU32 listType, FxI32 mode, FxI32 count, void *pointers); - -void -_grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); -void -_grAlphaTestFunction( GrCmpFnc_t function ); - -void -_grAlphaTestReferenceValue( GrAlpha_t value ); - -void -_grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -void -_grAlphaControlsITRGBLighting( FxBool enable ); - -void -_grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void -_grChromaModeExt(GrChromakeyMode_t mode); -void -_grChromaRangeExt( GrColor_t min, GrColor_t max , GrChromaRangeMode_t mode); -void -_grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode); -void -_grTexChromaRangeExt(GrChipID_t tmu, GrColor_t min, GrColor_t max); -#else -void -_grChromakeyValue( GrColor_t value ); -#endif - -void -_grChromakeyMode( GrChromakeyMode_t mode ); - -void -_grDepthMask( FxBool mask ); - -void -_grDepthBufferFunction( GrCmpFnc_t function ); - -void -_grDepthBufferMode( GrDepthBufferMode_t mode ); - -void -_grDitherMode( GrDitherMode_t mode ); - -void -_grRenderBuffer( GrBuffer_t buffer ); - -void -_grColorMask( FxBool rgb, FxBool a ); - -void -_grSstOrigin(GrOriginLocation_t origin); - -void -_grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -void -_grDepthBiasLevel( FxI16 level ); - -void -_grFogMode( GrFogMode_t mode ); - -void -_grFogColorValue( GrColor_t fogcolor ); - -void -_grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -void -_grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -void -_grConstantColorValue( GrColor_t value ); - -#endif - -#ifdef GLIDE3 /* glide 3 m point, m aa point, m line, m aa line routine */ - -void FX_CSTYLE -_grDrawPoints(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grDrawLineStrip(FxI32 mode, FxI32 count, FxI32 ltype, void *pointers); - -void FX_CSTYLE -_grDrawTriangles(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawPoints(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawLines(FxI32 mode, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAAVpDrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers); - -void FX_CSTYLE -_grAADrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers); - -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -void FX_CSTYLE -_guTexMemReset(void); - -int FX_CSTYLE -_grBufferNumPending(void); - -FxBool FX_CSTYLE -_grSstIsBusy(void); - -void FX_CSTYLE -_grSstResetPerfStats(void); - -void FX_CSTYLE -_grResetTriStats(void); - -FxU32 FX_CSTYLE -_grSstStatus(void); - -FxU32 FX_CSTYLE -_grSstVideoLine(void); - -FxBool FX_CSTYLE -_grSstVRetraceOn(void); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor(GrColor_t *color); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode(FxBool delta0Mode); - -void -_doGrErrorCallback(const char *name, const char *msg, FxBool fatal); - -void _grErrorDefaultCallback(const char *s, FxBool fatal); - -#ifdef __WIN32__ -void _grErrorWindowsCallback(const char *s, FxBool fatal); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)(const char *string, FxBool fatal); - -void GR_CDECL -_grFence(void); - -int -_guHeapCheck(void); - -void FX_CSTYLE -_grRebuildDataList(void); - -void -_grReCacheFifo(FxI32 n); - -FxI32 GR_CDECL -_grSpinFifo(FxI32 n); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD(float value); - -void FX_CSTYLE -_grTexDetailControl(GrChipID_t tmu, FxU32 detail); - -void FX_CSTYLE -_grTexDownloadNccTable(GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end); - -void FX_CSTYLE -_grTexDownloadPalette(GrChipID_t tmu, - GuTexPalette *pal, - int start, int end); - -FxU32 -_grTexCalcBaseAddress(FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask); - -void -_grTexForceLod(GrChipID_t tmu, int value); - -FxU32 -_grTexTextureMemRequired(GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd, - FxBool roundP); -void FX_CSTYLE -_grUpdateParamIndex(void); - -/* ddgump.c */ -void FX_CSTYLE -_gumpTexCombineFunction(int virtual_tmu); - -/* disst.c - this is an un-documented external for arcade developers */ -extern FX_ENTRY void FX_CALL -grSstVidMode(FxU32 whichSst, FxVideoTimingInfo* vidTimings); - -/* glfb.c */ -extern FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, - const void *src_data); - -/* gglide.c - Flushes the current state in gc->state.fbi_config to the hw. - */ -extern void -_grFlushCommonStateRegs(void); - -#if USE_PACKET_FIFO -/* cvg.c */ -extern void -_grSet32(volatile FxU32* const sstAddr, const FxU32 val); - -extern FxU32 -_grGet32(volatile FxU32* const sstAddr); -#endif /* USE_PACKET_FIFO */ - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if defined(GLIDE_DEBUG) || defined(GLIDE_ASSERT) || defined(GLIDE_SANITY_ASSERT) || defined(GLIDE_SANITY_SIZE) - #define DEBUG_MODE 1 - #include -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) - -#if ASSERT_FAULT -#define ASSERT_FAULT_IMMED(__x) if (!(__x)) { \ - *(FxU32*)NULL = 0; \ - _grAssert(#__x, __FILE__, __LINE__); \ - } -#else -#define ASSERT_FAULT_IMMED(__x) GR_ASSERT(__x) -#endif - -#if !USE_PACKET_FIFO -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n,p) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif USE_PACKET_FIFO -/* Stuff to manage the command fifo on cvg - * - * NB: All of the addresses are in 'virtual' address space, and the - * sizes are in bytes. - */ - -/* The Voodoo^2 fifo is 4 byte aligned */ -#define FIFO_ALIGN_MASK 0x03 - -/* We claim space at the end of the fifo for: - * 1 nop (2 32-bit words) - * 1 jmp (1 32-bit word) - * 1 pad word - */ -#define FIFO_END_ADJUST (sizeof(FxU32) << 2) - -/* NB: This should be used sparingly because it does a 'real' hw read - * which is *SLOW*. - * - * NB: This address is always in sli master relative coordinates. - */ -FxU32 _grHwFifoPtr(FxBool); -#define HW_FIFO_PTR(a) _grHwFifoPtr(a) - -#if FIFO_ASSERT_FULL -extern const FxU32 kFifoCheckMask; -extern FxU32 gFifoCheckCount; - -#define FIFO_ASSERT() \ -if ((gFifoCheckCount++ & kFifoCheckMask) == 0) { \ - const FxU32 cmdFifoDepth = GR_GET(((SstRegs*)(gc->reg_ptr))->cmdFifoDepth); \ - const FxU32 maxFifoDepth = ((gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST) >> 2); \ - if(cmdFifoDepth > maxFifoDepth) { \ - gdbg_printf("cmdFifoDepth > size: 0x%X : 0x%X\n", \ - cmdFifoDepth, maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth <= maxFifoDepth); \ - } else if (cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) > maxFifoDepth) { \ - gdbg_printf("cmdFifoDepth + fifoRoom > size: (0x%X : 0x%X) : 0x%X\n", \ - cmdFifoDepth, (gc->cmdTransportInfo.fifoRoom >> 2), maxFifoDepth); \ - ASSERT_FAULT_IMMED(cmdFifoDepth + (gc->cmdTransportInfo.fifoRoom >> 2) <= maxFifoDepth); \ - } \ -} \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) >= (FxU32)gc->cmdTransportInfo.fifoStart); \ -ASSERT_FAULT_IMMED(HW_FIFO_PTR(FXTRUE) < (FxU32)gc->cmdTransportInfo.fifoEnd); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#else /* !FIFO_ASSERT_FULL */ -#define FIFO_ASSERT() \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoRoom < gc->cmdTransportInfo.fifoSize); \ -ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr < (FxU32)gc->cmdTransportInfo.fifoEnd) -#endif /* !FIFO_ASSERT_FULL */ - -void GR_CDECL -_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine); - -#if defined( TACO_MEMORY_FIFO_HACK ) -extern void _FifoFlush( void ); -#endif - -#ifndef GLIDE_DEBUG -#define GR_BUMP_N_GRIND \ -do { \ - P6FENCE; \ - GR_CAGP_SET(bump, gc->cmdTransportInfo.fifoPtr - gc->cmdTransportInfo.lastBump); \ - gc->cmdTransportInfo.lastBump = gc->cmdTransportInfo.fifoPtr; \ - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoPtr + (gc->cmdTransportInfo.bumpSize); \ - if (gc->cmdTransportInfo.bumpPos > gc->cmdTransportInfo.fifoEnd) \ - gc->cmdTransportInfo.bumpPos = gc->cmdTransportInfo.fifoEnd; \ -} while(0) -#else -/* fifo.c */ -void _grBumpNGrind(void); -#define GR_BUMP_N_GRIND _grBumpNGrind() -#endif - -#define CHECK_FOR_BUMP(__writeSize) \ -if (!gc->cmdTransportInfo.autoBump && \ - ((gc->cmdTransportInfo.fifoPtr + __writeSize) > gc->cmdTransportInfo.bumpPos)) \ - GR_BUMP_N_GRIND; - -#define GR_CHECK_FOR_ROOM(__n, __p) \ -do { \ - const FxU32 writeSize = (__n) + ((__p) * sizeof(FxU32)); /* Adjust for size of hdrs */ \ - ASSERT(((FxU32)(gc->cmdTransportInfo.fifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - ASSERT(writeSize < gc->cmdTransportInfo.fifoSize - sizeof(FxU32)); \ - /* CHECK_FOR_BUMP(writeSize); */ /* now done in _FifoMakeRoom */ \ - FIFO_ASSERT(); \ - if (gc->cmdTransportInfo.fifoRoom < (FxI32)writeSize) { \ - GDBG_INFO(280, "Fifo Addr Check: (0x%X : 0x%X)\n", \ - gc->cmdTransportInfo.fifoRoom, writeSize); \ - _FifoMakeRoom(writeSize, __FILE__, __LINE__); \ - } \ - ASSERT((FxU32)gc->cmdTransportInfo.fifoRoom >= writeSize); \ - FIFO_ASSERT(); \ -} while(0) -#else -#error "GR_CHECK_FOR_ROOM not defined" -#endif - -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) - -#define GR_CHECK_FOR_ROOM(__n, __p) - -#endif /* GLIDE_PLATFORM & GLIDE_HW_?? */ - -#ifdef GLIDE_SANITY_SIZE -#if USE_PACKET_FIFO -#define GR_CHECK_FIFO_PTR() \ -if (gc->cmdTransportInfo.autoBump) {\ - if((FxU32)gc->cmdTransportInfo.fifoPtr != gc->checkPtr + gc->checkCounter)\ - GDBG_ERROR("GR_ASSERT_FIFO", "(%s : %d) : " \ - "fifoPtr should be 0x%X (0x%X : 0x%X) but is 0x%X\n", \ - __FILE__, __LINE__, gc->checkPtr + gc->checkCounter, \ - gc->checkPtr, gc->checkCounter, gc->cmdTransportInfo.fifoPtr);\ - ASSERT_FAULT_IMMED((FxU32)gc->cmdTransportInfo.fifoPtr == gc->checkPtr + gc->checkCounter);\ -} - -#define GR_SET_FIFO_PTR(__n, __p) \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = ((__n) + ((__p) << 2)) -#else -#define GR_CHECK_FIFO_PTR() -#define GR_SET_FIFO_PTR(__n, __p) -#endif - -# define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - GR_CHECK_FIFO_PTR(); \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - -# define GR_CHECK_SIZE_DIRECT() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - gc->checkCounter = 0; \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 - - - -# define GR_SET_EXPECTED_SIZE(n,p) \ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM(n,p); \ - gc->expected_counter = n; \ - GR_SET_FIFO_PTR(n, p) - -# define GR_INC_SIZE(n) gc->counter += n -#else - /* define to do nothing */ -# define GR_CHECK_SIZE() -# define GR_CHECK_SIZE_DIRECT() -# define GR_SET_EXPECTED_SIZE(n,p) GR_CHECK_FOR_ROOM(n,p) -# define GR_INC_SIZE(n) -#endif - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#if GLIDE_INIT_HAL -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->sstRegs -#else -#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->sstRegs -#endif -#ifdef DEBUG_MODE -#define ASSERT(exp) GR_ASSERT(exp) - -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - const FxI32 saveLevel = gc->myLevel; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \ - GDBG_INFO(gc->myLevel,myName); \ - FXUNUSED(saveLevel); \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) \ - gc->myLevel = saveLevel; \ - GDBG_INFO(281, "%s --done---------------------------------------\n", __n) -#define GR_TRACE_RETURN(__l, __n, __v) \ - gc->myLevel = saveLevel; \ - GDBG_INFO((__l), "%s() => 0x%x---------------------\n", (__n), (__v), (__v)) -#else /* !DEBUG_MODE */ -#define ASSERT(exp) -#define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED(hw) -#define GR_TRACE_EXIT(__n) -#define GR_TRACE_RETURN(__l, __n, __v) -#endif /* !DEBUG_MODE */ - -#define GR_BEGIN(name,level,size, packetNum) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size, packetNum) - -#define GR_END() {GR_CHECK_SIZE(); GR_TRACE_EXIT(myName);} - -#define GR_RETURN(val) \ - if (GDBG_GET_DEBUGLEVEL(gc->myLevel)) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GR_TRACE_RETURN(gc->myLevel, myName, val); \ - return val - -#if defined(GLIDE_SANITY_ASSERT) -#define GR_ASSERT(exp) ((void)((!(exp)) ? (_grAssert(#exp, __FILE__, __LINE__),0) : 0xFFFFFFFF)) -#else -#define GR_ASSERT(exp) ((void)(0 && ((FxU32)(exp)))) -#endif - -#define INTERNAL_CHECK(__name, __cond, __msg, __fatalP) \ - if (__cond) _doGrErrorCallback(__name, __msg, __fatalP) - -#if defined(GLIDE_DEBUG) -#define GR_CHECK_F(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXTRUE) -#define GR_CHECK_W(name,condition,msg) INTERNAL_CHECK(name, condition, msg, FXFALSE) -#else -#define GR_CHECK_F(name,condition,msg) -#define GR_CHECK_W(name,condition,msg) -#endif - -#if GLIDE_CHECK_COMPATABILITY -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) INTERNAL_CHECK(__name, __cond, __msg, FXTRUE) -#else -#define GR_CHECK_COMPATABILITY(__name, __cond, __msg) GR_CHECK_F(__name, __cond, __msg) -#endif /* !GLIDE_CHECK_COMPATABILITY */ - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_COMPATABILITY(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - -void -_grAssert(char *, char *, int); - -#if USE_PACKET_FIFO -#ifdef GDBG_INFO_ON -void _grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void _grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else /* ~GDBG_INFO_ON */ -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif /* !GDBG_INFO_ON */ -#endif /* USE_PACKET_FIFO */ - -/* HW Setting macros. We redefine the default macros to: - * - add extra tracing - * - work around hw bugs - * - do platform specific whacky things. - */ -# if SET_BSWAP -# undef GET -# undef GET16 -# undef SET -# undef SET16 -# undef SETF - -# if __POWERPC__ && defined(__MWERKS__) -# define GET(s) __lwbrx( (void*)&(s), 0 ) -# define GET16(s) __lwbrx( (void*)&(s), 0 ) -# define SET(d, s) __stwbrx((s), (void*)&(d), 0) -# define SET16(d, s) __sthbrx((s), (void*)&(d), 0 ) -# define SETF(d, s) { \ - const float temp = (s); \ - __stwbrx( *((FxU32*)&temp), (void*)&(d), 0 ); \ - } -# define SET_LINEAR(d, s) SET((d), (s)) -# define SET_LINEAR_16(d, s) SET((d), ((((FxU32)(s)) >> 16UL) | \ - (((FxU32)(s)) << 16UL))) -# define SET_LINEAR_8(d, s) ((d) = (s)) -# else /* !defined(__MWERKS__) && POWERPC */ -# error "Define byte swapped macros for GET/SET" -# endif /* !defined(__MWERKS__) && POWERPC */ -# else /* !SET_BSWAP */ -# undef GET -# undef GET16 - -# define GET(s) s -# define GET16(s) s -# endif /* !SET_BSWAP */ - - -#if GLIDE_USE_DEBUG_FIFO -#define kDebugFifoSize 0x1000UL -#endif /* GLIDE_USE_DEBUG_FIFO */ - -#ifndef SET_LINEAR -#define SET_LINEAR(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_16(__addr, __val) SET(__addr, __val) -#define SET_LINEAR_8(__addr, __val) SET(__addr, __val) -#endif /* !defined(SET_LINEAR) */ - -/* Extract the fp exponent from a floating point value. - * NB: The value passed to this macro must be convertable - * into an l-value. - */ -#define kFPExpMask 0x7F800000UL -#define kFPZeroMask 0x80000000UL -#define kFPExpShift 0x17UL -#define FP_FLOAT_EXP(__fpVal) ((FxU32)(((*(const FxU32*)(&(__fpVal))) & kFPExpMask) >> kFPExpShift)) -#define FP_FLOAT_ZERO(__fpVal) (((*(const FxU32*)(&(__fpVal))) & ~kFPZeroMask) == 0x00) - -/* The two most commonly defined macros in the known universe */ -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Simple macro to make selecting a value against a boolean flag - * simpler w/o a conditional. - * - * NB: This requires that the boolean value being passed in be the - * result of one of the standard relational operators. - */ -#define MaskSelect(__b, __val) (~(((FxU32)(__b)) - 1UL) & (__val)) - -/* Chipfield ids that glide uses. */ -#define kChipFieldShift (8UL + 3UL) -typedef enum { - eChipBroadcast = 0x00UL, - eChipFBI = 0x01UL, - eChipTMU0 = 0x02UL, - eChipTMU1 = 0x04UL, - eChipTMU2 = 0x08UL, - eChipAltBroadcast = 0x0FUL, -} FifoChipField; - -#define BROADCAST_ID eChipBroadcast - -#define WAX_ID FX_BIT(14) - -/* Although these are named reg_group_xxx they are generic options for - * grouping register writes and should be fine w/ and w/o the fifo - * being enabled. - */ -#if GDBG_INFO_ON -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _groupNum = (__groupNum);\ -const FxU32 _regMask = (__regMask); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstRegs, __regBase) - -#define REG_GROUP_DCL_WAX(__regMask, __regBase, __groupNum, __checkP) \ -const FxBool _checkP = (__checkP); \ -const FxU32 _groupNum = (__groupNum);\ -const FxU32 _regMask = (__regMask); \ -FxU32 _regCheckMask = (__regMask); \ -FxU32 _regBase = offsetof(SstGRegs, __regBase) - - -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} - -#define REG_GROUP_ASSERT_WAX(__regAddr, __val, __floatP) \ -{ \ - const FxU32 curRegAddr = offsetof(SstGRegs, __regAddr); \ - const FxU32 curRegIndex = (curRegAddr - _regBase) >> 2; \ - const FxU32 curRegBit = (0x01UL << curRegIndex); \ - const float floatVal = (const float)(__val); \ - GDBG_INFO(220, "\t(0x%X : 0x%X) : 0x%X\n", \ - curRegIndex, curRegAddr, *(const FxU32*)&floatVal); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT((_regMask & curRegBit) == curRegBit); /* reg allocated in mask */ \ - if (curRegIndex > 0) \ - GR_ASSERT(((0xFFFFFFFFUL >> (32 - curRegIndex)) & _regCheckMask) == 0x00); /* All previous regs done */ \ - _regCheckMask ^= curRegBit; /* Mark current reg */ \ -} - -#else /* !GDBG_INFO_ON */ -#define REG_GROUP_DCL(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_DCL_WAX(__regMask, __regBase, __groupNum, __checkP) -#define REG_GROUP_ASSERT(__regAddr, __val, __floatP) -#define REG_GROUP_ASSERT_WAX(__regAddr, __val, __floatP) -#endif /* !GDBG_INFO_ON */ - -#if GLIDE_HW_TRI_SETUP -enum { - kSetupStrip = 0x00, - kSetupFan = 0x01, - kSetupCullDisable = 0x00, - kSetupCullEnable = 0x02, - kSetupCullPositive = 0x00, - kSetupCullNegative = 0x04, - kSetupPingPongNorm = 0x00, - kSetupPingPongDisable = 0x08 -}; -#endif /* GLIDE_HW_TRI_SETUP */ - -#define REGNUM(__reg) (offsetof(SstRegs, __reg) >> 2) -#define REGNUM_WAX(_reg) (offsetof(SstGRegs, __reg) >> 2) - -#define PACKET_HEADER_ADD(__start, __reg, __header) \ -do {\ - GDBG_PRINTF("%x, %x\n", REGNUM(__reg), REGNUM(__start));\ - GR_ASSERT((REGNUM(__reg) - REGNUM(__start)) <= 14);\ - __header |= ((1 << (REGNUM(__reg) - REGNUM(__start))) << 15);\ -} while (0) - - -#if USE_PACKET_FIFO - -#define REGNUM(__reg) (offsetof(SstRegs, __reg) >> 2) -#define REGNUM_WAX(_reg) (offsetof(SstGRegs, __reg) >> 2) - -/* The shift below is a bit tricky. Watch out! */ -#define FIFO_REG(__chipField, __field) \ - (GR_ASSERT(((FxU32)(__chipField)) < 0x10UL), \ - ((((FxU32)offsetof(SstRegs, __field)) << 1) | (((FxU32)(__chipField)) << kChipFieldShift))) - -/* And here's the WAX version */ -/* The shift below is a bit tricky. Watch out! */ -#define FIFO_REG_WAX(__field) ((((FxU32)offsetof(SstGRegs, __field)) << 1) | FXBIT(14)) - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXTRUE) - -#define REG_GROUP_BEGIN_WAX(__regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, \ -(((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | FIFO_REG_WAX(__regBase) | \ -SSTCP_PKT4), FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - __groupMask, \ - (((__groupMask) << SSTCP_PKT4_MASK_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_PKT4), \ - FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, \ - (0xFFFFFFFF >> (32 - (__groupNum))), \ - (((__groupNum) << SSTCP_PKT1_NWORDS_SHIFT) | \ - FIFO_REG(__chipId, __regBase) | \ - SSTCP_INC | \ - SSTCP_PKT1), \ - FXTRUE) - -#define GETREG(reg) (reg) - -#define REG_GROUP_BEGIN_INTERNAL(__chipId, __regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(120, "REG_GROUP_BEGIN:\n");\ - GDBG_INFO(120, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(120, "\t_regGroupFifoPtr: 0x%x\n", (FxU32)_regGroupFifoPtr - (FxU32)gc->rawLfb);\ - GDBG_INFO(120, "\t__pktHdr: 0x%x\n", __pktHdr);\ - GDBG_INFO(120, "\t__groupNum: 0x%x\n", __groupNum);\ - GDBG_INFO(120, "\t__groupMask: 0x%x\n", (__groupMask));\ - GDBG_INFO(120, "\t__chipId: 0x%x\n", __chipId);\ - GDBG_INFO(120, "\t__regBase: 0x%x\n", offsetof(SstRegs, __regBase));\ - GDBG_INFO(120, "\tfifoPtr: 0x%x\n", (FxU32)gc->cmdTransportInfo.fifoPtr - (FxU32)gc->cmdTransportInfo.fifoStart - (FxU32)gc->rawLfb); \ - GDBG_INFO(120, "\tfifoRoom: 0x%x\n", gc->cmdTransportInfo.fifoRoom);\ - GDBG_INFO(120, "\treadPtrL: 0x%x\n", GETREG(gc->cRegs->cmdFifo0.readPtrL));\ - SET(*_regGroupFifoPtr++, (__pktHdr)) - -#define REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, __pktHdr, __checkP) \ -{ \ - GR_DCL_GC; \ - volatile FxU32* _regGroupFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - REG_GROUP_DCL_WAX(__groupMask, __regBase, __groupNum, __checkP); \ - GR_ASSERT(((__pktHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(220, "REG_GROUP_BEGIN_WAX:\n");\ - GDBG_INFO(220, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(220, "\t_regGroupFifoPtr: 0x%x\n", (FxU32)_regGroupFifoPtr - (FxU32)gc->rawLfb);\ - GDBG_INFO(220, "\t__pktHdr: 0x%x\n", __pktHdr);\ - GDBG_INFO(220, "\t__groupNum: 0x%x\n", __groupNum);\ - GDBG_INFO(220, "\t__groupMask: 0x%x\n", (__groupMask));\ - GDBG_INFO(220, "\t__regBase: 0x%x\n", offsetof(SstGRegs, __regBase));\ - GDBG_INFO(220, "\tfifoPtr: 0x%x\n", (FxU32)gc->cmdTransportInfo.fifoPtr - (FxU32)gc->cmdTransportInfo.fifoStart - (FxU32)gc->rawLfb); \ - GDBG_INFO(220, "\tfifoRoom: 0x%x\n", gc->cmdTransportInfo.fifoRoom);\ - GDBG_INFO(220, "\treadPtrL: 0x%x\n", gc->cRegs->cmdFifo0.readPtrL);\ - GDBG_INFO(220, "\tStart Reg: 0x%x\n", (__pktHdr & 0x7fff) >> 3);\ - GDBG_INFO(220, "\tReg Mask: 0x%x\n", (__pktHdr >> 15) & 0x3fff);\ - GDBG_INFO(220, "\tReg Type: %s\n", ((__pktHdr >> 14) & 1) ? "2D" : "3D");\ - SET(*_regGroupFifoPtr++, (__pktHdr)) - - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - GDBG_INFO(120, "fifoReadPtr(HW): 0x%x\n", GETREG(gc->cRegs->cmdFifo0.readPtrL));\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(120, "REG_GROUP_SET:\n");\ - GDBG_INFO(120, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(120, "\tfifoPtr: 0x%x, Val: 0x%x\n", (FxU32) _regGroupFifoPtr - (FxU32)gc->rawLfb, __val);\ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SET_WAX(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT_WAX(__regAddr, __val, FXFALSE); \ - FXUNUSED(__regBase); \ - GDBG_INFO(220, "fifoReadPtr(HW): 0x%x\n", gc->cRegs->cmdFifo0.readPtrL);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(gc->cRegs->cmdFifo0.readPtrL < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - GDBG_INFO(220, "REG_GROUP_SET_WAX:\n");\ - GDBG_INFO(220, "\tFile: %s Line %d\n", __FILE__, __LINE__);\ - GDBG_INFO(220, "\tfifoPtr: 0x%x, Val: 0x%x\n", (FxU32) _regGroupFifoPtr - (FxU32)gc->rawLfb, __val);\ - SET(*_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - FXUNUSED(__regBase); \ - SETF(*(FxFloat*)_regGroupFifoPtr++, fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - FIFO_ASSERT(); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ - ASSERT((((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == _groupNum + 1); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)_regGroupFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = (FxU32*)_regGroupFifoPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tGroupEnd: (0x%X : 0x%X) : (0x%X : 0x%X)\n", \ - _regGroupFifoPtr, gc->cmdTransportInfo.fifoRoom, \ - HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoPtr); \ - FIFO_ASSERT(); \ -} \ -GR_CHECK_SIZE() - - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - FxU32* noTsuFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - volatile FxU32* regBaseAddr = &hw->FvA.x; \ - FIFO_ASSERT(); \ - GR_ASSERT(__floatP); \ - SET(*noTsuFifoPtr++, ((kNumTriParam << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - SSTCP_INC | /* sequential writes */ \ - FIFO_REG(BROADCAST_ID, FvA.x) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: (fbiRegs->%svA : 0x%X)\n", \ - ((__floatP) ? "F" : ""), (FxU32)noTsuFifoPtr) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - SET(*noTsuFifoPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32 hwWriteAddr = (FxU32)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == (FxU32)regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*noTsuFifoPtr++, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)noTsuFifoPtr - \ - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = noTsuFifoPtr; \ - FIFO_ASSERT(); \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#define STORE_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE_FIFO_WAX(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstGRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++,\ - ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG_WAX(__field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1 | FXBIT(14))); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - - -#define STORE_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO_INDEX(__chipId, __base, __regIndex, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - GR_ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((FxU32*)(__base))[__regIndex], __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - ((__chipId) << kChipFieldShift) | /* chip[14:10] */ \ - ((__regIndex) << 3) | /* Reg Num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*curFifoPtr++, __val); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STORE16_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 temp32 = (((FxU32)(__val)) & 0x0000FFFF); \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SET(*curFifoPtr++, temp32); \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -#define STOREF_FIFO(__chipId, __base, __field, __val) \ -do { \ - FxU32* curFifoPtr = gc->cmdTransportInfo.fifoPtr; \ - FXUNUSED(__base); \ - ASSERT(((FxU32)(curFifoPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - DEBUGFIFOFWRITE(&((SstRegs*)(__base))->__field, __val, curFifoPtr); \ - SET(*curFifoPtr++, ((0x01 << SSTCP_PKT1_NWORDS_SHIFT) | /* size (32bit words) */ \ - FIFO_REG(__chipId, __field) | /* chip[14:10] num[9:3] */ \ - SSTCP_PKT1)); /* type (1) */ \ - SETF(*(FxFloat*)curFifoPtr, __val); \ - curFifoPtr++; \ - gc->cmdTransportInfo.fifoPtr += 2; \ - gc->cmdTransportInfo.fifoRoom -= (sizeof(FxU32) << 1); \ - FIFO_ASSERT(); \ - GR_INC_SIZE(sizeof(FxU32)); /* Size of actual write not including header */ \ -} while(0) - -/* There are now three different flavors of the packet 3 macros for - * your coding pleasure. In increasing order of complexity and control - * they are TRI_BEGIN, TRI_STRIP_BEGIN, TRI_PACKET_BEGIN. - * - * NB: All of these macros must be terminated w/ a matching invocation of - * TRI_END otherwise all sorts of hell will break loose. - * - * TRI_BEGIN: - * The simplest form that draws a single indepependent triangle whose - * parameters and culling are all the glide defaults for grDrawTriangle. - * - * TRI_STRIP_BEGIN: - * setupMode: [kSetupStrip | kSetupFan]. Culling defaults to the current - * glide setting, w/ strips/fans defaulting to ping-pong culling - * nVertex: The number of vertices for the current packet (max 15). - * vertexSize: Size in bytes of the parameters for the vertices making up - * the current packet. - * cmd: [SSTCP_PKT3_BDDBDD (Independent) - * SSTCP_PKT3_BDDDDD (Start strip/fan) - * SSTCP_PKT3_DDDDDD (Continue strip)] - * - * TRI_PACKET_BEGIN: - * setupMode: The same as with TRI_STRIP_BEGIN, except that the caller - * needs to specify the culling bits kSetupCullXXX/kSetupPingPongXXX. - * params: Bits matching the descriptin of the sMode register describing - * which parameters are specified in the packet. - * nVertex: See TRI_STRIP_BEGIN. - * vertexSize: See TRI_STRIP_BEGIN. - * cmd: See TRI_STRIP_BEGIN. - */ -#define TRI_PACKET_BEGIN(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_STRIP_BEGIN(__setupMode, __nVertex, __vertexSize, __cmd) \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - gc->cmdTransportInfo.cullStripHdr); \ - TRI_ASSERT_DECL(__nVertex, __vertexSize, packetVal); \ - SET(*tPackPtr++, packetVal) - -#define TRI_BEGIN() \ -{ \ - FxU32* tPackPtr = gc->cmdTransportInfo.fifoPtr; \ - TRI_ASSERT_DECL(3, _GlideRoot.curVertexSize, gc->cmdTransportInfo.triPacketHdr); \ - SET(*tPackPtr++, gc->cmdTransportInfo.triPacketHdr) - -#if GDBG_INFO_ON -extern void -_grH3FifoDump_TriHdr(const FxU32 triPacketHdr); -extern void -_grH3FifoDump_Linear(const FxU32* const linearPacketAddr); - -#define DEBUGFIFODUMP_TRI(__packetAddr) _grH3FifoDump_TriHdr(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) _grH3FifoDump_Linear(__packetAddr) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) \ - const FxU32 nVertex = (__nVerts); \ - const FxU32 sVertex = (__vertSize); \ - FxU32 pCount = 0; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(tPackPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((((__nVerts) * (__vertSize)) + sizeof(FxU32)) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT((((FxU32)tPackPtr) + ((__nVerts) * (__vertSize)) + sizeof(FxU32)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT(nVertex < 0x10); \ - GR_ASSERT(nVertex > 0x00); \ - GR_ASSERT(((__packetHdr) & 0xE0000000UL) == 0x00UL); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "Triangle(0x%X): (0x%X : 0x%X)\n", (__packetHdr), __nVerts, __vertSize); \ - DEBUGFIFODUMP_TRI(__packetHdr) -#define CLAMP_DUMP(__val, __floatVal) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: (%f : 0x%X)\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875)), \ - (__floatVal)) -#define SETF_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: %f\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (((__val) < 786432.875) ? (__val) : ((__val) - 786432.875))) -#define SET_DUMP(__val) \ - pCount++; \ - GDBG_INFO(gc->myLevel + 200, "\t(0x%X) : V#: 0x%X - P#: 0x%X - ParamVal: 0x%X\n", \ - (FxU32)tPackPtr, \ - ((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) / sVertex, \ - (((FxU32)tPackPtr - ((FxU32)gc->cmdTransportInfo.fifoPtr + sizeof(FxU32))) % sVertex) >> 2, \ - (__val)) -#define TRI_ASSERT() \ - GR_ASSERT(pCount == (nVertex * (sVertex >> 2))); \ - ASSERT(((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) == (nVertex * sVertex) + sizeof(FxU32)) -#else /* !GDBG_INFO_ON */ -#define DEBUGFIFODUMP_TRI(__packetAddr) -#define DEBUGFIFODUMP_LINEAR(__packetAddr) - -#define CLAMP_DUMP(__val, __floatVal) -#define SETF_DUMP(__val) -#define SET_DUMP(__val) - -#define TRI_ASSERT_DECL(__nVerts, __vertSize, __packetHdr) -#define TRI_ASSERT() -#endif /* !GDBG_INFO_ON */ - -/* Get the integer representation of the color component. Currently, - * following in the 'Glide is not an API for kids' tradition we'll - * probably do something silly like wrap around zero. - */ -#if GLIDE_PACKED_RGB -#define RGBA_COMP(__fpVal, __fpBias, __fpShift, __fpMask) \ -((_GlideRoot.pool.ftemp1 = (float)((float)(__fpVal) + (float)(__fpBias))), \ - GR_ASSERT((__fpVal) >= 0.0f), \ - GR_ASSERT((__fpVal) < 256.0f), \ - (((*(const FxU32*)&_GlideRoot.pool.ftemp1) & (__fpMask)) << (__fpShift))) - -#define RGBA_COMP_CLAMP(__fpVal, __compToken) \ - RGBA_COMP(__fpVal, kPackBias##__compToken, kPackShift##__compToken, kPackMask##__compToken) -#endif /* GLIDE_PACKED_RGB */ - -/* First stage tsu-subtractor chec/fix. - * Mmm..... sequence operator. - */ -#if GLIDE_FP_CLAMP -#define kFPClampThreshold 0x20UL -#define FP_FLOAT_CLAMP(__fpVal) ((FP_FLOAT_EXP(__fpVal) < kFPClampThreshold) \ - ? (_GlideRoot.stats.tsuValClamp++, 0x00UL) \ - : *(const FxU32*)(&(__fpVal))) - -#define TRI_SETF_CLAMP(__val) \ -do { \ - const FxU32 floatCastVal = FP_FLOAT_CLAMP(__val); \ - CLAMP_DUMP(__val, floatCastVal); \ - SET(*tPackPtr++, floatCastVal); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) -#else -#define TRI_SETF_CLAMP(__val) \ - TRI_SETF(__val) -#endif - -#define TRI_SETF(__val) \ -do { \ - SETF_DUMP(__val); \ - SETF(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#define TRI_SET(__val) \ -do { \ - SET_DUMP(__val); \ - SET(*tPackPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define TRI_END \ - TRI_ASSERT(); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)tPackPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = tPackPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tTriEnd: (0x%X : 0x%X)\n", tPackPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -#define FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __f, __l) \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - const FxU32 writeSize = (__numWords); /* Add size of packet header */ \ - const FxU32 hdr1 = ((__type) | \ - (((FxU32)(__maskW2)) << SSTCP_PKT5_BYTEN_W2_SHIFT) | \ - (((FxU32)(__maskWN)) << SSTCP_PKT5_BYTEN_WN_SHIFT) | \ - (writeSize << SSTCP_PKT5_NWORDS_SHIFT) | \ - SSTCP_PKT5); \ - const FxU32 hdr2 = ((FxU32)(__addr)) & SSTCP_PKT5_BASEADDR; \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ - GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ - GR_ASSERT(((FxU32)(packetPtr) & FIFO_ALIGN_MASK) == 0); /* alignment */ \ - GR_ASSERT((__numWords) > 0); /* packet size */ \ - GR_ASSERT((__numWords) < ((0x01 << 19) - 2)); \ - GR_ASSERT((((FxU32)(__numWords) + 2) << 2) <= (FxU32)gc->cmdTransportInfo.fifoRoom); \ - GR_ASSERT(((FxU32)packetPtr + (((FxU32)(__numWords) + 2) << 2)) < \ - (FxU32)gc->cmdTransportInfo.fifoEnd); \ - GR_ASSERT((hdr2 & 0xE0000000UL) == 0x00UL); \ - GR_ASSERT(1 /* (((FxU32)(__type)) >= ((FxU32)SSTCP_PKT5_3DLFB)) && \ - (((FxU32)(__type)) <= ((FxU32)SSTCP_PKT5_TEXPORT))*/); \ - FIFO_ASSERT(); \ - GDBG_INFO(120, "LinearWrite(0x%X : 0x%X)\n", hdr1, hdr2); \ - GDBG_INFO(gc->myLevel + 200, "\tFile: %s - Line: %ld\n", __f, __l); \ - GDBG_INFO(gc->myLevel + 200, "\tType: 0x%X\n", (FxU32)(__type)); \ - GDBG_INFO(gc->myLevel + 200, "\tAddr: 0x%X\n", (FxU32)(__addr)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskW2: 0x%X\n", (FxU32)(__maskW2)); \ - GDBG_INFO(gc->myLevel + 200, "\tMaskWN: 0x%X\n", (FxU32)(__maskWN)); \ - GDBG_INFO(gc->myLevel + 200, "\twriteSize: 0x%X\n", writeSize); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 1: 0x%X\n", hdr1); \ - GDBG_INFO(gc->myLevel + 200, "\thdr 2: 0x%X\n", hdr2); \ - SET(*packetPtr++, hdr1); \ - SET(*packetPtr++, hdr2); \ - GR_INC_SIZE(sizeof(FxU32)) - -#define FIFO_LINEAR_WRITE_SET(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - GDBG_INFO(gc->myLevel + 205, "fifPtr: 0x%x, val: 0x%x\n\n", packetPtr, __val);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) >= gc->cmdTransportInfo.fifoOffset);\ - GR_ASSERT(GETREG(gc->cRegs->cmdFifo0.readPtrL) < (gc->cmdTransportInfo.fifoOffset + gc->cmdTransportInfo.fifoSize));\ - SET_LINEAR(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_16(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_16(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_SET_8(__val) \ -do { \ - GDBG_INFO(gc->myLevel + 205, "\t0x%X : 0x%X\n", packetPtr, (__val)); \ - SET_LINEAR_8(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define FIFO_LINEAR_WRITE_END \ - DEBUGFIFODUMP_LINEAR(gc->cmdTransportInfo.fifoPtr); \ - GR_ASSERT((((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr) >> 2) == writeSize + 2); \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - GDBG_INFO(gc->myLevel + 200, "\tLinearEnd: (0x%X : 0x%X)\n", \ - packetPtr, gc->cmdTransportInfo.fifoRoom); \ - FIFO_ASSERT(); \ -} - -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) GET(gc->cRegs->cmdFifo0.__reg) -# define GR_CAGP_SET(__reg, __val) SET(gc->cRegs->cmdFifo0.__reg, __val) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) STORE_FIFO(c, h, f, s) -# define GR_SET_WAX(c, h, f, s) STORE_FIFO_WAX(c, h, f, s) -# define GR_SET_INDEX(c, h, r, s) STORE_FIFO_INDEX(c, h, r, s) -# define GR_SET16(c, h, f, s) STORE16_FIFO(c, h, f, s) -# define GR_SETF(c, h, f, s) STOREF_FIFO(c, h, f, s) -# define GR_SETF_INDEX(c, h, r, s) STOREF_FIFO_INDEX(c, h, r, s) -# define GR_SET_DIRECT(__bc, __hw, __reg, __val) gc->sstRegs->__reg = __val;GR_INC_SIZE(sizeof(__val)) -# define GR_SET_IO(c, h, f, s) (gc->ioRegs)->f = s -#else /* !USE_PACKET_FIFO */ -# ifndef DIRECT_IO -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) GET(gc->cRegs->cmdFifo0__reg) -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) do {SET((h)->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SET_INDEX(c, h, r, s) do {SET(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SETF(c, h, f, s) do {SETF(h->f, s); GR_INC_SIZE(4);} while(0) -# define GR_SETF_INDEX(c, h, r, s) do {SETF(((FxU32*)(h))[r], s); GR_INC_SIZE(sizeof(FxU32));} while(0) -# define GR_SET16(c, h, f, s) do {SET16((h)->f, s); GR_INC_SIZE(2);} while(0) -# define GR_SET_IO(c,h,f,s) GR_SET(c, h, f, s) -# define GR_SET_DIRECT(c,h,f,s) GR_SET(c, h, f, s) -# else -# define GR_GET(s) GET(s) -# define GR_CAGP_GET(__reg) gc->cRegs->cmdFifo0.reg -# define GR_GET16(s) ((FxU16)GET16(s)) -# define GR_SET(c, h, f, s) {(gc->sstRegs)->f = s; GR_INC_SIZE(4);} -# define GR_SETF(c, h, f, s) {((volatile float) (gc->sstRegs)->f) = (float) (s); GR_INC_SIZE(4);} -# define GR_SET_INDEX(c, h, r, s) {((FxU32 *)(gc->sstRegs))[r] = s; GR_INC_SIZE(4);} -# define GR_SETF_INDEX(c, h, r, s) {((volatile float *)(gc->sstRegs))[r] = (float) (s); GR_INC_SIZE(4);} -# define GR_SET16(c, h, f, s) {*((FxU16 *)((gc->sstRegs)->f)) = s; GR_INC_SIZE(4);} -# define GR_SET_DIRECT(__b, __ptr, __reg, __val) \ -{\ - __ptr->__reg = __val;\ - GR_INC_SIZE(4);\ -} -# define GR_SET_IO(c, h, f, s) (gc->ioRegs)->f = s -# endif -#endif /* !USE_PACKET_FIFO */ - -/* Macros to do linear writes to lfb/tex memory. - * - * LINEAR_WRITE_BEGIN - Setup stuff for the linear write. - * - * numWords: The number of words to actually write to the destination - * address. This does *NOT* include the packet headers etc for any - * command fifos etc. - * - * type: One of the kLinearWriteXXX enum values above. This can - * control what the legal values for addr and maskXX are. - * - * addr: Base address to the start the write. - * - * maskXX: Control what bytes in a write are active, these are active - * low. W2 controls the masking of the first 32bit word written, and - * WN controls all of the other writes. - * - * LINEAR_WRITE_SET - Writes are done in 32-bit increments, and must - * be properly aligned etc. This can only be used inside of a - * LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_EDGE - Write to a 16-bit value to an address. The - * address must be aligned for at 16-bit access, and should not appear - * within a LINEAR_WRITE_BEGIN/LINEAR_WRITE_END pair. - * - * LINEAR_WRITE_END - Finish off any stuff for the linear write. - */ - -#if USE_PACKET_FIFO -#define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((FxU32)((__numWords) + 1) << 2), 1); \ - FIFO_LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN, __FILE__, __LINE__) -#define LINEAR_WRITE_SET(__addr, __val) \ - FIFO_LINEAR_WRITE_SET(__val) -#define LINEAR_WRITE_SET_16(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_16(__val) -#define LINEAR_WRITE_SET_8(__addr, __val) \ - FIFO_LINEAR_WRITE_SET_8(__val) -#define LINEAR_WRITE_END() \ - FIFO_LINEAR_WRITE_END; \ - GR_CHECK_SIZE(); \ -} - -/* Macro to write the edge cases of a linear write, for example to the - * lfb w/ a 16-bit pixel value. We do some address manipulation here - * since the cmd fifo only addresses 32-bit quantities, but allows us - * to mask of crap for the actual write. - * - */ -#if (GLIDE_PLATFORM & GLIDE_ENDIAN_LITTLE) -#define kWordMask 0x0CUL -#define kWordShift 0 -#elif (GLIDE_PLATFORM & GLIDE_ENDIAN_BIG) -#define kWordMask 0x03UL -#define kWordShift 16 -#else -#error "Must define processor endian-ness for LINEAR_WRITE_EDGE" -#endif /* Endian-ness check */ - -#define LINEAR_WRITE_EDGE(__type, __addr, __val, __alignedP) \ -do { \ - LINEAR_WRITE_BEGIN(1, __type, \ - ((FxU32)__addr & ~0x03UL), \ - ((__alignedP) ? kWordMask : (0x0F & (~kWordMask))), 0x00); \ - FIFO_LINEAR_WRITE_SET(((FxU32)(__val)) << ((__alignedP) ? kWordShift : (16 - kWordShift))); \ - LINEAR_WRITE_END(); \ -} while(0) -#else /* !USE_PACKET_FIFO */ -# define LINEAR_WRITE_BEGIN(__numWords, __type, __addr, __maskW2, __maskWN) \ -{ \ - GR_SET_EXPECTED_SIZE(((__numWords) << 2), (__numWords)) -# define LINEAR_WRITE_SET(__addr, __val) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -# define LINEAR_WRITE_SET_16(__addr, __val)\ - LINEAR_WRITE_SET(__addr, (FxU32) __val) -# define LINEAR_WRITE_SET_8(__addr, __val) \ - LINEAR_WRITE_SET(__addr, (FxU32) __val) - -# define LINEAR_WRITE_EDGE(__type, __addr, __val, __alignedP) \ -do { \ - FxU32* tempAddr = (FxU32*)(__addr); \ - SET16(*tempAddr, __val); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -# define LINEAR_WRITE_END() \ - GR_CHECK_SIZE(); \ -} - -/* The REG_GROUP_XXX macros do writes to a monotonically increasing - * set of registers. There are three flavors of the macros w/ - * different restrictions etc. - * - * NB: Care must be taken to order the REG_GROUP_SET macro uses to - * match the actual register order, otherwise all hell breaks loose. - */ - -/* Write to __groupNum registers (max 14) starting at __regBase under - * the control of __groupMask (lsb->msb). - */ -#define REG_GROUP_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXTRUE) - -#define REG_GROUP_BEGIN_WAX( __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, FXTRUE) - -/* Same as the non-NO_CHECK variant, but GR_SET_EXPECTED_SIZE must - * have already been called to allocate space for this write. - */ -#define REG_GROUP_NO_CHECK_BEGIN(__chipId, __regBase, __groupNum, __groupMask) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 21)); \ -GR_ASSERT(((__groupMask) & (SSTCP_PKT4_MASK >> SSTCP_PKT4_MASK_SHIFT)) != 0x00); \ -GR_ASSERT(gc->expected_counter >= (FxI32)((__groupNum) * sizeof(FxU32))); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, FXFALSE) - -/* Register writes (<= 32) sequentially starting at __regBase */ -#define REG_GROUP_LONG_BEGIN(__chipId, __regBase, __groupNum) \ -GR_ASSERT(((__groupNum) >= 1) && ((__groupNum) <= 32)); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * (__groupNum), 1); \ -REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, (0xFFFFFFFF >> (32 - (__groupNum))), FXTRUE) - -#define REG_GROUP_BEGIN_INTERNAL(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(gc->myLevel + 100, "REG_GROUP_BEGIN: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstRegs, __regBase) >> 2) - -#define REG_GROUP_BEGIN_INTERNAL_WAX(__regBase, __groupNum, __groupMask, __checkP) \ -{ \ - GR_DCL_GC; \ - REG_GROUP_DCL_WAX(__groupMask, __regBase, __groupNum, __checkP); \ - GDBG_INFO(220, "REG_GROUP_BEGIN_WAX: (0x%X : 0x%X)\n", \ - (__groupMask), offsetof(SstGRegs, __regBase) >> 2) - - -#define REG_GROUP_SET(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXFALSE); \ - SET(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - -#define REG_GROUP_SET_WAX(__regBase, __regAddr, __val) \ -do { \ - SET(((SstGRegs*)((FxU32) __regBase + SST_2D_OFFSET))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) - - -#define REG_GROUP_SETF(__regBase, __regAddr, __val) \ -do { \ - REG_GROUP_ASSERT(__regAddr, __val, FXTRUE); \ - SETF(((SstRegs*)(__regBase))->__regAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)); \ -} while(0) - -#if GLIDE_FP_CLAMP -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ -do { \ - const FxU32 fpClampVal = FP_FLOAT_CLAMP(__val); \ - REG_GROUP_ASSERT(__regAddr, fpClampVal, FXTRUE); \ - SET(((FxU32*)(__regBase))[offsetof(SstRegs, __regAddr) >> 2], fpClampVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ -} while(0) -#else -#define REG_GROUP_SETF_CLAMP(__regBase, __regAddr, __val) \ - REG_GROUP_SETF(__regBase, __regAddr, __val) -#endif - -#define REG_GROUP_NO_CHECK_END() \ - ASSERT(!_checkP); \ -} - -#define REG_GROUP_END() \ - ASSERT(_checkP); \ -} \ -GR_CHECK_SIZE() - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE -/* Send all of the triangle parameters in a single cmd fifo packet to - * the chip until the tsu is fixed. - */ -#define kNumTriParam 0x1FUL - -#define TRI_NO_TSU_BEGIN(__floatP) \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - !gc->open, \ - "Called before grSstWinOpen()"); \ -GR_CHECK_COMPATABILITY(FN_NAME, \ - (gc->cmdTransportInfo.lfbLockCount != 0), \ - "Called within grLfbLock/grLfbUnlockPair"); \ -GR_SET_EXPECTED_SIZE(sizeof(FxU32) * kNumTriParam, 1); \ -{ \ - volatile FxU32* regBaseAddr = (volatile FxU32*)((__floatP) \ - ? &hw->FvA \ - : &hw->vA); \ - GDBG_INFO(gc->myLevel, "TRI_NO_TSU_BEGIN: fbiRegs->%svA\n", \ - ((__floatP) ? "F" : "")) - -#define TRI_NO_TSU_SET(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - ASSERT(hwWriteAddr == regBaseAddr); \ - SET(*hwWriteAddr, (__val)); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_SETF(__addr, __val) \ -do { \ - const FxU32* hwWriteAddr = (const FxU32*)(__addr); \ - const FxFloat hwFloatVal = __val; \ - ASSERT(hwWriteAddr == regBaseAddr); \ - GDBG_INFO(gc->myLevel + 200, FN_NAME": FloatVal 0x%X : (0x%X : %g)\n", \ - ((FxU32)hwWriteAddr - (FxU32)hw) >> 2, \ - *(const FxU32*)&hwFloatVal, hwFloatVal); \ - SETF(*hwWriteAddr, hwFloatVal); \ - GR_INC_SIZE(sizeof(FxU32)); \ - regBaseAddr++; \ -} while(0) - -#define TRI_NO_TSU_END() \ -} -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -#endif /* !USE_PACKET_FIFO */ - -/* Offsets to 'virtual' addresses in the hw */ -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#define HW_REGISTER_OFFSET SST_3D_OFFSET -#define HW_FIFO_OFFSET 0x00200000UL -#elif (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_IO_REG_REMAP SST_IO_OFFSET -#define HW_CMD_AGP_OFFSET SST_CMDAGP_OFFSET -#define HW_2D_REG_OFFSET SST_2D_OFFSET -#define HW_3D_REG_OFFSET SST_3D_OFFSET -#define HW_REGISTER_OFFSET HW_3D_REG_OFFSET -#else -#error "Must define virtual address spaces for this hw" -#endif - -#define HW_FIFO_OFFSET 0x00200000UL -#define HW_LFB_OFFSET SST_LFB_OFFSET -#define HW_TEXTURE_OFFSET SST_TEX_OFFSET - -/* This is the alignmnet requirement for texBaseAddr. Actually, - * nothing bad is going to happen, but when the hw lops bits off of - * the address the wrong texels are going to appear. - */ -#define SST_TEXTURE_ALIGN 0x10UL -#define SST_TEXTURE_ALIGN_MASK (SST_TEXTURE_ALIGN - 0x01UL) - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) || (GLIDE_PLATFORM & GLIDE_HW_H3) -#define HW_BASE_PTR(__b) (__b) -#else -#error "Need HW_BASE_PTR to convert hw address into board address." -#endif - -#define HW_REG_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_REGISTER_OFFSET)) -#define HW_LFB_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_LFB_OFFSET)) -#define HW_TEX_PTR(__b) ((FxU32*)(((FxU32)(__b)) + HW_TEXTURE_OFFSET)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) -#define ArraySize(__a) (sizeof(__a) / sizeof((__a)[0])) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#if GDBG_INFO_ON -/* cvg.c */ -extern void -_grErrorCallback(const char* const procName, - const char* const format, - va_list args); -#endif - -/* Returns 16:16 pair indicating the cpu's manufacturer and its - * capabilities. Non-Intel processors should have a vendor id w/ the - * high bit set so that it appears to be a negative #. The value of - * the capability field is assumed to be a monotonically increasing - * inclusive set. - * - * Unknown: - * 0xFFFF:0xFFFF - * - * Intel: 0x0000 - * 4: 486 and lower - * 5: Pentium - * 6: P6 Core w/ MTRR's - * 7: P6 Core w/ KNI - * - * AMD: 0x8001 - * 1: MMX - * 2: 3DNow!(tm) - * 4: K6-type MTRRs - * 8: P2-type MTRRs - * - * Cyrix: 0x8002 - * 1: MMX - * 2: 3DNow!(tm) - * - * IDT: 0x8003 - * 1: MMX - * 2: 3DNow!(tm) - * - */ - -enum { - kCPUVendorIntel = 0x0000, - kCPUVendorAMD = 0x8001, - kCPUVendorCyrix = 0x8002, - kCPUVendorIDT = 0x8003, - kCPUVendorUnknown = 0xFFFF -}; -extern FxI32 GR_CDECL -_cpu_detect_asm(void); - -extern void GR_CDECL -single_precision_asm(void); - -extern void GR_CDECL -double_precision_asm(void); - -#ifdef GLIDE3 -/* -** Macro to handle clip space and viewport stuff -*/ -#define TRI_SETF_SCALE_ADVANCE(_ptr,_scaler) \ - TRI_SETF(FARRAY(_ptr, i)*_scaler); dataElem++; i = gc->tsuDataList[dataElem] - -#define DA_SETF_SCALE_ADVANCE(_ptr,_scaler) \ - DA_SETF(FARRAY(_ptr, i)*_scaler); dataElem++; i = gc->tsuDataList[dataElem] - -#define DA_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { \ - DA_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - } \ - else { \ - DA_SETF(FARRAY(_s, i)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - DA_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth + gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - DA_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - DA_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - DA_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#define TRI_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - } \ - else { \ - TRI_SETF(FARRAY(_s, i)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - TRI_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth+gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - TRI_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - TRI_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - TRI_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#define AA_TRI_VP_SETFS(_s,_oow) \ -{ \ - FxI32 i, dataElem=0; \ - i = gc->tsuDataList[dataElem]; \ - if (gc->state.paramIndex & (STATE_REQUIRES_IT_DRGB | STATE_REQUIRES_IT_ALPHA)) { \ - if (gc->state.vData.colorType == GR_FLOAT) { \ - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - TRI_SETF_SCALE_ADVANCE(_s,_GlideRoot.pool.f255); \ - } \ - TRI_SETF(0.0f); \ - } \ - else { \ - FxU32 argb; \ - argb = *((FxU32 *)((int)_s + i)) & 0x00ffffff; \ - TRI_SETF(*((float *)&argb)); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { \ - TRI_SETF(FARRAY(_s, i)*_oow*gc->state.Viewport.hdepth + gc->state.Viewport.oz); \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { \ - if (gc->state.vData.qInfo.offset) { \ - TRI_SETF(FARRAY(_s, gc->state.vData.qInfo.offset)*_oow); \ - } else { \ - TRI_SETF(_oow); \ - } \ - dataElem++; \ - i = gc->tsuDataList[dataElem]; \ - } \ - while (i != GR_DLIST_END) { \ - TRI_SETF_SCALE_ADVANCE(_s,_oow*_GlideRoot.pool.f255); \ - } \ -} - -#endif - -/* -** The lod and aspect ratio changes will be done after we split the tree. -** Currently, we change the definition but patch it back to the original value -** so it is the same glide2. -** To smooth the transition from glide2 defs to glide3 defs, we introduce the -** translation layer. -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifndef GLIDE3_DEBUG -//#define GLIDE3_DEBUG 1 -#endif -#ifdef GLIDE3_DEBUG -#define TEX_INFO(ptr,field) ptr##field -#define G3_LOD_TRANSLATE(lod) (lod) -#define G3_ASPECT_TRANSLATE(aspect) (aspect) -#else -#define TEX_INFO(ptr,field) ptr##field##Log2 -#define G3_LOD_TRANSLATE(lod) (0x8-lod) -#define G3_ASPECT_TRANSLATE(aspect) (0x3-(aspect)) -#endif /* GLIDE3_DEBUG */ -#else -#define TEX_INFO(ptr,field) ptr##field -#define G3_LOD_TRANSLATE(lod) (lod) -#define G3_ASPECT_TRANSLATE(aspect) (aspect) -#endif - -/* externals from ditex.c */ -extern const FxU32 _grMipMapHostSize[4][9]; -extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2]; -extern const FxU32 _gr_aspect_index_table[]; -extern const FxU32 _gr_aspect_xlate_table[]; -extern const FxU32 _gr_evenOdd_xlate_table[]; - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/h3/glide/src/fxsplash.h b/glide2x/h3/glide/src/fxsplash.h deleted file mode 100644 index 8d4e013..0000000 --- a/glide2x/h3/glide/src/fxsplash.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 1 2/19/99 5:50p Peter -** type definitions for new splash screen -*/ - -#ifndef _FX_SPLASH_H_ -#define _FX_SPLASH_H_ - -#include "3dfx.h" -#define FX_DLL_DEFINITION -#include "fxdll.h" -#include "glide.h" - -typedef FxBool -(FX_CALL* GrSplashInitProc)(FxU32 hWnd, - FxU32 screenWidth, FxU32 screenHeight, - FxU32 numColBuf, FxU32 numAuxBuf, - GrColorFormat_t colorFormat); - -typedef void -(FX_CALL* GrSplashShutdownProc)(void); - -typedef void -(FX_CALL* GrSplashProc)(float x, float y, - float w, float h, - FxU32 frameNumber); - -typedef const void* -(FX_CALL* GrSplashPlugProc)(FxU32* w, FxU32* h, - FxI32* strideInBytes, - GrLfbWriteMode_t* format); - -#endif /* _FX_SPLASH_H_ */ diff --git a/glide2x/h3/glide/src/g3df.c b/glide2x/h3/glide/src/g3df.c deleted file mode 100644 index e0f443b..0000000 --- a/glide2x/h3/glide/src/g3df.c +++ /dev/null @@ -1,568 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:27 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 19 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 18 4/03/98 2:04p Dow -** Dos Glide Mods - * - * 16 1/13/98 7:48p Atai - * fixed gu3dfGetInfo, grBufferClear, and GrState size - * - * 15 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 14 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 12 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 11 12/09/97 12:20p Peter - * mac glide port - * - * 10 6/06/97 5:56p Peter - * fixed gcc/dural compilation things - * - * 9 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 8 5/27/97 1:16p Peter - * Basic cvg - * - * 7 5/21/97 6:05a Peter - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include -#include -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -static FxU16 ReadDataShort(FILE *); -static FxU32 ReadDataLong(FILE *); -static void Read8Bit(FxU8 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect); -static void Read16Bit(FxU16 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect); - -#if ((GLIDE_PLATFORM & (GLIDE_OS_DOS32 | GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) != 0) -const char *openmode = "rb"; -#else -const char *openmode = "r"; -#endif - -typedef struct -{ - const char *name; - GrTextureFormat_t fmt; - FxBool valid; -} CfTableEntry; - -static FxBool -_grGet3dfHeader(FILE* stream, char* const buffer, const FxU32 bufSize) -{ - int numLines = 0; - FxU32 bufPos = 0; - - while(numLines < 4) { - /* Handle stream errors */ - if (fgets(buffer + bufPos, bufSize - bufPos, stream) == NULL) break; - bufPos += strlen(buffer + bufPos); - - /* fgets includes the '\n' in the buffer. If this is not there - * then the buffer is too small so fail. - */ - if (*(buffer + bufPos - sizeof(char)) != '\n') break; - numLines++; - } - - return (numLines == 4); -} - -/*--------------------------------------------------------------------------- -** gu3dfGetInfo -*/ -GR_DIENTRY(gu3dfGetInfo, FxBool, - (const char *FileName, Gu3dfInfo *Info)) -{ - FILE *image_file; - FxU32 i; - char version[5]; - char color_format[10]; - int aspect_width, aspect_height; - char buffer[100]; - int small_lod, large_lod; - FxBool ratio_found = FXFALSE; - FxBool format_found = FXFALSE; - GrAspectRatio_t wh_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_1x2, - GR_ASPECT_1x4, - GR_ASPECT_1x8 - }; - GrAspectRatio_t hw_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_2x1, - GR_ASPECT_4x1, - GR_ASPECT_8x1 - }; - CfTableEntry cftable[] = - { - { "I8", GR_TEXFMT_INTENSITY_8, FXTRUE }, - { "A8", GR_TEXFMT_ALPHA_8, FXTRUE }, - { "AI44", GR_TEXFMT_ALPHA_INTENSITY_44, FXTRUE }, - { "YIQ", GR_TEXFMT_YIQ_422, FXTRUE }, - { "RGB332", GR_TEXFMT_RGB_332, FXTRUE }, - { "RGB565", GR_TEXFMT_RGB_565, FXTRUE }, - { "ARGB8332", GR_TEXFMT_ARGB_8332, FXTRUE }, - { "ARGB1555", GR_TEXFMT_ARGB_1555, FXTRUE }, - { "AYIQ8422", GR_TEXFMT_AYIQ_8422, FXTRUE }, - { "ARGB4444", GR_TEXFMT_ARGB_4444, FXTRUE }, - { "AI88", GR_TEXFMT_ALPHA_INTENSITY_88, FXTRUE }, - { "P8", GR_TEXFMT_P_8, FXTRUE }, - { "AP88", GR_TEXFMT_AP_88, FXTRUE }, - { 0, 0, FXFALSE } - }; - - GDBG_INFO(81,"gu3dfGetInfo(%s,0x%x)\n",FileName,Info); - /* - ** open the filen - */ - if((image_file = fopen(FileName, openmode)) == NULL) return FXFALSE; - if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE; - - /* - ** grab statistics out of the header - */ - if(sscanf(buffer,"3df v%s %s lod range: %i %i aspect ratio: %i %i\n", - version, - color_format, - &small_lod, &large_lod, - &aspect_width, &aspect_height) == 0) - return FXFALSE; - - /* - ** determine aspect ratio, height, and width - */ - i = 0; - ratio_found = FXFALSE; - while ((i < 4) && (!ratio_found)) { - if ((aspect_width << i) == aspect_height) { - Info->header.aspect_ratio = wh_aspect_table[i]; - ratio_found = FXTRUE; - } - - i++; - } - - i = 0; - while ((i < 4) && (!ratio_found)) { - if ((aspect_height << i) == aspect_width) { - Info->header.aspect_ratio = hw_aspect_table[i]; - ratio_found = FXTRUE; - } - - i++; - } - if (!ratio_found) return FXFALSE; - - /* - ** determine height and width of the mip map - */ - if (aspect_width >= aspect_height) { - Info->header.width = large_lod; - Info->header.height = large_lod / aspect_width; - } else { - Info->header.height = large_lod; - Info->header.width = large_lod / aspect_height; - } - - - /* - ** calculate proper LOD values - */ - /* - ** note for glide3 lod translation: - ** we should return the new defines for glide3 - */ - switch (small_lod) { - case 1: - Info->header.small_lod = GR_LOD_1; - break; - - case 2: - Info->header.small_lod = GR_LOD_2; - break; - - case 4: - Info->header.small_lod = GR_LOD_4; - break; - - case 8: - Info->header.small_lod = GR_LOD_8; - break; - - case 16: - Info->header.small_lod = GR_LOD_16; - break; - - case 32: - Info->header.small_lod = GR_LOD_32; - break; - - case 64: - Info->header.small_lod = GR_LOD_64; - break; - - case 128: - Info->header.small_lod = GR_LOD_128; - break; - - case 256: - Info->header.small_lod = GR_LOD_256; - break; - } - - switch (large_lod) { - case 1: - Info->header.large_lod = GR_LOD_1; - break; - - case 2: - Info->header.large_lod = GR_LOD_2; - break; - - case 4: - Info->header.large_lod = GR_LOD_4; - break; - - case 8: - Info->header.large_lod = GR_LOD_8; - break; - - case 16: - Info->header.large_lod = GR_LOD_16; - break; - - case 32: - Info->header.large_lod = GR_LOD_32; - break; - - case 64: - Info->header.large_lod = GR_LOD_64; - break; - - case 128: - Info->header.large_lod = GR_LOD_128; - break; - - case 256: - Info->header.large_lod = GR_LOD_256; - break; - } - - /* - ** determine the color format of the input image - */ -#ifdef __GNUC__ - /* This function is not found in libgcc.a */ - { - char* tempStr = (char*)color_format; - while(*tempStr != '\0') *tempStr++ = toupper(*tempStr); - } -#else - { - extern char* strupr(char*); - strupr(color_format); - } -#endif /* __GNUC__ */ - - i = 0; - format_found = FXFALSE; - while ((cftable[i].name != 0) && (!format_found)) { - if (strcmp(color_format, cftable[i].name) == 0) { - Info->header.format = cftable[i].fmt; - format_found = FXTRUE; - } - - i++; - } - - /* - ** close the input file - */ - if (image_file != NULL) fclose(image_file); - - if (format_found) { - FxI32 lod; - Info->mem_required = 0; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG - for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) { -#else - for(lod = Info->header.large_lod; lod >= Info->header.small_lod; lod--) { -#endif -#else - for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) { -#endif - Info->mem_required += (_grMipMapHostSize[_gr_aspect_index_table[G3_ASPECT_TRANSLATE(Info->header.aspect_ratio)]] - [G3_LOD_TRANSLATE(lod)] << (Info->header.format>=GR_TEXFMT_16BIT)); - } - } - - return format_found; -} - -/*--------------------------------------------------------------------------- -** gu3dfLoad -*/ -GR_DIENTRY(gu3dfLoad, FxBool, (const char *filename, Gu3dfInfo *info)) -{ - FILE *image_file = 0; - FxU32 index = 0; - char buffer[100] = ""; - - GDBG_INFO(81,"gu3dfLoad(%s,0x%x)\n",filename,info); - /* - ** open the file - */ - if ((image_file = fopen(filename, openmode)) == NULL) return FXFALSE; - if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE; - - /* - ** If necessary, read in the YIQ decompression table - */ - if ((info->header.format == GR_TEXFMT_YIQ_422) || - (info->header.format == GR_TEXFMT_AYIQ_8422)) - { - /* - ** read in Y - */ - for (index = 0; index < 16; index++) - info->table.nccTable.yRGB[index] = ((FxI16) ReadDataShort(image_file)) & 0xFF; - - /* - ** read in I - */ - for (index = 0; index < 4; index++) { - info->table.nccTable.iRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.iRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.iRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - } - - /* - ** read in Q - */ - for (index = 0; index < 4; index++) { - info->table.nccTable.qRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.qRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - info->table.nccTable.qRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF; - } - - /* - ** pack the table Y entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.yRGB[index*4+0]); - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+1]) << 8; - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+2]) << 16; - packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+3]) << 24; - - info->table.nccTable.packed_data[index] = packedvalue; - } - - /* - ** pack the table I entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.iRGB[index][0]) << 18; - packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][1]) << 9; - packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][2]) << 0; - - info->table.nccTable.packed_data[index+4] = packedvalue; - } - - /* - ** pack the table Q entries - */ - for (index = 0; index < 4; index++) { - FxU32 packedvalue; - - packedvalue = ((FxU32) info->table.nccTable.qRGB[index][0]) << 18; - packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][1]) << 9;; - packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][2]) << 0; - - info->table.nccTable.packed_data[index+8] = packedvalue; - } - } - - /* - ** If necessary, read in the Palette - */ - if ((info->header.format == GR_TEXFMT_P_8) || - (info->header.format == GR_TEXFMT_AP_88)) { - FxU32 i; - for(i = 0; i < 256; i++) - info->table.palette.data[i] = ReadDataLong(image_file); - } - - /* - ** Read in the image - */ - switch (info->header.format) - { - case GR_TEXFMT_INTENSITY_8: - case GR_TEXFMT_ALPHA_8: - case GR_TEXFMT_ALPHA_INTENSITY_44: - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_RGB_332: - case GR_TEXFMT_P_8: - Read8Bit(info->data, image_file, - G3_LOD_TRANSLATE(info->header.small_lod), - G3_LOD_TRANSLATE(info->header.large_lod), - G3_ASPECT_TRANSLATE(info->header.aspect_ratio)); - break; - - case GR_TEXFMT_RGB_565: - case GR_TEXFMT_ARGB_8332: - case GR_TEXFMT_ARGB_1555: - case GR_TEXFMT_AYIQ_8422: - case GR_TEXFMT_ARGB_4444: - case GR_TEXFMT_ALPHA_INTENSITY_88: - case GR_TEXFMT_AP_88: - Read16Bit(info->data, image_file, - G3_LOD_TRANSLATE(info->header.small_lod), - G3_LOD_TRANSLATE(info->header.large_lod), - G3_ASPECT_TRANSLATE(info->header.aspect_ratio)); - break; - - default: - return FXFALSE; - } - - /* - ** close the file - */ - fclose(image_file); - - return FXTRUE; -} - -/* -** Read8Bit -** -** Read in an 8-bit texture map, unpacked. -*/ -static void -Read8Bit(FxU8 *data, FILE *image_file, - int small_lod, int large_lod, - GrAspectRatio_t aspect_ratio) -{ - int lod; - int width, height; - - for (lod = large_lod; lod <= small_lod; lod++) { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - fread(data, sizeof(char), width*height, image_file); - data += width*height; - } -} - -/* -** Read16Bit -** -** Read in a 16-bit texture map, unpacked. -*/ -static void Read16Bit(FxU16 *data, FILE *image_file, - int small_lod, int large_lod, - GrAspectRatio_t aspect_ratio) -{ - int index; - int lod; - int width, height; - - for (lod = large_lod; lod <= small_lod; lod++) { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - for (index = 0; index < (width * height); index++) { - *data = ReadDataShort(image_file); - data++; - } - } -} - -/* -** FxU16 ReadDataShort -*/ -static FxU16 ReadDataShort(FILE *fp) -{ - FxU16 b1 = (FxU16)getc(fp); - FxU16 b2 = (FxU16)getc(fp); - -#define kShiftB1 8 -#define kShiftB2 0 - - return (((b1 & 0xFF) << kShiftB1) | ((b2 & 0xFF) << kShiftB2)); -} - -/* -** ReadDataLong -*/ -static FxU32 ReadDataLong(FILE *fp) -{ - FxU32 data; - FxU8 byte[4]; - - fread(byte, 4, 1, fp); - data = (((FxU32) byte[0]) << 24) | - (((FxU32) byte[1]) << 16) | - (((FxU32) byte[2]) << 8) | - ((FxU32) byte[3]); - - return data; -} - - - diff --git a/glide2x/h3/glide/src/gaa.c b/glide2x/h3/glide/src/gaa.c deleted file mode 100644 index f0b2029..0000000 --- a/glide2x/h3/glide/src/gaa.c +++ /dev/null @@ -1,2370 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 69 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 68 11/02/98 11:36a Jeske -** splash speckle mini-workaround for grAADrawTriangle() -** -** 67 10/20/98 2:17p Jeske -** added diag specific aa triangle draw -** -** 66 5/18/98 3:20p Peter -** crybaby warning about alpha not being enabled for aa primatives -** -** 65 4/23/98 4:46p Peter -** John's aa line stuff -** -** 64 3/28/98 11:24a Dow -** itwoç - * - * 61 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 60 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 59 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 57 12/08/97 10:40a Atai - * modify draw vertex primitive routines to do grDrawVertexArrayLinear() - * - * 56 12/05/97 4:26p Peter - * watcom warnings - * - * 55 11/24/97 4:40p Peter - * aa prims vs packing - * - * 54 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 53 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 52 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 51 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 50 11/18/97 3:26p Atai - * update vData - * optimize state monster - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 47 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 46 11/04/97 5:04p Peter - * cataclysm part deux - * - * 45 11/04/97 4:57p Atai - * use byte offset - * - * 44 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 43 11/03/97 3:19p Atai - * optimization - * - * 42 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 41 10/29/97 2:24p Atai - * re-work aa draw routines to increase sbench number - * - * 40 10/21/97 8:38p Atai - * added lines routine for grDrawArray - * - * 39 10/21/97 3:22p Peter - * hand pack rgb - * - * 38 10/19/97 12:51p Peter - * no tsu happiness - * - * 37 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 36 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 35 10/16/97 5:33p Peter - * argb != rgba - * - * 34 10/16/97 3:40p Peter - * packed rgb - * - * 33 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 32 10/14/97 7:33p Atai - * fix compiler error - * - * 31 10/14/97 5:40p Atai - * added grculltest - * - * 30 10/14/97 4:36p Atai - * added aa points, strip line and trianlges for drawarray - * - * 29 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 28 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 27 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 26 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 25 9/16/97 2:49p Peter - * fixed watcom unhappiness w/ static initializers - * - * 24 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 23 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 22 8/30/97 5:58p Tarolli - * cleanups - * - * 21 7/29/97 4:31p Atai - * replace old edge sense routine - * - * 19 7/28/97 2:42p Peter - * aa points? - * - * 18 7/26/97 3:04p Peter - * cleanup - * - * 17 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 16 6/30/97 3:21p Peter - * more aa through cmd fifo - * - * 15 6/20/97 1:17p Peter - * changes for new CVG_TRI macros -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -*/ -GR_ENTRY(grAADrawPoint, void, (const GrVertex *e)) -{ -#define FN_NAME "grAADrawPoint" -#ifdef GLIDE3 - _grAADrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&e); -#else - GR_DCL_GC; - GrCullMode_t cullSave; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - GDBG_INFO(94,"grAADrawPoint(0x%x)\n",e); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vertexParamOffset * 6, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - - { - const float ptX = e->x; - const float ptY = e->y; - const float* const fp = (const float* const)e; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(fp, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fp, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - TRI_SET(packedColor); - } else { - TRI_SETF(0.0f); - } -#else /* !GLIDE_PACKED_RGB */ - /* Parameters up to alpha. - * - * NB: It is up to the user to correctly set this up - * so that the alpha is sent. - */ - while(*dataList != (GR_VERTEX_A_OFFSET << 2)) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - /* Send constant Alpha == 0.0f */ - TRI_SETF(0.0f); -#endif /* !GLIDE_PACKED_RGB */ - - /* Skip the actual alpha value in the data list */ - dataList++; - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fp, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* Anything else in the dataList */ - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fp, *dataList)); - dataList++; - } - } - } - } - } - - TRI_END; - GR_CHECK_SIZE(); -#else - { - GrVertex a, b; - - /* - ** make corners of a square - */ - a = - b = *e; - - a.tmuvtx[0].oow = - b.tmuvtx[0].oow = _GlideRoot.pool.f1; - - a.x -= _GlideRoot.pool.f1; - a.y -= _GlideRoot.pool.f1; - - b.x += _GlideRoot.pool.f1; - b.y -= _GlideRoot.pool.f1; - - a.a = - b.a = _GlideRoot.pool.f0; - - grDrawTriangle(&a, &b, e); /* A B E */ - - b.x -= 2.0F; /* compute point D */ - b.y += 2.0F; - grDrawTriangle(&a, e, &b); /* A E D */ - - a.x += 2.0F; /* compute point C */ - a.y += 2.0F; - grDrawTriangle(&b, e, &a); /* D E C */ - - b.x += 2.0F; - b.y -= 2.0F; - grDrawTriangle(&a, e, &b); /* C E B */ - } -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - - /* Restore culling mode */ - gc->state.cull_mode = cullSave; -#endif -#undef FN_NAME -} /* grAADrawPoint */ -#endif /* !GLIDE3_ALPHA */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -static void -grAADrawStrip(const FxU32 cullMode, const float* const vectorList[], const FxU32 vectorNum) -{ -#define FN_NAME "grAADrawStrip" - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, gc->myLevel); - GDBG_INFO_MORE(gc->myLevel, "(): 0x%X\n", vectorNum); - - GR_FLUSH_STATE(); - - GR_SET_EXPECTED_SIZE(vertexParamOffset * vectorNum, 1); - TRI_PACKET_BEGIN(cullMode, gc->cmdTransportInfo.paramMask, - vectorNum, vertexParamOffset, - SSTCP_PKT3_BDDDDD); - { - FxU32 v; - - for(v = 0; v < vectorNum; v++) { - const float* const vector = vectorList[v]; - - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - TRI_SET(packedColor); - } else { - TRI_SETF(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2))); - } - dataList++; -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vector, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vector, *dataList)); - dataList++; - } - } - } - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/* -** grAADrawEdgeTriangle -*/ -static void -grAADrawEdgeTriangle(float *va, float *vb, float *vc) -{ - float - *fa = va, - *fb = vb, - *fc = vc, - dpAB, dpBC, - dpdx, dpdy, /* Change in parameter WRT x & y */ - area; - float - ooa, dxAB, dxBC, dyAB, dyBC; - float negateArea = -1.f; - - GR_BEGIN_NOFIFOCHECK("grAADrawEdgeTriangle",gc->myLevel); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_FLUSH_STATE(); - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - if (va[1] < vb[1]) { - if (vb[1] > vc[1]) { /* acb */ - if (va[1] < vc[1]) { - fa = va; - fb = vc; - fc = vb; - negateArea *= -1.f; - } else { /* cab */ - fa = vc; - fb = va; - fc = vb; - } - /* else it's already sorted */ - } - } else { - if (vb[1] < vc[1]) { /* bac */ - if (va[1] < vc[1]) { - fa = vb; - fb = va; - fc = vc; - negateArea *= -1.f; - } else { /* bca */ - fa = vb; - fb = vc; - fc = va; - } - } else { /* cba */ - fa = vc; - fb = vb; - fc = va; - negateArea *= -1.f; - } - } - - /* Compute Area */ - dxAB = fa[0] - fb[0]; - dxBC = fb[0] - fc[0]; - - dyAB = fa[1] - fb[1]; - dyBC = fb[1] - fc[1]; - - area = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - if (area == 0.0f) goto all_done; - - ooa = 1.0f / area; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GR_SET_EXPECTED_SIZE(((10 + (_GlideRoot.paramCount - 1)) << 2), - 10 + (_GlideRoot.paramCount - 1)); - - /* write out X & Y for vertex A */ - GR_SETF(BROADCAST_ID, hw, FvA.x, fa[0]); - GR_SETF(BROADCAST_ID, hw, FvA.y, fa[1]); - - /* write out X & Y for vertex B */ - GR_SETF(BROADCAST_ID, hw, FvB.x, fb[0]); - GR_SETF(BROADCAST_ID, hw, FvB.y, fb[1]); - - /* write out X & Y for vertex C */ - GR_SETF(BROADCAST_ID, hw, FvC.x, fc[0]); - GR_SETF(BROADCAST_ID, hw, FvC.y, fc[1]); - - dpAB = (fa[GR_VERTEX_A_OFFSET] - fb[GR_VERTEX_A_OFFSET]); - dpBC = (fb[GR_VERTEX_A_OFFSET] - fc[GR_VERTEX_A_OFFSET]); - dpdx = dpAB * dyBC - dpBC * dyAB; - dpdy = dpBC * dxAB - dpAB * dxBC; - - /* Write the alpha data */ - GR_SETF(BROADCAST_ID, hw, Fa, fa[GR_VERTEX_A_OFFSET]); - GR_SETF(BROADCAST_ID, hw, Fdadx , dpdx); - GR_SETF(BROADCAST_ID, hw, Fdady , dpdy); - - { - const struct dataList_s* dlp = gc->regDataList; - int i = dlp->i; - - /* We already put the alpha out, and this is guaranteed to - * be included in the dataList via convention. - */ - while (i != (GR_VERTEX_A_OFFSET << 2)) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - dlp++; - i = dlp->i; - - while (i != 0) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(fa, i)); - dlp++; - i = dlp->i; - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - GR_SETF(BROADCAST_ID, hw, FtriangleCMD, area); - } - -all_done: - GR_END(); -} /* grAADrawEdgeTriangle */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -#ifndef GLIDE3_ALPHA -#if (GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) -#define FUCAST( X ) (*(FxU32*)&(X)) -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ -#define FN_NAME "grAADrawLine" - GR_DCL_GC; - GrVertex *_v1, *_v2; - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* datalist; - float xoff, yoff; - float alpha; - float dx, dy; /* delta X and Y */ - float adx, ady;/* |dX| and |dY| */ - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_SET_EXPECTED_SIZE( vertexParamOffset * 6, 1 ); - TRI_PACKET_BEGIN( 0, - gc->cmdTransportInfo.paramMask, - 6, - vertexParamOffset, - SSTCP_PKT3_BDDDDD ); - - /* y sort*/ - if (v2->y < v1->y) { - _v1 = (void*) v2; - _v2 = (void*) v1; - } else { - _v1 = (void*) v1; - _v2 = (void*) v2; - } - -#define v1 _v1 -#define v2 _v2 - /* compute deltas and absolute deltas */ - - dx = v2->x - v1->x; - dy = v2->y - v1->y; - - adx = (float)(FUCAST( dx ) & 0x7fffffff); - ady = (float)(FUCAST( dy ) & 0x7fffffff); - - if ( adx >= ady ) { - xoff = 0.0f; - yoff = 1.0f; - } else { - xoff = 1.0f; - yoff = 0.0f; - } - - /* A---B Alpha = 0.0 - | \ | - V1-V2 Alpha = 1.0 ( user ) - | \ | - E---F Alpha = 0.0 - */ - - /* B Vertex */ - TRI_SETF( v2->x + xoff ); - TRI_SETF( v2->y - yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* A Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x + xoff ); - TRI_SETF( v1->y - yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - v1->a = alpha; - - /* V2 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x ); - TRI_SETF( v2->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - /* V1 Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x ); - TRI_SETF( v1->y ); - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - - /* F Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v2->x - xoff ); - TRI_SETF( v2->y + yoff ); - - alpha = v2->a; - v2->a = 0.0f; - datalist = gc->tsuDataList; - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v2, *datalist)); - datalist++; - } - - v2->a = alpha; - - /* E Vertex */ - datalist = gc->tsuDataList; - - TRI_SETF( v1->x - xoff ); - TRI_SETF( v1->y + yoff ); - - alpha = v1->a; - v1->a = 0.0f; - datalist = gc->tsuDataList; - - - while( *datalist != 0 ) { - TRI_SETF(FARRAY(v1, *datalist)); - datalist++; - } - v1->a = alpha; -#undef v1 -#undef v2 - - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -/*--------------------------------------------------------------------------- -** grAADrawLine -*/ -GR_ENTRY(grAADrawLine, void, (const GrVertex *v1, const GrVertex *v2)) -{ -#ifdef GLIDE3 - float *vlist[2]; - vlist[0] = (float *)v1; - vlist[1] = (float *)v2; - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, 2, vlist); -#else - float dx, dy; /* delta X and Y */ - float adx, ady; /* |dX| and |dY| */ - GrVertex a, b, e, f; /* four vertices outlining the line */ - GR_DCL_GC; - - /* turn off culling so triangles unconditionally draw. - * - * NB: On cvg we control this via the command packet. - */ - GrCullMode_t cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - GDBG_INFO(95, "grAADrawLine (%f %f) -> (%f %f)\n", - v1->x, v1->y, v2->x, v2->y); - - GR_FLUSH_STATE(); - - /* draw from low Y to high Y */ - if (v2->y < v1->y) { - const GrVertex* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v2->x - v1->x; - dy = ady = v2->y - v1->y; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - a = *v1; - e = *v1; - b = *v2; - f = *v2; - - if (adx >= ady) { /* X major line */ - a.y -= _GlideRoot.pool.f1; - a.a = 0.F; - b.y -= _GlideRoot.pool.f1; - b.a = 0.F; - e.y += _GlideRoot.pool.f1; - e.a = 0.F; - f.y += _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, v2, &b); - grDrawTriangle(&a, v2, v1); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } else { /* Y major line */ - a.x += _GlideRoot.pool.f1; - a.a = 0.F; - b.x += _GlideRoot.pool.f1; - b.a = 0.F; - e.x -= _GlideRoot.pool.f1; - e.a = 0.F; - f.x -= _GlideRoot.pool.f1; - f.a = 0.F; - - grDrawTriangle(&a, &b, v2); - grDrawTriangle(v1, &a, v2); - grDrawTriangle(v1, &f, &e); - grDrawTriangle(v1, v2, &f); - } - - gc->state.cull_mode = cullSave; -#endif /* GLIDE3 */ -} /* grAADrawLine */ -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#endif /* !GLIDE3_ALPHA */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdge -*/ -static void -grAADrawTriEdge(const GrVertex *a, const GrVertex *b, aaEdgeSense sense) -{ - GrVertex c = *a, d = *b; - - c.a = 0.f; - d.a = 0.f; - - switch (sense) { - case aaEdgeSenseTop: - c.y += _GlideRoot.pool.f1; - d.y += _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - c.x -= _GlideRoot.pool.f1; - d.x -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseBottom: - c.y -= _GlideRoot.pool.f1; - d.y -= _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - c.x += _GlideRoot.pool.f1; - d.x += _GlideRoot.pool.f1; - break; - } - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - /* Maintain the same culling mode that we would have used for - * the inner triangle. - */ - GR_DCL_GC; - const FxU32 cullMode = gc->state.cull_mode; - const FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? (kSetupCullEnable | ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative)) - : kSetupCullDisable); - const float* lVertexList[4]; - - lVertexList[0] = &c.x; - lVertexList[1] = &d.x; - lVertexList[2] = &a->x; - lVertexList[3] = &b->x; - - grAADrawStrip(kSetupStrip | sMode, - lVertexList, - sizeof(lVertexList) / sizeof(lVertexList[0])); - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - if (a->y < b->y) { - grAADrawEdgeTriangle((float *) a, (float *) &c, (float *) &d); - grAADrawEdgeTriangle((float *) a, (float *) &d, (float *) b); - } else { - grAADrawEdgeTriangle((float *) b, (float *) &d, (float *) &c); - grAADrawEdgeTriangle((float *) b, (float *) &c, (float *) a); - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -} /* grAADrawTriEdge */ - -#define DXSQUARED(i,j) ((i->x - j->x) * (i->x - j->x)) -#define DYSQUARED(i,j) ((i->y - j->y) * (i->y - j->y)) - -/* -** -*/ -static aaEdgeSense -aaCalcEdgeSense(const GrVertex *a, const GrVertex *b, const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy; - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - return ((c->x > a->x) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - else if (dy == 0.0f) { - return ((c->y > a->y) ? aaEdgeSenseBottom : aaEdgeSenseTop); - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - return ((cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft); - } - else { - if (dx <= dy) /* X-major line */ - return ((cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom); - else /* Y-major line */ - return ((cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight); - } - } -} /* aaCalcEdgeSense */ - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, - void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias)) -{ -#define FN_NAME "grAADrawTriangle" - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 96); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - fbzModeOld = gc->state.fbi_config.fbzMode; - - /* backfaced or zero area */ - if (TRISETUP(a, b, c) <= 0) return; - - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - -#if 1 /* speckle mini-workaround, another one below... - jeske */ - GR_SET_EXPECTED_SIZE(4 * 2, 1 * 2); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); -#else - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); -#endif - GR_CHECK_SIZE(); - - if (ab_antialias) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - } - - if (bc_antialias) { - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - if (ca_antialias) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - /* Restore the old fbzMode */ -#if 1 /* speckle mini-workaround, another one above... - jeske */ - GR_SET_EXPECTED_SIZE(4 * 2, 1 * 2); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); -#else - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzModeOld); -#endif - GR_END(); -#undef FN_NAME -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygon" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if (TRISETUP (a, b, c) <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - } - - GR_END(); -#undef FN_NAME -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ -#define FN_NAME "grAADrawPolygonVertexList" - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - aaEdgeSense - sense; /* Edge sense for edge polygons */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nverts,vlist); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((gc->cmdTransportInfo.paramMask & (SST_SETUP_A << SSTCP_PKT3_PMASK_SHIFT)) == 0), - "Antialiasing require enabling alpha"); - - GR_FLUSH_STATE(); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP (a, b, c); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - sense = aaCalcEdgeSense(a, b, c); - grAADrawTriEdge(a, b, sense); - - } else if (i == (nverts - 2)) { - sense = aaCalcEdgeSense(c, a, b); - grAADrawTriEdge(c, a, sense); - } - - sense = aaCalcEdgeSense(b, c, a); - grAADrawTriEdge(b, c, sense); - - } - GR_END(); -#undef FN_NAME -} /* grAADrawPolygonVertexList */ - -#ifdef GLIDE3 /* glide 3. draw aa points, and aa strip line routine */ -#define OK_TO_SKIP_XY -#define ZEROALPHA(_ss) *((FxU32 *)&_ss)=*((FxU32 *)&_ss)&0x00ffffff - -/*------------------------------------------------------------------- - Function: _grAADrawPoints - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias points - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawPoints(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawPoints" - - /* - * the aa point routine is similar to grAADrawPoint routine - * except the data set up is from the pointer array and - * its data layout - */ - GR_DCL_GC; - GrCullMode_t cullSave; - float *e, ptX, ptY; - FxU32 ia; - FxU32 i; - FxU32 vsize; - FxI32 stride = mode; - - GDBG_INFO(94,"_grAADrawPoints(0x%x)\n",e); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - /* turn off culling so triangles unconditionally draw */ - cullSave = gc->state.cull_mode; - gc->state.cull_mode = GR_CULL_DISABLE; - - if (stride == 0) - stride = gc->state.vData.vStride; - - GR_FLUSH_STATE(); - - if (gc->state.vData.colorType == GR_FLOAT) - ia = gc->state.vData.aInfo.offset; - else - ia = gc->state.vData.pargbInfo.offset; - - vsize = gc->state.vData.vSize * 6; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count--) { - FxU32 dataElem = 0; - - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, gc->state.vData.vSize, - SSTCP_PKT3_BDDDDD); - - e = pointers; - if (mode) - e = *(float **)e; - (float *)pointers += stride; - - ptX = FARRAY(e, GR_VERTEX_X_OFFSET << 2); - ptY = FARRAY(e, GR_VERTEX_Y_OFFSET << 2); - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(e, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - if (gc->state.vData.colorType == GR_FLOAT) { - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - dataElem = 0; - - i = gc->tsuDataList[dataElem]; - - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(0.0f); - } - else { - TRI_SETF(FARRAY(e, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - else { - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - - dataElem = 0; - - i = gc->tsuDataList[dataElem]; - - while (i != GR_DLIST_END) { - FxU32 argb; - - if (i == ia) { - argb = *((FxU32 *)((int)e + i)) & 0x00ffffff; - TRI_SETF(*((float *)&argb)); - } - else { - TRI_SETF(FARRAY(e, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - else { - /* - * first cut of clip space coordinate code. - */ - - float oow; - - while (count--) { - FxU32 dataElem = 0; - - /* We draw this as a 4 triangle fan centered around E. */ - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupFan, - 0x06UL, gc->state.vData.vSize, - SSTCP_PKT3_BDDDDD); - - e = pointers; - if (mode) - e = *(float **)e; - oow = 1.0f / FARRAY(e, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - - ptX = FARRAY(e, GR_VERTEX_X_OFFSET << 2) - *oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - ptY = FARRAY(e, GR_VERTEX_Y_OFFSET << 2) - *oow*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* Send down the original point center */ - TRI_SETF(ptX); - TRI_SETF(ptY); - - TRI_VP_SETFS(e,oow); - - /* Send the 'surrounding' vertices w/ alpha == 0.0f. To avoid - * the vertex copying from the previous version we carry around - * a table of offsets that we add into the original point to get - * the new points. - */ - { - int v; - static const float xAdjust[] = { 1.0f, -1.0f, -1.0f, 1.0f, 1.0f }; - static const float yAdjust[] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; - - ASSERT(ArraySize(xAdjust) == ArraySize(yAdjust)); - - if (gc->state.vData.colorType == GR_FLOAT) { - - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - AA_TRI_VP_SETFS(e, oow); - } - } - else { - for(v = 0; v < ArraySize(xAdjust); v++) { - TRI_SETF(ptX + xAdjust[v]); - TRI_SETF(ptY + yAdjust[v]); - AA_TRI_VP_SETFS(e, oow); - } - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - - gc->state.cull_mode = cullSave; - -#undef FN_NAME -} /* _grAADrawPoints */ - - -/*------------------------------------------------------------------- - Function: _grAADrawLineStrip - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias strip line - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawLineStrip" -#if 1 - /* - * the aa line strip routine is similar to grAADrawLine routine - * except the data set up is from the pointer array and - * its data layout - */ - GR_DCL_GC; - float adx, ady; /* |dX| and |dY| */ - float **lPtrs = (float **) pointers; - float *v1, *v2; - float v1a, v2a; - FxU32 ia, vNum = 0; - FxU32 vsize; - FxU32 sCount; - FxI32 stride = mode; - - GDBG_INFO(95,"_grAADrawLineStrip(count = %d, pointers = 0x%x)\n", - count, pointers); - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = 0.0f; - v2a = 0.0f; - } - else - ia = gc->state.vData.pargbInfo.offset; - - GR_FLUSH_STATE(); - - if (stride == 0) - stride = gc->state.vData.vStride; - if (ltype == GR_LINES) - sCount = count >> 1; /* line list */ - else - sCount = count-1; /* strip line */ - - vsize = 6 * gc->state.vData.vSize; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (sCount--) { - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - - /* draw from low Y to high Y */ - if (FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) < FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)) { - float* tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - adx = FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - FARRAY(v1, GR_VERTEX_X_OFFSET << 2); - ady = FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - FARRAY(v1, GR_VERTEX_Y_OFFSET << 2); - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - - if (gc->state.vData.colorType != GR_FLOAT) { - *((FxU32 *)&v1a)=*((FxU32 *)((int)v1 + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)v2 + ia))&0x00ffffff; - } - - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupStrip, 6, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - - if (adx >= ady) { /* X major line */ - FxU32 i, dataElem; - - /* point 1 (b) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 2 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 3 (v2) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v2, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 4 (v1) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v1, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 5 (f) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 6 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - } else { /* Y major line */ - FxU32 i, dataElem; - - /* point 1 (b) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 2 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 3 (v2) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v2, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 4 (v1) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(v1, i)); - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 5 (f) = (v2)*/ - TRI_SETF(FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v2, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v2a); } else { TRI_SETF(FARRAY(v2, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - /* point 6 (a) = (v1)*/ - TRI_SETF(FARRAY(v1, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - TRI_SETF(FARRAY(v1, GR_VERTEX_Y_OFFSET << 2)); - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { TRI_SETF(v1a); } else { TRI_SETF(FARRAY(v1, i)); } - dataElem++; i = gc->tsuDataList[dataElem]; - } - - } - TRI_END; - GR_CHECK_SIZE(); - } - } - else { - float oowa, oowb, owa, owb, tmp1, tmp2, fax, fay, fbx, fby; - - if (ltype == GR_LINE_STRIP) { - v1 = (float *)pointers; - if (mode) { - v1 = *(float **)v1; - } - oowb = 1.0f / FARRAY(v1, gc->state.vData.wInfo.offset); - } - while (sCount--) { - if (ltype == GR_LINES) { - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - owa = oowa = 1.0f / FARRAY(v1, gc->state.vData.wInfo.offset); - owb = oowb = 1.0f / FARRAY(v2, gc->state.vData.wInfo.offset); - } - else { - owa = oowa = oowb; - v1 = (float *)pointers; - v2 = (float *)pointers + 1; - if (mode) { - v1 = *(float **)v1; - v2 = *(float **)v2; - } - (float *)pointers += stride; - owb = oowb = 1.0f / FARRAY(v2, gc->state.vData.wInfo.offset); - } - - fay = tmp1 = FARRAY(v1, GR_VERTEX_Y_OFFSET << 2) - *oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fby = tmp2 = FARRAY(v2, GR_VERTEX_Y_OFFSET << 2) - *oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* draw from low Y to high Y */ - if (tmp2 < tmp1) { - float* tv = v1; v1 = v2; v2 = tv; - owa = oowb; owb = oowa; - fay = tmp2; - fby = tmp1; - } - fax = FARRAY(v1, GR_VERTEX_X_OFFSET << 2) - *owa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fbx = FARRAY(v2, GR_VERTEX_X_OFFSET << 2) - *owb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - - /* compute deltas and absolute deltas */ - adx = fbx - fax; - ady = fby - fay; - if (adx < 0) - adx = -adx; - if (ady < 0) - ady = -ady; - /* - if (gc->state.vData.colorType != GR_FLOAT) { - *((FxU32 *)&v1a)=*((FxU32 *)((int)v1 + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)v2 + ia))&0x00ffffff; - } - */ - - GR_SET_EXPECTED_SIZE(vsize, 1); - TRI_STRIP_BEGIN(kSetupStrip, 6, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - - if (adx >= ady) { /* X major line */ - - /* point 1 (b) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby - _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v2, owb); - - /* point 2 (a) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay - _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v1, owa); - - /* point 3 (v2) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby); - TRI_VP_SETFS(v2, owb); - - /* point 4 (v1) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay); - TRI_VP_SETFS(v1, owa); - - /* point 5 (f) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby + _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v2, owb); - - /* point 6 (a) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay + _GlideRoot.pool.f1); - AA_TRI_VP_SETFS(v1, owa); - - } else { /* Y major line */ - - /* point 1 (b) = (v2)*/ - TRI_SETF(fbx + _GlideRoot.pool.f1); - TRI_SETF(fby); - AA_TRI_VP_SETFS(v2, owb); - - /* point 2 (a) = (v1)*/ - TRI_SETF(fax + _GlideRoot.pool.f1); - TRI_SETF(fay); - AA_TRI_VP_SETFS(v1, owa); - - /* point 3 (v2) = (v2)*/ - TRI_SETF(fbx); - TRI_SETF(fby); - TRI_VP_SETFS(v2, owb); - - /* point 4 (v1) = (v1)*/ - TRI_SETF(fax); - TRI_SETF(fay); - TRI_VP_SETFS(v1, owa); - - /* point 5 (f) = (v2)*/ - TRI_SETF(fbx - _GlideRoot.pool.f1); - TRI_SETF(fby); - AA_TRI_VP_SETFS(v2, owb); - - /* point 6 (a) = (v1)*/ - TRI_SETF(fax - _GlideRoot.pool.f1); - TRI_SETF(fay); - AA_TRI_VP_SETFS(v1, owa); - } - TRI_END; - GR_CHECK_SIZE(); - } - } -#endif - -#undef FN_NAME -} /* _grAADrawLineStrip */ - -/*------------------------------------------------------------------- - Function: aaDrawArrayEdgeSense - Date: 13-Oct-97 - Implementor(s): atai - Description: - Pass the line a, b. Use c to calculate edge sense. - Create new vertices from a, b. - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -aaDrawArrayEdgeSense(float *a, float *b, float *c) -{ -#define FN_NAME "aaDrawArrayEdgeSense" - GR_DCL_GC; - - float dx, dy, v2x, v2y; - float *fa, *fb, v1a, v2a; - FxU32 ia; - aaEdgeSense sense; - - if (FARRAY(a, GR_VERTEX_Y_OFFSET << 2) >= FARRAY(b, GR_VERTEX_Y_OFFSET << 2)) { - fa = b; fb = a; - } - else { - fa = a; fb = b; - } - dx = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(fb, GR_VERTEX_X_OFFSET << 2); - dy = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(fb, GR_VERTEX_Y_OFFSET << 2); - - if (dx == 0.f) { - sense = (FARRAY(c, GR_VERTEX_X_OFFSET << 2) > FARRAY(fa, GR_VERTEX_X_OFFSET << 2)) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - else if (dy == 0.0f) { - sense = (FARRAY(c, GR_VERTEX_Y_OFFSET << 2) > FARRAY(fa, GR_VERTEX_Y_OFFSET << 2)) ? aaEdgeSenseBottom : aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcay = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - dcbx = FARRAY(fb, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcby = FARRAY(fb, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - /* v1(a), v2(b), a, b */ - GR_SET_EXPECTED_SIZE(gc->state.vData.vSize << 2, 1); - TRI_STRIP_BEGIN(kSetupStrip, 4, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - switch (sense) { - case aaEdgeSenseTop: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.f1; - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2); - break; - - case aaEdgeSenseBottom: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1); - v2x = FARRAY(b, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.f1; - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - v2y = FARRAY(b, GR_VERTEX_Y_OFFSET << 2); - break; - } - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = v2a = 0.f; - } - else { - ia = gc->state.vData.pargbInfo.offset; - *((FxU32 *)&v1a)=*((FxU32 *)((int)a + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)b + ia))&0x00ffffff; - } - - { - FxU32 i, dataElem; - dataElem = 0; - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(v1a); - } - else { - TRI_SETF(FARRAY(a, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - TRI_SETF(v2x); - dataElem = 0; - TRI_SETF(v2y); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - if (i == ia) { - TRI_SETF(v2a); - } - else { - TRI_SETF(FARRAY(b, i)); - } - dataElem++; - i = gc->tsuDataList[dataElem]; - } - dataElem = 0; - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - dataElem = 0; - TRI_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} /* aaCalcEdgeSense */ - -/*------------------------------------------------------------------- - Function: _grAADrawTriangles - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw anti-alias triangles - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawTriangles" - - GR_DCL_GC; - - float **lPtr = (float **)pointers; - FxI32 tCount = 3; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - GDBG_INFO(96, "_grAADrawTriangles (count = %d, pointers = 0x%x)\n", - count, pointers); - - if (ttype == GR_TRIANGLES) - _grDrawTriangles(mode, count, pointers); - - fbzModeOld = gc->state.fbi_config.fbzMode; - gc->state.fbi_config.fbzMode &= ~(SST_ZAWRMASK); - /* gc->state.invalid |= fbzModeBIT; */ - GR_FLUSH_STATE(); - - if (stride == 0) - stride = gc->state.vData.vStride; - - /* backfaced or zero area */ - while (tCount <= count) { - float *a, *b, *c; - - GR_BEGIN_NOFIFOCHECK("_grAADrawTri",96); - - a = pointers; - b = (float *)pointers + 1; - c = (float *)pointers + 2; - if (mode) { - a = *(float **)a; - b = *(float **)b; - c = *(float **)c; - } - (float *)pointers += stride*3; - - /* move culling test to here */ - { - float *fa = a; - float *fb = b; - float *fc = c; - float dxAB, dxBC, dyAB, dyBC; - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - { - int ay = *(int *)&a[GR_VERTEX_Y_OFFSET]; - int by = *(int *)&b[GR_VERTEX_Y_OFFSET]; - int cy = *(int *)&c[GR_VERTEX_Y_OFFSET]; - int culltest = gc->state.cull_mode; - - if (ay < 0) ay ^= 0x7FFFFFFF; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = a; - fb = c; - fc = b; - culltest ^= 1; - } else { /* cab */ - fa = c; - fb = a; - fc = b; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = b; - fb = a; - fc = c; - culltest ^= 1; - } else { /* bca */ - fa = b; - fb = c; - fc = a; - } - } else { /* cba */ - fa = c; - fb = b; - fc = a; - culltest ^= 1; - } - } - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* Stash the area in the float pool for easy access */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - -#define FloatVal(__f) (((__f) < 786432.875) ? (__f) : ((__f) - 786432.875)) - { - const FxI32 j = *(FxI32*)&_GlideRoot.pool.ftemp1; - - /* Zero-area triangles are BAD!! */ - if ((j & 0x7FFFFFFF) == 0) { - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && - ((j ^ (culltest << 31)) >= 0)) { - - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - } - } - } /* end culling test */ - - aaDrawArrayEdgeSense(a, b, c); - - aaDrawArrayEdgeSense(b, c, a); - - aaDrawArrayEdgeSense(c, a, b); - - done: - lPtr += 3; - tCount+=3; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAADrawTriangles */ - - -/*------------------------------------------------------------------- - Function: aaVpDrawArrayEdgeSense - Date: 11-Dec-97 - Implementor(s): atai - Description: - Pass the line a, b. Use c to calculate edge sense. (clip space) - Create new vertices from a, b. - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -aaVpDrawArrayEdgeSense(float *a, float *b, float *c, float oowa, float oowb) -{ -#define FN_NAME "aaVpDrawArrayEdgeSense" - GR_DCL_GC; - - float dx, dy, v2x, v2y; - float *fa, *fb, v1a, v2a; - float fax, fay, fbx, fby; - FxU32 ia; - aaEdgeSense sense; - - if (FARRAY(a, GR_VERTEX_Y_OFFSET << 2) >= FARRAY(b, GR_VERTEX_Y_OFFSET << 2)) { - fa = b; fb = a; - } - else { - fa = a; fb = b; - } - dx = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(fb, GR_VERTEX_X_OFFSET << 2); - dy = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(fb, GR_VERTEX_Y_OFFSET << 2); - - if (dx == 0.f) { - sense = (FARRAY(c, GR_VERTEX_X_OFFSET << 2) > FARRAY(fa, GR_VERTEX_X_OFFSET << 2)) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - else if (dy == 0.0f) { - sense = (FARRAY(c, GR_VERTEX_Y_OFFSET << 2) > FARRAY(fa, GR_VERTEX_Y_OFFSET << 2)) ? aaEdgeSenseBottom : aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = FARRAY(fa, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcay = FARRAY(fa, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - dcbx = FARRAY(fb, GR_VERTEX_X_OFFSET << 2) - FARRAY(c, GR_VERTEX_X_OFFSET << 2); - dcby = FARRAY(fb, GR_VERTEX_Y_OFFSET << 2) - FARRAY(c, GR_VERTEX_Y_OFFSET << 2); - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0.0f) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0.0f) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - /* v1(a), v2(b), a, b */ - GR_SET_EXPECTED_SIZE(gc->state.vData.vSize << 2, 1); - TRI_STRIP_BEGIN(kSetupStrip, 4, gc->state.vData.vSize, SSTCP_PKT3_BDDDDD); - fax = FARRAY(a, GR_VERTEX_X_OFFSET << 2)*oowa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fay = FARRAY(a, GR_VERTEX_Y_OFFSET << 2)*oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fbx = FARRAY(b, GR_VERTEX_X_OFFSET << 2)*oowb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fby = FARRAY(b, GR_VERTEX_Y_OFFSET << 2)*oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - switch (sense) { - case aaEdgeSenseTop: - TRI_SETF(fax); - v2x = fbx; - TRI_SETF(fay + _GlideRoot.pool.f1); - v2y = fby + _GlideRoot.pool.f1; - break; - - case aaEdgeSenseLeft: - TRI_SETF(fax - _GlideRoot.pool.f1); - v2x = fbx - _GlideRoot.pool.f1; - TRI_SETF(fay); - v2y = fby; - break; - - case aaEdgeSenseBottom: - TRI_SETF(fax); - v2x = fbx; - TRI_SETF(fay - _GlideRoot.pool.f1); - v2y = fby - _GlideRoot.pool.f1; - break; - - case aaEdgeSenseRight: - TRI_SETF(fax + _GlideRoot.pool.f1); - v2x = fbx + _GlideRoot.pool.f1; - TRI_SETF(fay); - v2y = fby; - break; - } - - if (gc->state.vData.colorType == GR_FLOAT) { - ia = gc->state.vData.aInfo.offset; - v1a = v2a = 0.f; - } - else { - ia = gc->state.vData.pargbInfo.offset; - *((FxU32 *)&v1a)=*((FxU32 *)((int)a + ia))&0x00ffffff; - *((FxU32 *)&v2a)=*((FxU32 *)((int)b + ia))&0x00ffffff; - } - - { - - AA_TRI_VP_SETFS(a,oowa); - - TRI_SETF(v2x); - TRI_SETF(v2y); - - AA_TRI_VP_SETFS(b,oowb); - - TRI_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - TRI_VP_SETFS(a,oowa); - - TRI_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - TRI_VP_SETFS(b,oowb); - - } - TRI_END; - GR_CHECK_SIZE(); -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: _grAAVpDrawTriangles - Date: 11-Dec-97 - Implementor(s): atai - Description: - Draw anti-alias triangles (clip coords) - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAAVpDrawTriangles(FxI32 mode, FxI32 ttype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAAVpDrawTriangles" - - GR_DCL_GC; - - float **lPtr = (float **)pointers; - FxI32 tCount = 3; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - GDBG_INFO(96, "_grAADrawTriangles (count = %d, pointers = 0x%x)\n", - count, pointers); - - if (ttype == GR_TRIANGLES) - _grDrawTriangles(mode, count, pointers); - - fbzModeOld = gc->state.fbi_config.fbzMode; - gc->state.fbi_config.fbzMode &= ~(SST_ZAWRMASK); - /* gc->state.invalid |= fbzModeBIT; */ - GR_FLUSH_STATE(); - - if (stride == 0) - stride = gc->state.vData.vStride; - - /* backfaced or zero area */ - while (tCount <= count) { - float *a, *b, *c; - float oowa, oowb, oowc; - - GR_BEGIN_NOFIFOCHECK("_grAADrawTri",96); - - a = pointers; - b = (float *)pointers + 1; - c = (float *)pointers + 2; - if (mode) { - a = *(float **)a; - b = *(float **)b; - c = *(float **)c; - } - (float *)pointers += stride*3; - oowa = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - oowc = 1.0f / FARRAY(c, gc->state.vData.wInfo.offset); - - - /* move culling test to here */ - { - float *fa = a; - float *fb = b; - float *fc = c; - float dxAB, dxBC, dyAB, dyBC; - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - { - float fay = a[GR_VERTEX_Y_OFFSET]*oowa*gc->state.Viewport.hheight*gc->state.Viewport.oy; - float fby = b[GR_VERTEX_Y_OFFSET]*oowb*gc->state.Viewport.hheight*gc->state.Viewport.oy; - float fcy = c[GR_VERTEX_Y_OFFSET]*oowc*gc->state.Viewport.hheight*gc->state.Viewport.oy; - int ay = *(int *)&fay; - int by = *(int *)&fby; - int cy = *(int *)ф - int culltest = gc->state.cull_mode; - - if (ay < 0) ay ^= 0x7FFFFFFF; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = a; - fb = c; - fc = b; - - culltest ^= 1; - } else { /* cab */ - fa = c; - fb = a; - fc = b; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = b; - fb = a; - fc = c; - culltest ^= 1; - } else { /* bca */ - fa = b; - fb = c; - fc = a; - } - } else { /* cba */ - fa = c; - fb = b; - fc = a; - culltest ^= 1; - } - } - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* Stash the area in the float pool for easy access */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - -#define FloatVal(__f) (((__f) < 786432.875) ? (__f) : ((__f) - 786432.875)) - { - const FxI32 j = *(FxI32*)&_GlideRoot.pool.ftemp1; - - /* Zero-area triangles are BAD!! */ - if ((j & 0x7FFFFFFF) == 0) { - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && - ((j ^ (culltest << 31)) >= 0)) { - - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[GR_VERTEX_X_OFFSET]), FloatVal(fa[GR_VERTEX_Y_OFFSET]), - FloatVal(fb[GR_VERTEX_X_OFFSET]), FloatVal(fb[GR_VERTEX_Y_OFFSET]), - FloatVal(fc[GR_VERTEX_X_OFFSET]), FloatVal(fc[GR_VERTEX_Y_OFFSET]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - goto done; - } - } - } - } /* end culling test */ - - aaVpDrawArrayEdgeSense(a, b, c, oowa, oowb); - - aaVpDrawArrayEdgeSense(b, c, a, oowb, oowc); - - aaVpDrawArrayEdgeSense(c, a, b, oowc, oowa); - - done: - lPtr += 3; - tCount+=3; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAAVpDrawTriangles */ - -#endif /* GLIDE3 */ - diff --git a/glide2x/h3/glide/src/gbanner.c b/glide2x/h3/glide/src/gbanner.c deleted file mode 100644 index d9ff64b..0000000 --- a/glide2x/h3/glide/src/gbanner.c +++ /dev/null @@ -1,145 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 19 2/19/99 5:54p Peter -** new splash screen - * - * 17 1/05/98 6:06p Atai - * glide extension stuff - * - * 16 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 15 11/18/97 4:36p Peter - * make thing more translucent - * - * 14 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 13 7/26/97 3:04p Peter - * gratuitous plug is translucent - * - * 12 7/08/97 2:48p Peter - * shameless plug just uses lfb routines - * - * 11 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 10 5/21/97 6:05a Peter - * - * 9 5/02/97 2:08p Pgj - * screen_width/height now FxU32 - * - * 8 3/16/97 2:24a Jdt - * Fixed bug. Didn't initialize info. - * - * 7 3/12/97 11:51p Jdt - * Watcom warning. - * - * 6 3/12/97 4:20p Jdt - * Fixed for VG96 and optimized SST-1 - * - * 5 2/26/97 11:55a Jdt - * Updated banner for new lfb api - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -void -_grShamelessPlug(void) -{ - GR_BEGIN_NOFIFOCHECK("_grShamelessPlug", 80); - GDBG_INFO_MORE(gc->myLevel, "()\n"); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->pluginInfo.plugProc != NULL) { - FxU32 - plugWidth, plugHeight, - plugStride; - GrLfbWriteMode_t - plugFormat; - const void* - plugData = (*gc->pluginInfo.plugProc)(&plugWidth, &plugHeight, - &plugStride, - &plugFormat); - - if (plugData != NULL) { -#ifdef GLIDE_PLUG - GrState state; - - grGlideGetState(&state); - grDisableAllEffects(); - - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - grAlphaBlendFunction(GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO); - grClipWindow(0, 0, - gc->state.screen_width - 1, - gc->state.screen_height - 1); - grDepthMask(FXFALSE); - grDepthBufferFunction(GR_CMP_ALWAYS); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - - grChromakeyValue(0x0000); - - grChromakeyMode(GR_CHROMAKEY_ENABLE); - grLfbConstantAlpha((FxU8) 0x40); - grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - - _grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER, - gc->state.screen_width - (plugWidth + 1), - gc->state.screen_height - (plugHeight + 1), - GR_LFBWRITEMODE_565, - plugWidth, plugHeight, - plugStride, - plugData); - - grGlideSetState(&state); -#endif /* GLIDE_PLUG */ - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_END(); -} /* _grShamelessPlug */ diff --git a/glide2x/h3/glide/src/gdraw.c b/glide2x/h3/glide/src/gdraw.c deleted file mode 100644 index 917e413..0000000 --- a/glide2x/h3/glide/src/gdraw.c +++ /dev/null @@ -1,1819 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - ** Revision 1.1.1.1 1999/12/07 21:49:27 joseph - ** Initial checkin into SourceForge. - ** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 96 6/02/98 8:03p Peter -** Mmmmm.... points -** -** 95 6/01/98 6:44p Peter -** snapped/unsnapped points -** -** 94 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes - * - * 92 1/15/98 2:46p Atai - * fixed grDrawPoint and grDrawLine in aa mode - * - * 90 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 89 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 85 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 83 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 82 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 81 11/19/97 4:33p Atai - * make vSize debug variable - * - * 80 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 79 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 78 11/16/97 2:20p Peter - * cleanup - * - * 77 11/15/97 7:43p Peter - * more comdex silliness - * - ** - */ -#include - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if GLIDE_DISPATCH_SETUP -#include "fxinline.h" -#endif - -#define SST_XY_HALF (1 << (SST_XY_FRACBITS - 1)) -#define SST_XY_ONE (1 << SST_XY_FRACBITS) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ - -#ifdef GLIDE3 -GR_ENTRY(grDrawPoint, void, (void *p)) -#else -GR_ENTRY(grDrawPoint, void, (const GrVertex *p)) -#endif -{ -#define FN_NAME "grDrawPoint" -#ifdef GLIDE3 - GR_DCL_GC; - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&p); - else - _grDrawPoints(GR_VTX_PTR_ARRAY, 1, (void *)&p); -#else - FxU32 x, y; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X) : (%f %f)\n", p, p->x, p->y); - - GR_FLUSH_STATE(); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (22UL - kNumMantissaBits))); - } - - /* draw a little triangle, with the lower left corner at pixel center. */ -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 2) + /* Size of Initial coordinate packet */ - _GlideRoot.curVertexSize, /* The full coordinate vertex */ - 2); /* We do two split packets */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - { - /* Lower right corner */ - TRI_SET(x); - TRI_SET(y); - - /* Upper right corner. */ - y -= (0x01UL << (21UL - kNumMantissaBits)); - TRI_SET(x); - TRI_SET(y); - - /* Upper Left corner */ - x -= (0x01UL << (21UL - kNumMantissaBits)); - } - TRI_END; - - /* Packet w/ actual point coordinate and parameter data */ - TRI_PACKET_BEGIN(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, _GlideRoot.curVertexSize, SSTCP_PKT3_DDDDDD); - { - TRI_SET(x); - TRI_SET(y); - - /* Vertex parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(p, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(p, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(p, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - - _GlideRoot.stats.pointsDrawn++; -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - /* GMT: gross overestimate of fifo requirements */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, _GlideRoot.curTriSize >> 2); - { - const struct dataList_s* dlp = gc->regDataList; - int i; - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET(BROADCAST_ID, hw, vA.x, x); - GR_SET(BROADCAST_ID, hw, vA.y, y); - - x += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, vB.x, x); - GR_SET(BROADCAST_ID, hw, vB.y, y); - - y += (0x01UL << (22UL - kNumMantissaBits)); - GR_SET(BROADCAST_ID, hw, vC.x, x); - GR_SET(BROADCAST_ID, hw, vC.y, y); - - i = _GlideRoot.stats.pointsDrawn++; - _GlideRoot.stats.pointsDrawn = ++i; - - dlp = gc->regDataList; - i = dlp->i; - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - while (i) { - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), FARRAY(p,i)); - dlp++; - i = dlp->i; - } - - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -#endif -#undef FN_NAME -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- - ** grDrawLine - ** - ** NOTE: 1. this will not fill the last pixel in line because - ** B2 or C is on the right edge and the right edge is not - ** drawn. - ** (0,0) - ** - ** A(x1,y1-0.5)+ - ** | \ - ** | \ \ - ** (x1,y1)* \ - ** | * \ - ** | *\ \ - ** B1(x1,y1+0.5)+ * \ - ** \ \ * +B2(x2,y2-0.5) - ** \ * | - ** \ \ * | - ** \ \ + (x2,y2) - ** \ | - ** \ | - ** +C(x2,y2+0.5) - */ - -#ifdef GLIDE3 -GR_ENTRY(grDrawLine, void, (void *a, void *b)) -#else -GR_ENTRY(grDrawLine, void, (const GrVertex *a, const GrVertex *b)) -#endif -{ -#define FN_NAME "grDrawLine" -#ifdef GLIDE3 - GR_DCL_GC; - float *vlist[2]; - vlist[0] = (float *)a; - vlist[1] = (float *)b; - if (gc->state.grEnableArgs.primitive_smooth_mode) - _grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, 2, vlist); - else - _grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, 2, vlist); -#else - int i, j; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("grDrawLine", 91); - GDBG_INFO_MORE(gc->myLevel, "A: (%f %f) B: (%f %f)\n", - a->x, a->y, b->x, b->y); - - - GR_FLUSH_STATE(); - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if (i < 0) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - /* One packet w/ 4 vertices */ - GR_SET_EXPECTED_SIZE((_GlideRoot.curVertexSize << 2), 1); - { - const float* const fa = (float*)a; - const float* const fb = (float*)b; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - TRI_PACKET_BEGIN(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, _GlideRoot.curVertexSize, SSTCP_PKT3_BDDDDD); - { - float fBias = - _GlideRoot.pool.fHalf; - int vIndex; - - /* x macjor */ - if (j >= i) { - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET]); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET]); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET] + fBias); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } else { /* y major */ - for(vIndex = 0; vIndex < 2; vIndex++) { - TRI_SETF(fb[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fb[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fb, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fb, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fb, *dataList)); - dataList++; - } - } - - TRI_SETF(fa[GR_VERTEX_X_OFFSET] + fBias); - TRI_SETF(fa[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0) { - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_R_OFFSET << 2)), R)); - - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(fa, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - } - - TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(fa, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(fa, *dataList)); - dataList++; - } - } - - fBias *= -1.0f; - } - } - } - TRI_END; - } - GR_CHECK_SIZE(); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(12 + _GlideRoot.curTriSize, (_GlideRoot.curTriSize + 12) >> 2); - { - float m, dp; - struct dataList_s* dlp; - - /* - ** X major line - */ - if (j >= i) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.x, a->x); - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x, dp); - GR_SETF(BROADCAST_ID, hw, FvC.x, dp); - - GR_SETF(BROADCAST_ID, hw, FvA.y, a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y, dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.y, dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), dp * m); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - } - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,_GlideRoot.pool.ftemp1); - - GR_SETF(BROADCAST_ID, hw, FvB.x,a->x); - GR_SETF(BROADCAST_ID, hw, FvB.y,a->y + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FtriangleCMD,-_GlideRoot.pool.ftemp1); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->regDataList; - GR_SETF(BROADCAST_ID, hw, FvA.y,a->y); - dp = b->y; - GR_SETF(BROADCAST_ID, hw, FvB.y,dp); - GR_SETF(BROADCAST_ID, hw, FvC.y,dp); - - GR_SETF(BROADCAST_ID, hw, FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(BROADCAST_ID, hw, FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(BROADCAST_ID, hw, FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - dp = FARRAY(a,i); - GR_SETF_INDEX(BROADCAST_ID, hw, ((FxU32*)dlp->addr - (FxU32*)hw), dp); - - dp = FARRAY(b,i) - dp; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDX_OFFSET >> 2] - (FxU32*)hw), _GlideRoot.pool.f0); - - dlp++; - i = dlp->i; - GR_SETF_INDEX(BROADCAST_ID, hw, - ((FxU32*)&dlp->addr[DPDY_OFFSET >> 2] - (FxU32*)hw), dp * m); - } - GR_SET(BROADCAST_ID, hw, triangleCMD, 0xFFFFFFFF); - - GR_SETF(BROADCAST_ID, hw, FvB.x, a->x + _GlideRoot.pool.fHalf); - GR_SETF(BROADCAST_ID, hw, FvB.y, a->y); - GR_SET(BROADCAST_ID, hw, triangleCMD, 1); - } - } - GR_CHECK_SIZE(); -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - - GR_END(); -#endif -#undef FN_NAME -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- - ** grDrawTriangle - */ - -#ifdef GLIDE3 -GR_ENTRY(grDrawTriangle, void, (void *a, void *b, void *c)) -#else -GR_ENTRY(grDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c)) -#endif -{ -#define FN_NAME grDrawTriangle -#if defined(GLIDE_USE_C_TRISETUP) || defined(__WATCOMC__) || defined(GLIDE_DEBUG) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Silly warning killer */ - if (0) goto all_done; - -#ifdef GLIDE_DEBUG -#if 0 - if (0) { /* GMT: only use this if needed */ - FxU32 statBits; /* bits we care about in status register */ - FxU32 status; - - status = GR_GET(hw->status); - if ((statBits = status & SST_FIFOLEVEL) < _GlideRoot.stats.minPciFIFOFree) - _GlideRoot.stats.minPciFIFOFree = statBits; - - statBits = (status >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff; - if (statBits < _GlideRoot.stats.minMemFIFOFree) - _GlideRoot.stats.minMemFIFOFree = statBits; - } -#endif - - if (_GlideRoot.environment.triBoundsCheck) { -#ifndef GLIDE3 - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF("Triangle out of bounds:\n"); - GDBG_PRINTF("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y); - GDBG_PRINTF("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y); - GDBG_PRINTF("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y); - GDBG_PRINTF("Culling triangle based on these bogus values.\n"); - goto all_done; - } -#endif - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ -#if GLIDE_DEBUG && !GLIDE_USE_C_TRISETUP - /* HackAlert: Nuke the fifo ptr checking stuff here if we're just - * debugging teh asm tri code. - */ - if (TRISETUP(a, b, c) != 0) { - gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; - gc->checkCounter = 0; - } -#else - TRISETUP(a, b, c); -#endif - -all_done: - GR_END(); -#else -#if defined(__MSC__) - { - extern struct _GlideRoot_s _GlideRoot; - - _asm { - mov eax, [_GlideRoot + kCurGCOffset]; - mov eax, [eax + kTriProcOffset]; - jmp eax; - } - } -#endif -#if defined( __linux__ ) - - /* Here's the basic strategy for this dispatch code: - * We jump to _GlideRoot.curGC->archDispatchProcs.triSetupProc - * which contains code that looks like a function, we leave the - * paramters passed to grDrawTriangle on the stack and the dispatched - * function picks them up. However we have to compensate for - * the compiler pushing anything on the stack. The following describes - * why and when we have to pop. - * - * BIG_OPT: gcc pushes a frame pointer to maintain things, BIG_OPT - * turns on -fomit-frame-pointer so we don't have to pop it. - * - * PIC: When using position independant code gcc stores eip in ebx - * so it saves ebx from the previous call automatically. - * Therefore, once we have the jump address we have to pop ebx - * to restore the stack. - * - * The syntax is further complicated by the fact that gcc can (and will) - * emit code between the asm statements, so they all need to be in a single - * asm statement, wrapped with #ifdef's. This means we have fun with - * deciding if we need to list trashed registers and when we need commas - * between them. - */ - - asm ( -#if defined(PIC) - "popl %%ebx\n\t" -#endif -#if !defined(BIG_OPT) - "popl %%ebp\n\t" -#endif - "jmp *%0" - : /* no outputs */ - :"m" (_GlideRoot.curGC->archDispatchProcs.triSetupProc) -#if defined (PIC) || !defined (BIG_OPT) - : -#endif -#if defined (PIC) - "ebx" -#endif -#if defined (PIC) && !defined (BIG_OPT) - , -#endif -#if !defined(BIG_OPT) - "ebp" -#endif - ); -#endif -#endif -#undef FN_NAME -} /* grDrawTriangle */ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ -GR_ENTRY(grDrawPlanarPolygon, - void, - (int nVerts, const int iList[], const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygon(nVerts, iList, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[iList[0]]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[iList[i]], &vList[iList[i+1]]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[iList[i]], &vList[iList[i+1]]); - } - } -all_done: -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPlanarPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - grDrawPolygonVertexList(nVerts, vList); -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int n,i = nVerts-2; - const GrVertex *firstv = &vList[0]; - - for (i = 1; i < nVerts - 1; i++) { - n = TRISETUP(firstv, &vList[i], &vList[i+1]); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for (i = i+1; i < nVerts - 1; i++) { - _trisetup_nogradients(firstv, &vList[i], &vList[i+1]); - } - -all_done: - ; - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - - GR_END(); -} /* grDrawPlanarPolygonVertexList */ - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP -#define kMaxPacket3Vertex 0x0FUL - -/* Packet 3 requires at least one vertex, if there isn't enough room - * in the fifo then force a wrap now and write up to the max. - */ -#define FIFO_VERT(__vertSize, __polyVerts) \ - ((gc->cmdTransportInfo.fifoRoom < (FxI32)(sizeof(FxU32) + (__vertSize))) \ - ? (__polyVerts) \ - : MIN((__polyVerts), ((gc->cmdTransportInfo.fifoRoom - sizeof(FxU32)) / (__vertSize)))) - -#define FIFO_MAX_VERT(__polyVerts) MIN(kMaxPacket3Vertex, (__polyVerts)) -#endif /* GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygon - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygon, void, (int nVerts, const int iList[], const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygon" - GR_BEGIN_NOFIFOCHECK("grDrawPolygon",93); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,0x%x)\n",nVerts,iList,vList); - GR_CHECK_F(myName, !iList || !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const int* vertexIndexP = iList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_ASSERT((packSize % vertexParamOffset) == 0); - GR_ASSERT(packSize >= vertexParamOffset); - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, - packSize / vertexParamOffset, vertexParamOffset, - packType); - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)(vList + *vertexIndexP++); - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* Are there more vertices that need to be sent for this - * polygon? Reset the parameters and do the rest of them. - */ - if (vertexIndexP < iList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", nVerts, packVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[iList[0]], &vList[iList[i]], &vList[iList[i+1]]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- - ** grDrawPolygonVertexList - ** - ** Brute force "triangle-fan" implementation of a convex polygon drawer. - */ - -GR_ENTRY(grDrawPolygonVertexList, void, (int nVerts, const GrVertex vList[])) -{ -#define FN_NAME "grDrawPolygonVertexList" - GR_BEGIN_NOFIFOCHECK("grDrawPolygonVertexList", 92); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",nVerts,vList); - GR_CHECK_F(myName, !vList, "NULL pointer passed"); - - GR_FLUSH_STATE(); - - /* Zero length vertex lists are allowed, but we can't send them to - * the hw. - */ - if (nVerts <= 0) goto __exitNoVerts; - -#if GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP - { - const FxU32 vertexParamOffset = _GlideRoot.curVertexSize; - const GrVertex* vertexListP = vList; - FxU32 packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - FxU32 packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - FxU32 packType = SSTCP_PKT3_BDDDDD; - -__doPolyVertexSend: - GR_ASSERT(packVerts > 0); - GR_ASSERT(packVerts <= kMaxPacket3Vertex); - - { - const FxU32 packSize = packVerts * vertexParamOffset; - FxU32 vertexOffset; - - GR_SET_EXPECTED_SIZE(packSize, 1); - TRI_STRIP_BEGIN(kSetupFan, packVerts, vertexParamOffset, packType); - - for(vertexOffset = 0; vertexOffset < packSize; vertexOffset += vertexParamOffset) { - const float* vertex = (const float*)vertexListP++; - - TRI_SETF(vertex[GR_VERTEX_X_OFFSET]); - TRI_SETF(vertex[GR_VERTEX_Y_OFFSET]); - - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_R_OFFSET << 2)), R)); - doColorP = FXTRUE; - dataList++; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vertex, (GR_VERTEX_A_OFFSET << 2)), A); - doColorP = FXTRUE; - dataList++; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vertex, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while (*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vertex, *dataList)); - dataList++; - } - } - } - TRI_END; - GR_CHECK_SIZE(); - } - - /* More verts? */ - if (vertexListP < vList + nVerts) { - /* Reset the # of verts maxing out the send based on the - * space left in the fifo and the max packet size. - */ - nVerts -= packVerts; - packVertMax = FIFO_MAX_VERT(nVerts); /* Max possible verts for this packet */ - packVerts = FIFO_VERT(vertexParamOffset, packVertMax); /* # verts for this packet */ - - /* Packet type to continue strip */ - packType = SSTCP_PKT3_DDDDDD; - - GDBG_INFO(120, "\tSending continueing polygon data (0x%X : 0x%X)\n", packVerts, nVerts); - - goto __doPolyVertexSend; - } - } -#else /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - { - int i; - - for (i = 1; i < nVerts - 1; i++) { - grDrawTriangle(&vList[0], &vList[i], &vList[i+1]); - } - } -#endif /* !(GLIDE_HW_TRI_SETUP && GLIDE_PACKET3_TRI_SETUP) */ - -__exitNoVerts: - GR_END(); -#undef FN_NAME -} /* grDrawPolygonVertexList */ -#endif /* !GLIDE3_ALPHA */ - -/*--------------------------------------------------------------------------- - ** _grColorCombineDelta0Mode - ** - ** GMT: when we are in delta0 mode, color comes from the RGB iterators - ** but the slopes are 0.0. So when we enter delta0 mode we set - ** the iterators up and then we leave them alone during primitive - ** rendering - */ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, (FxBool delta0mode)) -{ -#define FN_NAME "_grColorCombineDelta0Mode" - GR_BEGIN_NOFIFOCHECK("_grColorCombineDelta0Mode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",delta0mode); - - if (delta0mode) { - GR_SET_EXPECTED_SIZE(9 << 2, 9); - { - GR_SETF(BROADCAST_ID, hw, Fr, gc->state.r); - GR_SETF(BROADCAST_ID, hw, Fg, gc->state.g); - GR_SETF(BROADCAST_ID, hw, Fb, gc->state.b); - GR_SET(BROADCAST_ID, hw, drdx, 0); - GR_SET(BROADCAST_ID, hw, drdy, 0); - GR_SET(BROADCAST_ID, hw, dgdx, 0); - GR_SET(BROADCAST_ID, hw, dgdy, 0); - GR_SET(BROADCAST_ID, hw, dbdx, 0); - GR_SET(BROADCAST_ID, hw, dbdy, 0); - } - GR_CHECK_SIZE(); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); -#undef FN_NAME -} /* _grColorCombineDeltaMode */ - -#ifdef GLIDE3 /* glide 3. draw points, and strip line routine */ - -#define DA_BEGIN \ -{ \ - FxU32* packetPtr = gc->cmdTransportInfo.fifoPtr; \ - FxU32 packetVal; - -#define DA_CONT(__setupMode, __params, __nVertex, __vertexSize, __cmd) \ - packetVal = (((__setupMode) << SSTCP_PKT3_SMODE_SHIFT) | /* [27:22] */ \ - (__params) | /* pack[28] params[21:10] */ \ - ((__nVertex) << SSTCP_PKT3_NUMVERTEX_SHIFT) | /* [9:6] */ \ - (__cmd) | /* command [5:3] */ \ - SSTCP_PKT3); /* type [2:0] */ \ - SET(*packetPtr++, packetVal); - -#define DA_SETF(__val) \ - SETF(*packetPtr++, (__val)); \ - GR_INC_SIZE(sizeof(FxFloat)) - -#define DA_END \ - gc->cmdTransportInfo.fifoRoom -= ((FxU32)packetPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \ - gc->cmdTransportInfo.fifoPtr = packetPtr; \ - FIFO_ASSERT(); \ -} - -/*------------------------------------------------------------------- - Function: _grDrawPoints - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw array points - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawPoints(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawPoints" - - /* - * the point routine is similar to grDrawPoint routine - * except the data set up is from the pointer array and - * its data layout - */ - float bias = (float)(3 << 22); - FxI32 stride = mode; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - GR_FLUSH_STATE(); - - /* - * In the sbench example, we observe larger buffer, less fifo - * size updating and less checking make the routine run faster. - * Here we use a point buffer of size 100. We also remove the size - * check outside the buffer loop - */ -#define POINTS_BUFFER 100 - - if (stride == 0) - stride = gc->state.vData.vStride; - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - float *vPtr; - FxI32 k, i; - FxI32 vcount = count >= POINTS_BUFFER ? POINTS_BUFFER : count; - GR_SET_EXPECTED_SIZE(((sizeof(FxU32) << 2) + gc->state.vData.vSize) * vcount, vcount << 1); - - /* begin points routine */ - DA_BEGIN; - - for (k = 0; k < vcount; k++) { - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - - (float *)pointers += stride; - - GDBG_INFO_MORE(gc->myLevel, "(%f %f)\n", FARRAY(vPtr,GR_VERTEX_X_OFFSET << 2), FARRAY(vPtr,GR_VERTEX_Y_OFFSET << 2)); - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but to get the ceiling - * effect everywhere we adjust the bias by a little bit more than 0.5. - */ - { - float fx = FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf; - float fy = FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf; - FxU32 dataElem; - - DA_CONT(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - - fx += bias; - fy += bias; - - /* Convert to 32-bit representation */ - _GlideRoot.pool.ftemp1 = (const float)fx; - _GlideRoot.pool.ftemp2 = (const float)fy; - - /* draw a little triangle, with the lower left corner at pixel center. */ - - /* The approach here is to split the triangle into two packets, one - * that sends just the coordinates of the last two points of the - * triangle w/ no other parameter information, and then the - * centered point w/ all of the parameter information. The first - * packet is has a BDD command, but is incomplete, so nothing - * draws, the next packet has a DDD command so will complete the - * triangle from the first packet sent. - */ - - /* Correct the bias to get rid of the fractional bits */ - - fx = (volatile float)_GlideRoot.pool.ftemp1 - bias; - fy = (volatile float)_GlideRoot.pool.ftemp2 - bias; - - /* Remainder of the coordinates packet */ - DA_SETF(fx); - DA_SETF(fy); - - GR_ASSERT((fx >= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2))) && - (fx <= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) + 1.0f)) && - (fy >= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2))) && - (fy <= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) + 1.0f))); - - fy -= _GlideRoot.pool.fHalf; - DA_SETF(fx); - dataElem = 0; - DA_SETF(fy); - - fx -= _GlideRoot.pool.fHalf; - - /* Packet w/ actual point coordinate and parameter data */ - DA_CONT(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, gc->state.vData.vSize, SSTCP_PKT3_DDDDDD); - - i = gc->tsuDataList[dataElem]; - DA_SETF(fx); - DA_SETF(fy); - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - _GlideRoot.stats.pointsDrawn++; - } - DA_END; - GR_CHECK_SIZE(); - /* end points routine */ - - count -= POINTS_BUFFER; - } - } - else { - /* - * first cut of clip space coordinate code. - */ - - float oow; - - while (count > 0) { - float *vPtr; - FxI32 k; - FxI32 vcount = count >= POINTS_BUFFER ? POINTS_BUFFER : count; - GR_SET_EXPECTED_SIZE(((sizeof(FxU32) << 2) + gc->state.vData.vSize) * vcount, vcount << 1); - - /* begin points routine */ - DA_BEGIN; - - for (k = 0; k < vcount; k++) { - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - - { - float fx = FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth - + gc->state.Viewport.ox + _GlideRoot.pool.fHalf; - float fy = FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight - + gc->state.Viewport.oy + _GlideRoot.pool.fHalf; - DA_CONT(kSetupStrip | kSetupCullDisable, 0x00, - 0x02, sizeof(FxU32) << 1, SSTCP_PKT3_BDDDDD); - fx += bias; - fy += bias; - /* Convert to 32-bit representation */ - _GlideRoot.pool.ftemp1 = (const float)fx; - _GlideRoot.pool.ftemp2 = (const float)fy; - fx = (volatile float)_GlideRoot.pool.ftemp1 - bias; - fy = (volatile float)_GlideRoot.pool.ftemp2 - bias; - /* Remainder of the coordinates packet */ - DA_SETF(fx); - DA_SETF(fy); - GR_ASSERT((fx >= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox)) && - (fx <= floor(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)*oow*gc->state.Viewport.hwidth+gc->state.Viewport.ox + 1.0f)) && - (fy >= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight+gc->state.Viewport.oy)) && - (fy <= floor(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)*oow*gc->state.Viewport.hheight+gc->state.Viewport.oy + 1.0f))); - - fy -= _GlideRoot.pool.fHalf; - DA_SETF(fx); - DA_SETF(fy); - - fx -= _GlideRoot.pool.fHalf; - - /* Packet w/ actual point coordinate and parameter data */ - DA_CONT(kSetupStrip | kSetupCullDisable, gc->cmdTransportInfo.paramMask, - 1, gc->state.vData.vSize, SSTCP_PKT3_DDDDDD); - - DA_SETF(fx); - DA_SETF(fy); - DA_VP_SETFS(vPtr, oow); - } - _GlideRoot.stats.pointsDrawn++; - } - DA_END; - GR_CHECK_SIZE(); - /* end points routine */ - - count -= POINTS_BUFFER; - } - } - -#undef FN_NAME -} /* _grDrawPoints */ - -/*------------------------------------------------------------------- - Function: _grDrawLineStrip - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw strip line - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawLineStrip(FxI32 mode, FxI32 ltype, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawLineStrip" - -#if 1 - /* - * the line routine is similar to grDrawLine routine - * except the data set up is from the pointer array and - * its data layout - */ - int j; - FxI32 sCount; - FxU32 vertexParamOffset; - FxI32 stride = mode; - -#define DX _GlideRoot.pool.ftemp1 -#define ADY _GlideRoot.pool.ftemp2 - - GR_BEGIN_NOFIFOCHECK("_grDrawLineStrip", 91); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - vertexParamOffset = gc->state.vData.vSize; - - GR_FLUSH_STATE(); - -#define LINES_BUFFER 100 - - if (stride == 0) - stride = gc->state.vData.vStride; - if (ltype == GR_LINES) - sCount = count >> 1; /* line list */ - else - sCount = count-1; /* strip line */ - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (sCount > 0) { - FxI32 k, i; - FxI32 vcount = sCount >= LINES_BUFFER ? LINES_BUFFER : sCount; - - GR_SET_EXPECTED_SIZE((gc->state.vData.vSize << 2) * vcount, vcount); - DA_BEGIN; - for (k = 0; k < vcount; k++) { - float *a = (float *)pointers; - float *b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - if (ltype == GR_LINES) - (float *)pointers += stride; - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - FARRAY(a, GR_VERTEX_Y_OFFSET << 2); - i = *(long *)&ADY; - if (i < 0) { - float *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - FARRAY(a, GR_VERTEX_X_OFFSET << 2); - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done; - - /* Draw the triangle pair as a strip of 4 vertices. - * We can skip all of the gradient calculation stuff. - * - * NB: There are two cases, x/y major lines, and each of these - * loops are unrolled to send one set of endpoints of the 'line' - * per iteration since we can use the same bias per iteration. - */ - DA_CONT(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, vertexParamOffset, SSTCP_PKT3_BDDDDD); - { - FxU32 dataElem; - /* x major */ - if (j >= i) { - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2) + _GlideRoot.pool.fHalf); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } else { /* y major */ - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) - _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(b, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(b, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(b, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - - DA_SETF(FARRAY(a, GR_VERTEX_X_OFFSET << 2) + _GlideRoot.pool.fHalf); - dataElem = 0; - DA_SETF(FARRAY(a, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - DA_SETF(FARRAY(a, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - } - _GlideRoot.stats.linesDrawn++; - all_done: - ; - } - DA_END; - GR_CHECK_SIZE(); - sCount -= POINTS_BUFFER; - } - } - else { - - float oowa, oowb, owa, owb, tmp1, tmp2, fax, fay, fbx, fby; - - while (sCount > 0) { - FxI32 k, i; - FxI32 vcount = sCount >= LINES_BUFFER ? LINES_BUFFER : sCount; - float *a,*b; - GR_SET_EXPECTED_SIZE((gc->state.vData.vSize << 2) * vcount, vcount); - DA_BEGIN; - if (ltype == GR_LINE_STRIP) { - a = (float *)pointers; - if (mode) { - a = *(float **)a; - } - oowb = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - } - for (k = 0; k < vcount; k++) { - if (ltype == GR_LINES) { - a = (float *)pointers; - b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - owa = oowa = 1.0f / FARRAY(a, gc->state.vData.wInfo.offset); - owb = oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - (float *)pointers += stride; - } - else { - owa = oowa = oowb; - a = (float *)pointers; - b = (float *)pointers + 1; - if (mode) { - a = *(float **)a; - b = *(float **)b; - } - (float *)pointers += stride; - owb = oowb = 1.0f / FARRAY(b, gc->state.vData.wInfo.offset); - } - fay = tmp1 = FARRAY(a, GR_VERTEX_Y_OFFSET << 2) - *oowa*gc->state.Viewport.hheight+gc->state.Viewport.oy; - fby = tmp2 = FARRAY(b, GR_VERTEX_Y_OFFSET << 2) - *oowb*gc->state.Viewport.hheight+gc->state.Viewport.oy; - - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = tmp2 - tmp1; - i = *(long *)&ADY; - if (i < 0) { - float *tv; - owa = oowb; owb = oowa; - fay = tmp2; - fby = tmp1; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - fax = FARRAY(a, GR_VERTEX_X_OFFSET << 2) - *owa*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - fbx = FARRAY(b, GR_VERTEX_X_OFFSET << 2) - *owb*gc->state.Viewport.hwidth+gc->state.Viewport.ox; - - DX = fbx - fax; - j = *(long *)&DX; - if (j < 0) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* check for zero-length lines */ - if ((j >= i) && (j == 0)) goto all_done_vp; - - DA_CONT(kSetupCullDisable | kSetupStrip, gc->cmdTransportInfo.paramMask, - 0x04UL, vertexParamOffset, SSTCP_PKT3_BDDDDD); - { - /* x major */ - if (j >= i) { - DA_SETF(fbx); - DA_SETF(fby - _GlideRoot.pool.fHalf); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax); - DA_SETF(fay - _GlideRoot.pool.fHalf); - DA_VP_SETFS(a,oowa); - - DA_SETF(fbx); - DA_SETF(fby + _GlideRoot.pool.fHalf); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax); - DA_SETF(fay + _GlideRoot.pool.fHalf); - DA_VP_SETFS(a,oowa); - - } else { /* y major */ - DA_SETF(fbx - _GlideRoot.pool.fHalf); - DA_SETF(fby); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax - _GlideRoot.pool.fHalf); - DA_SETF(fay); - DA_VP_SETFS(a,oowa); - - DA_SETF(fbx + _GlideRoot.pool.fHalf); - DA_SETF(fby); - DA_VP_SETFS(b,oowb); - - DA_SETF(fax + _GlideRoot.pool.fHalf); - DA_SETF(fay); - DA_VP_SETFS(a,oowa); - } - } - _GlideRoot.stats.linesDrawn++; - all_done_vp: - ; - } - DA_END; - GR_CHECK_SIZE(); - sCount -= POINTS_BUFFER; - } - } - -#endif - -#undef FN_NAME -} /* _grDrawLineStrip */ - -/*------------------------------------------------------------------- - Function: _grDrawTriangles - Date: 13-Oct-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - mode - 0 if grDrawVertexArrayLinear - 1 if grDrawVertexArray - count - number of triangles. - pointer - pointer to vertex data (mode = 0) or vertex array (mode = 1) - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawTriangles(FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawTriangles" - - FxI32 -#ifdef GLIDE_DEBUG - vSize, -#endif - k; - FxI32 stride = mode; - float *vPtr; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(count = %d, pointers = 0x%x)\n", - count, pointers); - - GR_FLUSH_STATE(); - -#ifdef GLIDE_DEBUG - GDBG_INFO(110, "%s: vSize = %d\n", FN_NAME, vSize); - - GDBG_INFO(110, "%s: paramMask = 0x%x\n", FN_NAME, gc->cmdTransportInfo.paramMask); -#endif - - if (stride == 0) - stride = gc->state.vData.vStride; - - - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - FxI32 vcount = count >=15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * gc->state.vData.vSize, 1); - TRI_STRIP_BEGIN(kSetupStrip, vcount, gc->state.vData.vSize, SSTCP_PKT3_BDDBDD); - - for (k = 0; k < vcount; k++) { - FxI32 i; - FxU32 dataElem = 0; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - (float *)pointers += stride; - - i = gc->tsuDataList[dataElem]; - - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)); - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)); - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - } - } - else { - /* - * first cut of clip space coordinate code, no optimization. - */ - float oow; - - while (count > 0) { - FxI32 vcount = count >= 15 ? 15 : count; - - GR_SET_EXPECTED_SIZE(vcount * gc->state.vData.vSize, 1); - TRI_STRIP_BEGIN(kSetupStrip, vcount, gc->state.vData.vSize, SSTCP_PKT3_BDDBDD); - - for (k = 0; k < vcount; k++) { - vPtr = pointers; - if (mode) - vPtr = *(float **)pointers; - oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset); - - /* x, y */ - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET <<2) - *oow*gc->state.Viewport.hwidth + gc->state.Viewport.ox); - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET <<2) - *oow*gc->state.Viewport.hheight + gc->state.Viewport.oy); - (float *)pointers += stride; - - TRI_VP_SETFS(vPtr,oow); - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - } - } - -#undef FN_NAME -} /* _grDrawTriangles */ - -#endif /* GLIDE3 */ diff --git a/glide2x/h3/glide/src/gerror.c b/glide2x/h3/glide/src/gerror.c deleted file mode 100644 index 851cbf2..0000000 --- a/glide2x/h3/glide/src/gerror.c +++ /dev/null @@ -1,282 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 35 7/06/98 7:03p Jdt -** Error checking function definition simplified -** -** 34 6/16/98 9:36a Dow -** made error messages more like I want them -** -** 33 3/28/98 11:24a Dow -** itwoç -** -** 29 2/17/98 12:50p Dow -** More informative debug messages. -** -** 28 2/08/98 3:08p Dow -** FIFO Works - * - * 26 12/18/97 2:13p Peter - * cleaned up the error code - * - * 25 12/09/97 12:20p Peter - * mac glide port - * - * 24 12/05/97 4:38p Peter - * sli vs assertions - * - * 23 12/03/97 11:34a Peter - * dos debugging - * - * 22 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 21 11/15/97 8:55p Peter - * Removed OutputDebugString - * - * 20 11/15/97 7:43p Peter - * more comdex silliness - * - * 19 11/12/97 2:27p Peter - * - * 18 11/12/97 11:16a Peter - * cleaned up assertions - * - * 17 11/04/97 5:04p Peter - * cataclysm part deux - * - * 16 11/03/97 4:02p Peter - * cataclysm fix - * - * 15 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 14 10/23/97 5:28p Peter - * sli fifo thing - * - * 13 9/24/97 1:29p Peter - * more assertion spewage - * - * 12 9/05/97 5:29p Peter - * changes for direct hw - * - * 11 5/30/97 5:44p Peter - * Version that does basic triangles/registers w/ command fifo. Does not - * currently download textures correctly. - * - * 10 5/28/97 9:05a Peter - * Merge w/ latest glide changes - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:05a Peter - * - * 7 5/20/97 9:47a Pgj - * Use OutputDebugString for non-fatal errors under windows - * - * 6 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include -#ifdef __DOS__ -# include -#endif - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -void (*GrErrorCallback)( const char *string, FxBool fatal ); - -void _doGrErrorCallback( const char *name, const char *msg, FxBool fatal ) -{ - char buf[1024]; - -#if GDBG_INFO_ON - /* Remove any fifo checking from the failing - * call. Otherwise entries into the shutdown - * calls cause spurious crap. - */ - if (fatal) { - GR_DCL_GC; - - gc->checkCounter = - gc->expected_counter = 0; - - gc->checkCounter = - gc->checkPtr = 0UL; - } -#endif /* GDBG_INFO_ON */ - - gdbg_printf("%s: %s.\n", name, msg); - sprintf(buf,"%s: %s.\n", name, msg); - GrErrorCallback(buf, fatal); - - if (fatal) exit(1); -} - -GR_DIENTRY(grErrorSetCallback, void, - ( void (*function) ( const char *string, FxBool fatal ) )) -{ - GDBG_INFO(80,"grErrorSetCallback(0x%x)",function); - GrErrorCallback = function; -} - -#ifdef __WIN32__ -void -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) { - GDBG_ERROR("glide", s); - grGlideShutdown(); - MessageBox(NULL, s, NULL, MB_OK); - } -} -#else -void -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) { - GDBG_ERROR("glide",s); - grGlideShutdown(); - -#if (GLIDE_PLATFORM & GLIDE_OS_MACOS) - { - Str255 errBuf; - - errBuf[0] = sprintf((char*)(errBuf + 1), "%s", s); - DebugStr(errBuf); - } -#endif /* (GLIDE_PLATFORM * GLIDE_OS_MACOS) */ - } -} -#endif - -#ifdef __DOS__ -int _guHeapCheck( void ) -{ - int i = _heapchk(); - - if ( i != _HEAPOK ) - printf( "heapchk: %d\n", i ); - - return ( i == 0 ); -} -#endif - -void -_grAssert(char *exp, char *fileName, int lineNo) -{ - static int depth; - - if (depth) - return; - - depth++; - -#if GLIDE_INIT_HAL - -#else /* !GLIDE_INIT_HAL */ - /* initRestoreVideo(); */ -#endif /* !GLIDE_INIT_HAL */ - - gdbg_printf("ASSERTION FAILED:\n"); - gdbg_printf("\tExpression: %s\n", exp); - gdbg_printf("\tFile: %s\n", fileName); - gdbg_printf("\tLine: %d\n", lineNo); - -#if USE_PACKET_FIFO - /* Spew about the state of the fifo since that's what most of the - * assertions are about anyway. - */ - { - GR_DCL_GC; - GR_DCL_HW; - - gdbg_printf("Command Fifo:\n"); - gdbg_printf("\tSoftware:\n"); - gdbg_printf("\t\tfifoPtr: 0x%x\n", (FxU32) - gc->cmdTransportInfo.fifoPtr - (FxU32) gc->rawLfb); - gdbg_printf("\t\tfifoOffset: 0x%x\n", - gc->cmdTransportInfo.fifoOffset); - gdbg_printf("\t\tfifoEnd: 0x%x\n", - gc->cmdTransportInfo.fifoEnd - (FxU32) gc->rawLfb); - gdbg_printf("\tfifoSize: 0x%x\n", - gc->cmdTransportInfo.fifoSize); - gdbg_printf("\t\troomToReadPtr: 0x%x\n", - gc->cmdTransportInfo.roomToReadPtr); - gdbg_printf("\t\troomToEnd: 0x%x\n", - gc->cmdTransportInfo.roomToEnd); - gdbg_printf("\tHardware:\n"); - gdbg_printf("\t\treadPtrL: 0x%x\n", GR_CAGP_GET(readPtrL)); - gdbg_printf("\t\tdepth: 0x%x\n", GR_CAGP_GET(depth)); - gdbg_printf("\t\tholeCount: 0x%x\n", GR_CAGP_GET(holeCount)); - gdbg_printf("\t\tbaseAddrL: 0x%x\n", GR_CAGP_GET(baseAddrL)); - gdbg_printf("\t\taMin: 0x%x\n", GR_CAGP_GET(aMin)); - gdbg_printf("\t\taMax: 0x%x\n", GR_CAGP_GET(aMax)); - gdbg_printf("\t\tStatus: 0x%x\n", GR_GET(hw->status)); - -#if GLIDE_USE_DEBUG_FIFO && 0 - if (gc->cmdTransportInfo.fifoShadowBase != NULL) { - const FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowBase; - - GDBG_PRINTF("Shadow Fifo: \n"); - while(fifoPtr != gc->cmdTransportInfo.fifoShadowPtr) GDBG_PRINTF("0x%X\n", *fifoPtr++); - GDBG_PRINTF("\n"); - - GDBG_PRINTF("Up to fifo wrap: \n"); - while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2)) - GDBG_PRINTF("0x%X\n", *fifoPtr++); - - free(gc->cmdTransportInfo.fifoShadowBase); - } -#endif /* GLIDE_USE_DEBUG_FIFO */ - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */ - - gdbg_printf("ABNORMAL TERMINATION\n"); - - grGlideShutdown(); - - depth--; - - exit(-1); - -} /* _grAssert */ diff --git a/glide2x/h3/glide/src/gglide.c b/glide2x/h3/glide/src/gglide.c deleted file mode 100644 index ffd767a..0000000 --- a/glide2x/h3/glide/src/gglide.c +++ /dev/null @@ -1,2850 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:27 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 194 3/10/99 6:38p Peter -** removed cruft -** -** 193 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 192 3/02/99 2:21p Peter -** wax is a chip id -** -** 191 12/09/98 6:02p Atai -** grTexCombine did the right thing for the un-used TMU. Initialize the -** 2nd TMU value to take care of "set FX_GLIDE_NUM_TMU=1" -** -** 190 12/09/98 5:00p Atai -** set MAXLOD = MINLOD = 8 in _grUpdateParamIndex if ST1 is not used -** -** 189 12/05/98 1:04p Dow -** Fixed call to GDBG_INFO -** -** 188 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 187 11/24/98 4:21p Jeske -** make sure we don't try to apply the banshee (rev<3) fogTable hack to -** avengers with (rev<3) -** -** 186 11/18/98 6:29p Dow -** Fixed clear problem on banshee/avenger -** -** 185 11/18/98 5:17p Atai -** fixed for direct write -** -** 184 10/21/98 10:41a Atai -** -** 183 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 182 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 181 10/08/98 10:15a Dow -** Triple Buffering fix -** -** 180 9/01/98 12:47p Peter -** print correct pending value -** -** 179 8/29/98 10:04p Peter -** sdram clear fixes -** -** 178 8/27/98 9:54p Peter -** clear aux buffer w/ rgb not rbg -** -** 177 8/27/98 1:55p Peter -** use converted color on sdram boards -** -** 176 8/20/98 6:34p Dow -** Fixed swapInterval from broken effing speck -** -** 175 8/14/98 1:38p Dow -** Fixed swapinterval -** -** 174 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 173 7/23/98 4:38p Dow -** Fixed Fog on B* -** -** 172 7/23/98 3:19p Dow -** Bump & Grind Fix -** -** 171 7/06/98 7:04p Jdt -** Buffer flushing logic added -** -** 170 6/26/98 10:08a Jdt -** -** 169 6/23/98 4:49p Dow -** Fixed CDA buffer hack. -** -** 168 6/03/98 1:39p Dow -** CMDFifo/AGP read workaround -** -** 167 5/31/98 9:03a Dow -** 800x600 resolution -** -** 166 5/29/98 4:30p Peter -** Chris's swap pending thing -** -** 165 5/29/98 10:44a Dow -** cmd/agp reg read workaround. -** -** 164 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 163 5/27/98 9:45a Peter -** grBufferClear is constrained by clipping -** -** 162 5/22/98 6:24p Atai -** texturing out of render buffer hack -** -** 161 5/20/98 8:14p Dow -** device rev -** -** 160 5/18/98 3:21p Peter -** dynamic culling changes -** -** 159 5/13/98 11:42a Dow -** -** 158 5/13/98 9:12a Dow -** -** 157 5/12/98 2:42p Dow -** -** 156 5/06/98 5:34p Dow -** 2D FastFill Workaround -** -** 155 4/24/98 3:48p Dow -** Better hack for bufferpending bug -** -** 154 4/21/98 9:57a Dow -** Better workaround for buffer pending bug -** -** 153 4/16/98 3:58p Peter -** 1x1 lod fix, sorry John -** -** 152 4/14/98 6:41p Peter -** Fixed grRenderBuffer/merge w/ cvg glide cleanup -** -** 151 4/03/98 2:04p Dow -** Dos Glide Mods -** -** 150 3/28/98 11:24a Dow -** itwoç -** -** 145 2/17/98 12:40p Peter -** fog table fix -** -** 144 2/08/98 3:08p Dow -** FIFO Works -** -** 143 2/03/98 8:45p Dow -** Prep for cmd fifo stuff -** -** 142 1/29/98 9:54p Dow -** This is Banshee -** -** 141 1/23/98 3:07p Peter -** uswc nightmare -** -** 140 1/19/98 1:45p Atai -** fixed non-debug mode assignement -** -** 139 1/19/98 11:07a Atai -** remove assignment before validate the state - * - * 137 1/15/98 1:12p Peter - * only one culler please - * - * 136 1/13/98 7:48p Atai - * fixed gu3dfGetInfo, grBufferClear, and GrState size - * - * 135 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 134 1/09/98 7:29p Atai - * fixed grBufferSwap for glide3 - * - * 133 1/08/98 9:25p Peter - * infinite recurrsion in debugging assert - * - * 132 1/08/98 9:23p Peter - * fixed macro effage - * - * 131 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 130 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 129 1/07/98 5:22p Atai - * fixed grGet compiler error - * - * 128 1/07/98 10:22a Peter - * merged John's ooz fix - * - * 127 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 126 1/05/98 6:06p Atai - * glide extension stuff - * - * 125 12/22/97 12:40p Peter - * added new grColorCombine factor for OpenGL - * - * 124 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 123 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 122 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 120 12/16/97 11:38a Atai - * added grChromaRange() - * - * 118 12/08/97 10:49a Atai - * rename some state variables - * - * 117 12/03/97 11:35a Peter - * reset for swapping - * - * 116 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 115 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 114 11/18/97 6:11p Peter - * fixed glide3 effage - * - * 113 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 112 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 111 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 110 11/16/97 2:20p Peter - * cleanup - * - * 109 11/15/97 7:43p Peter - * more comdex silliness - * - * 108 11/14/97 5:02p Peter - * more comdex stuff - * - * 107 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 106 11/13/97 4:39p Atai - * enable _grUpdateParamIndex for grGlideSetState - * - * 105 11/12/97 9:54p Peter - * fixed all the effage from new config - * - * 104 11/12/97 2:27p Peter - * - * 103 11/12/97 11:16a Peter - * cleaned up assertions - * - * 102 11/06/97 3:38p Dow - * More banshee stuff - * - * 101 11/04/97 5:59p Peter - * more of the same - * - * 100 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 99 11/01/97 10:01a Peter - * tri dispatch stuff - * -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_STATE_ENTRY(grAlphaBlendFunction, void, - (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df)) -{ -#define FN_NAME "grAlphaBlendFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaBlendFunction", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d,%d,%d,%d)\n", - rgb_sf, rgb_df, alpha_sf, alpha_df); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - if (rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - - alphamode |= (((FxU32) rgb_sf) << SST_RGBSRCFACT_SHIFT) | - (((FxU32) rgb_df) << SST_RGBDSTFACT_SHIFT) | - (((FxU32) alpha_sf) << SST_ASRCFACT_SHIFT) | - (((FxU32) alpha_df) << SST_ADSTFACT_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif -#undef FN_NAME -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ - -GR_STATE_ENTRY(grAlphaCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grAlphaCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grAlphaCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT); - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = (factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE); - gc->state.ac_requires_it_alpha = (local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - -#if !GLIDE3 - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_STATE_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ -#define FN_NAME "grAlphaControlsITRGBLighting" - FxU32 fbzColorPath; - GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if (enable) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - gc->state.fbi_config.fbzColorPath = fbzColorPath; -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_STATE_ENTRY(grAlphaTestFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grAlphaTestFunction" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestFunction", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if (fnc != GR_CMP_ALWAYS) - alphamode |= ((fnc << SST_ALPHAFUNC_SHIFT) | SST_ENALPHAFUNC); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_STATE_ENTRY(grAlphaTestReferenceValue, void, (GrAlpha_t value)) -{ -#define FN_NAME "grAlphaTestReferenceValue" - FxU32 alphamode; - GR_BEGIN_NOFIFOCHECK("grAlphaTestReferenceValue", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",value); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= (((FxU32) value) << SST_ALPHAREF_SHIFT); - - gc->state.fbi_config.alphaMode = alphamode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, alphaMode, alphamode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grAlphaTestReferenceValue */ - - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, (GrColor_t color, GrAlpha_t alpha, FxU16 depth)) -{ -#define FN_NAME "grBufferClear" - GR_BEGIN_NOFIFOCHECK("grBufferClear", 86); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x,0x%x)\n", color, alpha, depth); - - { - const GrColor_t - oldc1 = gc->state.fbi_config.color1; - const FxU32 - oldzacolor = gc->state.fbi_config.zaColor, - fbzMode = gc->state.fbi_config.fbzMode; - FxU32 - zacolor = oldzacolor; - FxBool - doColorP, doAuxP = FXFALSE; - - /* validate the state */ - /* Setup source registers */ - doColorP = ((fbzMode & SST_RGBWRMASK) != 0); - if (doColorP) _grSwizzleColor(&color); - - if ((fbzMode & SST_ZAWRMASK) != 0) { - if ((fbzMode & SST_ENALPHABUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= (((FxU32) alpha) << SST_ZACOLOR_ALPHA_SHIFT); - } else if ((fbzMode & SST_ENDEPTHBUFFER) != 0) { - doAuxP = FXTRUE; - - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= (((FxU32) depth) << SST_ZACOLOR_DEPTH_SHIFT); - } - } - - /* Why were we called? */ - if (!doColorP && !doAuxP) return; - -#ifdef GLIDE_INIT_HWC - if (!gc->bInfo->sdRAM) { - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); - } else { - const FxU32 colorBufMode = ((fbzMode & ~(SST_ZAWRMASK | SST_ENDEPTHBUFFER)) | - SST_RGBWRMASK | - SST_ENRECTCLIP); - - /* Turn off writes to the aux buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1, 1); - REG_GROUP_SET(hw, fbzMode, colorBufMode); - REG_GROUP_END(); - - if (doColorP) { - /* Clear Color Buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, color); - REG_GROUP_END(); - - /* Execute the FASTFILL command */ - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 1, 1); - REG_GROUP_SET(hw, fastfillCMD, 1); - REG_GROUP_END(); - } - - if (doAuxP) { - FxU32 - red, green, blue, convertedDepth; -#define GETRED(a) ((a >> 11) & 0x1f) -#define GETGREEN(a) ((a >> 5) & 0x3f) -#define GETBLUE(a) (a & 0x1f) - - /* Convert 16-bit depth to 24-bit, ready for truncation: - 20 10 0 - 321098765432109876543210 - RRRRR000GGGGGG00BBBBB000 - - So, we get the 565 out of 16-bit depth, then operate - like this: - - RED' = red << 3 - GREEN' = green << 2 - BLUE' = blue << 3 - - This way, when the fastFill hardware truncates, we - still have all the bits we were given. - - We then simply recombin RED', BLUE', and GREEN' to make - a 24-bit color value. - - capisce? - - */ - red = GETRED(depth) << 3; - green = GETGREEN(depth) << 2; - blue = GETBLUE(depth) << 3; - - convertedDepth = ((red << 16) | (green << 8) | blue); - - /* Clear Aux Buffer */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, convertedDepth); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 1); - REG_GROUP_SET(hw, colBufferAddr,gc->buffers[gc->grColBuf]); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 2, 0x21); - { - /* Write the depth buffer as if it were a color buffer, - * but w/ actual color buffer features - * (dithering/chroma/stipple) cleared so that the - * converted depth value does not get dorked along the - * way down the eerie pathways of banshee. - */ - REG_GROUP_SET(hw, fbzMode, colorBufMode & ~(SST_ENCHROMAKEY | - SST_ENSTIPPLE | - SST_ENDITHER)); - - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - } - REG_GROUP_END(); - } - - /* Restore trashed things */ - REG_GROUP_BEGIN(BROADCAST_ID, c1, 1, 0x1); - REG_GROUP_SET(hw, c1, oldc1); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr,gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 1, 1); - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_END(); - } -#else /* !GLIDE_INIT_HWC */ - REG_GROUP_BEGIN(BROADCAST_ID, zaColor, 2, 0x41); - { - REG_GROUP_SET(hw, zaColor, zacolor); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); - - REG_GROUP_BEGIN(BROADCAST_ID, fastfillCMD, 3, 0x209); - { - /* Execute the FASTFILL command */ - REG_GROUP_SET(hw, fastfillCMD, 1); - - /* Restore C1 and ZACOLOR */ - REG_GROUP_SET(hw, zaColor, oldzacolor); - REG_GROUP_SET(hw, c1, oldc1); - } - REG_GROUP_END(); -#endif /* !GLIDE_INIT_HWC */ - } -#undef FN_NAME -} /* grBufferClear */ - - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ - -GR_ENTRY(grBufferSwap, void, (int swapInterval)) -{ -#define FN_NAME "grBufferSwap" - GR_BEGIN_NOFIFOCHECK(FN_NAME,86); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",swapInterval); - - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) _grShamelessPlug(); - - /* check for environmental override */ - if (_GlideRoot.environment.swapInterval >= 0) { - swapInterval = _GlideRoot.environment.swapInterval; - } - - if (swapInterval) { - if (swapInterval > 1) - swapInterval = ((swapInterval - 1) << 1) | 1; /* Format for hw */ - } - - while(grBufferNumPending() > 3); - - /* Cycle the buffer indices */ - { - const FxU32 numBufs = gc->grColBuf; - FxU32* bufPtrs[3]; - FxU32 i; - - bufPtrs[0] = &gc->curBuffer; - bufPtrs[1] = &gc->frontBuffer; - bufPtrs[2] = &gc->backBuffer; - - for(i = 0; i < sizeof(bufPtrs) / sizeof(*bufPtrs); i++) { - FxU32 curBufIndex = *bufPtrs[i] + 1; - if (curBufIndex == numBufs) curBufIndex = 0; - *bufPtrs[i] = curBufIndex; - } - } - -#if USE_PACKET_FIFO - { - int i, j = -1; - - for ( i = 0; i < MAX_BUFF_PENDING && j == -1; i++) { - if (gc->bufferSwaps[i] == 0xffffffff) { - gc->bufferSwaps[i] = - (FxU32) gc->cmdTransportInfo.fifoPtr - - (FxU32) gc->cmdTransportInfo.fifoStart; - j = i; - } - } - GR_ASSERT(j != -1); - - gc->swapsPending++; - - } -#endif - - /* Overlay Hack: */ - if (!gc->desktopOverlay) - { - REG_GROUP_BEGIN(BROADCAST_ID, leftOverlayBuf, 1, 0x1); - REG_GROUP_SET(hw, leftOverlayBuf, gc->buffers[gc->frontBuffer]); - REG_GROUP_END(); - - /* Just 0x1 for mask is OK here since we're writing one register */ - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, swapInterval); - REG_GROUP_END(); - } - else - { - /* buffer swap code, needs to idle since I can't - * switch the vidDesktopStartAddr to the backbuffer using the FIFO */ - /* Just 0x1 for mask is OK here since we're writing one register */ - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, swapInterval); - REG_GROUP_END(); - - /* Wait for the swapBufferCMD to go through before switching the overlay */ - while (grBufferNumPending() >= 1); - GR_SET_IO (BROADCAST_ID, hw, vidDesktopStartAddr, - gc->buffers[gc->frontBuffer]); - } - - -#if defined( TACO_MEMORY_FIFO_HACK ) - _FifoFlush(); -#endif - - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - -#ifdef GLIDE_DEBUG - { - if ((FxI32)_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if ((_GlideRoot.stats.bufferSwaps == 0) || - (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot + 3)) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - if (_GlideRoot.stats.bufferSwaps == 0) saveDBG[i] = (char)GDBG_GET_DEBUGLEVEL(i); - GDBG_SET_DEBUGLEVEL(i, 0); - } - } - /* turn on tracing after the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot) { - GDBG_PRINTF(FN_NAME": FX_SNAPSHOT (%ld)\n", _GlideRoot.stats.bufferSwaps); - - for (i = 1; i < GDBG_MAX_LEVELS; i++) { - GDBG_SET_DEBUGLEVEL(i, saveDBG[i]); - } - } - } - } -#endif /* GLIDE_DEBUG */ - - _GlideRoot.stats.bufferSwaps++; - - GR_END(); -#undef FN_NAME -} /* grBufferSwap */ - -/*--------------------------------------------------------------------------- -** grBufferNumPending -*/ - -GR_ENTRY(grBufferNumPending, int, (void)) -{ -#if USE_PACKET_FIFO - volatile FxU32 - dummy, - depth0, depth1, - readPtr0, readPtr1, readPtr; - volatile int - i; - int - pend; /* Num Swaps pending */ - GR_DCL_GC; - - /* If we're not using hole counting then we need to make sure that - * any queued commands are actually flushed before checking the fifo - * ptr's location. - */ - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - /* HACK HACK HACK */ - do { - readPtr0 = GET(gc->cRegs->cmdFifo0.readPtrL) - gc->cmdTransportInfo.fifoOffset; - dummy = GET(gc->ioRegs->status); - readPtr1 = GET(gc->cRegs->cmdFifo0.readPtrL) - gc->cmdTransportInfo.fifoOffset; - } while (readPtr0 != readPtr1); - - readPtr = readPtr1; - - if (readPtr == gc->lastSwapCheck) { - do { - depth0 = GET(gc->cRegs->cmdFifo0.depth); - depth1 = GET(gc->cRegs->cmdFifo0.depth); - } while (readPtr0 != readPtr1); - - if (depth0 == 0) { - for (i = 0; i < MAX_BUFF_PENDING; i++) - gc->bufferSwaps[i] = 0xffffffff; - gc->swapsPending = 0; - goto NPDONE; - } - } - - /* - ** There are two cases here: One where the read pointer has wrapped around - ** behind us, and one where it's ahead of us. - */ - if (readPtr < gc->lastSwapCheck) { /* We've wrapped */ - for (i = 0; i < MAX_BUFF_PENDING; i++) { - /* If it's between the last check and the end of the FIFO or between the - beginning of the FIFO and the current Read pointer, then it's gone - */ - if ( (gc->bufferSwaps[i] != 0xffffffff) && ( - (gc->bufferSwaps[i] >= gc->lastSwapCheck) || - (gc->bufferSwaps[i] <= readPtr)) ) { - --gc->swapsPending; - gc->bufferSwaps[i] = 0xffffffff; /* Free swap slot */ - } - } - } else { /* It's behind us */ - for (i = 0; i < MAX_BUFF_PENDING; i++) { - if ((gc->bufferSwaps[i] != 0xffffffff) && ( - (gc->bufferSwaps[i] >= gc->lastSwapCheck) && (gc->bufferSwaps[i] <= - readPtr))) { - --gc->swapsPending; - gc->bufferSwaps[i] = 0xffffffff; /* Free swap slot */ - } - } - } - - gc->lastSwapCheck = readPtr; - -NPDONE: - pend = gc->swapsPending; - GDBG_INFO(86,"grBufferNumPending() = %d\n", pend); - - return pend; -#else - return 0; -#endif -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_STATE_ENTRY(grChromakeyMode, void, (GrChromakeyMode_t mode)) -{ -#define FN_NAME "grChromakeyMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grChromakeyMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (mode == GR_CHROMAKEY_ENABLE) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grChromaKeyMode */ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/*--------------------------------------------------------------------------- -** grChromaRange -*/ - -GR_STATE_ENTRY(grChromaRange, void, (GrColor_t min, GrColor_t max, GrChromaRangeMode_t mode)) -{ - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", min); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", max); - - _grSwizzleColor(&min); - _grSwizzleColor(&max); - max = max & 0x00ffffff; - max |= SST_ENCHROMARANGE; - gc->state.fbi_config.chromaKey = min; - gc->state.fbi_config.chromaRange = max | mode | FXBIT(28); - -} /* grChromaRange */ -#else -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ - -GR_STATE_ENTRY(grChromakeyValue, void, (GrColor_t color)) -{ -#define FN_NAME "grChromakeyValue" - GR_BEGIN_NOFIFOCHECK("grChromakeyValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.chromaKey = color; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, chromaKey, color); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grChromaKeyValue */ -#endif - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO(85, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - GR_CHECK_COMPATABILITY(FN_NAME, - ((maxx > gc->state.screen_width) || (maxy > gc->state.screen_height)), - "Max clip coordinate > screen size"); - GR_CHECK_COMPATABILITY(FN_NAME, - ((minx > LONG_MAX) || (miny > LONG_MAX)), - "Negative min clip coordinate"); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO(85, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy); - - *clipLeftRight = (minx << SST_CLIPLEFT_SHIFT) | (maxx << SST_CLIPRIGHT_SHIFT); - *clipBottomTop = (miny << SST_CLIPBOTTOM_SHIFT) | (maxy << SST_CLIPTOP_SHIFT); - - GDBG_INFO(85, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop); - -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_STATE_ENTRY(grClipWindow, void, (FxU32 minx, FxU32 miny, - FxU32 maxx, FxU32 maxy)) -{ -#define FN_NAME "grClipWindow" - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN_NOFIFOCHECK("grClipWindow",83); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, clipLeftRight, 2, 0x03); - { - REG_GROUP_SET(hw, clipLeftRight, clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, clipBottomTop); - } - REG_GROUP_END(); -#endif /* !GLIDE3 */ - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = (float) minx; - gc->state.clipwindowf_xmax = (float) maxx; - gc->state.clipwindowf_ymin = (float) miny; - gc->state.clipwindowf_ymax = (float) maxy; - - GR_END(); -#undef FN_NAME -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_STATE_ENTRY(grColorCombine, void, - (GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, FxBool invert)) -{ -#define FN_NAME "grColorCombine" - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN_NOFIFOCHECK("grColorCombine",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert); - - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA , - "unsupported color combine function"); - - /* Starting w/ Voodoo^2 the ccu has texture RGB mode as well. */ - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_RGB || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~(SST_ENTEXTUREMAP | - SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ((factor & 0x8) == 0) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ((factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA) | - (other == GR_COMBINE_OTHER_TEXTURE)); - gc->state.cc_requires_it_rgb = ((local == GR_COMBINE_LOCAL_ITERATED) | - (other == GR_COMBINE_OTHER_ITERATED)); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if (invert) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (function) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if (gc->state.cc_requires_texture || gc->state.ac_requires_texture) - fbzColorPath |= SST_ENTEXTUREMAP; - - gc->state.fbi_config.fbzColorPath = fbzColorPath; - -#if !GLIDE3 - { - const FxBool texTransP = (oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + (texTransP ? sizeof(FxU32) : 0), - 1 + texTransP); - - /* transition into/out of texturing ... add nopCMD */ - if (texTransP) GR_SET(BROADCAST_ID, hw, nopCMD, 0); - - GR_SET(BROADCAST_ID, hw, fbzColorPath, fbzColorPath); - GR_CHECK_SIZE(); - } - - /* setup paramIndex bits */ - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ - - GR_END(); -#undef FN_NAME -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_STATE_ENTRY(grColorMask, void, (FxBool rgb, FxBool alpha)) -{ -#define FN_NAME "grColorMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grColorMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x,0x%x)\n", rgb, alpha); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_W(myName, - (fbzMode & SST_ENDEPTHBUFFER) && alpha, - "alpha writes enabled even though depth buffering"); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (alpha && (gc->grAuxBuf == 0)), - "cannot enable alpha buffering w/o allocating one"); - - if (rgb) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - if (!(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3)) { - if (alpha) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_STATE_ENTRY(grConstantColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grConstantColorValue" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",color); - - _grSwizzleColor(&color); - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, c0, 2, 0x03); - { - REG_GROUP_SET(hw, c0, color); - REG_GROUP_SET(hw, c1, color); - } - REG_GROUP_END(); -#endif /* !GLIDE3 */ - - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - - GR_END(); -#undef FN_NAME -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, (float a, float r, float g, float b)) -{ -#define FN_NAME "grConstantColorValue4" - GR_BEGIN_NOFIFOCHECK("grConstantColorValue4",85); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - - if (gc->state.cc_delta0mode) { - REG_GROUP_BEGIN(BROADCAST_ID, Fr, 3, 0x07); - { - REG_GROUP_SETF(hw, Fr, r); - REG_GROUP_SETF(hw, Fg, g); - REG_GROUP_SETF(hw, Fb, b); - } - REG_GROUP_END(); - } - - GR_END(); -#undef FN_NAME -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, (GrCullMode_t mode)) -{ -#define FN_NAME "grCullMode" - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - gc->state.cull_mode = mode; - -#if GLIDE_HW_TRI_SETUP - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, mode); -#endif /* GLIDE_HW_TRI_SETUP */ - - GR_END(); -#undef FN_NAME -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_STATE_ENTRY(grDepthBiasLevel, void, (FxI16 level)) -{ -#define FN_NAME "grDepthBiasLevel" - FxU32 zacolor; - GR_BEGIN_NOFIFOCHECK("grDepthBiasLevel", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",level); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = (zacolor & ~SST_ZACOLOR_DEPTH) | (level & SST_ZACOLOR_DEPTH); - - gc->state.fbi_config.zaColor = zacolor; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, zaColor, zacolor); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_STATE_ENTRY(grDepthBufferFunction, void, (GrCmpFnc_t fnc)) -{ -#define FN_NAME "grDepthBufferFunction" - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grDepthBufferFunction",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",fnc); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= (fnc << SST_ZFUNC_SHIFT); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -#undef FN_NAME -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_STATE_ENTRY(grDepthBufferMode, void, (GrDepthBufferMode_t mode)) -{ -#define FN_NAME "grDepthBufferMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthBufferMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - /* This is fatal because they could stomp on the cmd fifo. */ - GR_CHECK_COMPATABILITY(FN_NAME, - (mode != GR_DEPTHBUFFER_DISABLE) && (gc->grAuxBuf == 0), - "cannot enable depth buffer w/o allocating one"); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | - SST_WBUFFER | - SST_ENZBIAS | - SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -static FxBool -_grCanSupportDepthBuffer(void) -{ - GR_DCL_GC; - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return FXFALSE; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_STATE_ENTRY(grDepthMask, void, (FxBool enable)) -{ -#define FN_NAME "grDepthMask" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDepthMask", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", enable); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F(myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration"); - - if (enable) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, (void)) -{ - GDBG_INFO(87,"grDisableAllEffects()\n"); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grDepthBiasLevel(0); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grFogMode(GR_FOG_DISABLE); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_STATE_ENTRY(grDitherMode, void, (GrDitherMode_t mode)) -{ -#define FN_NAME "grDitherMode" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grDitherMode", 85); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", mode); - - fbzMode = gc->state.fbi_config.fbzMode; - if (_GlideRoot.environment.disableDitherSub == FXTRUE) - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2); - else - fbzMode &= ~(SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT); - - switch (mode) { - case GR_DITHER_DISABLE: - break; - - case GR_DITHER_2x2: - fbzMode |= (SST_ENDITHER | SST_DITHER2x2); - break; - - case GR_DITHER_4x4: - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - break; - } - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_STATE_ENTRY(grFogMode, void, (GrFogMode_t mode)) -{ -#define FN_NAME "grFogMode" - FxU32 fogmode; - GR_BEGIN_NOFIFOCHECK("grFogMode", 85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mode); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~(SST_ENFOGGING | - SST_FOGADD | - SST_FOGMULT | - SST_FOG_ALPHA | - SST_FOG_Z | - SST_FOG_CONSTANT); - - switch (mode & 0xFF) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= (SST_ENFOGGING | SST_FOG_ALPHA); - break; - - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= (SST_ENFOGGING | SST_FOG_Z); - break; - - case GR_FOG_WITH_TABLE: - fogmode |= (SST_ENFOGGING); - break; - } - if (mode & GR_FOG_MULT2) fogmode |= SST_FOGMULT; - if (mode & GR_FOG_ADD2) fogmode |= SST_FOGADD; - - /* GMT says that this should be enabled for CVG. It is always safe - * to enable these even when fogging is not enabled. - */ - fogmode |= (SST_FOG_DITHER | SST_FOG_ZONES); - - /* - ** Update the hardware and Glide state - */ - gc->state.fbi_config.fogMode = fogmode; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogMode, fogmode); - GR_CHECK_SIZE(); - - _grUpdateParamIndex(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_STATE_ENTRY(grFogColorValue, void, (GrColor_t color)) -{ -#define FN_NAME "grFogColorValue" - GR_BEGIN_NOFIFOCHECK("grFogColorValue", 85); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", color); - - _grSwizzleColor(&color); - - gc->state.fbi_config.fogColor = color; - -#if !GLIDE3 - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, fogColor, color); - GR_CHECK_SIZE(); -#endif /* !GLIDE3 */ -#undef FN_NAME -} /* grFogColorValue */ - -/* -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, (const GrFog_t fogtable[])) -{ -#define FN_NAME "grFogTable" - int i = 0; - const int iend = (kInternalFogTableEntryCount >> 1); - const GrFog_t *locTable = fogtable; - - GR_BEGIN_NOFIFOCHECK("grFogTable",85); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",fogtable); - GR_ASSERT(fogtable != NULL); - - while(i < iend) { - REG_GROUP_LONG_BEGIN(BROADCAST_ID, fogTable[i], 32); - { - int j; - - for (j = 0; j < 32; j++) { - GrFog_t e0, e1, d0, d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - d0 = ((e1 - e0) << 2); /* del0 in .2 format */ - d1 = (((i + j) == (iend - 1)) /* don't access beyond end of table */ - ? e1 - : locTable[2]); - d1 = (d1 - e1) << 2; /* del1 in .2 format */ - -#ifdef GLIDE_INIT_HWC - if ((gc->bInfo->pciInfo.deviceID == 0x3) && (gc->bInfo->devRev < 3)) - REG_GROUP_SET(hw, fogTable[i + j], - ~((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - else -#endif - REG_GROUP_SET(hw, fogTable[i + j], - ((e1 << 24) | (d1 << 16) | (e0 << 8) | d0)); - - locTable += 2; - } - } - REG_GROUP_END(); - - i += 32; - } - GR_END(); -#undef FN_NAME -} /* grFogTable */ - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, (void)) -{ - _GlideRoot.windowsInit = FXFALSE; - - if (!_GlideRoot.initialized) return; /* never made it thru startup */ - { /* GMT: reset the counter so we can proceed without assertions */ - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } - { - int i; - GR_DCL_GC; - - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - grSstSelect(i); - grSstWinClose(); - } - -#if GLIDE_INIT_HAL - fxHalShutdownAll(); -#else /* !GLIDE_INIT_HAL */ - /* dpc - 5 sep 1997 - FixMe! - * Move this to the new initCode world some time. - * - * initClose(); - */ - for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - /* HACK HACK HACK */ - } -#endif /* !GLIDE_INIT_HAL */ - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - } -} /* grGlideShutdown */ - - -/*------------------------------------------------------------------- - Function: _grFlushCommonStateRegs - Date: 14-Oct-97 - Implementor(s): dpc - Description: - Flushes all State Monster regs. If we're not doing Glide 3, - then it's still used by grGlideSetState() - Arguments: - - Return: - -------------------------------------------------------------------*/ -void -_grFlushCommonStateRegs() -{ -#define FN_NAME "_grFlushCommonStateRegs" -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_BEGIN("_grFlushCommonStateRegs", 97, 14 * sizeof(FxU32), 2); -#else - GR_BEGIN("_grFlushCommonStateRegs", 97, 13 * sizeof(FxU32), 2); -#endif - - /* NB: This logical write must be split into two writes since the - * registers are non-contiguous (not good for packet 1) and are the - * register span is larget (greater than the 14 register mask size - * for packet 4). - */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 11, 0x3C7F); -#else - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, fbzColorPath, 10, 0x1C7F); -#endif - { - REG_GROUP_SET(hw, fbzColorPath, gc->state.fbi_config.fbzColorPath); - REG_GROUP_SET(hw, fogMode, gc->state.fbi_config.fogMode); - REG_GROUP_SET(hw, alphaMode, gc->state.fbi_config.alphaMode); - REG_GROUP_SET(hw, fbzMode, gc->state.fbi_config.fbzMode); - - REG_GROUP_SET(hw, lfbMode, gc->state.fbi_config.lfbMode); - REG_GROUP_SET(hw, clipLeftRight, gc->state.fbi_config.clipLeftRight); - REG_GROUP_SET(hw, clipBottomTop, gc->state.fbi_config.clipBottomTop); - - REG_GROUP_SET(hw, fogColor, gc->state.fbi_config.fogColor); - REG_GROUP_SET(hw, zaColor, gc->state.fbi_config.zaColor); - REG_GROUP_SET(hw, chromaKey, gc->state.fbi_config.chromaKey); -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_Voodoo2) - REG_GROUP_SET(hw, chromaRange, gc->state.fbi_config.chromaRange); -#endif - } - REG_GROUP_NO_CHECK_END(); - - REG_GROUP_NO_CHECK_BEGIN(BROADCAST_ID, stipple, 3, 0x07); - { - REG_GROUP_SET(hw, stipple, gc->state.fbi_config.stipple); - REG_GROUP_SET(hw, c0, gc->state.fbi_config.color0); - REG_GROUP_SET(hw, c1, gc->state.fbi_config.color1); - } - REG_GROUP_NO_CHECK_END(); - - -#if GLIDE3 - gc->state.invalid = 0; -#endif /* GLIDE3 */ - - GR_END(); - -#undef FN_NAME -} /* _grFlushCommonStateRegs */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ -GR_ENTRY(grGlideSetState, void, (const GrState *state)) -{ -#define FN_NAME "grGlideSetState" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 87); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state); - - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - { - const FxBool texChangeP = (((gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) != 0); - if (texChangeP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - } - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state. */ - _grFlushCommonStateRegs(); - - GR_SET_EXPECTED_SIZE((7 * sizeof(FxU32)) * gc->num_tmu, gc->num_tmu); - { - int tmu; - - for (tmu = 0; tmu < gc->num_tmu; tmu++) { - SstRegs* tmuregs = SST_TMU(hw, tmu); - const FifoChipField chipField = (FifoChipField)(0x02UL << tmu); - - REG_GROUP_NO_CHECK_BEGIN(chipField, textureMode, 7, 0x7F); - { - REG_GROUP_SET(tmuregs, textureMode, gc->state.tmu_config[tmu].textureMode); - REG_GROUP_SET(tmuregs, tLOD, gc->state.tmu_config[tmu].tLOD); - REG_GROUP_SET(tmuregs, tDetail, gc->state.tmu_config[tmu].tDetail); - REG_GROUP_SET(tmuregs, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr); - - REG_GROUP_SET(tmuregs, texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1); - REG_GROUP_SET(tmuregs, texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2); - REG_GROUP_SET(tmuregs, texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8); - } - REG_GROUP_NO_CHECK_END(); - } - } - GR_CHECK_SIZE(); - - /* NOTE: since glide state includes things like hints and all cached - * variables like paramIndex we needn't recompute these, BUT: we do - * need to rebuild stuff that depends on them!!! - */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_STATE_ENTRY(grRenderBuffer, void, (GrBuffer_t buffer)) -{ -#define FN_NAME "grRenderBuffer" - GR_BEGIN_NOFIFOCHECK("grRenderBuffer",85); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",buffer); -#ifdef CHRIS_DENIS_ANTHONY_HACK - GR_CHECK_F(myName, (buffer >= GR_BUFFER_AUXBUFFER) - && (buffer!=GR_BUFFER_DENIS_HACK_ON) - && (buffer!=GR_BUFFER_DENIS_HACK_OFF), "invalid buffer"); -#else - GR_CHECK_F(myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer"); -#endif - -#ifdef CHRIS_DENIS_ANTHONY_HACK - if (buffer == GR_BUFFER_DENIS_HACK_ON) { - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->tramOffset); - REG_GROUP_SET(hw, colBufferStride, 512 ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[2]); - REG_GROUP_SET(hw, auxBufferStride, 512); - REG_GROUP_END(); - } - } - else if (buffer == GR_BUFFER_DENIS_HACK_OFF) { - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_SET(hw, colBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[2]); - REG_GROUP_SET(hw, auxBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED); - REG_GROUP_END(); - } - } - else { -#endif - { - FxU32 fbzMode; - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_DRAWBUFFER); - fbzMode |= buffer == GR_BUFFER_FRONTBUFFER ? SST_DRAWBUFFER_FRONT : SST_DRAWBUFFER_BACK; - - GR_SET_EXPECTED_SIZE(4,1); - GR_SET(BROADCAST_ID, hw, fbzMode, fbzMode); - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - } - - { - const FxU32 oldBuffer = gc->curBuffer; - - gc->curBuffer = ((buffer == GR_BUFFER_FRONTBUFFER) - ? gc->frontBuffer - : gc->backBuffer); - if (oldBuffer != gc->curBuffer) { - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 1, 0x1); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_END(); - } - } -#ifdef CHRIS_DENIS_ANTHONY_HACK - } -#endif - - - GR_END(); -#undef FN_NAME -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - - /* dpc - 13 sep 1997 - FixMe! - * Setting one packet for now. - */ - GR_CHECK_FOR_ROOM(n, 1); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, (void)) -{ -#define FN_NAME "_grUpdateParamIndex" - GR_DCL_GC; - FxU32 paramIndex = 0; - const FxU32 hints = gc->state.paramHints; - const FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - const FxU32 fogMode = gc->state.fbi_config.fogMode; - const FxU32 fbzMode = gc->state.fbi_config.fbzMode; - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[8] = { - STATE_REQUIRES_OOW_FBI, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 - }; - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if (gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode) { - paramIndex |= STATE_REQUIRES_IT_DRGB; - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if (( fbzColorPath & SST_ALOCALSELECT ) == SST_ALOCAL_Z ) { - paramIndex |= STATE_REQUIRES_OOZ; - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } else { - paramIndex |= STATE_REQUIRES_OOZ; - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ -#if defined(GLIDE3) && (GLIDE3_ALPHA) - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (gc->state.vData.q0Info.mode == GR_PARAM_DISABLE) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - gc->state.vData.st1Info.mode == GR_PARAM_DISABLE) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && (gc->state.vData.q1Info.mode == GR_PARAM_DISABLE)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; -#else - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; -#endif - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); -#undef FN_NAME -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) -#define RED Fr_ALT -#define DRDX Fdrdx_ALT -#define DRDY Fdrdy_ALT -#define GRN Fg_ALT -#define DGDX Fdgdx_ALT -#define DGDY Fdgdy_ALT -#define BLU Fb_ALT -#define DBDX Fdbdx_ALT -#define DBDY Fdbdy_ALT -#define ALF Fa_ALT -#define DADX Fdadx_ALT -#define DADY Fdady_ALT -#define Z Fz_ALT -#define DZDX Fdzdx_ALT -#define DZDY Fdzdy_ALT -#define S Fs_ALT -#define DSDX Fdsdx_ALT -#define DSDY Fdsdy_ALT -#define T Ft_ALT -#define DTDX Fdtdx_ALT -#define DTDY Fdtdy_ALT -#define W Fw_ALT -#define DWDX Fdwdx_ALT -#define DWDY Fdwdy_ALT -#else -#define RED Fr -#define DRDX Fdrdx -#define DRDY Fdrdy -#define GRN Fg -#define DGDX Fdgdx -#define DGDY Fdgdy -#define BLU Fb -#define DBDX Fdbdx -#define DBDY Fdbdy -#define ALF Fa -#define DADX Fdadx -#define DADY Fdady -#define Z Fz -#define DZDX Fdzdx -#define DZDY Fdzdy -#define S Fs -#define DSDX Fdsdx -#define DSDY Fdsdy -#define T Ft -#define DTDX Fdtdx -#define DTDY Fdtdy -#define W Fw -#define DWDX Fdwdx -#define DWDY Fdwdy -#endif - -#if GLIDE_HW_TRI_SETUP -static void -_grUpdateTriPacketHdr(FxU32 paramMask, - const GrCullMode_t cullMode) -{ - GR_DCL_GC; - FxU32 sMode = ((cullMode != GR_CULL_DISABLE) - ? kSetupCullEnable - : kSetupPingPongDisable); - if (sMode != kSetupPingPongDisable) sMode |= ((cullMode == GR_CULL_POSITIVE) - ? kSetupCullPositive - : kSetupCullNegative); - -#if GLIDE_DISPATCH_SETUP -#define COLOR_COMP_ARGB ((SST_SETUP_RGB | SST_SETUP_A) << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_RGB (SST_SETUP_RGB << SSTCP_PKT3_PMASK_SHIFT) -#define COLOR_COMP_MASK COLOR_COMP_ARGB - - /* Setup custom triangle/strip procs. - * - * NB: Currently this selection is based entirely on if - * we're sending color information. We should possibly - * select on cpu type as well to determine if we should - * do sw culling or not. - */ - { - GrTriSetupProcVector* curTriProcVector = TRISETUP_NORGB; - - if ((paramMask & SSTCP_PKT3_PACKEDCOLOR) == SSTCP_PKT3_PACKEDCOLOR) { - const FxU32 colorComp = paramMask & COLOR_COMP_MASK; - - switch(colorComp) { - case COLOR_COMP_ARGB: - curTriProcVector = TRISETUP_ARGB; - break; - - case COLOR_COMP_RGB: - curTriProcVector = TRISETUP_RGB; - break; - - /* If no rgb data then it is not worthwhile to pack - * just alpha so just mask off the packed color bit - * and just use the looping proc. - */ - default: - curTriProcVector = TRISETUP_NORGB; - paramMask &= ~SSTCP_PKT3_PACKEDCOLOR; - break; - } - } - - gc->archDispatchProcs.triSetupProc = PROC_SELECT_TRISETUP(*curTriProcVector, cullMode); - } -#endif /* GLIDE_DISPATCH_SETUP */ - - gc->cmdTransportInfo.paramMask = paramMask; - - /* Compute the common case packet 3 header which just needs - * the vertex count and strip/command type to be completed. - */ - gc->cmdTransportInfo.cullStripHdr = ((sMode << SSTCP_PKT3_SMODE_SHIFT) | - paramMask | - SSTCP_PKT3); - - /* Independent triangle hdr for grDrawTriangle */ - gc->cmdTransportInfo.triPacketHdr = (gc->cmdTransportInfo.cullStripHdr | - (0x3UL << SSTCP_PKT3_NUMVERTEX_SHIFT) | - SSTCP_PKT3_BDDBDD); - -#if GLIDE_TRI_CULLING - /* If we're doing sw culling for independent triangles then turn off - * the hw culling so we're consistent. HW culling, however, remains - * enabled for things using strips/fans. - */ - if (cullMode != GR_CULL_DISABLE) { - gc->cmdTransportInfo.triPacketHdr &= ~(kSetupCullEnable << SSTCP_PKT3_SMODE_SHIFT); - } -#endif /* GLIDE_TRI_CULLING */ -} -#endif /* GLIDE_HW_TRI_SETUP */ - -/*--------------------------------------------------------------------------- - * _grRebuildDataList - * - * NB: For CVG is *IMPERATIVE* that the writes to the parameter - * dataList remain in the order below otherwise the parameters - * will get written to the command packet in the wrong order. - */ -GR_DDFUNC(_grRebuildDataList, void, (void)) -{ -#define FN_NAME "_grRebuildDataList" - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 i; - SstRegs *tmu0; - SstRegs *tmu1; - -#if GLIDE3 || GLIDE_PACKED_RGB - FxBool packedRGB = FXFALSE; -#endif /* GLIDE3 || GLIDE_PACKED_RGB */ - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif /* GLIDE_DEBUG */ - - GDBG_INFO(85, FN_NAME "(): paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex); - - curTriSize = params = 0; - i = gc->state.paramIndex; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are ALTernate register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - -#if GLIDE_HW_TRI_SETUP - gc->cmdTransportInfo.paramMask = 0x00; -#endif /* GLIDE_HW_TRI_SETUP */ - -#ifdef GLIDE3 - gc->state.vData.vSize = 8; /* XY * 3 */ - /* - ** make x, y default to 0 and 1 - */ - /* - gc->sDataList[sVtxSize++] = gc->state.vData.vertexInfo.offset + GR_VERTEX_OFFSET_X; - gc->sDataList[sVtxSize++] = gc->state.vData.vertexInfo.offset + GR_VERTEX_OFFSET_Y; - */ -#endif /* GLIDE3 */ - - if (i & STATE_REQUIRES_IT_DRGB) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_R_OFFSET << 2; - - /* When using packed color we only add *ONE* item to the data list - * and this signals the entire color set since it is not possible - * to specify a single color component in any packet. - */ -#if !GLIDE_PACKED_RGB - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_G_OFFSET << 2; - gc->tsuDataList[curTriSize + 2] = GR_VERTEX_B_OFFSET << 2; -#endif /* !GLIDE_PACKED_RGB */ -#elif defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_RGB; - if (gc->state.vData.colorType == GR_FLOAT) { - gc->tsuDataList[curTriSize + 0] = gc->state.vData.rgbInfo.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.rgbInfo.offset + GR_COLOR_OFFSET_GREEN; - gc->tsuDataList[curTriSize + 2] = gc->state.vData.rgbInfo.offset + GR_COLOR_OFFSET_BLUE; - gc->state.vData.vSize += 12; /* RGB */ - } - else { - gc->tsuDataList[curTriSize + 0] = gc->state.vData.pargbInfo.offset; - packedRGB = FXTRUE; - gc->state.vData.vSize += 4; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET << 2; - gc->regDataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET << 2; - - gc->regDataList[curTriSize + 0].addr = (float*)&hw->RED; - gc->regDataList[curTriSize + 1].addr = (float*)&hw->GRN; - gc->regDataList[curTriSize + 2].addr = (float*)&hw->BLU; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_PACKED_RGB -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - if (gc->state.vData.colorInfo.type == GR_FLOAT) { -#else /* GLIDE3_VERTEX_LAYOUT */ - if (gc->state.vData.colorType == GR_FLOAT) { -#endif /* GLIDE3_VERTEX_LAYOUT */ - curTriSize += 3; - params += 3; - } else { - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; - } -#else /* !GLIDE3 */ - curTriSize += 1; - params += 1; - - packedRGB = FXTRUE; -#endif /* GLIDE3 */ -#else /* !GLIDE_PACKED_RGB */ - curTriSize += 3; - params += 3; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_IT_ALPHA) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_A_OFFSET << 2; -#elif defined(GLIDE3) - gc->cmdTransportInfo.paramMask |= SST_SETUP_A; - if (gc->state.vData.colorType == GR_FLOAT) { - gc->tsuDataList[curTriSize] = gc->state.vData.aInfo.offset; - gc->state.vData.vSize += 4; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->ALF; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - -#if GLIDE_PACKED_RGB -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - if (gc->state.vData.colorInfo.type == GR_FLOAT) { -#else /* GLIDE3_VERTEX_LAYOUT */ - if (gc->state.vData.colorType == GR_FLOAT) { -#endif /* GLIDE3_VERTEX_LAYOUT */ - params += 1; - } - else -#endif /* GLIDE3 */ - { - /* Only increment the parameter packet size if we have not already - * added the rgb fields. - */ - if ((i & STATE_REQUIRES_IT_DRGB) == 0) params += 1; - packedRGB = FXTRUE; - } -#else /* !GLIDE_PACKED_RGB */ - params += 1; -#endif /* !GLIDE_PACKED_RGB */ - } - - if (i & STATE_REQUIRES_OOZ) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOZ_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.zInfo.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Z; - - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->Z; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.wInfo.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_Wfbi; - - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&hw->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - -#if GLIDE_FP_CLAMP_TEX -#if !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP -#error "Does not make sense to have GLIDE_FP_CLAMP_TEX w/o GLIDE_FP_CLAMP or GLIDE_HW_TRI_SETUP" -#endif /* !GLIDE_FP_CLAMP || !GLIDE_HW_TRI_SETUP */ - - /* Simplify the test for clamping only the texture parameters by - * sticking an extra empty slot into the data list. - * - * NB: This means that the code that runs through the parameter list - * needs to increment the datalist pointer before moving onto the - * texture parameters. - */ - gc->tsuDataList[curTriSize++] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.q0Info.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W0; - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - } - - /* TMU0 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = gc->state.vData.st0Info.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.st0Info.offset - + GR_TEXTURE_OFFSET_T; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST0; - gc->state.vData.vSize += 8; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu0->S; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu0->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_W_TMU1) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize] = gc->state.vData.q1Info.offset; - gc->cmdTransportInfo.paramMask |= SST_SETUP_W1; - gc->state.vData.vSize += 4; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->W; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 1; - params += 1; - - } - - if (i & STATE_REQUIRES_ST_TMU1) { -#if GLIDE_HW_TRI_SETUP && !defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->tsuDataList[curTriSize + 1] = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; -#elif defined(GLIDE3) - gc->tsuDataList[curTriSize + 0] = gc->state.vData.st1Info.offset; - gc->tsuDataList[curTriSize + 1] = gc->state.vData.st1Info.offset + GR_TEXTURE_OFFSET_T; - gc->cmdTransportInfo.paramMask |= SST_SETUP_ST1; - gc->state.vData.vSize += 8; -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 0].addr = (float*)&tmu1->S; - gc->regDataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU1_OFFSET << 2; - gc->regDataList[curTriSize + 1].addr = (float*)&tmu1->T; -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - - curTriSize += 2; - params += 2; - - } - -#if (GLIDE_NUM_TMU > 2) -#error "GLIDE_NUM_TMU > 2: Write this code." -#endif - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 0; /* terminate the list with 0,* */ -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_HW_TRI_SETUP - gc->tsuDataList[curTriSize] = 0; -#endif /* GLIDE_HW_TRI_SETUP */ - - curTriSize++; - -#if GLIDE_HW_TRI_SETUP - /* Per vertex size: (xy [required] + parameters) * param size (32 bit word) */ - _GlideRoot.curVertexSize = ((2 + params) << 2); - - /* Packet size: 3 * vertex size */ - _GlideRoot.curTriSize = (_GlideRoot.curVertexSize << 1) + _GlideRoot.curVertexSize; - - /* Shift the parameter mask to just write into the packet header. */ - GDBG_INFO(191, "CVG ParamMask: 0x%X\n", gc->cmdTransportInfo.paramMask); - gc->cmdTransportInfo.paramMask <<= SSTCP_PKT3_PMASK_SHIFT; - -#if GLIDE_PACKED_RGB || GLIDE3 - if (packedRGB) gc->cmdTransportInfo.paramMask |= SSTCP_PKT3_PACKEDCOLOR; -#endif /* GLIDE_PACKED_RGB || GLIDE3 */ - - /* Update common packet 3 headers */ - _grUpdateTriPacketHdr(gc->cmdTransportInfo.paramMask, gc->state.cull_mode); -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - gc->regDataList[curTriSize].i = 1; - gc->regDataList[curTriSize].addr = (float*)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.paramCount = params; - _GlideRoot.curTriSize = (6 + curTriSize + (params << 1)) << 2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params << 3); -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ - -#if GLIDE_FP_CLAMP_TEX - /* Stick one more 0 in the dataList so that the texture clamping - * loop does not go one more iteration. - */ - gc->tsuDataList[++curTriSize] = 0; -#endif /* GLIDE_FP_CLAMP_TEX */ - -#ifdef GDBG_INFO_ON -#if GLIDE_HW_TRI_SETUP - for (i = 0; gc->tsuDataList[i]; i++) { - GDBG_INFO(282," tsuDataList[%d] = %2d [%s]\n", - i, gc->tsuDataList[i] >> 2, p_str[gc->tsuDataList[i] >> 2]); - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP - for (i = 0; gc->regDataList[i].i; i++) { - GDBG_INFO(282," dataList[%d] = %2d 0x%x [%s]\n", - i, gc->regDataList[i].i >> 2, gc->regDataList[i].addr, - p_str[gc->regDataList[i].i >> 2]); - } -#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */ -#endif /* GDBG_INFO_ON */ - -#if GLIDE3 -#if !GLIDE3_VERTEX_LAYOUT - GDBG_INFO(gc->myLevel, "%s: Vertex Offset = %d\n", FN_NAME, - gc->state.vData.vertexInfo.offset); - - GDBG_INFO(gc->myLevel, "%s: Color Offset = %d\n", FN_NAME, - gc->state.vData.colorInfo.offset); - - GDBG_INFO(gc->myLevel, "%s: Tex0 Offset = %d\n", FN_NAME, - gc->state.vData.tex0Info.offset); - - GDBG_INFO(gc->myLevel, "%s: Tex1 Offset = %d\n", FN_NAME, - gc->state.vData.tex1Info.offset); -#endif /* !GLIDE3_VERTEX_LAYOUT */ -#endif /* GLIDE3 */ -#undef FN_NAME -} /* _grRebuildDataList */ - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/h3/glide/src/glfb.c b/glide2x/h3/glide/src/glfb.c deleted file mode 100644 index 430664f..0000000 --- a/glide2x/h3/glide/src/glfb.c +++ /dev/null @@ -1,961 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:27 joseph -** Initial checkin into SourceForge. -** -** -** 4 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 78 3/12/99 5:52p Hanson -** Fixed Descent2 bugs. No idle on lfb lock needed to be disabled for -** banshee/avenger since it does not have SST1 style cmd fifo. Updated -** ConvertAndDownloadRLE for Banshee/Avenger. -** -** 77 3/10/99 6:39p Peter -** need to bump-n-grind in lfb lock too, fixed nested lock error condition -** -** 76 3/08/99 4:13p Mikec -** Made sure when we return raw lfb in a write lock, origin is not lower -** left. -** -** 75 2/17/99 5:05p Atai -** guard the lfb write ptr hack for window32 only -** -** 74 9/10/98 12:39p Mikec -** In grLfbLock special case where we return read ptr for writeMode of -** 565, I took out ZA16 because it screwed up zbuffer writes on croc. It's -** good to err on safe side. -** -** 73 9/01/98 9:55a Dow -** Fixed stride bugs for 32-bit formats -** -** 72 8/29/98 12:11p Mikec -** Changed grLfbLock to return the current buffer lfbptr (read ptr) if it -** is writeOnly and 565 and not pixelpipe. -** -** 71 8/27/98 8:40p Mikec -** Fixed lfb buffer write problem (stride wrongly shifted by 1). -** -** 70 7/06/98 7:04p Jdt -** Buffer flushing logic -** -** 69 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 68 4/29/98 1:03p Peter -** read region/non 16bit write happiness -** -** 67 4/14/98 6:40p Peter -** Fixed grLfbLock/merge w/ cvg glide cleanup -** -** 66 4/08/98 12:25p Dow -** LFB read fix -** -** 65 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 64 3/28/98 11:24a Dow -** itwoç -** -** 62 2/17/98 12:51p Dow -** LINEAR_WRITE_EDGE mods -** -** 61 2/08/98 3:08p Dow -** FIFO Works -** -** 60 2/01/98 7:52p Peter -** grLfbWriteRegion byte count problems - * - * 58 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 57 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 56 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 55 12/15/97 6:04p Atai - * disable obsolete glide2 api for glide3 - * - * 54 12/15/97 5:54p Peter - * swizzle reads too - * - * 53 12/11/97 4:15p Peter - * mac lfb write region - * - * 52 12/01/97 5:18p Peter - * - * 51 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 50 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 49 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 48 11/06/97 3:38p Dow - * More banshee stuff - * - * 47 11/04/97 5:04p Peter - * cataclysm part deux - * - * 46 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 45 10/27/97 11:10a Peter - * starting cleanup - * - * 44 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 43 10/08/97 5:18p Peter - * fixed grLfbLock wrt writemode_any - * - * 42 10/08/97 11:33a Peter - * hmmmm.... - * - * 41 9/30/97 1:03p Peter - * more debugging code - * - * 40 9/25/97 1:35p Peter - * - * 39 9/24/97 4:09p Peter - * lfb/idle fixes - * - * 38 9/24/97 1:31p Peter - * assert if grXX call inside lock/unlock - * - * 37 9/20/97 10:54a Peter - * naked lfb writes - * - * 36 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 34 9/05/97 5:29p Peter - * changes for direct hw - * - * 33 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 32 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 31 7/30/97 2:42p Peter - * more cleanup - * - * 30 7/28/97 2:41p Peter - * turned sli code back on for cvg, but waiting for hal - * - * 29 7/26/97 3:04p Peter - * gratuitous plug is translucent - * - * 28 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 27 6/26/97 10:14a Peter - * cmd fifo for lfb - * - * 26 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * -** -*/ -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, (GrAlpha_t alpha)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",alpha); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, (FxU16 depth)) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",depth); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,(GrLock_t type, GrBuffer_t buffer, - GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, - FxBool pixelPipeline, GrLfbInfo_t *info)) -{ -#define FN_NAME "grLfbLock" - FxBool - rv = FXTRUE; - FxU32 - lfbMode, - zaColor, - fbzMode; - - GR_BEGIN_NOFIFOCHECK("grLfbLock", 82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d,%d,%d,0x%x)\n", type, buffer, - writeMode, origin, pixelPipeline, info); - - /* there is only one revision extant */ - GR_CHECK_F(myName, info->size != sizeof(GrLfbInfo_t), "uninitialized info structure passed."); - GR_CHECK_F(myName, info == NULL, "Null info structure passed."); - - /* Load now flushed state */ - lfbMode = gc->state.fbi_config.lfbMode; - fbzMode = gc->state.fbi_config.fbzMode; - zaColor = gc->state.fbi_config.zaColor; - - type = type & ~(GR_LFB_NOIDLE); - if (gc->lockPtrs[type] != (FxU32)-1) { - GDBG_INFO(83, "Read lock failure due to existing lock"); - rv = FXFALSE; - } - - if (rv) { - switch(type) { - case GR_LFB_READ_ONLY: - lfbMode &= ~(SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN); - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READCOLORBUFFER; - break; - - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READDEPTHABUFFER; - break; - - default: - GR_CHECK_F(myName, - 1, - "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - break; - - case GR_LFB_WRITE_ONLY: - /* Set up the constant depth register because it may have - * been trashed by a call to grDepthBiasLevel - * (depthbiaslevel and constant depth use the same register) - */ - zaColor = (((FxU32) gc->state.lfb_constant_depth) << SST_ZACOLOR_DEPTH_SHIFT); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - - /* disable depth biasing */ - fbzMode &= ~(SST_ENZBIAS); - - lfbMode &= ~(SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE); - - switch(writeMode) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - /* Default to hw */ - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = ((buffer == GR_BUFFER_AUXBUFFER) - ? GR_LFBWRITEMODE_ZA16 - : GR_LFBWRITEMODE_565); - } - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - case GR_BUFFER_BACKBUFFER: - rv = (writeMode != GR_LFBWRITEMODE_ZA16); - break; - - case GR_BUFFER_AUXBUFFER: - rv = (writeMode == GR_LFBWRITEMODE_ZA16); - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - break; - } - - lfbMode |= (writeMode << SST_LFB_FORMAT_SHIFT); - lfbMode |= (origin ? SST_LFB_YORIGIN : 0); - - if (pixelPipeline) { - lfbMode |= SST_LFB_ENPIXPIPE; - - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin ? SST_YORIGIN : 0); - } - info->writeMode = writeMode; - break; - - default: - rv = FXFALSE; - GDBG_INFO(gc->myLevel, "Lock failed because of invalid lock type."); - break; - } - } - - if (rv) { - const FxU32 - lockCount = gc->cmdTransportInfo.lfbLockCount; - - gc->lockPtrs[type] = buffer; - gc->cmdTransportInfo.lfbLockCount = 0x00UL; - - /* Setup the hw w/ the settings computed above. */ - switch(type) { - case GR_LFB_READ_ONLY: - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - GR_CHECK_SIZE(); - break; - - case GR_LFB_WRITE_ONLY: - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 3, 0x103); - { - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_SET(hw, lfbMode, lfbMode); - REG_GROUP_SET(hw, zaColor, zaColor); - } - REG_GROUP_END(); - break; - } - gc->state.fbi_config.lfbMode = lfbMode; - - /* Get the current lfb buffer */ - { - /* FixMe: Is this true if we're triple buffering? */ - FxU32 colBufferIndex = 0; - - switch(buffer) { - case GR_BUFFER_FRONTBUFFER: - colBufferIndex = gc->frontBuffer; - break; - - case GR_BUFFER_BACKBUFFER: - colBufferIndex = gc->backBuffer; - break; - - case GR_BUFFER_AUXBUFFER: - colBufferIndex = gc->grColBuf; - break; - - default: - GR_CHECK_F(myName, 1, "illegal buffer parameter passed"); - rv = FXFALSE; - break; - } - - if (rv) { - info->strideInBytes = 0x1000; - info->origin = origin; - - if (type == GR_LFB_READ_ONLY) { - info->lfbPtr = (void *)gc->lfbBuffers[colBufferIndex]; - } else -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* Next, If it is writeOnly and 565 and not pixelpipe, - we just return the current buffer lfbPtr as the write ptr. - This fixes those games that use the lfb write pointer to do - lfb reads. --mikec */ - if ((type == GR_LFB_WRITE_ONLY) && - (writeMode == GR_LFBWRITEMODE_565) && - /* Do not put GR_LFBWRITEMODE_ZA16 here! - * Croc intro clears zbuffer differently --mikec */ - (!pixelPipeline) && - /* Origin must be upper left since we will return raw lfb */ - (origin != GR_ORIGIN_LOWER_LEFT) && - FXTRUE) { - info->lfbPtr = (void *)gc->lfbBuffers[colBufferIndex]; - } else -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, colBufferAddr, gc->buffers[colBufferIndex]); - GR_CHECK_SIZE(); - - info->lfbPtr = (void *)gc->lfb_ptr; - - switch (writeMode) { - case GR_LFBWRITEMODE_565_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - info->strideInBytes <<= 1; - break; - } - } - - /* NoIdle flag is ignored on all hardware except SST1 */ - - /* This is required to flush the write buffers before the - * actual LFB accesses. - */ - P6FENCE; - - /* If we're not using hole counting then we need to make sure that - * any queued commands are actually flushed before checking the fifo - * ptr's location. - */ - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - /* Must idle to get things in the right order. */ - grSstIdle(); - - /* Increment lock count */ - gc->cmdTransportInfo.lfbLockCount = lockCount + 1; - } - } - } - - - GR_RETURN(rv); -#undef FN_NAME -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock (read only/write only) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, (GrLock_t type, GrBuffer_t buffer)) -{ -#define FN_NAME "grLfbUnlock" - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock", 83); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d)\n", type, buffer); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_F(myName, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type"); - - GR_CHECK_F(myName, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer"); - - rval = (gc->lockPtrs[type] == (FxU32)buffer); - if (rval) { - const FxU32 - lockCount = gc->cmdTransportInfo.lfbLockCount; - - /* Clear the current lfb lock state */ - gc->cmdTransportInfo.lfbLockCount = 0; - gc->lockPtrs[type] = (FxU32)-1; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, colBufferAddr, gc->buffers[gc->curBuffer]); - GR_CHECK_SIZE(); - - if (type == GR_LFB_WRITE_ONLY) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32) << 1, 2); - { - /* Restore depth bias level */ - GR_SET(BROADCAST_ID, hw, zaColor, gc->state.fbi_config.zaColor); - - /* turn back on depth biasing */ - GR_SET(BROADCAST_ID, hw, fbzMode, gc->state.fbi_config.fbzMode); - } - GR_CHECK_SIZE(); - } - - gc->cmdTransportInfo.lfbLockCount = lockCount - 1; - } - - GR_RETURN(rval); -#undef FN_NAME -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_STATE_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#define FN_NAME "grLfbWriteColorFormat" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorFormat",82); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",colorFormat); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ -GR_STATE_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#define FN_NAME "grLfbWriteColorSwizzle" - FxU32 lfbMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteColorSwizzle",82); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - _grValidateState(); -#endif - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - { - const FxBool sliP = gc->scanline_interleaved; - - GR_SET_EXPECTED_SIZE(sizeof(FxU32) + MaskSelect(sliP, sizeof(FxU32)), - 1 + sliP); - { - GR_SET(BROADCAST_ID, hw, lfbMode, lfbMode); - gc->state.fbi_config.lfbMode = lfbMode; - - if (sliP) GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - } - GR_CHECK_SIZE(); - } - - GR_END(); -#undef FN_NAME -} /* grLfbWriteColorSwizzle */ - -FxBool -_grLfbWriteRegion(FxBool pixPipelineP, - GrBuffer_t dst_buffer, FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, const void *src_data) -{ -#define FN_NAME "_grLfbWriteRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x, %s, %d, %d, %d, %d, %d, %d, 0x%x)\n", - dst_buffer, - (pixPipelineP ? "Enable" : "Disable"), - dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - - writeMode = ((src_format == GR_LFB_SRC_FMT_RLE16) - ? GR_LFBWRITEMODE_565 - : src_format); - - info.size = sizeof(info); - - if (grLfbLock(GR_LFB_WRITE_ONLY, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - pixPipelineP, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = (FxU32 *) src_data; - dstData = (FxU32 *) (((char*)info.lfbPtr)+ (dst_y*info.strideInBytes)); - scanline = src_height; - - switch(src_format) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if (aligned) { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - - if (((int)length) & 0x2) { - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - - if (!(length & 0x2)) { - SET16((*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0]))); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - break; - - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while(scanline--) { - end = (FxU32*)((char*)srcData + length); - while(srcData < end) { - SET(dstData[0], srcData[0]); - dstData++; - srcData++; - } - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - break; - - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock(GR_LFB_WRITE_ONLY, dst_buffer); - } else { - rv = FXFALSE; - } - - GR_RETURN(rv); -#undef FN_NAME -} /* _grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data)) -#else -GR_ENTRY(grLfbWriteRegion, FxBool, (GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data)) -#endif -{ - FxBool rv = FXTRUE; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if ((_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_SST96) && (pixelPipeline == FXTRUE)) - rv = FXFALSE; - else - rv = _grLfbWriteRegion(pixelPipeline, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); -#else - rv = _grLfbWriteRegion(FXFALSE, dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data); -#endif - - GR_RETURN(rv); -} /* grLfbWriteRegion */ - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, (GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data)) -{ -#define FN_NAME "grLfbReadRegion" - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion",82); - GDBG_INFO_MORE(gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data); - - info.size = sizeof(info); - if (grLfbLock(GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info)) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - FxU32 odd; /* is src_y odd? (for sli) */ - - dstData = (FxU32 *) dst_data; - srcData = (FxU32 *) (((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1)); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - odd = (src_y+src_height) & 0x1; - - if (aligned) { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (((int)length) & 0x2) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while(scanline--) { - end = (FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (FxU16)GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - - while(srcData < end) { - *dstData++ = GR_GET(*srcData++); - } - - if (!(((int)length) & 0x2)) { - (*(FxU16*)dstData) = GR_GET16(*srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1); - srcData = (FxU32*)(((FxU16*)srcData) + 1); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock(GR_LFB_READ_ONLY, src_buffer); - } else { - rv = FXFALSE; - } - GR_RETURN(rv); -#undef FN_NAME -}/* grLfbReadRegion */ - diff --git a/glide2x/h3/glide/src/glide.h b/glide2x/h3/glide/src/glide.h deleted file mode 100644 index 92775ab..0000000 --- a/glide2x/h3/glide/src/glide.h +++ /dev/null @@ -1,1527 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -#ifdef CHRIS_DENIS_ANTHONY_HACK -#define GR_BUFFER_DENIS_HACK_ON 0x6 -#define GR_BUFFER_DENIS_HACK_OFF 0x7 -#endif - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef GLIDE3_ALPHA -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 -#define GR_SSTTYPE_Banshee 4 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINTTYPE_MAX 3 -#ifdef H3D -#define GR_HINT_H3DENABLE 4 -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX 4 -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -#ifdef DIAG_BUILD -FX_ENTRY void FX_CALL -grSplashCb(float x, float y, float width, float height, FxU32 frame, - void (*fn)(int)); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - FxU8 *bm_data, - long bm_h, - FxU32 u0, - FxU32 v0, - FxU32 width, - FxU32 height, - FxU32 dest_width, - FxU32 dest_height, - FxU16 *tlut); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/h3/glide/src/glide.rc b/glide2x/h3/glide/src/glide.rc deleted file mode 100644 index c80e8f2..0000000 --- a/glide2x/h3/glide/src/glide.rc +++ /dev/null @@ -1,72 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#ifndef GLIDE3 -#define VERSIONNAME "glide2x.dll\0" -#else -#define VERSIONNAME "glide3x.dll\0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER -// PRODUCTVERSION VERSIONSTR, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE - -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3dfx Interactive, Inc.\0" - VALUE "FileDescription", "3dfx Interactive, Inc. Glide DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3dfx Interactive, Inc. 1997\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", PRODNAME - VALUE "ProductVersion", VERSIONSTR - VALUE "Graphics Subsystem", HWSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/h3/glide/src/glide.rx b/glide2x/h3/glide/src/glide.rx deleted file mode 100644 index c6aadac..0000000 --- a/glide2x/h3/glide/src/glide.rx +++ /dev/null @@ -1,4 +0,0 @@ -/GR_DDFUNC\((.*),/ -/GR_ENTRY\((.*),/ -/GR_DIENTRY\((.*),/ -/GR_STATE_ENTRY\((.*),/ diff --git a/glide2x/h3/glide/src/glidesys.h b/glide2x/h3/glide/src/glidesys.h deleted file mode 100644 index bb561da..0000000 --- a/glide2x/h3/glide/src/glidesys.h +++ /dev/null @@ -1,137 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 12 11/05/98 5:04p Russp -** fixed GLIDE_NUM_TMU test from "&&" to "||" - * - * 10 12/09/97 12:20p Peter - * mac glide port - * - * 9 11/04/97 4:00p Dow - * Banshee Mods - * - * 8 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 7 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 6 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 5 5/21/97 6:05a Peter -*/ -#ifndef __GLIDESYS_H__ -#define __GLIDESYS_H__ - -/* -n** ----------------------------------------------------------------------- -** COMPILER/ENVIRONMENT CONFIGURATION -** ----------------------------------------------------------------------- -*/ - -/* Endianness is stored in bits [30:31] */ -#define GLIDE_ENDIAN_SHIFT 30 -#define GLIDE_ENDIAN_LITTLE (0x1 << GLIDE_ENDIAN_SHIFT) -#define GLIDE_ENDIAN_BIG (0x2 << GLIDE_ENDIAN_SHIFT) - -/* OS is stored in bits [0:6] */ -#define GLIDE_OS_SHIFT 0 -#define GLIDE_OS_UNIX 0x1 -#define GLIDE_OS_DOS32 0x2 -#define GLIDE_OS_WIN32 0x4 -#define GLIDE_OS_MACOS 0x8 -#define GLIDE_OS_OS2 0x10 -#define GLIDE_OS_OTHER 0x40 /* For Proprietary Arcade HW */ - -#define GLIDE_SST_SHIFT 7 -#define GLIDE_SST_HW (0x2 << GLIDE_SST_SHIFT) - -/* Hardware Type is stored in bits [9:13] */ -#define GLIDE_HW_SHIFT 9 -#define GLIDE_HW_SST1 (0x1 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SST96 (0x2 << GLIDE_HW_SHIFT) -#define GLIDE_HW_H3 (0x4 << GLIDE_HW_SHIFT) -#define GLIDE_HW_CVG (0x10 << GLIDE_HW_SHIFT) - -/* -** Make sure we handle all instances of WIN32 -*/ -#ifndef __WIN32__ -# if defined (_WIN32) || defined (WIN32) || defined(__NT__) -# define __WIN32__ -# endif -#endif - -/* We need two checks on the OS: one for endian, the other for OS */ -/* Check for endianness */ -#if defined(__IRIX__) || defined(__sparc__) || defined(MACOS) -# define GLIDE_ENDIAN GLIDE_ENDIAN_BIG -#else -# define GLIDE_ENDIAN GLIDE_ENDIAN_LITTLE -#endif - -/* Check for OS */ -#if defined(__IRIX__) || defined(__sparc__) || defined(__linux__) -# define GLIDE_OS GLIDE_OS_UNIX -#elif defined(__DOS__) -# define GLIDE_OS GLIDE_OS_DOS32 -#elif defined(__WIN32__) -# define GLIDE_OS GLIDE_OS_WIN32 -#elif defined(macintosh) -# define GLIDE_OS GLIDE_OS_MACOS -#else -#error "Unknown OS" -#endif - -#define GLIDE_SST GLIDE_SST_HW - -/* Check for type of hardware */ -#ifdef SST96 -# define GLIDE_HW GLIDE_HW_SST96 -#elif defined(H3) -# define GLIDE_HW GLIDE_HW_H3 -#elif defined(CVG) -# define GLIDE_HW GLIDE_HW_CVG -#else /* Default to SST1 */ -# define GLIDE_HW GLIDE_HW_SST1 -#endif - - -#define GLIDE_PLATFORM (GLIDE_ENDIAN | GLIDE_OS | GLIDE_SST | GLIDE_HW) - -/* -** Control the number of TMUs -*/ -#ifndef GLIDE_NUM_TMU -# define GLIDE_NUM_TMU 2 -#endif - - -#if ((GLIDE_NUM_TMU < 0) || (GLIDE_NUM_TMU > 3)) -# error "GLIDE_NUM_TMU set to an invalid value" -#endif - -#endif /* __GLIDESYS_H__ */ diff --git a/glide2x/h3/glide/src/glideutl.h b/glide2x/h3/glide/src/glideutl.h deleted file mode 100644 index cf98f0e..0000000 --- a/glide2x/h3/glide/src/glideutl.h +++ /dev/null @@ -1,189 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 11 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 10 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 9 1/05/98 6:04p Atai - * move 3df gu related data structure from glide.h to glideutl.h - * - * 8 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 7 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 6 8/14/97 5:32p Pgj - * remove dead code per GMT - * - * 5 6/12/97 5:19p Pgj - * Fix bug 578 - * - * 4 3/05/97 9:36p Jdt - * Removed guFbWriteRegion added guEncodeRLE16 - * - * 3 1/16/97 3:45p Dow - * Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO -*/ - -/* Glide Utility routines */ - -#ifndef __GLIDEUTL_H__ -#define __GLIDEUTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -#endif - -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -guAADrawTriangleWithClip( const GrVertex *a, const GrVertex - *b, const GrVertex *c); - -FX_ENTRY void FX_CALL -guDrawTriangleWithClip( - const GrVertex *a, - const GrVertex *b, - const GrVertex *c - ); - -FX_ENTRY void FX_CALL -guDrawPolygonVertexListWithClip( int nverts, const GrVertex vlist[] ); - -/* -** hi-level rendering utility functions -*/ -FX_ENTRY void FX_CALL -guAlphaSource( GrAlphaSource_t mode ); - -FX_ENTRY void FX_CALL -guColorCombineFunction( GrColorCombineFnc_t fnc ); - -FX_ENTRY int FX_CALL -guEncodeRLE16( void *dst, - void *src, - FxU32 width, - FxU32 height ); - -FX_ENTRY FxU16 * FX_CALL -guTexCreateColorMipMap( void ); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -guGammaCorrectionRGB( FxFloat red, FxFloat green, FxFloat blue ); -#endif - -/* -** fog stuff -*/ -FX_ENTRY float FX_CALL -guFogTableIndexToW( int i ); - -FX_ENTRY void FX_CALL -guFogGenerateExp( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateExp2( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateLinear(GrFog_t fogtable[], - float nearZ, float farZ ); - -/* -** endian stuff -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -guEndianSwapWords( FxU32 value ); - -FX_ENTRY FxU16 FX_CALL -guEndianSwapBytes( FxU16 value ); -#endif /* !GLIDE3_ALPHA */ - -/* -** hi-level texture manipulation tools. -*/ -FX_ENTRY FxBool FX_CALL -gu3dfGetInfo( const char *filename, Gu3dfInfo *info ); - -FX_ENTRY FxBool FX_CALL -gu3dfLoad( const char *filename, Gu3dfInfo *data ); - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GLIDEUTL_H__ */ diff --git a/glide2x/h3/glide/src/glimport.asm b/glide2x/h3/glide/src/glimport.asm deleted file mode 100644 index 1574e63..0000000 --- a/glide2x/h3/glide/src/glimport.asm +++ /dev/null @@ -1,235 +0,0 @@ -;; -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Revision$ -;; $Log$ -;; -;; 3 3/17/99 6:16p Dow -;; Phantom Menace and other fixes. -;; -;; 10 1/17/98 2:23p Dow -;; Changed headers a bit -;** -;** IMPLIB.ASM: This is a template for an import library. -;** -;; $Header$ - -;** -;** - -.386p -.MODEL FLAT - -.CODE - -EXTRN __loadme:NEAR ; magic symbol names -PUBLIC __dllname, __dllfirst, __dlltab, __dllcount - -ENTRYNAMES SEGMENT DWORD USE32 PUBLIC 'CODE' -ENTRYNAMES ENDS - -ENTRYTHUNKS SEGMENT DWORD USE32 PUBLIC 'CODE' - ALIGN 4 -__dllfirst: -ENTRYTHUNKS ENDS - -ENTRYTABLE SEGMENT DWORD USE32 PUBLIC 'CODE' - ALIGN 4 -__dlltab LABEL DWORD -ENTRYTABLE ENDS - -CGROUP GROUP _TEXT, ENTRYNAMES, ENTRYTHUNKS, ENTRYTABLE - -;** This macro enforces consistency among the three tables which are -;** used to implement the __loadme mechanism. The ENTRYNAMES segment -;** contains the names of the exported functions. The ENTRYTHUNKS -;** segment contains a label and a five-byte call to __loadme, nothing -;** else. (Implementation note: to extend this code to support multiple -;** import libraries, the mechanism could be changed to pass the names -;** of the DLL and the symbol to __loadme; this module wouldn't have -;** to export any public symbols except the entry point stubs. However, -;** doing it this way is much smaller when there are many entry points, -;** since each one is only five bytes.) Finally, the ENTRYTABLE -;** segment contains an indexed array of pointers to the function -;** names; this table is kept in the same order as the ENTRYTHUNKS -;** segment. - -EntryPoint MACRO name -ENTRYNAMES SEGMENT -_$&name DB '&name',0 -ENTRYNAMES ENDS -ENTRYTHUNKS SEGMENT - PUBLIC &name -&name: call __loadme -ENTRYTHUNKS ENDS -ENTRYTABLE SEGMENT - DD _$&name -ENTRYTABLE ENDS - ENDM - -;** Declare the DLL name here, without an extension. (The DLL loader -;** looks for extensions of .EXE, .DLL, or .OVL.) Follow the name with -;** any function names that the DLL exports (if you will be looking the -;** functions up by name). The names should match those of the -;** entry-point labels defined below, including underscores and @ -;** __stdcall decorations, to prevent accidental calling convention -;** mismatches. -;** -;** Note that dllentry0 and dllentry1 are prototyped as __cdecl functions. - - -__dllname DB 'glide2x',0 - - EntryPoint _GRAADRAWLINE@8 - EntryPoint _GRAADRAWPOINT@4 - EntryPoint _GRAADRAWPOLYGON@12 - EntryPoint _GRAADRAWPOLYGONVERTEXLIST@8 - EntryPoint _GRAADRAWTRIANGLE@24 - EntryPoint _GRALPHABLENDFUNCTION@16 - EntryPoint _GRALPHACOMBINE@20 - EntryPoint _GRALPHACONTROLSITRGBLIGHTING@4 - EntryPoint _GRALPHATESTFUNCTION@4 - EntryPoint _GRALPHATESTREFERENCEVALUE@4 - EntryPoint _GRBUFFERCLEAR@12 - EntryPoint _GRBUFFERNUMPENDING@0 - EntryPoint _GRBUFFERSWAP@4 - EntryPoint _GRCHECKFORROOM@4 - EntryPoint _GRCHROMAKEYMODE@4 - EntryPoint _GRCHROMAKEYVALUE@4 - EntryPoint _GRCLIPWINDOW@16 - EntryPoint _GRCOLORCOMBINE@20 - EntryPoint _GRCOLORMASK@8 - EntryPoint _GRCONSTANTCOLORVALUE4@16 - EntryPoint _GRCONSTANTCOLORVALUE@4 - EntryPoint _GRCULLMODE@4 - EntryPoint _GRDEPTHBIASLEVEL@4 - EntryPoint _GRDEPTHBUFFERFUNCTION@4 - EntryPoint _GRDEPTHBUFFERMODE@4 - EntryPoint _GRDEPTHMASK@4 - EntryPoint _GRDISABLEALLEFFECTS@0 - EntryPoint _GRDITHERMODE@4 - EntryPoint _GRDRAWLINE@8 - EntryPoint _GRDRAWPLANARPOLYGON@12 - EntryPoint _GRDRAWPLANARPOLYGONVERTEXLIST@8 - EntryPoint _GRDRAWPOINT@4 - EntryPoint _GRDRAWPOLYGON@12 - EntryPoint _GRDRAWPOLYGONVERTEXLIST@8 - EntryPoint _GRDRAWTRIANGLE@12 - EntryPoint _GRERRORSETCALLBACK@4 - EntryPoint _GRFOGCOLORVALUE@4 - EntryPoint _GRFOGMODE@4 - EntryPoint _GRFOGTABLE@4 - EntryPoint _GRGAMMACORRECTIONVALUE@4 - EntryPoint _GRGLIDEGETSTATE@4 - EntryPoint _GRGLIDEGETVERSION@4 - EntryPoint _GRGLIDEINIT@0 - EntryPoint _GRGLIDESETSTATE@4 - EntryPoint _GRGLIDESHAMELESSPLUG@4 - EntryPoint _GRGLIDESHUTDOWN@0 - EntryPoint _GRHINTS@8 - EntryPoint _GRLFBCONSTANTALPHA@4 - EntryPoint _GRLFBCONSTANTDEPTH@4 - EntryPoint _GRLFBLOCK@24 - EntryPoint _GRLFBREADREGION@28 - EntryPoint _GRLFBWRITEREGION@32 - EntryPoint _GRLFBUNLOCK@8 - EntryPoint _GRLFBWRITECOLORFORMAT@4 - EntryPoint _GRLFBWRITECOLORSWIZZLE@8 - EntryPoint _GRRENDERBUFFER@4 - EntryPoint _GRRESETTRISTATS@0 - EntryPoint _GRSPLASH@20 - EntryPoint _GRSSTCONFIGPIPELINE@12 - EntryPoint _GRSSTCONTROL@4 - EntryPoint _GRSSTIDLE@0 - EntryPoint _GRSSTISBUSY@0 - EntryPoint _GRSSTORIGIN@4 - EntryPoint _GRSSTPERFSTATS@4 - EntryPoint _GRSSTQUERYBOARDS@4 - EntryPoint _GRSSTQUERYHARDWARE@4 - EntryPoint _GRSSTRESETPERFSTATS@0 - EntryPoint _GRSSTSCREENHEIGHT@0 - EntryPoint _GRSSTSCREENWIDTH@0 - EntryPoint _GRSSTSELECT@4 - EntryPoint _GRSSTSTATUS@0 - EntryPoint _GRSSTVIDEOLINE@0 - EntryPoint _GRSSTVIDMODE@8 - EntryPoint _GRSSTVRETRACEON@0 - EntryPoint _GRSSTWINCLOSE@0 - EntryPoint _GRSSTWINOPEN@28 - EntryPoint _GRTEXCALCMEMREQUIRED@16 - EntryPoint _GRTEXCLAMPMODE@12 - EntryPoint _GRTEXCOMBINE@28 - EntryPoint _GRTEXCOMBINEFUNCTION@8 - EntryPoint _GRTEXDETAILCONTROL@16 - EntryPoint _GRTEXDOWNLOADMIPMAP@16 - EntryPoint _GRTEXDOWNLOADMIPMAPLEVEL@32 - EntryPoint _GRTEXDOWNLOADMIPMAPLEVELPARTIAL@40 - EntryPoint _GRTEXDOWNLOADTABLE@12 - EntryPoint _GRTEXDOWNLOADTABLEPARTIAL@20 - EntryPoint _GRTEXFILTERMODE@12 - EntryPoint _GRTEXLODBIASVALUE@8 - EntryPoint _GRTEXMAXADDRESS@4 - EntryPoint _GRTEXMINADDRESS@4 - EntryPoint _GRTEXMIPMAPMODE@12 - EntryPoint _GRTEXMULTIBASE@8 - EntryPoint _GRTEXMULTIBASEADDRESS@20 - EntryPoint _GRTEXNCCTABLE@8 - EntryPoint _GRTEXSOURCE@16 - EntryPoint _GRTEXTEXTUREMEMREQUIRED@8 - EntryPoint _GRTRISTATS@8 - EntryPoint _GU3DFGETINFO@8 - EntryPoint _GU3DFLOAD@8 - EntryPoint _GUAADRAWTRIANGLEWITHCLIP@12 - EntryPoint _GUALPHASOURCE@4 - EntryPoint _GUCOLORCOMBINEFUNCTION@4 - EntryPoint _GUDRAWPOLYGONVERTEXLISTWITHCLIP@8 - EntryPoint _GUDRAWTRIANGLEWITHCLIP@12 - EntryPoint _GUENCODERLE16@16 - EntryPoint _GUENDIANSWAPBYTES@4 - EntryPoint _GUENDIANSWAPWORDS@4 - EntryPoint _GUFOGGENERATEEXP2@8 - EntryPoint _GUFOGGENERATEEXP@8 - EntryPoint _GUFOGGENERATELINEAR@12 - EntryPoint _GUFOGTABLEINDEXTOW@4 - EntryPoint _GUMOVIESETNAME@4 - EntryPoint _GUMOVIESTART@0 - EntryPoint _GUMOVIESTOP@0 - EntryPoint _GUMPDRAWTRIANGLE@12 - EntryPoint _GUMPINIT@0 - EntryPoint _GUMPTEXCOMBINEFUNCTION@4 - EntryPoint _GUMPTEXSOURCE@8 - EntryPoint _GUTEXALLOCATEMEMORY@60 - EntryPoint _GUTEXCHANGEATTRIBUTES@48 - EntryPoint _GUTEXCOMBINEFUNCTION@8 - EntryPoint _GUTEXCREATECOLORMIPMAP@0 - EntryPoint _GUTEXDOWNLOADMIPMAP@12 - EntryPoint _GUTEXDOWNLOADMIPMAPLEVEL@12 - EntryPoint _GUTEXGETCURRENTMIPMAP@4 - EntryPoint _GUTEXGETMIPMAPINFO@4 - EntryPoint _GUTEXMEMQUERYAVAIL@4 - EntryPoint _GUTEXMEMRESET@0 - EntryPoint _GUTEXSOURCE@4 - EntryPoint _CONVERTANDDOWNLOADRLE@64 - -ENTRYTABLE SEGMENT -__dlltabend LABEL DWORD -__dllcount EQU ((__dlltabend - __dlltab) / 4) -ENTRYTABLE ENDS - -END diff --git a/glide2x/h3/glide/src/gmovie.c b/glide2x/h3/glide/src/gmovie.c deleted file mode 100644 index b4c6c9f..0000000 --- a/glide2x/h3/glide/src/gmovie.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 6 8/30/97 5:59p Tarolli - * cleanups - * - * 5 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 4 5/21/97 6:05a Peter - * - * 3 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -GR_DIENTRY(guMovieStart, void, ( void )) -{ - GrErrorCallback( "guMovieStart: unsupported", FXFALSE ); -} - -GR_DIENTRY(guMovieStop, void, ( void )) -{ - GrErrorCallback( "guMovieStop: unsupported", FXFALSE ); -} - -GR_DIENTRY(guMovieSetName, void, ( const char *name )) -{ - GrErrorCallback( "guMovieSetName: unsupported", FXFALSE ); -} diff --git a/glide2x/h3/glide/src/gpci.c b/glide2x/h3/glide/src/gpci.c deleted file mode 100644 index 2f48ca7..0000000 --- a/glide2x/h3/glide/src/gpci.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:28 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 166 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 165 3/17/99 1:37p Atai -** use grHints to enable/disable uma hack -** -** 164 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 163 3/15/99 10:51p Dow -** Vile Hack -** -** 162 3/13/99 9:48p Dow -** optimizations for B&G -** -** 161 3/12/99 2:31p Dow -** Removed 3DNow for K7 (temp workaround) -** -** 160 3/08/99 6:11p Atai -** report Voodoo3 fbi/tmu rev number as Banshee for EA games -** -** 159 3/06/99 10:59a Atai -** fixed my ·F check-in. -** -** 158 3/05/99 2:50p Atai -** fbi/tmu rev mods -** -** 157 3/04/99 3:15p Atai -** mods for direct write -** -** 156 12/09/98 2:07p Peter -** More Norbert's stuff for the other 3DNow!(tm) partners -** -** 155 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 154 12/03/98 10:34p Dow -** Added GLIDE_FGETENV for floats and removed registry code -** -** 153 12/03/98 12:37p Dow -** Fixed DOS build -** -** 152 12/02/98 2:53p Dow -** NT/9X Registry reading fix -** -** 151 11/19/98 9:53p Jeske -** make sure we look for Voodoo3/avenger also... -** -** 150 11/18/98 7:59p Dow -** grxclk -** -** 149 11/18/98 7:44p Atai -** use env var FX_GLIDE_NUM_TMU -** -** 148 11/17/98 7:04p Atai -** added env var "FX_GLIDE_DISABLE_TMU1" -** -** 147 11/10/98 6:44p Atai -** number of tmu and texture memory allocation -** -** 146 11/09/98 3:32p Mikec -** -** 143 11/05/98 1:55p Atai -** initialize 2nd tmu configs -** -** 142 10/21/98 4:20p Atai -** gamma stuff -** -** 141 10/21/98 10:41a Atai -** -** 140 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 139 10/19/98 2:11p Peter -** ctrisetup happiness -** -** 138 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 137 9/24/98 7:40p Dow -** GL Driver Stuff -** -** 136 9/24/98 12:01p Dow -** Turned on extra unmentionable games -** -** 135 9/21/98 4:00p Dow -** Added to the unmentionable -** -** 134 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 133 8/30/98 11:15a Atai -** added tigerwood 99 to the game list -** -** 132 8/27/98 6:35p Atai -** getenv FX_GLIDE_TMU_MEMSIZE -** -** 131 8/27/98 1:58p Peter -** fill in hwConfig union" -** -** 130 8/26/98 10:08p Atai -** return the correct reg path -** -** 129 8/20/98 10:08a Dow -** Fix for registry GETENV stuff -** -** 128 8/14/98 10:25a Dow -** Fixed hwConfig union effage -** -** 127 7/24/98 2:03p Dow -** AGP Stuff -** -** 126 7/23/98 1:17a Dow -** Bump & Grind -** -** 125 7/18/98 7:24p Mikec -** Made win32 calls invisible to DOS compilation. -** -** 123 7/18/98 5:13p Mikec -** EAhack done. -** -** 122 7/14/98 2:48p Mikec -** Added Glide environment variable FX_GLIDE_EMUL_RUSH allow Banshee glide -** to report itself as Rush to the application. Set it to 1 to enable Rush -** reporting. By default Glide still reports itself as Voodoo Graphics. -** -** 121 7/13/98 5:32p Dow -** GETENV from registry -** -** 120 7/09/98 11:49a Jdt -** Fix fencing for dos build -** -** 119 7/09/98 10:19a Dow -** Registry getenv -** -** 118 7/06/98 7:05p Jdt -** initenvironment simplified -** -** 117 7/06/98 11:06a Mikec -** Added fbiRev offset to distinguish Banshee from Voodoo. -** Banshee check: -** If (hwconfig.SSTs[0].sstBoard.VoodooConfig.fbiRev > 0x1000) -** -** 116 6/24/98 11:16a Dow -** Fixed DLLMAin messages -** -** 115 6/09/98 5:04p Dow -** %$#@! -** -** 114 6/09/98 2:39p Mikec -** -** 113 6/04/98 6:53p Dow -** Resolutions to 1600x1200 -** -** 112 6/03/98 5:23p Dow -** Fixed DOS effage -** -** 111 6/03/98 1:39p Dow -** dll main -** -** 110 5/31/98 9:03a Dow -** 800x600 resolution -** -** 109 5/22/98 2:37p Peter -** complete the lie that is glide2x on Banshee -** -** 108 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 107 5/18/98 3:20p Peter -** pts more resistant to changing rounding modes -** -** 106 5/15/98 2:21p Dow -** Changed from Voodoo Rush to Voodoo -** -** 105 5/12/98 2:42p Dow -** -** 104 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 103 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 102 4/05/98 2:18p Dow -** DOS Glide Stuff -** -** 101 4/03/98 2:11p Dow -** -** 100 3/28/98 11:24a Dow -** itwoç -** -** 99 3/11/98 8:28p Dow -** WinGlide -** -** 97 2/08/98 3:08p Dow -** FIFO Works -** -** 96 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 95 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 93 1/16/98 5:41p Peter - * fixed sense of lod_dither - * - * 92 1/14/98 10:22a Peter - * no more hacks - * - * 91 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 90 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 89 1/07/98 10:22a Peter - * lod dithering env var - * - * 88 12/17/97 10:08a Peter - * fast system comdex twiddling - * - * 87 12/09/97 4:20p Peter - * 0x100 fbiRev ofset for v2 - * - * 86 12/09/97 12:20p Peter - * mac glide port - * - * 85 12/05/97 4:26p Peter - * watcom warnings - * - * 84 12/03/97 2:36p Peter - * upped comdex reset defaults - * - * 83 12/02/97 9:48a Dow - * Removed some spurious code I inadvertantly added. - * - * 82 11/21/97 6:24p Dow - * Banshee Lying about being Rush stuf - * - * 81 11/21/97 11:19a Dow - * Made Banshee report Voodoo2 - * - * 80 11/20/97 6:39p Peter - * - * 79 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 78 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 77 11/15/97 7:43p Peter - * more comdex silliness - * - * 76 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 75 11/14/97 5:02p Peter - * more comdex stuff - * - * 74 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 73 11/12/97 9:54p Peter - * fixed all the effage from new config - * - * 72 11/12/97 9:37p Dow - * Textures on Banshee half work - * - * 71 11/12/97 9:22a Dow - * h3 mods - * - * 70 11/08/97 3:34p Peter - * fixed stupid gdbg_info crasher - * - * 69 11/04/97 4:00p Dow - * Banshee Mods - * - * 68 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 67 11/01/97 12:11p Pgj - * glide.dll ---> glide2x.dll - * - * 66 10/31/97 8:53a Peter - * last lying change, really - * - * 65 10/30/97 3:42p Peter - * protected the last bit of nonsense - * - * 64 10/30/97 3:37p Peter - * spoof sst1 stuff - * - * 63 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 62 10/23/97 5:28p Peter - * sli fifo thing - * - * 61 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 60 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 59 9/05/97 5:29p Peter - * changes for direct hw - * - * 58 9/01/97 3:18p Peter - * correct integer rounding for pts - * - * 57 8/30/97 5:59p Tarolli - * init and hal fixups - * - * 56 8/30/97 1:19p Peter - * first cut at using blit to clear, more to come to do inner rects - * - * 55 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 54 7/30/97 2:42p Peter - * shared and sanitized - * - * 53 7/28/97 2:41p Peter - * turned sli code back on for cvg, but waiting for hal - * - * 52 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 51 7/08/97 2:47p Peter - * fixed merge stupidity from last checkin - * - * 50 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 49 6/24/97 4:02p Peter - * proper cmd fifo placement - * - * 48 6/23/97 4:46p Peter - * fixed my effage - * 47 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree -** -*/ - -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Some macros to prevent RSI */ -#define GC _GlideRoot.GCs[ctx] -#define SST _GlideRoot.hwConfig.SSTs[ctx] - -#define kRevisionOffset 0x1000 - - -#if GLIDE_DISPATCH_SETUP -/* Collection of all of the known procs for a given system */ -static GrTriSetupProc _triSetupProcs[][NUM_TRI_PROC_LISTS][2] = -{ - /* Default Procs */ - { - { _trisetup_Default_Default, _trisetup_Default_cull }, -#if GLIDE_PACKED_RGB - { _trisetup_Default_rgb, _trisetup_Default_cull_rgb }, - { _trisetup_Default_argb, _trisetup_Default_cull_argb }, -#endif /* GLIDE_PACKED_RGB */ - }, -#if GL_AMD3D - /* 3DNow!(tm) Procs */ - { - { _trisetup_3DNow_Default, _trisetup_3DNow_cull }, -#if GLIDE_PACKED_RGB - { _trisetup_3DNow_rgb, _trisetup_3DNow_cull_rgb }, - { _trisetup_3DNow_argb, _trisetup_3DNow_cull_argb }, -#endif /* GLIDE_PACKED_RGB */ - }, -#endif /* GL_AMD3D */ -}; -#endif /* GLIDE_DISPATCH_SETUP */ - -static GrTexDownloadProc _texDownloadProcs[][2][4] = -{ - /* Default Procs */ - { - { - _grTexDownload_Default_8_1, - _grTexDownload_Default_8_2, - _grTexDownload_Default_8_4, - _grTexDownload_Default_8_WideS - }, - { - _grTexDownload_Default_16_1, - _grTexDownload_Default_16_2, - _grTexDownload_Default_16_WideS, - _grTexDownload_Default_16_WideS - } - }, -#if GL_AMD3D - { - { - _grTexDownload_Default_8_1, - _grTexDownload_Default_8_2, - _grTexDownload_Default_8_4, - _grTexDownload_3DNow_MMX, - }, - { - _grTexDownload_Default_16_1, - _grTexDownload_Default_16_2, - _grTexDownload_3DNow_MMX, - _grTexDownload_3DNow_MMX, - }, - } -#endif /* GL_AMD3D */ -}; - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - - -BOOL WINAPI -DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) -{ - switch( ul_reason_for_call ) { - case DLL_PROCESS_DETACH: - GDBG_INFO(80, "DllMain: DLL_PROCESS_DETACH\n"); - grGlideShutdown(); - break; - case DLL_PROCESS_ATTACH: - GDBG_INFO(80, "DllMain: DLL_PROCESS_ATTACH\n"); - break; - case DLL_THREAD_ATTACH: - GDBG_INFO(80, "DllMain: DLL_THREAD_ATTACH\n"); - break; - case DLL_THREAD_DETACH: - GDBG_INFO(80, "DllMain: DLL_THREAD_DETACH\n"); - break; - default: - GDBG_INFO(80, "DllMain: Unhandled message.\n"); - break; - } - - return TRUE; - -} /* DllMain */ - -#define REGSTR_PATH_3DFXSW "Software\\3Dfx Interactive\\Voodoo2" -#define REGSTR_PATH_GLIDE REGSTR_PATH_3DFXSW"\\Glide" - -#if !defined(GLIDE_INIT_HAL) -#ifdef GETENV -#undef GETENV -#endif -#define GETENV(a) hwcGetenv(a) -#endif /* !defined(GLIDE_INIT_HAL) */ - -#endif - -/* Windows */ -#define SEPARATOR '\\' -/* UNIX */ -#define SEPARATOR2 '/' - -/* - * parseFilename - * - * Return the file name portion of a filename/path. - */ - -char * -_parseFilename(char *name) -{ - int i; - - if (name == NULL) - return NULL; - for(i = strlen(name); i >= 0; i--) - if ((name[i] == SEPARATOR) || - (name[i] == SEPARATOR2)) - return (name + i + 1); - return name; -} /* End of parseFilename*/ - - -/*------------------------------------------------------------------- - Function: _grSstDetectResources - Date: -- - Implementor(s): Dow, Gmt, Jdt - Library: Glide - Description: - Discover devices on the PCI bus. - Discover configuration of detected devices. - Initialize all Glide GC's - - Recognized devices depend upon compile time flags - - This code should NOT initialize the hardware - any more than is necessary for discovery of - configuration - - Arguments: none - Return: - FXTRUE - at least one device was detected - FXFALSE - no devices were detected. - -------------------------------------------------------------------*/ -FxBool -_grSstDetectResources(void) -{ - static FxBool calledP = FXFALSE; - FxBool rv = FXFALSE; - FxU32 ctx; - - GDBG_INFO(280, "_grSstDetectResources()\n"); - - if (!calledP) { -#if GLIDE_INIT_HAL - FxU32 count = HAL_MAX_BOARDS; - - /* The first time through the init code we need to map - * all of the boards. Future calls can just grab this - * info out of the halInfo that we have here. - */ - FxU32 device; - const HalInfo* halInfo = fxHalInit(0); - if (halInfo == NULL) goto __errExit; - - for(ctx = device = 0; device < count; device++) { - /* See RSI-prevention macros for usage of [ctx] */ - const FxDeviceInfo* curDev = NULL; - FxBool regInitP = FXFALSE; - SstRegs* devRegs; - - devRegs = fxHalMapBoard(device); - curDev = halInfo->boardInfo + device; - - if (devRegs != NULL) { - FxU32 tmuMem = 0x00; - - SST.type = GR_SSTTYPE_VOODOO; - - if (!fxHalInitRegisters(curDev->virtAddr[0])) goto __errRegFailure; - -#ifdef DIRECT_IO - GC.sstRegs = - (SstRegs *) (curDev->physAddr[0] + 0x200000); - GC.ioRegs = (SstIORegs *) (curDev->physAddr[0]); - GC.cRegs = (SstCRegs *) (curDev->physAddr[0] + 0x80000); - GC.rawLfb = (FxU32 *) curDev->physAddr[1]; -#endif - - /* This device is ready to go. */ - regInitP = FXTRUE; - - GC.reg_ptr = (FxU32*)devRegs; - -#ifdef HAL_HW - /* Set up pointers to the various address spaces within the hw */ - GC.base_ptr = (FxU32*)SST_BASE_ADDRESS(curDev->physAddr[0]); - GC.lfb_ptr = (FxU32*)SST_LFB_ADDRESS(curDev->physAddr[0]); - GC.tex_ptr = (FxU32*)SST_TEX_ADDRESS(curDev->physAddr[0]); -#endif - - - /* Video parameters */ - GC.grSstRez = GR_RESOLUTION_NONE; - GC.grSstRefresh = curDev->fbiVideoRefresh; - - GC.scanline_interleaved = FXFALSE; - - /* Chip configuration */ - GC.num_tmu = curDev->numberTmus; - GC.fbuf_size = curDev->fbiMemSize; - - _GlideRoot.hwConfig.num_sst++; - - /* We claim that we are an sst1 for the sake of Avenger */ - { - const FxU32 curTmuMemSize = 0x2; - -#if 0 - SST.sstBoard.VoodooConfig.fbRam = 2; -#else - SST.sstBoard.VoodooConfig.fbRam = 16; -#endif - - /* Banshee's ID is 0x1000. Always check that it's at least 0x1000 - * for Banshee card. - */ -#if 0 - /* H4 Note: need to setup 2nd tmu configuration */ - SST.sstBoard.VoodooConfig.fbiRev = 2 + 0x1000; - SST.sstBoard.VoodooConfig.nTexelfx = 1; - - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev = (2 + kRevisionOffset); - - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRam = curTmuMemSize; -#else - SST.sstBoard.VoodooConfig.fbiRev = curDev->fbiRevision; - SST.sstBoard.VoodooConfig.nTexelfx = GC.num_tmu; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev = curDev->tmuRevision; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRam = curTmuMemSize; - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRev = curDev->tmuRevision; - - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRam = curTmuMemSize; -#endif - tmuMem += curTmuMemSize; - - /* Clear the tmu state */ - memset(&GC.tmu_state[0], 0, sizeof(GC.tmu_state[0])); - GC.tmu_state[0].total_mem = (curTmuMemSize << 20); - GC.tmu_state[0].ncc_mmids[0] = - GC.tmu_state[0].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - } - - rv = FXTRUE; - ctx++; - } - - __errRegFailure: - /* Either this is not the hw we're expecting, or we could not - * init/map the board for some reason. Either way try to cleanup. - */ - if (!regInitP && (devRegs != NULL)) { - fxHalShutdown(devRegs); - } - } - - /* Done setting up. Don't do the silly mapping thing again. */ -#else /* GLIDE_INIT_HWC */ - /* There's a left brace before the #if */ - hwcBoardInfo - *bInfo; - hwcInfo - *hInfo; /* Info about all the relavent boards */ - - if ((hInfo = hwcInit(0x121a, 0x5)) == NULL) { /* Voodoo3 */ - if ((hInfo = hwcInit(0x121a, 0x3)) == NULL) { /* Banshee */ - goto __errExit; - } - } - - - if (_GlideRoot.environment.emulRush){ - GDBG_INFO(80,"Emulating rush\n"); - } - - /* Iterate through boards found */ - for (ctx = 0; ctx < hInfo->nBoards; ctx++) { - bInfo = &hInfo->boardInfo[ctx]; - - GC.bInfo = bInfo; - - - GDBG_INFO(80, "Board %d, devRev: %d\n", ctx,bInfo->devRev); - - if (!hwcMapBoard(bInfo, HWC_BASE_ADDR_MASK)) { - GrErrorCallback(hwcGetErrorString(), FXTRUE); - } - - if (!hwcInitRegisters(bInfo)) { - GrErrorCallback(hwcGetErrorString(), FXTRUE); - } - - /* NB: We cannot fail to map this board after this point */ - GC.hwInitP = FXTRUE; - - GC.sstRegs = (SstRegs *) bInfo->regInfo.sstBase; - GC.ioRegs = (SstIORegs *) bInfo->regInfo.ioMemBase; - GC.cRegs = (SstCRegs *) bInfo->regInfo.cmdAGPBase; - GC.lfb_ptr = (FxU32 *) bInfo->regInfo.lfbBase; - GC.rawLfb = (FxU32 *) bInfo->regInfo.rawLfbBase; - GC.tex_ptr = (FxU32*)SST_TEX_ADDRESS(bInfo->regInfo.sstBase); - - /* Video Parameters */ - GC.grSstRez = GR_RESOLUTION_NONE; - GC.grSstRefresh = 0L; - - GC.scanline_interleaved = FXFALSE; - - switch (hInfo->boardInfo[ctx].pciInfo.deviceID) { - case 3: /* Banshee */ - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - case 4: /* Avenger low speed */ - /* - ** For 8M board, we may only use one tmu for higher resolution. - ** Need to re-visit the issue. 11/5/98 - */ - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - case 5: /* Avenger high speed */ - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - default: - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - } - if (bInfo->h3Mem == 4) { - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - } - if (GETENV("FX_GLIDE_NUM_TMU")) { - int num_tmu = atoi(GETENV("FX_GLIDE_NUM_TMU")); - switch (num_tmu) { - case 1: - GC.num_tmu = 1; - GC.fbuf_size = (bInfo->h3Mem - 2); - break; - case 2: - GC.num_tmu = 2; - GC.fbuf_size = (bInfo->h3Mem - 4); - break; - } - } - - _GlideRoot.hwConfig.num_sst++; - - { - /* Default to the minimum texture memory taht we will - * advertise for any screen resolution. - */ - const FxU32 curTmuMemSize = 0x2; - int tmu; - - if (_GlideRoot.environment.emulRush) { - SST.type = GR_SSTTYPE_SST96; - SST.sstBoard.SST96Config.fbRam = GC.fbuf_size; - - SST.sstBoard.SST96Config.nTexelfx = GC.num_tmu; - SST.sstBoard.SST96Config.tmuConfig.tmuRev = (2 + kRevisionOffset); - SST.sstBoard.SST96Config.tmuConfig.tmuRam = curTmuMemSize; - } else { - /* Banshee's ID is 0x1000. Always check that it's at least - * 0x1000 for Banshee card. - */ - SST.type = GR_SSTTYPE_VOODOO; - SST.sstBoard.VoodooConfig.fbRam = GC.fbuf_size; - SST.sstBoard.VoodooConfig.fbiRev = 2 + 0x1000; - SST.sstBoard.VoodooConfig.sliDetect = FXFALSE; - - SST.sstBoard.VoodooConfig.nTexelfx = GC.num_tmu; - for (tmu = 0; tmu < GC.num_tmu; tmu++) { - SST.sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev = (2 + kRevisionOffset); - SST.sstBoard.VoodooConfig.tmuConfig[tmu].tmuRam = curTmuMemSize; - } - } - - /* Clear the tmu state */ - for (tmu = 0; tmu < GC.num_tmu; tmu++) { - memset(&GC.tmu_state[tmu], 0, sizeof(GC.tmu_state[tmu])); - GC.tmu_state[tmu].total_mem = (curTmuMemSize << 20); - GC.tmu_state[tmu].ncc_mmids[0] = - GC.tmu_state[tmu].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - } - } - if (hInfo->boardInfo[ctx].pciInfo.deviceID > 3) { - if (_GlideRoot.environment.emulRush) { - SST.sstBoard.SST96Config.tmuConfig.tmuRev |= 0x10000; - } - else { - SST.sstBoard.VoodooConfig.fbiRev |= 0x10000; - SST.sstBoard.VoodooConfig.tmuConfig[0].tmuRev |= 0x10000; - SST.sstBoard.VoodooConfig.tmuConfig[1].tmuRev |= 0x10000; - } - } - - } /* iterate through boards found */ -#endif - } - - /* Did we previously find boards? */ - rv = (_GlideRoot.hwConfig.num_sst != 0); - - calledP = FXTRUE; - - goto __errExit; /* Keep warnings happy */ -__errExit: - ; - return rv; -} /* _grSstDetectResources */ - - -static void -displayBoardInfo(int i, GrHwConfiguration *hwc) -{ - if ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) || - (hwc->SSTs[i].type == GR_SSTTYPE_Voodoo2)) { - int tmuNum; - - GDBG_INFO(80,"SST board %d: 3Dfx Voodoo%s\n", - i, ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) ? " Graphics" : "^2")); - if (hwc->SSTs[i].sstBoard.VoodooConfig.sliDetect) { - GDBG_INFO(80,"\tScanline Interleaved\n"); - } - - GDBG_INFO(80,"\tPixelfx rev 0x%lX with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.VoodooConfig.fbiRev, - hwc->SSTs[i].sstBoard.VoodooConfig.fbRam); - GDBG_INFO(80,"\t%d Texelfx chips:\n", - hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx); - for (tmuNum = 0; - tmuNum < hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx; - tmuNum++) { - GDBG_INFO(80,"\t\tTexelfx %d: Rev 0x%lX, %d MB Texture\n", tmuNum, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRev, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRam); - } - } else if (hwc->SSTs[i].type == GR_SSTTYPE_SST96) { - GDBG_INFO(80,"SST board %d: 3Dfx Voodoo Rush\n", i); - GDBG_INFO(80,"\tFBI Jr. with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.SST96Config.fbRam); - GDBG_INFO(80,"\tTexelfx chips: 1\n"); - } else { - GDBG_INFO(80,"error: SSTs %d: unknown type\n",i); - } -} /* displayBoardInfo */ - - -#if defined( __WATCOMC__ ) -FxU32 p6FenceVar; -#endif - -void -_GlideInitEnvironment(void) -{ -#define FN_NAME "_GlideInitEnvironment" - int i; - const char* envStr; -#if GLIDE_PLATFORM & GLIDE_OS_WIN32 - OSVERSIONINFO ovi; -#endif - - - if (_GlideRoot.initialized) /* only execute once */ - return; - GDBG_INIT(); /* init the GDEBUG libraray */ - GDBG_INFO(80,"%s()\n", FN_NAME); - GDBG_INFO(0,"GLIDE DEBUG LIBRARY\n"); /* unconditional display */ - - if (_GlideRoot.initialized) /* only execute once */ - return; - -#if GLIDE_PLATFORM & GLIDE_OS_WIN32 - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) - _GlideRoot.OSWin95 = 0; - else - _GlideRoot.OSWin95 = 1; -#endif - - GDBG_INFO(80, "%s: OS = %s\n", FN_NAME, _GlideRoot.OSWin95 ? "W9X" : "WNT"); - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { /* GMT: display the DLL pathname for sanity checking */ - char buf[132] = "failed"; - GetModuleFileName(GetModuleHandle("glide3x.dll"), buf, sizeof(buf)); - GDBG_INFO(0,"DLL path: %s\n",buf); - } -#endif - - /* Check for user environment tweaks */ -#define GLIDE_GETENV(__envVar, __defVal) \ - (((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : atol(envStr)); -#define GLIDE_FGETENV(__envVar, __defVal) \ - (((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : (float) atof(envStr)); - - _GlideRoot.environment.triBoundsCheck = - (GETENV("FX_GLIDE_BOUNDS_CHECK") != NULL); - GDBG_INFO(80,"\ttriBoundsCheck: %d\n", - _GlideRoot.environment.triBoundsCheck); - - _GlideRoot.environment.noSplash = - (GETENV("FX_GLIDE_NO_SPLASH") != NULL); - GDBG_INFO(80,"\tnoSplash: %d\n",_GlideRoot.environment.noSplash); - - _GlideRoot.environment.shamelessPlug = - (GETENV("FX_GLIDE_SHAMELESS_PLUG") != NULL); - GDBG_INFO(80,"\tshamelessPlug: %d\n", - _GlideRoot.environment.shamelessPlug); - - _GlideRoot.environment.ignoreReopen = - (GETENV("FX_GLIDE_IGNORE_REOPEN") != NULL); - GDBG_INFO(80,"\tignoreReopen: %d\n", _GlideRoot.environment.ignoreReopen); - - _GlideRoot.environment.disableDitherSub = - (GETENV("FX_GLIDE_NO_DITHER_SUB") != NULL); - GDBG_INFO(80,"\tdisableDitherSub: %d\n", - _GlideRoot.environment.disableDitherSub); - - _GlideRoot.environment.texLodDither = - ((GETENV("FX_GLIDE_LOD_DITHER") == NULL) ? 0x00UL : SST_TLODDITHER); - GDBG_INFO(80,"\ttexLodDither: %d\n",_GlideRoot.environment.texLodDither); - - _GlideRoot.environment.nColorBuffer = - GLIDE_GETENV("FX_GLIDE_ALLOC_COLOR", -1L); - GDBG_INFO(80,"\tnColorBuffer: %d\n",_GlideRoot.environment.nColorBuffer); - - _GlideRoot.environment.tmuMemory = - GLIDE_GETENV("FX_GLIDE_TMU_MEMSIZE", -1L); - GDBG_INFO(80,"\ttmuMemory: %d\n",_GlideRoot.environment.tmuMemory); - - _GlideRoot.environment.nAuxBuffer = - GLIDE_GETENV("FX_GLIDE_ALLOC_AUX", -1L); - GDBG_INFO(80,"\tnAuxBuffer: %d\n",_GlideRoot.environment.nAuxBuffer); - - _GlideRoot.environment.swFifoLWM = - GLIDE_GETENV("FX_GLIDE_LWM", -1L); - GDBG_INFO(80,"\tswFifoLWM: %d\n",_GlideRoot.environment.swFifoLWM); - - _GlideRoot.environment.swapInterval = - GLIDE_GETENV("FX_GLIDE_SWAPINTERVAL", -1L); - GDBG_INFO(80,"\tswapInterval: %d\n",_GlideRoot.environment.swapInterval); - - _GlideRoot.environment.snapshot = GLIDE_GETENV("FX_SNAPSHOT", -1L); - GDBG_INFO(80,"\tsnapshot: %d\n",_GlideRoot.environment.snapshot); - - _GlideRoot.environment.gammaR = GLIDE_FGETENV("SSTH3_RGAMMA", -1.f); - _GlideRoot.environment.gammaG = GLIDE_FGETENV("SSTH3_GGAMMA", -1.f); - _GlideRoot.environment.gammaB = GLIDE_FGETENV("SSTH3_BGAMMA", -1.f); - - _GlideRoot.environment.enUma = 0; - - /* Setup the basic proc tables based on the cpu type. */ - { - _GlideRoot.CPUType = GLIDE_GETENV("FX_CPU", _cpu_detect_asm() ); - GDBG_INFO(80,"\tcpu: %d\n",_GlideRoot.CPUType); - - /* Default case */ -#if GLIDE_DISPATCH_SETUP - _GlideRoot.curTriProcs = _triSetupProcs + 0; -#endif /* GLIDE_DISPATCH_SETUP */ - - _GlideRoot.curTexProcs = _texDownloadProcs + 0; - - /* Check for vendor specific optimization cases */ - switch((_GlideRoot.CPUType & 0xFFFF0000UL) >> 16UL) { - case kCPUVendorIntel: - break; - - case kCPUVendorAMD: - case kCPUVendorCyrix: - case kCPUVendorIDT: - if ((_GlideRoot.CPUType & 0x02UL) == 0x02UL) { /* MMX & 3DNow!(tm) feature bits set */ -#if GLIDE_DISPATCH_SETUP - _GlideRoot.curTriProcs = _triSetupProcs + 1; -#endif /* GLIDE_DISPATCH_SETUP */ - - _GlideRoot.curTexProcs = _texDownloadProcs + 1; - } - break; - - case kCPUVendorUnknown: - default: - break; - } - } - - _GlideRoot.environment.emulRush = (GETENV("FX_GLIDE_EMUL_RUSH") != NULL); - GDBG_INFO(80,"\temulate Rush: %d\n", _GlideRoot.environment.emulRush); - - _GlideRoot.environment.autoBump = (GETENV("FX_GLIDE_BUMP") == NULL); - GDBG_INFO(80, "\tautoBump: %s\n", - _GlideRoot.environment.autoBump ? "FXTRUE" : "FXFALSE"); - - if (GETENV("FX_GLIDE_BUMPSIZE")) - sscanf(GETENV("FX_GLIDE_BUMPSIZE"), "%lx", - &_GlideRoot.environment.bumpSize); - else - _GlideRoot.environment.bumpSize = 0x10000; - GDBG_INFO(80, "\tbumpSize: 0x%x\n", _GlideRoot.environment.bumpSize); - - _GlideRoot.environment.bumpSize >>= 2; /* So we don't have to later */ - - _GlideRoot.environment.grxClk = GLIDE_GETENV("FX_GLIDE_GRXCLK", -1); - - GDBG_INFO(80, "\tGamma R: %1.1f\n", - _GlideRoot.environment.gammaR); - GDBG_INFO(80, "\tGamma G: %1.1f\n", - _GlideRoot.environment.gammaG); - GDBG_INFO(80, "\tGamma B: %1.1f\n", - _GlideRoot.environment.gammaB); - - - /* constant pool */ - _GlideRoot.pool.f0 = 0.0F; - _GlideRoot.pool.fHalf= 0.5F; - _GlideRoot.pool.f1 = 1.0F; - _GlideRoot.pool.f255 = 255.0F; - -#if GLIDE_PACKED_RGB - _GlideRoot.pool.fBiasHi = (float)(0x01 << 15); - _GlideRoot.pool.fBiasLo = (float)(0x01 << 23); -#endif /* GLIDE_PACKED_RGB */ - - _GlideRoot.current_sst = 0; /* make sure there's a valid GC */ - _GlideRoot.curGC = &_GlideRoot.GCs[0]; /* just for 'booting' the library */ - - grErrorSetCallback(_grErrorDefaultCallback); - - if ( !_grSstDetectResources() ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallback( hwcGetErrorString(), FXTRUE ); -#endif - } - - for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - _GlideRoot.GCs[i].mm_table.free_mmid = 0; - displayBoardInfo(i, &_GlideRoot.hwConfig); - } - - _grMipMapInit(); - _GlideRoot.initialized = FXTRUE; /* save this for the end */ -} /* _GlideInitEnvironment */ diff --git a/glide2x/h3/glide/src/gsplash.c b/glide2x/h3/glide/src/gsplash.c deleted file mode 100644 index a6f09b9..0000000 --- a/glide2x/h3/glide/src/gsplash.c +++ /dev/null @@ -1,1012 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 30 2/19/99 5:54p Peter -** new splash screen -** -** 29 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 28 12/03/98 4:45p Atai -** exit grSplash if aux buffer equals zero -** -** 27 8/01/98 3:34p Jeske -** made a special grSplashCb() for Banshee diags, only avail with -** -DDIAG_BUILD -** -** 26 1/30/98 2:07p Peter -** fixed effage -** -** 25 1/28/98 1:13p Peter -** Stupid swap state form gratuitous splash screen - * - * 23 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 21 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 20 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 19 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 18 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 17 11/14/97 5:03p Peter - * picking up the torch... removed #!@#$% c++ comments - * - * 16 10/23/97 5:30p Peter - * packed rgb happiness - * - * 15 7/31/97 11:14a Peter - * merge w/ sst1 glide tree, hopefully - * - * 13 7/07/97 3:05p Dow - * Moved fouled clears - * - * 12 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 11 3/16/97 12:42a Jdt - * Removed watcom warning - * - * 10 3/13/97 10:53p Jdt - * Rewrote with simple optimizations. Changed prototype for - * multi-resolution, and running as a better shameless plug. - * - * 9 3/13/97 2:52a Jdt - * Added arguments to splash. - * - * 8 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 7 3/01/97 6:24p Jdt - * Made splash force yorigin. - * - * 6 1/02/97 1:06p Dow - * Fixed state bug - * - * 3 11/17/96 11:16p Garymct - * Updated grSplash code to set all of the necessary state itself rather - * than expecting the caller to do so. - */ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#if defined( DIAG_BUILD ) || defined( __linux__ ) - -/*----------------------------- - Constants - -----------------------------*/ -#define MAX_NUM_VERTS 2556 - -#define FADEIN_END_PERCENT (0.3f) -#define FADEOUT_BEGIN_PERCENT (0.8f) - -#define SPIN_FRAMES 25 -#define SPIN_START 26 - -#define NO_TABLE ((GrTexTable_t)(~0)) - -/*----------------------------- - Macros - -----------------------------*/ -#define SNAP_BIAS ((float)(3<<18)) -#define SNAP_COORD(X) ((X)+SNAP_BIAS) - -/*----------------------------- - Types - -----------------------------*/ -typedef struct { - float x, y, z; /* object space coordinates */ - float nx, ny, nz; /* object space vertex normal for lighting */ - float s, t; /* pre-glide-ified texture coordinates */ -} Vert; - -typedef struct { - int v[3]; /* vertex indices into array of vertes for face */ - int mat_index; /* material index */ - int aa_edge_flags; -} Face; - -typedef float Vector[3]; -typedef float Matrix[16]; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -/*----------------------------- - Globals - -----------------------------*/ -/* xScale, xOffset, yScale, yOffset */ -static float viewPort[4] = { - 480.0f, 320.0f, - 480.0f, 240.0f -}; - -typedef struct { - GrTexInfo info; - FxU32 addr; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -static int do_phong = 0; -static int pass; -static int fog; -static int useTextures; -static Vector light = { -0.57735f, -0.57735f, -0.57735f }; -static Vector transformed_verts[MAX_NUM_VERTS]; -static Vector transformed_norms[MAX_NUM_VERTS]; - -#include "splshdat.c" - -static Texture textImage; -static Texture hiliteImage; -static Texture shadowImage; - -static FxU32 nextFreeBase; - -/*----------------------------- - Privates - -----------------------------*/ -static void -sourceTexture(Texture *texture) -{ - static Texture *lastTexture; - - if (texture != lastTexture && useTextures) { - grTexSource(GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - if (texture->tableType != NO_TABLE) { -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - grTexDownloadTable(texture->tableType, - &texture->tableData); -#else - grTexDownloadTable(GR_TMU0, - texture->tableType, - &texture->tableData); -#endif - } - lastTexture = texture; - } -} - -static GrTexTable_t -texTableType(GrTextureFormat_t format) -{ - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - - switch(format) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - - return rv; -} - -static void -downloadTexture(Texture *texture, Gu3dfInfo *info) -{ - texture->info.data = info->data; - TEX_INFO(texture->info.,smallLod) = info->header.small_lod; - TEX_INFO(texture->info.,largeLod) = info->header.large_lod; - TEX_INFO(texture->info.,aspectRatio) = info->header.aspect_ratio; - texture->info.format = info->header.format; - - texture->addr = nextFreeBase; - nextFreeBase += grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - grTexDownloadMipMap(GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info); - - texture->tableType = texTableType(info->header.format); - switch(texture->tableType) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - texture->tableData = *(TextureTable*)(&info->table); - break; - default: - break; - } -} - -static void -createTextures(void) -{ - Gu3dfInfo *info; - - /* Download the texture for the "3D" part of the model. */ - info = (Gu3dfInfo*)&text_3dfinfo; - info->data = (void *)text_3dfinfo_image; - - downloadTexture(&textImage, info); - - /* Download the texture for the specular highlight. */ - info = (Gu3dfInfo *)&hilite_3dfinfo; - info->data = (void *)hilite_3dfinfo_image; - downloadTexture(&hiliteImage, info); - - /* Download the texture for the shadow. */ - info = (Gu3dfInfo *)&shadow_3dfinfo; - info->data = (void *)shadow_3dfinfo_image; - downloadTexture(&shadowImage, info); -} - -static void -vecMatMult(float *dstVec, float *srcVec, float *matrix) -{ - dstVec[0] = (srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8] + - matrix[12]); - - dstVec[1] = (srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9] + - matrix[13]); - - dstVec[2] = (srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10] + - matrix[14]); -} - -static void -normMatMult(float *dstVec, float *srcVec, float *matrix) -{ - dstVec[0] = (srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8]); - - dstVec[1] = (srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9]); - - dstVec[2] = (srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10]); -} - -static void -xfAndProj(int frame, int obj) -{ - int vertex; - float *matrix; - - matrix = &mat[frame][obj][0]; - - for(vertex = 0; vertex < num_verts[obj]; vertex++) { - float *srcVec; - float *dstVec; - float oow; - - /* transform point */ - srcVec = (float*)&(vert[obj][vertex].x); - dstVec = (float*)transformed_verts[vertex]; - vecMatMult(dstVec, srcVec, matrix); - - /* project point */ - oow = 1.0f / dstVec[2]; - dstVec[0] = dstVec[0] * oow * viewPort[0] + viewPort[1] + SNAP_BIAS; - dstVec[1] = dstVec[1] * oow * viewPort[2] + viewPort[3] + SNAP_BIAS; - - /* transform normal */ - srcVec = (float*)&(vert[obj][vertex].nx); - dstVec = (float*)transformed_norms[vertex]; - normMatMult(dstVec, srcVec, matrix); - } -} - -static void -setupMaterial(int material_index) -{ - switch(material_index) { - case 0: /* 3d */ - if(pass == 1) { - sourceTexture(&textImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - do_phong = 1; - } else if (pass == 0xbeef) { - /* Pantone 320C - 3D Green */ - grConstantColorValue(0x00989100); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - } else { - sourceTexture(&hiliteImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - } - break; - case 1: /* fx */ - if (pass == 0xbeef) { - /* Black - fx */ - grConstantColorValue(0x00); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - do_phong = 1; - } else { - sourceTexture(&hiliteImage); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - do_phong = 1; - } - break; - case 2: - case 3: - case 4: - grColorCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE); - do_phong = 0; - break; - } -} - -static void -calculateIntensity(int material_index, - Vector intensity_factor, - int frame) -{ - switch(material_index) { - case 0: - /* 3d */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 1: - /* fx */ - intensity_factor[0] = 0.125f; - intensity_factor[1] = 0.125f; - intensity_factor[2] = 0.125f; - break; - case 2: - /* cyan */ - intensity_factor[0] = (10.0f / 255.0f); - intensity_factor[1] = (75.0f / 255.0f); - intensity_factor[2] = (120.0f / 255.0f); - break; - case 3: - /* white */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 4: - /* yellow */ - intensity_factor[0] = (248.0f / 255.0f); - intensity_factor[1] = (204.0f / 255.0f); - intensity_factor[2] = 0.0f; - break; - } -} - -static void -drawFaces(int frame, int objnum) -{ - int facenum; - int material_index; - float intensity_factor[3]; - GrVertex gvert[3]; - static int prev_mat_index = 0xffff; - int i; - FxBool aa_a, aa_b, aa_c; - - for(facenum = 0; facenum < num_faces[objnum]; facenum++) { - material_index = face[objnum][facenum].mat_index; - if(material_index != prev_mat_index) { - setupMaterial(material_index); - calculateIntensity(material_index, - intensity_factor, frame); - prev_mat_index = material_index; - } - - if((material_index != 0) && (pass == 2)) - continue; - - aa_a = aa_b = aa_c = FXFALSE; - if(face[objnum][facenum].aa_edge_flags & 4) - aa_a = FXTRUE; - if(face[objnum][facenum].aa_edge_flags & 2) - aa_b = FXTRUE; - if(face[objnum][facenum].aa_edge_flags & 1) - aa_c = FXTRUE; - - for(i = 0; i < 3; i++) { - float *transformed_vert, *transformed_norm; - Vert *v; - int vertnum; - float factor; - - vertnum = face[objnum][facenum].v[i]; - transformed_vert = transformed_verts[vertnum]; - transformed_norm = transformed_norms[vertnum]; - v = &vert[objnum][vertnum]; - - gvert[i].x = transformed_vert[0]; - gvert[i].y = transformed_vert[1]; - gvert[i].oow = 1.0f / transformed_vert[2]; - gvert[i].tmuvtx[0].oow = gvert[i].oow; - gvert[i].tmuvtx[0].sow = v->s * gvert[i].oow; - gvert[i].tmuvtx[0].tow = v->t * gvert[i].oow; - - factor = ((light[0] * transformed_norm[0] + - light[1] * transformed_norm[1] + - light[2] * transformed_norm[2])+ 1.0f) * 127.5f; - - gvert[i].r = factor * intensity_factor[0]; - gvert[i].g = factor * intensity_factor[1]; - gvert[i].b = factor * intensity_factor[2]; - gvert[i].a = 255.0f; - } - - if(pass == 2) { - for(i = 0; i < 3; i++) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - (128.0f + transformed_norm[0] * 128.0f); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - (128.0f + transformed_norm[1] * 128.0f); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - - grDrawTriangle(&gvert[0], &gvert[1], &gvert[2]); - - continue; - } - - grAlphaBlendFunction(GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO); - /* Do this if 3D. */ - if(material_index == 0) { - /* - * Draw the textured 3D without specular. - */ - sourceTexture(&textImage); -#if 0 - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); -#endif - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } else if(material_index != 1) { - /* - * Just go ahead and draw for things that don't - * have specular highlights. - */ - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } - - if(do_phong && (material_index != 0)) { - /* - * figure out texture coords in [0..255.0f] based on the normal - * the specular highlight. - */ - for(i = 0; i < 3; i++) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - (128.0f + transformed_norm[0] * 128.0f); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - (128.0f + transformed_norm[1] * 128.0f); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - - grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c); - } - } -} - -static void -intersectLineWithZPlane(Vector result, Vector p1, - Vector p2, float z) -{ - float t; - - t = (z - p1[2]) / (p2[2] - p1[2]); - result[0] = p1[0] + (p2[0] - p1[0]) * t; - result[1] = p1[1] + (p2[1] - p1[1]) * t; - result[2] = z; -} - -static float -vectorMag(float *v) -{ - return (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); -} - -static void -drawShadow(int frame, int shadow_object_index, - int receiver_object_index, Vector light_position) -{ - float *shadow_object_matrix; - float *receiver_object_matrix; - Vector view_verts[4]; - Vector projected_view_verts[4]; - int i; - - Vector local_verts[4] = { - { -280.0f, 0.0f, -160.0f }, - { -280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, -160.0f } - }; - - float texcoords[4][2] = { - { 10.5f, 127.5f }, - { 10.5f, 0.5f }, - { 255.0f, 0.5f }, - { 255.0f, 127.5f } - }; - - GrVertex gvert[4]; - GrVertex projected_gvert[4]; - GrVertex light_gvert; - - /* - * The point relative to the back part of the shield that - * the shadow is going to be projected onto. - */ - Vector shadow_light; - - shadow_light[0] = light_position[0]; - shadow_light[1] = light_position[1]; - shadow_light[2] = light_position[2]; - - shadow_object_matrix = &mat[frame][shadow_object_index][0]; - receiver_object_matrix = &mat[frame][receiver_object_index][0]; - - /* - * Offset the light by the Z position of - * the backplane that we are projected - * onto. - */ - shadow_light[2] += receiver_object_matrix[14]; - - for(i = 0; i < 4; i++) { - vecMatMult(view_verts[i], local_verts[i], shadow_object_matrix); - - /* - * project . . . - */ - gvert[i].oow = 1.0f / view_verts[i][2]; - gvert[i].x = - view_verts[i][0] * gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS; - gvert[i].y = - view_verts[i][1] * gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS; - - /* - * Set up texture coordinates. - */ - gvert[i].tmuvtx[0].sow = texcoords[i][0] * gvert[i].oow; - gvert[i].tmuvtx[0].tow = texcoords[i][1] * gvert[i].oow; - } - - - /* - * Intersect each line formed by the light source and a - * particular corner of the shadow object with the - * plane which the texture is to be projected onto. - */ - for(i = 0; i < 4; i++) { - Vector tmpvect; - float q; - -#if GLIDE_PACKED_RGB - /* dpc - 22 oct 1997 - FixMe! - * These are left uninitialized, yet they are being sent to the - * hw, probably because some other state is not being correctly - * setup. This doesn't seem to affect the 'correctness' of the - * splash screen so I'm not investigating it any more. - */ - projected_gvert[i].r = - projected_gvert[i].g = - projected_gvert[i].b = - projected_gvert[i].a = 0.0f; -#endif /* GLIDE_PACKED_RGB */ - - intersectLineWithZPlane(projected_view_verts[i], - shadow_light, - view_verts[i], - receiver_object_matrix[14] - 26.0f); - projected_gvert[i].oow = 1.0f / projected_view_verts[i][2]; - projected_gvert[i].x = (projected_view_verts[i][0] * projected_gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS); - projected_gvert[i].y = (projected_view_verts[i][1] * projected_gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS); - - tmpvect[0] = projected_view_verts[i][0] - shadow_light[0]; - tmpvect[1] = projected_view_verts[i][1] - shadow_light[1]; - tmpvect[2] = projected_view_verts[i][2] - shadow_light[2]; - q = vectorMag(tmpvect); - - /* - * Set up texture coordinates. - */ - projected_gvert[i].tmuvtx[0].oow = projected_gvert[i].oow * q; - projected_gvert[i].tmuvtx[0].sow = texcoords[i][0] * projected_gvert[i].oow; - projected_gvert[i].tmuvtx[0].tow = texcoords[i][1] * projected_gvert[i].oow; - } - - light_gvert.oow = 1.0f / shadow_light[2]; - light_gvert.x = shadow_light[0] * light_gvert.oow * viewPort[0] + viewPort[1] + SNAP_BIAS; - light_gvert.y = shadow_light[1] * light_gvert.oow * viewPort[2] + viewPort[3] + SNAP_BIAS; - - /* - * Draw a segment between the light and the point which hits - * the surface that the light is being projected onto. - */ - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE); - sourceTexture(&shadowImage); - - grAlphaBlendFunction(GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grDrawTriangle(&projected_gvert[0], - &projected_gvert[1], - &projected_gvert[2]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[2], - &projected_gvert[3]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[2], - &projected_gvert[1]); - grDrawTriangle(&projected_gvert[0], - &projected_gvert[3], - &projected_gvert[2]); - - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - -} - -#ifdef __linux__ -FX_ENTRY void FX_CALL -grSplashCb(float x, float y, float width, float height, FxU32 frame, - void (*fn)(int)); -#endif - - -/*------------------------------------------------------------------- - Function: grSplash - Date: 3/13 - Implementor(s): GaryMcT - Library: Glide - Description: - Render the opening splash screen animation, or render - a single frame of the splash screen. - Arguments: - x, y - upper left hand coord of window - w, h - width and height of window to render - _frame - frame number to render (~0 to render all frames) - Return: - none - -------------------------------------------------------------------*/ - -GR_DIENTRY(grSplash,void,(float x,float y,float w,float h,FxU32 _frame)) -{ - grSplashCb(x,y,w,h,_frame,NULL); -} - -GR_DIENTRY(grSplashCb,void,(float x,float y,float w,float h,FxU32 _frame, - void (*callback)(int frame))) -{ - GR_BEGIN_NOFIFOCHECK("grSplash", 85); - GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", - x, y, w, h, _frame); - - { - GrState oldState; - int frame; - Vector lights[] = { - { 5.0f, 300.0f, -1500.0f }, - { 5.0f, 150.0f, -1000.0f }, - { -30.0f, 150.0f, -1000.0f }, - { -30.0f, 100.0f, -1000.0f }, - { 30.0f, 70.0f, -1000.0f }, - }; - GrFog_t fogTable[kInternalFogTableEntryCount]; - int fadeInFrames, fadeOutFrames; - - /* Check Screen Dimensions and Check Avail of Depth Buffer */ - if ((x > gc->state.screen_width) || - ((x+w) > gc->state.screen_width) || - (y > gc->state.screen_height) || - ((y+h) > gc->state.screen_height)) - return; - - if (gc->state.screen_height == 640) { - if (gc->fbuf_size == 1) { - return; - } - } else if (gc->state.screen_width == 800) { - if ((gc->fbuf_size == 1) || - (gc->fbuf_size == 2)) { - return; - } - } - - if (gc->grAuxBuf == 0) return; - - if (!(gc->state.fbi_config.fbzMode & SST_YORIGIN)) { - y = ((gc->state.screen_height - 1.0f) - (h-1.0f)) - y; - } - - viewPort[0] = w * (480.0f / 640.0f); - viewPort[1] = x + (w / 2.0f); - viewPort[2] = h; - viewPort[3] = y + (h / 2.0f); - - grGlideGetState(&oldState); - - grSstOrigin(GR_ORIGIN_LOWER_LEFT); - - if (_frame == 0) { - createTextures(); - useTextures = 1; - } else { - useTextures = 0; - } - - grAlphaTestFunction(GR_CMP_ALWAYS); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue(0xffffffff); - grDepthBufferMode(GR_DEPTHBUFFER_WBUFFER); - grDepthMask(FXTRUE); - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - if (useTextures) - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - else - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXTRUE, FXFALSE); - grTexMipMapMode(GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE); - grTexFilterMode(GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - grDepthBufferFunction(GR_CMP_LEQUAL); - grCullMode(GR_CULL_NEGATIVE); - /* grClipWindow((int)x, (int)y, (int)(x+w), (int)(y+h)); */ - grFogColorValue(0x0); - - fadeInFrames = (int)(((float)total_num_frames) * FADEIN_END_PERCENT); - fadeOutFrames = (int)(((float)total_num_frames) * - (1.0f - FADEOUT_BEGIN_PERCENT)); - - if (_frame == 0) { /* Render Whole Animation */ - for(frame = 1; frame < total_num_frames; frame++) { - int i; - - /* Set Fog Value For This Frame */ - if(frame < fadeInFrames) { - unsigned char fval = (((unsigned char)0xFF) - - ((unsigned char)(255.0f * (float)(frame + 1) / (float)fadeInFrames))); - for(i = 0; i < kInternalFogTableEntryCount; i++) fogTable[i] = fval; - grFogMode(GR_FOG_WITH_TABLE); - grFogTable(fogTable); - fog = 1; - } else if(frame > total_num_frames-fadeOutFrames) { - unsigned char fval = (((unsigned char)0xFF) - - (unsigned char)(255.0f* ((float)(total_num_frames - frame))/ - ((float)fadeOutFrames))); - for(i = 0; i < kInternalFogTableEntryCount; i++) - fogTable[i] = fval; - grFogMode(GR_FOG_WITH_TABLE); - grFogTable(fogTable); - fog = 1; - } else { - grFogMode(GR_FOG_DISABLE); - fog = 0; - } - - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - - pass = 1; - - /* - * Avoid Z-aliasing between the shield and the 3dfx by - * not writing Z for the shield. - */ - - grDepthMask(FXFALSE); - /* cyan part of shield */ - xfAndProj(frame, 2); - drawFaces(frame, 2); - - /* yellow and white part of shield. */ - xfAndProj(frame, 0); - drawFaces(frame, 0); - - /* - * Reanable writes to the depth-buffer. - */ - grDepthMask(FXTRUE); - - /* - * Draw the shadow projected from the 3Dfx logo onto - * the rest of the powershield. - */ - grDepthBufferFunction(GR_CMP_ALWAYS); - grFogMode(GR_FOG_DISABLE); - drawShadow(frame, 1, 0, lights[0]); - if (fog) grFogMode(GR_FOG_WITH_TABLE); /* hack around mp fog */ - grDepthBufferFunction(GR_CMP_LEQUAL); - - /* 3Dfx logo */ - xfAndProj(frame, 1); - drawFaces(frame, 1); - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ONE, GR_BLEND_ZERO); - - pass = 2; - drawFaces(frame, 1); - pass = 1; - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grBufferSwap(2); - if (callback) callback(frame); - } - } else { /* Render One Frame */ - frame = ((_frame>>1) % SPIN_FRAMES)+SPIN_START; - - grColorMask(FXFALSE, FXFALSE); - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - grColorMask(FXTRUE, FXFALSE); - - pass = 0xbeef; - - /* 3Dfx logo */ - xfAndProj(frame, 1); - drawFaces(frame, 1); - } - - /* Get rid of the remnants on teh screen just in case - * the app doesn't do it itself yet - * assumes that the screen is clear. - */ - if (_frame == 0) { - int i; - - for(i = 0; i < gc->grColBuf; i++) { - grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST); - grBufferSwap(0); - } - } - - /* - * Clean up after yourself! - */ - grGlideSetState(&oldState); - } - - GR_END(); -} -#else /* !DIAG_BUILD */ -GR_DIENTRY(grSplash,void,(float x, float y, - float w, float h, - FxU32 frameNumber)) -{ - GR_BEGIN_NOFIFOCHECK("grSplash", 85); - GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", - x, y, w, h, frameNumber); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->pluginInfo.splashProc != NULL) (*gc->pluginInfo.splashProc)(x, y, - w, h, - frameNumber); -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_END(); -} -#endif /* !DIAG_BUILD */ - - diff --git a/glide2x/h3/glide/src/gsst.c b/glide2x/h3/glide/src/gsst.c deleted file mode 100644 index dfd7e5e..0000000 --- a/glide2x/h3/glide/src/gsst.c +++ /dev/null @@ -1,1871 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:28 joseph -** Initial checkin into SourceForge. -** -** -** 4 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 205 3/17/99 5:08p Peter -** removed whacky stuff now that the command fifo threshold stuff appears -** to make all happy (including the k7) -** -** 204 3/17/99 1:22p Dow -** it really should be an assignment -** -** 203 3/17/99 10:54a Dow -** fixed euivalence test for autoBump -** -** 202 3/16/99 11:51a Atai -** Back door (set FX_GLIDE_ENABLE_UMA=1) to enable unified texture memory. -** TMUn memory size will the whole texture memory space. The offset for -** each TMU points to the start address of the memory pool. -** -** 201 3/15/99 10:51p Dow -** Vile Hack -** -** 200 3/13/99 9:48p Dow -** -** 199 3/10/99 6:38p Peter -** removed cruft -** -** 198 3/10/99 10:40a Peter -** bump-n-grind workaround for katmai until the bug is better -** characterized -** -** 197 3/06/99 10:42a Dow -** Added an idle to make sure. -** -** 196 3/05/99 9:01a Atai -** for direct write compilation -** -** 195 3/04/99 5:42p Atai -** cast pointer -** -** 194 3/04/99 3:15p Atai -** mods for direct write -** -** 193 3/03/99 4:44p Peter -** clear chroma range and texChroma for default state -** -** 192 2/27/99 12:24p Dow -** new resolutions -** -** 191 2/26/99 10:27a Peter -** Mmmm.... 8.3 -** -** 190 2/19/99 7:58p Peter -** doh! -** -** 189 2/19/99 7:56p Peter -** load splash plug-in even w/ env var set -** -** 188 2/19/99 5:54p Peter -** new splash screen -** -** 187 2/13/99 1:59p Dow -** Added code for new resolutions -** -** 186 12/21/98 1:47p Atai -** Update gc->swapsPending before we return the status, fixed for the -** games that rely on masking status to get -** buffernumpending. -** -** 185 12/18/98 1:55p Atai -** "SSTV2_GAMMA" is used to update the video/brightness setting. -** -** 184 12/09/98 6:02p Atai -** grTexCombine did the right thing for the un-used TMU. Initialize the -** 2nd TMU value to take care of "set FX_GLIDE_NUM_TMU=1" -** -** 183 12/09/98 5:00p Atai -** set MAXLOD = MINLOD = 8 in _grUpdateParamIndex if ST1 is not used -** -** 182 12/09/98 2:02p Atai -** Added _grTexForceLod back. Set tLOD min = max = 8 for the 2nd TMU by -** default for Avenger to increase single texturing tri fillrate. -** -** 181 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 180 12/03/98 10:37p Dow -** Removed bogus gamma setting in assertDefaultState\nRemoved protoected & -** vestigial Glide3 funcions -** -** 179 11/18/98 8:00p Dow -** grxclk -** -** 178 11/18/98 4:27p Atai -** direct write mods. 2 tmu mode does not work yet -** -** 177 11/14/98 2:00a Lab -** fixed second tmu size -** -** 176 11/10/98 6:44p Atai -** number of tmu and texture memory allocation -** -** 175 11/10/98 4:53p Atai -** fixed gc->tramoffset -** -** 174 11/02/98 5:34p Atai -** merge direct i/o code -** -** 173 10/21/98 4:20p Atai -** gamma stuff -** -** 172 10/21/98 10:41a Atai -** -** 171 10/20/98 5:34p Atai -** added #ifdefs for hwc -** -** 170 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 169 10/13/98 8:44p Dow -** Made it work for 4MB boards -** -** 168 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 167 10/08/98 10:15a Dow -** Triple Buffering fix -** -** 166 9/18/98 10:53a Dow -** VidMode Stuff -** -** 165 9/04/98 11:36a Peter -** re-open fix for nt (thanks to taco/rob/nt bob) -** -** 164 9/02/98 1:34p Peter -** watcom warnings -** -** 163 9/01/98 10:07a Dow -** Fixed Control panel effage -** -** 162 8/28/98 4:38p Atai -** 1. added MIN_FIFO_SIZE for memory checking -** 2. hack for resolution checking if we have 8M board and triple -** buffering on -** -** 161 8/27/98 9:54p Peter -** use gc->frontBuffer rather than 1 -** -** 160 8/27/98 6:36p Atai -** check if environment.tmuMemory is on -** -** 159 8/26/98 10:11p Atai -** set color buffer to 3 if control panel force triple buffering -** -** 158 8/03/98 4:07p Mikec -** Removed glide3 splash screen. -** -** 157 8/03/98 10:45a Atai -** rename 3dfxsplash3.dll to 3dfxspl3.dll -** -** 156 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 155 7/24/98 2:03p Dow -** AGP Stuff -** -** 154 7/23/98 1:17a Dow -** Bump & Grind -** -** 153 7/15/98 2:03p Mikec -** Fixed Lfb depth buffer readback problem. It turns out grWinOpen didn't -** set up the lfb buffer pointer for the aux buffer correctly. -** -** 152 7/06/98 7:05p Jdt -** grSstWinOpen simplified, in-memory buffer logic added -** -** 151 6/26/98 11:09a Jdt -** -** 150 6/26/98 10:08a Jdt -** -** 149 6/25/98 6:49p Jdt -** Removed direct IO write from grSstWinOpen and moved to minihwc -** -** 148 6/24/98 11:16a Dow -** More SST1 Statuws stuff -** -** 147 6/23/98 2:52p Dow -** Added SST1 FIFO status. -** -** 146 6/19/98 2:33p Mikec -** Fixed lfb buffer offset fucakge -** -** 145 6/16/98 6:12p Dow -** Rearranged texture memory -** -** 144 6/12/98 4:20p Dow -** Return FXFALSE from WinOpen if GR_RESOLUTION_NONE is specified. -** -** 143 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 142 6/09/98 7:48p Mikec -** Added buffer clears to grSstWinOpen to get rid of random pixels. -** -** 141 6/05/98 11:22a Jeske -** we never copied the hwc's memory calculation into gc->fbOffset... We -** might need to copy more data than this.. check this... -** -** 140 6/04/98 12:12p Peter -** splash dll rename -** -** 139 5/31/98 9:03a Dow -** 800x600 resolution -** -** 138 5/28/98 1:46p Dow -** Swap Pending Workaround -** -** 137 5/22/98 2:37p Peter -** -** 136 5/21/98 5:27p Peter -** hwcInitVideo failing is fatal for grSstWinOpen -** -** 135 5/13/98 9:12a Dow -** -** 134 5/12/98 2:42p Dow -** -** 133 4/30/98 4:10p Peter -** Fixed comment from before -** -** 132 4/19/98 11:31a Dow -** Fixed grSstStatus -** -** 131 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 130 4/07/98 10:40p Dow -** LFB Fixes: Round 1 -** -** 129 3/28/98 11:24a Dow -** itwoç -** -** 128 3/20/98 1:12p Dow -** Windows happiness -** -** 127 3/16/98 8:47p Dow -** More Windows Happiness -** -** 125 3/03/98 11:31a Dow -** Resolutions now work -** -** 124 2/17/98 12:52p Dow -** fifo setup code -** -** 123 2/09/98 12:27p Dow -** Fixed some niggling hangnails -** -** 122 2/08/98 3:08p Dow -** FIFO Works -** -** 121 2/02/98 4:31p Dow -** IO w/o HAL now possible -** -** 120 1/30/98 1:34p Dow -** Formed call to fxHalInitVideoOverlaySurface -** -** 119 1/29/98 9:54p Dow -** This is Banshee -** -** 118 1/20/98 11:03a Peter -** env var to force triple buffering - * - * 116 1/16/98 4:18p Atai - * fixed lfb and grLoadGammaTable - * - * 115 1/16/98 10:47a Peter - * fixed idle effage - * - * 114 1/16/98 10:16a Atai - * fixed grSstIldle - * - * 113 1/10/98 4:01p Atai - * inititialize vertex layout, viewport, added defines - * - * 110 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 109 1/06/98 3:53p Atai - * remove grHint, modify grLfbWriteRegion and grGet - * - * 107 12/18/97 2:12p Peter - * grSstControl on v2 - * - * 106 12/17/97 4:48p Peter - * groundwork for CrybabyGlide - * - * 105 12/17/97 4:06p Atai - * added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet() - * functions - * - * 104 12/16/97 1:33p Atai - * added grGammaCorrectionRGB() - * - * 103 12/16/97 10:03a Atai - * fixed gutexmemreset for glide2 - * - * 101 12/09/97 12:20p Peter - * mac glide port - * - * 100 12/05/97 4:26p Peter - * watcom warnings - * - * 99 12/03/97 11:35a Peter - * is busy thing - * - * 98 11/25/97 12:09p Peter - * nested calls to grLfbLock vs init code locking on v2 - * - * 97 11/21/97 1:02p Peter - * v^2 supported resolutions - * - * 96 11/21/97 11:19a Dow - * Added RESOLUTION_NONE hack for Banshee - * - * 95 11/19/97 2:49p Peter - * env vars in registry for win32 - * - * 94 11/19/97 2:22p Dow - * gsst.c - * - * 93 11/18/97 4:50p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 92 11/18/97 4:00p Atai - * fixed the GR_BEGIN and GR_END error in previous check-in - * - * 91 11/18/97 3:27p Atai - * update vData - * optimize state monster - * - * 90 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 89 11/16/97 2:20p Peter - * cleanup - * - * 88 11/15/97 7:43p Peter - * more comdex silliness - * - * 87 11/14/97 11:10p Peter - * open vs hw init confusion - * - * 86 11/14/97 5:02p Peter - * more comdex stuff - * - * 85 11/14/97 4:47p Dow - * New splash screen - * - * 84 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 83 11/12/97 9:37p Dow - * Banshee crap - * - * 82 11/12/97 2:27p Peter - * - * 81 11/12/97 1:09p Dow - * H3 Stuf - * - * 80 11/12/97 9:22a Dow - * H3 Mods - * - * 79 11/06/97 3:46p Peter - * sli shutdown problem - * - * 78 11/06/97 3:38p Dow - * More banshee stuff - * - * 77 11/04/97 5:04p Peter - * cataclysm part deux - * - * 76 11/04/97 3:58p Dow - * Banshee stuff - * - * 75 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 74 10/29/97 4:59p Peter - * - * 73 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 72 10/23/97 5:28p Peter - * sli fifo thing - * - * 71 10/17/97 3:15p Peter - * grSstVidMode thingee - * - * 70 10/14/97 2:44p Peter - * moved close flag set - * - * 69 10/09/97 8:02p Dow - * State Monster 1st Cut - * -** -*/ - -#include -#include -#include <3dfx.h> - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#define kPageBoundarySlop 0x1000UL -#define kPageBoundaryMask (kPageBoundarySlop - 1) - - -/* Init hw */ - -typedef struct { - GrScreenResolution_t resolution; - FxU32 xres; - FxU32 yres; -} ResEntry; - -static ResEntry _resTable[] = { - {GR_RESOLUTION_320x200, 320, 200}, /* 0x0 */ - {GR_RESOLUTION_320x240, 320, 240}, /* 0x1 */ - {GR_RESOLUTION_400x256, 400, 256}, /* 0x2 */ - {GR_RESOLUTION_512x384, 512, 384}, /* 0x3 */ - {GR_RESOLUTION_640x200, 640, 200}, /* 0x4 */ - {GR_RESOLUTION_640x350, 640, 350}, /* 0x5 */ - {GR_RESOLUTION_640x400, 640, 400}, /* 0x6 */ - {GR_RESOLUTION_640x480, 640, 480}, /* 0x7 */ - {GR_RESOLUTION_800x600, 800, 600}, /* 0x8 */ - {GR_RESOLUTION_960x720, 960, 720}, /* 0x9 */ - {GR_RESOLUTION_856x480, 856, 480}, /* 0xa */ - {GR_RESOLUTION_512x256, 512, 256}, /* 0xb */ - {GR_RESOLUTION_1024x768, 1024, 768}, /* 0xC */ - {GR_RESOLUTION_1280x1024, 1280, 1024}, /* 0xD */ - {GR_RESOLUTION_1600x1200, 1600, 1200}, /* 0xE */ - {GR_RESOLUTION_400x300, 400, 300}, /* 0xF */ - {GR_RESOLUTION_1152x864, 1152, 864}, /* 0x10 */ - {GR_RESOLUTION_1280x960, 1280, 960}, /* 0x11 */ - {GR_RESOLUTION_1600x1024, 1600, 1024}, /* 0x12 */ - {GR_RESOLUTION_1792x1344, 1792, 1344}, /* 0x13 */ - {GR_RESOLUTION_1856x1392, 1856, 1392}, /* 0x14 */ - {GR_RESOLUTION_1920x1440, 1920, 1440}, /* 0x15 */ - {GR_RESOLUTION_2048x1536, 2048, 1536}, /* 0x16 */ - {GR_RESOLUTION_2048x2048, 2048, 2048 /* 0x17 */} -}; - - -/* --------------------------------------------- - This function both sets and documents the - expected default state for any rendering - context - - ..taco - separated out in preparation for - multiple contexts - ---------------------------------------------*/ -static void -assertDefaultState( void ) -{ -#define FN_NAME "assertDefaultState" - GR_DCL_GC; - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin(gc->state.origin); - grAlphaBlendFunction(GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grAlphaTestFunction(GR_CMP_ALWAYS); - grAlphaTestReferenceValue(0); - grChromakeyMode(GR_CHROMAKEY_DISABLE); - grConstantColorValue((FxU32) ~0); - grClipWindow(0, 0, gc->state.screen_width, - gc->state.screen_height); - _grColorCombineDelta0Mode(FXFALSE); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask(FXTRUE, FXFALSE); - grCullMode(GR_CULL_DISABLE); - grDepthBiasLevel(0); - grDepthMask(FXFALSE); - grDepthBufferMode(GR_DEPTHBUFFER_DISABLE); - grDepthBufferFunction(GR_CMP_LESS); - grDepthBiasLevel(0); - grDitherMode(GR_DITHER_4x4); - grFogMode(GR_FOG_DISABLE); - grFogColorValue(0x00000000); - - /* Get rid of crap in the buffers. */ - grSstIdle(); - if ( gc->state.num_buffers > 1 ) { - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grBufferSwap( 1 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - } else { - grBufferClear( 0, 0, GR_WDEPTHVALUE_FARTHEST ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - } - - guTexMemReset(); - - switch (gc->num_tmu) { - case 2: - grTexClampMode(GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU1, 0, 1, 1.0F); - grTexFilterMode(GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU1, 0.0F); - grTexMipMapMode(GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - case 1: - grTexClampMode(GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP); - grTexDetailControl(GR_TMU0, 0, 1, 1.0F); - grTexFilterMode(GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - grTexLodBiasValue(GR_TMU0, 0.0F); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexCombine(GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE); - } - grLfbConstantAlpha(0xFF); - grLfbConstantDepth(0); - - /* Glide2x does not expose texture chroma or chroma ranges, but - * glide3x does so we need to make sure that those bits are clear by - * default too so that the bits don't remain set by accident. - */ - { - FxI32 i; - - GR_SET_EXPECTED_SIZE(((gc->num_tmu * 2) + 1) * sizeof(FxU32), (gc->num_tmu * 2) + 1); - - GR_SET(BROADCAST_ID, (SstRegs *)gc->reg_ptr, chromaRange, 0x00UL); - - for(i = 0; i < gc->num_tmu; i++) { - GR_SET((0x02UL << i), (SstRegs *)gc->reg_ptr, chromaKey, 0x00UL); - GR_SET((0x02UL << i), (SstRegs *)gc->reg_ptr, chromaRange, 0x00UL); - } - GR_CHECK_SIZE(); - } -#undef FN_NAME -} /* assertDefaultState */ - -static void -doSplash(void) -{ - GR_DCL_GC; - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FxBool - didLoad; - - gc->pluginInfo.moduleHandle = LoadLibrary("3dfxspl2.dll"); - didLoad = (gc->pluginInfo.moduleHandle != NULL); - if (didLoad) { - gc->pluginInfo.initProc = (GrSplashInitProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashInit@24"); - gc->pluginInfo.shutdownProc = (GrSplashShutdownProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashShutdown@0"); - gc->pluginInfo.splashProc = (GrSplashProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplash@20"); - gc->pluginInfo.plugProc = (GrSplashPlugProc)GetProcAddress(gc->pluginInfo.moduleHandle, - "_fxSplashPlug@16"); - - didLoad = ((gc->pluginInfo.initProc != NULL) && - (gc->pluginInfo.splashProc != NULL) && - (gc->pluginInfo.plugProc != NULL) && - (gc->pluginInfo.shutdownProc != NULL)); - if (didLoad) { - didLoad = (*gc->pluginInfo.initProc)(gc->grHwnd, - gc->state.screen_width, gc->state.screen_height, - gc->grColBuf, gc->grAuxBuf, - gc->state.color_format); - if (!didLoad) (*gc->pluginInfo.shutdownProc)(); - } - - if (!didLoad) FreeLibrary(gc->pluginInfo.moduleHandle); - } - - /* Clear all the info if we could not load for some reason */ - if (!didLoad) memset(&gc->pluginInfo, 0, sizeof(gc->pluginInfo)); - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - if (_GlideRoot.environment.noSplash == 0) { - grSplash(0.0f, 0.0f, - (float)gc->state.screen_width, - (float)gc->state.screen_height, - 0); - } - _GlideRoot.environment.noSplash = 1; -} /* doSplash */ - - -/*---------------------------------------------------- - Return a GC to reset state - - ...taco - separated out as a first pass since this will - be common function per context - ----------------------------------------------------*/ -static void initGC ( GrGC *gc ) { - FxI32 t = 0; - - gc->curBuffer = 0; - gc->frontBuffer = 1; - gc->backBuffer = (gc->nColBuffers > 2) ? 2 : gc->curBuffer; - - for (t = 0; t < 7; t++) { - gc->bufferSwaps[t] = 0xffffffff; - } - - gc->bufferSwaps[0] = - (FxU32) gc->cmdTransportInfo.fifoPtr - - (FxU32) gc->cmdTransportInfo.fifoStart; - - gc->swapsPending = 1; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - for (t = 0; t < gc->num_tmu; t += 1) { - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - if ((_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == GR_SSTTYPE_VOODOO) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[t].tmuRev == 0)) { - textureMode = 0; - } - gc->state.tmu_config[t].textureMode = textureMode; - gc->state.tmu_config[t].tLOD = 0x00000000; - gc->state.tmu_config[t].tDetail = 0x00000000; - gc->state.tmu_config[t].texBaseAddr = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[t].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[t].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[t].smallLod = G3_LOD_TRANSLATE(GR_LOD_1); - gc->state.tmu_config[t].largeLod = G3_LOD_TRANSLATE(GR_LOD_1); - gc->state.tmu_config[t].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[t].nccTable = GR_NCCTABLE_NCC0; - } -} /* initGC */ - - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Mutator: dpc - Library: Glide - Description: - - Initialize the selected SST - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer (unsup) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ -#define FN_NAME "grSstWinOpen" -#define TILE_WIDTH_PXLS 64 -#define TILE_HEIGHT_PXLS 32 -#define BYTES_PER_PIXEL 2 -#define MIN_TEXTURE_STORE 0x200000 -#define MIN_FIFO_SIZE 0x10000 -#if defined( GLIDE_INIT_HWC ) - hwcBoardInfo *bInfo = 0; - hwcVidInfo *vInfo = 0; - hwcBufferInfo *bufInfo = 0; - hwcFifoInfo *fInfo = 0; -#elif defined( GLIDE_INIT_HAL ) - FxDeviceInfo devInfo; -#endif /* defined ( GLIDE_INIT_HAL ) */ -#if USE_PACKET_FIFO - int buffer; -#endif - struct cmdTransportInfo *gcFifo = 0; - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE(gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers); - GR_CHECK_F(FN_NAME, !gc, "no SST selected as current (gc==NULL)"); - -#if 1 - /* ??? the eff is this about */ - if ((nColBuffers == 2) && - (nAuxBuffers == 0)) nAuxBuffers = 1; -#endif - -#ifdef GLIDE_INIT_HWC - /* - ** check if the environment variable for triple buffering is on - */ - if (_GlideRoot.environment.nColorBuffer != -1) { - if (_GlideRoot.environment.nColorBuffer > 0 && - _GlideRoot.environment.nColorBuffer <= 3) { - nColBuffers = _GlideRoot.environment.nColorBuffer; - } - } -#endif - - resolution = - (((FxU32)resolution) > (sizeof(_resTable) / sizeof(ResEntry))) - ? GR_RESOLUTION_640x480 - : resolution; - -#ifdef GLIDE_INIT_HWC - /* - ** hack!!! - ** if we have 8M board and triple buffering, reject resolutions greater than 800x600 - */ - if ((nColBuffers == 3) && (gc->bInfo->h3Mem == 8)) { - switch (resolution) { - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_1024x768: - case GR_RESOLUTION_1280x1024: - case GR_RESOLUTION_1600x1200: - GDBG_INFO( gc->myLevel, "Failed to open for insufficient memory\n" ); - GrErrorCallback( "grSstWinOpen: not enough memory for requested buffers", FXFALSE ); - GR_RETURN( FXFALSE ); - break; - default: - break; - } - } -#endif - - gc->state.screen_width = _resTable[resolution].xres; - gc->state.screen_height = _resTable[resolution].yres; - gc->nColBuffers = nColBuffers; - GR_CHECK_F( FN_NAME, resolution != _resTable[resolution].resolution, - "resolution table compilation incorrect" ); - if ( gc->vidTimings ) { - gc->state.screen_width = gc->vidTimings->xDimension; - gc->state.screen_height = gc->vidTimings->yDimension; - } - - gc->state.color_format = format; - gc->state.origin = origin; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - gc->grColBuf = gc->state.num_buffers = nColBuffers; - gc->grAuxBuf = nAuxBuffers; - gc->fbStride = gc->state.screen_width * BYTES_PER_PIXEL; - gc->grHwnd = (int) hWnd; - - /* compute tile dimensions */ - gc->strideInTiles = ( gc->state.screen_width + ( TILE_WIDTH_PXLS - 1 ) ) / TILE_WIDTH_PXLS; - GDBG_INFO(80, "%s: strideInTiles = 0X%x\n", FN_NAME, gc->strideInTiles); - gc->heightInTiles = ( gc->state.screen_height + ( TILE_HEIGHT_PXLS - 1 ) ) / TILE_HEIGHT_PXLS; - GDBG_INFO(80, "%s: heightInTiles = 0x%x\n", FN_NAME, gc->heightInTiles); - gc->bufferStride = gc->strideInTiles * TILE_WIDTH_PXLS * BYTES_PER_PIXEL; - GDBG_INFO(80, "%s: bufferStride = 0x%x\n", FN_NAME, gc->bufferStride); - gc->bufSizeInTiles = gc->strideInTiles * gc->heightInTiles; - GDBG_INFO(80, "%s: bufSizeInTiles = 0x%x\n", FN_NAME, gc->bufSizeInTiles); - gc->bufSize = gc->bufSizeInTiles * TILE_WIDTH_PXLS * TILE_HEIGHT_PXLS * BYTES_PER_PIXEL; - GDBG_INFO(80, "%s: bufSize = 0x%x\n", FN_NAME, gc->bufSize); - - /* Check for enough memory */ -#ifdef GLIDE_INIT_HWC - if ( ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) + MIN_TEXTURE_STORE + MIN_FIFO_SIZE) > - ( gc->bInfo->h3Mem << 20 ) ) { - GDBG_INFO( gc->myLevel, "Failed to open for insufficient memory\n" ); - GrErrorCallback( "grSstWinOpen: not enough memory for requested buffers", FXFALSE ); - GR_RETURN( FXFALSE ); - } -#endif - - /* Allocate Color/Aux Buffers, Set Memory Layout */ - gcFifo = &gc->cmdTransportInfo; - -#if defined( USE_PACKET_FIFO ) -#if defined( GLIDE_INIT_HWC ) - bInfo = gc->bInfo; - vInfo = &bInfo->vidInfo; - bufInfo = &bInfo->buffInfo; - - /* If we closed down then the hw may have been un-mapped (on - * systems that actually support this) so we need to re-map the - * board and re-cache our hw pointers. - */ - if (!gc->hwInitP) { - if (!hwcMapBoard(bInfo, HWC_BASE_ADDR_MASK)) { - GDBG_INFO( gc->myLevel, "Failed to re-map the hw.\n" ); - GrErrorCallback( FN_NAME": Failed to re-map the hw.", FXFALSE ); - GR_RETURN( FXFALSE ); - } - - if (!hwcInitRegisters(bInfo)) { - GDBG_INFO( gc->myLevel, "Failed to re-initialize the hw.\n" ); - GrErrorCallback( FN_NAME": Failed to re-initialize the hw.", FXFALSE ); - GR_RETURN( FXFALSE ); - } - - gc->sstRegs = (SstRegs*)bInfo->regInfo.sstBase; - gc->ioRegs = (SstIORegs*)bInfo->regInfo.ioMemBase; - gc->cRegs = (SstCRegs*)bInfo->regInfo.cmdAGPBase; - gc->lfb_ptr = (FxU32*)bInfo->regInfo.lfbBase; - gc->rawLfb = (FxU32*)bInfo->regInfo.rawLfbBase; - gc->tex_ptr = (FxU32*)SST_TEX_ADDRESS(bInfo->regInfo.sstBase); - } - - vInfo->xRes = gc->state.screen_width; - vInfo->yRes = gc->state.screen_height; - vInfo->refresh = gc->grSstRefresh; - vInfo->tiled = FXTRUE; - vInfo->initialized = FXTRUE; - - if ( hwcAllocBuffers( bInfo, nColBuffers, nAuxBuffers ) == FXFALSE ) { - GDBG_INFO( gc->myLevel, "hwcAllocBuffers failed\n" ); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GR_RETURN( FXFALSE ); - } - - for (buffer = 0; buffer < nColBuffers; buffer++) { - gc->buffers[buffer] = bufInfo->colBuffStart[buffer]; - GDBG_INFO(80, "Buffer %d: Start: 0x%x\n", buffer, gc->buffers[buffer]); - gc->lfbBuffers[buffer] = (FxU32)gc->rawLfb + bufInfo->lfbBuffAddr[buffer]; - } - if (nAuxBuffers != 0) { - gc->buffers[buffer] = bufInfo->auxBuffStart; - gc->lfbBuffers[buffer] = (FxU32)gc->rawLfb + bufInfo->lfbBuffAddr[buffer]; - GDBG_INFO(80, "Aux Buffer: Start: 0x%x\n", gc->buffers[buffer]); - } - - gc->fbOffset = bInfo->fbOffset; - - switch (gc->num_tmu) { - case 2: - if (_GlideRoot.environment.enUma) { - /* - ** hack for Glide2x to enable uma - */ - gc->tramOffset[0] = gc->tramOffset[1] = bInfo->tramOffset; - gc->tramSize[0] = gc->tramSize[1] = bInfo->tramSize; - gc->tmu_state[0].total_mem = gc->tmu_state[1].total_mem = gc->tramSize[0]; - /* disable splash screen in case it uses 2nd tmu the old style */ - _GlideRoot.environment.noSplash = 1; - } - else { - gc->tramOffset[0] = bInfo->tramOffset; - /* - ** if the environment variable is on, use the its texture memory size * 2 - */ - if ((_GlideRoot.environment.tmuMemory != -1) && (gc->fbOffset >= 0x200000)) - bInfo->tramSize = _GlideRoot.environment.tmuMemory << 21; - /* - ** when tmu size is 2, split the texture memory for each tmu - */ - gc->tramSize[0] = bInfo->tramSize >> 1; - gc->tmu_state[0].total_mem = gc->tramSize[0]; - gc->tramOffset[1] = gc->tramOffset[0] + gc->tramSize[0]; - gc->tramSize[1] = bInfo->tramSize >> 1; - gc->tmu_state[1].total_mem = gc->tramSize[1]; - } - break; - case 1: - default: - gc->tramOffset[0] = bInfo->tramOffset; - /* - ** if the environment variable is on, use the its texture memory size - */ - if ((_GlideRoot.environment.tmuMemory != -1) && (gc->fbOffset >= 0x200000)) - bInfo->tramSize = _GlideRoot.environment.tmuMemory << 20; - gc->tramSize[0] = bInfo->tramSize; - gc->tmu_state[0].total_mem = bInfo->tramSize; - break; - } - - vInfo->hWnd = gc->grHwnd; - vInfo->sRes = gc->grSstRez; - vInfo->vRefresh = gc->grSstRefresh; - - /* Overlay hack */ - gc->desktopOverlay=0; - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - gc->desktopOverlay = 1; - } - - if ( hwcInitVideo( bInfo, FXTRUE, gc->vidTimings, FXTRUE ) == FXFALSE ) { - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO( gc->myLevel, "hwcInitVideo failed\n" ); - GR_RETURN( FXFALSE ); - } - - GDBG_INFO(80, FN_NAME ": GammaRGB = %1.2f, %1.2f, %1.2f\n", - _GlideRoot.environment.gammaR, - _GlideRoot.environment.gammaG, - _GlideRoot.environment.gammaB); - - { - /* - ** This is a hack for gamma setting. - */ - char *gammastr; - if ((gammastr = GETENV("SSTV2_GAMMA"))) { - _GlideRoot.environment.gammaR - = _GlideRoot.environment.gammaG - = _GlideRoot.environment.gammaB - = (float)atof(gammastr); - } - } - - if ( - _GlideRoot.environment.gammaR != -1.f && - _GlideRoot.environment.gammaG != -1.f && - _GlideRoot.environment.gammaB != -1.f - ) { - hwcGammaRGB(gc->bInfo, _GlideRoot.environment.gammaR, - _GlideRoot.environment.gammaG, - _GlideRoot.environment.gammaB); - } else { - hwcGammaRGB(gc->bInfo, 1.3f, 1.3f, 1.3f); - } - - if (_GlideRoot.environment.grxClk != -1L) - hwcSetGrxClock(gc->bInfo, _GlideRoot.environment.grxClk); - - if (gc->cmdTransportInfo.autoBump == _GlideRoot.environment.autoBump) { - if (!hwcInitFifo( bInfo, gc->cmdTransportInfo.autoBump)) { - hwcRestoreVideo(bInfo); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO(gc->myLevel, "hwcInitFifo failed\n"); - GR_RETURN(FXFALSE); - } - } else { - if (!hwcInitAGPFifo(bInfo, FXTRUE)) { - hwcRestoreVideo(bInfo); - GrErrorCallback(hwcGetErrorString(), FXFALSE); - GDBG_INFO(gc->myLevel, "hwcInitFifo failed\n"); - GR_RETURN(FXFALSE); - } - - /* Check to see where the command fifo was placed since the agp - * allocation might have failed for some reason, and fallen back - * to using the normal video command fifo. - */ - gc->cmdTransportInfo.autoBump = ((GR_CAGP_GET(baseSize) & SST_CMDFIFO_DISABLE_HOLES) == 0); - } - - /* COMMAND FIFO SETUP */ - fInfo = &gc->bInfo->fifoInfo; - - /* Establish physical bounds of cmd fifo from HWC calculation */ - gcFifo->fifoOffset = fInfo->fifoStart; - gcFifo->fifoSize = fInfo->fifoLength; - -#elif defined( GLIDE_INIT_HAL ) -#if 0 - gc->fbOffset = 0x200000; - gc->tramOffset = 0x0; - gc->tramSize = gc->fbOffset; - gc->tmu_state[0].total_mem = gc->tramSize; -#else - /* gc->fbOffset = (FxU32)fxHalFbiGetMemory((SstRegs*)gc->reg_ptr); */ - gc->fbOffset = (FxU32)gc->rawLfb; - gc->tramOffset[0] = 0x200000; - gc->tramSize[0] = 0x200000; - gc->tramOffset[1] = gc->tramSize[0] + gc->tramOffset[0]; - gc->tramSize[1] = 0x200000; - gc->tmu_state[0].total_mem = gc->tramSize[0]; - gc->tmu_state[1].total_mem = gc->tramSize[1]; -#endif - - for ( buffer = 0; buffer < nColBuffers; buffer++ ) { - gc->buffers[buffer] = gc->fbOffset + buffer * gc->bufSize; - /* XXXjdt: this is never initialized in the old code */ - gc->lfbBuffers[buffer] = 0; - GDBG_INFO(80, "%s: Buffer %d: 0x%x\n", - FN_NAME, buffer, gc->buffers[buffer]); - } - if( !fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo) ) { - GrErrorCallback(" XXXGetDeviceInfo failed.\n", FXFALSE); - GDBG_INFO( gc->myLevel, - " XXXGetDeviceInfo failed. (0x%x)\n", - gc->reg_ptr ); - GR_RETURN( FXFALSE ); - } - - /* COMMAND FIFO SETUP */ -#if 0 - gcFifo->fifoOffset = gc->fbOffset + - ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x400000 - gcFifo->fifoOffset + gc->fbOffset; -#else - gcFifo->fifoOffset = ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x20000; -#endif - - if ( !fxHalInitCmdFifo((SstRegs *) gc->reg_ptr, - 0, /* which fifo - 0 for 3d cmd fifo */ - /* v fifoStart - offset from hw base v */ - gcFifo->fifoOffset, - gcFifo->fifoSize, /* size - in bytes */ - FXTRUE, /* directExec */ - FXFALSE, /* disableHoles */ - FXFALSE) /* agpEnable */ ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallBack( "fxHalInitCmdFifo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitCmdFifo failed\n" ); - GR_RETURN( FXFALSE ); - } - if ( !fxHalInitVideo( (SstRegs*) gc->reg_ptr, - (resolution == GR_RESOLUTION_NONE) ? GR_RESOLUTION_640x480 - : (resolution), - refresh, - NULL ) ) { -#ifdef GLIDE_INIT_HWC - GrErrorCallBack( "fxHalInitVideo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitVideo failed\n" ); - GR_RETURN( FXFALSE ); - } - fxHalInitVideoOverlaySurface( (SstRegs*) gc->reg_ptr, /* SstRegs */ - FXTRUE, /* 1=enable Overlay surface*/ - FXFALSE, /* 1=enable OS stereo, 0=disable*/ - FXFALSE, /* 1=enable horizontal*/ - 0, /* horizontal scale factor (ignored if*/ - FXFALSE, /* 1=enable vertical scaling,*/ - 0, /* vertical scale factor (ignored if not*/ - 0, /* duh*/ - 1, /* 0=OS linear, 1=tiled*/ - SST_OVERLAY_PIXEL_RGB565U, /* pixel format of OS*/ - FXFALSE, /* bypass clut for OS?*/ - FXFALSE, /* 0=lower 256 CLUT entries,*/ - gc->buffers[gc->curBuffer], /* board address of beginning of OS */ - gc->strideInTiles ); /* distance between scanlines of the OS, in*/ -#endif /* defined( GLIDE_INIT_HAL ) */ -#else /* !defined( USE_PACKET_FIFO ) */ - gc->fbOffset = 0x0; - gc->tramOffset[0] = 0x200000; - gc->tramSize[0] = 0x200000; - gc->tramOffset[1] = gc->tramSize[0] + gc->tramOffset[0]; - gc->tramSize[1] = 0x200000; -#if 0 - gc->tmu_state[0].total_mem = gc->tramSize; - gc->fbOffset = 0x200000; - gc->tramOffset = 0x0; - gc->tramSize = gc->fbOffset; - gc->tmu_state[0].total_mem = gc->tramSize; - - for ( buffer = 0; buffer < nColBuffers; buffer++ ) { - gc->buffers[buffer] = gc->fbOffset + buffer * gc->bufSize; - /* XXXjdt: this is never initialized in the old code */ - gc->lfbBuffers[buffer] = 0; - GDBG_INFO(80, "%s: Buffer %d: 0x%x\n", - FN_NAME, buffer, gc->buffers[buffer]); - } -#endif - if( !fxHalGetDeviceInfo((SstRegs*)gc->reg_ptr, &devInfo) ) { - GrErrorCallback(" XXXGetDeviceInfo failed.\n", FXFALSE); - GDBG_INFO( gc->myLevel, - " XXXGetDeviceInfo failed. (0x%x)\n", - gc->reg_ptr ); - GR_RETURN( 0 ); - } -#if 0 - /* COMMAND FIFO SETUP */ - gcFifo->fifoOffset = gc->fbOffset + - ( gc->bufSize * ( gc->grColBuf + gc->grAuxBuf ) ); - gcFifo->fifoSize = 0x400000 - gcFifo->fifoOffset + gc->fbOffset; - - if ( !fxHalInitCmdFifo((SstRegs *) gc->reg_ptr, - 0, /* which fifo - 0 for 3d cmd fifo */ - /* v fifoStart - offset from hw base v */ - gcFifo->fifoOffset, - gcFifo->fifoSize, /* size - in bytes */ - FXTRUE, /* directExec */ - FXFALSE, /* disableHoles */ - FXFALSE) /* agpEnable */ ) { -#ifdef FX_FAIL_HWC - GrErrorCallBack( "fxHalInitCmdFifo failed.\n", FxFALSE ); -#endif - GDBG_INFO( 0, "Error: fxHalInitCmdFifo failed\n" ); - GR_RETURN( 0 ); - } -#endif - if ( !fxHalInitVideo( (SstRegs*) gc->reg_ptr, - (resolution == GR_RESOLUTION_NONE) ? GR_RESOLUTION_640x480 - : (resolution), - refresh, - NULL ) ) { - GR_RETURN( 0 ); - } - fxHalInitVideoOverlaySurface( (SstRegs*) gc->reg_ptr, /* SstRegs */ - FXTRUE, /* 1=enable Overlay surface*/ - FXFALSE, /* 1=enable OS stereo, 0=disable*/ - FXFALSE, /* 1=enable horizontal*/ - 0, /* horizontal scale factor (ignored if*/ - FXFALSE, /* 1=enable vertical scaling,*/ - 0, /* vertical scale factor (ignored if not*/ - 0, /* duh*/ - 1, /* 0=OS linear, 1=tiled*/ - SST_OVERLAY_PIXEL_RGB565U, /* pixel format of OS*/ - FXFALSE, /* bypass clut for OS?*/ - FXFALSE, /* 0=lower 256 CLUT entries,*/ - gc->buffers[gc->curBuffer], /* board address of beginning of OS */ - gc->strideInTiles ); /* distance between scanlines of the OS, in*/ - _grReCacheFifo(0); -#endif /* !defined( USE_PACKET_FIFO ) */ - - /* Compute Virtual FIFO address extents */ -#ifdef GLIDE_INIT_HWC - if (bInfo->fifoInfo.agpFifo) { - gcFifo->fifoStart = (FxU32 *) bInfo->fifoInfo.agpVirtAddr; - gcFifo->fifoOffset = bInfo->fifoInfo.agpPhysAddr; - } else { -#else - { -#endif - gcFifo->fifoStart = gc->rawLfb + ( gcFifo->fifoOffset >> 2 ); - } - gcFifo->fifoEnd = gcFifo->fifoStart + ( gcFifo->fifoSize >> 2 ); - - /* Adjust room values. - ** RoomToEnd needs enough room for the jmp packet since we never - ** allow the hw to auto-wrap. RoomToRead needs to be adjusted so that - ** we never acutally write onto the read ptr. - ** - ** fifoRoom is generally the min of roomToEnd and roomToRead, but we - ** 'know' here that roomToRead < roomToEnd. - */ -#if USE_PACKET_FIFO - gcFifo->roomToEnd = gcFifo->fifoSize - FIFO_END_ADJUST; - gcFifo->fifoRoom = gcFifo->roomToReadPtr = gcFifo->roomToEnd - sizeof( FxU32 ); - - - /* Set initial fifo state. hw read and sw write pointers at - ** start of the fifo. - */ - gcFifo->fifoPtr = gcFifo->fifoStart; - gcFifo->fifoRead = HW_FIFO_PTR( FXTRUE ); -#endif /* !USE_PACKET_FIFO */ - - if ( (void*)gcFifo->fifoPtr != (void*)gcFifo->fifoRead ) { -#ifdef GLIDE_INIT_HWC - hwcRestoreVideo( bInfo ); -#endif - GDBG_INFO( gc->myLevel, "Initial fifo state is incorrect\n" ); - GR_RETURN( FXFALSE ); - } - - if (!gc->cmdTransportInfo.autoBump) { - gcFifo->bumpSize = _GlideRoot.environment.bumpSize; - - gcFifo->lastBump = gcFifo->fifoPtr; - gcFifo->bumpPos = gcFifo->fifoPtr + gcFifo->bumpSize; - - gcFifo->fifoJmpHdr[0] = - ( SSTCP_PKT0_JMP_AGP | - ( gcFifo->fifoOffset << ( SSTCP_PKT0_ADDR_SHIFT - 2 ))); - gcFifo->fifoJmpHdr[1] = (gcFifo->fifoOffset >> 25); - - - } else { - gcFifo->fifoJmpHdr[0] = - ( SSTCP_PKT0_JMP_LOCAL | - ( gcFifo->fifoOffset << ( SSTCP_PKT0_ADDR_SHIFT - 2 ))); - - - } - - - GDBG_INFO(80, - "Command Fifo:\n" - "\tfifoStart: 0x%x\n" - "\tfifoEnd: 0x%x\n" - "\tfifoOffset: 0x%x\n" - "\tfifoSize: 0x%x\n" - "\tfifoPtr: 0x%x\n", - gcFifo->fifoStart, - gcFifo->fifoEnd, - gcFifo->fifoOffset, - gcFifo->fifoSize, - gcFifo->fifoPtr ); - -#if defined( TACO_MEMORY_FIFO_HACK ) - /* XXXTACOHACK!!! - Insert in-memory fifo */ - gcFifo->vFifoStart = calloc( gcFifo->fifoRoom, 1 ); - gcFifo->vFifoEnd = gcFifo->vFifoStart + ( gcFifo->fifoRoom >> 2 ); - gcFifo->fifoPtr = gcFifo->vFifoStart; - if ( gcFifo->fifoPtr == NULL ) { - GDBG_INFO( gc->myLevel, "Couldn't allocate in-memory fifo\n" ); - GR_RETURN(FXFALSE); - } - GDBG_INFO( 0, "Running with whack in-memory fifo.\n" ); -#endif /* defined ( TACO_MEMORY_FIFO_HACK ) */ - - /* The hw is now in a usable state from the fifo macros */ - gc->open = FXTRUE; - - /* Setup the arch dependent texture procs */ - gc->archDispatchProcs.texDownloadProcs = _GlideRoot.curTexProcs; - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO(gc->myLevel, " GC Init\n"); - initGC( gc ); - - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO( gc->myLevel, " 3D State Init\n"); - - GDBG_INFO( gc->myLevel, " Setting default register states\n" ); - gc->state.fbi_config.fbzMode = ( SST_ENRECTCLIP | SST_ENZBIAS ); - - GDBG_INFO( gc->myLevel, " Setting up initial draw buffer state\n" ); - REG_GROUP_BEGIN(BROADCAST_ID, leftOverlayBuf, 1, 0x1); - /* Overlay Hack */ - if (!gc->desktopOverlay) - REG_GROUP_SET(hw, leftOverlayBuf, gc->buffers[gc->frontBuffer]); - else - REG_GROUP_SET(hw, leftOverlayBuf, 0); - REG_GROUP_END(); - - /* Overlay Hack: Set the chroma key to magenta */ - if (gc->desktopOverlay) - { - GR_SET_IO (BROADCAST_ID, hw, vidChromaMin, 0x0000F81F); - GR_SET_IO (BROADCAST_ID, hw, vidChromaMax, 0x0000F81F); - } - - REG_GROUP_BEGIN(BROADCAST_ID, swapbufferCMD, 1, 0x1); - REG_GROUP_SET(hw, swapbufferCMD, 0x0); - REG_GROUP_END(); - -#ifdef GLIDE_INIT_HWC - REG_GROUP_BEGIN(BROADCAST_ID, colBufferAddr, 4, 0xf); - REG_GROUP_SET(hw, colBufferAddr, gc->buffers[gc->curBuffer]); - REG_GROUP_SET(hw, colBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED ); - REG_GROUP_SET(hw, auxBufferAddr, gc->buffers[nColBuffers]); - REG_GROUP_SET(hw, auxBufferStride, gc->strideInTiles | SST_BUFFER_MEMORY_TILED); - REG_GROUP_END(); -#endif - - GDBG_INFO( gc->myLevel, " Setting all Glide state\n" ); - assertDefaultState(); - -#if defined( TACO_MEMORY_FIFO_HACK ) - _FifoFlush(); -#endif /* defined( TACO_MEMORY_FIFO_HACK ) */ - - /* -------------------------------------------------------- - Splash Screen - --------------------------------------------------------*/ - doSplash(); - - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - - GR_RETURN(FXTRUE); -#undef FN_NAME -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - (nosup) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinClose, void, (void)) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose", 80); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - if ((gc != NULL) && (gc->open)) { -#if GLIDE_INIT_HAL - /* dpc - 22 may 1997 - FixMe! - * We need the equivilant stuff in the hal layer too. - */ -#else /* !GLIDE_INIT_HAL */ -#if defined(GLIDE3) && (GLIDE3_ALPHA) - FARPROC oemRestoreVideo; -#endif - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(gc->myLevel, " 3D Idle"); - grSstIdle(); - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(gc->myLevel, " Command Transport Disable"); - - /* Video Restore - * - * NB: The hwcRestoreVideo in addition to restoring the video also - * turns off the command fifo and then releases the hw context - * which can unmap the board at the driver level. The next time - * we use grSstWinOpen we need to re-map the board etc just to be - * safe everywhere. - */ - GDBG_INFO(gc->myLevel, " Restore Video"); - hwcRestoreVideo(gc->bInfo); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - if (gc->oemInit) { - if (oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@0")) - oemRestoreVideo(); - FreeLibrary(gc->oemInit); - } -#endif -#endif /* !GLIDE_INIT_HAL */ - - /* Unmap the board */ - hwcUnmapBoard(gc->bInfo); - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(gc->myLevel, " GC Reset"); - - /* These are really two different things. - * - * hwInitP indicates whether the init code mapping/init sequence - * is active for this hw. - * - * open includes setting up video, command transport, and the - * initial glide state. - */ - gc->hwInitP = FXFALSE; - } - gc->open = FXFALSE; - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, (GrControl_t code)) -{ -#if 0 - GR_DCL_GC; -#define FN_NAME "grSstControl" - GDBG_INFO(41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit); - - if (_GlideRoot.windowsInit && gc->open) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - xRes = initControl(code); - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ >> 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXTRUE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - return initControl(code); -#elif (GLIDE_PLATFORM & GLIDE_HW_CVG) && !GLIDE_INIT_HAL - { - FxBool isValidP = FXTRUE; - FxBool passFlag; - - switch ( code ) { - case GR_CONTROL_DEACTIVATE: - passFlag = FXTRUE; - break; - - case GR_CONTROL_ACTIVATE: - passFlag = FXFALSE; - break; - - default: - isValidP = FXFALSE; - } - - if (isValidP) sst1InitVgaPassCtrl(gc->base_ptr, passFlag); - } -#endif - } - - GDBG_INFO(41, "%s: Returning TRUE\n", FN_NAME); - return FXTRUE; -#undef FN_NAME -#else - return FXTRUE; -#endif -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ -#ifndef GLIDE3_ALPHA -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#define FN_NAME "grSstPerfStats" - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",pStats); - GR_CHECK_F(FN_NAME, !pStats, "NULL pointer"); - - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - - GR_END(); -#undef FN_NAME -} /* grSstPerfStats */ -#endif - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -#if defined(GLIDE3) && (GLIDE3_ALPHA) -void FX_CSTYLE -_grSstResetPerfStats(void) -#else -GR_ENTRY(grSstResetPerfStats, void, (void)) -#endif -{ -#define FN_NAME "grSstResetPerfStats" - GR_BEGIN("grSstResetPerfStats",83,4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - GR_SET(BROADCAST_ID, hw, nopCMD, 1); - GR_END(); -#undef FN_NAME -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -#if defined(GLIDE3) && (GLIDE3_ALPHA) -FxU32 FX_CSTYLE -_grSstStatus(void) -#else -GR_ENTRY(grSstStatus, FxU32, (void)) -#endif -{ -#define FN_NAME "grSstStatus" - FxU32 status; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - - if (!gc->cmdTransportInfo.autoBump) - GR_BUMP_N_GRIND; - - - status = GR_GET(hw->status); - - /* For effed-up stuff */ - status |= (0xffff << 0xc); - - status &= 0xfffffff; /* Clear high nibble */ - - /* OR in buffers pending */ - if (gc->swapsPending) - status |= ((grBufferNumPending() & 0x7) << 28); - - GR_RETURN(status); -#undef FN_NAME -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FxU32 FX_CSTYLE -_grSstVideoLine(void) -#else -GR_ENTRY(grSstVideoLine, FxU32, (void)) -#endif -{ - FxU32 vline = 1; - - return vline; -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FxBool FX_CSTYLE -_grSstVRetraceOn(void) -#else -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -#endif -{ - FxU32 status; - GR_BEGIN_NOFIFOCHECK("grSstVRetraceOn",83); - - status = grSstStatus(); - - return ((status & SST_VRETRACE) == 0); - -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIdle/grFinish -*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grFinish, void, (void)) -#define FN_NAME "grFinish" -#else -GR_ENTRY(grSstIdle, void, (void)) -#define FN_NAME "grSstIdle" -#endif -{ - FxU32 status; - GR_BEGIN_NOFIFOCHECK(FN_NAME, 83); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - gc->counter = gc->expected_counter = 0x0; - -#if GLIDE_DEBUG - { - const FxU32 savedLockCount = gc->cmdTransportInfo.lfbLockCount; - gc->cmdTransportInfo.lfbLockCount = 0; -#endif /* GLIDE_DEBUG */ - - REG_GROUP_BEGIN(BROADCAST_ID, nopCMD, 0x1, 0x1); - REG_GROUP_SET(hw, nopCMD, 0x0); - REG_GROUP_END(); - -#if GLIDE_DEBUG - gc->cmdTransportInfo.lfbLockCount = savedLockCount; - } -#endif /* GLIDE_DEBUG */ - - do { - status = grSstStatus(); - } while (status & SST_BUSY); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ - -/*------------------------------------------------------------------- - Function: grFlush - Date: 09-Jan-98 - Implementor(s): atai - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grFlush, void, (void)) -{ -#define FN_NAME "grFlush" - FxU32 status; - GR_BEGIN("grFlush", 83, 4, 1); - GDBG_INFO_MORE(gc->myLevel,"()\n"); - - GR_SET(BROADCAST_ID, hw, nopCMD, 0x0); - - do { - status = grSstStatus(); - } while (status & SST_BUSY); - - GR_END(); -#undef FN_NAME -} /* grSstIdle */ -#endif - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ - -#if defined(GLIDE3) && defined(GLIDE_ALPHA) -FxBool FX_CSTYLE -grSstIsBusy(void) -#else -GR_ENTRY(grSstIsBusy, FxBool, (void)) -#endif -{ -#define FN_NAME "grSstIsBusy" - static FxBool nopP = FXTRUE; - FxBool busy; - GR_BEGIN_NOFIFOCHECK("grSstIsBusy", 80); - - /* dpc - 22 may 1997 - FixMe! - * Seems like the simplest way to do it, but is this really the way - * to do it? - */ - if (nopP) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_CHECK_SIZE(); - } - -#if defined(GLIDE3) && (GLIDE3_ALPHA) - busy = ((_grSstStatus() & SST_BUSY) != 0); -#else - busy = ((grSstStatus() & SST_BUSY) != 0); -#endif - nopP = !busy; - - GDBG_INFO(84,"grSstIsBusy() => 0x%x\n", busy); - - return busy; -#undef FN_NAME -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gamma)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE(gc->myLevel,"(%g)\n",gamma); - -#if GLIDE_INIT_HAL - fxHalInitGamma(hw, gamma); -#else /* !GLIDE_INIT_HAL */ - - hwcGammaRGB(gc->bInfo, gamma, gamma, gamma); - -#endif /* !GLIDE_INIT_HAL */ - - GR_END(); -} /* grGammaCorrectionValue */ - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_STATE_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin)) -{ -#define FN_NAME "grSstOrigin" - FxU32 fbzMode; - GR_BEGIN_NOFIFOCHECK("grSstOrigin", 83); - GDBG_INFO_MORE(gc->myLevel, "(%d)\n", origin); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - /* dpc - 22 may 1997 - FixMe! - * Do we need to do anything here for the HAL? - */ -#if !GLIDE_INIT_HAL - /* dpc - 5 sep 1997 - FixMe! - * This is the old way. Is there anything else we - * need to do here? - * - * initOrigin(origin); - */ -#endif - - gc->state.fbi_config.fbzMode = fbzMode; - -#if !GLIDE3 - REG_GROUP_BEGIN(BROADCAST_ID, fbzMode, 0x1, 0x1); - REG_GROUP_SET(hw, fbzMode, fbzMode); - REG_GROUP_END(); -#endif - -#undef FN_NAME -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - * CHD: No. - * JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - * if you are talking about SstConfigPipeline, it is evil and must - * be destroyed. :) - * dpc: There is one user that I know of. This 'Nature' demo that Scott just - * gave me. - * chd: It's a stub now. - * (much time elapses) - * chd: But WTF is that forward decl down there? - * dpc: Its to get rid of the damn compiler warning for a function that - * we only sort of export. - */ - - -extern FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, FxU32 reg, FxU32 value); - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, FxU32 reg, FxU32 value)) -{ -} /* grSstConfigPipeline */ - diff --git a/glide2x/h3/glide/src/gsstdef.h b/glide2x/h3/glide/src/gsstdef.h deleted file mode 100644 index a75064c..0000000 --- a/glide2x/h3/glide/src/gsstdef.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 4 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 3 5/21/97 6:05a Peter -** -*/ -#ifndef __GSSTDEF_H__ -#define __GSSTDEF_H__ - - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#include -#endif - -/*----------------- SST chip layout -----------------------*/ -typedef enum -{ - SSTR_STATUS, - SSTR_RESERVED0, - SSTR_VAX, - SSTR_VAY, - SSTR_VBX, - SSTR_VBY, - SSTR_VCX, - SSTR_VCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_R, - SSTR_DRDX, - SSTR_DRDY, - - SSTR_G, - SSTR_DGDX, - SSTR_DGDY, - - SSTR_B, - SSTR_DBDX, - SSTR_DBDY, - - SSTR_Z, - SSTR_DZDX, - SSTR_DZDY, - - SSTR_A, - SSTR_DADX, - SSTR_DADY, - - SSTR_S, - SSTR_DSDX, - SSTR_DSDY, - - SSTR_T, - SSTR_DTDX, - SSTR_DTDY, - - SSTR_W, - SSTR_DWDX, - SSTR_DWDY, -#else - SSTR_R, - SSTR_G, - SSTR_B, - SSTR_Z, - SSTR_A, - SSTR_S, - SSTR_T, - SSTR_W, - - SSTR_DRDX, - SSTR_DGDX, - SSTR_DBDX, - SSTR_DZDX, - SSTR_DADX, - SSTR_DSDX, - SSTR_DTDX, - SSTR_DWDX, - - SSTR_DRDY, - SSTR_DGDY, - SSTR_DBDY, - SSTR_DZDY, - SSTR_DADY, - SSTR_DSDY, - SSTR_DTDY, - SSTR_DWDY, -#endif - SSTR_TRIANGLECMD, - SSTR_RESERVED1, - - SSTR_FVAX, - SSTR_FVAY, - SSTR_FVBX, - SSTR_FVBY, - SSTR_FVCX, - SSTR_FVCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_FR, - SSTR_FDRDX, - SSTR_FDRDY, - - SSTR_FG, - SSTR_FDGDX, - SSTR_FDGDY, - - SSTR_FB, - SSTR_FDBDX, - SSTR_FDBDY, - - SSTR_FZ, - SSTR_FDZDX, - SSTR_FDZDY, - - SSTR_FA, - SSTR_FDADX, - SSTR_FDADY, - - SSTR_FS, - SSTR_FDSDX, - SSTR_FDSDY, - - SSTR_FT, - SSTR_FDTDX, - SSTR_FDTDY, - - SSTR_FW, - SSTR_FDWDX, - SSTR_FDWDY, -#else - SSTR_FR, - SSTR_FG, - SSTR_FB, - SSTR_FZ, - SSTR_FA, - SSTR_FS, - SSTR_FT, - SSTR_FW, - - SSTR_FDRDX, - SSTR_FDGDX, - SSTR_FDBDX, - SSTR_FDZDX, - SSTR_FDADX, - SSTR_FDSDX, - SSTR_FDTDX, - SSTR_FDWDX, - - SSTR_FDRDY, - SSTR_FDGDY, - SSTR_FDBDY, - SSTR_FDZDY, - SSTR_FDADY, - SSTR_FDSDY, - SSTR_FDTDY, - SSTR_FDWDY, -#endif - SSTR_FTRIANGLECMD, - SSTR_FBZCOLORPATH, - SSTR_FOGMODE, - SSTR_ALPHAMODE, - SSTR_FBZMODE, - SSTR_LFBMODE, - SSTR_CLIPLEFTRIGHT, - SSTR_CLIPBOTTOMTOP, - - SSTR_NOPCMD, - SSTR_FASTFILLCMD, - SSTR_SWAPBUFFERCMD, - SSTR_FOGCOLOR, - SSTR_ZACOLOR, - SSTR_CHROMAKEY, - SSTR_RESERVED2, - SSTR_RESERVED3, - - SSTR_STIPPLE, - SSTR_C0, - SSTR_C1, - - SSTR_FBIPIXELSIN, - SSTR_FBICHROMAFAIL, - SSTR_FBIZFUNCFAIL, - SSTR_FBIAFUNCFAIL, - SSTR_FBIPIXELSOUT, - - SSTR_FOGTABLE, - SSTR_RESERVED8 = SSTR_FOGTABLE + 32, - - SSTR_FBIINIT4 = SSTR_RESERVED8 + 8, - SSTR_VRETRACE, - SSTR_BACKPORCH, - SSTR_VIDEODIMENSIONS, - SSTR_FBIINIT0, - SSTR_FBIINIT1, - SSTR_FBIINIT2, - SSTR_FBIINIT3, - - SSTR_HSYNC, - SSTR_VSYNC, - SSTR_CLUTDATA, - SSTR_DACDATA, - SSTR_MAX_RGB_DELTA, - SSTR_RESERVED51, - - SSTR_TEXTUREMODE = SSTR_RESERVED51 + 51, - SSTR_TLOD, - SSTR_TDETAIL, - SSTR_TEXBASEADDR, - SSTR_TEXBASEADDR1, - SSTR_TEXBASEADDR2, - SSTR_TEXBASEADDR38, - SSTR_TEXINIT0, - SSTR_TEXINIT1, - - SSTR_NCCTABLE0, - SSTR_NCCTABLE1 = SSTR_NCCTABLE0 + 12, - SSTR_END_OF_REGISTER_SET -} GrSstRegister; - -#endif /* __GSSTDEF_H__ */ diff --git a/glide2x/h3/glide/src/gstrip.c b/glide2x/h3/glide/src/gstrip.c deleted file mode 100644 index bbfeb84..0000000 --- a/glide2x/h3/glide/src/gstrip.c +++ /dev/null @@ -1,308 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 21 12/03/98 11:27p Dow -** Code 'cleanup' heç - * - * 19 12/12/97 12:43p Atai - * move i and dateElem into the set up loop - * - * 17 12/08/97 10:38a Atai - * added grDrawVertexArrayLinear() - * - * 16 11/21/97 6:05p Atai - * use one datalist (tsuDataList) in glide3 - * - * 15 11/06/97 6:10p Atai - * update GrState size - * rename grDrawArray to grDrawVertexArray - * update _grDrawPoint and _grDrawVertexList - * - * 14 11/04/97 6:35p Atai - * 1. sync with data structure changes - * 2. break up aa triangle routine - * - * 13 11/04/97 4:57p Atai - * use byte offset - * - * 12 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 11 10/17/97 2:11p Atai - * added grContinueArray. We only support non aa mode for now. - * - * 10 10/16/97 1:50p Atai - * fix drawarray bugs - * - * 9 10/14/97 6:16p Atai - * reverse triangle order in _grAADrawVertexList - * - * 8 10/14/97 5:41p Atai - * added _grAADrawVertexList() - * - * 7 10/14/97 4:57p Dow - * Clamping - * - * 6 10/09/97 8:02p Dow - * State Monster 1st Cut - * - * 5 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 4 9/29/97 1:26p Dow - * Fixed packed color strips/fans - * - * 3 9/26/97 10:24a Dow - * Fixed state effage in Glide3 parameter data - * - * 2 9/23/97 2:35p Dow - * One less loop - * - * 1 9/23/97 2:04p Dow - * DD code for strips -** -*/ -#ifdef GLIDE3 -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*------------------------------------------------------------------- - Function: _grDrawVertexList - Date: 18-Sep-97 - Implementor(s): dow - Description: - Sends a triangle strip to CVG. - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grDrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grDrawVertexList" - - /* - ** simplified code - */ - FxU32 - vNum = 0, - vSize; - float - **lPtrs = (float **) pointers; - FxI32 stride = mode; - FxU32 - sCount = count, set = 0, pktype = SSTCP_PKT3_BDDDDD; - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - - GDBG_INFO_MORE(gc->myLevel, "(type = 0x%x, count = %d, pointers = 0x%x)\n", - type, count, pointers); - - GR_FLUSH_STATE(); - - vSize = gc->state.vData.vSize; - if (stride == 0) - stride = gc->state.vData.vStride; - - /* Draw the first (or possibly only) set. This is necessary because - the packet is 3_BDDDDDD, and in the next set, the packet is - 3_DDDDDD */ - /* - ** We try to make tstrip code simple to read. We combine the original code - ** into a single loop by adding an extra packet type assignment at the end of the loop. - ** Also, the debugging code are removed temporarily. - */ - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) { - while (count > 0) { - FxI32 k, vcount = count >= 15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * vSize, 1); - TRI_STRIP_BEGIN(type, vcount, vSize, pktype); - /* - ** If we use a while loop, the compiler will increment vNum and store the value back - ** to the memory at every loop. In a for loop, vNum data are kept in a register. - ** After the loop complete, the vNum data are written back to memory. - */ - for (k = 0; k < vcount; k++) { - FxU32 i, dataElem; - float *vPtr; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - (float *)pointers += stride; - - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)); - dataElem = 0; - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)); - i = gc->tsuDataList[dataElem]; - while (i != GR_DLIST_END) { - TRI_SETF(FARRAY(vPtr, i)); - dataElem++; - i = gc->tsuDataList[dataElem]; - } - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - pktype = SSTCP_PKT3_DDDDDD; - } - } - else { - /* - * first cut of clip space coordinate code, no optimization. - */ - float oow; - - while (count > 0) { - FxI32 k, vcount = count >= 15 ? 15 : count; - GR_SET_EXPECTED_SIZE(vcount * vSize, 1); - TRI_STRIP_BEGIN(type, vcount, vSize, pktype); - for (k = 0; k < vcount; k++) { - float *vPtr; - - vPtr = pointers; - if (mode) - vPtr = *(float **)vPtr; - oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset); - /* x, y */ - TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2) - *oow*gc->state.Viewport.hwidth + gc->state.Viewport.ox); - TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2) - *oow*gc->state.Viewport.hheight + gc->state.Viewport.oy); - (float *)pointers += stride; - - TRI_VP_SETFS(vPtr, oow); - } - TRI_END; - GR_CHECK_SIZE(); - count -= 15; - pktype = SSTCP_PKT3_DDDDDD; - } - } - -#undef FN_NAME -} /* _grDrawVertexList */ - -/*------------------------------------------------------------------- - Function: _grAADrawVertexList - Date: 14-Oct-97 - Implementor(s): atai - Description: - Sends an aa triangle strip/fan to CVG. - Arguments: - - Return: - -------------------------------------------------------------------*/ -void FX_CSTYLE -_grAADrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers) -{ -#define FN_NAME "_grAADrawVertexList" - - GR_DCL_GC; - FxU32 vNum = 0; - FxU32 sCount = count; - float - **lPtrs = (float **) pointers; - float *v[3]; - FxBool flip = FXFALSE; - FxU32 fbzModeOld; /* Squirrel away current fbzMode */ - FxI32 stride = mode; - - if (sCount <= 2) return; - - _grDrawVertexList(type, mode, count, pointers); - - fbzModeOld = gc->state.fbi_config.fbzMode; - gc->state.fbi_config.fbzMode &= ~(SST_ZAWRMASK); - /* gc->state.invalid |= fbzModeBIT; */ - GR_FLUSH_STATE(); - if (stride == 0) - stride = gc->state.vData.vStride; - - sCount-=2; - if (type == kSetupFan) { - v[0] = (mode == 0) ? pointers : *(float **)pointers; - while (sCount--) { - (float *)pointers += stride; - if (mode) { - v[1] = *(float **)pointers; - v[2] = *((float **)pointers+1); - } else { - v[1] = pointers; - v[2] = (float *)pointers+stride; - } - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(1, type, 3, v); - else - _grAAVpDrawTriangles(1, type, 3, v); - } - } - else if (type == kSetupStrip){ - while (sCount--) { - if (flip) { - if (mode) { - v[0] = *((float **)pointers+1); - v[1] = *(float **)pointers; - v[2] = *((float **)pointers+2); - } else { - v[0] = (float *)pointers+stride; - v[1] = pointers; - v[2] = (float *)pointers+(stride<<1); - } - } - else { - if (mode) { - v[0] = *(float **)pointers; - v[1] = *((float **)pointers+1); - v[2] = *((float **)pointers+2); - } else { - v[0] = pointers; - v[1] = (float *)pointers+stride; - v[2] = (float *)pointers+(stride<<1); - } - } - if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) - _grAADrawTriangles(1, type, 3, v); - else - _grAAVpDrawTriangles(1, type, 3, v); - (float *)pointers += stride; - flip = ~flip; - } - flip = ~flip; - } - - gc->state.fbi_config.fbzMode = fbzModeOld; - gc->state.invalid |= fbzModeBIT; - GR_FLUSH_STATE(); - -#undef FN_NAME -} /* _grAADrawVertexList */ - -#endif diff --git a/glide2x/h3/glide/src/gtex.c b/glide2x/h3/glide/src/gtex.c deleted file mode 100644 index 84175b0..0000000 --- a/glide2x/h3/glide/src/gtex.c +++ /dev/null @@ -1,1216 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:28 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 49 3/08/99 12:20p Peter -** removed unnecessary nop's -** -** 48 3/02/99 2:22p Peter -** 2d nop flushes (although 3d nop should too) -** -** 47 2/19/99 10:15a Peter -** multi-base sourcing -** -** 46 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 45 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 44 12/09/98 4:44p Atai -** fixed debug build -** -** 42 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 41 8/12/98 4:25p Peter -** fixed sense of trilinear fixup -** -** 40 6/24/98 10:55a Peter -** gary's trilinear hell bug -** -** 39 5/18/98 3:20p Peter -** crybaby warning for grTexCombine about different lod based factors -** -** 38 5/07/98 4:13p Peter -** lbe texture thing -** -** 37 4/16/98 3:58p Peter -** 1x1 lod fix, sorry John -** -** 36 4/14/98 6:41p Peter -** Merge w/ cvg glide cleanup -** -** 35 3/28/98 11:24a Dow -** itwoç - * - * 32 1/13/98 12:42p Atai - * fixed grtexinfo, grVertexLayout, and draw triangle - * - * 31 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 30 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 29 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 28 1/07/98 10:22a Peter - * lod dithering env var - * - * 27 1/05/98 6:06p Atai - * glide extension stuff - * - * 26 12/18/97 10:52a Atai - * fixed grGet(GR_VIDEO_POS) - * - * 25 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 24 12/11/97 4:15p Peter - * fixed assertions - * - * 23 12/05/97 4:26p Peter - * watcom warnings - * - * 22 11/20/97 6:57p Dow - * baseaddress for banshee - * - * 21 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 20 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 19 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 18 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 17 9/05/97 12:31p Peter - * more reg write grouping - * - * 16 7/08/97 2:48p Peter - * - * 15 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 14 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 13 5/21/97 6:05a Peter - * - * 12 3/04/97 9:08p Dow - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must be called after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - * - * FixMe: This should eventually get merged in w/ the texture - * statemonster. When/If that ever happens. - */ -static void -_grTexCheckTriLinear(GrChipID_t tmu) -{ -#define FN_NAME "_grTexCheckTriLinear" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 90); - GDBG_INFO_MORE(gc->myLevel, "(0x%X)\n", tmu); - -#if (GLIDE_NUM_TMU > 2) -#error "(GLIDE_NUM_TMU > 2): Write this code" -#endif - -/* NB: The factor mask needs to include the factor bits as - * well as the reverse bit so that we can differentiate - * between the lodfrac and the (1 - lodfrac) case. - */ -#define SST_TC_FACTOR_MASK (SST_TC_MSELECT | SST_TC_REVERSE_BLEND) - -#define SST_MIPMAP_LEVEL_MASK (SST_LOD_ODD | SST_LOD_TSPLIT) - - /* Is this tmu on? */ - if (!gc->tmuLodDisable[tmu]) { - const struct tmu_config_t* tmu0 = gc->state.tmu_config; - const struct tmu_config_t* tmu1 = gc->state.tmu_config + 1; - const struct tmu_config_t* curTmu = gc->state.tmu_config + tmu; - const struct tmu_config_t* otherTmu = gc->state.tmu_config + !tmu; - - /* This is the 'tricky' state where we have to manage the states - * of teh tmu's together to get the correct effect. Within this - * state there are two sub-states: two-pass trilinear and single - * pass using both tmu's w/ split levels. - * - * Case 1 - TMU set for lod blending and has both even/odd levels - */ - if (((curTmu->textureMode & SST_TRILINEAR) == SST_TRILINEAR) && - (curTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH)) { - - /* Check the 'other' tmu to see if it is active, if not then we - * are doing two pass trilinear so check that we have the - * correct even/odd things set based on the factor where one - * pass will use GR_COMBINE_FACTOR_LOD_FRACTION and the other - * will use (1 - GR_COMBINE_FACTOR_LOD_FRACTION). - */ - if (gc->tmuLodDisable[!tmu]) { - /* NB: In this case the rgb/alpha factors need to match so - * checking for only one of them is fine. - */ - const FxU32 levelMask = (((curTmu->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - - GDBG_INFO(gc->myLevel, FN_NAME": Two-pass trilinear fixup (0x%X) : tLOD : (0x%X : 0x%X)\n", - tmu, curTmu->tLOD, ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((curTmu->tLOD & ~SST_MIPMAP_LEVEL_MASK) | levelMask)); - GR_CHECK_SIZE(); - } else { - /* One pass trilinear - * - * Make sure that the tmu's have the levels split across the - * two tmu's. There are basically three cases based on what - * the user might have already set on the other tmu. - */ - if (((tmu0->textureMode & SST_TC_BLEND) == SST_TC_BLEND) && - ((tmu1->textureMode & SST_TC_REPLACE) == SST_TC_REPLACE)) { - FxU32 evenOdd[GLIDE_NUM_TMU]; - FxU32* curEvenOdd = evenOdd + tmu; - - { - FxU32 i; - - for(i = 0; i < GLIDE_NUM_TMU; i++) { - evenOdd[i] = gc->state.tmu_config[i].tLOD & SST_LOD_ODD; - } - } - - /* 1 - The other tmu already has the even levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_EVEN) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_ODD)) { - *curEvenOdd = SST_LOD_ODD; - goto __tmuRegUpdate; - } - - /* 2 - The other tmu already has the odd levels. */ - if ((otherTmu->evenOdd == GR_MIPMAPLEVELMASK_ODD) && - (curTmu->evenOdd != GR_MIPMAPLEVELMASK_EVEN)) { - *curEvenOdd = 0; - goto __tmuRegUpdate; - } - - /* 3 - The other tmu already has both the levels. If the - * downstream tmu's factor is lodFrac then the upstream tmu - * needs to be (1 - lodFrac) and vice-versa. - */ - if (otherTmu->evenOdd == GR_MIPMAPLEVELMASK_BOTH) { - evenOdd[0] = (((tmu0->textureMode & SST_TC_FACTOR_MASK) == SST_TC_MLODFRAC) - ? SST_LOD_ODD - : 0); - evenOdd[1] = ~evenOdd[0] & SST_LOD_ODD; - - goto __tmuRegUpdate; - } - - /* Do the register updates */ - if (0) { - __tmuRegUpdate: - GDBG_INFO(gc->myLevel, FN_NAME": Tri-linear fixup (0x%X : 0x%X) : (0x%X : 0x%X)\n", - tmu0->tLOD, tmu1->tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0]), - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - - GR_SET_EXPECTED_SIZE((sizeof(FxU32) << 1), 2); - { - GR_SET(eChipTMU0, SST_TMU(hw, 0), tLOD, - ((tmu0->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[0])); - GR_SET(eChipTMU1, SST_TMU(hw, 1), tLOD, - ((tmu1->tLOD & ~SST_MIPMAP_LEVEL_MASK) | evenOdd[1])); - } - GR_CHECK_SIZE(); - } - } - } - } - } - - GR_END(); -#undef FN_NAME -} - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ -GR_ENTRY(grTexClampMode, void, - (GrChipID_t tmu, GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode)) -{ -#define FN_NAME "grTexClampMode" - FxU32 texturemode; - FxU32 clampMode =((s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)); - - GR_BEGIN("grTexClampMode",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode); - GR_CHECK_TMU(FN_NAME, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCLAMPS | SST_TCLAMPT); - texturemode |= clampMode; - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texturemode); - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -#undef FN_NAME -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ -GR_ENTRY(grTexCombine, void, - (GrChipID_t tmu, - GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, - FxBool rgb_invert, FxBool alpha_invert)) -{ -#define FN_NAME "grTexCombine" - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - FxBool localColorP = FXFALSE; - FxBool localAlphaP = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grTexCombine", 88); - GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_W(FN_NAME, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function"); - GR_CHECK_W(FN_NAME, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function"); - GR_CHECK_W(FN_NAME, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor"); - GR_CHECK_W(FN_NAME, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor"); - - GR_CHECK_COMPATABILITY(FN_NAME, - (rgb_factor != alpha_factor) && - (((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((rgb_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)) && - (((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_DETAIL_FACTOR) || - ((alpha_factor & 0x07UL) == GR_COMBINE_FACTOR_LOD_FRACTION)), - "Incompatible texture combine factors (rgb vs alpha) based on lod"); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - * the ccFunc requires texture mapping - */ - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= (rgb_factor & 0x7) << SST_TC_MSELECT_SHIFT; - if (!(rgb_factor & 0x8)) texturemode |= SST_TC_REVERSE_BLEND; - if (((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((rgb_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - texturemode |= (alpha_factor & 0x7) << SST_TCA_MSELECT_SHIFT; - if (!(alpha_factor & 0x8)) texturemode |= SST_TCA_REVERSE_BLEND; - if (((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL) || - ((alpha_factor & 0x7) == GR_COMBINE_FACTOR_LOCAL_ALPHA)) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - if (rgb_invert) texturemode |= SST_TC_INVERT_OUTPUT; - if (alpha_invert) texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch (rgb_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localColorP = ((rgb_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - switch (alpha_function) { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = FXTRUE; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - localAlphaP = ((alpha_factor & 0x07UL) != GR_COMBINE_FACTOR_OTHER_ALPHA); - break; - } - - /* Hack to enable TWO-PASS Trilinear */ - if (texturemode & SST_TRILINEAR) { - if ((texturemode & SST_TC_ZERO_OTHER) && - (texturemode & SST_TC_BLEND_LODFRAC) && - !(texturemode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* Update shadows */ - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - -#if 1 - /* If the state of a tmu changes from active then make sure that it - * is addressing some valid tiny texture so taht it does not spend - * time thrashing on a large texture access. - * - * NB: We don't update the shadow here so the other bits in the - * register shadow should be unchanged. - */ - { - const FxI32 upstreamTmu = tmu + 1; - - if (upstreamTmu < gc->num_tmu) { - if (localColorP && localAlphaP) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1)); - GR_CHECK_SIZE(); - - gc->tmuLodDisable[upstreamTmu] = FXTRUE; - - GDBG_INFO(gc->myLevel, FN_NAME": Disabling tmu(%ld) : (0x%X : 0x%X)\n", - upstreamTmu, rgb_function, alpha_function); - } else if (gc->tmuLodDisable[upstreamTmu]) { - SstRegs* tmuHw = SST_TMU(hw, upstreamTmu); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << upstreamTmu), tmuHw, tLOD, gc->state.tmu_config[upstreamTmu].tLOD); - GR_CHECK_SIZE(); - - gc->tmuLodDisable[upstreamTmu] = FXFALSE; - } - } - /* If this tmu is inactive then also do the reset for the register - * write, but not in the shadow so that the remaining bits are - * retained. - */ - if ((gc->state.tmuMask & tmuMask) == 0) { - tLod = SST_TLOD_MINMAX_INT(GR_LOD_1, GR_LOD_1); - } - } -#endif - - /* update register */ - { - SstRegs* tmuHw = SST_TMU(hw, tmu); - - REG_GROUP_BEGIN((0x02 << tmu), textureMode, 2, 0x3); - { - REG_GROUP_SET(tmuHw, textureMode , texturemode); - REG_GROUP_SET(tmuHw, tLOD, tLod); - } - REG_GROUP_END(); - } - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -#undef FN_NAME -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, (GrChipID_t tmu, FxU32 detail)) -{ -#define FN_NAME "_grTexDetailControl" - GR_BEGIN(FN_NAME,88,4, 1); - GDBG_INFO_MORE(gc->myLevel, "(%d, 0x%X)\n", tmu, detail); - GR_CHECK_TMU(FN_NAME, tmu); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tDetail, detail); - gc->state.tmu_config[tmu].tDetail = detail; - - GR_END(); -#undef FN_NAME -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, - (GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter)) -{ -#define FN_NAME "grTexFilterMode" - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter); - GR_CHECK_TMU(FN_NAME, tmu); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TMINFILTER | SST_TMAGFILTER); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, - (GrChipID_t tmu, float fvalue)) -{ -#define FN_NAME "grTexLodBiasValue" - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%g)\n",tmu,fvalue); - GR_CHECK_TMU(FN_NAME, tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODBIAS); - tLod |= _grTexFloatLODToFixedLOD(fvalue) << SST_LODBIAS_SHIFT; - - GR_SET((0x02 << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, - (GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend)) -{ -#define FN_NAME "grTexMipMapMode" - FxU32 - tLod, - texMode; - - GR_BEGIN_NOFIFOCHECK("grTexMipMapMode",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend); - GR_CHECK_TMU(FN_NAME, tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER | SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch (mmMode) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - - default: - GrErrorCallback("grTexMipMapMode: invalid mode passed", FXFALSE); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /* Force LOD dithering if the user asked for it. - * - * NB: There is a performance hit for this, but it does - * look better. - */ - texMode |= _GlideRoot.environment.texLodDither; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if (lodBlend) { - /* If we're doing trilinear for real then nuke the lod dithering - * at the same time because it just looks bad. - */ - texMode = ((texMode & ~SST_TLODDITHER) | SST_TRILINEAR); - - if ((texMode & SST_TC_ZERO_OTHER) && - (texMode & SST_TC_BLEND_LODFRAC) && - !(texMode & SST_TC_REVERSE_BLEND)) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 2, 0x03); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - } - REG_GROUP_END(); - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grTexNCCTable, void, - (GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode, i; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"\n"); - GR_CHECK_F(myName, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - for (i = 0; i < GLIDE_NUM_TMU; i++) - gc->state.tmu_config[i].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - for (i = 0; i < GLIDE_NUM_TMU; i++) - texMode = gc->state.tmu_config[i].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - for (i = 0; i < GLIDE_NUM_TMU; i++) { - GR_SET((0x02UL << i), SST_TMU(hw, i), textureMode, texMode); - gc->state.tmu_config[i].textureMode = texMode; - } - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ -#else -GR_ENTRY(grTexNCCTable, void, - (GrChipID_t tmu, GrNCCTable_t table)) -{ -#define FN_NAME "grTexNCCTable" - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4, 1); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu); - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, table > GR_TEXTABLE_PALETTE, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~(SST_TNCCSELECT); - if (table == GR_TEXTABLE_NCC1) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), textureMode, texMode); - gc->state.tmu_config[tmu].textureMode = texMode; - - GR_END(); -#undef FN_NAME -} /* grTexNCCTable */ -#endif - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexSource, void, - (GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexSource" - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN_NOFIFOCHECK("grTexSource",88); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info); - - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_COMPATABILITY(FN_NAME, - startAddress >= gc->tmu_state[tmu].total_mem, - "invalid startAddress"); - GR_CHECK_COMPATABILITY(FN_NAME, - (startAddress + grTexTextureMemRequired(evenOdd, info) >= - gc->tmu_state[tmu].total_mem), - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !info, "invalid info pointer"); - GR_ASSERT((startAddress & SST_TEXTURE_ALIGN_MASK) == 0x00UL); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress(startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd); - baseAddress += gc->tramOffset[tmu]; - baseAddress &= SST_TEXTURE_ADDRESS; - - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= (info->format << SST_TFORMAT_SHIFT) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ASPECT | - SST_LOD_TSPLIT | SST_LOD_ODD | SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - gc->state.tmu_config[tmu].mmMode==GR_MIPMAP_DISABLE - ? info->largeLod - : info->smallLod); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* Write relevant registers out to hardware */ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode , texMode); - REG_GROUP_SET(hw, tLOD , tLod); - REG_GROUP_SET(hw, texBaseAddr , baseAddress); - } - REG_GROUP_END(); - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - /* Make sure that the trilinear blending bits are set in a - * consistent manner across the tmu's. This only really matters if - * we have multiple tmu's, but this state is really setup across - * multiple calls (grTexCombine, grTexMipMapMode, and - * grTexSource). - * - * NB: This must happen after the shadows are updated because - * _grTexCheckTriLinear() will use the shadow register values - * to determine the current state of trilinearness. - */ - if (gc->num_tmu > 1) _grTexCheckTriLinear(tmu); - - GR_END(); -#undef FN_NAME -} /* grTexSource */ - - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, - (GrChipID_t tmu, FxBool enable)) -{ -#define FN_NAME "grTexMultibase" - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4,1); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d)\n",tmu,enable); - GR_CHECK_TMU(FN_NAME,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if (enable) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, - (GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info)) -{ -#define FN_NAME "grTexMultibaseAddress" - - GR_BEGIN("grTexMultibaseAddress", 88, sizeof(FxU32), 1); - GDBG_INFO_MORE(gc->myLevel,"(%d, 0x%X, 0x%X)\n", tmu, range, startAddress); - - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, range > GR_TEXBASE_32_TO_1, "invalid range"); - GR_CHECK_F(FN_NAME, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, info == NULL, "invalid info pointer"); - - /* Write relevant registers out to hardware and shadows */ - { - GrLOD_t - largeLevelLod = 0; - FxU32 - baseAddrRegIndex = 0, - *addrRegShadow = 0; - - switch (range) { - case GR_TEXBASE_256: - largeLevelLod = GR_LOD_256; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr; - break; - - case GR_TEXBASE_128: - largeLevelLod = GR_LOD_128; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr1) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_1; - break; - - case GR_TEXBASE_64: - largeLevelLod = GR_LOD_64; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr2) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_2; - break; - - case GR_TEXBASE_32_TO_1: - largeLevelLod = GR_LOD_32; - baseAddrRegIndex = (offsetof(SstRegs, texBaseAddr38) >> 2UL); - addrRegShadow = &gc->state.tmu_config[tmu].texBaseAddr_3_8; - break; - } - - { - const FifoChipField - tmuChip = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = (gc->tramOffset[tmu] + - _grTexCalcBaseAddress(startAddress, - largeLevelLod, - info->aspectRatio, - info->format, - evenOdd)) & SST_TEXTURE_ADDRESS; - - hw = SST_TMU(hw,tmu); - - GR_SET_INDEX(tmuChip, hw, baseAddrRegIndex, baseAddress); - *addrRegShadow = baseAddress; - } - } - - GR_END(); -#undef FN_NAME -} /* grTexMultibaseAddress */ - -#if defined(GLIDE3) -/*------------------------------------------------------------------- - Function: grTexChromaModeExt - Date: 17-Dec-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - Return: - -------------------------------------------------------------------*/ -void _grTexChromaModeExt(GrChipID_t tmu, GrChromakeyMode_t mode) -{ -#define FN_NAME "_grTexChromaModeExt" - -#undef FN_NAME -} /* grTexChromaModeExt */ - -/*------------------------------------------------------------------- - Function: grTexChromaRangeExt - Date: 17-Dec-97 - Implementor(s): atai - Description: - Draw triangles - Arguments: - Return: - -------------------------------------------------------------------*/ -void _grTexChromaRangeExt(GrChipID_t tmu, GrColor_t min, GrColor_t max) -{ -#define FN_NAME "_grTexChromaRangeExt" - -#undef FN_NAME -} /* grTexChromaRangeExt */ -#endif /* defined(GLIDE3) */ - -/* -** _grTexForceLod -** -** Forces tLOD to a specific LOD level. This is useful only for -** debugging purposes. GMT: obsolete, please remove -** AYT: added it back for Averger. -*/ -void -_grTexForceLod(GrChipID_t tmu, int value) -{ -#define FN_NAME "_grTexForceLod" - FxU32 tLod; - GR_BEGIN_NOFIFOCHECK( "_grTexForceLod", 88 ); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", tmu); - GDBG_INFO_MORE(gc->myLevel, "(0x%x)\n", value); - - tLod = gc->state.tmu_config[tmu].tLOD; - - tLod &= ~(SST_LODMIN | SST_LODMAX); - tLod |= SST_TLOD_MINMAX_INT(value,value); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET((0x02UL << tmu), SST_TMU(hw, tmu), tLOD, tLod); - GR_CHECK_SIZE(); - gc->state.tmu_config[tmu].tLOD = tLod; -#undef FN_NAME -} /* _grTexForceLod */ diff --git a/glide2x/h3/glide/src/gtexdl.c b/glide2x/h3/glide/src/gtexdl.c deleted file mode 100644 index 97a47aa..0000000 --- a/glide2x/h3/glide/src/gtexdl.c +++ /dev/null @@ -1,919 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:29 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 92 3/12/99 5:52p Hanson -** No idle on lfb lock needed to be disabled for -** banshee/avenger since it does not have SST1 style cmd fifo. Updated -** ConvertAndDownloadRLE for Banshee/Avenger. -** -** 91 3/02/99 3:16p Atai -** added 2d nop before texture download to maintain cache coherency -** -** 90 3/02/99 2:22p Peter -** 2d nop flushes (although 3d nop should too) -** -** 89 2/26/99 11:31a Peter -** fixed alignment assertion -** -** 88 2/18/99 5:35p Peter -** -** 87 2/18/99 5:28p Peter -** download/source for everything -** -** 86 2/16/99 4:14p Peter -** sanitized source/download -** -** 85 2/10/99 2:24p Peter -** corrected alignment textures within an alignment allocation unit -** -** 84 2/02/99 5:41p Peter -** textures through lfb -** -** 83 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 82 11/03/98 11:10a Atai -** texture cache flushing -** -** 81 11/02/98 5:34p Atai -** merge direct i/o code -** -** 80 10/21/98 10:41a Atai -** -** 79 10/20/98 7:12p Peter -** static build hapiiness -** -** 78 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 77 10/09/98 6:57p Peter -** dynamic 3DNow!(tm) mods -** -** 76 9/21/98 5:35p Dow -** 3DNow! mods -** -** 75 9/11/98 2:09p Peter -** removed debugging code -** -** 74 9/11/98 1:44p Peter -** texture mask fixes -** -** 73 9/04/98 3:32p Peter -** reversed the sense of the active bytes in small downloads -** -** 72 8/27/98 10:07p Peter -** added flush to rle -** -** 71 8/27/98 9:54p Peter -** flush old texels when replacing small lod levels -** -** 70 8/27/98 1:55p Peter -** download problem w/ widths smaller than dword -** -** 69 7/19/98 4:34p Mikec -** Relaxed 2MB span constraint on downloadmipmappartial. -** -** 68 5/22/98 6:24p Atai -** texturing out of render buffer hack -** -** 67 5/21/98 4:47p Dow -** Direct Register Writes Work -** -** 66 5/18/98 3:19p Peter -** one more palette broadcast thing -** -** 65 5/13/98 9:12a Dow -** -** 64 5/12/98 2:42p Dow -** -** 63 5/05/98 3:01p Peter -** packet chipfield vs direct register chipfield -** -** 62 4/29/98 2:32p Peter -** fixed texture palette broadcast -** -** 61 4/29/98 1:02p Peter -** non dword aligned downloads -** -** 60 3/28/98 11:24a Dow -** itwoç -** -** 58 2/17/98 12:52p Dow -** Conditional LFB Download Hack -** -** 57 2/02/98 2:17p Atai -** fixed palette broadcasts in _grTexDownloadNccTable and -** _grTexDownloadPalette -** -** 56 1/29/98 9:54p Dow -** This is Banshee - * - * 54 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 53 1/08/98 7:09p Peter - * real hw stuff modulo makefile change - * - * 52 1/08/98 4:58p Atai - * tex table broadcast, grVertexLayout enable/disable, stq, and some - * defines - * - * 51 1/08/98 11:06a Dow - * Set palette downloads to broadcast. - * - * 50 12/11/97 4:15p Peter - * fixed assertions - * - * 49 12/09/97 12:20p Peter - * mac glide port - * - * 48 12/05/97 4:26p Peter - * watcom warnings - * - * 47 12/02/97 9:48a Dow - * Got rid of Texelfx rev 0 warning - * - * 46 11/21/97 1:03p Peter - * small texture download problem - * - * 45 11/20/97 6:57p Dow - * Texture Downloads for Banshee - * - * 44 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 43 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 42 11/14/97 12:09a Peter - * comdex thing and some other stuff - * - * 41 11/12/97 11:16a Peter - * cleaned up assertions - * - * 40 11/05/97 1:50p Peter - * fixed partial palette downloads - * - * 39 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 38 10/08/97 11:33a Peter - * reg group for palette download - * - * 37 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 36 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 35 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 34 7/26/97 5:18p Peter - * fixed macro effage - * - * 33 7/08/97 2:49p Peter - * - * 32 7/02/97 12:28p Peter - * removed spurious NOP, tex dl - * - * 31 6/30/97 3:22p Peter - * cmd fifo sanity - * -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** _grTexDownloadNccTable -** -** Downloads an ncctable to the specified _physical_ TMU(s). This -** function is called internally by Glide and should not be executed -** by an application. -*/ -GR_DDFUNC(_grTexDownloadNccTable, - void, - (GrChipID_t tmu, FxU32 which, const GuNccTable *table, int start, int end)) -{ -#define FN_NAME "_grTexDownloadNccTable" - GR_BEGIN_NOFIFOCHECK(FN_NAME,89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d, 0x%x, %d,%d)\n",tmu,which,table,start,end); - GR_ASSERT(start==0); - GR_ASSERT(end==11); - - /* check for null pointer */ - if (table == NULL) return; - - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - if (gc->tmu_state[tmu].ncc_table[which] != table) { - SstRegs* texHW; - int i; -#ifdef GLIDE_POINTCAST_PALETTE - texHW = SST_TMU(hw,tmu); -#else - texHW = SST_CHIP(hw, 0x06UL); -#endif - - if (which == 0) { -#ifdef GLIDE_POINTCAST_PALETTE - REG_GROUP_BEGIN((0x02UL << tmu), nccTable0, 12, 0x0FFF); -#else - REG_GROUP_BEGIN(0x06UL, nccTable0, 12, 0x0FFF); -#endif - for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable0[i], table->packed_data[i]); - REG_GROUP_END(); - } else { -#ifdef GLIDE_POINTCAST_PALETTE - REG_GROUP_BEGIN((0x02UL << tmu), nccTable1, 12, 0x0FFF); -#else - REG_GROUP_BEGIN(0x06UL, nccTable1, 12, 0x0FFF); -#endif - for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable1[i], table->packed_data[i]); - REG_GROUP_END(); - } - - gc->tmu_state[tmu].ncc_table[which] = table; - } - - GR_END(); -#undef FN_NAME -} /* _grTexDownloadNccTable */ - -/*------------------------------------------------------------------- - Function: _grTexDownloadPalette - Date: 6/9 - Implementor(s): jdt - Library: Glide - Description: - Private function to download a palette to the specified tmu - Arguments: - tmu - which tmu to download the palette to - pal - the pallete data - start - beginning index to download - end - ending index to download - Return: - none - -------------------------------------------------------------------*/ -GR_DDFUNC(_grTexDownloadPalette, - void, - (GrChipID_t tmu, GuTexPalette *pal, int start, int end)) -{ -#define FN_NAME "_grTexDownloadPalette" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d)\n",tmu,pal,start,end); - - GR_CHECK_F(FN_NAME, pal == NULL, "pal invalid"); - GR_CHECK_F(FN_NAME, start < 0, "invalid start index"); - GR_CHECK_F(FN_NAME, end > 255, "invalid end index"); - - /* NOTE: - ** - ** This code broadcasts the palette because in the future, we will - ** only support one global texture palette no matter how many TMUs - ** there are. This is fallout from the fact that future hardware - ** has a unified memory architecture. - ** - ** Source licensees (meaning arcade or LBE vendors that) require the - ** one palette/tmu mode should define GLIDE_POINTCAST_PALETTE on - ** the command line for this file. Understand, however, that this - ** will not work on future hardware. - */ - -#ifdef GLIDE_POINTCAST_PALETTE - /* - ** FURTHER NOTE: - ** There is a sublety (nice way of saying BUG) here. - ** If TMU0 is specified, then the palette will be broadcast to all - ** TMUS. So, if the user downloads TMU1's palette, then TMU0's - ** palette, TMU0's palette will be on *both* TMUs. This is a - ** pretty strong indicator that no one is using separate palettes - ** on different TMUs. - */ - hw = SST_TMU(hw,tmu); -#else - hw = SST_CHIP(hw,0x6); -#endif - - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += ((end - start + 1) << 2); - - /* We divide the writes into 3 chunks trying to group things into - * complete 8 word grouped packets to fit the nccTable palette - * format: stuff before the 8 word alignment, aligned writes, and - * stuff after the 8 word alignment to the end. The slop regions - * are one packet apiece. - */ - { -#ifdef GLIDE_POINTCAST_PALETTE - const FifoChipField chipId = (FifoChipField)(0x02UL << tmu); -#else - const FifoChipField chipId = (FifoChipField)0x06UL; -#endif - const int endSlop = (end & ~0x07); - const int startSlop = MIN(((start + 8) & ~0x07) - 1, end); - int i = start; - - /* Is the start of the palette range unaligned or is the end of - * the range less than a completely aligned range? - */ - if (((start & 0x07) != 0) || (end < ((start + 8) & ~0x07))) { - const FxI32 slopCount = startSlop - start + 1; - GR_ASSERT((slopCount > 0) && (slopCount <= 8)); - - REG_GROUP_BEGIN(chipId, nccTable0[4 + (start & 0x07)], - slopCount, (0xFF >> (8 - slopCount))); - while(i < start + slopCount) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - - /* Do all of the aligned palette ranges. */ - while(i < endSlop) { - const int endIndex = i + 8; - - REG_GROUP_BEGIN(chipId, nccTable0[4], 8, 0xFF); - while(i < endIndex) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - - /* Do we have any more slop at the end of the ragne? */ - if (i <= end) { - const FxU32 slopCount = end - endSlop + 1; - - REG_GROUP_BEGIN(chipId, nccTable0[4], - slopCount, (0xFF >> (8 - slopCount))); - while(i <= end) { - REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)], - (0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF))); - i++; - } - REG_GROUP_END(); - } - } - - GR_END(); -#undef FN_NAME -} /* _grTexDownloadPalette */ - -/*------------------------------------------------------------------- - Function: grTexDownloadTable - Date: 6/3 - Implementor(s): jdt, GaryMcT - Library: glide - Description: - download look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -GR_ENTRY(grTexDownloadTable, - void, - (GrTexTable_t type, void *data)) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",type,data); - GR_CHECK_F(myName, type > GR_TEXTABLE_PALETTE, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - - if (type == GR_TEXTABLE_PALETTE) /* Need Palette Download Code */ - _grTexDownloadPalette(GR_TMU0, (GuTexPalette *)data, 0, 255); - else { /* Type is an ncc table */ - _grTexDownloadNccTable(GR_TMU0, type, (GuNccTable*)data, 0, 11); - /* _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); */ - } - GR_END(); -} /* grTexDownloadTable */ -#else -GR_ENTRY(grTexDownloadTable, - void, - (GrChipID_t tmu, GrTexTable_t type, void *data)) -{ -#define FN_NAME "grTexDownloadTable" - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x)\n",tmu,type,data); - GR_CHECK_TMU(FN_NAME,tmu); - GR_CHECK_F(FN_NAME, type > GR_TEXTABLE_PALETTE, "invalid table specified"); - GR_CHECK_F(FN_NAME, !data, "invalid data pointer"); - - if (type == GR_TEXTABLE_PALETTE) /* Need Palette Download Code */ - _grTexDownloadPalette(tmu, (GuTexPalette *)data, 0, 255); - else { /* Type is an ncc table */ - _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); - /* _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); */ - } - GR_END(); -#undef FN_NAME -} /* grTexDownloadTable */ -#endif - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMapLevelPartial - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a mipmap level to the specified tmu at the given - texture start address - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - this should be some value between grTexMinAddress() - and grTexMaxAddress() - thisLod - lod constant that describes the mipmap level - to be downloaded - largeLod - largest level of detail in complete mipmap to - be downloaded at startAddress of which level to - be downloaded is a part - aspectRatio - aspect ratio of this mipmap - format - format of mipmap image data - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - data - pointer to mipmap data - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexDownloadMipMapLevelPartial, - void, - (GrChipID_t tmu, FxU32 startAddress, - GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, void *data, int t, int max_t)) -{ -#define FN_NAME "grTexDownloadMipMapLevelPartial" - - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d,%d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data,t,max_t); - - { - GR_CHECK_TMU(myName, tmu); - GR_CHECK_F(myName, - startAddress + _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd, FXTRUE) > - gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress"); - GR_CHECK_F(myName, startAddress & SST_TEXTURE_ALIGN_MASK, - "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > G3_LOD_TRANSLATE(GR_LOD_1), - "thisLod invalid"); - GR_CHECK_F(myName, largeLod > G3_LOD_TRANSLATE(GR_LOD_1), - "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, - "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > G3_ASPECT_TRANSLATE(GR_ASPECT_1x8) || - aspectRatio < G3_ASPECT_TRANSLATE(GR_ASPECT_8x1), - "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, - "evenOdd mask invalid"); - GR_CHECK_F(myName, !data, - "invalid data pointer"); - GR_CHECK_F(myName, max_t >= _grMipMapHostWH[aspectRatio][thisLod][1], - "invalid end row"); - } - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - { - FxU32 - baseAddress; - - /* Compute physical start address for the download. */ - { - FxU32 - texOffset = 0x00UL; - - /* We need to do some magic to pack the small levels and have a - * properly aligned baseAddr. If the current level is not going - * to start on an alignment boundary when working backwards in - * the chain we need to offset it into the block so that it is - * addressable with an aligned baseAddr. - */ - { - const FxU32 - aspectIndex = ((aspectRatio < GR_ASPECT_1x1) - ? GR_ASPECT_1x1 - aspectRatio - : aspectRatio - GR_ASPECT_1x1), - lodIndex = ((thisLod == GR_LOD_256) ? GR_LOD_256 : thisLod - 1), - formatShift = (format >= GR_TEXFMT_16BIT); - FxU32 - levelSize = (_grMipMapHostSize[aspectIndex][lodIndex] << formatShift); - GrLOD_t - minLod = thisLod; - - if (levelSize < SST_TEXTURE_ALIGN) { - GrLOD_t - maxLod = lodIndex; - - /* Find the smallest level that naturally starts on an - * alignment boundary. If this is larger than the current - * mipmap chain's large lod then this we have to compute the - * offset within this alignment unit. - * - * NB: This could a table lookup, but I'm writing the obvious code - * right now so that there aren't any mystic #'s being pulled out - * of the recesses of my colon. - */ - while(maxLod > GR_LOD_256) { - levelSize = (_grMipMapHostSize[aspectIndex][maxLod] << formatShift); - - if (levelSize >= SST_TEXTURE_ALIGN) break; - maxLod--; - texOffset += levelSize; - } - - /* maxLod is the index of the smallest level of this aspect - * ratio that takes up atleast a full alignment unit. We - * reset the small lod to this so that we can compute the - * offset for the 'large' levels in the mipmap chain. - */ - GR_ASSERT(maxLod != GR_LOD_256); - minLod = maxLod + 1; - } - - if (minLod > largeLod) { - texOffset += _grTexTextureMemRequired(minLod - 1, largeLod, - aspectRatio, - format, - evenOdd, - FXFALSE); - } - } - - /* This is going directly to the 2d lfb space rather than - * through the texture port so we have to add in the actual hw - * offset that the texture 'surface' starts at. - */ - baseAddress = (gc->tramOffset[tmu] + - startAddress + - texOffset); - } - { - /* - ** To maintain cache coherency in h4, issue a 2D nop to - ** flush all pixel from 3D session before texture download - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - /* Do the download */ - { - const FxU32 - width = _grMipMapHostWH[aspectRatio][thisLod][0], - formatSel = (format >= GR_TEXFMT_16BIT); - FxU32 - widthSel = (width >> 0x01UL), - max_s = width >> (formatSel - ? 1 /* 16-bit texture */ - : 2); /* 8-bit texture */ - - if (max_s <= 0) max_s = 1; - if (widthSel > 2) widthSel = 3; - - _GlideRoot.stats.texBytes += max_s * (max_t - t + 1) * 4; - - (*((*gc->archDispatchProcs.texDownloadProcs)[formatSel][widthSel]))(gc, - baseAddress, - max_s, t, max_t, - data); - } - - /* If this is a small lod level in a texture replacing texels that - * are already loaded then it may be necessary to flush the old - * texels from memory before any other rendering operation using - * this texture is issued. Unconditionally flush these old texels - * just in case rather than being too clever. - * - * The reason that we need to flush here even though we're not - * going through the texture port is because it is perfectly - * legal to source once and download over and over again. (See - * chd for a funny SpecOps story). - * - * NB: The documented nop does not currently work on basnehe which - * is why we do the ~texBaseAddr crap. - */ - { - const FifoChipField - chipId = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = gc->state.tmu_config[tmu].texBaseAddr; - - GR_SET_EXPECTED_SIZE(3 * sizeof(FxU32), 3); - { - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(chipId, hw, texBaseAddr, ~baseAddress & SST_TEXTURE_ADDRESS); - GR_SET(chipId, hw, texBaseAddr, baseAddress); - } - GR_CHECK_SIZE(); - - /* Again force a pixel flush which should force all of the - * texture downloads to flush from internal fifos etc. - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - } - - all_done: - _GlideRoot.stats.texDownloads++; -#undef FN_NAME -} /* grTexDownloadMipmapLevelPartial */ - -/* - Let me take this opportunity to register my formal opposition to - this function. Either we do this or we don't. Let's not hack like - this. - CHD - - I'd like to second chris's opinion because I'm sick and tired of fixing - this for every hw mod where it breaks. -*/ - -GR_ENTRY(ConvertAndDownloadRle, - void, - (GrChipID_t tmu, FxU32 startAddress, - GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, - FxU8 *bm_data, long bm_h, - FxU32 u0, FxU32 v0, - FxU32 width, FxU32 height, FxU32 dest_width, FxU32 dest_height, FxU16 *tlut)) -{ -#define FN_NAME "ConvertAndDownloadRLE" - GR_BEGIN_NOFIFOCHECK(FN_NAME, 89); - GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,bm_data,dest_height); - - { - GR_CHECK_TMU(FN_NAME, tmu); - GR_CHECK_F(FN_NAME, - startAddress + _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd, FXTRUE) > - gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress"); - GR_CHECK_F(FN_NAME, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(FN_NAME, thisLod > G3_LOD_TRANSLATE(GR_LOD_1), "thisLod invalid"); - GR_CHECK_F(FN_NAME, largeLod > G3_LOD_TRANSLATE(GR_LOD_1), "largeLod invalid"); - GR_CHECK_F(FN_NAME, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(FN_NAME, aspectRatio > G3_ASPECT_TRANSLATE(GR_ASPECT_1x8) || - aspectRatio < G3_ASPECT_TRANSLATE(GR_ASPECT_8x1), - "aspectRatio invalid"); - GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(FN_NAME, !bm_data, "invalid data pointer"); - GR_CHECK_F(FN_NAME, (dest_height - 1) >= (FxU32)_grMipMapHostWH[aspectRatio][thisLod][1], - "invalid end row"); - } - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - { - FxU32 - baseAddress; - - /* Compute physical start address for the download. */ - { - FxU32 - texOffset = 0x00UL; - - /* We need to do some magic to pack the small levels and have a - * properly aligned baseAddr. If the current level is not going - * to start on an alignment boundary when working backwards in - * the chain we need to offset it into the block so that it is - * addressable with an aligned baseAddr. - */ - { - const FxU32 - aspectIndex = ((aspectRatio < GR_ASPECT_1x1) - ? GR_ASPECT_1x1 - aspectRatio - : aspectRatio - GR_ASPECT_1x1), - lodIndex = ((thisLod == GR_LOD_256) ? GR_LOD_256 : thisLod - 1), - formatShift = (format >= GR_TEXFMT_16BIT); - FxU32 - levelSize = (_grMipMapHostSize[aspectIndex][lodIndex] << formatShift); - GrLOD_t - minLod = thisLod; - - if (levelSize < SST_TEXTURE_ALIGN) { - GrLOD_t - maxLod = lodIndex; - - /* Find the smallest level that naturally starts on an - * alignment boundary. If this is larger than the current - * mipmap chain's large lod then this we have to compute the - * offset within this alignment unit. - * - * NB: This could a table lookup, but I'm writing the obvious code - * right now so that there aren't any mystic #'s being pulled out - * of the recesses of my colon. - */ - while(maxLod > GR_LOD_256) { - levelSize = (_grMipMapHostSize[aspectIndex][maxLod] << formatShift); - - if (levelSize >= SST_TEXTURE_ALIGN) break; - maxLod--; - texOffset += levelSize; - } - - /* maxLod is the index of the smallest level of this aspect - * ratio that takes up atleast a full alignment unit. We - * reset the small lod to this so that we can compute the - * offset for the 'large' levels in the mipmap chain. - */ - GR_ASSERT(maxLod != GR_LOD_256); - minLod = maxLod + 1; - } - - if (minLod > largeLod) { - texOffset += _grTexTextureMemRequired(minLod - 1, largeLod, - aspectRatio, - format, - evenOdd, - FXFALSE); - } - } - - /* This is going directly to the 2d lfb space rather than - * through the texture port so we have to add in the actual hw - * offset that the texture 'surface' starts at. - */ - baseAddress = (gc->tramOffset[tmu] + - startAddress + - texOffset); - } - - { - /* - ** To maintain cache coherency in h4, issue a 2D nop to - ** flush all pixel from 3D session before texture download - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - - /* Update stats for the unconverted format */ - _GlideRoot.stats.texBytes += dest_width * (dest_height) * 2; - - { - extern FxU16 - rle_line[256], /* diTex.c */ - *rle_line_end; /* ditex.c */ - FxU32 - max_s, - max_t; - FxU32 - i, - s, t, - offset; - const FxU16 - *src; - - - if (height>dest_height) - height=dest_height; - if (width>dest_width) - width=dest_width; - - max_s=dest_width >> 1; - max_t=height; - - /* here I can do my writes and conversion and I will be so happy */ - offset = 4 + bm_h; - for(i = 0; i < v0; i++) - offset += bm_data[4 + i]; - - rle_line_end = rle_line + width + u0; - for(t = 0; t < max_t; t++) { - src = rle_line + u0; - rle_decode_line_asm(tlut, &bm_data[offset], rle_line); - - LINEAR_WRITE_BEGIN(max_s, SSTCP_PKT5_LFB, - baseAddress, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(baseAddress + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - - baseAddress += dest_width << 1; - offset += bm_data[4 + i++]; - } - - if (dest_height > height) { - src = rle_line + u0; - - LINEAR_WRITE_BEGIN(max_s, SSTCP_PKT5_LFB, - baseAddress, - 0x00UL, 0x00UL); - for(s = 0; s < max_s; s++) { - LINEAR_WRITE_SET(baseAddress + (s << 2), *(FxU32 *) src); - src += 2; - } - LINEAR_WRITE_END(); - } - } - - /* If this is a small lod level in a texture replacing texels that - * are already loaded then it may be necessary to flush the old - * texels from memory before any other rendering operation using - * this texture is issued. Unconditionally flush these old texels - * just in case rather than being too clever. - * - * The reason that we need to flush here even though we're not - * going through the texture port is because it is perfectly - * legal to source once and download over and over again. (See - * chd for a funny SpecOps story). - * - * NB: The documented nop does not currently work on basnehe which - * is why we do the ~texBaseAddr crap. - */ - { - const FifoChipField - chipId = (FifoChipField)(0x02UL << tmu); - const FxU32 - baseAddress = gc->state.tmu_config[tmu].texBaseAddr; - - GR_SET_EXPECTED_SIZE(3 * sizeof(FxU32), 3); - { - GR_SET(BROADCAST_ID, hw, nopCMD, 0); - GR_SET(chipId, hw, texBaseAddr, ~baseAddress & SST_TEXTURE_ADDRESS); - GR_SET(chipId, hw, texBaseAddr, baseAddress); - } - GR_CHECK_SIZE(); - - /* Again force a pixel flush which should force all of the - * texture downloads to flush from internal fifos etc. - */ - REG_GROUP_BEGIN_WAX(command, 1, 0x01UL); - REG_GROUP_SET_WAX(gc->gRegs, command, SSTG_NOP | SSTG_GO); - REG_GROUP_END(); - } - } - -all_done: - _GlideRoot.stats.texDownloads++; -#undef FN_NAME -} - diff --git a/glide2x/h3/glide/src/gu.c b/glide2x/h3/glide/src/gu.c deleted file mode 100644 index a9b3a3f..0000000 --- a/glide2x/h3/glide/src/gu.c +++ /dev/null @@ -1,453 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 14 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 13 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 12 5/21/97 6:05a Peter - * - * 11 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 10 3/05/97 9:36p Jdt - * Added guEncodeRLE16 - * - * 9 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#endif - -#include "fxinline.h" - -/*--------------------------------------------------------------------------- -** guAlphaSource -*/ -GR_DIENTRY(guAlphaSource, void, ( GrAlphaSource_t mode )) -{ - GDBG_INFO(99,"guAlphaSource(%d)\n",mode); - switch ( mode ) { - case GR_ALPHASOURCE_CC_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - - default: - GR_CHECK_F("grAlphaSource", 1, "unknown alpha source mode"); - break; - } - - /* xxx not needed at the moment, should update grFogxxx - _grVerifyNeedForITAlpha(); - */ -} /* guAlphaSource */ - -/*--------------------------------------------------------------------------- -** guColorCombineFunction -*/ -GR_DIENTRY(guColorCombineFunction, void, ( GrColorCombineFnc_t fnc )) -{ - GDBG_INFO(99,"guColorCombineFunction(%d)\n",fnc); - - /* gross hack to get ITRGB_DELTA0 modes working */ - _grColorCombineDelta0Mode( FXFALSE ); - - switch ( fnc ) - { - case GR_COLORCOMBINE_ZERO: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DECAL_TEXTURE: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA: - grColorCombine( GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_TEXTURE_ALPHA, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_ITERATED, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_A: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_B: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ONE: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXTRUE ); - break; - - default: - GR_CHECK_F("grColorCombineFunction", 1, "unsupported color combine function"); - break; - } -} /* guColorCombineFunction */ - -/*--------------------------------------------------------------------------- -** guEndianSwapWords -*/ -GR_DIENTRY(guEndianSwapWords, FxU32, ( FxU32 value )) -{ - return ( ( value & 0xFFFF0000 ) >> 16 ) | ( value << 16 ); -} - -/*--------------------------------------------------------------------------- -** guEndianSwapBytes -*/ -GR_DIENTRY(guEndianSwapBytes, FxU16, ( FxU16 value )) -{ - return ( ( value & 0xFF00 ) >> 8 ) | ( value << 8 ); -} - -/*--------------------------------------------------------------------------- -** guFogTableIndexToW -*/ -GR_DIENTRY(guFogTableIndexToW, float, ( int i )) -{ - return (float)pow(2.0,3.0+(double)(i>>2)) / (8-(i&3)); -} - -/*--------------------------------------------------------------------------- -** guFogGenerateExp -*/ -GR_DIENTRY(guFogGenerateExp, void, - ( GrFog_t fogtable[], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO(99,"guFogGenerateExp(0x%x,%g)\n",fogtable,density); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -dp ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -dp ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp */ - -/*--------------------------------------------------------------------------- -** guFogGenerateExp2 -*/ -GR_DIENTRY(guFogGenerateExp2, void, - ( GrFog_t fogtable[], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO(99,"guFogGenerateExp2(0x%x,%g)\n",fogtable,density); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -( dp * dp ) ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -( dp * dp ) ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp2 */ - -/*--------------------------------------------------------------------------- -** guFogGenerateLinear -*/ -GR_DIENTRY(guFogGenerateLinear, void, - ( GrFog_t fogtable[kInternalFogTableEntryCount], - float nearZ, float farZ )) -{ - int i; - float world_w; - float f; - - GDBG_INFO(99,"guFogGenerateLinear(0x%x,%g,%g)\n",fogtable,nearZ,farZ); - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) { - world_w = guFogTableIndexToW( i ); - if ( world_w > 65535.0F ) - world_w = 65535.0F; - - f = ( world_w - nearZ ) / ( farZ - nearZ ); - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateLinear */ - -/* -** setlevel -*/ -static void -setlevel( FxU16 *data, FxU16 color, int width, int height ) -{ - int s, t; - - for ( t = 0; t < height; t++ ) - { - for ( s = 0; s < width; s++ ) - { - *data = color; - data++; - } - } -} /* setlevel */ - -/*--------------------------------------------------------------------------- -** guTexCreateColorMipMap -*/ -GR_DIENTRY(guTexCreateColorMipMap, FxU16 *, ( void )) -{ - FxU32 memrequired; - FxU16 *data; - FxU16 *start; - - GDBG_INFO(99,"guTexCreateColorMipMap()\n"); - memrequired = 2 * ( 256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 ); - start = data = malloc( memrequired ); - if ( !data ) - return 0; - - setlevel( data, 0xF800, 256, 256 ); - setlevel( data += 256*256, 0x07e0, 128, 128 ); - setlevel( data += 128*128, 0x001F, 64, 64 ); - setlevel( data += 64*64, 0xFFFF, 32, 32); - setlevel( data += 32*32, 0x0000, 16, 16 ); - setlevel( data += 16*16, 0xF800, 8, 8); - setlevel( data += 8*8, 0x07e0, 4, 4 ); - setlevel( data += 4*4, 0x001f, 2, 2 ); - setlevel( data += 2*2, 0xFFFF, 1, 1 ); - - return start; -} /* guTexCreateColoMipMap */ - -/* GMT: this code used to be in the code above but I removed it for - readability, the first section was case(1) the second section - was a replacement for the simple 32-bit copy loop -*/ -#if 0 - - /* GMT: from what I can tell its not bad to perform unaligned DWORD - loads on a P5, so we use the case 2) all the time - in fact, its twice as fast as doing aligned short copies - */ -if ((dstX ^ (((FxU32)src)>>1)) & 1) { - /* case 1) a simple 16-bit copy loop */ - for (x=0; x < w; x++) { - GR_SET16(lfbPtr[x], ((FxU16 *)src)[x]); - } -} -#endif - -#if 0 -/* GMT: I tried to unroll the loop but for some reason the - code scheduling was such that it was slower - I think it had to do with the way the 2 mov instructions paired - Perhaps they were unaligned in the cache? - */ -FxU32 a,b; -FxU32 *s = (FxU32 *)src; -FxU32 *d = lfbPtr; - -while (d < &lfbPtr[w-1]) { - a = s[0]; - b = s[1]; - GR_SET(d[0], a); - GR_SET(d[1], b); - s += 2; - d += 2; -} -if (w & 1) { - GR_SET(d[0], s[0]); -} -#endif - -/*------------------------------------------------------------------- - Function: guEncodeRle - Date: 3/5/96 - Implementor(s): jdt - Library: Glide Utilities - Description: - Encode an RGB565 image into RLE16 format - Arguments: - dst - destination rle image data ( NULL for bytecount only ) - src - source rgb565 image data - width - width of source data - height - height of source data - Return: - number of bytes in encoded rle image - -------------------------------------------------------------------*/ -GR_ENTRY( guEncodeRLE16, int, ( void *dst, void *src, FxU32 width, FxU32 height )) -{ - int byteCount = 0; - int sourceImageSizeInWords; - FxU16 *srcPixels; - FxU32 *dstPixels; - - sourceImageSizeInWords = width * height; - - srcPixels = src; - - if ( dst ) { - dstPixels = dst; - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - *dstPixels = ((((FxU32)length)<<16) | ((FxU32)color)); - dstPixels++; - - byteCount+=4; - - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } else { - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - byteCount+=4; - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } - return byteCount; -} - diff --git a/glide2x/h3/glide/src/guclip.c b/glide2x/h3/glide/src/guclip.c deleted file mode 100644 index 8663cf7..0000000 --- a/glide2x/h3/glide/src/guclip.c +++ /dev/null @@ -1,444 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 12 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 11 12/09/97 12:20p Peter - * mac glide port - * - * 10 12/08/97 12:06p Atai - * change prototype for grDrawPoint, grDrawLine, grDrawTriangel - * - * 9 8/18/97 3:52p Peter - * pre-hw arrival fixes/cleanup - * - * 8 7/31/97 11:14a Peter - * merge w/ sst1 glide tree, hopefully - * - * 5 6/27/97 4:16p Atai - * fixed guDrawTriangleWithClip bug (#484) by removing +1.0F and -1.0F in - * intersectTop(), intersectBottom(), intersectLeft(), and - * intersectRight() routine - * - * 4 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Moved per GMT cleanup */ -#define GU_PRIM_MAX_VERTICES 100 - -static void -calcParams(const GrVertex *a, const GrVertex *b, GrVertex *isect, float d) -{ - GR_DCL_GC; - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { - isect->r = a->r + d * ( b->r - a->r ); - isect->g = a->g + d * ( b->g - a->g ); - isect->b = a->b + d * ( b->b - a->b ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { - isect->a = a->a + d * ( b->a - a->a ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { - isect->ooz = a->ooz + d * ( b->ooz - a->ooz ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { - isect->oow = a->oow + d * ( b->oow - a->oow); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU0) { - isect->tmuvtx[0].oow = - a->tmuvtx[0].oow + d * ( b->tmuvtx[0].oow - a->tmuvtx[0].oow ); - isect->tmuvtx[0].sow = - a->tmuvtx[0].sow + d * ( b->tmuvtx[0].sow - a->tmuvtx[0].sow ); - isect->tmuvtx[0].tow = - a->tmuvtx[0].tow + d * ( b->tmuvtx[0].tow - a->tmuvtx[0].tow ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU1) { - isect->tmuvtx[1].oow = - a->tmuvtx[1].oow + d * ( b->tmuvtx[1].oow - a->tmuvtx[1].oow ); - isect->tmuvtx[1].sow = - a->tmuvtx[1].sow + d * ( b->tmuvtx[1].sow - a->tmuvtx[1].sow ); - isect->tmuvtx[1].tow = - a->tmuvtx[1].tow + d * ( b->tmuvtx[1].tow - a->tmuvtx[1].tow ); - } - -#if (GLIDE_NUM_TMU > 2) - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU2) { - isect->tmuvtx[2].oow = - a->tmuvtx[2].oow + d * ( b->tmuvtx[2].oow - a->tmuvtx[2].oow ); - isect->tmuvtx[2].sow = - a->tmuvtx[2].sow + d * ( b->tmuvtx[2].sow - a->tmuvtx[2].sow ); - isect->tmuvtx[2].tow = - a->tmuvtx[2].tow + d * ( b->tmuvtx[2].tow - a->tmuvtx[2].tow ); - } -#endif - -} /* calcParams */ - -static void -intersectTop( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymin - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymin; - - calcParams(a, b, intersect, d); - -} /* intersectTop */ - -static void -intersectBottom( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymax - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymax; - - calcParams(a, b, intersect, d); - -} /* intersectBottom */ - -static void -intersectRight( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmax - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmax; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectRight */ - -static void -intersectLeft( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmin - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmin; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectLeft */ - -static FxBool -aboveYMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y > gc->state.clipwindowf_ymin ) ? FXTRUE : FXFALSE); -} /* aboveYMin */ - - -static FxBool -belowYMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y < gc->state.clipwindowf_ymax ) ? FXTRUE : FXFALSE); -} /* belowYMax */ - -static FxBool -aboveXMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x > gc->state.clipwindowf_xmin ) ? FXTRUE : FXFALSE ); -} /* aboveXMin */ - -static FxBool -belowXMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x < gc->state.clipwindowf_xmax ) ? FXTRUE : FXFALSE ); -} /* belowXMax */ - -/* -** shClipPolygon -*/ -static void -shClipPolygon( - const GrVertex invertexarray[], - GrVertex outvertexarray[], - int inlength, int *outlength, - FxBool (*inside)(const GrVertex *p), - void (*intersect)( - const GrVertex *a, - const GrVertex *b, - GrVertex *intersect ) - ) -{ - GrVertex - s, p /*, intersection */; - int - j; - - *outlength = 0; - - s = invertexarray[inlength-1]; - for ( j = 0; j < inlength; j++ ) { - p = invertexarray[j]; - if ( inside( &p ) ) { - if ( inside( &s ) ) { - outvertexarray[*outlength] = p; - (*outlength)++; - }else { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - outvertexarray[*outlength] = p; - (*outlength)++; - } - } else { - if ( inside( &s ) ) { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - } - } - s = p; - } -} /* shClipPolygon */ - -#ifndef GLIDE3_ALPHA -/*--------------------------------------------------------------------------- -** guDrawTriangleWithClip -** -** NOTE: This routine snaps vertices by adding a large number then -** subtracting that same number again. In order for this to work -** you MUST set up the FPU to work in single precision mode. Code -** to perform this is listed in the Appendix to the Glide Programmer's -** Guide. -*/ -static const float vertex_snap_constant = ( float ) ( 1L << 19 ); - -GR_DIENTRY(guDrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - outlength; - - GDBG_INFO_MORE(99,"guDrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { -#ifdef GLIDE3 - grDrawTriangle( (void *)a, (void *)b, (void *)c ); -#else - grDrawTriangle( a, b, c ); -#endif - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || defined ( __DJGPP__ ) || defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawTriangleWithClip */ - -/*--------------------------------------------------------------------------- -** guAADrawTriangleWithClip -*/ -GR_DIENTRY(guAADrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - ilist[10], - outlength; - - GDBG_INFO_MORE(99,"guAADrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { - grAADrawTriangle( a, b, c, FXTRUE, FXTRUE, FXTRUE ); - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || defined ( __DJGPP__ ) || defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - ilist[i] = i; - } - - ilist[outlength] = 0; -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grAADrawPolygon( outlength, ilist, output_array2 ); -} /* guAADrawTriangleWithClip */ - - -/*--------------------------------------------------------------------------- -** guDrawPolygonVertexListWithClip -*/ -GR_DIENTRY(guDrawPolygonVertexListWithClip, void, - ( int nverts, const GrVertex vlist[] )) -{ - GrVertex - output_array[GU_PRIM_MAX_VERTICES+8], - output_array2[GU_PRIM_MAX_VERTICES+8]; - int - i, - outlength; - - GDBG_INFO_MORE(99,"guDrawPolygonVertexListWithClip(%d,0x%x)\n",nverts,vlist); - /* - ** go ahead and clip and render - */ - shClipPolygon( vlist, output_array, nverts, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || defined ( __DJGPP__ ) || defined(__GNUC__) || defined(__MWERKS__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawPolygonVertexListWithClip */ - -#endif /* !GLIDE3_ALPHA */ diff --git a/glide2x/h3/glide/src/gump.c b/glide2x/h3/glide/src/gump.c deleted file mode 100644 index bef8153..0000000 --- a/glide2x/h3/glide/src/gump.c +++ /dev/null @@ -1,108 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 10 12/09/97 12:20p Peter - * mac glide port - * - * 9 11/12/97 5:12p Pgj - * stubs for evil guFb{Read|Write}Region() calls - * - * 8 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 7 5/21/97 6:05a Peter - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 5 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -/* CHD BUG this belongs in fxglide.h */ -void FX_CSTYLE -_gumpTexCombineFunction( int virtual_tmu ); - -GrMPState _gumpState; - -GR_DIENTRY(guMPInit, void, ( void )) -{ - int i; - - GDBG_INFO(98,"guMPInit()\n"); - for (i = 0; i < GLIDE_NUM_VIRTUAL_TMU; i += 1) - { - _gumpState.mmid[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - } - _gumpState.tc_fnc = GR_MPTEXTURECOMBINE_ADD; -} - -GR_DIENTRY(guMPTexCombineFunction, void, - ( GrMPTextureCombineFnc_t tc_fnc )) -{ - GDBG_INFO(98,"guMPTexCombineFunction(%d)\n",tc_fnc); - _gumpState.tc_fnc = tc_fnc; -} - -GR_DIENTRY(guMPTexSource, void, - ( GrChipID_t virtual_tmu, GrMipMapId_t mmid )) -{ - GR_DCL_GC; - FXUNUSED( gc ); - GDBG_INFO(98,"guMPTexSource(%d,%d)\n",virtual_tmu,mmid); - GR_CHECK_TMU("guMPTexSource",virtual_tmu); - _gumpState.mmid[virtual_tmu] = mmid; -} - -extern FX_ENTRY void FX_CALL -guFbReadRegion( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ); - -extern FX_ENTRY void FX_CALL -guFbWriteRegion( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes); - - -/*--------------------------------------------------------------------------- -** guFbReadRegion XXX obsolete -*/ -GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) ) -{ -} - -/*--------------------------------------------------------------------------- -** guFbWriteRegion XXX obsolete -*/ -GR_ENTRY(guFbWriteRegion, void, ( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes)) -{ -} diff --git a/glide2x/h3/glide/src/gump.h b/glide2x/h3/glide/src/gump.h deleted file mode 100644 index e64d4df..0000000 --- a/glide2x/h3/glide/src/gump.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -*/ - -/* Multipass drawing */ - -#ifndef __GUMP_H__ -#define __GUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define GLIDE_NUM_VIRTUAL_TMU 2 /* Number of virtual TMUs */ - -typedef FxU32 GrMPTextureCombineFnc_t; -#define GR_MPTEXTURECOMBINE_ADD 0x0 /* */ -#define GR_MPTEXTURECOMBINE_MULTIPLY 0x1 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL0 0x2 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL1 0x3 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR0 0x4 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR1 0x5 /* */ -#define GR_MPTEXTURECOMBINE_SUBTRACT 0x6 /* */ - -typedef struct { - GrMipMapId_t mmid[GLIDE_NUM_VIRTUAL_TMU]; - GrMPTextureCombineFnc_t tc_fnc; -} GrMPState; - -FX_ENTRY void FX_CALL guMPInit( void ); -FX_ENTRY void FX_CALL guMPTexCombineFunction( GrMPTextureCombineFnc_t tc ); -FX_ENTRY void FX_CALL guMPTexSource( GrChipID_t virtual_tmu, GrMipMapId_t mmid ); -FX_ENTRY void FX_CALL guMPDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); - -#ifdef __cplusplus -} -#endif - -#endif /* __GUMP_H__ */ diff --git a/glide2x/h3/glide/src/gutex.c b/glide2x/h3/glide/src/gutex.c deleted file mode 100644 index 851d24e..0000000 --- a/glide2x/h3/glide/src/gutex.c +++ /dev/null @@ -1,211 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 25 2/16/99 4:14p Peter -** made texture table declarations consistent -** -** 24 10/20/98 4:39p Atai -** update tramOffset and tramSize -** -** 23 3/28/98 11:24a Dow -** itwoç - * - * 20 1/07/98 10:22a Peter - * lod dithering env var - * - * 19 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 18 12/17/97 4:45p Peter - * groundwork for CrybabyGlide - * - * 17 12/02/97 9:49a Dow - * rid the world of the "Setting the same state twice" message - * - * 16 11/20/97 6:59p Dow - * Fixed baseAddress for Banshee (the Devil's Own Test still uses guTex - * Stuff). - * - * 15 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 14 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 13 11/03/97 3:43p Peter - * h3/cvg cataclysm - * - * 12 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 11 9/04/97 3:32p Peter - * starting grouping serial reg writes - * - * 10 6/06/97 10:47a Peter - * texture downloading, fixed 640x480 dimension, changed cvg dep to be the - * same as sst1 - * - * 9 5/27/97 1:16p Peter - * Basic cvg, w/o cmd fifo stuff. - * - * 8 5/21/97 6:05a Peter - * - * 7 3/04/97 9:08p Dow - * - * 6 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 5 11/18/96 9:14a Sellers - * added checking for crossing of 2 MByte texture boundry -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifndef GLIDE3_ALPHA - -/*--------------------------------------------------------------------------- -** guTexSource -*/ - -GR_ENTRY(guTexSource, void, (GrMipMapId_t mmid)) -{ -#define FN_NAME "guTexSource" - FxU32 texMode, tLod; - FxU32 oldtexMode; - FxU32 baseAddress; - int tmu; - const GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexSource",99); - GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mmid); - - /* Make sure that mmid is not NULL */ - if (mmid == GR_NULL_MIPMAP_HANDLE) return; - - /* get a pointer to the relevant GrMipMapInfo struct */ - mminfo = &gc->mm_table.data[mmid]; - tmu = mminfo->tmu; - - GR_CHECK_TMU(myName, tmu); - - gc->state.current_mm[tmu] = mmid; - - /* Set up new glide state for this mmid */ - gc->state.tmu_config[tmu].mmMode = mminfo->mipmap_mode; - gc->state.tmu_config[tmu].smallLod = mminfo->lod_min; - gc->state.tmu_config[tmu].largeLod = mminfo->lod_max; - gc->state.tmu_config[tmu].evenOdd = mminfo->odd_even_mask; - gc->state.tmu_config[tmu].nccTable = 0; - - /* Set up base address, texMode, and tLod registers */ - - baseAddress = mminfo->tmu_base_address + gc->tramOffset[tmu]; - texMode = mminfo->tTextureMode; - tLod = mminfo->tLOD; - - oldtexMode = gc->state.tmu_config[tmu].textureMode; - oldtexMode &= ~(SST_TFORMAT | SST_TCLAMPT | - SST_TCLAMPS | SST_TNCCSELECT | - SST_TLODDITHER | SST_TCLAMPW | - SST_TMAGFILTER | SST_TMINFILTER | - SST_TRILINEAR); - texMode |= oldtexMode; - if (!gc->state.allowLODdither) texMode &= ~SST_TLODDITHER; - - /* Download the NCC table, if needed. */ - if ((mminfo->format == GR_TEXFMT_YIQ_422) || - (mminfo->format == GR_TEXFMT_AYIQ_8422)) { - int table; /* ncc table we'll use */ - - /* See if it's already down there */ - if (gc->tmu_state[tmu].ncc_mmids[0] == mmid) { - /* Table 0 has what we need, so make it current */ - table = 0; - } else if (gc->tmu_state[tmu].ncc_mmids[1] == mmid) { - /* Table 1 has what we need, so make it current */ - table = 1; - } else { - /* - ** it's not down there, so we need to pick the table and - ** download it - */ - /* Which table should we use? */ - table = gc->tmu_state[tmu].next_ncc_table; - - /* Download NCC table */ - _grTexDownloadNccTable(tmu, table, &mminfo->ncc_table, 0, 11); - - /* Set the mmid so we known it's down there */ - gc->tmu_state[tmu].ncc_mmids[table] = mmid; - - /* Set the state to know which table was the LRA */ - gc->tmu_state[tmu].next_ncc_table = (table == 0 ? 1 : 0); - } /* we had to download it */ - - /* - ** Setting the TNCCSelect bit to 0 selects table 0, setting it to 1 - ** selects table 1 - */ - if (table == 0) - texMode &= ~(SST_TNCCSELECT); - else - texMode |= SST_TNCCSELECT; - } /* if it's an NCC texture */ - - /* Force LOD dithering if the user asked for it. - * - * NB: There is a performance hit for this, but it does - * look better. - */ - texMode |= _GlideRoot.environment.texLodDither; - - /* Write relevant registers out to hardware */ - hw = SST_TMU(hw, tmu); - REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 3, 0x0B); - { - REG_GROUP_SET(hw, textureMode, texMode); - REG_GROUP_SET(hw, tLOD, tLod); - REG_GROUP_SET(hw, texBaseAddr, baseAddress); - } - REG_GROUP_END(); - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -#undef FN_NAME -} /* guTexSource */ - -#endif /* !GLIDE3_ALPHA */ - diff --git a/glide2x/h3/glide/src/gxdraw.c b/glide2x/h3/glide/src/gxdraw.c deleted file mode 100644 index 76c31b6..0000000 --- a/glide2x/h3/glide/src/gxdraw.c +++ /dev/null @@ -1,610 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 65 3/02/99 2:22p Peter -** removed no_tsu cruft -** -** 64 12/03/98 11:27p Dow -** Code 'cleanup' heç -** -** 63 4/05/98 2:32p Dow -** Fixed non-debug compiler error -** -** 62 4/03/98 2:04p Dow -** Dos Glide Mods - * - * 60 12/01/97 6:13p Peter - * non-packet3 tsu triangles ooz vs z - * - * 59 11/21/97 3:20p Peter - * direct writes tsu registers - * - * 58 11/18/97 4:36p Peter - * chipfield stuff cleanup and w/ direct writes - * - * 57 11/17/97 4:55p Peter - * watcom warnings/chipfield stuff - * - * 56 11/12/97 9:54p Peter - * fixed all the effage from new config - * - * 55 11/03/97 4:38p Peter - * yapc fix - * - * 54 11/01/97 10:01a Peter - * tri dispatch stuff - * - * 53 10/29/97 2:45p Peter - * C version of Taco's packing code - * - * 52 10/27/97 5:59p Peter - * removed some debugging code - * - * 51 10/21/97 3:22p Peter - * hand pack rgb - * - * 50 10/19/97 12:51p Peter - * no tsu happiness - * - * 49 10/19/97 10:59a Peter - * fixed p1 tsu writes - * - * 48 10/17/97 3:15p Peter - * removed unused addr field from datalist - * - * 47 10/17/97 10:15a Peter - * packed rgb state cleanup - * - * 46 10/16/97 5:33p Peter - * argb != rgba - * - * 45 10/16/97 3:40p Peter - * packed rgb - * - * 44 10/16/97 10:31a Peter - * fixed hoopti tsu-subtractor unsorted - * - * 43 10/15/97 5:53p Peter - * hoopti tri compare code - * - * 42 10/10/97 4:33p Peter - * non-packet3 tsu triangles - * - * 41 10/08/97 5:19p Peter - * optinally clamp only texture params - * - * 40 10/08/97 11:32a Peter - * pre-computed packet headers for packet 3 - * - * 39 9/20/97 4:42p Peter - * tri_setf fixup/big fifo - * - * 38 9/16/97 2:50p Peter - * fixed watcom unhappiness w/ static initializers - * - * 37 9/15/97 7:31p Peter - * more cmdfifo cleanup, fixed normal buffer clear, banner in the right - * place, lfb's are on, Hmmmm.. probably more - * - * 36 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 35 9/03/97 2:11p Peter - * start gdbg_info cleanup, fixed zero area no-tsu triangle effage - * - * 34 9/01/97 3:19p Peter - * no-tsu w from vertex not tmuvtx - * - * 33 8/31/97 4:06p Peter - * no tsu fix - * - * 32 8/31/97 12:04p Peter - * hacked no-tsu code - * - * 31 7/25/97 11:40a Peter - * removed dHalf, change field name to match real use for cvg - * - * 30 6/30/97 3:22p Peter - * cmd fifo sanity - * - * 29 6/24/97 4:02p Peter - * proper cmd fifo placement - * - * 28 6/23/97 4:43p Peter - * cleaned up #defines etc for a nicer tree - ** - */ - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GDBG_INFO_ON -/* Some debugging information */ -static char *indexNames[] = { - "GR_VERTEX_X_OFFSET", /* 0 */ - "GR_VERTEX_Y_OFFSET", /* 1 */ - "GR_VERTEX_Z_OFFSET", /* 2 */ - "GR_VERTEX_R_OFFSET", /* 3 */ - "GR_VERTEX_G_OFFSET", /* 4 */ - "GR_VERTEX_B_OFFSET", /* 5 */ - "GR_VERTEX_OOZ_OFFSET", /* 6 */ - "GR_VERTEX_A_OFFSET", /* 7 */ - "GR_VERTEX_OOW_OFFSET", /* 8 */ - "GR_VERTEX_SOW_TMU0_OFFSET", /* 9 */ - "GR_VERTEX_TOW_TMU0_OFFSET", /* 10 */ - "GR_VERTEX_OOW_TMU0_OFFSET", /* 11 */ - "GR_VERTEX_SOW_TMU1_OFFSET", /* 12 */ - "GR_VERTEX_TOW_TMU1_OFFSET", /* 13 */ - "GR_VERTEX_OOW_TMU1_OFFSET" /* 14 */ -}; - -#endif - -/* - ** _trisetup_nogradients - ** - ** This routine does all the setup needed for drawing a triangle. It - ** is intended to be an exact specification for the mechanisim used - ** to pass vertices to the assembly language triangle setup code, and - ** as such has no optimizations at all. Whenever a 'shortcut' - ** routine to draw triangles (such as for antialiasing, fast lines, - ** fast spans, polygons, etc) is needed, this code should be used as - ** the starting point. - ** - */ -GR_DDFUNC(_trisetup_nogradients, - FxI32, - (const GrVertex *va, const GrVertex *vb, const GrVertex *vc)) -{ -#define FN_NAME "_trisetup_nogradients" - GR_DCL_GC; - -#if GLIDE_TRI_CULLING - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - -#ifdef GDBG_INFO_ON - FXUNUSED(indexNames); -#endif - { - int culltest = gc->state.cull_mode; - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* Stash the area in the float pool for easy access */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - -#define FloatVal(__f) (((__f) < 786432.875) ? (__f) : ((__f) - 786432.875)) - { - const FxI32 j = *(FxI32*)&_GlideRoot.pool.ftemp1; - - /* Zero-area triangles are BAD!! */ - if ((j & 0x7FFFFFFF) == 0) { - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[0]), FloatVal(fa[1]), - FloatVal(fb[0]), FloatVal(fb[1]), - FloatVal(fc[0]), FloatVal(fc[1]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - return 0; - } - - /* Backface culling, use sign bit as test */ - if ((gc->state.cull_mode != GR_CULL_DISABLE) && - ((j ^ (culltest << 31)) >= 0)) { - - GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n", - FloatVal(fa[0]), FloatVal(fa[1]), - FloatVal(fb[0]), FloatVal(fb[1]), - FloatVal(fc[0]), FloatVal(fc[1]), - _GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest); - - return -1; - } - } - } -#endif /* GLIDE_TRI_CULLING */ - - _GlideRoot.stats.trisProcessed++; - - /* Stuff for using hw tsu */ -#if GLIDE_HW_TRI_SETUP - { - const float* vectorArray[3]; - - /* Load up the real vertices */ - vectorArray[0] = &va->x; - vectorArray[1] = &vb->x; - vectorArray[2] = &vc->x; - -#if GLIDE_PACKET3_TRI_SETUP - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, 1); - TRI_BEGIN(); - { - int vectorIndex; - - for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) { - const float* const vector = vectorArray[vectorIndex]; - - /* Triangle vertex coordinages (x, y) */ - TRI_SETF(vector[GR_VERTEX_X_OFFSET]); - TRI_SETF(vector[GR_VERTEX_Y_OFFSET]); - - /* Other triangle parameters */ - { - const int* dataList = gc->tsuDataList; - -#if GLIDE_PACKED_RGB - { - FxBool doColorP = FXFALSE; - FxU32 packedColor = 0x00; - - if (*dataList == (GR_VERTEX_R_OFFSET << 2)) { - packedColor = (RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_B_OFFSET << 2)), B) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_G_OFFSET << 2)), G) | - RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_R_OFFSET << 2)), R)); - dataList++; - doColorP = FXTRUE; - } - - if (*dataList == (GR_VERTEX_A_OFFSET << 2)) { - packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A); - dataList++; - doColorP = FXTRUE; - } - - if (doColorP) TRI_SET(packedColor); - } -#endif /* GLIDE_PACKED_RGB */ - -#if GLIDE_FP_CLAMP_TEX - while(*dataList != 0) { - TRI_SETF(FARRAY(vector, *dataList)); - dataList++; - } - - dataList++; -#endif /* GLIDE_FP_CLAMP_TEX */ - - while(*dataList != 0) { - TRI_SETF_CLAMP(FARRAY(vector, *dataList)); - dataList++; - } - } - } - } - TRI_END; - GR_CHECK_SIZE(); -#else /* !GLIDE_PACKET3_TRI_SETUP */ - { - GR_DCL_HW; - int vectorIndex; - FxU32 sMode = (gc->cmdTransportInfo.paramMask >> SSTCP_PKT3_PMASK_SHIFT); - FxU32 paramMask = (sMode & 0xFF); - FxU32 paramCount; - - /* Convert packet 3 paramMask into sMode format */ - sMode = (paramMask | ((sMode & 0xF000) << 4)); - - { - const FxBool hasColor = ((sMode & 0x01) != 0); - const FxBool hasAlpha = ((sMode & 0x02) != 0); - const FxBool hasZ = ((sMode & 0x04) != 0); - const FxBool hasWb = ((sMode & 0x08) != 0); - const FxBool hasW0 = ((sMode & 0x10) != 0); - const FxBool hasST0 = ((sMode & 0x20) != 0); - const FxBool hasW1 = ((sMode & 0x40) != 0); - const FxBool hasST1 = ((sMode & 0x80) != 0); - - /* We always send vertex XY */ - paramCount = 2; - paramMask = 0x03; - - /* Build parameter data for reg group packet */ -#if GLIDE_PACKED_RGB - if (hasColor || hasAlpha) { - paramCount += 1; - paramMask |= 0x04; - } -#else /* !GLIDE_PACKED_RGB */ - if (hasColor) { - paramCount += 3; - paramMask |= 0x38; - } - if (hasAlpha) { - paramCount += 1; - paramMask |= 0x40; - } -#endif /* !GLIDE_PACKED_RGB */ - - if (hasZ) { - paramCount += 1; - paramMask |= 0x80; - } - if (hasWb) { - paramCount += 1; - paramMask |= 0x100; - } - if (hasW0) { - paramCount += 1; - paramMask |= 0x200; - } - if (hasST0) { - paramCount += 2; - paramMask |= 0xC00; - } - if (hasW1) { - paramCount += 1; - paramMask |= 0x1000; - } - if (hasST1) { - paramCount += 2; - paramMask |= 0x6000; - } - - /* Set mode once for teh whole triangle */ - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - GR_SET(BROADCAST_ID, hw, sSetupMode, sMode); - GR_CHECK_SIZE(); - - for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) { - const GrVertex* curVertex = (const GrVertex*)vectorArray[vectorIndex]; - - REG_GROUP_BEGIN(BROADCAST_ID, sVx, paramCount, paramMask); - { - REG_GROUP_SETF(hw, sVx, curVertex->x); - REG_GROUP_SETF(hw, sVy, curVertex->y); - -#if GLIDE_PACKED_RGB - if (hasColor || hasAlpha) { - FxU32 packedVal = 0x00; - - if (hasColor) - packedVal = ( - (RGBA_COMP_CLAMP(curVertex->b) << 0UL) | - (RGBA_COMP_CLAMP(curVertex->g) << 8UL) | - (RGBA_COMP_CLAMP(curVertex->r) << 16UL)); - if (hasAlpha) packedVal |= (RGBA_COMP_CLAMP(curVertex->a) << 24UL); - - REG_GROUP_SET(hw, sARGB, packedVal); - } -#else /* !GLIDE_PACKED_RGB */ - if (hasColor) { - REG_GROUP_SETF(hw, sRed, curVertex->r); - REG_GROUP_SETF(hw, sGreen, curVertex->g); - REG_GROUP_SETF(hw, sBlue, curVertex->b); - } - if (hasAlpha) REG_GROUP_SETF(hw, sAlpha, curVertex->a); -#endif /* !GLIDE_PACKED_RGB */ - - if (hasZ) REG_GROUP_SETF(hw, sVz, curVertex->ooz); - if (hasWb) REG_GROUP_SETF(hw, sOowfbi, curVertex->oow); - - /* TMU0 */ - if (hasW0) REG_GROUP_SETF(hw, sOow0, curVertex->tmuvtx[0].oow); - if (hasST0) { - REG_GROUP_SETF(hw, sSow0, curVertex->tmuvtx[0].sow); - REG_GROUP_SETF(hw, sTow0, curVertex->tmuvtx[0].tow); - } - - /* TMU1 */ - if (hasW1) REG_GROUP_SETF(hw, sOow1, curVertex->tmuvtx[1].oow); - if (hasST1) { - REG_GROUP_SETF(hw, sSow1, curVertex->tmuvtx[1].sow); - REG_GROUP_SETF(hw, sTow1, curVertex->tmuvtx[1].tow); - } - } - REG_GROUP_END(); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1); - if (vectorIndex == 0) { - GR_SET(BROADCAST_ID, hw, sBeginTriCMD, 0); - } else { - GR_SET(BROADCAST_ID, hw, sDrawTriCMD, 0); - } - GR_CHECK_SIZE(); - } - } - } -#endif /* !GLIDE_PACKET3_TRI_SETUP */ - - goto __triDrawn; - } -#endif /* GLIDE_HW_TRI_SETUP */ - -#if !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE - -#if !defined(GLIDE_TRI_CULLING) || !GLIDE_TRI_CULLING -#error "GLIDE_TRI_CULLING must be enabled to sort vertices" -#endif - -#if HOOPTI_TRI_SETUP_COMPARE -__tsuTriClampFailure: - _GlideRoot.stats.tsuExpClamp++; -#endif /* HOOPTI_TRI_SETUP_COMPARE */ - - { - GR_DCL_HW; - - TRI_NO_TSU_BEGIN(FXTRUE); - { - const float ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - volatile FxU32* hwAddr = &hw->FvA.x; - - /* Divide the deltas by the area for gradient calculation. */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - - GDBG_INFO(85, FN_NAME": No-TSU Triangle area: (%g %g) : (%g %g %g %g)\n", - _GlideRoot.pool.ftemp1, ooa, - dxAB, dxBC, dyAB, dyBC); - - /* write out X & Y for vertex A */ - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_Y_OFFSET]); - - /* write out X & Y for vertex B */ - TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_Y_OFFSET]); - - /* write out X & Y for vertex C */ - TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_X_OFFSET]); - TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_Y_OFFSET]); - - /* Send down the starting parameter values, these come from - * the sorted vertex A. - */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - TRI_NO_TSU_SETF(hwAddr++, fa[i++]); - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - TRI_NO_TSU_SETF(hwAddr++, fa[i]); - i++; - } - - TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_OOW_OFFSET]); - } - - /* Send the x gradients */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - const float curGrad = (((fa[i] - fb[i]) * dyBC) - - ((fb[i] - fc[i]) * dyAB)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - const float curGrad = (((fa[i] - fb[i]) * dyBC) - - ((fb[i] - fc[i]) * dyAB)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - { - const float curGrad = (((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dyBC) - - ((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dyAB)); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - } - } - - /* Send the y gradients */ - { - int i = GR_VERTEX_R_OFFSET; - - while(i < GR_VERTEX_OOW_OFFSET) { - const float curGrad = (((fb[i] - fc[i]) * dxAB) - - ((fa[i] - fb[i]) * dxBC)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - /* Skip fbi oow */ - i++; - - /* FixMe? We currently only do one tmu. */ - while(i < GR_VERTEX_OOW_TMU0_OFFSET) { - const float curGrad = (((fb[i] - fc[i]) * dxAB) - - ((fa[i] - fb[i]) * dxBC)); - - GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n", - ((FxU32)hwAddr - (FxU32)hw) >> 2, - fa[i], fb[i], fc[i], curGrad); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - i++; - } - - { - const float curGrad = (((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dxAB) - - ((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dxBC)); - - TRI_NO_TSU_SETF(hwAddr++, curGrad); - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - TRI_NO_TSU_SETF(hwAddr, _GlideRoot.pool.ftemp1); - _GlideRoot.stats.trisDrawn++; - } - TRI_NO_TSU_END(); - } - - goto __triDrawn; -#endif /* !GLIDE_HW_TRI_SETUP || HOOPTI_TRI_SETUP_COMPARE */ - -__triDrawn: - /* If we made it this far then we drew the triangle */ - _GlideRoot.stats.trisDrawn++; - GR_CHECK_SIZE(); - - return 1; - -#undef FN_NAME -} /* _trisetup_nogradients */ diff --git a/glide2x/h3/glide/src/makefile b/glide2x/h3/glide/src/makefile deleted file mode 100644 index df68009..0000000 --- a/glide2x/h3/glide/src/makefile +++ /dev/null @@ -1,360 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -TAG_REGEXP = $(BUILD_ROOT)\$(FX_GLIDE_HW)\glide\src\glide.rx - -!if "$(FX_CHRIS_DENIS_ANTHONY_HACK)" == "1" -LCDEFS = $(LCDEFS) -DCHRIS_DENIS_ANTHONY_HACK=1 -!endif - -!if "$(FX_TARGET)" == "WIN32" -LCINCS = -I$(DXDDK)\inc -I$(DXDDK)\inc32 -!endif - -FX_TACO_MEMORY_FIFO_HACK = -!if "$(FX_TACO_MEMORY_FIFO_HACK)" != "" -LCDEFS = $(LCDEFS) -DTACO_MEMORY_FIFO_HACK -!endif - -!if "$(DIAG_BUILD)" != "" -LCDEFS = $(LCDEFS) -DDIAG_BUILD -!endif - -# This is a bit of a red herring -!if "$(FX_GLIDE_DIRECT_WRITE)" == "1" -FX_GLIDE_DIRECT_WRITE = 1 -FX_GLIDE_CTRISETUP = 1 -LCDEFS = $(LCDEFS) -DDIRECT_IO=1 -!else -FX_GLIDE_PACKET_FIFO = 1 -!endif - -# Make a static link library for things like the diags. -!if "$(FX_DLL_BUILD)" == "1" -FX_DLL_LIBRARY = 1 -!else -LCDEFS = $(LCDEFS) -DFX_STATIC_BUILD -FX_GLIDE_CTRISETUP = 1 -!endif - -!if "$(FX_GLIDE_PACKET_FIFO)" == "1" -CMDXPORTDEFS = -DGLIDE_PACKET3_TRI_SETUP=1 -DUSE_PACKET_FIFO=1 -DGLIDE_HW_TRI_SETUP=1 -!else -CMDXPORTDEFS = -DUSE_PACKET_FIFO=0 -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -FX_GLIDE_DEBUG_FIFO=1 -!endif - -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 - -!if "$(FX_GLIDE_CTRISETUP)" != "1" -FX_GLIDE_CTRISETUP = 0 -!endif -HWSPEC = fifo.c -LCDEFS = $(LCDEFS) -DH3 $(CMDXPORTDEFS) -INITLIB = $(BUILD_ROOT)\$(FX_GLIDE_HW)\$(FX_GLIDE_HW)init.lib - -!if "$(FX_GLIDE_VTUNE)"!="" -OTSOPTS = /Zi -LLDOPTS = /DEBUG -!endif - -!if "$(DEBUG)" == "1" -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -!endif - -# So that we can get reasonable stuff from SoftIce etc even -# if we're building an optimized version. This should only -# add symbolics so it is really only a codesize issue. -!if "$(FX_GLIDE_SYMBOLICS)" == "1" -!if "$(DEBUG)" != "1" -OTSOPTS = /Zi -!endif -LLDOPTS = /MAP:glide2x.map /DEBUG -!endif - -!if "$(FX_COMPILER)" == "MICROSOFT" -DBGOPTS = $(DBGOPTS) /WX -!endif - -!if "$(FX_GLIDE_HW)" == "" -!error "FX_GLIDE_HW not defined" -!endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = -DSPOPTS = $(DSPOPTS) -DGLIDE_INIT_HWC - -DSPOPTS = $(DSPOPTS) -DHAL_HW=1 -SUBLIBRARIES = $(SUBLIBRARIES) - -!if !defined(DSPOPTS) -!error "Unknown HAL_* configuration" -!endif - -SUBLIBRARIES = $(SUBLIBRARIES) $(BUILD_ROOT)\h3\lib\minihwc.lib - -# 3DNow stuff -GL_AMD3D = 1 -!if "$(GL_AMD3D)"!="" -LCDEFS = $(LCDEFS) -DGL_AMD3D -LOBJECTS = $(LOBJECTS) xtexdl_3dnow.obj -CFILES = $(CFILES) xtexdl_def.c -!endif # GL_AMD3D - -# Do culling test in sw for independent triangles -CULL_MODE = -!if "$(FX_GLIDE_HW_CULL)" != "1" -CULL_MODE = -DGLIDE_TRI_CULLING=1 -!endif -DSPOPTS = $(DSPOPTS) $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -!if "$(FX_GLIDE_PACK_RGB)" == "1" -LCDEFS = $(LCDEFS) -DGLIDE_PACKED_RGB=1 -!endif - -!if "$(FX_GLIDE_NO_FIFO)" != "1" -FIFODEFS = -DUSE_PACKET_FIFO=1 - -!if "$(FX_GLIDE_DEBUG_FIFO)" == "1" -# GLIDE_USE_DEBUG_FIFO: Run w/ the small fifo to cause me/glide more stress -# FIFO_ASSERT_FULL: Check hw depth/fifo a lot (slow) -LCDEFS = $(LCDEFS) \ - -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 -DASSERT_FAULT=0 -DGLIDE_SANITY_SIZE=1 -!endif -!endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -!if "$(FX_GLIDE_CTRISETUP)" == "1" -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = $(CFILES) gxdraw.c -!else -DSPOPTS = $(DSPOPTS) -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 - -!if "$(GL_AMD3D)"=="" -ASMTRISETUP = xdraw2.asm -!else -LOBJECTS = $(LOBJECTS) \ - xdraw2_def.obj xdraw2_3dnow.obj -!endif # GL_AMD3D -!endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS = $(LCDEFS) -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -!if "$(FX_GLIDE_NO_PLUG)" == "1" -!else -LCDEFS = $(LCDEFS) -DGLIDE_PLUG -!endif - -# Turn Off/On splash screen -!if "$(FX_GLIDE_NO_SPLASH)" == "1" -!else -LCDEFS = $(LCDEFS) -DGLIDE_SPLASH -!endif - -!if "$(FX_PCI_TARGET)" == "NT" -LCDEFS = $(LCDEFS) -DNT_BUILD -!endif - -#Glide 3 Stuff, for migration all -!if "$(FX_GLIDE3)" != "" -LCDEFS = $(LCDEFS) -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -!endif - -#Glide 3. remove migration stuff -!if "$(FX_GLIDE3_ALPHA)" != "" -LCDEFS = $(LCDEFS) -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -!endif - -!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_SIZE) -LCDEFS = $(LCDEFS) -DGLIDE_SANITY_SIZE -!endif -!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_ASSERT) -LCDEFS = $(LCDEFS) -DGLIDE_SANITY_ASSERT -!endif - -# Local Defs, Includes, and Options (C) -LCINCS = $(LCINCS) -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -LCOPTS = $(LCOPTS) $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS = $(LADEFS) $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) /Fl /Sa - -AFILES = $(ASMTRISETUP) cpudtect.asm - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h fxsplash.h - -INSTALL_DESTINATION = $(BUILD_ROOT)\$(FX_GLIDE_HW) - -CFILES = $(CFILES) gsplash.c g3df.c gu.c guclip.c\ - gpci.c gump.c diglide.c disst.c ditex.c\ - gbanner.c gerror.c gmovie.c digutex.c ddgump.c\ - gaa.c gdraw.c gglide.c glfb.c gsst.c gtex.c\ - gtexdl.c gutex.c $(HWSPEC) $(GLIDE3FILES) - -OFILES = $(CFILES:.c=.obj) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -CODFILES = $(CFILES:.c=.cod) - -# targets -LDIRT = fxgasm.obj fxgasm.exe fxgasm.h fxinline.h fxbldno.obj fxbldno.exe fxbldno.h - -!if "$(FX_GLIDE3)" == "1" -LIBRARIES = glide3x.lib -!else -LIBRARIES = glide2x.lib -!endif -RCFILE = glide.rc - -LCDEFS = $(LCDEFS) $(FIFODEFS) - -!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak - -codfiles: $(CODFILES) -xdraw2.obj : xdraw2.asm xdraw2.inc fxgasm.h fxinline.h - -ctags: $(CFILES) - ctags $(CFILES) - -gsplash.obj : splshdat.c - -!if "$(FX_TARGET)" == "WIN32" -!if "$(FX_DLL_BUILD)" != "" -glide2x.dll: - del fxbldno.h -!endif -!endif - -!if "$(FX_TARGET)" == "DOS" -!if "$(FX_DLL_BUILD)" != "" - -glimport.obj: glimport.asm - -IMPORT_DEPS = $(BUILD_ROOT)\swlibs\lib\dllload.lib \ - $(DLLLOADS) glimport.obj - -glide2x.lib: $(IMPORT_DEPS) - if exist glide2x.lib del glide2x.lib - wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllload.lib +glimport.obj -!if "$(FX_WATCOM_REG_CALL)" != "1" - wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllloads.obj -!endif - if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib attrib -r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib del $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - xcopy /d /k /r /i /s /q glide2x.lib $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib - attrib +r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib - - -!endif -!endif - -!if "$(FX_COMPILER)" == "WATCOM" -#------------------------------------------------------------ -# special rul for makeing glideapi.obj under WATCOM -# - -glideapi.obj : glideapi.c - set $(CC_ENV_VAR)=-d2 $(GCFLAGS) $(LCFLAGS) $(VCFLAGS) - $(CC) glideapi.c -!endif - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm.exe: fxgasm.c $(HEADERS) gsstdef.h fxglide.h Makefile -!if "$(FX_COMPILER)" == "MICROSOFT" - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -I$(BUILD_ROOT)\swlibs\include $(LDFLAGS) -!else if "$(FX_COMPILER)" == "WATCOM" - set WCC386=$(CFLAGS) - wcl386 fxgasm.c -!endif -fxgasm.h: fxgasm.exe - fxgasm -hex > fxgasm.h -fxinline.h: fxgasm.exe - fxgasm -inline > fxinline.h - - -glide2x.nms: glide2x.dll - nmsym /trans:source,package,always /source:$(BUILD_ROOT)/h3/cinit;$(BUILD_ROOT)/h3/minihwc;$(BUILD_ROOT)\h3\glide\src glide2x.dll - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno.exe: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) -!if "$(FX_COMPILER)" == "MICROSOFT" - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) -!else if "$(FX_COMPILER)" == "WATCOM" - set WCC386=$(CFLAGS) - wcl386 fxbldno.c -!endif - -fxbldno.h: fxbldno.exe - fxbldno > fxbldno.h - -glide.res: rcver.h fxbldno.h -gglide.obj: rcver.h - -!if "$(FX_GLIDE_CTRISETUP)" != "1" -gdraw.obj: fxinline.h -!endif - -# 3DNow!(tm) dependencies -# XXX_def.obj targets are the default targets - -!if "$(GL_AMD3D)"!="" -xdraw2_def.obj: xdraw2.asm xdraw2.inc fxgasm.h - $(AS) $(AFLAGS) -Fo $@ xdraw2.asm - -xdraw2_3dnow.obj: xdraw2.asm xdraw2.inc fxgasm.h - $(AS) $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO=1 -Fo $@ xdraw2.asm - -xtexdl_3dnow.obj: xtexdl.asm fxgasm.h - $(AS) $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO=1 -Fo $@ xtexdl.asm - -!endif # GL_AMD3D diff --git a/glide2x/h3/glide/src/makefile.linux b/glide2x/h3/glide/src/makefile.linux deleted file mode 100644 index 6785e5f..0000000 --- a/glide2x/h3/glide/src/makefile.linux +++ /dev/null @@ -1,279 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - -ifeq ($(FX_CHRIS_DENIS_ANTHONY_HACK),1) -LCDEFS += -DCHRIS_DENIS_ANTHONY_HACK=1 -endif - -FX_TACO_MEMORY_FIFO_HACK = -ifneq ($(FX_TACO_MEMORY_FIFO_HACK),) -LCDEFS += -DTACO_MEMORY_FIFO_HACK -endif - -ifneq ($(DIAG_BUILD),) -LCDEFS += -DDIAG_BUILD -endif - -# This is a bit of a red herring -ifeq ($(FX_GLIDE_DIRECT_WRITE),1) -FX_GLIDE_DIRECT_WRITE = 1 -LCDEFS += -DDIRECT_IO=1 -else -FX_GLIDE_PACKET_FIFO = 1 -endif - -ifeq ($(FX_GLIDE_PACKET_FIFO),1) -CMDXPORTDEFS = -DGLIDE_PACKET3_TRI_SETUP=1 -DUSE_PACKET_FIFO=1 -DGLIDE_HW_TRI_SETUP=1 -else -CMDXPORTDEFS = -DUSE_PACKET_FIFO=0 -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0 -FX_GLIDE_DEBUG_FIFO=1 -endif - -FX_GLIDE_REAL_HW= 1 -FX_GLIDE_NO_FIFO= 1 - -ifneq ($(FX_GLIDE_CTRISETUP),1) -FX_GLIDE_CTRISETUP = 0 -endif -HWSPEC = fifo.c -LCDEFS += -DH3 $(CMDXPORTDEFS) - -INITLIB = $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib$(FX_GLIDE_HW)init.a - - -ifeq ($(DEBUG),1) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -ifeq ($(FX_GLIDE_HW),) -error "FX_GLIDE_HW not defined" -endif - -# Display Options -DSPOPTS = -SUBLIBRARIES = -DSPOPTS += -DGLIDE_INIT_HWC - -ifeq ($(HAL_HW),1) -DSPOPTS += -DHAL_HW=1 -SUBLIBRARIES += $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT)/$(FX_GLIDE_HW)/lib/libminihwc.a -LINKLIBRARIES += -L/usr/X11R6/lib -lX11 -lXext -lXxf86dga -lXxf86vm -endif - -ifeq ($(HAL_HW),) -SUBLIBRARIES += $(BUILD_ROOT)/h3/lib/libminihwc.a -endif - -# 3DNow stuff -GL_AMD3D = 1 -ifneq ($(GL_AMD3D),) -LCDEFS += -DGL_AMD3D -LIBOBJS += xtexdl_3dnow.o -CFILES += xtexdl_def.c -endif - -# Do culling test in sw for independent triangles -CULL_MODE = -ifneq ($(FX_GLIDE_HW_CULL),1) -CULL_MODE = -DGLIDE_TRI_CULLING=1 -endif -DSPOPTS += $(CULL_MODE) - -# Send a single DWORD ARGB rather than 4 fp values, at -# the cost of doing the conversion. -ifeq ($(FX_GLIDE_PACK_RGB),1) -LCDEFS += -DGLIDE_PACKED_RGB=1 -endif - -ifneq ($(FX_GLIDE_NO_FIFO),1) -FIFODEFS = -DUSE_PACKET_FIFO=1 - -ifeq ($(FX_GLIDE_DEBUG_FIFO),1) -# GLIDE_USE_DEBUG_FIFO: Run w/ the small fifo to cause me/glide more stress -# FIFO_ASSERT_FULL: Check hw depth/fifo a lot (slow) -LCDEFS += -DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 -DASSERT_FAULT=0 -DGLIDE_SANITY_SIZE=1 -endif -endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -CFILES = gxdraw.c -else -DSPOPTS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0 - -ifeq ($(GL_AMD3D),) -ASMTRISETUP = xdraw2.S -else -LIBOBJS += xdraw2_def.o xdraw2_3dnow.o -endif #GL_AMD3D -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifeq ($(FX_GLIDE_NO_PLUG),1) -else -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifeq ($(FX_GLIDE_NO_SPLASH),1) -else -LCDEFS += -DGLIDE_SPLASH -endif - -#Glide 3 Stuff, for migration all -ifneq ($(FX_GLIDE3),) -LCDEFS += -DGLIDE3 -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -#Glide 3. remove migration stuff -ifneq ($(FX_GLIDE3_ALPHA),) -LCDEFS += -DGLIDE3_ALPHA -GLIDE3FILES = gstrip.c distrip.c distate.c diget.c -endif - -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_SIZE),) -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifneq ($(GLIDE_SANITY_ALL)$(GLIDE_SANITY_ASSERT),) -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS += -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) cpudtect.S - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h fxsplash.h - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -CFILES += gsplash.c g3df.c gu.c guclip.c\ - gpci.c gump.c diglide.c disst.c ditex.c\ - gbanner.c gerror.c gmovie.c digutex.c ddgump.c\ - gaa.c gdraw.c gglide.c glfb.c gsst.c gtex.c\ - gtexdl.c gutex.c $(HWSPEC) $(GLIDE3FILES) - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h fxinline.h fxbldno.o fxbldno fxbldno.h - -ifeq ($(FX_GLIDE3),1) -LIBRARIES = libglide3.a -SHARED_LIBRARY = libglide3.so.3.10 -else -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.60 -endif -RCFILE = glide.rc - -# Make a static link library for things like the diags. -ifeq ($(FX_DLL_BUILD),1) -FX_DLL_LIBRARY = 1 -else -LCDEFS += -DFX_STATIC_BUILD -endif - - -LCDEFS += $(FIFODEFS) - -include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak - -ctags: $(CFILES) - ctags $(CFILES) - -gbanner.obj : banner.inc -gsplash.obj : splshdat.c - -#-------------------------------------------------------------------------- -# special rules for making FXGASM.H -# -fxgasm: fxgasm.c $(HEADERS) gsstdef.h fxglide.h makefile.linux - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include -I$(BUILD_ROOT)/swlibs/include \ - $(LDFLAGS) - -fxgasm.h: fxgasm - ./fxgasm -hex > fxgasm.h -fxinline.h: fxgasm - ./fxgasm -inline > fxinline.h - - -#-------------------------------------------------------------------------- -# special rules for making FXBLDNO.H -# - -fxbldno: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS) - -fxbldno.h: fxbldno - ./fxbldno > fxbldno.h - -ifneq ($(FX_GLIDE_CTRISETUP),1) -gdraw.o: fxinline.h -endif - -xdraw2.o : xdraw2.S xdraw2.inc.S fxgasm.h fxinline.h - $(CC) -c -o xdraw2.o $(AFLAGS) xdraw2.S - -cpudtect.o : cpudtect.S - $(CC) -c -o cpudtect.o $(AFLAGS) cpudtect.S - -ifneq ($(GL_AMD3D),) -xdraw2_def.o: xdraw2.S xdraw2.inc.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) xdraw2.S - -xdraw2_3dnow.o: xdraw2.S xdraw2.inc.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO xdraw2.S - -xtexdl_3dnow.o: xtexdl.S fxgasm.h - $(CC) -c -o $@ $(AFLAGS) -DGL_AMD3D -DUSE_PACKET_FIFO xtexdl.S -endif diff --git a/glide2x/h3/glide/src/qmodes.h b/glide2x/h3/glide/src/qmodes.h deleted file mode 100644 index 28dbcbe..0000000 --- a/glide2x/h3/glide/src/qmodes.h +++ /dev/null @@ -1,401 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** File name: qmodes.h -** -** Description: Structures, macros, etc to support query mode. -** -** $Revision$ -** $Date$ -** -** $History: qmodes.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:16p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/glide/src -** Phantom Menace and other fixes. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 2/25/99 Time: 12:48p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_CAPABLE. -** -** ***************** Version 19 ***************** -** User: Stuartb Date: 2/18/99 Time: 2:54p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added xlcd FPFLAGS for filter mode setting. -** -** ***************** Version 18 ***************** -** User: Andrew Date: 2/11/99 Time: 11:17a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added AGP Cap Query -** -** ***************** Version 17 ***************** -** User: Stuartb Date: 1/21/99 Time: 11:18a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_SETRES and FPFLAG_SETREFR for app code. Removed -** broadcastMonitorChange calls. -** -** ***************** Version 16 ***************** -** User: Stuartb Date: 1/12/99 Time: 2:27p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_ANALOG_MONITOR & modified QUERY_LCDCTRL. -** -** ***************** Version 15 ***************** -** User: Stuartb Date: 1/08/99 Time: 3:34p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 14 ***************** -** User: Bob Date: 1/05/99 Time: 5:57p -** Updated in $/devel/h3/WinNT/src/Video/Displays/H3 -** BIOS version reporting to Control Panel applet. -** -** Shared qmodes.h with Win9x and the rest of the universe. -** -** ***************** Version 13 ***************** -** User: Bob Date: 1/05/99 Time: 5:14p -** Updated in $/devel/h3/Win95/dx/dd16 -** Altered nesting of header files so that tv.h is not inside qmodes.h. -** -** This is a sharing issue with NT. -** -** ***************** Version 12 ***************** -** User: Larryw Date: 1/05/99 Time: 4:36p -** Updated in $/devel/swtools/3DfxV2ps -** Changed QUERY[GS]ETDESKTOPGAMMA back to QUERY[GS]ETGAMMA. -** -** ***************** Version 11 ***************** -** User: Larryw Date: 1/05/99 Time: 3:45p -** Updated in $/devel/swtools/3DfxV2ps -** Put MAX_BIOS_VERSION_STRING in; changed some Gamma query values -** -** ***************** Version 10 ***************** -** User: Andrew Date: 1/05/99 Time: 10:50a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added new function to get the bios version string -** -** ***************** Version 9 ***************** -** User: Michael Date: 12/29/98 Time: 2:37p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -** 8 10/10/98 5:21p Hsohel -** -** 7 10/10/98 4:52p Hsohel -** -** 6 10/10/98 3:36p Hsohel -** -** 5 10/09/98 3:54p Hsohel -** -** 4 7/13/98 5:26p Andrew -** Changed to support a gamma table -** -** 3 7/11/98 8:16a Andrew -** Added gamma correction -** -** 2 5/12/98 9:35a Andrew -** Added some minor changes for valid modes -** -** 1 4/22/98 2:47p Andrew -** Query Modes Protocol Information -** -** -*/ - -#ifndef _QMODES_H_ -#define _QMODES_H_ - -/* The QUERYMODES ESC Code */ -#define QUERYESCMODE (0x8001) - -#define TDFXACK (0x3DF0) -#define TDFXERR (0xFFFF) - -// General Queries -#define QUERYVERSION (0x0000) - -// Mode Queries -#define QUERYNUMMODES (0x0001) -#define QUERYMODES (0x0002) -#define QUERYDEVNODE (0x0003) - -// Virtual Desktop Queries -#define QUERYMAXFREEMEM (0x100) -#define QUERYSETVIRTUALSIZE (0x101) -#define QUERYGETSTARTADDR (0x102) -#define QUERYSETSTARTADDR (0x103) - -// Gamma Queries -#define QUERYGETGAMMA (0x200) -#define QUERYSETGAMMA (0x201) -#define QUERYGETGLIDEGAMMA (0x202) -#define QUERYSETGLIDEGAMMA (0x203) - -// BIOS Version -#define QUERYGETBIOSVERSION (0x280) - -// AGP Query -#define QUERYGETAGPCAPS (0x2A0) - -// TVOUT Queries -// see ..\inc\tv.h uses 0x300 -> 0x38f approx. - -// LCD CONTROL -#define QUERY_LCDCTRL (0x3a0) - -// ANALOG MONITOR ON/OFF override - -#define QUERY_ANALOG_MONITOR (0x3b0) - - -/* -** Protocol: -** -** Call will be of the form -** ExtEscape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, sizeof(Output), &Output); -** Escape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, &Output); -** -*/ - - -/* -** Standard Input Structure -** -*/ -typedef struct qin { - DWORD dwSubFunc; // Subfunction -} QIN, FAR * LPQIN, * PQIN; - -/* -** -** -** INPUT: qin.dwSubFunc = QUERYVERSION -** OUTPUT: Driver Major & Minor Version -*/ -typedef struct qversion { - DWORD dwMajor; - DWORD dwMinor; - } QVERSION, FAR * LPQVERSION, * PQVERSION; - -#define QUERYMODE_MAJOR 0x00000000 -#define QUERYMODE_MINOR 0x00009999 - -/* -** Call this function first to know how many modes to allow -** the following structure for -** -** INPUT: qin.dwSubFunc = QUERYNUMMODES -** OUTPUT: Number of modes -*/ -typedef struct qnummode { - DWORD dwNum; - } QNUMMODE, FAR * LPQNUMMODE, * PQNUMODE; - -/* -** This is the mode information. You will need to allocate -** # modes * QMODE structures that the Driver will fill in. -** -** INPUT: qin.dwSubFunc = QUERYMODES -** OUTPUT: #Modes * QMODE -*/ -typedef struct qmode { - DWORD dwX; - DWORD dwY; - DWORD dwBpp; - DWORD dwRef; - DWORD dwValid; // This will be a field of flags - } QMODE, FAR * LPQMODE, * PQMODE; - -#define QUERY_MODE_VALID (0x000000001L) -#define QUERY_TV_MODE (0x000000002L) - -/* -** This is Devnode that the driver is using -** -** INPUT: qin.dwSubFunc = QUERYDEVNODE -** OUTPUT: dwDevNode -*/ -typedef struct qdevnode { - DWORD dwDevNode; // Monitor Device Node - DWORD dwValidDefGamma; // 1 ==> bGamma is valid; 0 ==> Invalid - BYTE bGamma; // Monitor Default Gamma - } QDEVNODE, FAR * LPQDEVNODE, * PQDEVNODE; - -#define QUERY_MONITOR_GAMMA_VALID (0x00000001L) - -/* -** This is maximum free memory available for Virtual Desktop Usage in -** this mode -** -** INPUT: qin.dwSubFunc = QUERYMAXFREEMEM -** OUTPUT: Maximum Free Memory -*/ -typedef struct qmaxfree { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwMaxFree; // Free Memory Available for Virtual Desktop - DWORD dwMaxX; // Maximum Free X ==> min(dwMaxFree/Y, MaxHardwareX) - DWORD dwMaxY; // Maximum Free Y ==> min(dwMaxFree/(X*BPP), MaxHardwareY) - } QMAXFREE, FAR * LPQMAXFREE, * PQMAXFREE; - -/* -** This is used to set the Virtual Desktop Size -** -** INPUT: qsetvsize.dwSubFunc = QUERYSETVIRTUALSIZE -** OUTPUT: None -*/ -typedef struct qsetvsize { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwX; // X Size in Pixels (X * BPP * Y <= MaxMemSize) - DWORD dwY; // Y Size in Lines - } QSETVSIZE, FAR * LPQSETVSIZE, * PQSETVSIZE; - -/* -** This is used to get the Virtual Desktop Start Address -** -** INPUT: qin.dwSubFunc = QUERYGETSTARTADDR -** OUTPUT: QGetStartAddr -*/ -typedef struct qgetstartaddr { - DWORD dwX; // X Location in Pixels - DWORD dwY; // Y Location in Lines - } QGETSTARTADDR, FAR * LPQGETSTARTADDR, * PQGETSTARTADDR; - -/* -** This is used to move the Virtual Desktop Start Address -** -** INPUT: qsetstartaddr.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetstartaddr { - DWORD dwSubFunc; // Should be set to QUERYSETSTARTADDR - DWORD dwX; // X Location in Pixels (Note: Start Addr = X * BPP + Y * Display Pitch) - DWORD dwY; // Y Location in Lines - } QSETSTARTADDR, FAR * LPQSETSTARTADDR, * PQSETSTARTADDR; - -/* -** This is used to get the gamma values currently in use -** -** INPUT: qin.dwSubFunc = QUERYGETGAMMA -** OUTPUT: QGETGAMMA -*/ -typedef struct qgetgamma { - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QGETGAMMA, FAR * LPQGETGAMMA, * PQGETGAMMA; - -/* -** This is used to set the Gamma Value -** -** INPUT: qSetGamma.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetgamma { - DWORD dwSubFunc; // Should be set to QUERYSETGAMMA - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QSETGAMMA, FAR * LPQSETGAMMA, * PQSETGAMMA; - -#define MAX_BIOS_VERSION_STRING (32) - -/* -** This is used to get the BIOS version -** -** INPUT: qin.dwSubFunc = QUERYGETBIOSVERSION -** OUTPUT: QGETBIOSVERSION -*/ -typedef struct qgetbiosversion { - BYTE bBIOSVersion[MAX_BIOS_VERSION_STRING]; - } QGETBIOSVERSION, FAR * LPQGETBIOSVERSION, * PQGETBIOSVERSION; - - -/* -** This is used to get the AGP Caps -** -** INPUT: qin.dwSubFunc = QUERYGETAGPCAPS -** OUTPUT: QGETAGPCAPS -*/ -// These are also defined in h3g.h -#define IS_AGP_CARD (0x00000001L) //Card has AGP capabilities -#define IS_GART_AVAILABLE (0x00000002L) //VMM Gart Functions are present -#define IS_AGP_READY (IS_AGP_CARD|IS_GART_AVAILABLE) //We can do AGP Functions on this card - -typedef struct qgetagpcaps { - DWORD dwAGPCaps; - } QGETAGPCAPS, FAR * LPQGETAGPCAPS, * PQGETAGPCAPS; - -/* HWCEXT_LCDCTRL -* -* Enables or disables flat panel monitor and also returns current status as -* given in IN-OUT struct below: -* -*/ - -// CAUTION: this is mirrored in h3g.h!!! - -typedef struct { - DWORD dwSubFunc; // Should be set to QGETSET_LCDCTRL - DWORD maxWidth; // out - DWORD maxHeight; // out - DWORD refreshRate; // out - DWORD fpFlags; // in - out -} QGETSET_LCDCTRL; - -#define FPFLAG_ENABLED BIT(0) // is currently enabled (OUT) -#define FPFLAG_PRESENT BIT(1) // panel & controller connected (OUT) -#define FPFLAG_PRESENT_AT_BOOT BIT(2) // panel & controller connected - // at boot time (OUT) -#define FPFLAG_ENABLE BIT(3) // try to enable panel (IN) -#define FPFLAG_DISABLE BIT(4) // try to disable panel (IN) -#define FPFLAG_GET_DIMS BIT(5) // read the EDID to get panel's - // physical dimensions (IN) -#define FPFLAG_SETRES BIT(6) // current desktop resolution too hi - // (OUT) -#define FPFLAG_SETREFR BIT(7) // current refresh rate wrong (OUT) - -// filter bits -// 00 bilinear 01 gausian -// 10 crisp 11 extra crisp -#define FPFLAG_FILTER_SOFT BIT(8) // use these 2 bits together (IN) -#define FPFLAG_FILTER_HARD BIT(9) -#define FPFLAG_CAPABLE BIT(10) // board has controller & BIOS - - -typedef struct { - DWORD dwSubFunc; // Should be set to QUERY_ANALOG_MONITOR - DWORD monitorStatus; - DWORD monitorControl; -} QGETSET_MONITOR_CTL; - -#define ENABLE_MONITOR BIT(0) -#define DISABLE_MONITOR BIT(1) -#define MONITOR_IS_ENABLED BIT(2) - - -#ifdef WINNT -int QueryMode(PDEV *, LPQIN lpQIN, LPVOID lpOutput); -#else -int QueryMode(LPQIN lpQIN, LPVOID lpOutput); -#endif - -#endif diff --git a/glide2x/h3/glide/src/rcver.h b/glide2x/h3/glide/src/rcver.h deleted file mode 100644 index 54df333..0000000 --- a/glide2x/h3/glide/src/rcver.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#define MANVERSION 2 -#define MANREVISION 60 - -#ifdef __WIN32__ -#define BUILD_NUMBER 0415 -#endif - -#ifndef GLIDE3 -#define VERSIONSTR "2.60.00.0415" -#else -#define VERSIONSTR "3.0\0" -#endif - -#ifdef SST1 -# define HWSTR "Voodoo Graphics(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(SST96) -# define HWSTR " Voodoo Rush(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo^2(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(H3) -# define HWSTR " Voodoo Banshee(tm) & Voodoo3(tm)\0" -# define PRODNAME "Glide for Voodoo Banshee\256 and Voodoo3\256; Windows 95 \256, Windows 98 \256, and Windows NT\256\0" -#else -# define HWSTR "Unknown Chip\0" -#endif diff --git a/glide2x/h3/glide/src/readme b/glide2x/h3/glide/src/readme deleted file mode 100644 index 835083d..0000000 --- a/glide2x/h3/glide/src/readme +++ /dev/null @@ -1,40 +0,0 @@ -GDEBUG levels: - -Level Description ------ ------------------------------------------------ - 80 init routines - 81 gu3df* - 82 grLfb* - 83 grSst* - 84 grSstStatus, grSstIsBusy, grSstVideoLine - 85 gr* misc state routines - 86 grBuffer* - 87 grDisableAllEffects, grGlide?etState - 88 grTex* attribute routines - 89 grTex* download routines - 90 grDrawPoint - 91 grDrawLine - 92 grDrawTriangle - 93 grDrawPolygon* - 94 grDrawAAPoint - 95 grDrawAALine - 96 grDrawAATriangle - 97 grDrawAAPolygon* - 98 guMP* routines - 99 gu* misc. routines -280 internal init routines -281 routine exit traces -282 dataList values - -GLIDE_PLATFORM: - - GLIDE_HARDWARE: - Defined if GLIDE should use the actual SST hardware. - - GLIDE_HW_*: - GLIDE_HW_SST1: - This macro is for compiling - GLIDE_HW_SST96: - This macro is for compiling Glide for SST96 - GLIDE_HW_H3: - This macro is for compiling Glide for H3 diff --git a/glide2x/h3/glide/src/splshdat.c b/glide2x/h3/glide/src/splshdat.c deleted file mode 100644 index 18de6dc..0000000 --- a/glide2x/h3/glide/src/splshdat.c +++ /dev/null @@ -1,14809 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:30 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. - * - * 6 1/09/98 6:48p Atai - * grTexInfo, GR_LOD_* and GR_ASPECT_* - * - * 5 12/09/97 10:20a Peter - * removed extraneous cruft - * - * 4 6/02/97 4:09p Peter - * Compile w/ gcc for Dural - * - * 3 5/21/97 6:05a Peter -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ { 61, 60, 59 }, 3, 0 }, -{ { 55, 54, 53 }, 3, 0 }, -{ { 57, 56, 55 }, 3, 0 }, -{ { 39, 38, 37 }, 3, 0 }, -{ { 37, 36, 35 }, 3, 0 }, -{ { 53, 52, 51 }, 3, 0 }, -{ { 41, 40, 39 }, 3, 0 }, -{ { 43, 42, 41 }, 3, 0 }, -{ { 59, 58, 57 }, 3, 0 }, -{ { 63, 62, 61 }, 3, 0 }, -{ { 45, 44, 43 }, 3, 0 }, -{ { 35, 34, 67 }, 3, 0 }, -{ { 67, 66, 65 }, 3, 0 }, -{ { 51, 50, 49 }, 3, 0 }, -{ { 49, 48, 47 }, 3, 0 }, -{ { 65, 64, 63 }, 3, 0 }, -{ { 47, 46, 45 }, 3, 0 }, -{ { 41, 39, 37 }, 3, 0 }, -{ { 43, 41, 37 }, 3, 0 }, -{ { 43, 37, 35 }, 3, 0 }, -{ { 45, 43, 35 }, 3, 0 }, -{ { 45, 35, 67 }, 3, 0 }, -{ { 47, 45, 67 }, 3, 0 }, -{ { 47, 67, 65 }, 3, 0 }, -{ { 49, 47, 65 }, 3, 0 }, -{ { 49, 65, 63 }, 3, 0 }, -{ { 51, 49, 63 }, 3, 0 }, -{ { 51, 63, 61 }, 3, 0 }, -{ { 53, 51, 61 }, 3, 0 }, -{ { 53, 61, 59 }, 3, 0 }, -{ { 53, 59, 57 }, 3, 0 }, -{ { 53, 57, 55 }, 3, 0 }, -{ { 61, 27, 26 }, 4, 2 }, -{ { 26, 60, 61 }, 4, 0 }, -{ { 60, 26, 25 }, 4, 2 }, -{ { 25, 59, 60 }, 4, 0 }, -{ { 55, 21, 20 }, 4, 2 }, -{ { 20, 54, 55 }, 4, 0 }, -{ { 54, 20, 19 }, 4, 2 }, -{ { 19, 53, 54 }, 4, 0 }, -{ { 57, 23, 22 }, 4, 2 }, -{ { 22, 56, 57 }, 4, 0 }, -{ { 56, 22, 21 }, 4, 2 }, -{ { 21, 55, 56 }, 4, 0 }, -{ { 39, 5, 4 }, 4, 2 }, -{ { 4, 38, 39 }, 4, 0 }, -{ { 38, 4, 3 }, 4, 2 }, -{ { 3, 37, 38 }, 4, 0 }, -{ { 37, 3, 2 }, 4, 2 }, -{ { 2, 36, 37 }, 4, 0 }, -{ { 36, 2, 1 }, 4, 2 }, -{ { 1, 35, 36 }, 4, 0 }, -{ { 53, 19, 18 }, 4, 2 }, -{ { 18, 52, 53 }, 4, 0 }, -{ { 52, 18, 17 }, 4, 2 }, -{ { 17, 51, 52 }, 4, 0 }, -{ { 41, 7, 6 }, 4, 2 }, -{ { 6, 40, 41 }, 4, 0 }, -{ { 40, 6, 5 }, 4, 2 }, -{ { 5, 39, 40 }, 4, 0 }, -{ { 43, 9, 8 }, 4, 2 }, -{ { 8, 42, 43 }, 4, 0 }, -{ { 42, 8, 7 }, 4, 2 }, -{ { 7, 41, 42 }, 4, 0 }, -{ { 59, 25, 24 }, 4, 2 }, -{ { 24, 58, 59 }, 4, 0 }, -{ { 58, 24, 23 }, 4, 2 }, -{ { 23, 57, 58 }, 4, 0 }, -{ { 63, 29, 28 }, 4, 2 }, -{ { 28, 62, 63 }, 4, 0 }, -{ { 62, 28, 27 }, 4, 2 }, -{ { 27, 61, 62 }, 4, 0 }, -{ { 45, 11, 10 }, 4, 2 }, -{ { 10, 44, 45 }, 4, 0 }, -{ { 44, 10, 9 }, 4, 2 }, -{ { 9, 43, 44 }, 4, 0 }, -{ { 35, 1, 0 }, 4, 2 }, -{ { 0, 34, 35 }, 4, 0 }, -{ { 34, 0, 33 }, 4, 2 }, -{ { 33, 67, 34 }, 4, 0 }, -{ { 67, 33, 32 }, 4, 2 }, -{ { 32, 66, 67 }, 4, 0 }, -{ { 66, 32, 31 }, 4, 2 }, -{ { 31, 65, 66 }, 4, 0 }, -{ { 51, 17, 16 }, 4, 2 }, -{ { 16, 50, 51 }, 4, 0 }, -{ { 50, 16, 15 }, 4, 2 }, -{ { 15, 49, 50 }, 4, 0 }, -{ { 49, 15, 14 }, 4, 2 }, -{ { 14, 48, 49 }, 4, 0 }, -{ { 48, 14, 13 }, 4, 2 }, -{ { 13, 47, 48 }, 4, 0 }, -{ { 65, 31, 30 }, 4, 2 }, -{ { 30, 64, 65 }, 4, 0 }, -{ { 64, 30, 29 }, 4, 2 }, -{ { 29, 63, 64 }, 4, 0 }, -{ { 47, 13, 12 }, 4, 2 }, -{ { 12, 46, 47 }, 4, 0 }, -{ { 46, 12, 11 }, 4, 2 }, -{ { 11, 45, 46 }, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ { 1, 2, 350 }, 0, 4 }, -{ { 1, 350, 349 }, 0, 3 }, -{ { 2, 3, 351 }, 0, 4 }, -{ { 2, 351, 350 }, 0, 2 }, -{ { 3, 4, 352 }, 0, 4 }, -{ { 3, 352, 351 }, 0, 2 }, -{ { 4, 5, 353 }, 0, 4 }, -{ { 4, 353, 352 }, 0, 2 }, -{ { 5, 6, 354 }, 0, 4 }, -{ { 5, 354, 353 }, 0, 2 }, -{ { 6, 7, 355 }, 0, 4 }, -{ { 6, 355, 354 }, 0, 2 }, -{ { 7, 8, 356 }, 0, 4 }, -{ { 7, 356, 355 }, 0, 2 }, -{ { 8, 9, 357 }, 0, 4 }, -{ { 8, 357, 356 }, 0, 2 }, -{ { 9, 10, 358 }, 0, 4 }, -{ { 9, 358, 357 }, 0, 2 }, -{ { 10, 11, 359 }, 0, 4 }, -{ { 10, 359, 358 }, 0, 2 }, -{ { 11, 12, 360 }, 0, 4 }, -{ { 11, 360, 359 }, 0, 2 }, -{ { 12, 13, 361 }, 0, 4 }, -{ { 12, 361, 360 }, 0, 2 }, -{ { 13, 14, 362 }, 0, 4 }, -{ { 13, 362, 361 }, 0, 2 }, -{ { 14, 15, 363 }, 0, 4 }, -{ { 14, 363, 362 }, 0, 2 }, -{ { 15, 16, 364 }, 0, 4 }, -{ { 15, 364, 363 }, 0, 2 }, -{ { 16, 17, 365 }, 0, 4 }, -{ { 16, 365, 364 }, 0, 2 }, -{ { 17, 18, 366 }, 0, 4 }, -{ { 17, 366, 365 }, 0, 2 }, -{ { 18, 19, 367 }, 0, 6 }, -{ { 18, 367, 366 }, 0, 2 }, -{ { 20, 21, 369 }, 0, 4 }, -{ { 20, 369, 368 }, 0, 3 }, -{ { 21, 22, 370 }, 0, 4 }, -{ { 21, 370, 369 }, 0, 2 }, -{ { 22, 23, 371 }, 0, 4 }, -{ { 22, 371, 370 }, 0, 2 }, -{ { 23, 24, 372 }, 0, 4 }, -{ { 23, 372, 371 }, 0, 2 }, -{ { 24, 25, 373 }, 0, 4 }, -{ { 24, 373, 372 }, 0, 2 }, -{ { 25, 26, 374 }, 0, 4 }, -{ { 25, 374, 373 }, 0, 2 }, -{ { 26, 27, 375 }, 0, 4 }, -{ { 26, 375, 374 }, 0, 2 }, -{ { 27, 28, 376 }, 0, 4 }, -{ { 27, 376, 375 }, 0, 2 }, -{ { 28, 29, 377 }, 0, 4 }, -{ { 28, 377, 376 }, 0, 2 }, -{ { 29, 30, 378 }, 0, 4 }, -{ { 29, 378, 377 }, 0, 2 }, -{ { 30, 31, 379 }, 0, 4 }, -{ { 30, 379, 378 }, 0, 2 }, -{ { 31, 32, 380 }, 0, 4 }, -{ { 31, 380, 379 }, 0, 2 }, -{ { 32, 33, 381 }, 0, 4 }, -{ { 32, 381, 380 }, 0, 2 }, -{ { 33, 34, 382 }, 0, 4 }, -{ { 33, 382, 381 }, 0, 2 }, -{ { 34, 35, 383 }, 0, 4 }, -{ { 34, 383, 382 }, 0, 2 }, -{ { 35, 36, 384 }, 0, 4 }, -{ { 35, 384, 383 }, 0, 2 }, -{ { 36, 37, 385 }, 0, 4 }, -{ { 36, 385, 384 }, 0, 2 }, -{ { 37, 38, 386 }, 0, 4 }, -{ { 37, 386, 385 }, 0, 2 }, -{ { 38, 39, 387 }, 0, 4 }, -{ { 38, 387, 386 }, 0, 2 }, -{ { 39, 40, 388 }, 0, 4 }, -{ { 39, 388, 387 }, 0, 2 }, -{ { 40, 41, 389 }, 0, 4 }, -{ { 40, 389, 388 }, 0, 2 }, -{ { 41, 42, 390 }, 0, 4 }, -{ { 41, 390, 389 }, 0, 2 }, -{ { 42, 43, 391 }, 0, 4 }, -{ { 42, 391, 390 }, 0, 2 }, -{ { 43, 44, 392 }, 0, 4 }, -{ { 43, 392, 391 }, 0, 2 }, -{ { 44, 45, 393 }, 0, 4 }, -{ { 44, 393, 392 }, 0, 2 }, -{ { 45, 46, 394 }, 0, 4 }, -{ { 45, 394, 393 }, 0, 2 }, -{ { 46, 47, 395 }, 0, 4 }, -{ { 46, 395, 394 }, 0, 2 }, -{ { 47, 48, 396 }, 0, 4 }, -{ { 47, 396, 395 }, 0, 2 }, -{ { 48, 49, 397 }, 0, 4 }, -{ { 48, 397, 396 }, 0, 2 }, -{ { 49, 50, 398 }, 0, 4 }, -{ { 49, 398, 397 }, 0, 2 }, -{ { 50, 51, 399 }, 0, 4 }, -{ { 50, 399, 398 }, 0, 2 }, -{ { 51, 52, 400 }, 0, 4 }, -{ { 51, 400, 399 }, 0, 2 }, -{ { 52, 53, 401 }, 0, 4 }, -{ { 52, 401, 400 }, 0, 2 }, -{ { 53, 54, 402 }, 0, 4 }, -{ { 53, 402, 401 }, 0, 2 }, -{ { 54, 55, 403 }, 0, 4 }, -{ { 54, 403, 402 }, 0, 2 }, -{ { 55, 56, 404 }, 0, 6 }, -{ { 55, 404, 403 }, 0, 2 }, -{ { 57, 58, 406 }, 0, 4 }, -{ { 57, 406, 405 }, 0, 3 }, -{ { 58, 59, 407 }, 0, 4 }, -{ { 58, 407, 406 }, 0, 2 }, -{ { 59, 60, 408 }, 0, 4 }, -{ { 59, 408, 407 }, 0, 2 }, -{ { 60, 61, 409 }, 0, 4 }, -{ { 60, 409, 408 }, 0, 2 }, -{ { 61, 62, 410 }, 0, 4 }, -{ { 61, 410, 409 }, 0, 2 }, -{ { 62, 63, 411 }, 0, 4 }, -{ { 62, 411, 410 }, 0, 2 }, -{ { 63, 64, 412 }, 0, 4 }, -{ { 63, 412, 411 }, 0, 2 }, -{ { 64, 65, 413 }, 0, 4 }, -{ { 64, 413, 412 }, 0, 2 }, -{ { 65, 66, 414 }, 0, 4 }, -{ { 65, 414, 413 }, 0, 2 }, -{ { 66, 67, 415 }, 0, 4 }, -{ { 66, 415, 414 }, 0, 2 }, -{ { 67, 68, 416 }, 0, 4 }, -{ { 67, 416, 415 }, 0, 2 }, -{ { 68, 69, 417 }, 0, 4 }, -{ { 68, 417, 416 }, 0, 2 }, -{ { 69, 70, 418 }, 0, 4 }, -{ { 69, 418, 417 }, 0, 2 }, -{ { 70, 71, 419 }, 0, 4 }, -{ { 70, 419, 418 }, 0, 2 }, -{ { 71, 72, 420 }, 0, 4 }, -{ { 71, 420, 419 }, 0, 2 }, -{ { 72, 73, 421 }, 0, 4 }, -{ { 72, 421, 420 }, 0, 2 }, -{ { 73, 74, 422 }, 0, 4 }, -{ { 73, 422, 421 }, 0, 2 }, -{ { 74, 0, 348 }, 0, 6 }, -{ { 74, 348, 422 }, 0, 2 }, -{ { 75, 76, 424 }, 0, 4 }, -{ { 75, 424, 423 }, 0, 3 }, -{ { 76, 77, 425 }, 0, 4 }, -{ { 76, 425, 424 }, 0, 2 }, -{ { 77, 78, 426 }, 0, 4 }, -{ { 77, 426, 425 }, 0, 2 }, -{ { 78, 79, 427 }, 0, 4 }, -{ { 78, 427, 426 }, 0, 2 }, -{ { 79, 80, 428 }, 0, 4 }, -{ { 79, 428, 427 }, 0, 2 }, -{ { 80, 81, 429 }, 0, 4 }, -{ { 80, 429, 428 }, 0, 2 }, -{ { 81, 82, 430 }, 0, 4 }, -{ { 81, 430, 429 }, 0, 2 }, -{ { 82, 83, 431 }, 0, 4 }, -{ { 82, 431, 430 }, 0, 2 }, -{ { 83, 84, 432 }, 0, 4 }, -{ { 83, 432, 431 }, 0, 2 }, -{ { 84, 85, 433 }, 0, 4 }, -{ { 84, 433, 432 }, 0, 2 }, -{ { 85, 86, 434 }, 0, 4 }, -{ { 85, 434, 433 }, 0, 2 }, -{ { 86, 87, 435 }, 0, 4 }, -{ { 86, 435, 434 }, 0, 2 }, -{ { 87, 88, 436 }, 0, 4 }, -{ { 87, 436, 435 }, 0, 2 }, -{ { 88, 89, 437 }, 0, 6 }, -{ { 88, 437, 436 }, 0, 2 }, -{ { 90, 91, 439 }, 0, 4 }, -{ { 90, 439, 438 }, 0, 2 }, -{ { 91, 92, 440 }, 0, 4 }, -{ { 91, 440, 439 }, 0, 2 }, -{ { 92, 93, 441 }, 0, 4 }, -{ { 92, 441, 440 }, 0, 2 }, -{ { 93, 94, 442 }, 0, 4 }, -{ { 93, 442, 441 }, 0, 2 }, -{ { 94, 95, 443 }, 0, 4 }, -{ { 94, 443, 442 }, 0, 2 }, -{ { 95, 96, 444 }, 0, 4 }, -{ { 95, 444, 443 }, 0, 2 }, -{ { 96, 97, 445 }, 0, 4 }, -{ { 96, 445, 444 }, 0, 2 }, -{ { 97, 98, 446 }, 0, 4 }, -{ { 97, 446, 445 }, 0, 2 }, -{ { 98, 99, 447 }, 0, 4 }, -{ { 98, 447, 446 }, 0, 2 }, -{ { 99, 100, 448 }, 0, 4 }, -{ { 99, 448, 447 }, 0, 2 }, -{ { 100, 101, 449 }, 0, 4 }, -{ { 100, 449, 448 }, 0, 2 }, -{ { 101, 102, 450 }, 0, 4 }, -{ { 101, 450, 449 }, 0, 2 }, -{ { 102, 103, 451 }, 0, 4 }, -{ { 102, 451, 450 }, 0, 2 }, -{ { 103, 104, 452 }, 0, 4 }, -{ { 103, 452, 451 }, 0, 2 }, -{ { 104, 90, 438 }, 0, 4 }, -{ { 104, 438, 452 }, 0, 2 }, -{ { 106, 107, 455 }, 1, 6 }, -{ { 106, 455, 454 }, 1, 3 }, -{ { 108, 109, 457 }, 1, 4 }, -{ { 108, 457, 456 }, 1, 3 }, -{ { 109, 110, 458 }, 1, 4 }, -{ { 109, 458, 457 }, 1, 2 }, -{ { 110, 111, 459 }, 1, 4 }, -{ { 110, 459, 458 }, 1, 2 }, -{ { 111, 112, 460 }, 1, 4 }, -{ { 111, 460, 459 }, 1, 2 }, -{ { 112, 113, 461 }, 1, 4 }, -{ { 112, 461, 460 }, 1, 2 }, -{ { 113, 114, 462 }, 1, 4 }, -{ { 113, 462, 461 }, 1, 2 }, -{ { 114, 115, 463 }, 1, 4 }, -{ { 114, 463, 462 }, 1, 2 }, -{ { 115, 116, 464 }, 1, 4 }, -{ { 115, 464, 463 }, 1, 2 }, -{ { 116, 117, 465 }, 1, 4 }, -{ { 116, 465, 464 }, 1, 2 }, -{ { 117, 118, 466 }, 1, 4 }, -{ { 117, 466, 465 }, 1, 2 }, -{ { 118, 119, 467 }, 1, 4 }, -{ { 118, 467, 466 }, 1, 2 }, -{ { 119, 120, 468 }, 1, 4 }, -{ { 119, 468, 467 }, 1, 2 }, -{ { 120, 121, 469 }, 1, 4 }, -{ { 120, 469, 468 }, 1, 2 }, -{ { 121, 122, 470 }, 1, 4 }, -{ { 121, 470, 469 }, 1, 2 }, -{ { 122, 123, 471 }, 1, 4 }, -{ { 122, 471, 470 }, 1, 2 }, -{ { 123, 124, 472 }, 1, 4 }, -{ { 123, 472, 471 }, 1, 2 }, -{ { 124, 125, 473 }, 1, 4 }, -{ { 124, 473, 472 }, 1, 2 }, -{ { 125, 126, 474 }, 1, 4 }, -{ { 125, 474, 473 }, 1, 2 }, -{ { 126, 127, 475 }, 1, 4 }, -{ { 126, 475, 474 }, 1, 2 }, -{ { 127, 128, 476 }, 1, 4 }, -{ { 127, 476, 475 }, 1, 2 }, -{ { 128, 129, 477 }, 1, 4 }, -{ { 128, 477, 476 }, 1, 2 }, -{ { 129, 130, 478 }, 1, 4 }, -{ { 129, 478, 477 }, 1, 2 }, -{ { 130, 131, 479 }, 1, 4 }, -{ { 130, 479, 478 }, 1, 2 }, -{ { 131, 132, 480 }, 1, 4 }, -{ { 131, 480, 479 }, 1, 2 }, -{ { 132, 133, 481 }, 1, 4 }, -{ { 132, 481, 480 }, 1, 2 }, -{ { 133, 134, 482 }, 1, 4 }, -{ { 133, 482, 481 }, 1, 2 }, -{ { 134, 135, 483 }, 1, 4 }, -{ { 134, 483, 482 }, 1, 2 }, -{ { 135, 136, 484 }, 1, 4 }, -{ { 135, 484, 483 }, 1, 2 }, -{ { 136, 137, 485 }, 1, 6 }, -{ { 136, 485, 484 }, 1, 2 }, -{ { 138, 139, 487 }, 1, 6 }, -{ { 138, 487, 486 }, 1, 3 }, -{ { 140, 105, 453 }, 1, 6 }, -{ { 140, 453, 488 }, 1, 3 }, -{ { 141, 142, 490 }, 1, 4 }, -{ { 141, 490, 489 }, 1, 2 }, -{ { 142, 143, 491 }, 1, 4 }, -{ { 142, 491, 490 }, 1, 2 }, -{ { 143, 144, 492 }, 1, 4 }, -{ { 143, 492, 491 }, 1, 2 }, -{ { 144, 145, 493 }, 1, 4 }, -{ { 144, 493, 492 }, 1, 2 }, -{ { 145, 146, 494 }, 1, 4 }, -{ { 145, 494, 493 }, 1, 2 }, -{ { 146, 147, 495 }, 1, 4 }, -{ { 146, 495, 494 }, 1, 2 }, -{ { 147, 148, 496 }, 1, 4 }, -{ { 147, 496, 495 }, 1, 2 }, -{ { 148, 149, 497 }, 1, 4 }, -{ { 148, 497, 496 }, 1, 2 }, -{ { 149, 150, 498 }, 1, 4 }, -{ { 149, 498, 497 }, 1, 2 }, -{ { 150, 151, 499 }, 1, 4 }, -{ { 150, 499, 498 }, 1, 2 }, -{ { 151, 152, 500 }, 1, 4 }, -{ { 151, 500, 499 }, 1, 2 }, -{ { 152, 141, 489 }, 1, 4 }, -{ { 152, 489, 500 }, 1, 2 }, -{ { 153, 154, 502 }, 1, 4 }, -{ { 153, 502, 501 }, 1, 2 }, -{ { 154, 155, 503 }, 1, 4 }, -{ { 154, 503, 502 }, 1, 2 }, -{ { 155, 156, 504 }, 1, 4 }, -{ { 155, 504, 503 }, 1, 2 }, -{ { 156, 157, 505 }, 1, 4 }, -{ { 156, 505, 504 }, 1, 2 }, -{ { 157, 158, 506 }, 1, 4 }, -{ { 157, 506, 505 }, 1, 2 }, -{ { 158, 159, 507 }, 1, 4 }, -{ { 158, 507, 506 }, 1, 2 }, -{ { 159, 160, 508 }, 1, 4 }, -{ { 159, 508, 507 }, 1, 2 }, -{ { 160, 153, 501 }, 1, 4 }, -{ { 160, 501, 508 }, 1, 2 }, -{ { 161, 162, 510 }, 1, 4 }, -{ { 161, 510, 509 }, 1, 2 }, -{ { 162, 163, 511 }, 1, 4 }, -{ { 162, 511, 510 }, 1, 2 }, -{ { 163, 164, 512 }, 1, 4 }, -{ { 163, 512, 511 }, 1, 2 }, -{ { 164, 165, 513 }, 1, 4 }, -{ { 164, 513, 512 }, 1, 2 }, -{ { 165, 166, 514 }, 1, 4 }, -{ { 165, 514, 513 }, 1, 2 }, -{ { 166, 167, 515 }, 1, 4 }, -{ { 166, 515, 514 }, 1, 2 }, -{ { 167, 168, 516 }, 1, 4 }, -{ { 167, 516, 515 }, 1, 2 }, -{ { 168, 169, 517 }, 1, 4 }, -{ { 168, 517, 516 }, 1, 2 }, -{ { 169, 170, 518 }, 1, 4 }, -{ { 169, 518, 517 }, 1, 2 }, -{ { 170, 161, 509 }, 1, 4 }, -{ { 170, 509, 518 }, 1, 2 }, -{ { 171, 172, 520 }, 1, 4 }, -{ { 171, 520, 519 }, 1, 2 }, -{ { 172, 173, 521 }, 1, 4 }, -{ { 172, 521, 520 }, 1, 2 }, -{ { 173, 174, 522 }, 1, 4 }, -{ { 173, 522, 521 }, 1, 2 }, -{ { 174, 171, 519 }, 1, 4 }, -{ { 174, 519, 522 }, 1, 2 }, -{ { 175, 176, 524 }, 1, 4 }, -{ { 175, 524, 523 }, 1, 2 }, -{ { 176, 177, 525 }, 1, 4 }, -{ { 176, 525, 524 }, 1, 2 }, -{ { 177, 178, 526 }, 1, 4 }, -{ { 177, 526, 525 }, 1, 2 }, -{ { 178, 179, 527 }, 1, 4 }, -{ { 178, 527, 526 }, 1, 2 }, -{ { 179, 180, 528 }, 1, 4 }, -{ { 179, 528, 527 }, 1, 2 }, -{ { 180, 181, 529 }, 1, 4 }, -{ { 180, 529, 528 }, 1, 2 }, -{ { 181, 182, 530 }, 1, 4 }, -{ { 181, 530, 529 }, 1, 2 }, -{ { 182, 183, 531 }, 1, 4 }, -{ { 182, 531, 530 }, 1, 2 }, -{ { 183, 184, 532 }, 1, 4 }, -{ { 183, 532, 531 }, 1, 2 }, -{ { 184, 185, 533 }, 1, 4 }, -{ { 184, 533, 532 }, 1, 2 }, -{ { 185, 186, 534 }, 1, 4 }, -{ { 185, 534, 533 }, 1, 2 }, -{ { 186, 187, 535 }, 1, 4 }, -{ { 186, 535, 534 }, 1, 2 }, -{ { 187, 188, 536 }, 1, 4 }, -{ { 187, 536, 535 }, 1, 2 }, -{ { 188, 189, 537 }, 1, 4 }, -{ { 188, 537, 536 }, 1, 2 }, -{ { 189, 190, 538 }, 1, 4 }, -{ { 189, 538, 537 }, 1, 2 }, -{ { 190, 191, 539 }, 1, 4 }, -{ { 190, 539, 538 }, 1, 2 }, -{ { 191, 192, 540 }, 1, 4 }, -{ { 191, 540, 539 }, 1, 2 }, -{ { 192, 193, 541 }, 1, 4 }, -{ { 192, 541, 540 }, 1, 2 }, -{ { 193, 175, 523 }, 1, 4 }, -{ { 193, 523, 541 }, 1, 2 }, -{ { 194, 195, 543 }, 1, 4 }, -{ { 194, 543, 542 }, 1, 2 }, -{ { 195, 196, 544 }, 1, 4 }, -{ { 195, 544, 543 }, 1, 2 }, -{ { 196, 197, 545 }, 1, 4 }, -{ { 196, 545, 544 }, 1, 2 }, -{ { 197, 198, 546 }, 1, 4 }, -{ { 197, 546, 545 }, 1, 2 }, -{ { 198, 199, 547 }, 1, 4 }, -{ { 198, 547, 546 }, 1, 2 }, -{ { 199, 200, 548 }, 1, 4 }, -{ { 199, 548, 547 }, 1, 2 }, -{ { 200, 201, 549 }, 1, 4 }, -{ { 200, 549, 548 }, 1, 2 }, -{ { 201, 202, 550 }, 1, 4 }, -{ { 201, 550, 549 }, 1, 2 }, -{ { 202, 203, 551 }, 1, 4 }, -{ { 202, 551, 550 }, 1, 2 }, -{ { 203, 204, 552 }, 1, 4 }, -{ { 203, 552, 551 }, 1, 2 }, -{ { 204, 205, 553 }, 1, 4 }, -{ { 204, 553, 552 }, 1, 2 }, -{ { 205, 206, 554 }, 1, 4 }, -{ { 205, 554, 553 }, 1, 2 }, -{ { 206, 207, 555 }, 1, 4 }, -{ { 206, 555, 554 }, 1, 2 }, -{ { 207, 208, 556 }, 1, 4 }, -{ { 207, 556, 555 }, 1, 2 }, -{ { 208, 209, 557 }, 1, 4 }, -{ { 208, 557, 556 }, 1, 2 }, -{ { 209, 210, 558 }, 1, 4 }, -{ { 209, 558, 557 }, 1, 2 }, -{ { 210, 211, 559 }, 1, 4 }, -{ { 210, 559, 558 }, 1, 2 }, -{ { 211, 212, 560 }, 1, 4 }, -{ { 211, 560, 559 }, 1, 2 }, -{ { 212, 213, 561 }, 1, 4 }, -{ { 212, 561, 560 }, 1, 2 }, -{ { 213, 214, 562 }, 1, 4 }, -{ { 213, 562, 561 }, 1, 2 }, -{ { 214, 215, 563 }, 1, 4 }, -{ { 214, 563, 562 }, 1, 2 }, -{ { 215, 216, 564 }, 1, 4 }, -{ { 215, 564, 563 }, 1, 2 }, -{ { 216, 194, 542 }, 1, 4 }, -{ { 216, 542, 564 }, 1, 2 }, -{ { 217, 218, 566 }, 1, 4 }, -{ { 217, 566, 565 }, 1, 2 }, -{ { 218, 219, 567 }, 1, 4 }, -{ { 218, 567, 566 }, 1, 2 }, -{ { 219, 220, 568 }, 1, 4 }, -{ { 219, 568, 567 }, 1, 2 }, -{ { 220, 221, 569 }, 1, 4 }, -{ { 220, 569, 568 }, 1, 2 }, -{ { 221, 222, 570 }, 1, 4 }, -{ { 221, 570, 569 }, 1, 2 }, -{ { 222, 223, 571 }, 1, 4 }, -{ { 222, 571, 570 }, 1, 2 }, -{ { 223, 217, 565 }, 1, 4 }, -{ { 223, 565, 571 }, 1, 2 }, -{ { 224, 225, 573 }, 1, 4 }, -{ { 224, 573, 572 }, 1, 2 }, -{ { 225, 226, 574 }, 1, 4 }, -{ { 225, 574, 573 }, 1, 2 }, -{ { 226, 227, 575 }, 1, 4 }, -{ { 226, 575, 574 }, 1, 2 }, -{ { 227, 228, 576 }, 1, 4 }, -{ { 227, 576, 575 }, 1, 2 }, -{ { 228, 229, 577 }, 1, 4 }, -{ { 228, 577, 576 }, 1, 2 }, -{ { 229, 230, 578 }, 1, 4 }, -{ { 229, 578, 577 }, 1, 2 }, -{ { 230, 231, 579 }, 1, 4 }, -{ { 230, 579, 578 }, 1, 2 }, -{ { 231, 232, 580 }, 1, 4 }, -{ { 231, 580, 579 }, 1, 2 }, -{ { 232, 233, 581 }, 1, 4 }, -{ { 232, 581, 580 }, 1, 2 }, -{ { 233, 234, 582 }, 1, 4 }, -{ { 233, 582, 581 }, 1, 2 }, -{ { 234, 235, 583 }, 1, 4 }, -{ { 234, 583, 582 }, 1, 2 }, -{ { 235, 236, 584 }, 1, 4 }, -{ { 235, 584, 583 }, 1, 2 }, -{ { 236, 237, 585 }, 1, 4 }, -{ { 236, 585, 584 }, 1, 2 }, -{ { 237, 238, 586 }, 1, 4 }, -{ { 237, 586, 585 }, 1, 2 }, -{ { 238, 239, 587 }, 1, 4 }, -{ { 238, 587, 586 }, 1, 2 }, -{ { 239, 240, 588 }, 1, 4 }, -{ { 239, 588, 587 }, 1, 2 }, -{ { 240, 241, 589 }, 1, 4 }, -{ { 240, 589, 588 }, 1, 2 }, -{ { 241, 224, 572 }, 1, 4 }, -{ { 241, 572, 589 }, 1, 2 }, -{ { 242, 243, 591 }, 1, 4 }, -{ { 242, 591, 590 }, 1, 2 }, -{ { 243, 244, 592 }, 1, 4 }, -{ { 243, 592, 591 }, 1, 2 }, -{ { 244, 245, 593 }, 1, 4 }, -{ { 244, 593, 592 }, 1, 2 }, -{ { 245, 246, 594 }, 1, 4 }, -{ { 245, 594, 593 }, 1, 2 }, -{ { 246, 247, 595 }, 1, 4 }, -{ { 246, 595, 594 }, 1, 2 }, -{ { 247, 248, 596 }, 1, 4 }, -{ { 247, 596, 595 }, 1, 2 }, -{ { 248, 249, 597 }, 1, 4 }, -{ { 248, 597, 596 }, 1, 2 }, -{ { 249, 250, 598 }, 1, 4 }, -{ { 249, 598, 597 }, 1, 2 }, -{ { 250, 251, 599 }, 1, 4 }, -{ { 250, 599, 598 }, 1, 2 }, -{ { 251, 252, 600 }, 1, 4 }, -{ { 251, 600, 599 }, 1, 2 }, -{ { 252, 253, 601 }, 1, 4 }, -{ { 252, 601, 600 }, 1, 2 }, -{ { 253, 254, 602 }, 1, 4 }, -{ { 253, 602, 601 }, 1, 2 }, -{ { 254, 255, 603 }, 1, 4 }, -{ { 254, 603, 602 }, 1, 2 }, -{ { 255, 256, 604 }, 1, 4 }, -{ { 255, 604, 603 }, 1, 2 }, -{ { 256, 257, 605 }, 1, 4 }, -{ { 256, 605, 604 }, 1, 2 }, -{ { 257, 258, 606 }, 1, 4 }, -{ { 257, 606, 605 }, 1, 2 }, -{ { 258, 259, 607 }, 1, 4 }, -{ { 258, 607, 606 }, 1, 2 }, -{ { 259, 260, 608 }, 1, 4 }, -{ { 259, 608, 607 }, 1, 2 }, -{ { 260, 261, 609 }, 1, 4 }, -{ { 260, 609, 608 }, 1, 2 }, -{ { 261, 262, 610 }, 1, 4 }, -{ { 261, 610, 609 }, 1, 2 }, -{ { 262, 263, 611 }, 1, 4 }, -{ { 262, 611, 610 }, 1, 2 }, -{ { 263, 264, 611 }, 1, 4 }, -{ { 264, 612, 611 }, 1, 2 }, -{ { 264, 265, 613 }, 1, 4 }, -{ { 264, 613, 612 }, 1, 2 }, -{ { 265, 266, 614 }, 1, 4 }, -{ { 265, 614, 613 }, 1, 2 }, -{ { 266, 267, 615 }, 1, 4 }, -{ { 266, 615, 614 }, 1, 2 }, -{ { 267, 268, 616 }, 1, 4 }, -{ { 267, 616, 615 }, 1, 2 }, -{ { 268, 269, 617 }, 1, 4 }, -{ { 268, 617, 616 }, 1, 2 }, -{ { 269, 270, 618 }, 1, 4 }, -{ { 269, 618, 617 }, 1, 2 }, -{ { 270, 271, 619 }, 1, 4 }, -{ { 270, 619, 618 }, 1, 2 }, -{ { 271, 272, 620 }, 1, 4 }, -{ { 271, 620, 619 }, 1, 2 }, -{ { 272, 273, 621 }, 1, 4 }, -{ { 272, 621, 620 }, 1, 2 }, -{ { 273, 274, 622 }, 1, 4 }, -{ { 273, 622, 621 }, 1, 2 }, -{ { 274, 275, 623 }, 1, 4 }, -{ { 274, 623, 622 }, 1, 2 }, -{ { 275, 276, 624 }, 1, 4 }, -{ { 275, 624, 623 }, 1, 2 }, -{ { 276, 242, 590 }, 1, 4 }, -{ { 276, 590, 624 }, 1, 2 }, -{ { 277, 278, 626 }, 1, 4 }, -{ { 277, 626, 625 }, 1, 2 }, -{ { 278, 279, 627 }, 1, 4 }, -{ { 278, 627, 626 }, 1, 2 }, -{ { 279, 280, 628 }, 1, 4 }, -{ { 279, 628, 627 }, 1, 2 }, -{ { 280, 281, 629 }, 1, 4 }, -{ { 280, 629, 628 }, 1, 2 }, -{ { 281, 630, 629 }, 1, 2 }, -{ { 281, 282, 631 }, 1, 4 }, -{ { 281, 631, 630 }, 1, 2 }, -{ { 282, 632, 631 }, 1, 2 }, -{ { 282, 283, 633 }, 1, 4 }, -{ { 282, 633, 632 }, 1, 2 }, -{ { 283, 284, 634 }, 1, 4 }, -{ { 283, 634, 633 }, 1, 2 }, -{ { 284, 285, 635 }, 1, 4 }, -{ { 284, 635, 634 }, 1, 2 }, -{ { 285, 286, 636 }, 1, 4 }, -{ { 285, 636, 635 }, 1, 2 }, -{ { 286, 287, 637 }, 1, 4 }, -{ { 286, 637, 636 }, 1, 2 }, -{ { 287, 288, 638 }, 1, 4 }, -{ { 287, 638, 637 }, 1, 2 }, -{ { 288, 277, 625 }, 1, 4 }, -{ { 288, 625, 638 }, 1, 2 }, -{ { 289, 290, 640 }, 1, 4 }, -{ { 289, 640, 639 }, 1, 2 }, -{ { 290, 291, 641 }, 1, 4 }, -{ { 290, 641, 640 }, 1, 2 }, -{ { 291, 292, 642 }, 1, 4 }, -{ { 291, 642, 641 }, 1, 2 }, -{ { 292, 293, 643 }, 1, 4 }, -{ { 292, 643, 642 }, 1, 2 }, -{ { 293, 294, 644 }, 1, 4 }, -{ { 293, 644, 643 }, 1, 2 }, -{ { 294, 295, 645 }, 1, 4 }, -{ { 294, 645, 644 }, 1, 2 }, -{ { 295, 296, 646 }, 1, 4 }, -{ { 295, 646, 645 }, 1, 2 }, -{ { 296, 297, 647 }, 1, 4 }, -{ { 296, 647, 646 }, 1, 2 }, -{ { 297, 298, 648 }, 1, 4 }, -{ { 297, 648, 647 }, 1, 2 }, -{ { 298, 299, 649 }, 1, 4 }, -{ { 298, 649, 648 }, 1, 2 }, -{ { 299, 300, 650 }, 1, 4 }, -{ { 299, 650, 649 }, 1, 2 }, -{ { 300, 301, 651 }, 1, 4 }, -{ { 300, 651, 650 }, 1, 2 }, -{ { 301, 302, 652 }, 1, 4 }, -{ { 301, 652, 651 }, 1, 2 }, -{ { 302, 303, 653 }, 1, 4 }, -{ { 302, 653, 652 }, 1, 2 }, -{ { 303, 304, 654 }, 1, 4 }, -{ { 303, 654, 653 }, 1, 2 }, -{ { 304, 305, 655 }, 1, 4 }, -{ { 304, 655, 654 }, 1, 2 }, -{ { 305, 306, 656 }, 1, 4 }, -{ { 305, 656, 655 }, 1, 2 }, -{ { 306, 307, 657 }, 1, 4 }, -{ { 306, 657, 656 }, 1, 2 }, -{ { 307, 308, 658 }, 1, 4 }, -{ { 307, 658, 657 }, 1, 2 }, -{ { 308, 309, 659 }, 1, 4 }, -{ { 308, 659, 658 }, 1, 2 }, -{ { 309, 310, 660 }, 1, 4 }, -{ { 309, 660, 659 }, 1, 2 }, -{ { 310, 289, 639 }, 1, 4 }, -{ { 310, 639, 660 }, 1, 2 }, -{ { 311, 312, 662 }, 1, 4 }, -{ { 311, 662, 661 }, 1, 2 }, -{ { 312, 313, 663 }, 1, 4 }, -{ { 312, 663, 662 }, 1, 2 }, -{ { 313, 314, 664 }, 1, 4 }, -{ { 313, 664, 663 }, 1, 2 }, -{ { 314, 315, 665 }, 1, 4 }, -{ { 314, 665, 664 }, 1, 2 }, -{ { 315, 316, 666 }, 1, 4 }, -{ { 315, 666, 665 }, 1, 2 }, -{ { 316, 317, 667 }, 1, 4 }, -{ { 316, 667, 666 }, 1, 2 }, -{ { 317, 318, 668 }, 1, 4 }, -{ { 317, 668, 667 }, 1, 2 }, -{ { 318, 319, 669 }, 1, 4 }, -{ { 318, 669, 668 }, 1, 2 }, -{ { 319, 320, 670 }, 1, 4 }, -{ { 319, 670, 669 }, 1, 2 }, -{ { 320, 321, 671 }, 1, 4 }, -{ { 320, 671, 670 }, 1, 2 }, -{ { 321, 322, 672 }, 1, 4 }, -{ { 321, 672, 671 }, 1, 2 }, -{ { 322, 323, 673 }, 1, 4 }, -{ { 322, 673, 672 }, 1, 2 }, -{ { 323, 324, 674 }, 1, 4 }, -{ { 323, 674, 673 }, 1, 2 }, -{ { 324, 325, 675 }, 1, 4 }, -{ { 324, 675, 674 }, 1, 2 }, -{ { 325, 326, 676 }, 1, 4 }, -{ { 325, 676, 675 }, 1, 2 }, -{ { 326, 327, 677 }, 1, 4 }, -{ { 326, 677, 676 }, 1, 2 }, -{ { 327, 328, 678 }, 1, 4 }, -{ { 327, 678, 677 }, 1, 2 }, -{ { 328, 329, 679 }, 1, 4 }, -{ { 328, 679, 678 }, 1, 2 }, -{ { 329, 330, 680 }, 1, 4 }, -{ { 329, 680, 679 }, 1, 2 }, -{ { 330, 331, 681 }, 1, 4 }, -{ { 330, 681, 680 }, 1, 2 }, -{ { 331, 332, 681 }, 1, 4 }, -{ { 332, 682, 681 }, 1, 2 }, -{ { 332, 333, 683 }, 1, 4 }, -{ { 332, 683, 682 }, 1, 2 }, -{ { 333, 334, 683 }, 1, 4 }, -{ { 334, 335, 684 }, 1, 4 }, -{ { 334, 684, 683 }, 1, 2 }, -{ { 335, 311, 661 }, 1, 4 }, -{ { 335, 661, 684 }, 1, 2 }, -{ { 336, 337, 686 }, 1, 4 }, -{ { 336, 686, 685 }, 1, 2 }, -{ { 337, 338, 687 }, 1, 4 }, -{ { 337, 687, 686 }, 1, 2 }, -{ { 338, 339, 688 }, 1, 4 }, -{ { 338, 688, 687 }, 1, 2 }, -{ { 339, 336, 685 }, 1, 4 }, -{ { 339, 685, 688 }, 1, 2 }, -{ { 340, 341, 690 }, 1, 4 }, -{ { 340, 690, 689 }, 1, 2 }, -{ { 341, 342, 691 }, 1, 4 }, -{ { 341, 691, 690 }, 1, 2 }, -{ { 342, 343, 692 }, 1, 4 }, -{ { 342, 692, 691 }, 1, 2 }, -{ { 343, 344, 693 }, 1, 4 }, -{ { 343, 693, 692 }, 1, 2 }, -{ { 344, 345, 694 }, 1, 4 }, -{ { 344, 694, 693 }, 1, 2 }, -{ { 345, 346, 695 }, 1, 4 }, -{ { 345, 695, 694 }, 1, 2 }, -{ { 346, 347, 696 }, 1, 4 }, -{ { 346, 696, 695 }, 1, 2 }, -{ { 347, 340, 689 }, 1, 4 }, -{ { 347, 689, 696 }, 1, 2 }, -{ { 706, 698, 697 }, 1, 2 }, -{ { 705, 706, 697 }, 1, 4 }, -{ { 707, 699, 698 }, 1, 2 }, -{ { 706, 707, 698 }, 1, 4 }, -{ { 708, 700, 699 }, 1, 2 }, -{ { 707, 708, 699 }, 1, 4 }, -{ { 709, 701, 700 }, 1, 2 }, -{ { 708, 709, 700 }, 1, 4 }, -{ { 710, 702, 701 }, 1, 2 }, -{ { 709, 710, 701 }, 1, 4 }, -{ { 711, 703, 702 }, 1, 2 }, -{ { 710, 711, 702 }, 1, 4 }, -{ { 712, 704, 703 }, 1, 2 }, -{ { 711, 712, 703 }, 1, 4 }, -{ { 705, 697, 704 }, 1, 2 }, -{ { 712, 705, 704 }, 1, 4 }, -{ { 722, 714, 713 }, 1, 2 }, -{ { 721, 722, 713 }, 1, 4 }, -{ { 723, 715, 714 }, 1, 2 }, -{ { 722, 723, 714 }, 1, 4 }, -{ { 724, 716, 715 }, 1, 2 }, -{ { 723, 724, 715 }, 1, 4 }, -{ { 725, 717, 716 }, 1, 2 }, -{ { 724, 725, 716 }, 1, 4 }, -{ { 726, 718, 717 }, 1, 2 }, -{ { 725, 726, 717 }, 1, 4 }, -{ { 727, 719, 718 }, 1, 2 }, -{ { 726, 727, 718 }, 1, 4 }, -{ { 728, 720, 719 }, 1, 2 }, -{ { 727, 728, 719 }, 1, 4 }, -{ { 721, 713, 720 }, 1, 2 }, -{ { 728, 721, 720 }, 1, 4 }, -{ { 729, 730, 750 }, 1, 4 }, -{ { 729, 750, 749 }, 1, 2 }, -{ { 730, 731, 751 }, 1, 4 }, -{ { 730, 751, 750 }, 1, 2 }, -{ { 731, 732, 752 }, 1, 4 }, -{ { 731, 752, 751 }, 1, 2 }, -{ { 732, 733, 753 }, 1, 4 }, -{ { 732, 753, 752 }, 1, 2 }, -{ { 733, 734, 754 }, 1, 4 }, -{ { 733, 754, 753 }, 1, 2 }, -{ { 734, 735, 755 }, 1, 4 }, -{ { 734, 755, 754 }, 1, 2 }, -{ { 735, 736, 756 }, 1, 4 }, -{ { 735, 756, 755 }, 1, 2 }, -{ { 736, 737, 757 }, 1, 4 }, -{ { 736, 757, 756 }, 1, 2 }, -{ { 737, 738, 758 }, 1, 4 }, -{ { 737, 758, 757 }, 1, 2 }, -{ { 738, 739, 759 }, 1, 4 }, -{ { 738, 759, 758 }, 1, 2 }, -{ { 739, 740, 760 }, 1, 4 }, -{ { 739, 760, 759 }, 1, 2 }, -{ { 740, 741, 761 }, 1, 4 }, -{ { 740, 761, 760 }, 1, 2 }, -{ { 741, 742, 762 }, 1, 4 }, -{ { 741, 762, 761 }, 1, 2 }, -{ { 742, 743, 763 }, 1, 4 }, -{ { 742, 763, 762 }, 1, 2 }, -{ { 743, 744, 764 }, 1, 4 }, -{ { 743, 764, 763 }, 1, 2 }, -{ { 744, 745, 765 }, 1, 4 }, -{ { 744, 765, 764 }, 1, 2 }, -{ { 745, 746, 766 }, 1, 4 }, -{ { 745, 766, 765 }, 1, 2 }, -{ { 746, 747, 767 }, 1, 4 }, -{ { 746, 767, 766 }, 1, 2 }, -{ { 747, 748, 768 }, 1, 4 }, -{ { 747, 768, 767 }, 1, 2 }, -{ { 748, 729, 749 }, 1, 4 }, -{ { 748, 749, 768 }, 1, 2 }, -{ { 769, 770, 800 }, 1, 4 }, -{ { 769, 800, 799 }, 1, 2 }, -{ { 770, 771, 801 }, 1, 4 }, -{ { 770, 801, 800 }, 1, 2 }, -{ { 771, 772, 802 }, 1, 4 }, -{ { 771, 802, 801 }, 1, 2 }, -{ { 772, 773, 803 }, 1, 4 }, -{ { 772, 803, 802 }, 1, 2 }, -{ { 773, 774, 804 }, 1, 4 }, -{ { 773, 804, 803 }, 1, 2 }, -{ { 774, 775, 805 }, 1, 4 }, -{ { 774, 805, 804 }, 1, 2 }, -{ { 775, 776, 806 }, 1, 4 }, -{ { 775, 806, 805 }, 1, 2 }, -{ { 776, 777, 807 }, 1, 4 }, -{ { 776, 807, 806 }, 1, 2 }, -{ { 777, 778, 808 }, 1, 4 }, -{ { 777, 808, 807 }, 1, 2 }, -{ { 778, 779, 809 }, 1, 4 }, -{ { 778, 809, 808 }, 1, 2 }, -{ { 779, 780, 810 }, 1, 4 }, -{ { 779, 810, 809 }, 1, 2 }, -{ { 780, 781, 811 }, 1, 4 }, -{ { 780, 811, 810 }, 1, 2 }, -{ { 781, 782, 812 }, 1, 4 }, -{ { 781, 812, 811 }, 1, 2 }, -{ { 782, 783, 813 }, 1, 4 }, -{ { 782, 813, 812 }, 1, 2 }, -{ { 783, 784, 814 }, 1, 4 }, -{ { 783, 814, 813 }, 1, 2 }, -{ { 784, 785, 815 }, 1, 4 }, -{ { 784, 815, 814 }, 1, 2 }, -{ { 785, 786, 816 }, 1, 4 }, -{ { 785, 816, 815 }, 1, 2 }, -{ { 786, 787, 817 }, 1, 4 }, -{ { 786, 817, 816 }, 1, 2 }, -{ { 787, 788, 818 }, 1, 4 }, -{ { 787, 818, 817 }, 1, 2 }, -{ { 788, 789, 819 }, 1, 4 }, -{ { 788, 819, 818 }, 1, 2 }, -{ { 789, 790, 820 }, 1, 4 }, -{ { 789, 820, 819 }, 1, 2 }, -{ { 790, 791, 821 }, 1, 4 }, -{ { 790, 821, 820 }, 1, 2 }, -{ { 791, 769, 799 }, 1, 4 }, -{ { 791, 799, 821 }, 1, 2 }, -{ { 792, 793, 823 }, 1, 4 }, -{ { 792, 823, 822 }, 1, 2 }, -{ { 793, 794, 824 }, 1, 4 }, -{ { 793, 824, 823 }, 1, 2 }, -{ { 794, 795, 825 }, 1, 4 }, -{ { 794, 825, 824 }, 1, 2 }, -{ { 795, 796, 826 }, 1, 4 }, -{ { 795, 826, 825 }, 1, 2 }, -{ { 796, 797, 827 }, 1, 4 }, -{ { 796, 827, 826 }, 1, 2 }, -{ { 797, 798, 828 }, 1, 4 }, -{ { 797, 828, 827 }, 1, 2 }, -{ { 798, 792, 822 }, 1, 4 }, -{ { 798, 822, 828 }, 1, 2 }, -{ { 829, 830, 846 }, 0, 6 }, -{ { 829, 846, 845 }, 0, 3 }, -{ { 831, 832, 848 }, 0, 6 }, -{ { 831, 848, 847 }, 0, 3 }, -{ { 833, 834, 850 }, 0, 6 }, -{ { 833, 850, 849 }, 0, 3 }, -{ { 836, 835, 851 }, 0, 6 }, -{ { 836, 851, 852 }, 0, 3 }, -{ { 837, 838, 854 }, 1, 6 }, -{ { 837, 854, 853 }, 1, 3 }, -{ { 839, 840, 856 }, 1, 6 }, -{ { 839, 856, 855 }, 1, 3 }, -{ { 841, 842, 858 }, 1, 6 }, -{ { 841, 858, 857 }, 1, 3 }, -{ { 843, 844, 860 }, 1, 6 }, -{ { 843, 860, 859 }, 1, 3 }, -{ { 919, 918, 917 }, 0, 6 }, -{ { 881, 880, 879 }, 0, 6 }, -{ { 920, 919, 917 }, 0, 4 }, -{ { 881, 879, 878 }, 0, 2 }, -{ { 882, 881, 878 }, 0, 4 }, -{ { 882, 878, 877 }, 0, 2 }, -{ { 883, 882, 877 }, 0, 4 }, -{ { 883, 877, 876 }, 0, 2 }, -{ { 884, 883, 876 }, 0, 4 }, -{ { 920, 917, 916 }, 0, 2 }, -{ { 921, 920, 916 }, 0, 4 }, -{ { 921, 916, 915 }, 0, 2 }, -{ { 922, 921, 915 }, 0, 4 }, -{ { 922, 915, 914 }, 0, 2 }, -{ { 884, 876, 875 }, 0, 2 }, -{ { 885, 884, 875 }, 0, 4 }, -{ { 923, 922, 914 }, 0, 4 }, -{ { 923, 914, 913 }, 0, 2 }, -{ { 885, 875, 874 }, 0, 2 }, -{ { 886, 885, 874 }, 0, 4 }, -{ { 923, 913, 912 }, 0, 2 }, -{ { 924, 923, 912 }, 0, 4 }, -{ { 924, 912, 911 }, 0, 2 }, -{ { 925, 924, 911 }, 0, 4 }, -{ { 925, 911, 910 }, 0, 2 }, -{ { 926, 925, 910 }, 0, 4 }, -{ { 926, 910, 909 }, 0, 2 }, -{ { 927, 926, 909 }, 0, 4 }, -{ { 927, 909, 908 }, 0, 2 }, -{ { 928, 927, 908 }, 0, 4 }, -{ { 928, 908, 907 }, 0, 2 }, -{ { 929, 928, 907 }, 0, 4 }, -{ { 929, 907, 906 }, 0, 2 }, -{ { 929, 906, 905 }, 0, 2 }, -{ { 930, 929, 905 }, 0, 4 }, -{ { 930, 905, 904 }, 0, 2 }, -{ { 930, 904, 903 }, 0, 2 }, -{ { 931, 930, 903 }, 0, 4 }, -{ { 931, 903, 902 }, 0, 2 }, -{ { 931, 902, 901 }, 0, 2 }, -{ { 932, 931, 901 }, 0, 4 }, -{ { 932, 901, 900 }, 0, 2 }, -{ { 932, 900, 899 }, 0, 2 }, -{ { 933, 932, 899 }, 0, 4 }, -{ { 934, 933, 899 }, 0, 4 }, -{ { 887, 886, 874 }, 0, 4 }, -{ { 887, 874, 873 }, 0, 2 }, -{ { 888, 887, 873 }, 0, 4 }, -{ { 888, 873, 872 }, 0, 2 }, -{ { 889, 888, 872 }, 0, 4 }, -{ { 889, 872, 871 }, 0, 2 }, -{ { 890, 889, 871 }, 0, 4 }, -{ { 890, 871, 870 }, 0, 2 }, -{ { 891, 890, 870 }, 0, 4 }, -{ { 892, 891, 870 }, 0, 4 }, -{ { 892, 870, 869 }, 0, 2 }, -{ { 893, 892, 869 }, 0, 4 }, -{ { 894, 893, 869 }, 0, 4 }, -{ { 894, 869, 868 }, 0, 2 }, -{ { 895, 894, 868 }, 0, 4 }, -{ { 896, 895, 868 }, 0, 4 }, -{ { 896, 868, 867 }, 0, 2 }, -{ { 897, 896, 867 }, 0, 4 }, -{ { 898, 897, 867 }, 0, 4 }, -{ { 898, 867, 866 }, 0, 2 }, -{ { 899, 898, 866 }, 0, 4 }, -{ { 899, 866, 865 }, 0, 2 }, -{ { 934, 899, 865 }, 0, 0 }, -{ { 934, 865, 864 }, 0, 2 }, -{ { 935, 934, 864 }, 0, 4 }, -{ { 935, 864, 863 }, 0, 2 }, -{ { 861, 935, 863 }, 0, 4 }, -{ { 862, 861, 863 }, 0, 5 }, -{ { 959, 943, 942 }, 0, 2 }, -{ { 960, 959, 942 }, 0, 4 }, -{ { 960, 942, 941 }, 0, 2 }, -{ { 961, 960, 941 }, 0, 4 }, -{ { 961, 941, 940 }, 0, 2 }, -{ { 962, 961, 940 }, 0, 4 }, -{ { 962, 940, 939 }, 0, 2 }, -{ { 963, 962, 939 }, 0, 4 }, -{ { 963, 939, 938 }, 0, 2 }, -{ { 964, 963, 938 }, 0, 4 }, -{ { 964, 938, 937 }, 0, 2 }, -{ { 965, 964, 937 }, 0, 4 }, -{ { 937, 936, 951 }, 0, 4 }, -{ { 951, 965, 937 }, 0, 4 }, -{ { 951, 936, 950 }, 0, 2 }, -{ { 952, 951, 950 }, 0, 4 }, -{ { 952, 950, 949 }, 0, 2 }, -{ { 953, 952, 949 }, 0, 4 }, -{ { 944, 943, 959 }, 0, 4 }, -{ { 944, 959, 958 }, 0, 2 }, -{ { 945, 944, 958 }, 0, 4 }, -{ { 945, 958, 957 }, 0, 2 }, -{ { 946, 945, 957 }, 0, 4 }, -{ { 946, 957, 956 }, 0, 2 }, -{ { 947, 946, 956 }, 0, 4 }, -{ { 947, 956, 955 }, 0, 2 }, -{ { 948, 947, 955 }, 0, 4 }, -{ { 948, 955, 954 }, 0, 2 }, -{ { 949, 948, 954 }, 0, 4 }, -{ { 953, 949, 954 }, 0, 1 }, -{ { 984, 983, 982 }, 1, 6 }, -{ { 984, 982, 981 }, 1, 2 }, -{ { 984, 981, 980 }, 1, 2 }, -{ { 985, 984, 980 }, 1, 4 }, -{ { 985, 980, 979 }, 1, 2 }, -{ { 986, 985, 979 }, 1, 4 }, -{ { 987, 986, 979 }, 1, 4 }, -{ { 987, 979, 978 }, 1, 2 }, -{ { 988, 987, 978 }, 1, 4 }, -{ { 988, 978, 977 }, 1, 2 }, -{ { 989, 988, 977 }, 1, 4 }, -{ { 989, 977, 976 }, 1, 2 }, -{ { 990, 989, 976 }, 1, 4 }, -{ { 991, 990, 976 }, 1, 4 }, -{ { 992, 991, 976 }, 1, 4 }, -{ { 992, 976, 975 }, 1, 2 }, -{ { 993, 992, 975 }, 1, 4 }, -{ { 966, 1001, 1000 }, 1, 6 }, -{ { 967, 966, 1000 }, 1, 4 }, -{ { 1000, 999, 998 }, 1, 6 }, -{ { 1000, 998, 997 }, 1, 2 }, -{ { 967, 1000, 997 }, 1, 0 }, -{ { 970, 969, 968 }, 1, 6 }, -{ { 970, 968, 967 }, 1, 2 }, -{ { 970, 967, 997 }, 1, 0 }, -{ { 970, 997, 996 }, 1, 2 }, -{ { 971, 970, 996 }, 1, 4 }, -{ { 972, 971, 996 }, 1, 4 }, -{ { 973, 972, 996 }, 1, 4 }, -{ { 973, 996, 995 }, 1, 2 }, -{ { 974, 973, 995 }, 1, 4 }, -{ { 974, 995, 994 }, 1, 2 }, -{ { 975, 974, 994 }, 1, 4 }, -{ { 993, 975, 994 }, 1, 1 }, -{ { 1003, 1002, 1013 }, 1, 6 }, -{ { 1003, 1013, 1012 }, 1, 2 }, -{ { 1011, 1010, 1009 }, 1, 6 }, -{ { 1012, 1011, 1009 }, 1, 4 }, -{ { 1009, 1008, 1007 }, 1, 6 }, -{ { 1009, 1007, 1006 }, 1, 2 }, -{ { 1005, 1004, 1003 }, 1, 6 }, -{ { 1006, 1005, 1003 }, 1, 4 }, -{ { 1006, 1003, 1012 }, 1, 0 }, -{ { 1006, 1012, 1009 }, 1, 0 }, -{ { 1014, 1021, 1020 }, 1, 6 }, -{ { 1015, 1014, 1020 }, 1, 4 }, -{ { 1020, 1019, 1018 }, 1, 6 }, -{ { 1020, 1018, 1017 }, 1, 2 }, -{ { 1015, 1020, 1017 }, 1, 0 }, -{ { 1016, 1015, 1017 }, 1, 5 }, -{ { 1022, 1031, 1030 }, 1, 6 }, -{ { 1023, 1022, 1030 }, 1, 4 }, -{ { 1024, 1023, 1030 }, 1, 4 }, -{ { 1024, 1030, 1029 }, 1, 2 }, -{ { 1024, 1029, 1028 }, 1, 2 }, -{ { 1025, 1024, 1028 }, 1, 4 }, -{ { 1026, 1025, 1028 }, 1, 4 }, -{ { 1026, 1028, 1027 }, 1, 3 }, -{ { 1032, 1035, 1034 }, 1, 6 }, -{ { 1033, 1032, 1034 }, 1, 5 }, -{ { 1036, 1054, 1053 }, 1, 6 }, -{ { 1037, 1036, 1053 }, 1, 4 }, -{ { 1053, 1052, 1039 }, 1, 4 }, -{ { 1048, 1047, 1046 }, 1, 6 }, -{ { 1048, 1046, 1045 }, 1, 2 }, -{ { 1048, 1045, 1044 }, 1, 2 }, -{ { 1049, 1048, 1044 }, 1, 4 }, -{ { 1049, 1044, 1043 }, 1, 2 }, -{ { 1050, 1049, 1043 }, 1, 4 }, -{ { 1050, 1043, 1042 }, 1, 2 }, -{ { 1050, 1042, 1041 }, 1, 2 }, -{ { 1050, 1041, 1040 }, 1, 2 }, -{ { 1051, 1050, 1040 }, 1, 4 }, -{ { 1051, 1040, 1039 }, 1, 2 }, -{ { 1039, 1038, 1037 }, 1, 6 }, -{ { 1039, 1037, 1053 }, 1, 0 }, -{ { 1051, 1039, 1052 }, 1, 1 }, -{ { 1063, 1062, 1078 }, 1, 4 }, -{ { 1064, 1063, 1078 }, 1, 4 }, -{ { 1064, 1078, 1084 }, 1, 2 }, -{ { 1056, 1055, 1077 }, 1, 6 }, -{ { 1065, 1064, 1084 }, 1, 4 }, -{ { 1065, 1084, 1083 }, 1, 2 }, -{ { 1066, 1065, 1083 }, 1, 4 }, -{ { 1066, 1083, 1082 }, 1, 2 }, -{ { 1067, 1066, 1082 }, 1, 4 }, -{ { 1068, 1067, 1082 }, 1, 4 }, -{ { 1069, 1068, 1082 }, 1, 4 }, -{ { 1069, 1082, 1081 }, 1, 2 }, -{ { 1070, 1069, 1081 }, 1, 4 }, -{ { 1070, 1081, 1080 }, 1, 2 }, -{ { 1071, 1070, 1080 }, 1, 4 }, -{ { 1071, 1080, 1079 }, 1, 2 }, -{ { 1072, 1071, 1079 }, 1, 4 }, -{ { 1073, 1072, 1079 }, 1, 4 }, -{ { 1073, 1079, 1078 }, 1, 2 }, -{ { 1073, 1078, 1062 }, 1, 0 }, -{ { 1073, 1062, 1061 }, 1, 2 }, -{ { 1073, 1061, 1060 }, 1, 2 }, -{ { 1074, 1073, 1060 }, 1, 4 }, -{ { 1074, 1060, 1059 }, 1, 2 }, -{ { 1075, 1074, 1059 }, 1, 4 }, -{ { 1075, 1059, 1058 }, 1, 2 }, -{ { 1076, 1075, 1058 }, 1, 4 }, -{ { 1076, 1058, 1057 }, 1, 2 }, -{ { 1076, 1057, 1056 }, 1, 2 }, -{ { 1077, 1076, 1056 }, 1, 4 }, -{ { 1085, 1102, 1101 }, 1, 6 }, -{ { 1086, 1085, 1101 }, 1, 4 }, -{ { 1086, 1101, 1100 }, 1, 2 }, -{ { 1100, 1099, 1088 }, 1, 4 }, -{ { 1088, 1087, 1086 }, 1, 6 }, -{ { 1088, 1086, 1100 }, 1, 0 }, -{ { 1088, 1099, 1098 }, 1, 2 }, -{ { 1089, 1088, 1098 }, 1, 4 }, -{ { 1089, 1098, 1097 }, 1, 2 }, -{ { 1090, 1089, 1097 }, 1, 4 }, -{ { 1096, 1095, 1094 }, 1, 6 }, -{ { 1090, 1097, 1096 }, 1, 2 }, -{ { 1091, 1090, 1096 }, 1, 4 }, -{ { 1096, 1094, 1093 }, 1, 2 }, -{ { 1092, 1091, 1096 }, 1, 4 }, -{ { 1093, 1092, 1096 }, 1, 4 }, -{ { 1133, 1149, 1148 }, 1, 2 }, -{ { 1107, 1106, 1133 }, 1, 4 }, -{ { 1108, 1107, 1133 }, 1, 4 }, -{ { 1109, 1108, 1133 }, 1, 4 }, -{ { 1110, 1109, 1133 }, 1, 4 }, -{ { 1148, 1110, 1133 }, 1, 0 }, -{ { 1104, 1103, 1137 }, 1, 6 }, -{ { 1104, 1137, 1136 }, 1, 2 }, -{ { 1126, 1125, 1124 }, 1, 6 }, -{ { 1127, 1126, 1124 }, 1, 4 }, -{ { 1127, 1124, 1123 }, 1, 2 }, -{ { 1128, 1127, 1123 }, 1, 4 }, -{ { 1128, 1123, 1122 }, 1, 2 }, -{ { 1129, 1128, 1122 }, 1, 4 }, -{ { 1130, 1129, 1122 }, 1, 4 }, -{ { 1130, 1122, 1121 }, 1, 2 }, -{ { 1131, 1130, 1121 }, 1, 4 }, -{ { 1132, 1131, 1121 }, 1, 4 }, -{ { 1132, 1121, 1120 }, 1, 2 }, -{ { 1132, 1120, 1119 }, 1, 2 }, -{ { 1132, 1119, 1139 }, 1, 0 }, -{ { 1104, 1136, 1135 }, 1, 2 }, -{ { 1110, 1148, 1147 }, 1, 2 }, -{ { 1111, 1110, 1147 }, 1, 4 }, -{ { 1111, 1147, 1146 }, 1, 2 }, -{ { 1105, 1104, 1135 }, 1, 4 }, -{ { 1112, 1111, 1146 }, 1, 4 }, -{ { 1112, 1146, 1145 }, 1, 2 }, -{ { 1113, 1112, 1145 }, 1, 4 }, -{ { 1113, 1145, 1144 }, 1, 2 }, -{ { 1114, 1113, 1144 }, 1, 4 }, -{ { 1115, 1114, 1144 }, 1, 4 }, -{ { 1115, 1144, 1143 }, 1, 2 }, -{ { 1116, 1115, 1143 }, 1, 4 }, -{ { 1117, 1116, 1143 }, 1, 4 }, -{ { 1117, 1143, 1142 }, 1, 2 }, -{ { 1117, 1142, 1141 }, 1, 2 }, -{ { 1118, 1117, 1141 }, 1, 4 }, -{ { 1118, 1141, 1140 }, 1, 2 }, -{ { 1119, 1118, 1140 }, 1, 4 }, -{ { 1119, 1140, 1139 }, 1, 2 }, -{ { 1132, 1139, 1138 }, 1, 2 }, -{ { 1138, 1133, 1132 }, 1, 2 }, -{ { 1133, 1138, 1149 }, 1, 2 }, -{ { 1134, 1133, 1106 }, 1, 4 }, -{ { 1135, 1134, 1106 }, 1, 4 }, -{ { 1135, 1106, 1105 }, 1, 2 }, -{ { 1163, 1165, 1164 }, 1, 3 }, -{ { 1165, 1163, 1162 }, 1, 2 }, -{ { 1151, 1150, 1171 }, 1, 6 }, -{ { 1165, 1162, 1161 }, 1, 2 }, -{ { 1166, 1165, 1161 }, 1, 4 }, -{ { 1166, 1161, 1160 }, 1, 2 }, -{ { 1167, 1166, 1160 }, 1, 4 }, -{ { 1167, 1160, 1159 }, 1, 2 }, -{ { 1168, 1167, 1159 }, 1, 4 }, -{ { 1168, 1159, 1158 }, 1, 2 }, -{ { 1169, 1168, 1158 }, 1, 4 }, -{ { 1169, 1158, 1157 }, 1, 2 }, -{ { 1170, 1169, 1157 }, 1, 4 }, -{ { 1170, 1157, 1156 }, 1, 2 }, -{ { 1170, 1156, 1155 }, 1, 2 }, -{ { 1170, 1155, 1154 }, 1, 2 }, -{ { 1170, 1154, 1153 }, 1, 2 }, -{ { 1171, 1170, 1153 }, 1, 4 }, -{ { 1171, 1153, 1152 }, 1, 2 }, -{ { 1171, 1152, 1151 }, 1, 2 }, -{ { 1191, 1190, 1189 }, 1, 6 }, -{ { 1191, 1189, 1188 }, 1, 2 }, -{ { 1188, 1187, 1186 }, 1, 6 }, -{ { 1188, 1186, 1185 }, 1, 2 }, -{ { 1184, 1183, 1182 }, 1, 6 }, -{ { 1173, 1172, 1196 }, 1, 6 }, -{ { 1174, 1173, 1196 }, 1, 4 }, -{ { 1175, 1174, 1196 }, 1, 4 }, -{ { 1175, 1196, 1195 }, 1, 2 }, -{ { 1176, 1175, 1195 }, 1, 4 }, -{ { 1176, 1195, 1194 }, 1, 2 }, -{ { 1177, 1176, 1194 }, 1, 4 }, -{ { 1178, 1177, 1194 }, 1, 4 }, -{ { 1179, 1178, 1194 }, 1, 4 }, -{ { 1179, 1194, 1193 }, 1, 2 }, -{ { 1180, 1179, 1193 }, 1, 4 }, -{ { 1181, 1180, 1193 }, 1, 4 }, -{ { 1181, 1193, 1192 }, 1, 2 }, -{ { 1182, 1181, 1192 }, 1, 4 }, -{ { 1182, 1192, 1191 }, 1, 2 }, -{ { 1182, 1191, 1188 }, 1, 0 }, -{ { 1182, 1188, 1185 }, 1, 0 }, -{ { 1182, 1185, 1184 }, 1, 2 }, -{ { 1197, 1200, 1199 }, 1, 6 }, -{ { 1198, 1197, 1199 }, 1, 5 }, -{ { 1203, 1202, 1201 }, 1, 6 }, -{ { 1204, 1203, 1201 }, 1, 4 }, -{ { 1208, 1207, 1206 }, 1, 6 }, -{ { 1208, 1206, 1205 }, 1, 2 }, -{ { 1201, 1208, 1205 }, 1, 4 }, -{ { 1204, 1201, 1205 }, 1, 1 }, -{ { 1265, 1266, 1267 }, 0, 6 }, -{ { 1227, 1228, 1229 }, 0, 6 }, -{ { 1265, 1267, 1268 }, 0, 2 }, -{ { 1226, 1227, 1229 }, 0, 4 }, -{ { 1226, 1229, 1230 }, 0, 2 }, -{ { 1225, 1226, 1230 }, 0, 4 }, -{ { 1225, 1230, 1231 }, 0, 2 }, -{ { 1224, 1225, 1231 }, 0, 4 }, -{ { 1224, 1231, 1232 }, 0, 2 }, -{ { 1264, 1265, 1268 }, 0, 4 }, -{ { 1264, 1268, 1269 }, 0, 2 }, -{ { 1263, 1264, 1269 }, 0, 4 }, -{ { 1263, 1269, 1270 }, 0, 2 }, -{ { 1262, 1263, 1270 }, 0, 4 }, -{ { 1223, 1224, 1232 }, 0, 4 }, -{ { 1223, 1232, 1233 }, 0, 2 }, -{ { 1262, 1270, 1271 }, 0, 2 }, -{ { 1261, 1262, 1271 }, 0, 4 }, -{ { 1222, 1223, 1233 }, 0, 4 }, -{ { 1222, 1233, 1234 }, 0, 2 }, -{ { 1260, 1261, 1271 }, 0, 4 }, -{ { 1260, 1271, 1272 }, 0, 2 }, -{ { 1259, 1260, 1272 }, 0, 4 }, -{ { 1259, 1272, 1273 }, 0, 2 }, -{ { 1258, 1259, 1273 }, 0, 4 }, -{ { 1258, 1273, 1274 }, 0, 2 }, -{ { 1257, 1258, 1274 }, 0, 4 }, -{ { 1257, 1274, 1275 }, 0, 2 }, -{ { 1256, 1257, 1275 }, 0, 4 }, -{ { 1256, 1275, 1276 }, 0, 2 }, -{ { 1255, 1256, 1276 }, 0, 4 }, -{ { 1255, 1276, 1277 }, 0, 2 }, -{ { 1254, 1255, 1277 }, 0, 4 }, -{ { 1253, 1254, 1277 }, 0, 4 }, -{ { 1253, 1277, 1278 }, 0, 2 }, -{ { 1252, 1253, 1278 }, 0, 4 }, -{ { 1251, 1252, 1278 }, 0, 4 }, -{ { 1251, 1278, 1279 }, 0, 2 }, -{ { 1250, 1251, 1279 }, 0, 4 }, -{ { 1249, 1250, 1279 }, 0, 4 }, -{ { 1249, 1279, 1280 }, 0, 2 }, -{ { 1248, 1249, 1280 }, 0, 4 }, -{ { 1247, 1248, 1280 }, 0, 4 }, -{ { 1247, 1280, 1281 }, 0, 2 }, -{ { 1247, 1281, 1282 }, 0, 2 }, -{ { 1222, 1234, 1235 }, 0, 2 }, -{ { 1221, 1222, 1235 }, 0, 4 }, -{ { 1221, 1235, 1236 }, 0, 2 }, -{ { 1220, 1221, 1236 }, 0, 4 }, -{ { 1220, 1236, 1237 }, 0, 2 }, -{ { 1219, 1220, 1237 }, 0, 4 }, -{ { 1219, 1237, 1238 }, 0, 2 }, -{ { 1218, 1219, 1238 }, 0, 4 }, -{ { 1218, 1238, 1239 }, 0, 2 }, -{ { 1218, 1239, 1240 }, 0, 2 }, -{ { 1217, 1218, 1240 }, 0, 4 }, -{ { 1217, 1240, 1241 }, 0, 2 }, -{ { 1217, 1241, 1242 }, 0, 2 }, -{ { 1216, 1217, 1242 }, 0, 4 }, -{ { 1216, 1242, 1243 }, 0, 2 }, -{ { 1216, 1243, 1244 }, 0, 2 }, -{ { 1215, 1216, 1244 }, 0, 4 }, -{ { 1215, 1244, 1245 }, 0, 2 }, -{ { 1215, 1245, 1246 }, 0, 2 }, -{ { 1214, 1215, 1246 }, 0, 4 }, -{ { 1214, 1246, 1247 }, 0, 2 }, -{ { 1213, 1214, 1247 }, 0, 4 }, -{ { 1213, 1247, 1282 }, 0, 0 }, -{ { 1212, 1213, 1282 }, 0, 4 }, -{ { 1212, 1282, 1283 }, 0, 2 }, -{ { 1211, 1212, 1283 }, 0, 4 }, -{ { 1211, 1283, 1209 }, 0, 2 }, -{ { 1211, 1209, 1210 }, 0, 3 }, -{ { 1290, 1291, 1307 }, 0, 4 }, -{ { 1290, 1307, 1308 }, 0, 2 }, -{ { 1289, 1290, 1308 }, 0, 4 }, -{ { 1289, 1308, 1309 }, 0, 2 }, -{ { 1288, 1289, 1309 }, 0, 4 }, -{ { 1288, 1309, 1310 }, 0, 2 }, -{ { 1287, 1288, 1310 }, 0, 4 }, -{ { 1287, 1310, 1311 }, 0, 2 }, -{ { 1286, 1287, 1311 }, 0, 4 }, -{ { 1286, 1311, 1312 }, 0, 2 }, -{ { 1285, 1286, 1312 }, 0, 4 }, -{ { 1285, 1312, 1313 }, 0, 2 }, -{ { 1284, 1285, 1313 }, 0, 4 }, -{ { 1284, 1313, 1299 }, 0, 2 }, -{ { 1298, 1284, 1299 }, 0, 4 }, -{ { 1298, 1299, 1300 }, 0, 2 }, -{ { 1297, 1298, 1300 }, 0, 4 }, -{ { 1297, 1300, 1301 }, 0, 2 }, -{ { 1307, 1291, 1292 }, 0, 2 }, -{ { 1306, 1307, 1292 }, 0, 4 }, -{ { 1306, 1292, 1293 }, 0, 2 }, -{ { 1305, 1306, 1293 }, 0, 4 }, -{ { 1305, 1293, 1294 }, 0, 2 }, -{ { 1304, 1305, 1294 }, 0, 4 }, -{ { 1304, 1294, 1295 }, 0, 2 }, -{ { 1303, 1304, 1295 }, 0, 4 }, -{ { 1303, 1295, 1296 }, 0, 2 }, -{ { 1302, 1303, 1296 }, 0, 4 }, -{ { 1302, 1296, 1297 }, 0, 2 }, -{ { 1302, 1297, 1301 }, 0, 1 }, -{ { 1330, 1331, 1332 }, 1, 6 }, -{ { 1329, 1330, 1332 }, 1, 4 }, -{ { 1328, 1329, 1332 }, 1, 4 }, -{ { 1328, 1332, 1333 }, 1, 2 }, -{ { 1327, 1328, 1333 }, 1, 4 }, -{ { 1327, 1333, 1334 }, 1, 2 }, -{ { 1327, 1334, 1335 }, 1, 2 }, -{ { 1326, 1327, 1335 }, 1, 4 }, -{ { 1326, 1335, 1336 }, 1, 2 }, -{ { 1325, 1326, 1336 }, 1, 4 }, -{ { 1325, 1336, 1337 }, 1, 2 }, -{ { 1324, 1325, 1337 }, 1, 4 }, -{ { 1324, 1337, 1338 }, 1, 2 }, -{ { 1324, 1338, 1339 }, 1, 2 }, -{ { 1324, 1339, 1340 }, 1, 2 }, -{ { 1323, 1324, 1340 }, 1, 4 }, -{ { 1323, 1340, 1341 }, 1, 2 }, -{ { 1348, 1349, 1314 }, 1, 6 }, -{ { 1348, 1314, 1315 }, 1, 2 }, -{ { 1346, 1347, 1348 }, 1, 6 }, -{ { 1345, 1346, 1348 }, 1, 4 }, -{ { 1345, 1348, 1315 }, 1, 0 }, -{ { 1316, 1317, 1318 }, 1, 6 }, -{ { 1315, 1316, 1318 }, 1, 4 }, -{ { 1345, 1315, 1318 }, 1, 0 }, -{ { 1344, 1345, 1318 }, 1, 4 }, -{ { 1344, 1318, 1319 }, 1, 2 }, -{ { 1344, 1319, 1320 }, 1, 2 }, -{ { 1344, 1320, 1321 }, 1, 2 }, -{ { 1343, 1344, 1321 }, 1, 4 }, -{ { 1343, 1321, 1322 }, 1, 2 }, -{ { 1342, 1343, 1322 }, 1, 4 }, -{ { 1342, 1322, 1323 }, 1, 2 }, -{ { 1342, 1323, 1341 }, 1, 1 }, -{ { 1361, 1350, 1351 }, 1, 6 }, -{ { 1360, 1361, 1351 }, 1, 4 }, -{ { 1357, 1358, 1359 }, 1, 6 }, -{ { 1357, 1359, 1360 }, 1, 2 }, -{ { 1355, 1356, 1357 }, 1, 6 }, -{ { 1354, 1355, 1357 }, 1, 4 }, -{ { 1351, 1352, 1353 }, 1, 6 }, -{ { 1351, 1353, 1354 }, 1, 2 }, -{ { 1360, 1351, 1354 }, 1, 0 }, -{ { 1357, 1360, 1354 }, 1, 0 }, -{ { 1368, 1369, 1362 }, 1, 6 }, -{ { 1368, 1362, 1363 }, 1, 2 }, -{ { 1366, 1367, 1368 }, 1, 6 }, -{ { 1365, 1366, 1368 }, 1, 4 }, -{ { 1365, 1368, 1363 }, 1, 0 }, -{ { 1365, 1363, 1364 }, 1, 3 }, -{ { 1378, 1379, 1370 }, 1, 6 }, -{ { 1378, 1370, 1371 }, 1, 2 }, -{ { 1378, 1371, 1372 }, 1, 2 }, -{ { 1377, 1378, 1372 }, 1, 4 }, -{ { 1376, 1377, 1372 }, 1, 4 }, -{ { 1376, 1372, 1373 }, 1, 2 }, -{ { 1376, 1373, 1374 }, 1, 2 }, -{ { 1375, 1376, 1374 }, 1, 5 }, -{ { 1382, 1383, 1380 }, 1, 6 }, -{ { 1382, 1380, 1381 }, 1, 3 }, -{ { 1401, 1402, 1384 }, 1, 6 }, -{ { 1401, 1384, 1385 }, 1, 2 }, -{ { 1400, 1401, 1385 }, 1, 4 }, -{ { 1394, 1395, 1396 }, 1, 6 }, -{ { 1393, 1394, 1396 }, 1, 4 }, -{ { 1392, 1393, 1396 }, 1, 4 }, -{ { 1392, 1396, 1397 }, 1, 2 }, -{ { 1391, 1392, 1397 }, 1, 4 }, -{ { 1391, 1397, 1398 }, 1, 2 }, -{ { 1390, 1391, 1398 }, 1, 4 }, -{ { 1389, 1390, 1398 }, 1, 4 }, -{ { 1388, 1389, 1398 }, 1, 4 }, -{ { 1388, 1398, 1399 }, 1, 2 }, -{ { 1387, 1388, 1399 }, 1, 4 }, -{ { 1385, 1386, 1387 }, 1, 6 }, -{ { 1400, 1385, 1387 }, 1, 0 }, -{ { 1400, 1387, 1399 }, 1, 1 }, -{ { 1426, 1410, 1411 }, 1, 2 }, -{ { 1426, 1411, 1412 }, 1, 2 }, -{ { 1432, 1426, 1412 }, 1, 4 }, -{ { 1425, 1403, 1404 }, 1, 6 }, -{ { 1432, 1412, 1413 }, 1, 2 }, -{ { 1431, 1432, 1413 }, 1, 4 }, -{ { 1431, 1413, 1414 }, 1, 2 }, -{ { 1430, 1431, 1414 }, 1, 4 }, -{ { 1430, 1414, 1415 }, 1, 2 }, -{ { 1430, 1415, 1416 }, 1, 2 }, -{ { 1430, 1416, 1417 }, 1, 2 }, -{ { 1429, 1430, 1417 }, 1, 4 }, -{ { 1429, 1417, 1418 }, 1, 2 }, -{ { 1428, 1429, 1418 }, 1, 4 }, -{ { 1428, 1418, 1419 }, 1, 2 }, -{ { 1427, 1428, 1419 }, 1, 4 }, -{ { 1427, 1419, 1420 }, 1, 2 }, -{ { 1427, 1420, 1421 }, 1, 2 }, -{ { 1426, 1427, 1421 }, 1, 4 }, -{ { 1410, 1426, 1421 }, 1, 0 }, -{ { 1409, 1410, 1421 }, 1, 4 }, -{ { 1408, 1409, 1421 }, 1, 4 }, -{ { 1408, 1421, 1422 }, 1, 2 }, -{ { 1407, 1408, 1422 }, 1, 4 }, -{ { 1407, 1422, 1423 }, 1, 2 }, -{ { 1406, 1407, 1423 }, 1, 4 }, -{ { 1406, 1423, 1424 }, 1, 2 }, -{ { 1405, 1406, 1424 }, 1, 4 }, -{ { 1404, 1405, 1424 }, 1, 4 }, -{ { 1404, 1424, 1425 }, 1, 2 }, -{ { 1449, 1450, 1433 }, 1, 6 }, -{ { 1449, 1433, 1434 }, 1, 2 }, -{ { 1448, 1449, 1434 }, 1, 4 }, -{ { 1447, 1448, 1434 }, 1, 4 }, -{ { 1434, 1435, 1436 }, 1, 6 }, -{ { 1447, 1434, 1436 }, 1, 0 }, -{ { 1446, 1447, 1436 }, 1, 4 }, -{ { 1446, 1436, 1437 }, 1, 2 }, -{ { 1445, 1446, 1437 }, 1, 4 }, -{ { 1445, 1437, 1438 }, 1, 2 }, -{ { 1442, 1443, 1444 }, 1, 6 }, -{ { 1444, 1445, 1438 }, 1, 4 }, -{ { 1444, 1438, 1439 }, 1, 2 }, -{ { 1441, 1442, 1444 }, 1, 4 }, -{ { 1444, 1439, 1440 }, 1, 2 }, -{ { 1444, 1440, 1441 }, 1, 2 }, -{ { 1499, 1486, 1454 }, 1, 4 }, -{ { 1499, 1454, 1455 }, 1, 2 }, -{ { 1499, 1455, 1456 }, 1, 2 }, -{ { 1499, 1456, 1457 }, 1, 2 }, -{ { 1499, 1457, 1458 }, 1, 2 }, -{ { 1498, 1499, 1458 }, 1, 4 }, -{ { 1485, 1451, 1452 }, 1, 6 }, -{ { 1472, 1473, 1474 }, 1, 6 }, -{ { 1484, 1485, 1452 }, 1, 4 }, -{ { 1472, 1474, 1475 }, 1, 2 }, -{ { 1471, 1472, 1475 }, 1, 4 }, -{ { 1471, 1475, 1476 }, 1, 2 }, -{ { 1470, 1471, 1476 }, 1, 4 }, -{ { 1470, 1476, 1477 }, 1, 2 }, -{ { 1470, 1477, 1478 }, 1, 2 }, -{ { 1469, 1470, 1478 }, 1, 4 }, -{ { 1469, 1478, 1479 }, 1, 2 }, -{ { 1469, 1479, 1480 }, 1, 2 }, -{ { 1468, 1469, 1480 }, 1, 4 }, -{ { 1468, 1480, 1481 }, 1, 2 }, -{ { 1467, 1468, 1481 }, 1, 4 }, -{ { 1483, 1484, 1452 }, 1, 4 }, -{ { 1497, 1498, 1458 }, 1, 4 }, -{ { 1497, 1458, 1459 }, 1, 2 }, -{ { 1496, 1497, 1459 }, 1, 4 }, -{ { 1483, 1452, 1453 }, 1, 2 }, -{ { 1496, 1459, 1460 }, 1, 2 }, -{ { 1495, 1496, 1460 }, 1, 4 }, -{ { 1495, 1460, 1461 }, 1, 2 }, -{ { 1494, 1495, 1461 }, 1, 4 }, -{ { 1494, 1461, 1462 }, 1, 2 }, -{ { 1494, 1462, 1463 }, 1, 2 }, -{ { 1493, 1494, 1463 }, 1, 4 }, -{ { 1493, 1463, 1464 }, 1, 2 }, -{ { 1492, 1493, 1464 }, 1, 4 }, -{ { 1492, 1464, 1465 }, 1, 2 }, -{ { 1491, 1492, 1465 }, 1, 4 }, -{ { 1490, 1491, 1465 }, 1, 4 }, -{ { 1489, 1490, 1465 }, 1, 4 }, -{ { 1489, 1465, 1466 }, 1, 2 }, -{ { 1488, 1489, 1466 }, 1, 4 }, -{ { 1488, 1466, 1467 }, 1, 2 }, -{ { 1487, 1488, 1467 }, 1, 4 }, -{ { 1487, 1467, 1481 }, 1, 0 }, -{ { 1486, 1487, 1481 }, 1, 4 }, -{ { 1454, 1486, 1481 }, 1, 0 }, -{ { 1454, 1481, 1482 }, 1, 2 }, -{ { 1454, 1482, 1483 }, 1, 2 }, -{ { 1453, 1454, 1483 }, 1, 4 }, -{ { 1513, 1514, 1515 }, 1, 6 }, -{ { 1512, 1513, 1515 }, 1, 4 }, -{ { 1521, 1500, 1501 }, 1, 6 }, -{ { 1511, 1512, 1515 }, 1, 4 }, -{ { 1511, 1515, 1516 }, 1, 2 }, -{ { 1510, 1511, 1516 }, 1, 4 }, -{ { 1510, 1516, 1517 }, 1, 2 }, -{ { 1509, 1510, 1517 }, 1, 4 }, -{ { 1509, 1517, 1518 }, 1, 2 }, -{ { 1508, 1509, 1518 }, 1, 4 }, -{ { 1508, 1518, 1519 }, 1, 2 }, -{ { 1507, 1508, 1519 }, 1, 4 }, -{ { 1507, 1519, 1520 }, 1, 2 }, -{ { 1506, 1507, 1520 }, 1, 4 }, -{ { 1505, 1506, 1520 }, 1, 4 }, -{ { 1504, 1505, 1520 }, 1, 4 }, -{ { 1503, 1504, 1520 }, 1, 4 }, -{ { 1503, 1520, 1521 }, 1, 2 }, -{ { 1502, 1503, 1521 }, 1, 4 }, -{ { 1501, 1502, 1521 }, 1, 4 }, -{ { 1539, 1540, 1541 }, 1, 6 }, -{ { 1538, 1539, 1541 }, 1, 4 }, -{ { 1536, 1537, 1538 }, 1, 6 }, -{ { 1535, 1536, 1538 }, 1, 4 }, -{ { 1532, 1533, 1534 }, 1, 6 }, -{ { 1545, 1522, 1523 }, 1, 6 }, -{ { 1545, 1523, 1524 }, 1, 2 }, -{ { 1545, 1524, 1525 }, 1, 2 }, -{ { 1544, 1545, 1525 }, 1, 4 }, -{ { 1544, 1525, 1526 }, 1, 2 }, -{ { 1544, 1526, 1527 }, 1, 2 }, -{ { 1544, 1527, 1528 }, 1, 2 }, -{ { 1544, 1528, 1529 }, 1, 2 }, -{ { 1543, 1544, 1529 }, 1, 4 }, -{ { 1543, 1529, 1530 }, 1, 2 }, -{ { 1543, 1530, 1531 }, 1, 2 }, -{ { 1542, 1543, 1531 }, 1, 4 }, -{ { 1542, 1531, 1532 }, 1, 2 }, -{ { 1541, 1542, 1532 }, 1, 4 }, -{ { 1538, 1541, 1532 }, 1, 0 }, -{ { 1535, 1538, 1532 }, 1, 0 }, -{ { 1534, 1535, 1532 }, 1, 4 }, -{ { 1548, 1549, 1546 }, 1, 6 }, -{ { 1548, 1546, 1547 }, 1, 3 }, -{ { 1550, 1551, 1552 }, 1, 6 }, -{ { 1550, 1552, 1553 }, 1, 2 }, -{ { 1555, 1556, 1557 }, 1, 6 }, -{ { 1554, 1555, 1557 }, 1, 4 }, -{ { 1554, 1557, 1550 }, 1, 2 }, -{ { 1554, 1550, 1553 }, 1, 1 }, -{ { 1575, 1558, 1559 }, 0, 2 }, -{ { 1575, 1559, 1560 }, 0, 2 }, -{ { 1575, 1560, 1561 }, 0, 2 }, -{ { 1575, 1561, 1562 }, 0, 2 }, -{ { 1575, 1562, 1563 }, 0, 2 }, -{ { 1575, 1563, 1564 }, 0, 2 }, -{ { 1575, 1564, 1565 }, 0, 2 }, -{ { 1575, 1565, 1558 }, 0, 2 }, -{ { 1574, 1567, 1566 }, 0, 2 }, -{ { 1574, 1568, 1567 }, 0, 2 }, -{ { 1574, 1569, 1568 }, 0, 2 }, -{ { 1574, 1570, 1569 }, 0, 2 }, -{ { 1574, 1571, 1570 }, 0, 2 }, -{ { 1574, 1572, 1571 }, 0, 2 }, -{ { 1574, 1573, 1572 }, 0, 2 }, -{ { 1574, 1566, 1573 }, 0, 2 }, -{ { 1593, 1576, 1577 }, 0, 2 }, -{ { 1593, 1577, 1578 }, 0, 2 }, -{ { 1593, 1578, 1579 }, 0, 2 }, -{ { 1593, 1579, 1580 }, 0, 2 }, -{ { 1593, 1580, 1581 }, 0, 2 }, -{ { 1593, 1581, 1582 }, 0, 2 }, -{ { 1593, 1582, 1583 }, 0, 2 }, -{ { 1593, 1583, 1576 }, 0, 2 }, -{ { 1592, 1585, 1584 }, 0, 2 }, -{ { 1592, 1586, 1585 }, 0, 2 }, -{ { 1592, 1587, 1586 }, 0, 2 }, -{ { 1592, 1588, 1587 }, 0, 2 }, -{ { 1592, 1589, 1588 }, 0, 2 }, -{ { 1592, 1590, 1589 }, 0, 2 }, -{ { 1592, 1591, 1590 }, 0, 2 }, -{ { 1592, 1584, 1591 }, 0, 2 }, -{ { 1610, 1609, 1608 }, 1, 6 }, -{ { 1610, 1608, 1607 }, 1, 2 }, -{ { 1607, 1606, 1605 }, 1, 6 }, -{ { 1607, 1605, 1604 }, 1, 2 }, -{ { 1603, 1602, 1601 }, 1, 6 }, -{ { 1595, 1594, 1613 }, 1, 6 }, -{ { 1596, 1595, 1613 }, 1, 4 }, -{ { 1596, 1613, 1612 }, 1, 2 }, -{ { 1597, 1596, 1612 }, 1, 4 }, -{ { 1598, 1597, 1612 }, 1, 4 }, -{ { 1599, 1598, 1612 }, 1, 4 }, -{ { 1599, 1612, 1611 }, 1, 2 }, -{ { 1600, 1599, 1611 }, 1, 4 }, -{ { 1601, 1600, 1611 }, 1, 4 }, -{ { 1601, 1611, 1610 }, 1, 2 }, -{ { 1601, 1610, 1607 }, 1, 0 }, -{ { 1601, 1607, 1604 }, 1, 0 }, -{ { 1601, 1604, 1603 }, 1, 2 }, -{ { 1628, 1629, 1630 }, 1, 6 }, -{ { 1627, 1628, 1630 }, 1, 4 }, -{ { 1625, 1626, 1627 }, 1, 6 }, -{ { 1624, 1625, 1627 }, 1, 4 }, -{ { 1621, 1622, 1623 }, 1, 6 }, -{ { 1633, 1614, 1615 }, 1, 6 }, -{ { 1633, 1615, 1616 }, 1, 2 }, -{ { 1632, 1633, 1616 }, 1, 4 }, -{ { 1632, 1616, 1617 }, 1, 2 }, -{ { 1632, 1617, 1618 }, 1, 2 }, -{ { 1632, 1618, 1619 }, 1, 2 }, -{ { 1631, 1632, 1619 }, 1, 4 }, -{ { 1631, 1619, 1620 }, 1, 2 }, -{ { 1631, 1620, 1621 }, 1, 2 }, -{ { 1630, 1631, 1621 }, 1, 4 }, -{ { 1627, 1630, 1621 }, 1, 0 }, -{ { 1624, 1627, 1621 }, 1, 0 }, -{ { 1623, 1624, 1621 }, 1, 4 }, -{ { 1642, 1641, 1657 }, 1, 4 }, -{ { 1643, 1642, 1657 }, 1, 4 }, -{ { 1643, 1657, 1663 }, 1, 2 }, -{ { 1635, 1634, 1656 }, 1, 6 }, -{ { 1644, 1643, 1663 }, 1, 4 }, -{ { 1644, 1663, 1662 }, 1, 2 }, -{ { 1645, 1644, 1662 }, 1, 4 }, -{ { 1645, 1662, 1661 }, 1, 2 }, -{ { 1646, 1645, 1661 }, 1, 4 }, -{ { 1647, 1646, 1661 }, 1, 4 }, -{ { 1648, 1647, 1661 }, 1, 4 }, -{ { 1648, 1661, 1660 }, 1, 2 }, -{ { 1649, 1648, 1660 }, 1, 4 }, -{ { 1649, 1660, 1659 }, 1, 2 }, -{ { 1650, 1649, 1659 }, 1, 4 }, -{ { 1650, 1659, 1658 }, 1, 2 }, -{ { 1651, 1650, 1658 }, 1, 4 }, -{ { 1652, 1651, 1658 }, 1, 4 }, -{ { 1652, 1658, 1657 }, 1, 2 }, -{ { 1652, 1657, 1641 }, 1, 0 }, -{ { 1652, 1641, 1640 }, 1, 2 }, -{ { 1652, 1640, 1639 }, 1, 2 }, -{ { 1653, 1652, 1639 }, 1, 4 }, -{ { 1653, 1639, 1638 }, 1, 2 }, -{ { 1654, 1653, 1638 }, 1, 4 }, -{ { 1654, 1638, 1637 }, 1, 2 }, -{ { 1655, 1654, 1637 }, 1, 4 }, -{ { 1655, 1637, 1636 }, 1, 2 }, -{ { 1655, 1636, 1635 }, 1, 2 }, -{ { 1656, 1655, 1635 }, 1, 4 }, -{ { 1687, 1671, 1672 }, 1, 2 }, -{ { 1687, 1672, 1673 }, 1, 2 }, -{ { 1693, 1687, 1673 }, 1, 4 }, -{ { 1686, 1664, 1665 }, 1, 6 }, -{ { 1693, 1673, 1674 }, 1, 2 }, -{ { 1692, 1693, 1674 }, 1, 4 }, -{ { 1692, 1674, 1675 }, 1, 2 }, -{ { 1691, 1692, 1675 }, 1, 4 }, -{ { 1691, 1675, 1676 }, 1, 2 }, -{ { 1691, 1676, 1677 }, 1, 2 }, -{ { 1691, 1677, 1678 }, 1, 2 }, -{ { 1690, 1691, 1678 }, 1, 4 }, -{ { 1690, 1678, 1679 }, 1, 2 }, -{ { 1689, 1690, 1679 }, 1, 4 }, -{ { 1689, 1679, 1680 }, 1, 2 }, -{ { 1688, 1689, 1680 }, 1, 4 }, -{ { 1688, 1680, 1681 }, 1, 2 }, -{ { 1688, 1681, 1682 }, 1, 2 }, -{ { 1687, 1688, 1682 }, 1, 4 }, -{ { 1671, 1687, 1682 }, 1, 0 }, -{ { 1670, 1671, 1682 }, 1, 4 }, -{ { 1669, 1670, 1682 }, 1, 4 }, -{ { 1669, 1682, 1683 }, 1, 2 }, -{ { 1668, 1669, 1683 }, 1, 4 }, -{ { 1668, 1683, 1684 }, 1, 2 }, -{ { 1667, 1668, 1684 }, 1, 4 }, -{ { 1667, 1684, 1685 }, 1, 2 }, -{ { 1666, 1667, 1685 }, 1, 4 }, -{ { 1665, 1666, 1685 }, 1, 4 }, -{ { 1665, 1685, 1686 }, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ { 18, 17, 16 }, 2, 6 }, -{ { 8, 7, 6 }, 2, 6 }, -{ { 20, 19, 18 }, 2, 6 }, -{ { 22, 21, 20 }, 2, 6 }, -{ { 4, 3, 2 }, 2, 6 }, -{ { 10, 9, 8 }, 2, 6 }, -{ { 6, 5, 4 }, 2, 6 }, -{ { 26, 25, 24 }, 2, 6 }, -{ { 28, 27, 26 }, 2, 6 }, -{ { 24, 23, 22 }, 2, 6 }, -{ { 30, 29, 28 }, 2, 6 }, -{ { 12, 11, 10 }, 2, 6 }, -{ { 2, 1, 0 }, 2, 6 }, -{ { 0, 33, 32 }, 2, 6 }, -{ { 32, 31, 30 }, 2, 6 }, -{ { 14, 13, 12 }, 2, 6 }, -{ { 16, 15, 14 }, 2, 6 }, -{ { 4, 2, 0 }, 2, 0 }, -{ { 6, 4, 0 }, 2, 0 }, -{ { 8, 6, 0 }, 2, 0 }, -{ { 10, 8, 0 }, 2, 0 }, -{ { 12, 10, 0 }, 2, 0 }, -{ { 12, 0, 32 }, 2, 0 }, -{ { 14, 12, 32 }, 2, 0 }, -{ { 14, 32, 30 }, 2, 0 }, -{ { 16, 14, 30 }, 2, 0 }, -{ { 16, 30, 28 }, 2, 0 }, -{ { 16, 28, 26 }, 2, 0 }, -{ { 18, 16, 26 }, 2, 0 }, -{ { 20, 18, 26 }, 2, 0 }, -{ { 20, 26, 24 }, 2, 0 }, -{ { 20, 24, 22 }, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -Matrix mat[][3] = -{ - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 22198.351563f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.0000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -32.104950f, -4.568500f, 21760.089844f, 1.000000f - }, - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 22230.794922f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 21601.316406f, 1.000000f, - }, - { - 0.881000f, 0.187100f, 0.434500f, 0.000000f, - -0.178600f, -0.718900f, 0.671800f, 0.000000f, - -0.438000f, 0.669500f, 0.600000f, 0.000000f, - -40.679047f, 57.105099f, 21262.400391f, 1.000000f, - }, - { - 1.008900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.008900f, 0.000000f, - 0.000000f, 1.008900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 21633.759766f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20863.496094f, 1.000000f, - }, - { - 0.759600f, 0.187100f, 0.622900f, 0.000000f, - -0.326300f, -0.718900f, 0.613800f, 0.000000f, - -0.562600f, 0.669500f, 0.485100f, 0.000000f, - -35.966850f, 57.105099f, 20524.212891f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20895.939453f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 20000.533203f, 1.000000f, - }, - { - 0.598200f, 0.187100f, 0.779200f, 0.000000f, - -0.457200f, -0.718900f, 0.523600f, 0.000000f, - -0.658100f, 0.669500f, 0.344500f, 0.000000f, - -31.281849f, 57.105099f, 19661.962891f, 1.000000f, - }, - { - 1.025100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.025100f, 0.000000f, - 0.000000f, 1.025100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 20032.976563f, 1.000000f, - }, - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 19028.070313f, 1.000000f, - }, - { - 0.406500f, 0.187100f, 0.894300f, 0.000000f, - -0.563800f, -0.718900f, 0.406600f, 0.000000f, - -0.719000f, 0.669500f, 0.186800f, 0.000000f, - -26.903849f, 57.105099f, 18691.248047f, 1.000000f, - }, - { - 1.031600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031600f, 0.000000f, - 0.000000f, 1.031600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 19060.513672f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 17961.750000f, 1.000000f, - }, - { - 0.196700f, 0.187100f, 0.962400f, 0.000000f, - -0.640300f, -0.718900f, 0.270600f, 0.000000f, - -0.742500f, 0.669500f, 0.021700f, 0.000000f, - -23.081848f, 57.105099f, 17627.578125f, 1.000000f, - }, - { - 1.036500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036500f, 0.000000f, - 0.000000f, 1.036500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 17994.193359f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 16817.216797f, 1.000000f, - }, - { - -0.018200f, 0.187100f, 0.982200f, 0.000000f, - -0.683900f, -0.718900f, 0.124300f, 0.000000f, - -0.729300f, 0.669500f, -0.141000f, 0.000000f, - -20.007050f, 57.105099f, 16486.400391f, 1.000000f, - }, - { - 1.039500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.039500f, 0.000000f, - 0.000000f, 1.039500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 16849.660156f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 15610.111328f, 1.000000f, - }, - { - -0.225800f, 0.187100f, 0.956000f, 0.000000f, - -0.694700f, -0.718900f, -0.023400f, 0.000000f, - -0.682900f, 0.669500f, -0.292300f, 0.000000f, - -17.795149f, 57.105099f, 15283.111328f, 1.000000f, - }, - { - 1.040000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.040000f, 0.000000f, - 0.000000f, 1.040000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 15642.555664f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 14356.078125f, 1.000000f, - }, - { - -0.414200f, 0.187100f, 0.890800f, 0.000000f, - -0.675700f, -0.718900f, -0.163200f, 0.000000f, - -0.609900f, 0.669500f, -0.424100f, 0.000000f, - -16.485548f, 57.105099f, 14033.073242f, 1.000000f, - }, - { - 1.037200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037200f, 0.000000f, - 0.000000f, 1.037200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 14388.522461f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 13070.758789f, 1.000000f, - }, - { - -0.577800f, 0.187100f, 0.794500f, 0.000000f, - -0.631700f, -0.718900f, -0.290100f, 0.000000f, - -0.516900f, 0.669500f, -0.533500f, 0.000000f, - -16.012848f, 57.105099f, 12751.730469f, 1.000000f, - }, - { - 1.031000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031000f, 0.000000f, - 0.000000f, 1.031000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 13103.203125f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 11769.795898f, 1.000000f, - }, - { - -0.715900f, 0.187100f, 0.672600f, 0.000000f, - -0.566400f, -0.718900f, -0.402900f, 0.000000f, - -0.408200f, 0.669500f, -0.620600f, 0.000000f, - -16.293648f, 57.105099f, 11454.640625f, 1.000000f, - }, - { - 1.022700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022700f, 0.000000f, - 0.000000f, 1.022700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 11802.240234f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 10468.833984f, 1.000000f, - }, - { - -0.827900f, 0.187100f, 0.528800f, 0.000000f, - -0.482200f, -0.718900f, -0.500600f, 0.000000f, - -0.286500f, 0.669500f, -0.685400f, 0.000000f, - -17.278248f, 57.105099f, 10157.392578f, 1.000000f, - }, - { - 1.013400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.013400f, 0.000000f, - 0.000000f, 1.013400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 10501.278320f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 9183.513672f, 1.000000f, - }, - { - -0.912000f, 0.187100f, 0.365100f, 0.000000f, - -0.380400f, -0.718900f, -0.581800f, 0.000000f, - -0.153600f, 0.669500f, -0.726800f, 0.000000f, - -18.951847f, 57.105099f, 8875.574219f, 1.000000f, - }, - { - 1.004100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004100f, 0.000000f, - 0.000000f, 1.004100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 9215.958008f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 7929.480957f, 1.000000f, - }, - { - -0.965100f, 0.187100f, 0.183100f, 0.000000f, - -0.261500f, -0.718900f, -0.644000f, 0.000000f, - -0.011100f, 0.669500f, -0.742800f, 0.000000f, - -21.328348f, 57.105099f, 7624.758301f, 1.000000f, - }, - { - 0.996000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.996000f, 0.000000f, - 0.000000f, 0.996000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 7961.925293f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 6722.375488f, 1.000000f, - }, - { - -0.982200f, 0.187100f, -0.015200f, 0.000000f, - -0.126300f, -0.718900f, -0.683500f, 0.000000f, - 0.138800f, 0.669500f, -0.729800f, 0.000000f, - -24.438049f, 57.105099f, 6420.471191f, 1.000000f, - }, - { - 0.990300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.990300f, 0.000000f, - 0.000000f, 0.990300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 6754.819824f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 5577.841309f, 1.000000f, - }, - { - -0.956000f, 0.187100f, -0.225800f, 0.000000f, - 0.023400f, -0.718900f, -0.694700f, 0.000000f, - 0.292300f, 0.669500f, -0.682900f, 0.000000f, - -28.305548f, 57.105099f, 5278.185547f, 1.000000f, - }, - { - 0.988000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.988000f, 0.000000f, - 0.000000f, 0.988000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 5610.285645f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 4511.521484f, 1.000000f, - }, - { - -0.878200f, 0.187100f, -0.440200f, 0.000000f, - 0.183000f, -0.718900f, -0.670600f, 0.000000f, - 0.441900f, 0.669500f, -0.597100f, 0.000000f, - -32.898449f, 57.105099f, 4213.296387f, 1.000000f, - }, - { - 0.991400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.991400f, 0.000000f, - 0.000000f, 0.991400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 4543.965332f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 3539.058594f, 1.000000f, - }, - { - -0.743400f, 0.187100f, -0.642200f, 0.000000f, - 0.341900f, -0.718900f, -0.605200f, 0.000000f, - 0.574900f, 0.669500f, -0.470500f, 0.000000f, - -38.008450f, 57.105099f, 3241.149658f, 1.000000f, - }, - { - 1.000100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000100f, 0.000000f, - 0.000000f, 1.000100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 3571.502441f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 2676.096436f, 1.000000f, - }, - { - -0.553100f, 0.187100f, -0.811800f, 0.000000f, - 0.486100f, -0.718900f, -0.496800f, 0.000000f, - 0.676600f, 0.669500f, -0.306700f, 0.000000f, - -43.285347f, 57.105099f, 2377.160400f, 1.000000f, - }, - { - 1.011600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.011600f, 0.000000f, - 0.000000f, 1.011600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 2708.540283f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1938.275757f, 1.000000f, - }, - { - -0.316400f, 0.187100f, -0.930000f, 0.000000f, - 0.601100f, -0.718900f, -0.349100f, 0.000000f, - 0.733900f, 0.669500f, -0.115000f, 0.000000f, - -48.290947f, 57.105099f, 1636.875488f, 1.000000f, - }, - { - 1.023400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.023400f, 0.000000f, - 0.000000f, 1.023400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1970.719727f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.049500f, 0.187100f, -0.981100f, 0.000000f, - 0.673700f, -0.718900f, -0.171100f, 0.000000f, - 0.737300f, 0.669500f, 0.090500f, 0.000000f, - -52.555748f, 57.105099f, 1036.013794f, 1.000000f, - }, - { - 1.032800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.032800f, 0.000000f, - 0.000000f, 1.032800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.225800f, 0.187100f, -0.956000f, 0.000000f, - 0.694700f, -0.718900f, 0.023400f, 0.000000f, - 0.682900f, 0.669500f, 0.292300f, 0.000000f, - -55.649448f, 57.105099f, 1031.074585f, 1.000000f, - }, - { - 1.037400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037400f, 0.000000f, - 0.000000f, 1.037400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.491100f, 0.187100f, -0.850800f, 0.000000f, - 0.658600f, -0.718900f, 0.222200f, 0.000000f, - 0.570100f, 0.669500f, 0.476300f, 0.000000f, - -57.270248f, 57.105099f, 1025.276733f, 1.000000f, - }, - { - 1.037900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.037900f, 0.000000f, - 0.000000f, 1.037900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.723400f, 0.187100f, -0.664600f, 0.000000f, - 0.561800f, -0.718900f, 0.409300f, 0.000000f, - 0.401200f, 0.669500f, 0.625200f, 0.000000f, - -57.111149f, 57.105099f, 1019.001221f, 1.000000f, - }, - { - 1.036800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.036800f, 0.000000f, - 0.000000f, 1.036800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.892600f, 0.187100f, -0.410300f, 0.000000f, - 0.409000f, -0.718900f, 0.562000f, 0.000000f, - 0.189800f, 0.669500f, 0.718200f, 0.000000f, - -55.002949f, 57.105099f, 1012.916504f, 1.000000f, - }, - { - 1.034500f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.034500f, 0.000000f, - 0.000000f, 1.034500f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.975800f, 0.187100f, -0.113200f, 0.000000f, - 0.214500f, -0.718900f, 0.661200f, 0.000000f, - -0.042300f, 0.669500f, 0.741600f, 0.000000f, - -51.079346f, 57.105099f, 1007.726318f, 1.000000f, - }, - { - 1.031200f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.031200f, 0.000000f, - 0.000000f, 1.031200f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.963000f, 0.187100f, 0.193800f, 0.000000f, - -0.000200f, -0.718900f, 0.695100f, 0.000000f, - -0.269300f, 0.669500f, 0.692300f, 0.000000f, - -45.765148f, 57.105099f, 1004.021790f, 1.000000f, - }, - { - 1.027000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.027000f, 0.000000f, - 0.000000f, 1.027000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.859000f, 0.187100f, 0.476600f, 0.000000f, - -0.210900f, -0.718900f, 0.662300f, 0.000000f, - -0.466500f, 0.669500f, 0.578100f, 0.000000f, - -39.690350f, 57.105099f, 1002.157410f, 1.000000f, - }, - { - 1.022400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.022400f, 0.000000f, - 0.000000f, 1.022400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.681700f, 0.187100f, 0.707300f, 0.000000f, - -0.395700f, -0.718900f, 0.571500f, 0.000000f, - -0.615400f, 0.669500f, 0.416100f, 0.000000f, - -33.554749f, 57.105099f, 1002.187256f, 1.000000f, - }, - { - 1.017400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.017400f, 0.000000f, - 0.000000f, 1.017400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.458000f, 0.187100f, 0.869100f, 0.000000f, - -0.539100f, -0.718900f, 0.438800f, 0.000000f, - -0.706900f, 0.669500f, 0.228400f, 0.000000f, - -27.984049f, 57.105099f, 1003.876953f, 1.000000f, - }, - { - 1.012300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.012300f, 0.000000f, - 0.000000f, 1.012300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - - { - { 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.217300f, 0.187100f, 0.958000f, 0.000000f, - -0.634300f, -0.718900f, 0.284200f, 0.000000f, - -0.741900f, 0.669500f, 0.037500f, 0.000000f, - -23.418049f, 57.105099f, 1006.781006f, 1.000000f, - }, - { - 1.007400f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.007400f, 0.000000f, - 0.000000f, 1.007400f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.011500f, 0.187100f, 0.982300f, 0.000000f, - -0.683000f, -0.718900f, 0.128900f, 0.000000f, - -0.730300f, 0.669500f, -0.136000f, 0.000000f, - -20.090649f, 57.105099f, 1010.310059f, 1.000000f, - }, - { - 1.001600f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.001600f, 0.000000f, - 0.000000f, 1.001600f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.214400f, 0.187100f, 0.958700f, 0.000000f, - -0.694900f, -0.718900f, -0.015100f, 0.000000f, - -0.686400f, 0.669500f, -0.284100f, 0.000000f, - -17.896347f, 57.105099f, 1014.017090f, 1.000000f, - }, - { - 0.994300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.994300f, 0.000000f, - 0.000000f, 0.994300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.391300f, 0.187100f, 0.901000f, 0.000000f, - -0.679600f, -0.718900f, -0.145900f, 0.000000f, - -0.620500f, 0.669500f, -0.408500f, 0.000000f, - -16.604847f, 57.105099f, 1017.721558f, 1.000000f, - }, - { - 0.986100f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.986100f, 0.000000f, - 0.000000f, 0.986100f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.545300f, 0.187100f, 0.817100f, 0.000000f, - -0.642900f, -0.718900f, -0.264400f, 0.000000f, - -0.538000f, 0.669500f, -0.512300f, 0.000000f, - -16.047749f, 57.105099f, 1021.376709f, 1.000000f, - }, - { - 0.977700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.977700f, 0.000000f, - 0.000000f, 0.977700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.679500f, 0.187100f, 0.709400f, 0.000000f, - -0.586800f, -0.718900f, -0.372600f, 0.000000f, - -0.440300f, 0.669500f, -0.598300f, 0.000000f, - -16.141548f, 57.105099f, 1025.005493f, 1.000000f, - }, - { - 0.969900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.969900f, 0.000000f, - 0.000000f, 0.969900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.795500f, 0.187100f, 0.576300f, 0.000000f, - -0.510700f, -0.718900f, -0.471600f, 0.000000f, - -0.326100f, 0.669500f, -0.667400f, 0.000000f, - -16.893848f, 57.105099f, 1028.650513f, 1.000000f, - }, - { - 0.963300f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963300f, 0.000000f, - 0.000000f, 0.963300f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.890900f, 0.187100f, 0.413900f, 0.000000f, - -0.411300f, -0.718900f, -0.560400f, 0.000000f, - -0.192700f, 0.669500f, -0.717400f, 0.000000f, - -18.402348f, 57.105099f, 1032.325195f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.958000f, 0.187100f, 0.217300f, 0.000000f, - -0.284200f, -0.718900f, -0.634300f, 0.000000f, - -0.037500f, 0.669500f, -0.741900f, 0.000000f, - -20.845448f, 57.105099f, 1035.962158f, 1.000000f, - }, - { - 0.957000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.957000f, 0.000000f, - 0.000000f, 0.957000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.982300f, 0.187100f, -0.013000f, 0.000000f, - -0.127900f, -0.718900f, -0.683200f, 0.000000f, - 0.137100f, 0.669500f, -0.730100f, 0.000000f, - -24.399748f, 57.105099f, 1039.308228f, 1.000000f, - }, - { - 0.958800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.958800f, 0.000000f, - 0.000000f, 0.958800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.947100f, 0.187100f, -0.260700f, 0.000000f, - 0.048800f, -0.718900f, -0.693400f, 0.000000f, - 0.317100f, 0.669500f, -0.671800f, 0.000000f, - -29.005148f, 57.105099f, 1041.880859f, 1.000000f, - }, - { - 0.963900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.963900f, 0.000000f, - 0.000000f, 0.963900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.844400f, 0.187100f, -0.502000f, 0.000000f, - 0.230600f, -0.718900f, -0.655700f, 0.000000f, - 0.483600f, 0.669500f, -0.563900f, 0.000000f, - -34.367550f, 57.105099f, 1043.237793f, 1.000000f, - }, - { - 0.971800f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.971800f, 0.000000f, - 0.000000f, 0.971800f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.677300f, 0.187100f, -0.711500f, 0.000000f, - 0.399200f, -0.718900f, -0.569000f, 0.000000f, - 0.618000f, 0.669500f, -0.412200f, 0.000000f, - -40.015949f, 57.105099f, 1043.108643f, 1.000000f, - }, - { - 0.981700f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.981700f, 0.000000f, - 0.000000f, 0.981700f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.460700f, 0.187100f, -0.867600f, 0.000000f, - 0.537700f, -0.718900f, -0.440500f, 0.000000f, - 0.706200f, 0.669500f, -0.230600f, 0.000000f, - -45.402149f, 57.105099f, 1041.465820f, 1.000000f, - }, - { - 0.993000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.993000f, 0.000000f, - 0.000000f, 0.993000f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - -0.217300f, 0.187100f, -0.958000f, 0.000000f, - 0.634300f, -0.718900f, -0.284200f, 0.000000f, - 0.741900f, 0.669500f, -0.037500f, 0.000000f, - -50.026550f, 57.105099f, 1038.534790f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.034900f, 0.187100f, -0.981700f, 0.000000f, - 0.685900f, -0.718900f, -0.112600f, 0.000000f, - 0.726800f, 0.669500f, 0.153400f, 0.000000f, - -53.643948f, 57.105099f, 1034.605103f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.284000f, 0.187100f, -0.940400f, 0.000000f, - 0.692000f, -0.718900f, 0.066000f, 0.000000f, - 0.663700f, 0.669500f, 0.333600f, 0.000000f, - -56.130249f, 57.105099f, 1029.897339f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.513800f, 0.187100f, -0.837300f, 0.000000f, - 0.652400f, -0.718900f, 0.239800f, 0.000000f, - 0.557100f, 0.669500f, 0.491400f, 0.000000f, - -57.333046f, 57.105099f, 1024.724487f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.709500f, 0.187100f, -0.679400f, 0.000000f, - 0.570200f, -0.718900f, 0.397500f, 0.000000f, - 0.414100f, 0.669500f, 0.616700f, 0.000000f, - -57.182648f, 57.105099f, 1019.425110f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.858600f, 0.187100f, -0.477300f, 0.000000f, - 0.450800f, -0.718900f, 0.529100f, 0.000000f, - 0.244200f, 0.669500f, 0.701600f, 0.000000f, - -55.694046f, 57.105099f, 1014.342407f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.951600f, 0.187100f, -0.244000f, 0.000000f, - 0.301900f, -0.718900f, 0.626100f, 0.000000f, - 0.058300f, 0.669500f, 0.740600f, 0.000000f, - -52.966049f, 57.105099f, 1009.804321f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.982300f, 0.187100f, 0.005300f, 0.000000f, - 0.133200f, -0.718900f, 0.682200f, 0.000000f, - -0.131400f, 0.669500f, 0.731100f, 0.000000f, - -49.174549f, 57.105099f, 1006.104492f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - }, - { - { - 1.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.000000f, 0.000000f, - 0.000000f, 1.000000f, 0.000000f, 0.000000f, - -41.462547f, 14.736900f, 1341.240845f, 1.000000f, - }, - { - 0.948800f, 0.187100f, 0.254600f, 0.000000f, - -0.044400f, -0.718900f, 0.693700f, 0.000000f, - -0.312800f, 0.669500f, 0.673800f, 0.000000f, - -44.562447f, 57.105099f, 1003.484802f, 1.000000f, - }, - { - 1.004900f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 1.004900f, 0.000000f, - 0.000000f, 1.004900f, 0.000000f, 0.000000f, - -36.722248f, 9.404100f, 1373.684814f, 1.000000f, - } - } -}; - -static Gu3dfInfo text_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000040, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000002, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#endif - GR_TEXFMT_YIQ_422 /* format */ - }, - { /* table */ - { /* nccTable */ - { /* yRGB */ - 0x22, 0x22, 0x2b, 0x3c, - 0x44, 0x44, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, - 0xcc, 0xdd, 0xee, 0xff - }, - { /* iRGB */ - { 0x01cf, 0x0027, 0x0023 }, - { 0x0001, 0x0000, 0x01ef }, - { 0x01e2, 0x000e, 0x0012 }, - { 0x01f4, 0x01ff, 0x01fc } - }, - { /* qRGB */ - { 0x01ee, 0x0019, 0x0010 }, - { 0x01e5, 0x0011, 0x0006 }, - { 0x01e8, 0x0009, 0x0008 }, - { 0x01eb, 0x0001, 0x0004 } - }, - { /* packed_data */ - 0x3c2b2222, 0x77664444, 0xbbaa9988, 0xffeeddcc, - 0x073c4e23, 0x000401ef, 0x07881c12, 0x07d3fffc, - 0x07b83210, 0x07942206, 0x07a01208, 0x07ac0204 - } - } - }, - NULL, /* data */ - 0x00001558 /* mem_required */ -}; - -unsigned char text_3dfinfo_image[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo hilite_3dfinfo = { - { /* header */ - 0x00000020, /* width */ - 0x00000020, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_32, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000003, /* large_lod */ - GR_ASPECT_1x1, /* aspect_ratio */ -#endif - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x0000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char hilite_3dfinfo_image[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0, -}; - -static Gu3dfInfo shadow_3dfinfo = { - { /* header */ - 0x00000040, /* width */ - 0x00000020, /* height */ -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) - GR_LOD_1, /* small_lod */ - GR_LOD_64, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ -#else - 0x00000008, /* small_lod */ - 0x00000002, /* large_lod */ - GR_ASPECT_2x1, /* aspect_ratio */ -#endif - GR_TEXFMT_INTENSITY_8 /* format */ - }, - { {{0x00000000}} }, /* table */ - NULL, /* data */ - 0x00000ab0 /* mem_required */ -}; - -unsigned char shadow_3dfinfo_image[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0, -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/h3/glide/src/tv.h b/glide2x/h3/glide/src/tv.h deleted file mode 100644 index a57907c..0000000 --- a/glide2x/h3/glide/src/tv.h +++ /dev/null @@ -1,573 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** $Log$ -** -** 3 3/17/99 6:16p Dow -** Phantom Menace and other fixes. -** -** 10 3/02/99 4:20p Stuartb -** Removed obsolete TV_STANDARD_XXX defines. -** -** 9 2/16/99 3:47p Stuartb -** Added some BIOS_XXXX tvout & LCD defines. -** -** 8 2/13/99 6:45p Stuartb -** First cut at PAL_M, PAL_N, PAL_NC support in tvout. -** -** 7 99/01/26 11:51 Larryw -** Bringing the other tv.h's into sync with the changes made to -** $/devel/h3/Win95/dx/inc/tv.h (including QUERYENABLETV). -** -** 2 1/14/99 3:50p Stuartb -** Added #define QUERYENABLETV. -** -** 1 9/10/98 2:55p Stuartb -** Interface file for TVOUT. -** -** 2 7/11/98 8:18a Andrew -** changed some comments -** -** 1 5/12/98 9:34a Andrew -** First attempt at TV out interface -** -*/ - -#ifndef _TV_H_ -#define _TV_H_ - -#ifdef VDDONLY -#define FAR -#endif - -// TVOut Queries -#define QUERYTVAVAIL (0x300) // Returns Status Determined at Boot -#define QUERYTVSENSE (0x301) // Performs a Sense on the available connectors - -// Individual Queries on Capabilities -#define QUERYGETPICCAP (0x321) // Get Individual Picture Control Capability -#define QUERYGETFILTERCAP (0x322) // Get Individual Filter Control Capability -#define QUERYGETPOSCAP (0x323) // Get Individual Position Control Capability -#define QUERYGETSIZECAP (0x324) // Get Individual Size Control Capability -#define QUERYGETSPECIALCAP (0x325) // Get Individual Special Control Capability - -// Get Current Settings -#define QUERYGETSTANDARD (0x340) // Get Current Standard Setting -#define QUERYGETPICCONTROL (0x341) // Get Individual Picture Control Setting -#define QUERYGETFILTERCONTROL (0x342) // Get Individual Filter Control Setting -#define QUERYGETPOSCONTROL (0x343) // Get Position Control Setting -#define QUERYGETSIZECONTROL (0x344) // Get Size Control Setting -#define QUERYGETSPECIAL (0x345) // Get Individual Special Control Setting -#define QUERYGETCONSTATUS (0x346) // Get Connector Status - -// Set Settings -#define QUERYSETSTANDARD (0x360) // Set Current Standard Setting -#define QUERYSETPICCONTROL (0x361) // Set Individual Picture Control Setting -#define QUERYSETFILTERCONTROL (0x362) // Set Individual Filter Control Setting -#define QUERYSETPOSCONTROL (0x363) // Set Individual Position Control Setting -#define QUERYSETSIZECONTROL (0x364) // Set Individual Size Control Setting -#define QUERYSSETSPECIAL (0x365) // Set Individual Special Control Setting -#define QUERYSETCONSTATUS (0x366) // Set Connector Status - -// Registery Updates -#define QUERYCOMMITREG (0x380) // This should be called after the user hits ok -#define QUERYREFRESH (0x381) // This should be called if the user hits cancel - -// Enable/Disable TV-Out -#define QUERYDISABLETV (0x500) // Disable TV-Out and switch CRT On -#define QUERYENABLETV (0x501) // This just enables mode selection - -/* -** Call this function first to know how if a TV Encoder is -** available and what general functionality it provides -** -** INPUT: qin.dwSubFunc = QUERYTVAVAIL -** OUTPUT: TVSTATUS -*/ - -typedef struct tvcon { - DWORD dwType; // Type of the Connector - DWORD dwStatus; // Connector Status -} TVCON, FAR * LPTVCON, * PTVCON; - -// To be used in the Type Field of TVCON -#define TV_TYPE_SVIDEO (0x00000001L) -#define TV_TYPE_COMPOSITE (0x00000002L) -#define TV_TYPE_SCART (0x00000004L) -#define TV_TYPE_UNKNOWN (0x08L) // for broken bt868 rev d - -// To be used in the Status Field of TVCON -#define TV_PRESENT (0x00000001L) // Did sense determine TV on connector ? -#define TV_CONNECTOR_ENABLED (0x00000002L) // Is Connector Currently Enabled ? - -#define MAX_CONNECTORS (0x000000004L) - -// This structure defines what we are capable of -typedef struct qtvstatus { - DWORD dwEncoder; // Did I2C Query find a TV Encoder - DWORD dwStandard; // Bit Map of Standard's Supported - DWORD dwPicControl; // Bit Map of Picture Controls - DWORD dwFilterControl; // Bit Map of Filter Controls - DWORD dwPosControl; // Bit Map of Position Controls - DWORD dwSizeControl; // Bit Map of Size Controls - DWORD dwSpecial; // Bit Map of Special Controls - DWORD dwNumSimultaneous; // How many outputs can you support at the same time? - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - BYTE szName[10]; // Name of the Encoder - } QTVSTATUS, FAR * LPQTVSTATUS, * PTVSTATUS; - -// To be used in TVStatus.dwEncoder -#define TV_ENCODER_PRESENT (0x00000001L) - -// To be used in TVStatus.dwPicControl -#define TV_BRIGHTNESS (0x00000001) -#define TV_CONTRAST (0x00000002) -#define TV_GAMMA (0x00000004) -#define TV_HUE (0x00000008) -#define TV_SATURATION (0x00000010) -#define TV_SHARPNESS (0x00000020) - -// To be used in TVStatus.dwFilter -#define TV_FLICKER (0x10000001) -#define TV_CHROMA (0x10000002) -#define TV_LUMA (0x10000004) - -// To be used in TVStatus.dwPosControl -#define TV_HORIZONTAL (0x00000001) -#define TV_VERTICAL (0x00000002) - -// To be used in TVStatus.dwSizeControl -#define TV_UNDERSCAN (0x00000001) -#define TV_OVERSCAN (0x00000002) -#define TV_ADJUST_UNDERSCAN (0x00000004) -#define TV_ADJUST_OVERSCAN (0x00000008) - -// To be used in TVStatus.dwSpecial -#define TV_CLOSED_CAPTION (0x00000001) -#define TV_MACROVISION (0x00000002) -#define TV_LCDPANEL (0x00000004) /* Flat panel out */ - -// To be used in TVSetSpec.dwCap for miscellaneous features -#define TV_SETSPECIAL_CCAPTION (0x00000001) -#define TV_SETSPECIAL_MACROVISION (0x00000002) -#define TV_SETSPECIAL_LCDPANEL (0x00000004) /* Flat panel out */ -#define TV_SETSPECIAL_WR_LCDREG (0x00000005) /* For debug */ -#define TV_SETSPECIAL_RD_LCDREG (0x00000006) /* For debug */ - -#define MAX_SPECIAL_DATA 512 -/* -** Call this function to request the Driver to perform -** a sense on every connector -** -** INPUT: qin.dwSubFunc = QUERYTVSENSE -** OUTPUT: TVCONSTATUS -*/ - -typedef struct tvconstatus { - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVCONSTATUS, FAR * LPTVCONSTATUS, * PTVCONSTATUS; - -/**************************************************************************** -** -** Get Capabilities -** -****************************************************************************/ - -typedef struct qind { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Capability of Interest -} QIND, FAR * LPQIND, * PQIND; - -/* -** Call this function to request the Driver to -** report individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCAP -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCAPDATA -*/ - -typedef struct tvcapdata { - DWORD dwCap; // Capability of Interest - DWORD dwNumSteps; // Number of Steps Supported by Hardware - } TVCAPDATA, FAR * LPTVCAPDATA, * PTVCAPDATA; - -/* -** Call this function to request the Driver to -** report all Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCAP -** OUTPUT: TVPOSCAP -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvposcap { - DWORD dwMaxLeft; // Maximum Left Position in Hardware Units - DWORD dwMaxRight; // Maximum Right Position in Hardware Units - DWORD dwHorGranularity; // Size of Movement in Pixels - DWORD dwMaxTop; // Maximum Top Position in Hardware Units - DWORD dwMaxBottom; // Maximum Bottom Position in Hardware Units - DWORD dwVGAGranularity; // Granularity in VGA Lines - } TVPOSCAP, FAR * LPTVPOSCAP, * PTVPOSCAP; - -/* -** Call this function to request the Driver to -** report all Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECAP -** OUTPUT: TVSIZECAP -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsizecap { - DWORD dwMaxHorInput; // Maximum Input Horizontal Size in Active Pixels - DWORD dwMaxVerInput; // Maximum Input Vertical Size in Active Lines - DWORD dwMaxHorOutput; // Maximum Output Horizontal Size in Active Pixels - DWORD dwMaxVerOutput; // Maximum Output Vertical Size in Active Pixels - DWORD dwMinHorInput; // Minimum Input Horizontal Size in Active Pixels - DWORD dwMinVerInput; // Minimum Input Vertical Size in Active Lines - DWORD dwMinHorOutput; // Minimum Output Horizontal Size in Active Pixels - DWORD dwMinVerOutput; // Minimum Output Vertical Size in Active Pixels - DWORD dwHorStepSize; // In Percentage * 1000 - DWORD dwVerStepSize; // In Percentage * 1000 - } TVSIZECAP, FAR * LPTVSIZECAP, * PTVSIZECAP; - -/* -** Call this function to request the Driver to -** report on a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIALCAP -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION | -** TV_LCDPANEL -** OUTPUT: TVSPECCAP -*/ - -/**************************************************************************** -** -** Get Current Settings -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** report current Standard Setting -** -** INPUT: qin.dwSubFunc = QUERYGETSTANDARD -** OUTPUT: TVGETSTANDARD -*/ -typedef struct tvgetstandard { - DWORD dwStandard; // Standard Currently in Use -} TVGETSTANDARD, FAR * LPTVGETSTANDARD, * PTVGETSTANDARD; - -/* -** Call this function to request the Driver to -** report current individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCONTROL -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCURCAP -*/ - -typedef struct tvcurcap { - DWORD dwCap; // Capability Requested - DWORD dwStep; // Current Hardware Step we are on - } TVCURCAP, FAR * LPTVCURCAP, * PTVCURCAP; - -/* -** Call this function to request the Driver to -** report current individual Filter Capability -** -** INPUT: qind.dwSubFunc = QUERYGETFILTERCONTROL -** qind.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** OUTPUT: TVCURCAP -*/ - -/* -** Call this function to request the Driver to -** report all current Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCONTROL -** OUTPUT: TVCURPOS -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvcurpos { - DWORD dwCurLeft; // Current Left Position in Hardware Units - DWORD dwCurRight; // Current Right Position in Hardware Units - DWORD dwCurTop; // Current Top Position in Hardware Units - DWORD dwCurBottom; // Current Bottom Position in Hardware Units - } TVCURPOS, FAR * LPTVCURPOS, * PTVCURPOS; - -/* -** Call this function to request the Driver to -** report current Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECONTROL -** OUTPUT: TVCURSIZE -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvcursize { - DWORD dwCurHorInput; // Current Input Horizontal Size in Active Pixels - DWORD dwCurVerInput; // Current Input Vertical Size in Active Lines - DWORD dwCurHorOutput; // Current Output Horizontal Size in Active Pixels - DWORD dwCurVerOutput; // Current Output Vertical Size in Active Pixels - } TVCURSIZE, FAR * LPTVCURSIZE, * PTVCURSIZE; - -/* -** Call this function to request the Driver to -** report on current a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIAL -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION -** OUTPUT: TVCURSPEC -*/ - -/* -** Call this function to request the Driver to return -** in memory data on every connector -** -** INPUT: qin.dwSubFunc = QUERYGETCONSTATUS -** OUTPUT: TVCONSTATUS -*/ - - -/**************************************************************************** -** -** Set Functions -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** change the current Standard Setting -** -** INPUT: TvSetStandard.dwSubFunc = QUERYSETSTANDARD -** TvSetStandard.dwStandard = TV_STANDARD_NTSCRS170A | -** TV_STANDARD_NTSCM | -** TV_STANDARD_NTSCN | -** TV_STANDARD_NTSC443 | -** TV_STANDARD_NTSCJAPAN | -** TV_STANDARD_PALBDGHI | -** TV_STANDARD_PALM | -** TV_STANDARD_PALN | -** TV_STANDARD_PALN_ARGENTINA | -** -** OUTPUT: None -*/ -typedef struct tvsetstandard { - DWORD dwSubFunc; // Sub Function - DWORD dwStandard; // Standard Currently in Use -} TVSETSTANDARD, FAR * LPTVSETSTANDARD, * PTVSETSTANDARD; - -/* -** Call this function to request the Driver to -** set individual Picture Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETPICCONTROL -** TVSetCap.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -typedef struct tvsetcap { - DWORD dwSubFunc; // SubFunction - DWORD dwCap; // Capability Requested - LONG dwStep; // Hardware Step to set - } TVSETCAP, FAR * LPTVSETCAP, * PTVSETCAP; - -/* -** Call this function to request the Driver to -** set individual Filter Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETFILTERCONTROL -** TVSetCap.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to -** move the Output Image -** -** INPUT: TVSetPos.dwSubFunc = QUERYSETPOSCONTROL -** TVSetPos.dwLeft = -** TVSetPos.dwRight = -** TVSetPos.dwTop = -** TVSetPos.dwBottom = -** OUTPUT: None -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvsetpos { - DWORD dwSubFunc; // SubFunction - DWORD dwLeft; // Left Position in Hardware Units - DWORD dwRight; // Right Position in Hardware Units - DWORD dwTop; // Top Position in Hardware Units - DWORD dwBottom; // Bottom Position in Hardware Units - } TVSETPOS, FAR * LPTVSETPOS, * PTVSETPOS; - -/* -** Call this function to request the Driver to -** set the resize the input/output -** -** INPUT: TVSetSize.dwSubFunc = QUERYSETSIZECONTROL -** TvSetSize.dwHorOutput = -** TvSetSize.dwVerOutput = -** OUTPUT: None -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsetsize { - DWORD dwSubFunc; // SubFunction - DWORD dwOverScan; // Overscan enable/disable - DWORD dwHorOutput; // Output Horizontal Size in Active Pixels - DWORD dwVerOutput; // Output Vertical Size in Active Lines - } TVSETSIZE, FAR * LPTVSETSIZE, * PTVSETSIZE; - -/* -** Call this function to request the Driver to -** set the a Special Capability -** -** INPUT: TVSetSpec.dwSubFunc = QUERYSETSPECIAL -** TVSetSpec.dwCap = TV_SETSPECIAL_CCAPTION | -** TV_SETSPECIAL_MACROVISION | -** TV_SETSPECIAL_LCDPANEL -** OUTPUT: None -*/ -typedef struct tvsetspecial { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Feature to set - DWORD dwIndex; // Index to data array: 0 - none - WORD wData[MAX_SPECIAL_DATA]; // Data array: format specific to caps - DWORD dwIPclock; // Flat panel clock - } TVSETSPECIAL, FAR * LPTVSETSPECIAL, * PTVSETSPECIAL; - -/* -** Call this function to request the Driver to enable/disable -** connectors -** -** INPUT: TVSetConnector.dwSubFunc = QUERYSETCONSTATUS -** Note i can range from 0 to < dwNumSimultaneous -** TVSetConnector.TVCon[i].dwType = TV_TYPE_SVIDEO | TV_TYPE_COMPOSITE | TV_TYPE_SCART -** TVSetConnector.TVCon[i].dwStatus = TV_CONNECTOR_ENABLED | 0x00 -** -** OUTPUT: None -*/ - -typedef struct tvsetconnector { - DWORD dwSubFunc; // SubFunction - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVSETCONNECTOR, FAR * LPTVSETCONNECTOR, * PTVSETCONNECTOR; - -/**************************************************************************** -** -** Registry Functions -** -****************************************************************************/ -/* -** Call this function to request the Driver to save -** in memory data to registry -** -** INPUT: qin.dwSubFunc = QUERYCOMMITREG -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to refresh -** in memory data with registry data -** -** INPUT: qin.dwSubFunc = QUERYREFRESH -** OUTPUT: None -*/ - - - -/**************************************************************************** -** -** Error codes -** -****************************************************************************/ -#define TV_STANDARD_UNSUPPORTED (0x00000001L) -#define TV_CONTROL_UNSUPPORTED (0x00000002L) -#define TV_INVALID_DEVICE (0x000000ffL) - - -/**************************************************************************** -** -** TV standards that we support taken from win98 ddk tvout.h -** -****************************************************************************/ - -#define VP_TV_STANDARD_NTSC_M 0x0001 // 75 IRE Setup -#define VP_TV_STANDARD_NTSC_M_J 0x0002 // Japan, 0 IRE Setup -#define VP_TV_STANDARD_PAL_B 0x0004 -#define VP_TV_STANDARD_PAL_D 0x0008 -#define VP_TV_STANDARD_PAL_H 0x0010 -#define VP_TV_STANDARD_PAL_I 0x0020 -#define VP_TV_STANDARD_PAL_M 0x0040 -#define VP_TV_STANDARD_PAL_N 0x0080 -#define VP_TV_STANDARD_SECAM_B 0x0100 -#define VP_TV_STANDARD_SECAM_D 0x0200 -#define VP_TV_STANDARD_SECAM_G 0x0400 -#define VP_TV_STANDARD_SECAM_H 0x0800 -#define VP_TV_STANDARD_SECAM_K 0x1000 -#define VP_TV_STANDARD_SECAM_K1 0x2000 -#define VP_TV_STANDARD_SECAM_L 0x4000 -#define VP_TV_STANDARD_WIN_VGA 0x8000 -// and the rest -#define VP_TV_STANDARD_NTSC_433 0x00010000 -#define VP_TV_STANDARD_PAL_G 0x00020000 -#define VP_TV_STANDARD_PAL_60 0x00040000 -#define VP_TV_STANDARD_SECAM_L1 0x00080000 - -#define VP_TV_STANDARD_PAL_NC VP_TV_STANDARD_SECAM_L1 - - -#define BIOS_NTSC 0x01 // 00001 -#define BIOS_PAL 0x02 // (BGDHI) 00010 -#define BIOS_PAL_N 0x0a // 01010 -#define BIOS_PAL_M 0x12 // 10010 -#define BIOS_PAL_Nc 0x1a // 11010 - -#define BIOS_TVSTD_MASK (BIOS_NTSC | BIOS_PAL | BIOS_PAL_N | BIOS_PAL_M | BIOS_PAL_Nc) -#define BIOS_LCD_ACTIVE 0x04 -#define BIOS_TVOUT_ACTIVE 0x20 - - -#endif diff --git a/glide2x/h3/glide/src/xdraw2.S b/glide2x/h3/glide/src/xdraw2.S deleted file mode 100644 index a5619a5..0000000 --- a/glide2x/h3/glide/src/xdraw2.S +++ /dev/null @@ -1,245 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -/* $Header$ */ -/* $Revision$ */ -/* $Log$ */ -/* */ -/* 11 10/05/98 7:43p Peter */ -/* 3DNow!(tm) happiness everywhere */ -/* */ -/* 10 10/03/98 3:35p Peter */ -/* First pass at dynamic detection of 3DNow!(tm) */ -/* */ -/* 9 9/21/98 5:42p Dow */ -/* 3DNow! (tm) mods */ -/* */ -/* 8 7/24/98 1:40p Hohn */ -/* */ -/* 7 5/18/98 12:16p Peter */ -/* culling enabling */ -/* */ -/* 6 1/15/98 1:12p Peter */ -/* dispatch w/o packing */ -/* */ -/* 5 11/06/97 3:47p Peter */ -/* */ -/* 4 11/04/97 5:04p Peter */ -/* cataclysm part deux */ -/* */ -/* 3 11/01/97 10:01a Peter */ -/* tri dispatch stuff */ -/* */ -/* 2 10/30/97 6:53p Peter */ -/* first real cut at tri asm */ -/* */ -/* 1 10/30/97 4:29p Peter */ -/* asm tri code */ -/* */ -/* 2 7/07/97 2:14p Jdt */ -/* assembly now on par with C code. */ -/* */ -/* 1 7/07/97 8:37a Jdt */ -/* B4 Chip field fix. */ - - -.file "xdraw2.asm" - - - -.data - .type One,@object - .size One,4 -One: .int 0x03f800000 - .type Area,@object - .size Area,4 -Area: .int 0 - -#if GLIDE_PACKED_RGB - .type bias0,@object - .size bias0,4 -bias0: .int 0 - .type bias1,@object - .size bias1,4 -bias1: .int 0 -#endif - -/* Ugly, but seems to workaround the problem with locally defined */ -/* data segment globals not getting relocated properly when using */ -/* djgpp. */ - -#define zArea One+0x04 - -/* Definitions of cvg regs and glide root structures. */ -#include "fxgasm.h" - -/* Arguments (STKOFF = 16 from 4 pushes) */ -#define STKOFF 16 -#define _va 4 + STKOFF -#define _vb 8 + STKOFF -#define _vc 12 + STKOFF - -#ifdef GL_AMD3D -#define PROC_TYPE(arg) _trisetup_3DNow_##arg -#define END_PROC_TYPE(arg) .L_END_trisetup_3Dnow_##arg -#else -#define PROC_TYPE(arg) _trisetup_Default_##arg -#define END_PROC_TYPE(arg) .L_END_Default_3Dnow_##arg -#endif - -/* -------------------------------------------------------------------------- */ -.text - - -.align 32 - -.globl PROC_TYPE(cull) -.type PROC_TYPE(cull),@function -PROC_TYPE(cull): - -#define LOCAL(arg) .L_cull_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#undef cull -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull): -.size PROC_TYPE(cull),END_PROC_TYPE(cull)-PROC_TYPE(cull) - -.align 32 - -#if GLIDE_PACKED_RGB -.globl PROC_TYPE(cull_rgb) -.type PROC_TYPE(cull_rgb),@function -PROC_TYPE(cull_rgb): - -#define LOCAL(arg) .L_cull_rgb_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull_rgb): -.size PROC_TYPE(cull_rgb),END_PROC_TYPE(cull_rgb)-PROC_TYPE(cull_rgb) - -.align 32 - -.globl PROC_TYPE(cull_argb) -.type PROC_TYPE(cull_argb),@function -PROC_TYPE(cull_argb): - -#define LOCAL(arg) .L_cull_argb_##arg - -#define GLIDE_CULLING 1 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 1 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(cull_argb): -.size PROC_TYPE(cull_argb),END_PROC_TYPE(cull_argb)-PROC_TYPE(cull_argb) -#endif /* GLIDE_PACKED_RGB */ - -.align 32 - -.globl PROC_TYPE(Default) -.type PROC_TYPE(Default),@function -PROC_TYPE(Default): - -#define LOCAL(arg) .L_Default_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(Default): -.size PROC_TYPE(Default),END_PROC_TYPE(Default)-PROC_TYPE(Default) - -.align 32 - -#if GLIDE_PACKED_RGB -.globl PROC_TYPE(rgb) -.type PROC_TYPE(rgb),@function -PROC_TYPE(rgb): - -#define LOCAL(arg) .L_rgb_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(rgb): -.size PROC_TYPE(rgb),END_PROC_TYPE(rgb)-PROC_TYPE(rgb) - -.align 32 - -.globl PROC_TYPE(argb) -.type PROC_TYPE(argb),@function -PROC_TYPE(argb): - -#define LOCAL(arg) .L_argb_##arg - -#define GLIDE_CULLING 0 -#define GLIDE_PACK_RGB 1 -#define GLIDE_PACK_ALPHA 1 -#define GLIDE_GENERIC_SETUP 0 -#include "xdraw2.inc.S" -#define GLIDE_GENERIC_SETUP 0 -#define GLIDE_PACK_ALPHA 0 -#define GLIDE_PACK_RGB 0 -#define GLIDE_CULLING 0 - -END_PROC_TYPE(argb): -.size PROC_TYPE(argb),END_PROC_TYPE(argb)-PROC_TYPE(argb) -#endif /* GLIDE_PACKED_RGB */ - - - -.END - diff --git a/glide2x/h3/glide/src/xdraw2.asm b/glide2x/h3/glide/src/xdraw2.asm deleted file mode 100644 index 5de4372..0000000 --- a/glide2x/h3/glide/src/xdraw2.asm +++ /dev/null @@ -1,216 +0,0 @@ -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -;; -;; 3 3/17/99 6:17p Dow -;; Phantom Menace and other fixes. -;; -;; 10 10/09/98 6:57p Peter -;; dynamic 3DNow!(tm) mods -;; -;; 9 9/21/98 5:35p Dow -;; 3DNow! mods -;; -;; 8 5/18/98 3:21p Peter -;; dynamic culling changes -; -; 6 1/15/98 1:12p Peter -; dispatch w/o packing -; -; 5 11/06/97 3:47p Peter -; -; 4 11/04/97 5:04p Peter -; cataclysm part deux -; -; 3 11/01/97 10:01a Peter -; tri dispatch stuff -; -; 2 10/30/97 6:53p Peter -; first real cut at tri asm -; -; 1 10/30/97 4:29p Peter -; asm tri code -; -; 2 7/07/97 2:14p Jdt -; assembly now on par with C code. -; -; 1 7/07/97 8:37a Jdt -; B4 Chip field fix. -;; - -TITLE xdraw2.asm -OPTION OLDSTRUCTS - -.586P -.MMX -.K3D - -EXTRN __GlideRoot: DWORD -EXTRN __FifoMakeRoom: NEAR - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - -IF GLIDE_PACKED_RGB - bias0 DD 0 - bias1 DD 0 -ENDIF -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -PROC_TYPE MACRO procType:= - IFDEF GL_AMD3D - EXITM <__trisetup_3DNow_&procType&@12> - ELSE - EXITM <__trisetup_Default_&procType&@12> - ENDIF - ENDM - -;-------------------------------------------------------------------------- -_TEXT SEGMENT PAGE PUBLIC USE32 'CODE' - ASSUME DS: FLAT, SS: FLAT - - ALIGN 32 - - PUBLIC PROC_TYPE(cull) -PROC_TYPE(cull) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TYPE(cull) ENDP - - ALIGN 32 - -IF GLIDE_PACKED_RGB - PUBLIC PROC_TYPE(cull_rgb) -PROC_TYPE(cull_rgb) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(cull_rgb) ENDP - - ALIGN 32 - - PUBLIC PROC_TPYE(cull_argb) -PROC_TPYE(cull_argb) PROC NEAR - -GLIDE_CULLING textequ <1> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(cull_argb) ENDP -ENDIF ; GLIDE_PACKED_RGB - - ALIGN 32 - - PUBLIC PROC_TYPE() -PROC_TYPE() PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TYPE() ENDP - - ALIGN 32 - -IF GLIDE_PACKED_RGB - PUBLIC PROC_TYPE(rgb) -PROC_TPYE(rgb) PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(rgb) ENDP - - ALIGN 32 - - PUBLIC PROC_TPYE(argb) -PROC_TPYE(argb) PROC NEAR - -GLIDE_CULLING textequ <0> -GLIDE_PACK_RGB textequ <1> -GLIDE_PACK_ALPHA textequ <1> -GLIDE_GENERIC_SETUP textequ <0> -INCLUDE xdraw2.inc -GLIDE_GENERIC_SETUP textequ <0> -GLIDE_PACK_ALPHA textequ <0> -GLIDE_PACK_RGB textequ <0> -GLIDE_CULLING textequ <0> - -PROC_TPYE(argb) ENDP -ENDIF ; GLIDE_PACKED_RGB - - -_TEXT ENDS - -END - diff --git a/glide2x/h3/glide/src/xdraw2.inc b/glide2x/h3/glide/src/xdraw2.inc deleted file mode 100644 index bfcf36c..0000000 --- a/glide2x/h3/glide/src/xdraw2.inc +++ /dev/null @@ -1,1266 +0,0 @@ -;; -*-asm-*- -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -; -; 2 10/30/97 6:53p Peter -; first real cut at tri asm -; -; 1 10/30/97 4:29p Peter -; asm tri code -; -; 2 7/07/97 2:14p Jdt -; assembly now on par with C code. -; -; 1 7/07/97 8:37a Jdt -; B4 Chip field fix. -;; - -TITLE xdraw2.inc - -ifdef GL_AMD3D - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - -WRITE_MM1_FIFO_ALIGNED MACRO - movq [fifo], mm1 ; store current param | previous param -ENDM ; WRITE_MM1_FIFO_ALIGNED - -WRITE_MM1LOW_FIFO MACRO - movd [fifo], mm1 ; store current param | previous param -ENDM ; WRITE_MM1LOW_FIFO - -gc TEXTEQU ; points to graphics context -fifo TEXTEQU ; points to fifo entries -tempVal TEXTEQU - -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller -cull TEXTEQU ; cull mode -intArea TEXTEQU ; area temp storage - - ;; Prologue stuff - - ;; This code is only executed when culling is enabled, so we - ;; don't need to check for GR_CULL_DISABLE - - push edi ; save caller's register variable - mov gc,[__GlideRoot+curGC]; GR_DCL_GC - - push esi ; save caller's register variable - mov fc, [esp + _vc$ - 8] ; get base address of vertex C - - push ebx ; save caller's register variable - mov fb, [esp + _vb$ - 4] ; get base address of vertex B - - push ebp ; save frame pointer - mov cull, [gc + cull_mode]; get cull mode - - mov fa, [esp + _va$] ; get base address of vertex A - mov tempVal, [__GlideRoot + curTriSize] - - femms ; will use AMD3D, clear FPU/MMX registers - - ;; Cullcheck - - movq mm2, [fc + x] ; yc | xc - shl cull, 31 ; culltest << 31 - - movq mm1, [fb + x] ; yb | xb - add tempVal, 4 ; space required in fifo - - movq mm0, [fa + x] ; ya | xa - mov ebx, [gc + fifoRoom] ; space available in fifo - - ;; Area_Computation - - pfsubr mm2, mm1 ; dyBC | dxBC - pfsub mm0, mm1 ; dyAB | dxAB - - movq mm5, mm2 ; dyBC | dxBC - punpckhdq mm2, mm2 ; dyBC | dyBC - - movq mm4, mm0 ; dyAB | dxAB - punpckhdq mm0, mm0 ; dyAB | dyAB - - pfmul mm5, mm0 ; dyAB*dxBC - pfmul mm4, mm2 ; dxAB*dyBC - - pfsub mm4, mm5 ; dxAB*dyBC - dxBC*dyAB - - movd intArea, mm4 ; vectored ! - - ; Zero Area Triangle Check - - test intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __cullFail ; area zero, triangle culled - - xor intArea, cull ; if (j ^ (culltest << 31)) - jge __cullFail ; triangle facing away from viewer, culled - - cmp ebx, tempVal ; fifo space required >= space available ? - jge __triBegin ; yup, push out triangle data to Voodoo - - push @Line ; line number inside this function - push 0h ; pointer to function name = NULL - - push tempVal ; fifo space required - call __FifoMakeRoom ; note: updates fifoPtr - - add esp, 12 ; remove 3 DWORD arguments from stack - -ELSE ; !GLIDE_CULLING - - ;; Prologue stuff - push edi ; save caller's register variable - mov gc,[__GlideRoot+curGC]; GR_DCL_GC - - push esi ; save caller's register variable - mov eax, [__GlideRoot + curTriSize] - - push ebx ; save caller's register variable - mov ebx, [gc + fifoRoom] ; fifo space available - - push ebp ; save frame pointer - add eax, 4 ; fifo space required - - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - - cmp ebx, eax ; space available >= space required ? - jge __triBegin ; yup, start drawing triangle - - push @Line ; line number inside this function - push 0h ; pointer to function name = NULL - - push eax ; space required in fifo - call __FifoMakeRoom ; note: updates fifoPtr - - add esp, 12 ; remove 3 DWORD arguments from stack - mov eax, eax ; filler -ENDIF - - -dlp TEXTEQU ; points to dataList structure -dlpstrt TEXTEQU ; points to begin of dataList structure -vertex TEXTEQU ; the current vertex -packCol TEXTEQU - -__triBegin: - mov eax, [gc+triPacketHdr]; Packet 3 header - lea dlp,[gc + tsuDataList]; Reset the dataList - - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vertex, [esp + _va$] ; Current vertex = A - - mov dlpstrt, dlp ; save pointer to start of dataList - test fifo, 4 ; is fifo pointer qword aligned ? - - jz __fifo_aligned ; yes, it is qword aligned - movq mm1, [vertex+x] ; y | x - - GR_FIFO_WRITE fifo, 0, eax ; write header to fifo; now qword aligned - add fifo, 4 ; advance fifo for hdr; now qword aligned - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry for "a" - psllq mm3, 24 ; 00000000 | aa000000 - - por mm1, mm2 ; 00000000 | 00rrggbb - por mm1, mm3 ; 00000000 | aarrggbb -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - add dlp, 4 ; next data list entry - - movd mm2, [vertex+b] ; 0 | b - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - - psrlq mm1, 24 ; 00000000 | 0000gg00 - por mm1, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_PACK_ALPHA - cmp eax, 0 ; end of list ? -ELSE - test eax, eax ; end of list ? -ENDIF - jz __paramLoopDoneWBone1 ; yes, one DWORD in "write buffer" - -__paramLoop1a: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - cmp eax, 0 ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero1; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - cmp eax, 0 ; at end of offset list (offset == 0) ? - jnz __paramLoop1a ; nope, copy next parameter - - jmp __paramLoopDoneWBone1 ; merge back into common stream - lea esp, [esp] ; filler -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - test eax, eax ; at end of list ? - - lea dlp, [dlp+4] ; dlp++ - jz __paramLoopDoneWBzero1; yes, "write buffer" empty - -__paramLoop1a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone1 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1a ; nope, copy next parameter - - mov esp, esp ; filler - jmp __paramLoopDoneWBzero1; write buffer empty - -ENDIF ; GLIDE_PACK_RGB - -__fifo_aligned: - movd mm2, [vertex+x] ; y | x of vertex A - movd mm1, [gc+triPacketHdr]; Packet 3 header - - punpckldq mm1, mm2 ; x | header - WRITE_MM1_FIFO_ALIGNED ; PCI write x | header - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - movd mm1, [vertex+y] ; 0 | y of vertex A - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm4, mm2 ; 00000000 | 00rrggbb - - add dlp, 8 ; skip data list entry "a" - por mm4, mm3 ; 00000000 | aarrggbb - -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - add dlp, 4 ; next data list entry - - psrlq mm4, 24 ; 00000000 | 0000gg00 - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero1; yes, "write buffer" is empty - nop ; filler - -__paramLoop1b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone1 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - -IF GLIDE_PACK_ALPHA - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) -ELSE - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - nop -ENDIF - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1b ; nope, copy next parameter - - jmp __paramLoopDoneWBzero1; write buffer empty - -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone1 ; yes, "write buffer" has y data - -__paramLoop1b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBzero1; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop1b ; nope, copy next parameter -ENDIF - -__paramLoopDoneWBone1: - - ;; here: "write buffer" has one DWORD left over from vertex A - - mov vertex, [esp + _vb$] ; Current vertex = B - mov dlp, dlpstrt ; reset the dataList - - movd mm2, [vertex+x] ; 0 | x if vertex B - punpckldq mm1, mm2 ; x | old param - - WRITE_MM1_FIFO_ALIGNED ; PCI write: x | old param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - movd mm1, [vertex+y] ; 0 | y of vertex B -IF GLIDE_PACK_RGB -ELSE - mov esp, esp ; filler -ENDIF - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry "a" - mov eax, eax ; filler - - psllq mm3, 24 ; 00000000 | aa000000 - - por mm4, mm2 ; 00000000 | 00rrggbb - por mm4, mm3 ; 00000000 | aarrggbb - -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 4 ; next data list entry - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero2; yes, "write buffer" is empty - mov esp, esp ; filler - -__paramLoop2b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - test eax, eax ; at end of offset list (offset == 0) ? - lea dlp, [dlp+4] ; dlp++ - - jz __paramLoopDoneWBone2 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2b ; nope, copy next parameter - - jmp __paramLoopDoneWBzero2; write buffer empty -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone2 ; yes, "write buffer" has y data - -__paramLoop2b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - jz __paramLoopDoneWBzero2; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2b ; nope, copy next parameter - - jmp __paramLoopDoneWBone2 ; write buffer contains one DWORD -ENDIF - - -__paramLoopDoneWBzero1: - - mov vertex, [esp + _vb$] ; Current vertex = B - mov dlp, dlpstrt ; Reset the dataList - - movq mm1, [vertex+x] ; y | x of vertex B - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x of vertex B - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm1, mm2 ; 00000000 | 00rrggbb - - por mm1, mm3 ; 00000000 | aarrggbb - add dlp, 8 ; skip data list entry "a" -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - por mm1, mm2 ; 00000000 | 00rrggbb - add dlp, 4 ; next data list entry -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; end of list ? - jz __paramLoopDoneWBone2 ; yes, one DWORD in "write buffer" - -__paramLoop2a: - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - punpckldq mm1, mm2 ; current param | previous param - - add dlp, 4 ; dlp++ - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBzero2; exit, "write buffer" empty - movd mm1, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop2a ; nope, copy next parameter - - jmp __paramLoopDoneWBone2 ; merge back into common stream -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; at end of list ? - jz __paramLoopDoneWBzero2; yes, "write buffer" empty - -__paramLoop2a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ -IF GLIDE_CULLING - test eax, eax ; at end of offset list (offset == 0) ? -ELSE - cmp eax, 0 ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBone2 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_CULLING - cmp eax, 0 ; at end of offset list (offset == 0) ? -ELSE - test eax, eax ; at end of offset list (offset == 0) ? -ENDIF - jnz __paramLoop2a ; nope, copy next parameter -ENDIF ; GLIDE_PACK_RGB - - -__paramLoopDoneWBzero2: - - mov vertex, [esp + _vc$] ; Current vertex = C - mov dlp, dlpstrt ; Reset the dataList - - movq mm1, [vertex+x] ; y | x of vertex C - WRITE_MM1_FIFO_ALIGNED ; PCI write y | x of vertex C - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - psllq mm3, 24 ; 00000000 | aa000000 - por mm1, mm2 ; 00000000 | 00rrggbb - - por mm1, mm3 ; 00000000 | aarrggbb - add dlp, 8 ; skip data list entry "a" -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm1, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm1, mm1 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm1 ; 00000000 | 00rr00bb - psrlq mm1, 24 ; 00000000 | 0000gg00 - - por mm1, mm2 ; 00000000 | 00rrggbb - add dlp, 4 ; next data list entry -ENDIF ; !GLIDE_PACK_ALPHA - - ;; here: one DWORD in "write buffer", RGB(A) - - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_PACK_ALPHA - cmp eax, 0 ; end of list ? -ELSE - test eax, eax ; end of list ? -ENDIF - jz __paramLoopDoneWBone3 ; yes, one DWORD in "write buffer" - -__paramLoop3a: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero3; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3a ; nope, copy next parameter - - jmp __paramLoopDoneWBone3 ; merge back into common stream - -ELSE ; ! GLIDE_PACK_RGB - - ;; here: "write buffer" empty - - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - -IF GLIDE_CULLING - test eax, eax ; at end of list ? -ELSE - cmp eax, 0 ; at end of list ? -ENDIF - jz __paramLoopDoneWBzero3; yes, "write buffer" empty - -IF GLIDE_CULLING -ELSE - mov esp, esp ; filler -ENDIF - -__paramLoop3a: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ -IF GLIDE_CULLING - cmp eax, 0 ; at end of offset list (offset == 0) ? -ELSE - test eax, eax ; at end of offset list (offset == 0) ? -ENDIF - - jz __paramLoopDoneWBone3 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3a ; nope, copy next parameter - - jmp __paramLoopDoneWBzero3; write buffer empty -ENDIF ; GLIDE_PACK_RGB - - -__paramLoopDoneWBone2: - - ;; here: "write buffer" has one DWORD left over from vertex B - - mov vertex, [esp + _vc$] ; Current vertex = C - mov dlp, dlpstrt ; reset the dataList - - movd mm2, [vertex+x] ; 0 | x if vertex C - punpckldq mm1, mm2 ; x | old param - - WRITE_MM1_FIFO_ALIGNED ; PCI write: x | old param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - movd mm1, [vertex+y] ; 0 | y of vertex C - -IF GLIDE_PACK_RGB -IF GLIDE_PACK_ALPHA - ;; assumes color and alpha values < 256.0 - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - movd mm3, [vertex+a] ; 0 | a - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - pf2id mm3, mm3 ; convert to integer: 00000000 | 000000aa - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 8 ; skip data list entry "a" - psllq mm3, 24 ; 00000000 | aa000000 - - por mm4, mm2 ; 00000000 | 00rrggbb - por mm4, mm3 ; 00000000 | aarrggbb -ELSE ; !GLIDE_PACK_ALPHA - ;; assumes color values < 256.0 - - movq mm4, [vertex+r] ; g | r - movd mm2, [vertex+b] ; 0 | b - - pf2id mm4, mm4 ; convert to integer: 000000gg | 000000rr - pf2id mm2, mm2 ; convert to integer: 00000000 | 000000bb - - punpcklwd mm2, mm4 ; 00000000 | 00rr00bb - psrlq mm4, 24 ; 00000000 | 0000gg00 - - add dlp, 4 ; next data list entry - por mm4, mm2 ; 00000000 | 00rrggbb -ENDIF ; !GLIDE_PACK_ALPHA - - punpckldq mm1, mm4 ; RGB(A) | y - mov eax, DWORD PTR [dlp] ; get first offset from the data list - - WRITE_MM1_FIFO_ALIGNED ; PCI write y | RGB(A) - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - add dlp, 4 ; dlp++ - test eax, eax ; end of list ? - - jz __paramLoopDoneWBzero3; yes, "write buffer" is empty - -__paramLoop3b: - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - test eax, eax ; at end of offset list (offset == 0) ? - - jz __paramLoopDoneWBone3 ; exit, write buffer contains one DWORD - movd mm2, [eax+vertex] ; get next parameter - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - punpckldq mm1, mm2 ; current param | previous param - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3b ; nope, copy next parameter - -IF GLIDE_PACK_ALPHA - nop ; filler - jmp __paramLoopDoneWBzero3; write buffer empty -ELSE - jmp __paramLoopDoneWBzero3; write buffer empty - nop ; filler -ENDIF -ELSE ; !GLIDE_PACK_RGB - mov eax, DWORD PTR [dlp] ; get first offset from the data list - add dlp, 4 ; dlp++ - - test eax, eax ; end of list ? - jz __paramLoopDoneWBone3 ; yes, "write buffer" has y data - -__paramLoop3b: - movd mm2, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - punpckldq mm1, mm2 ; current param | previous param - add dlp, 4 ; dlp++ - - WRITE_MM1_FIFO_ALIGNED ; PCI write current param | previous param - add fifo, 8 ; fifoPtr += 2*sizeof(FxU32) - - test eax, eax ; at end of offset list (offset == 0) ? - jz __paramLoopDoneWBzero3; exit, "write buffer" empty - - movd mm1, [eax+vertex] ; get next parameter - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - - add dlp, 4 ; dlp++ - - test eax, eax ; at end of offset list (offset == 0) ? - jnz __paramLoop3b ; nope, copy next parameter -ENDIF - -__paramLoopDoneWBone3: - -; "write buffer" contains one DWORD that needs to be flushed - - WRITE_MM1LOW_FIFO ; - add fifo, 4 ; - -__paramLoopDoneWBzero3: - - ;; Update gc->fifoPtr and gc->fifoRoom - - mov ecx, [__GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn - mov eax, fifo ; new fifo pointer - - mov ebx, [gc + fifoPtr] ; old fifo pointer - mov [gc + fifoPtr], fifo ; save new fifo pointer - - mov edx, [gc + fifoRoom] ; old fifo space available -IF GLIDE_PACK_RGB - add ecx, 1 ; _GlideRoot.stats.trisDrawn++ -ELSE - inc ecx ; _GlideRoot.stats.trisDrawn++ -ENDIF - - mov esi, [__GlideRoot + trisProcessed]; _GlideRoot.stats.trisProcessed - sub eax, ebx ; new fifo ptr - old fifo ptr = additional fifo space used - - mov [__GlideRoot + trisDrawn], ecx ; - sub edx, eax ; new fifo space available - - mov eax, 1h ; return value = triangle drawn - mov [gc + fifoRoom], edx ; new fifo space available - - ;; Restore trashed registers - - inc esi ; _GlideRoot.stats.trisProcessed++ - pop ebp ; restore frame pointer - -IF GLIDE_CULLING - pop ebx ; restore caller's register variable - mov [__GlideRoot + trisProcessed], esi ; -ELSE - mov [__GlideRoot + trisProcessed], esi ; - pop ebx ; restore caller's register variable -ENDIF - pop esi ; restore caller's register variable - pop edi ; restore caller's register variable - - femms ; no more AMD3D code, clear FPU/MMX regs - - ret 12 ; return to caller - - -IF GLIDE_CULLING -__cullFail: - mov esi, [__GlideRoot + trisProcessed]; triangles processed so far - xor eax, eax ; return value = triangle not drawn - - femms ; no more AMD3D code, clear FPU/MMX regs - - ;; Restore trashed registers - inc esi ; _GlideRoot.stats.trisProcessed++; - pop ebp ; restore frame pointer - - mov [__GlideRoot + trisProcessed], esi - pop ebx - - pop esi - pop edi - - ret 12 -ENDIF ; GLIDE_CULLING - -;--------------------------------------------------------------------------- -; -; end AMD3D section -; -;--------------------------------------------------------------------------- -endif ; GL_AMD3D - -;--------------------------------------------------------------------------- -; -; start original code -; -;--------------------------------------------------------------------------- - -ifndef GL_AMD3D - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -X = 0 -Y = 4 - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context - - ;; Prologue stuff - push esi - push edi - - push ebx - push ebp - - mov gc, [__GlideRoot + curGC] ;; GR_DCL_GC - - align 4 -IF GLIDE_CULLING -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - -cull TEXTEQU -intArea TEXTEQU ; temp Y storage - - ;; Pre-load the current culling mode before all of the - ;; floating point area stuff. - mov cull, [gc + cull_mode] - mov fa, [esp + _va$] - - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - - shl cull, 31 ; culltest << 31 - -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - fst zArea ; | | | | area - - ;; Pop temp things from the sw culling off the fp stack - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - - mov intArea, zArea ; j = *(long *)&area - xor eax, eax ; Clear the return value (0 == culled) - - ; Zero Area Triangle Check - and intArea, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz __triDone - - ;; Triangle area check vs culling mode - mov intArea, zArea ; reload area just in case we're culling - xor intArea, cull ; if (j ^ (culltest << 31)) - - jge __triDone -ENDIF ; GLIDE_CULLING - - align 4 - ;; Check to make sure that we have enough room for - ;; the complete triangle packet. - mov eax, [__GlideRoot + curTriSize] - mov ebx, [gc + fifoRoom] - - add eax, 4 - cmp ebx, eax - - jge __triBegin - - push @Line - push 0h - - push eax - call __FifoMakeRoom - - add esp, 12 - - ;; Send triangle parameters - -dlp TEXTEQU ; points to dataList structure -fifo TEXTEQU ; points to next entry in fifo -vertex TEXTEQU ; the current vertex -vOffset TEXTEQU ; Current vertex offset - -packCol TEXTEQU -tempVal TEXTEQU - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - - align 4 -__triBegin: - mov fifo, [gc + fifoPtr] ; Fetch Fifo Ptr - mov vOffset, 4 ; Starting vertex - - mov eax, [gc + triPacketHdr] ; Packet 3 header - nop - - GR_FIFO_WRITE fifo, 0, eax ; Write packet header to fifo - add fifo, 4 ; Advance fifo for hdr & x/y coordinate - - align 4 -__vertexStart: - mov vertex, [esp + STKOFF + vOffset] ; Current vertex - add fifo, 8 - - nop ; Avoid p5 agi w/ load of vertex ptr - nop - - mov eax, DWORD PTR [vertex + x] ; X - lea dlp, [gc + tsuDataList] ; Reset the dataList - - GR_FIFO_WRITE fifo, -8, eax ; PCI write X - mov eax, DWORD PTR [vertex + y] ; Y - - xor packCol, packCol ; Clear packed color - GR_FIFO_WRITE fifo, -4, eax ; PCI write Y - -IF GLIDE_PACK_RGB - fld DWORD PTR [vertex + b] ; B - fadd DWORD PTR __GlideRoot + fBiasLo ; BC GC - - fld DWORD PTR [vertex + g] ; G B - fadd DWORD PTR __GlideRoot + fBiasHi ; GC B - - fld DWORD PTR [vertex + r] ; R GC BC - fadd DWORD PTR __GlideRoot + fBiasHi ; RC GC BC - - fxch st(2) ; BC GC RC - fstp DWORD PTR bias0 ; GC RC - - fstp DWORD PTR bias1 ; RC - mov packCol, DWORD PTR bias0 ; B + bias - - fstp DWORD PTR bias0 - mov eax, DWORD PTR bias1 ; G + bias - -IF GLIDE_PACK_ALPHA - fld DWORD PTR [vertex + a] - fadd DWORD PTR __GlideRoot + fBiasHi - - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 8 ; Packed RGB + A dataList entry - nop - - or packCol, eax ; 0000GGBB - nop - - fstp DWORD PTR bias1 - mov eax, DWORD PTR bias0 ; R + bias - - mov esi, DWORD PTR bias1 ; A + bias - and eax, 0000FF00h ; R component << 8 - - and esi, 0FFFFFF00h ; A component << 8 - shl eax, 8 ; R << 16 - - or packCol, eax ; 00RRGGBB - shl esi, 16 ; A << 16 - - or packCol, esi ; AARRGGBB - nop -ELSE ; !GLIDE_PACK_ALPHA - and packCol, 00FFh ; B color component - and eax, 0000FF00h ; G component << 8 - - add dlp, 4 ; Next dataList item - or packCol, eax - - mov eax, DWORD PTR bias0 ; R + bias - and eax, 0000FF00h ; R component << 8 - - shl eax, 8 ; R << 16 - or packCol, eax ; 00RRGGBB -ENDIF ; !GLIDE_PACK_ALPHA - - GR_FIFO_WRITE fifo, 0, packCol ; PCI write packed color value - add fifo, 4 -ENDIF ; GLIDE_PACK_RGB - -__doParams: - mov eax, DWORD PTR [dlp] ; Get first offset from the data list - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - je __nextVertex - - ;; Not using align directive here because it sometimes - ;; introduces an agi for the eax use below. - nop - nop - -__paramLoop: - mov tempVal, DWORD PTR [eax + vertex] ; Get the parameter from teh vertex - add fifo, 4 ; fifoPtr += sizeof(FxU32) - - mov eax, DWORD PTR [dlp] ; offset = *(dlp + 1) - add dlp, 4 ; dlp++ - - cmp eax, 0 ; Are we done? - GR_FIFO_WRITE fifo, -4, tempVal ; *fifoPtr = data - - jne SHORT __paramLoop - - align 4 -__nextVertex: - ;; On to the next vertex - add vOffset, 4 - mov gc, [__GlideRoot + curGC] ; Reload gc incase we trashed it as a temp - - cmp vOffset, 16 ; Offset of one past last vertex? - jne __vertexStart - - ;; Update gc->fifoPtr and gc->fifoRoom - mov eax, fifo - mov ebx, [gc + fifoPtr] - - mov [gc + fifoPtr], fifo - sub eax, ebx - - mov ebx, [__GlideRoot + trisDrawn] ; _GlideRoot.stats.trisDrawn++; - sub [gc + fifoRoom], eax - - add ebx, 1 - mov [__GlideRoot + trisDrawn], ebx - - ;; return 1 (triangle drawn) - mov eax, 1h - -__triDone: - ;; Restore trashed registers - mov esi, [__GlideRoot + trisProcessed] - pop ebp - - add esi, 1 ; _GlideRoot.stats.trisProcessed++; - pop ebx - - pop edi - mov [__GlideRoot + trisProcessed], esi - - pop esi - ret 12 - -endif ; !GL_AMD3D - diff --git a/glide2x/h3/glide/src/xdraw2.inc.S b/glide2x/h3/glide/src/xdraw2.inc.S deleted file mode 100644 index 4dede20..0000000 --- a/glide2x/h3/glide/src/xdraw2.inc.S +++ /dev/null @@ -1,1268 +0,0 @@ -/* -*-asm-*- */ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -/* $Header$ */ -/* $Revision$ */ -/* $Log$ */ -/* */ -/* 2 10/30/97 6:53p Peter */ -/* first real cut at tri asm */ -/* */ -/* 1 10/30/97 4:29p Peter */ -/* asm tri code */ -/* */ -/* 2 7/07/97 2:14p Jdt */ -/* assembly now on par with C code. */ -/* */ -/* 1 7/07/97 8:37a Jdt */ -/* B4 Chip field fix. */ - - -.file "xdraw2.inc" - -#ifdef GL_AMD3D - -.MACRO GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.ENDM /* GR_FIFO_WRITE */ - - -.MACRO WRITE_MM1_FIFO_ALIGNED - movq %mm1 , (%ebp) /* store current param | previous param */ -.ENDM /* WRITE_MM1_FIFO_ALIGNED */ - -.MACRO WRITE_MM1LOW_FIFO - movd %mm1 , (%ebp) /* store current param | previous param */ -.ENDM /* WRITE_MM1LOW_FIFO */ - -#define gc %edi /* points to graphics context */ -#define fifo %ebp /* points to fifo entries */ -#define tempVal %esi - -#if GLIDE_CULLING -#define fa %eax /* vtx a from caller */ -#define fb %ebx /* vtx b from caller */ -#define fc %ecx /* vtx c from caller */ -#define cull %edx /* cull mode */ -#define intArea %ecx /* area temp storage */ - -/* Prologue stuff */ - -/* This code is only executed when culling is enabled, so we */ -/* don't need to check for GR_CULL_DISABLE */ - - push %edi /* save caller's register variable */ - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - - push %esi /* save caller's register variable */ - mov _vc-8(%esp) , fc /* get base address of vertex C */ - - push %ebx /* save caller's register variable */ - mov _vb-4(%esp) , fb /* get base address of vertex B */ - - push %ebp /* save frame pointer */ - mov cull_mode(gc) , cull /* get cull mode */ - - mov _va(%esp) , fa /* get base address of vertex A */ - mov (_GlideRoot+curTriSize) , tempVal - - femms /* will use AMD3D, clear FPU/MMX registers */ - -/* Cullcheck */ - - movq x(fc) , %mm2 /* yc | xc */ - shl $31 , cull /* culltest << 31 */ - - movq x(fb) , %mm1 /* yb | xb */ - add $4 , tempVal /* space required in fifo */ - - movq x(fa) , %mm0 /* ya | xa */ - mov fifoRoom(gc) , %ebx /* space available in fifo */ - -/* Area_Computation */ - - pfsubr %mm1 , %mm2 /* dyBC | dxBC */ - pfsub %mm1 , %mm0 /* dyAB | dxAB */ - - movq %mm2 , %mm5 /* dyBC | dxBC */ - punpckhdq %mm2 , %mm2 /* dyBC | dyBC */ - - movq %mm0 , %mm4 /* dyAB | dxAB */ - punpckhdq %mm0 , %mm0 /* dyAB | dyAB */ - - pfmul %mm0 , %mm5 /* dyAB*dxBC */ - pfmul %mm2 , %mm4 /* dxAB*dyBC */ - - pfsub %mm5 , %mm4 /* dxAB*dyBC - dxBC*dyAB */ - - movd %mm4 , intArea /* vectored ! */ - -/* Zero Area Triangle Check */ - - test $0x7fffffff , intArea /* if ((j & 0x7FFFFFFF) == 0) */ - jz LOCAL(__cullFail) /* area zero, triangle culled */ - - xor cull , intArea /* if (j ^ (culltest << 31)) */ - jge LOCAL(__cullFail) /* triangle facing away from viewer, culled */ - - cmp tempVal , %ebx /* fifo space required >= space available ? */ - jge LOCAL(__triBegin) /* yup, push out triangle data to Voodoo */ - - push $__LINE__ /* line number inside this function */ - push $0x0 /* pointer to function name = NULL */ - - push tempVal /* fifo space required */ - call _FifoMakeRoom /* note: updates fifoPtr */ - - add $12 , %esp /* remove 3 DWORD arguments from stack */ - -#else /* !GLIDE_CULLING */ - -/* Prologue stuff */ - push %edi /* save caller's register variable */ - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - - push %esi /* save caller's register variable */ - mov (_GlideRoot+curTriSize) , %eax - - push %ebx /* save caller's register variable */ - mov fifoRoom(gc) , %ebx /* fifo space available */ - - push %ebp /* save frame pointer */ - add $4 , %eax /* fifo space required */ - -/* Check to make sure that we have enough room for */ -/* the complete triangle packet. */ - - cmp %eax , %ebx /* space available >= space required ? */ - jge LOCAL(__triBegin) /* yup, start drawing triangle */ - - push $__LINE__ /* line number inside this function */ - push $0x0 /* pointer to function name = NULL */ - - push %eax /* space required in fifo */ - call _FifoMakeRoom /* note: updates fifoPtr */ - - add $12 , %esp /* remove 3 DWORD arguments from stack */ - mov %eax , %eax /* filler */ -#endif - - -#define dlp %ebx /* points to dataList structure */ -#define dlpstrt %ecx /* points to begin of dataList structure */ -#define vertex %edx /* the current vertex */ -#define packCol %esi - -LOCAL(__triBegin): - mov triPacketHdr(gc) , %eax /* Packet 3 header */ - lea tsuDataList(gc) , dlp /* Reset the dataList */ - - mov fifoPtr(gc) , fifo /* Fetch Fifo Ptr */ - mov _va(%esp) , vertex /* Current vertex = A */ - - mov dlp , dlpstrt /* save pointer to start of dataList */ - test $4 , fifo /* is fifo pointer qword aligned ? */ - - jz LOCAL(__fifo_aligned) /* yes, it is qword aligned */ - movq x(vertex) , %mm1 /* y | x */ - - GR_FIFO_WRITE fifo , 0 , %eax /* write header to fifo now qword aligned */ - add $4 , fifo /* advance fifo for hdr now qword aligned */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry for "a" */ - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - por %mm3 , %mm1 /* 00000000 | aarrggbb */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - add $4 , dlp /* next data list entry */ - - movd b(vertex) , %mm2 /* 0 | b */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_PACK_ALPHA - cmp $0 , %eax /* end of list ? */ -#else - test %eax , %eax /* end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBone1) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop1a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero1) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone1) /* merge back into common stream */ - lea (%esp) , %esp /* filler */ -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - test %eax , %eax /* at end of list ? */ - - lea 4(dlp) , dlp /* dlp++ */ - jz LOCAL(__paramLoopDoneWBzero1) /* yes, "write buffer" empty */ - -LOCAL(__paramLoop1a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone1) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1a) /* nope, copy next parameter */ - - mov %esp , %esp /* filler */ - jmp LOCAL(__paramLoopDoneWBzero1) /* write buffer empty */ - -#endif /* GLIDE_PACK_RGB */ - -LOCAL(__fifo_aligned): - movd x(vertex) , %mm2 /* y | x of vertex A */ - movd triPacketHdr(gc) , %mm1 /* Packet 3 header */ - - punpckldq %mm2 , %mm1 /* x | header */ - WRITE_MM1_FIFO_ALIGNED /* PCI write x | header */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - movd y(vertex) , %mm1 /* 0 | y of vertex A */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - - add $8 , dlp /* skip data list entry "a" */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ - -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - add $4 , dlp /* next data list entry */ - - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero1) /* yes, "write buffer" is empty */ - nop /* filler */ - -LOCAL(__paramLoop1b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone1) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - -#if GLIDE_PACK_ALPHA - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ -#else - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - nop -#endif - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero1) /* write buffer empty */ - -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone1) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop1b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBzero1) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop1b) /* nope, copy next parameter */ -#endif - -LOCAL(__paramLoopDoneWBone1): - -/* here: "write buffer" has one DWORD left over from vertex A */ - - mov _vb(%esp) , vertex /* Current vertex = B */ - mov dlpstrt , dlp /* reset the dataList */ - - movd x(vertex) , %mm2 /* 0 | x if vertex B */ - punpckldq %mm2 , %mm1 /* x | old param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write: x | old param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - movd y(vertex) , %mm1 /* 0 | y of vertex B */ -#if GLIDE_PACK_RGB -#else - mov %esp , %esp /* filler */ -#endif - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry "a" */ - mov %eax , %eax /* filler */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ - -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $4 , dlp /* next data list entry */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero2) /* yes, "write buffer" is empty */ - mov %esp , %esp /* filler */ - -LOCAL(__paramLoop2b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - lea 4(dlp) , dlp /* dlp++ */ - - jz LOCAL(__paramLoopDoneWBone2) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero2) /* write buffer empty */ -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone2) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop2b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - jz LOCAL(__paramLoopDoneWBzero2) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2b) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone2) /* write buffer contains one DWORD */ -#endif - - -LOCAL(__paramLoopDoneWBzero1): - - mov _vb(%esp) , vertex /* Current vertex = B */ - mov dlpstrt , dlp /* Reset the dataList */ - - movq x(vertex) , %mm1 /* y | x of vertex B */ - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x of vertex B */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - - por %mm3 , %mm1 /* 00000000 | aarrggbb */ - add $8 , dlp /* skip data list entry "a" */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - add $4 , dlp /* next data list entry */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone2) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop2a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - punpckldq %mm2 , %mm1 /* current param | previous param */ - - add $4 , dlp /* dlp++ */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBzero2) /* exit, "write buffer" empty */ - movd (%eax,vertex) , %mm1 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop2a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone2) /* merge back into common stream */ -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* at end of list ? */ - jz LOCAL(__paramLoopDoneWBzero2) /* yes, "write buffer" empty */ - -LOCAL(__paramLoop2a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ -#if GLIDE_CULLING - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#else - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBone2) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_CULLING - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#else - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#endif - jnz LOCAL(__paramLoop2a) /* nope, copy next parameter */ -#endif /* GLIDE_PACK_RGB */ - - -LOCAL(__paramLoopDoneWBzero2): - - mov _vc(%esp) , vertex /* Current vertex = C */ - mov dlpstrt , dlp /* Reset the dataList */ - - movq x(vertex) , %mm1 /* y | x of vertex C */ - WRITE_MM1_FIFO_ALIGNED /* PCI write y | x of vertex C */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - psllq $24 , %mm3 /* 00000000 | aa000000 */ - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - - por %mm3 , %mm1 /* 00000000 | aarrggbb */ - add $8 , dlp /* skip data list entry "a" */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm1 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm1 , %mm1 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm1 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm1 /* 00000000 | 0000gg00 */ - - por %mm2 , %mm1 /* 00000000 | 00rrggbb */ - add $4 , dlp /* next data list entry */ -#endif /* !GLIDE_PACK_ALPHA */ - -/* here: one DWORD in "write buffer", RGB(A) */ - - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_PACK_ALPHA - cmp $0 , %eax /* end of list ? */ -#else - test %eax , %eax /* end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBone3) /* yes, one DWORD in "write buffer" */ - -LOCAL(__paramLoop3a): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero3) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBone3) /* merge back into common stream */ - -#else /* ! GLIDE_PACK_RGB */ - -/* here: "write buffer" empty */ - - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - -#if GLIDE_CULLING - test %eax , %eax /* at end of list ? */ -#else - cmp $0 , %eax /* at end of list ? */ -#endif - jz LOCAL(__paramLoopDoneWBzero3) /* yes, "write buffer" empty */ - -#if GLIDE_CULLING -#else - mov %esp , %esp /* filler */ -#endif - -LOCAL(__paramLoop3a): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ -#if GLIDE_CULLING - cmp $0 , %eax /* at end of offset list (offset == 0) ? */ -#else - test %eax , %eax /* at end of offset list (offset == 0) ? */ -#endif - - jz LOCAL(__paramLoopDoneWBone3) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3a) /* nope, copy next parameter */ - - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ -#endif /* GLIDE_PACK_RGB */ - - -LOCAL(__paramLoopDoneWBone2): - -/* here: "write buffer" has one DWORD left over from vertex B */ - - mov _vc(%esp) , vertex /* Current vertex = C */ - mov dlpstrt , dlp /* reset the dataList */ - - movd x(vertex) , %mm2 /* 0 | x if vertex C */ - punpckldq %mm2 , %mm1 /* x | old param */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write: x | old param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - movd y(vertex) , %mm1 /* 0 | y of vertex C */ - -#if GLIDE_PACK_RGB -#if GLIDE_PACK_ALPHA -/* assumes color and alpha values < 256.0 */ - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - movd a(vertex) , %mm3 /* 0 | a */ - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - pf2id %mm3 , %mm3 /* convert to integer: 00000000 | 000000aa */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $8 , dlp /* skip data list entry "a" */ - psllq $24 , %mm3 /* 00000000 | aa000000 */ - - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ - por %mm3 , %mm4 /* 00000000 | aarrggbb */ -#else /* !GLIDE_PACK_ALPHA */ -/* assumes color values < 256.0 */ - - movq r(vertex) , %mm4 /* g | r */ - movd b(vertex) , %mm2 /* 0 | b */ - - pf2id %mm4 , %mm4 /* convert to integer: 000000gg | 000000rr */ - pf2id %mm2 , %mm2 /* convert to integer: 00000000 | 000000bb */ - - punpcklwd %mm4 , %mm2 /* 00000000 | 00rr00bb */ - psrlq $24 , %mm4 /* 00000000 | 0000gg00 */ - - add $4 , dlp /* next data list entry */ - por %mm2 , %mm4 /* 00000000 | 00rrggbb */ -#endif /* !GLIDE_PACK_ALPHA */ - - punpckldq %mm4 , %mm1 /* RGB(A) | y */ - movl (dlp) , %eax /* get first offset from the data list */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write y | RGB(A) */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* end of list ? */ - - jz LOCAL(__paramLoopDoneWBzero3) /* yes, "write buffer" is empty */ - -LOCAL(__paramLoop3b): - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - test %eax , %eax /* at end of offset list (offset == 0) ? */ - - jz LOCAL(__paramLoopDoneWBone3) /* exit, write buffer contains one DWORD */ - movd (%eax,vertex) , %mm2 /* get next parameter */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3b) /* nope, copy next parameter */ - -#if GLIDE_PACK_ALPHA - nop /* filler */ - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ -#else - jmp LOCAL(__paramLoopDoneWBzero3) /* write buffer empty */ - nop /* filler */ -#endif -#else /* !GLIDE_PACK_RGB */ - movl (dlp) , %eax /* get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* end of list ? */ - jz LOCAL(__paramLoopDoneWBone3) /* yes, "write buffer" has y data */ - -LOCAL(__paramLoop3b): - movd (%eax,vertex) , %mm2 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - punpckldq %mm2 , %mm1 /* current param | previous param */ - add $4 , dlp /* dlp++ */ - - WRITE_MM1_FIFO_ALIGNED /* PCI write current param | previous param */ - add $8 , fifo /* fifoPtr += 2*sizeof(FxU32) */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jz LOCAL(__paramLoopDoneWBzero3) /* exit, "write buffer" empty */ - - movd (%eax,vertex) , %mm1 /* get next parameter */ - movl (dlp) , %eax /* offset = *(dlp + 1) */ - - add $4 , dlp /* dlp++ */ - - test %eax , %eax /* at end of offset list (offset == 0) ? */ - jnz LOCAL(__paramLoop3b) /* nope, copy next parameter */ -#endif - -LOCAL(__paramLoopDoneWBone3): - -/* "write buffer" contains one DWORD that needs to be flushed */ - - WRITE_MM1LOW_FIFO /* */ - add $4 , fifo - -LOCAL(__paramLoopDoneWBzero3): - -/* Update gc->fifoPtr and gc->fifoRoom */ - - mov (_GlideRoot+trisDrawn) , %ecx /* _GlideRoot.stats.trisDrawn */ - mov fifo , %eax /* new fifo pointer */ - - mov fifoPtr(gc) , %ebx /* old fifo pointer */ - mov fifo , fifoPtr(gc) /* save new fifo pointer */ - - mov fifoRoom(gc) , %edx /* old fifo space available */ -#if GLIDE_PACK_RGB - add $1 , %ecx /* _GlideRoot.stats.trisDrawn++ */ -#else - inc %ecx /* _GlideRoot.stats.trisDrawn++ */ -#endif - - mov (_GlideRoot+trisProcessed) , %esi /* _GlideRoot.stats.trisProcessed */ - sub %ebx , %eax /* new fifo ptr - old fifo ptr = additional fifo space used */ - - mov %ecx , (_GlideRoot+trisDrawn) - sub %eax , %edx /* new fifo space available */ - - mov $0x1 , %eax /* return value = triangle drawn */ - mov %edx , fifoRoom(gc) /* new fifo space available */ - -/* Restore trashed registers */ - - inc %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebp /* restore frame pointer */ - -#if GLIDE_CULLING - pop %ebx /* restore caller's register variable */ - mov %esi , (_GlideRoot+trisProcessed) -#else - mov %esi , (_GlideRoot+trisProcessed) - pop %ebx /* restore caller's register variable */ -#endif - pop %esi /* restore caller's register variable */ - pop %edi /* restore caller's register variable */ - - femms /* no more AMD3D code, clear FPU/MMX regs */ - - ret /* return to caller */ - - -#if GLIDE_CULLING -LOCAL(__cullFail): - mov (_GlideRoot+trisProcessed) , %esi /* triangles processed so far */ - xor %eax , %eax /* return value = triangle not drawn */ - - femms /* no more AMD3D code, clear FPU/MMX regs */ - -/* Restore trashed registers */ - inc %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebp /* restore frame pointer */ - - mov %esi , (_GlideRoot+trisProcessed) - pop %ebx - - pop %esi - pop %edi - - ret -#endif /* GLIDE_CULLING */ - -/* --------------------------------------------------------------------------- */ - -/* end AMD3D section */ - -/* --------------------------------------------------------------------------- */ -#endif /* GL_AMD3D */ - -/* --------------------------------------------------------------------------- */ - -/* start original code */ - -/* --------------------------------------------------------------------------- */ - -#ifndef GL_AMD3D - -#define X 0 -#define Y 4 -/* edx is used as index, loading from *src */ -#define gc %esi /* points to graphics context */ - -/* Prologue stuff */ - push %esi - push %edi - - push %ebx - push %ebp - - mov (_GlideRoot+curGC) , gc /* GR_DCL_GC */ - -.align 4 -#if GLIDE_CULLING -#define fa %eax /* vtx a from caller */ -#define fb %ebx /* vtx b from caller */ -#define fc %ecx /* vtx c from caller */ - -#define cull %edx -#define intArea %ebp /* temp Y storage */ - -/* Pre-load the current culling mode before all of the */ -/* floating point area stuff. */ - mov cull_mode(gc) , cull - mov _va(%esp) , fa - - mov _vb(%esp) , fb - mov _vc(%esp) , fc - - shl $31 , cull /* culltest << 31 */ - -LOCAL(Area_Computation): -/* 47-3 */ -/* jmp ret_pop0f */ - flds X(fa) /* xa */ - fsubs X(fb) /* dxAB */ - flds X(fb) /* | xb */ - fsubs X(fc) /* | dxBC */ - flds Y(fb) /* | | yb */ - fsubs Y(fc) /* | | dyBC */ - flds Y(fa) /* | | | ya */ - fsubs Y(fb) /* | | | dyAB */ - fld %st(3) /* | | | | dxAB */ - fmul %st(2) , %st /* | | | | t0 t0=dxAB*dyBC */ - fld %st(3) /* | | | | | dxBC */ - fmul %st(2) , %st /* | | | | | t1 t1=dxBC*dyAB */ - fsubrp %st , %st(1) /* | | | | area */ - fsts zArea /* | | | | area */ - -/* Pop temp things from the sw culling off the fp stack */ - fstp %st(0) /* 4 */ - fstp %st(0) /* 3 */ - fstp %st(0) /* 2 */ - fstp %st(0) /* 1 */ - fstp %st(0) /* 0 */ - - mov zArea , intArea /* j = *(long *)&area */ - xor %eax , %eax /* Clear the return value (0 == culled) */ - -/* Zero Area Triangle Check */ - and $0x7fffffff , intArea /* if ((j & 0x7FFFFFFF) == 0) */ - jz LOCAL(__triDone) - -/* Triangle area check vs culling mode */ - mov zArea , intArea /* reload area just in case we're culling */ - xor cull , intArea /* if (j ^ (culltest << 31)) */ - - jge LOCAL(__triDone) -#endif /* GLIDE_CULLING */ - -.align 4 -/* Check to make sure that we have enough room for */ -/* the complete triangle packet. */ - mov (_GlideRoot+curTriSize) , %eax - mov fifoRoom(gc) , %ebx - - add $4 , %eax - cmp %eax , %ebx - - jge LOCAL(__triBegin) - - push $__LINE__ - push $0x0 - - push %eax - call _FifoMakeRoom - - add $12 , %esp - -/* Send triangle parameters */ - -#define dlp %ebx /* points to dataList structure */ -#define fifo %ebp /* points to next entry in fifo */ -#define vertex %edx /* the current vertex */ -#define vOffset %ecx /* Current vertex offset */ - -#define packCol %edi -#define tempVal %edi - -.MACRO GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.ENDM /* GR_FIFO_WRITE */ - -.align 4 -LOCAL(__triBegin): - mov fifoPtr(gc) , fifo /* Fetch Fifo Ptr */ - mov $4 , vOffset /* Starting vertex */ - - mov triPacketHdr(gc) , %eax /* Packet 3 header */ - nop - - GR_FIFO_WRITE fifo , 0 , %eax - /* Write packet header to fifo */ - add $4 , fifo /* Advance fifo for hdr & x/y coordinate */ - -.align 4 -LOCAL(__vertexStart): - mov STKOFF(%esp,vOffset) , vertex /* Current vertex */ - add $8 , fifo - - nop /* Avoid p5 agi w/ load of vertex ptr */ - nop - - movl x(vertex) , %eax /* X */ - lea tsuDataList(gc) , dlp /* Reset the dataList */ - - GR_FIFO_WRITE fifo , -8 , %eax - /* PCI write X */ - movl y(vertex) , %eax /* Y */ - - xor packCol , packCol /* Clear packed color */ - GR_FIFO_WRITE fifo , -4 , %eax - /* PCI write Y */ - -#if GLIDE_PACK_RGB - flds b(vertex) /* B */ - fadds _GlideRoot+fBiasLo /* BC GC */ - - flds g(vertex) /* G B */ - fadds _GlideRoot+fBiasHi /* GC B */ - - flds r(vertex) /* R GC BC */ - fadds _GlideRoot+fBiasHi /* RC GC BC */ - - fxch %st(2) /* BC GC RC */ - fstps bias0 /* GC RC */ - - fstps bias1 /* RC */ - movl bias0 , packCol /* B + bias */ - - fstps bias0 - movl bias1 , %eax /* G + bias */ - -#if GLIDE_PACK_ALPHA - flds a(vertex) - fadds _GlideRoot+fBiasHi - - and $0x00FF , packCol /* B color component */ - and $0x0000FF00 , %eax /* G component << 8 */ - - add $8 , dlp /* Packed RGB + A dataList entry */ - nop - - or %eax , packCol /* 0000GGBB */ - nop - - fstps bias1 - movl bias0 , %eax /* R + bias */ - - movl bias1 , %esi /* A + bias */ - and $0x0000FF00 , %eax /* R component << 8 */ - - and $0x0FFFFFF00 , %esi /* A component << 8 */ - shl $8 , %eax /* R << 16 */ - - or %eax , packCol /* 00RRGGBB */ - shl $16 , %esi /* A << 16 */ - - or %esi , packCol /* AARRGGBB */ - nop -#else /* !GLIDE_PACK_ALPHA */ - and $0x00FF , packCol /* B color component */ - and $0x0000FF00 , %eax /* G component << 8 */ - - add $4 , dlp /* Next dataList item */ - or %eax , packCol - - movl bias0 , %eax /* R + bias */ - and $0x0000FF00 , %eax /* R component << 8 */ - - shl $8 , %eax /* R << 16 */ - or %eax , packCol /* 00RRGGBB */ -#endif /* !GLIDE_PACK_ALPHA */ - - GR_FIFO_WRITE fifo , 0 , packCol - /* PCI write packed color value */ - add $4 , fifo -#endif /* GLIDE_PACK_RGB */ - -LOCAL(__doParams): - movl (dlp) , %eax /* Get first offset from the data list */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* Are we done? */ - je LOCAL(__nextVertex) - -/* Not using align directive here because it sometimes */ -/* introduces an agi for the eax use below. */ - nop - nop - -LOCAL(__paramLoop): - movl (%eax,vertex) , tempVal /* Get the parameter from teh vertex */ - add $4 , fifo /* fifoPtr += sizeof(FxU32) */ - - movl (dlp) , %eax /* offset = *(dlp + 1) */ - add $4 , dlp /* dlp++ */ - - cmp $0 , %eax /* Are we done? */ - GR_FIFO_WRITE fifo , -4 , tempVal - /* *fifoPtr = data */ - - jne LOCAL(__paramLoop) - -.align 4 -LOCAL(__nextVertex): -/* On to the next vertex */ - add $4 , vOffset - mov (_GlideRoot+curGC) , gc /* Reload gc incase we trashed it as a temp */ - - cmp $16 , vOffset /* Offset of one past last vertex? */ - jne LOCAL(__vertexStart) - -/* Update gc->fifoPtr and gc->fifoRoom */ - mov fifo , %eax - mov fifoPtr(gc) , %ebx - - mov fifo , fifoPtr(gc) - sub %ebx , %eax - - mov (_GlideRoot+trisDrawn) , %ebx /* _GlideRoot.stats.trisDrawn++ */ - sub %eax , fifoRoom(gc) - - add $1 , %ebx - mov %ebx , (_GlideRoot+trisDrawn) - -/* return 1 (triangle drawn) */ - mov $0x1 , %eax - -LOCAL(__triDone): -/* Restore trashed registers */ - mov (_GlideRoot+trisProcessed) , %esi - pop %ebp - - add $1 , %esi /* _GlideRoot.stats.trisProcessed++ */ - pop %ebx - - pop %edi - mov %esi , (_GlideRoot+trisProcessed) - - pop %esi - ret - -#endif /* !GL_AMD3D */ - diff --git a/glide2x/h3/glide/src/xtexdl.S b/glide2x/h3/glide/src/xtexdl.S deleted file mode 100644 index ead5207..0000000 --- a/glide2x/h3/glide/src/xtexdl.S +++ /dev/null @@ -1,284 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -/* $Header$ */ -/* $Revision$ */ -/* $Log$ */ -/* */ -/* 3 3/17/99 6:17p Dow */ -/* Phantom Menace and other fixes. */ -/* */ -/* 7 2/02/99 4:36p Peter */ -/* download through lfb rather than texture port */ -/* */ -/* 6 12/17/98 2:36p Atai */ -/* check in Norbert's fix for texture download width correction */ -/* */ -/* 5 12/07/98 11:33a Peter */ -/* norbert's re-fixes of my merge */ -/* */ -/* 4 11/02/98 5:34p Atai */ -/* merge direct i/o code */ -/* */ -/* 3 10/20/98 5:34p Atai */ -/* added #ifdefs for hwc */ -/* */ -/* 2 10/14/98 12:05p Peter */ -/* fixed my f*cked up assumption about non-volatile regs */ -/* */ -/* 1 10/09/98 6:48p Peter */ -/* 3DNow!(tm) version of wide texture downloads */ -/* */ -/* 3 10/07/98 9:43p Peter */ -/* triangle procs for 3DNow!(tm) */ -/* */ -/* 2 10/05/98 7:43p Peter */ -/* 3DNow!(tm) happiness everywhere */ -/* */ -/* 1 10/05/98 6:01p Peter */ -/* mmx stuff for 3DNow!(tm) capable processors */ -/* */ - -.file "xtexdl.asm" - - -#ifdef USE_PACKET_FIFO -#endif - -/* Definitions of cvg regs and glide root structures. */ -#include "fxgasm.h" - -/* Arguments (STKOFF = 16 from 4 dword pushes) */ -#define STACKOFFSET 16 -#define _gc 4+STACKOFFSET -#define _baseAddr 8+STACKOFFSET -#define _maxS 12+STACKOFFSET -#define _minT 16+STACKOFFSET -#define _maxT 20+STACKOFFSET -#define _texData 24+STACKOFFSET - -/* NB: The first set of registers (eax, ecx, and edx) are volatile across */ -/* function calls. The remaining registers are supposedly non-volatile */ -/* so they only store things that are non-volatile across the call. */ - -#define fifo %ebp /* fifo ptr in inner loop */ -#define gc %esi /* graphics context */ -#define dataPtr %edi /* pointer to exture data to be downloaded */ -#define curT %ebx /* counter for texture scan lines (t-coordinate) */ -#define curS %ecx /* texture s-coordinate */ -#define fRoom %edx /* room available in fifo (in bytes) */ - -.macro GR_FIFO_WRITE __addr __offset __data - mov \__data , \__offset(\__addr) -.endm /* GR_FIFO_WRITE */ - -/* -------------------------------------------------------------------------- */ - -.text - - -.align 32 - -.globl _grTexDownload_3DNow_MMX - -.type _grTexDownload_3DNow_MMX,@function -_grTexDownload_3DNow_MMX: - - push %ebx /* save caller's register variable */ - mov _maxT-12(%esp) , curT /* curT = maxT */ - - push %esi /* save caller's register variable */ - mov _minT-8(%esp) , %eax /* minT */ - - push %edi /* save caller's register variable */ - mov _gc-4(%esp) , gc /* gc */ - - push %ebp /* save caller's register variable */ - mov _texData(%esp) , dataPtr /* dataPtr */ - - sub %eax , curT /* curT = maxT - minT */ - mov fifoPtr(gc) , fifo /* fifoPtr */ - - mov _maxS(%esp) , curS /* curS = maxS */ - add $1 , curT /* curT = maxT - minT + 1 */ - - femms /* we'll use MMX/3DNow!, make sure FPU register cleared */ - - mov curS , %edx /* curS = maxS = scanline width in DWORDs */ - movd _baseAddr(%esp) , %mm3 /* 0 | address of texture to download */ - - shl $2 , curS /* scan line width (in bytes) */ - mov _minT(%esp) , %eax /* 0 | minT */ - - mov curS , _maxS(%esp) /* save scan line width (in bytes) */ - shl $3 , %edx /* packetHdr<21:3> = maxS = scanline width in DWORDs */ - - imul curS , %eax /* TEX_ROW_ADDR_INCR(minT) = minT * TEX_ROW_ADDR_INCR(1) */ - - movd curS , %mm2 /* 0 | TEX_ROW_ADDR_INCR(1) */ - or $0x00000005 , %edx /* packetHdr<31:30> = lfb port */ -/* packetHdr<21:3> = maxS */ -/* packetHdr<2:0> = packetType 5 */ - - movd %edx , %mm1 /* 0 | packetHdr */ - movd %eax , %mm4 /* 0 | TEX_ROW_ADDR_INCR(minT) */ - - psllq $32 , %mm2 /* TEX_ROW_ADDR_INCR(1) | 0 */ - paddd %mm4 , %mm3 /* 0 | texAddr = texBaseAddr + TEX_ROW_ADDR_INCR(minT) */ - - mov fifoRoom(gc) , fRoom /* get available fifoRoom (in bytes) */ - punpckldq %mm3 , %mm1 /* hdr2 = texAddr | hdr1 = packetHdr */ - -/* ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = curS = maxS */ -/* edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 */ - - test $4 , fifo /* is fifo QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__startDownload /* yup, start texture download */ - - cmp $4 , fRoom /* enough room for NULL packet in fifo? */ - jge .L_grTexDownload_3DNow_MMX__mmxAlignFifo /* yes, write NULL packet to align fifo */ - -#ifdef USE_PACKET_FIFO - push $ __LINE__ /* Line # inside this function */ - push $0 /* NULL file name */ - - push $4 /* fifo space required (bytes) */ - call _FifoMakeRoom /* make fifo room */ - - add $12 , %esp /* pop 3 DWORD parameters to FifoMakeRoom */ -#endif - mov fifoPtr(gc) , fifo /* fifoPtr modified by FifoMakeRoom, reload */ - - mov fifoRoom(gc) , fRoom /* fifoRoom modified by FifoMakeRoom, reload */ - mov _maxS(%esp) , curS /* reload maxS (destroyed by call to FifoMakeRoom) */ - - test $4 , fifo /* new fifoPtr QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__startDownload /* yup, start texture download */ - -.L_grTexDownload_3DNow_MMX__mmxAlignFifo: - - movl $0 , (fifo) /* write NULL packet */ - sub $4 , fRoom /* fifoRoom -= 4 */ - - mov fRoom , fifoRoom(gc) /* store new fifoRoom */ - add $4 , fifo /* fifoPtr += 4 */ - - mov fifo , fifoPtr(gc) /* store new fifoPtr */ - jmp .L_grTexDownload_3DNow_MMX__startDownload /* fifo aligned, download texture now */ - -.align 32 - -/* ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = maxS = curS */ -/* edx=fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 */ - -.L_grTexDownload_3DNow_MMX__loopT: - -#ifdef GLIDE_DEBUG - -/* Make sure that we have a QWORD aligned fifoPtr force GP if not aligned */ - - test $4 , fifo /* is fifoPtr QWORD aligned ? */ - jz .L_grTexDownload_3DNow_MMX__alignmentOK /* yup, continue */ - - xor %eax , %eax /* create 0 */ - mov %eax , (%eax) /* move to DS:[0] forces GP */ -.L_grTexDownload_3DNow_MMX__alignmentOK: -#endif /* GLIDE_DEBUG */ - -/* Compute packet header words */ -/* hdr1: downloadSpace[31:30] numWords[21:3] packetType[2:0] */ -/* hdr2: download address[29:0] */ - - movq %mm1 , (fifo) /* store hdr2 | hdr1 */ - add $8 , fifo /* increment fifo ptr (hdr1 + hdr2) */ - -/* S coordinate inner loop unrolled for 8 texels a write */ - -.L_grTexDownload_3DNow_MMX__loopS: - - movq (dataPtr) , %mm0 /* load 64 bit data (8 texels) */ - add $8 , fifo /* pre-increment fifoPtr += 2 * sizeof(FxU32) */ - - add $8 , dataPtr /* dataPtr += 2 * sizeof(FxU32) */ - sub $8 , curS /* curS -= 2 * sizeof(FxU32) */ - - movq %mm0 , -8(fifo) /* *fifoPtr = texelData[64 bits] */ - jnz .L_grTexDownload_3DNow_MMX__loopS /* loop while curS > 0 */ - - mov fifoPtr(gc) , %ecx /* old fifo ptr */ - nop /* filler */ - - mov fifo , %eax /* new fifo ptr */ - mov fifo , fifoPtr(gc) /* save new fifo ptr */ - - sub %ecx , %eax /* new fifo ptr - old fifo ptr = fifo space used up */ - mov _maxS(%esp) , curS /* curS = maxS = width of scanline (bytes) */ - - sub %eax , fRoom /* new fifo space available = old fifo space available - fifo space used up = new fifo space available */ - sub $1 , curT /* curT-- */ - - mov fRoom , fifoRoom(gc) /* save new fifo space available */ - jz .L_grTexDownload_3DNow_MMX__dlDone /* loop while curT > 0 */ - -/* Check for room to write the next texture scanline */ - -/* ebx = curT, edi = dataPtr, esi = gc, ebp = fifo */ -/* edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 */ - - paddd %mm2 , %mm1 /* texAddr+=TEX_ROW_ADDR_INCR(1) | packetHdr */ - mov %esp , %esp /* filler */ -.L_grTexDownload_3DNow_MMX__startDownload: - lea 8(curS) , %eax /* fifo space needed = scan line width + header size */ - - cmp %eax , fRoom /* fifo space available >= fifo space required ? */ - jge .L_grTexDownload_3DNow_MMX__loopT /* yup, write next scan line */ - -#ifdef USE_PACKET_FIFO - push $ __LINE__ /* Line # inside this function */ - push $0x0 /* NULL file name */ - - push %eax /* fifo space required */ - call _FifoMakeRoom /* make fifo room (if fifoPtr QWORD aligned before */ - - add $12 , %esp /* pop 3 DWORD parameters to FifoMakeRoom */ -#endif - mov fifoPtr(gc) , fifo /* fifoPtr was modified by FifoMakeRoom, reload */ - - mov fifoRoom(gc) , fRoom /* fifoRoom was modified by FifoMakeRoom, reload */ - mov _maxS(%esp) , curS /* curS = maxS = width of scanline (bytes) */ - jmp .L_grTexDownload_3DNow_MMX__loopT /* we now have enough fifo room, write next scanline */ - -.L_grTexDownload_3DNow_MMX__dlDone: - - femms /* exit 3DNow!(tm) state */ - - pop %ebp /* restore caller's register variable */ - pop %edi /* restore caller's register variable */ - - pop %esi /* restore caller's register variable */ - pop %ebx /* restore caller's register variable */ - - ret /* pop 6 DWORD parameters and return */ - -.L_END__grTexDownload_3DNow_MMX: -.size _grTexDownload_3DNow_MMX,.L_END__grTexDownload_3DNow_MMX-_grTexDownload_3DNow_MMX - - -.end diff --git a/glide2x/h3/glide/src/xtexdl.asm b/glide2x/h3/glide/src/xtexdl.asm deleted file mode 100644 index 1c1c476..0000000 --- a/glide2x/h3/glide/src/xtexdl.asm +++ /dev/null @@ -1,287 +0,0 @@ -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -;; -;; 3 3/17/99 6:17p Dow -;; Phantom Menace and other fixes. -;; -;; 7 2/02/99 4:36p Peter -;; download through lfb rather than texture port -;; -;; 6 12/17/98 2:36p Atai -;; check in Norbert's fix for texture download width correction -;; -;; 5 12/07/98 11:33a Peter -;; norbert's re-fixes of my merge -;; -;; 4 11/02/98 5:34p Atai -;; merge direct i/o code -;; -;; 3 10/20/98 5:34p Atai -;; added #ifdefs for hwc -;; -;; 2 10/14/98 12:05p Peter -;; fixed my f*cked up assumption about non-volatile regs -;; -;; 1 10/09/98 6:48p Peter -;; 3DNow!(tm) version of wide texture downloads -;; -;; 3 10/07/98 9:43p Peter -;; triangle procs for 3DNow!(tm) -;; -;; 2 10/05/98 7:43p Peter -;; 3DNow!(tm) happiness everywhere -;; -;; 1 10/05/98 6:01p Peter -;; mmx stuff for 3DNow!(tm) capable processors -;; - -TITLE xtexdl.asm -OPTION OLDSTRUCTS - -.586P -.MMX -.K3D - -ifdef USE_PACKET_FIFO -EXTRN __FifoMakeRoom: NEAR -endif - - -;;; Definitions of cvg regs and glide root structures. -INCLUDE fxgasm.h - -; Arguments (STKOFF = 16 from 4 dword pushes) -STACKOFFSET = 16 -_gc$ = 4 + STACKOFFSET -_baseAddr$ = 8 + STACKOFFSET -_maxS$ = 12 + STACKOFFSET -_minT$ = 16 + STACKOFFSET -_maxT$ = 20 + STACKOFFSET -_texData$ = 24 + STACKOFFSET - - ;; NB: The first set of registers (eax, ecx, and edx) are volatile across - ;; function calls. The remaining registers are supposedly non-volatile - ;; so they only store things that are non-volatile across the call. - -fifo TEXTEQU ; fifo ptr in inner loop -gc TEXTEQU ; graphics context -dataPtr TEXTEQU ; pointer to exture data to be downloaded -curT TEXTEQU ; counter for texture scan lines (t-coordinate) -curS TEXTEQU ; texture s-coordinate -fRoom TEXTEQU ; room available in fifo (in bytes) - -GR_FIFO_WRITE MACRO __addr, __offset, __data - mov [__addr + __offset], __data -ENDM ; GR_FIFO_WRITE - -;-------------------------------------------------------------------------- - -_TEXT SEGMENT PAGE PUBLIC USE32 'CODE' - ASSUME DS: FLAT, SS: FLAT - - ALIGN 32 - - PUBLIC __grTexDownload_3DNow_MMX@24 - -__grTexDownload_3DNow_MMX@24 PROC NEAR - - push ebx ; save caller's register variable - mov curT, [esp + _maxT$ - 12] ; curT = maxT - - push esi ; save caller's register variable - mov eax, [esp + _minT$ - 8] ; minT - - push edi ; save caller's register variable - mov gc, [esp + _gc$ - 4] ; gc - - push ebp ; save caller's register variable - mov dataPtr, [esp + _texData$]; dataPtr - - sub curT, eax ; curT = maxT - minT - mov fifo, [gc + fifoPtr] ; fifoPtr - - mov curS, [esp + _maxS$] ; curS = maxS - add curT, 1 ; curT = maxT - minT + 1 - - femms ; we'll use MMX/3DNow!, make sure FPU register cleared - - mov edx, curS ; curS = maxS = scanline width in DWORDs - movd mm3, [esp + _baseAddr$] ; 0 | address of texture to download - - shl curS, 2 ; scan line width (in bytes) - mov eax, [esp + _minT$] ; 0 | minT - - mov [esp + _maxS$], curS ; save scan line width (in bytes) - shl edx, 3 ; packetHdr<21:3> = maxS = scanline width in DWORDs - - imul eax, curS ; TEX_ROW_ADDR_INCR(minT) = minT * TEX_ROW_ADDR_INCR(1) - - movd mm2, curS ; 0 | TEX_ROW_ADDR_INCR(1) - or edx, 00000005h ; packetHdr<31:30> = lfb port - ; packetHdr<21:3> = maxS - ; packetHdr<2:0> = packetType 5 - - movd mm1, edx ; 0 | packetHdr - movd mm4, eax ; 0 | TEX_ROW_ADDR_INCR(minT) - - psllq mm2, 32 ; TEX_ROW_ADDR_INCR(1) | 0 - paddd mm3, mm4 ; 0 | texAddr = texBaseAddr + TEX_ROW_ADDR_INCR(minT) - - mov fRoom, [gc + fifoRoom] ; get available fifoRoom (in bytes) - punpckldq mm1, mm3 ; hdr2 = texAddr | hdr1 = packetHdr - - ;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = curS = maxS - ;; edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 - - test fifo, 4 ; is fifo QWORD aligned ? - jz __startDownload ; yup, start texture download - - cmp fRoom, 4 ; enough room for NULL packet in fifo? - jge __mmxAlignFifo ; yes, write NULL packet to align fifo - -ifdef USE_PACKET_FIFO - push @Line ; Line # inside this function - push 0 ; NULL file name - - push 4 ; fifo space required (bytes) - call __FifoMakeRoom ; make fifo room - - add esp, 12 ; pop 3 DWORD parameters to FifoMakeRoom -endif - mov fifo, [gc + fifoPtr] ; fifoPtr modified by FifoMakeRoom, reload - - mov fRoom, [gc + fifoRoom] ; fifoRoom modified by FifoMakeRoom, reload - mov curS, [esp + _maxS$] ; reload maxS (destroyed by call to FifoMakeRoom) - - test fifo, 4 ; new fifoPtr QWORD aligned ? - jz __startDownload ; yup, start texture download - -__mmxAlignFifo: - - mov DWORD PTR [fifo], 0 ; write NULL packet - sub fRoom, 4 ; fifoRoom -= 4 - - mov [gc + fifoRoom], fRoom ; store new fifoRoom - add fifo, 4 ; fifoPtr += 4 - - mov [gc + fifoPtr], fifo ; store new fifoPtr - jmp __startDownload ; fifo aligned, download texture now - - align 32 - - ;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = maxS = curS - ;; edx=fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 - -__loopT: - -IFDEF GLIDE_DEBUG - - ;; Make sure that we have a QWORD aligned fifoPtr; force GP if not aligned - - test fifo, 4 ; is fifoPtr QWORD aligned ? - jz __alignmentOK ; yup, continue - - xor eax, eax ; create 0 - mov [eax], eax ; move to DS:[0] forces GP -__alignmentOK: -ENDIF ; GLIDE_DEBUG - - ;; Compute packet header words - ;; hdr1: downloadSpace[31:30] numWords[21:3] packetType[2:0] - ;; hdr2: download address[29:0] - - movq [fifo], mm1 ; store hdr2 | hdr1 - add fifo, 8 ; increment fifo ptr (hdr1 + hdr2) - - ;; S coordinate inner loop unrolled for 8 texels a write - -__loopS: - - movq mm0, [dataPtr] ; load 64 bit data (8 texels) - add fifo, 8 ; pre-increment fifoPtr += 2 * sizeof(FxU32) - - add dataPtr, 8 ; dataPtr += 2 * sizeof(FxU32) - sub curS, 8 ; curS -= 2 * sizeof(FxU32) - - movq [fifo - 8], mm0 ; *fifoPtr = texelData[64 bits] - jnz __loopS ; loop while curS > 0 - - mov ecx, [gc + fifoPtr] ; old fifo ptr - nop ; filler - - mov eax, fifo ; new fifo ptr - mov [gc + fifoPtr], fifo ; save new fifo ptr - - sub eax, ecx ; new fifo ptr - old fifo ptr = fifo space used up - mov curS, [esp + _maxS$] ; curS = maxS = width of scanline (bytes) - - sub fRoom, eax ; new fifo space available = old fifo space available - fifo space used up = new fifo space available - sub curT, 1 ; curT-- - - mov [gc + fifoRoom], fRoom ; save new fifo space available - jz __dlDone ; loop while curT > 0 - - ;; Check for room to write the next texture scanline - - ;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo - ;; edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0 - - paddd mm1, mm2 ; texAddr+=TEX_ROW_ADDR_INCR(1) | packetHdr - mov esp, esp ; filler -__startDownload: - lea eax, [curS+8] ; fifo space needed = scan line width + header size - - cmp fRoom, eax ; fifo space available >= fifo space required ? - jge __loopT ; yup, write next scan line - -ifdef USE_PACKET_FIFO - push @Line ; Line # inside this function - push 0h ; NULL file name - - push eax ; fifo space required - call __FifoMakeRoom ; make fifo room (if fifoPtr QWORD aligned before - - add esp, 12 ; pop 3 DWORD parameters to FifoMakeRoom -endif - mov fifo, [gc + fifoPtr] ; fifoPtr was modified by FifoMakeRoom, reload - - mov fRoom, [gc + fifoRoom] ; fifoRoom was modified by FifoMakeRoom, reload - mov curS, [esp + _maxS$] ; curS = maxS = width of scanline (bytes) - jmp __loopT ; we now have enough fifo room, write next scanline - -__dlDone: - - femms ; exit 3DNow!(tm) state - - pop ebp ; restore caller's register variable - pop edi ; restore caller's register variable - - pop esi ; restore caller's register variable - pop ebx ; restore caller's register variable - - ret 24 ; pop 6 DWORD parameters and return - -__grTexDownload_3DNow_MMX@24 ENDP - -_TEXT ENDS - -END diff --git a/glide2x/h3/glide/src/xtexdl_def.c b/glide2x/h3/glide/src/xtexdl_def.c deleted file mode 100644 index 4c345e1..0000000 --- a/glide2x/h3/glide/src/xtexdl_def.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:31 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:17p Dow -** Phantom Menace and other fixes. -** -** 5 2/18/99 5:28p Peter -** download/source for everything -** -** 4 2/10/99 2:01p Peter -** cleanup small mip downloads w/ fewer tetsts -** -** 3 2/02/99 4:36p Peter -** download through lfb rather than texture port -** -** 2 12/03/98 2:56p Atai -** fixed 16_1 texture download -** -** 1 10/09/98 6:48p Peter -** base texture download procs -** -** 2 10/05/98 7:43p Peter -** 3DNow!(tm) happiness everywhere -** -** 1 10/03/98 3:37p Peter -** Texture download vectors -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* Because this is uma the memory controller can eitehr direct the - * download indirectly via the texture port which is offset from the - * hw address in texBaseAddr or we can try to address the bits - * directly via 2d lfb accesses. - */ -#define PACKET5_MODE SSTCP_PKT5_LFB - -void FX_CSTYLE -_grTexDownload_Default_8_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_1" -#define kTexelAlignShift 0x02UL - const FxU8 - *src8 = (const FxU8*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~((0x01UL << kTexelAlignShift) - 1UL)); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t * 1UL); - - for(; t < endTAligned; t += (0x01UL << kTexelAlignShift)) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src8); - LINEAR_WRITE_END(); - - src8 += 4; - tex_address += sizeof(FxU32); - } - - /* Copy any remaining stuff if any. There can be at most 3 scanlines - * each 1 texel wide, but we don't want to whack any other texture - * data so we have to make sure that we're setting the w0 write mask - * along w/ the shifting for the data. - */ - if (endTAligned < maxT + 1) { - FxU32 - texData = 0x00UL, - texMask = 0x0FUL, - texShift = 0UL; - FxI32 - shiftTexel = 0; - FxU32 - shiftData = 0, - shiftMask = 0; - - for(; t <= maxT; t++) { - texData |= (*src8++ << (texShift << 3UL)); - texMask ^= (0x01UL << texShift); - - texShift++; - } - GR_ASSERT(texShift <= 4); - - /* W/ really small lod levels the download address can be - * unaligned for packet5. This is bad since the address gets - * truncated. Do even more magic bit twiddling here to convert the - * whole word into aligned writes w/ the right byte masks again. - */ - { - const FxU32 - texAddrSlop = (tex_address & 0x03UL); - - if (texAddrSlop != 0x00UL) { - tex_address &= ~0x03UL; - - shiftTexel = (texShift - texAddrSlop); - if (shiftTexel > 0) { - shiftMask = (((texMask >> texAddrSlop) | (0x0FUL << shiftTexel)) & 0x0FUL); - shiftData = (texData >> (texAddrSlop << 0x03UL)); - } - - texMask = (((texMask << texAddrSlop) | (0x0FUL >> (0x04UL - texAddrSlop))) & 0x0FUL); - texData = (texData << (texAddrSlop << 0x03UL)); - } - } - - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, texMask, 0x00UL); - LINEAR_WRITE_SET(tex_address, texData); - LINEAR_WRITE_END(); - - if (shiftTexel > 0) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address + 0x04UL, shiftMask, 0x00UL); - LINEAR_WRITE_SET(tex_address + 0x04UL, shiftData); - LINEAR_WRITE_END(); - } - } -#undef kTexelAlignShift -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_2" -#define kTexelAlignShift 0x01UL - const FxU8 - *src8 = (const FxU8*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~((0x01UL << kTexelAlignShift) - 1UL)); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - for(; t < endTAligned; t += (0x01UL << kTexelAlignShift)) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src8); - LINEAR_WRITE_END(); - - src8 += 4; - tex_address += sizeof(FxU32); - } - - /* Copy any remaining stuff if any. There should only be one - * texture scanline left so we have to set the w0 write mask up so - * that we don't trash any other data. - */ - if (endTAligned < maxT + 1) { - const FxU32 - texData = ((*(src8 + 1) << 8) | - (*(src8 + 0) << 0)); - - GR_ASSERT(t == maxT); - - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x0CUL, 0x00UL); - LINEAR_WRITE_SET(tex_address, texData); - LINEAR_WRITE_END(); - } -#undef kTexelAlignShift -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_4" - const FxU8 - *src8 = (const FxU8*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t << 2UL); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - - for (s = 0; s < maxS; s++ ) { - const FxU32 t0 = *(const FxU32*)src8; - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", s, t, - (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - - LINEAR_WRITE_SET_8(tex_address, t0); - - tex_address += 4; - src8 += 4; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -void FX_CSTYLE -_grTexDownload_Default_8_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_8_WideS" - const FxU8 - *src8 = (const FxU8*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t * (maxS << 2)); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - for (s = 0; s < maxS; s += 2) { - const FxU32 - t0 = *(const FxU32*)(src8 + 0), - t1 = *(const FxU32*)(src8 + 4); - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", s, t, - (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - - LINEAR_WRITE_SET_8(tex_address + 0, t0); - LINEAR_WRITE_SET_8(tex_address + 4, t1); - - tex_address += 8; - src8 += 8; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_1" - const FxU16 - *src16 = (const FxU16*)texData; - const FxI32 - endTAligned = ((maxT + 1) & ~0x01UL); - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - /* Do dword aligned writes */ - for (; t < endTAligned; t += 2) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET_16(tex_address, *(const FxU32*)src16); - LINEAR_WRITE_END(); - - src16 += 2; - tex_address += sizeof(FxU32); - } - - /* There can only be one line of slop so we deal w/ this by the bits - * of the w0 write mask so that other data does not get whacked in - * the process. - */ - if (endTAligned < maxT + 1) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x0CUL, 0x00UL); - LINEAR_WRITE_SET(tex_address, (FxU32)(*src16)); - LINEAR_WRITE_END(); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_2" - const FxU16 - *src16 = (const FxU16*)texData; - FxI32 - t = minT; - FxU32 - tex_address = tmuBaseAddr + (t << 1UL); - - /* Copy things that are going to be dword aligned */ - for (; t <= maxT; t++) { - LINEAR_WRITE_BEGIN(1, PACKET5_MODE, (FxU32)tex_address, 0x00UL, 0x00UL); - LINEAR_WRITE_SET(tex_address, *(const FxU32*)src16); - LINEAR_WRITE_END(); - - src16 += 2; - tex_address += sizeof(FxU32); - } -#undef FN_NAME -} - -extern void FX_CSTYLE -_grTexDownload_Default_16_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr, - const FxI32 maxS, const FxI32 minT, const FxI32 maxT, - void* texData) -{ -#define FN_NAME "_grTexDownload_Default_16_WideS" - const FxU16 - *src16 = (const FxU16*)texData; - FxI32 - t = minT; - - for (; t <= maxT; t++) { - FxU32 - tex_address = tmuBaseAddr + (t * (maxS << 2)); - FxI32 - s; - - LINEAR_WRITE_BEGIN(maxS, PACKET5_MODE, - (FxU32)tex_address, 0x00UL, 0x00UL); - for (s = 0; s < maxS; s += 2) { - const FxU32 t0 = *(const FxU32*)(src16 + 0); - const FxU32 t1 = *(const FxU32*)(src16 + 2); - - GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n", s, t, - (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000); - - LINEAR_WRITE_SET_16(tex_address + 0, t0); - LINEAR_WRITE_SET_16(tex_address + 4, t1); - - tex_address += 8; - src16 += 4; - } - - LINEAR_WRITE_END(); - } -#undef FN_NAME -} diff --git a/glide2x/h3/glide/tests/alpha.3df b/glide2x/h3/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a9ee75ce97391cec7bac11305d047b3acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87428 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 L61sFi+%Ekew>Xrd diff --git a/glide2x/h3/glide/tests/ap88.3df b/glide2x/h3/glide/tests/ap88.3df deleted file mode 100644 index f465e2df4deec381148203ac5d9ff3f2370606da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173903 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 diff --git a/glide2x/h3/glide/tests/argb8888.3df b/glide2x/h3/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df633f2e90395be95f86eb0f6f0670a4bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349577 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%0A5(baphZ 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%0A=HIet5DnK{@e?*Z2PH#*4Aem^}i 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 diff --git a/glide2x/h3/glide/tests/ayiq.3df b/glide2x/h3/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d1402b10d51d74ba63f7ea7aa4b1160957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174705 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 QXs@qLeEaF!!yVt< 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 ZrJMHKeXyJB+SRu@`QP!pdo}ao{{eY~5NZGb diff --git a/glide2x/h3/glide/tests/cmp.bat b/glide2x/h3/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/h3/glide/tests/cmp.bat +++ /dev/null @@ -1,65 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_SRCIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DIFFIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DIFFIMG%]==[] goto Default1 - -goto Output1 - -:Default1 -set FX_GLIDE_TEST_DIFFIMG=%BUILD_ROOT_SST1%\glide\images - -:Output1 -set ddir=%FX_GLIDE_TEST_DIFFIMG% - -if [%FX_GLIDE_TEST_SRCIMG%]==[] goto Default2 - -goto Output2 - -:Default2 -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output2 -set sdir=%FX_GLIDE_TEST_SRCIMG% - -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default3 - -goto Output3 - -:Default3 -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output3 -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -isub -v %sdir%\test00.vgm %tdir%\test00.tst %ddir%\test00.tga -isub -v %sdir%\test01.vgm %tdir%\test01.tst %ddir%\test01.tga -isub -v %sdir%\test02.vgm %tdir%\test02.tst %ddir%\test02.tga -isub -v %sdir%\test03.vgm %tdir%\test03.tst %ddir%\test03.tga -isub -v %sdir%\test04.vgm %tdir%\test04.tst %ddir%\test04.tga -isub -v %sdir%\test05.vgm %tdir%\test05.tst %ddir%\test05.tga -isub -v %sdir%\test06.vgm %tdir%\test06.tst %ddir%\test06.tga -isub -v %sdir%\test07.vgm %tdir%\test07.tst %ddir%\test07.tga -isub -v %sdir%\test08.vgm %tdir%\test08.tst %ddir%\test08.tga -isub -v %sdir%\test09_0.vgm %tdir%\test09_0.tst %ddir%\test09_0.tga -isub -v %sdir%\test09_1.vgm %tdir%\test09_1.tst %ddir%\test09_1.tga -isub -v %sdir%\test10_0.vgm %tdir%\test10_0.tst %ddir%\test10_0.tga -isub -v %sdir%\test10_1.vgm %tdir%\test10_1.tst %ddir%\test10_1.tga -isub -v %sdir%\test13.vgm %tdir%\test13.tst %ddir%\test13.tga -isub -v %sdir%\test16.vgm %tdir%\test16.tst %ddir%\test16.tga -isub -v %sdir%\test17_0.vgm %tdir%\test17_0.tst %ddir%\test17_0.tga -isub -v %sdir%\test17_1.vgm %tdir%\test17_1.tst %ddir%\test17_1.tga -isub -v %sdir%\test17_2.vgm %tdir%\test17_2.tst %ddir%\test17_2.tga -isub -v %sdir%\test17_3.vgm %tdir%\test17_3.tst %ddir%\test17_3.tga -isub -v %sdir%\test17_4.vgm %tdir%\test17_4.tst %ddir%\test17_4.tga -isub -v %sdir%\test18.vgm %tdir%\test18.tst %ddir%\test18.tga -isub -v %sdir%\test19_0.vgm %tdir%\test19_0.tst %ddir%\test19_0.tga -isub -v %sdir%\test19_1.vgm %tdir%\test19_1.tst %ddir%\test19_1.tga -isub -v %sdir%\test19_2.vgm %tdir%\test19_2.tst %ddir%\test19_2.tga -isub -v %sdir%\test19_3.vgm %tdir%\test19_3.tst %ddir%\test19_3.tga diff --git a/glide2x/h3/glide/tests/decal1.3df b/glide2x/h3/glide/tests/decal1.3df deleted file mode 100644 index f999d3f881cb05e7ebb992c1567a7db09069e12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 zcmeHw4U`qp6?;Rz8Rv}B9Sq| z3I;`pnd2#v!;>Y<69_w!XF^Uud~YS5V@@lsfdnI1Nwc%_ z(f6guZc|9`*wu9^O=KmL~QdrN%TJVo(=22x#rKn@6Z0^e(bk&7J@@|ju~qKjK9Nx84JIx z;_onErZRxw?=WCyGC;%MVZcme0FA%HfSJbt7Jr8Ut;c{Ki7(bP(c|whz?$6}9x5RV zgpYoYBnl7y)M3QmVE|mCg)RBHaE5nSR^p*^yC&4#MiRpAwpTz8T$ zV+loKW3llVxRmoaxW{939?kKeZU*EZ6yZ+%Go7?Hsyn7@2V!Ys7(g%|nK0HBkqKT{ zSso2}iZ#F1-%o|szzBdJzSh2lAB%*K{&gqEA|j#lRu2E^WdOAON{ye{noZ@?AkYug z_XhF?bgkj9T0vh|^hmrqAXO~;xW%Wf*En}!BgmaRx#1LFMnfW@b6p<)>14pv%)_7j zWT8)~3vqo2a!c}-(*vh(Dars`sn;W3kuz3>k+ILx2>V@K1z*zq6;xEhk zegIno42Gs3|NK#r5ajjep@c{(!GAg!fO~)09dvGqoAe8CJ;1gOY6!MGmn;9WtZxGz z`iP{2&zqW{{O4cN$FpQaa!rRFbo>01E0%@E-~1hYU?j33KVQI5&RRR!&?L_K5K znZH6LfiryBHy{!^QM>pz0RuLZ@n7x%S`*rBAAkLv!OmhSO@%heWadZf1rk?j?Jpyr zE}@TEa7<>`6Y}7rvg4F&7_ZVf7rAp20(oQYS-$L%MM9@xAOC4(z~WoTA~`G9I}lBGK<^ zA=ldjBB7J29REf#K)>e0aNsfH907|Zt*_Y4K128aE#nVWhOQO(Nd8FiIW11t+MS$7 zlWZzCCz~P?N^Ls_lG>(h_u6(Y1nv-gZ}EzRPO%#N8^?frx}fx@3)$R+HufhhFpdIQ zENOj3ZvC1Oy)VoL{<2KkdeR2q^C`iMfG9H@|LhTwDClDb=wuVjTk?gDzB>FH#{fFd zhTgzq^j++>k3T#9n|F+k(H8!)toHRa{Pkl&I%>=A?0%i>P_B1mckKL_FB@Vap%bkZ z|LI|XHvg;E0fisYI#q%{yAR-w59s)8;-A-z1*&ZM)tqGS6UpvR__84)5?VKl_Dn*RrU`A@*8~gcYm@jL`h&> zK)J%_0G*x~RqBpM8UHpF17IHz(xh+)ty3lCpI-lAYk%?hk4=-gN-_OFbsWG1uzQi6 zEt1FtU)BtWgif16S>#mFhuN-Xssq@af%4t7PWJI);6c15VlHel*;k?_$!aA8$UB*cdJTq@^0hY|e-G60YBd3(Fm+|y&g!aQ0dS!Ty_ zJ!RHg6Ir_Lr|11hthVsa!)PCu_Y{oz*)@Tx+JLD)Dalu-7&&y2FDpV=R#D$8BH$BQ z5g~fvGY|HnA0PdOF+l0zapv~a+-oz!#?o&G|5W~lQ(Dhozw=W~%hvwCvkLmBlqdD= zfXS~*)Re^EQ;S5R{jP;|tq6#OPDO~n82tt@KrP`@kJGs&ZfyrhW~;G{(Bn_f<&hZF zb0S+FeRlufLN6PG?rK6oUz_n^=Yoz^J`af3KWWJ%GpDC|;5&I3e(j1sAd~p}@Z@3T zynH|;be;wHo1@X^f_a9^* zfVR>{*8a$BV8t`RnZqK%c=M!R7748z7yt6;H-G`!E`M0%rFPR4Hj;e+yt0pV)8o(n zy7x#XmJX%Z`JQV}@HwJdiv7j6_WLi|j^Nh%ee@0edcY~z1EL#W(7{FS%yS|+lHp5# zLL_t=9Q>`J-v9<^^E>c6fUVgbc*TogFWMO{%LgvdqdBc@7rCxI5lW@Fh@?V8@IN0L zBJA#uh2BlzI|RQ7EZH$HUw~bo>JBfh?kBg|aX^J*!OS;Ba&(F>OCus78N+7-{?^g2 zI|DSVX(nKIb~arj(E9Lx*DFGP-m$f3dB64}@zMQ$mIL^T`Xvy(>Z_YOg1Fc=;1sM7 za@j^w<)1UZClWsTN2eBtL_(*a!`~kIb!Pyq_CC(8{ZIA6zAvgZpmo7+{3{szdv8|O zo~3^sgYQQs#Jxfi=V%E3!_OKh?|Rt~S?=8sA>p9rKMUi%6wLB5>qgXlJQ6$x_l^64 zOM%QCna?ZInK4Kr%a_H0#es!^#RH2676uj$z*X_HaDYyU!QVdmb!Pz1EB+k_7Bk#w zotn^{uXg@#^0-KnIle6PiiEZgg})0eFxGOGe41)yh}N$8-T5zD%j4v$MR^v^&rbdg ze2S9FtCGy8a>R{YeX>aC6e;`>ayty5ZBu`D_CDN~v62q7f&wXFUgQC}_QXU&r^n#$ zFn~5q-Q5^{wKrQnsmXhEa`R+S(gnVFA|jzv)8X$hfHqED-2{DW44CwZM3l+i07yvr z#x6?eCk*(v3L^2hc4D5W*U7f3{Yzd-nS@sXh0V?4sW|23W#>+8JO4{puND4So9z z$X|i+v@h0HhV0Dt7{gk`e_9z}75(ZMU>$w?4467&AAS5p{TW~x|7l}@9rP<_fIalv zhXFS5pB4t#MZYoz*hjxz7+?$khBF`?SvY_ZwJUaef`Ky_Py1qTR=62k0h{I1 zBN&j(U3bzx`uK@fXMk<|r-K2u%RjC!dILiVV}DoVGgBE*0samHpxo2a%5^|R_&W?> z@NeZ-phEl|2DAwSD#qVoKwB`N3j7@gv;hOE!rx&)%QK)#{2d0gI0LH2e;OFjC)=G5 zEY1gr2LBxYnKBxRG1q)(^c@DYCj&IJ^)5a74g=be0eaNQH4lA<0qw^Cf;W2>q3yWU3pK?-v0^Kdrr`Ze>wD9fB}h$=L2RO1N8V?LEmA3T0^u$9l+vm6@7;R z?ZN;We>>1 zq3IqCYWO=0VAqg)10w@!4R7VURmTD}{_V!k0ipJ10E@rF09_r>_6*SD?=WCy zF~Eqw!+@E@03QAh17;2b`1m^vm?;bp;qNe@tr>718PkgKcNoyN40x=t(F*?U%K%S| z#n#%DC(;)40TlYOY*zm9z4n|H9)ouyTf>|U)dmb;&@Yd_!+^G8fDU~t_&W?}8wMEA zw}!vNfVN-&2YsvfI}B)f25`~0j=#fzmS%teeLMI&3}{&f2+_BPe;YF(!eVRf$`ct4 zk$IHz=V{v^VuHS1{2d0c%xD1yn4)hVe}p=vcHAcjGeYfH2b4j-68s$ov`igP7X8Zb zcNowL49MQ6t@4O_C*|hb@OHETInGI#BX%0^Q5elujA4=X5}g=td;L@FH(wi*M>u(fv2VL&U_0oE`! z59KhRbs1oetkt^?16q{s(3!2$r)e;Q+r_?2DDNgP#)XW<%8%#I1FeV2I!zO zTs{H+ANGvFx15K=fL39EIg%KCEDi(Io?83$1I+Lz=sOJ1`swY)05SeF`VIryl>s9B z_2@ecXio<4@#mrMFhFC#$Uuej0kN@|7E3u-BW8qn_>0hY7@#56E(|c@Z-&0ZfOcbm z9{+OaI}B(q2C(>BLEm9OJ28O9-zxeJ1KNiH8vb_BcNowv3?TU1Mc-jSdoV!7e|2%5 zAERnVoOJ<}1tSB!A$rBfs=H5~?)d;x{-d^V*Er%ZptTu5@JGmDK&jMTqFF`n(rSIZ zt2OHYT0e&YGmil@{!SfG!rzN#NFBi9?=WDdF+h*M!+@E^03-em17;Efc=$UEr~v~4 zR2*Kb?ml@up&wU>uPfaju*LeiRJ^u=v&3#VL;Uk@K)Rkl*L^Oz+-?J`quGx z7|@ywFh}1G{tg3Lj{)V-w}-#OfYxF_dGzh#?=YZs7+?i``}jKyXblFW3tF$x%q3d? zGxK+5gi0K!Y-Ok+V*xYNwR>hbi|;uMm@Wn+y&874aEUQCzvD2VItC2MmCgs$mI3A{ zo85I7&<+eRL%7^MhXJk6fN~g{-**_$>I^W)xBOj)0jV>9B?A(b%?B*>RyQAD4P7gt90rsa&?B~&c+PHUS{NYC zsr@?+0~7|#LoPGhH5UWSa%%sc!vItUeQeWaVt{>&&7YXz46uNHb1}di%}VYzKLa{^ zw)AqN1*MkV{Fl5I(Z{JbOC4a#5*7nDHv`;3i)v`WtTDg_`Z((5V1TA%EnUsa0C%t= zJ z7~l?8rI(li6{3%GV?>1bG=>3HS)|Ov&BXwBuuOK#-{v!*3iNT31aITH5ez7=bTuKG zhXL+jHF}huH8P+|^l{8aJP$P=IXGN2Lz*nMVt8Q>1u&2QQ8Dg$bWK2DL~Z9LbL0cCZq zNr35NfICn=2>rGgnHby>sm9Qfl3vVs*C|~)Z6&1 zPGgE1;(AwY8896x+GoH_Lm#7}$6dRwB?G1df4l!7G855n6axtUJ|vPp)JFob=T2lM zY*@pU^*UgtqK{3cm3h6ZvO2&M84a;95nz16fBAij1ks;6P39vy^?{Ao))+98(Z@Dp z(W0*oM(oZA8PV7N|EbRme}2{QYbN-+jd&Y<$}?c5qhCt~@X)96KZp48IzmC@2T{K@ zR}ft-6ifJ*>jyMB`m@kyplR$wmm8T~TOYdAvu^8k03UrC|I>&sfPYvZpF<+Ch`$*F zni~CCOx-8wAk~fqEb8=?H3o>#w}Ss`_$3g05uyJ%WEp=E1N7+k0R`hFhQ5YgK+AaM zmE2)>n0EvFbwu%9T3nJStf~K827Pb+Yk=zd0b=xN{3XPfxKD6HLRSgJ2L3z-u;{Oc z3`}z5w1ETeaF0}h1iMj3)D&_0=6oIc4Z**12AH8w}zHi{OU( zPF-F94Al9a;_t$)GGw4`9xUqg6`uj+(6@sBi#}J7FACZ!=K62j_!9=O=p(egEdHlC z*4DQJ?l311>hyKTbv%)JBw8 z;2-7-nlF?J@W%|$qmRIc)b*#q9fv%gEBTN+#u~sH{um>uD}s6s2pI6WQoB!s>qZ^) zW&PbO>hu-M04wOz_+#txS>t<4K|2mfXh&GbfETn|MVEE_ z@dJihAc`dH&m4Uv^si?8r{RLeoONpqu!cU3|I0`(aqx+wsNW^=g@Zd`LWTGnjfqQp z+~Cc&3dZ{gv1OWH|7+3e>ws?Umg?##q3?w`k7++x)afgg0anr1@b?(dCv1rNJA8bB z|GE%K&FVy4$J1q>n4WG0;>43W+ruA8Z1^5YR|Cv$F8s|#gM%SYOux!QGlX>$lX=jK z0(r*YArSOgq0|U}T+ZJjS!B*yzhDw(hKvV`XSwnZZ2)4Q=n67%&TBUO%@~l5uo#hAI`yMpX9Or2o~|5Z^rE=yQa!9Gc!#)hzZ4}a_LRemi-*4iDCvIj=reEELRjraoC z&lO0W@h7EU;`R-(PAry0OS7|n%-AWFLSJ5*`BCS8v~@2plmX@FlSYt+uPmjbdIk_~ zV0M&Zu7SfE&Z1Bx10M8*K*B+{k1qo3F(>MX|1wwwRA+vS<9?z|CHTWk5F^DgU=NJ< zm|s-su9Vroen~@@uwXo{&aH_&*$U2i^YShjF7%3#I1x zFM}Q*JNx&7pl7IR#A2!XmHTF&QSjfUL)*v%B~rR>C-}?K79UBG+#d}RpW2?SAk7a$ z^5H?>7YN`V<_n0BH#;*(w5g>0>z`5Z|9xm+=E7RfXDA+A4cA1d zp+`UT{WR=Vm)hg&E7lHdjiBYV7A`)z<$X!o9>Er$Fj^mUNBJVa9&@7R_`fBK~Wgmb2 z_>YOv2L65VbX3oP4Php>I$nry7WtE`^rCwO0{92{GF|xNJnI>-j3`n(+s9uw{}W^) zw1GcDFb^crQqO)LlS}17gf!ouJTJz7b+|L!8HJB_j>0wgK6+c}Cw0ATz(@etpk;r1`!iC%q^rkd@)iI9~w!*#fCM z{z%sks2=~GIE_D4F!W&)e}s}gx(2B2j31pbzMGFV&zC&ki&hI{WwcY`%k<*^3{wN> z$AC1JJrdDUd}dq!?zk?bZT$5k!NH&|#yVf}u;%%ZZ1ln?nlHCTyL^0svVW;S8c_b( zJwQYca<+>@NZQjZzc*-va!_HGp~-hcNyEfGy8G5;8ry;}lz>x}Klb`V`u=#GkF5F; z9yDeah*p-a>v?Vx7URFHC@d2I|F}*h^&0T+6-Z6+k1P1cNfw!NpK=eQ&zt|(<8Nrs zskkhlkB6Ju`0r}!VS|&j{A9+5Z3)s*!vl5q;GwShX~`4x_2(sV@~bKR8OnW+Kx%?N zY2o#?JI=E<{}a|!D7p0byLo{iG=z(mE&DiD8h z#A_v1oHP9XTTKjBa(q;&mK1j!MtDS2ANo7k5k;b77OZn=wLf-U1>=EPZ16s5PpQ{W z>V7o@S^Xz906w!J*qG{bWi0uskCvJMedLRGhxvkfP?tcoXsdG3`0L%gRskp0jSSdJ zCO+}*ph@q5?)R}Az*lo|diYou)X+87@cK3Yj|`N@8v4a&fR+Ux;!9t=JE{md<157t z_~WHv%mMlvU)AVXN!9ck{*uY45FtZp4=Uw8&Tt?OzXy+ZnU#7~gUgB~U)%9XT==)Z zeQF@U-!I2g!Bi0U_IUgI$ZTLbIvC{LC-Kzx%wvF-BKhf_;Vg9v1d5t)Yk(GS^{$nG zcU%#?2cR{NRnZYx7o6_A8yTSGh~3JAS>RDV9!b>62mJXP!v*~#EiK12T^7(YK+6Y< zKXoPb`1u0$euqG`XdPFRS%77LmO0T>POntzH>)ja=^K4PfPT$)e`&dNT-95EW`Kp* zBp4^t5++yZ^N9b)P&JwTv5+$-NQD;A7+@g+33f(s1@L!{7PSCjK>6&8ia7Rnj@Gq+ z%7E6*zmxN7Er1zNZ5+bE;7mLtG_x&$`P0r8h^0d* zA~6or)$-Gf7D#vpBZHxF`-O5`R%KWQ2_4bay+TLQ2}NS*SURCbOzMx?S)lNC?u~3J zcYFRR`6e}ubm8dKkxU{>TRCAc^Ic z(}6P&eH2O^x|lA|3Z)YV6aBKf^0f+zDkh=g=`_a^M3DfBB2M8ULvWG8kwel zEi8~*GI_JMPCJRF78RDsa=LJMGL*XRBxd4uC-47|l*hGauRVeNZa5X0Nal!gDPVm+ z=)XzclvokiUd$)CYvKI$!Yi8WyzSZ(L_)WZ#fT&WYD~2L)mtE&%6v0>UpAFZO?`Fp z99s)$pwTRa#&?=gIDevIj?DHCO<4>SR-DI;s3aAL;eScVcPP z0ymsGbP-=C1M33FyU<%fxyO&gQOM@gn*1cCmNoqS=){mrgw(5g{j0LT-uz32d1@|X zIh&&Km*r53r@t(3JBR&yq>y5%k-&;-^?xP*v?k9Txb1x+kN*5%VN--`WpZF^J>kY-Wif{&8OmzYis4%w49R9$)xqp$`f!+ zuGGk>@4}DrU)JQgop*ddL-j^qp=O*M6@@W(O@65fS z$^P5co+a|=gL`Bmq+a3cUyTLwX{i6cnECwVW1#<2z=+}@(m!2L?+hdl9X%LZ7g!uJ z=zm(#|2;rG4|<@={;L)^DSs@VG1ngSpO;&rh$ja!lnQq* zAfws+ScZ;lJ4a;m(M<^=LkaaU4*qygL-DAhSG*wm2TEVam-DD8iS&=9Z#k{i{{sDG zs0B_crQobw>M7|IFJ9(ff*wdo{%PmVkBMx4d0hk~gympN4Nf#IoqOP4eP-9f0{N#h zTQLK&#U6l2|J|R=I|e@a>z~ZA{X(JsxZaZ#IbCcAw4@kU z{%cb|)#R7AJ%66a<~#375E%@p4>9_y+IuUt0Mz?ONNtDfp{ZWz0sOS^3QmcXa<=_T z7a|jQ3^0(46)iUgIVA1BnnUG#N~!lgRLa16@<(Q6Ab-WwS2cNa&Y_D$Hs81+L}cH9 z8at)GrhSDLfZqS%{8%y9U|9L-vnq)%D{P<88MbZf+IJPNow+|R7@FbmFJBi1m*PR?lu00z{MJBZIU@ElNyDHKTJ>Y(51vkN11&%yu`T?+? z)GQak7RTZGf>8e-W_~yGc_Jrv9-Shx&_fBw)#m5B!~;QILa^Rcux=2t_eBE#On5E-EjhLk>P9`L^?PnF`r z{o#qy^-W}ssdQh4a(5i$RaMU3mdquyAh~32%jSjN`5+5H$h?Are>eQUBYC%z-Uc=; zpyi|fE|_WaTHg^1m(?NCwC(i}%>28kJsxG~EKux!Ln*|f)j=}UCy#iED0K@YQPRK07Es6WP|sMl z0M=gL8j5T{Y0t5M=qa8*rGE`AplXlnQ>zvr+T%8o?ho+ttkb?K3o!cE$O4-7RxLnl zU(Ny??W?eWPX8KMfYsiL1@zjRTHvOf2Wma6v0ilb0FOCFKZE{NTEM7%IScT#H?hD? z(93+*pu1{|3M|0UzX}VC3@i^|eT^cn2h>^*YpfT3Jy3WhdtdD=z}3HE3ych`i1Z3A zuqTlU7#S$mUsMy;(gFhgtFb`Ho(0l{0~gda5Iz3*y51ZR>OVs)V50wwuz;!lRarp) zHd<0A;x&D;`mEIk(^U$}=->7hD64;)Tfl<;ZEXRA{!w@lnDMA^bPW9g!&|AFs~%ug zb@|+Jx8(A%zRFb{EU+{({WT%2sms^tgWr1lI)g4B?O$}ar3ExSi`q-j>zY9pAo^3< zH{1eyz0=npQ1#boKZ7iQ_2+0mV=MsbN8NF#^{~czX=pt#J*5C){h`J)=&stL?JWTM zBbUE3I8!Zv^`FTWQ1zd=79jf1I13!ly@6*RH2oWHfq-a+WND=CZGjJV=FijX-&hL_ zdzVj_1xnhp_+u_KvMrb<3sBk{^>2F%FxvCdaov1Pibl z>#v%|069>ubDjZwnapHTpD>1p>8c4Yg8W)RyPdz7}A$T?TJK zUdDPAuiDiDw6e?4%dn5?wYfnlEUH{YW7Ox4p^#Jd;)wIs6 zyOk}_pBUs=fM8CaS)JLdnP34{WBpb8TR^X|{<_^Qpx4)U-6R&cRD0bB`>$MPeZunf zfKgwgPZL<+b7+pHzy6=uss|+FGDH z?)G!_=l#}769#|@H$V?!E!*LJ$|?r77%5E=U*EOl+hk1tXaTB zdmONO3*cC+AJtpHg7!E&ss+kuj{{a~0UU>&qdE&%)E;N38|u7I>uWt;POGy3FGh2} z$}M0+dz=OQUTI55H5RaxfG$vF7H~(Q&X4P&s?nw10yhe0O7%UW$}(VPffvvcexzYR zi^mUb)3;I!*i5DrTx5aM@UCis{-tN@?0)HiUZ*BKY`%FGm_F@s z-Yi>SU{iw3lVbh9kIt3kVT61onFId{sL32wf8#7!&9(1BmqI&WTK zXw?z#jJqWwo#C!vR}@Rp*XQyf_Q0+GRmwjl%(bU~nNpzBUe$j+dc7p~hFv})=m%hb zO)g`zNUkski1vL@`)Mo3lVF3O63hjlz{425BwkLe6YYA z_%~)lsiVRPoI(y5v?uz%hKK~?z|Eqd{|C9yWVRqV*gtb`vCdx!@x*}v4}%@vQY;ZI zl>+#cts-uT#Nz^JyP`c|?B5kHSwQXks<^`slSybhXRZY}+N=8C3kVWfExAg9&VcAJ=>2xED&rB*aU41AP4v>hN{@um!ror93-F zDfbodUU|Co#adw4%hO)Pe>K!pL~i$YL_5N&xK_Y_q7u0R%_>DLbSx=pi=a%L1_p#n zVMY2QAN=cxgc(pQ83z45(N)n+(sEysAE;m21kx{+q82z<3uu_rE{y+5;3|=?20J7o zu0Mr3NRvwh$#A`wDXl=1+Dj|cA5nK)=n~~0=)FqKHwW5(cfYhNJQ|jz5g%9pj-}zj zU^;v-T3&yBTR`hg+*toxp$A0d=BV3G#Pzo@0@cK#{yr#A4}%t@GVA!hm z_-S(s;1GVOwTRq^I!n^gOZEQeKyEA@cn|%&Fm4@yg2Ji0rE@{iDB|2|(j zE`t@4euV|P7|butEP$WH?KhDx`8tC{I5I>i>i5iEfcOXN%b&S+8M9p3`oXP3mL{s=gL%K@1W5b7^= z#&P}M<#+iZGYB|`XD(>w>EON&h-OL}&ZpTL4G12wDIl*F<4# zQk0H;(B@xKlFo8T-b>YXI4st`T=_5d|KczL@E7Cf;=kNC;v0e%05iaT4WP!%vjD#1 z1KfyQDRsq(bew?3QIoRzr_TRN51l!2(wM zKge+CIe-Ir05c+U{oP?A?%x63NoCMg%#9&N+GD*k=6MT7L9c`U4{O?^j$pUHCrSxu z-s9`?yQPjOn2a21{|C=GeGXvpK>7%@m(tNa@jeL$!c4&J;6A^V{vU~!KC>3UcX}Zy zB9{ic<3!wRKzldpgbx-M4r_iafqsNKlenJJ9X|sz0P$kKDqfriiMxHJGEbsaXB;nw zb{ETKSbym4$2Y|_ZE^2^oxhScfFwd&K=soKxjPL11XUFGv!FYE8<;8<^d~7a`&qMq zKBw?sXkjAm{|%bEN}>$y`AF?q_xF*E_72$Ido1SQs=~6u+wyR_kjf`>_=Ddjp3G@`T2rBeiNQ#6 zK%m7qejECcmmm7&EvFwEJ^c5|OVJX_{Fj9sz&mxm2=A2pMgD8)M~-B+oqOn`-Je7z zc7KB3EO~em=OG!`2X8Lk5E}^y(#LP*UU2yOJO0*t{I;JSSPk#t4&XH?%$2e>7|%^i zoyqvq#E^a$Fki6pq$N~I6#v1Rg*swR@6{N4c6?)|7Yyb3y zQ+Is(xtB)+V=?@%t14H^c9n@4t}e%_xQGRiQirm zSP>ctq!aK~vW)Vkwj8{pi+V#_L3u0j=$9V)FSotF_79)#KNuMq!0$#PWyLfH@IL#( zJNYk9{USF<{<;irQigZM7T*Gj-yXd7m-}y85$I2BkBkk&d(zIpdtx*2)->h~aRueA zxNrV&+huFd-oNAruk4Wz#xPe%`sGjn23(qXZt6^7wVFP8OA~&3#oAxK^a#ASEwL*$ zHV*G*JR_f!&&r=b9;ickE34<-IZvnHJ*=Pn#eyvZ`@Hy7$;I?txTj@i19+?TOW7|@ z9?w0%rXQKO?!>lK^3iqhX2aq;eJADj;SIsc+cdQdsBZ=R)sFoy?)-S`n}7CK@NTNe zSfZG|3r4wDKyOQs19*@8JNUhhxi>Ofb5COY$y+IsIs9I`Ll@z#-CFt?cuV04uz>c? zHpqthR?6ca4nO()`KNb(`>MMVTfActC4HRwd>HXxDat`UoqGV@ti3unC%dDt5x+6> zx|7?^sr(O|fp^EhI~rLP>z5BE(&KU#-WGTca&Qv9sW+vnZ$&(_ZgfK|{gaJ%?_KU) z7s2*|7G6yq&p8NkP{`u9+T|wla{>MFqf^_?;Wzi~{CM{#yFWQ}5ni#C7=ab#4Y7l< z)T4m^dC+_k-ck86qz`otC=W;OhxmL-vU*17<8$ie&J-pD_#zJVFu z3I}h5`{dS-KAXzF^tly}dSWX=ctrsC*9CLD>RO{&4&+p5UtkZU0kP{2{2u!Q7qmKE zy$$ba8qIW0^}-vF_X7Uu+??E;^Ai^#&*O!?S8ws|)%b5A2Pt@K#NyDxf$af(4wAXu zpImqHx|5L!ItMs)cnct!^pPCsGF`kZmcKGNP*Vqnc=b6@Q^(_4CI`b%Ryy(QSGgP% z(=USp{6iSVMiHEYq?c$zzdeV_!EpZRsUCO>UfCR!(l^b)Xk^WRCqm^QL~?L=GH__HF;eA7M z0O|WX{9WF9rZzk#2ECj<~EDyTl1LIGQ3VFbwusE=*d=Av44e8g)26l2lbSLLV+W@DFcOcvf z-|ErW9N^SfE4#l|PfHHe)Nw!UHONQfZGd<06?=)(l7mICW`y@isZt9Y+)dSqBxcixcUz$YME<54g$EkBkcl7U8{c^nS+Nuf*GrL%Px!)4va$q)g5>a)4m5Sv~0S!qu>T z3@i0kb3oG7&K7eJ?u@&9rKd;^u7-Vkv!Fu>hqWA(VxSxrauDtc!{WG)dPvPdDRq3u zN)D(PD5rT2x}%2F@v~hpe|L$hJBg}%4oFD-*(?XJKaWb%&ONyX4-|38}J&ypzW*DR+bJU^mVS-nH{tNF5>HLf=9-^#&IQ`y_Cb4lM^mFqcZ|-$h{AXVCiS zH9lbV7tnstVlL>SJ9@zeez5;Dzyc7g-wK9^4*W8eZYw5M3N( zqaisUY2&jGzzd_GbWPkH?f5_FEMVy2VTga%5(feM)A}RW!NjD$IJhf17TxFH;#(E% z)upf1NLmj1z@qn}+tC7lXVCpSu31orD7!w`oZ~%8cwgyTkc(a>eY|^K**S=RD}wD0 zdqwx6RCrgoFRqURU+Zn)0lTh5{rv5+e^2Ofxf8Co2i?eB_rE_Zzk)ayl^B&>S&frVB>I9vv?{b9xi za}LDq?+SJXU4G;O)aK(I`kwHr_=YH85Z)8l<45>k48oU zT8#xOfqM_{-uW-FXVQ^$!t<;yhVjD2oae&a*n@a&?D_MNiI@IruXm`B+6=3~d03Z{ z<;{gx_Ww&@-Hr?6P!9rQ*%-#<1-S=u55%t6{mId(!;{-yzwdin2FCtDz5pwlQ_AyK z<)0op7n-wm-mo|61x33&FRc4cNsD3mru^L8?ZZFA|Mqowa_7H1`0$p%*buD8o`tnx ztl!(YAHI3{)Bn2p#(e{03E<3JbcN@qr5H9BHs&A9KNY)T=f{UG9=LF5Y~MfZN{r{> z*>jKwyb`@Jd*6xQc)7hXB}%=p)j{;yd2@Z^z9@>j#} zy!7?tH(*sRQy9yCt*{!NPo4ka*pIgl?~08^l#;W6jv+a)J+cn=GT^nobRm|$|HGXh zE8~T$a!WGboH~;qE3CfwN^0}iFkZn2{c+i&V!;0f(;HY3z%e9qq12rBu05f|upqkw z)&L(<*0Ax?vvMdzVPY8k^9_-{1jGP&NDe)JejwQ+DKWfLSUq({9|Js(OQ9}?b;THl z%EsUdclz9MDDV}=;12irpasTNMkO%}!`ef%Ct6ty*&~G?E9(ap#gG}v{jBgd*w1e% z53(K$n8UoOIDV`ohT;g+19dw5LapK$f&jkqE2j!$SPxb1X)7^=JPId=C_C)_B$@L; z%T!qmYNb@Uov;T1 za_9p#;;}{$&5ygo9UyL>>vy4F)7!heHwf*yk7%)F07h^FvK&NrqEBDrnhkybVy~$W zdMXd2g_2u>9)ce>@Vwbd9g`X6U&WHS7i5@oz~M#ycTGtN}`*%X)vWKfX!2 zOVWD8q}7AIj|BDKF=8KV1Er@UVMtt2Fer5QdVi-+S{hb+Hgp~aAA~i7U`N~)B))de zi@$l-nGO5L-Ub>$t9I)8BQM8}?*H-Vp7cA=Qr|Ru;lRAHMBhJe_&W$OTv+|?MC^M9 z-h8@$IH~f6h+w0(M_lNHarM8_Le>!_#_KO$$QjaDBuA9;OIK--5t6o_V+LGJ0 z>bCc{edpb!Q-7KLLE%U8IP^0A(WS(}2{D=D~=)ZXP-+%AR&;91Rx96X_GT5=NJ2MRC{iPjxK(wN(cm`E2id9#>!7^+)p` z>y!EqZ`i-)XHV@OzW&`e7ryqNmTozJ@ZT0*Gk@EP)VDYI{<`nIrLV0zux7`WC%@FY JBDH46{|8XK8>9dL diff --git a/glide2x/h3/glide/tests/display.c b/glide2x/h3/glide/tests/display.c deleted file mode 100644 index 3862bbe..0000000 --- a/glide2x/h3/glide/tests/display.c +++ /dev/null @@ -1,442 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -typedef struct { - FxU32 signature; - FxU16 width; - FxU16 height; - FxU8 depth; - FxU8 type; - void *data; -} LFB_Img; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "display"; -static const char purpose[] = "display a 16 bit frame buffer (565 format) dump out"; -static const char usage[] = "-n -r -s srcimage -t testimage"; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -int main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - char srcfname[80], dstfname[80]; - FILE *fp; - void *mem; - FxU32 filesize; - LFB_Img src, dst, diff; - FxBool txtdisplay = FXTRUE; - - void *image = NULL; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - srcfname[0] = 0; - dstfname[0] = 0; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrst", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 's': - strcpy(srcfname, remArgs[0]); - break; - case 't': - strcpy(dstfname, remArgs[0]); - break; - } - } - - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load src image from disk */ - - if (srcfname[0]) { - fp = fopen(srcfname, "rb"); - if (fp == NULL) - srcfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&src.signature, 4, 1, fp); - if (src.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n", srcfname); - exit(1); - } - fread(&src.width, 2, 1, fp); - fread(&src.height, 2, 1, fp); - fread(&src.depth, 1, 1, fp); - fread(&src.type, 1, 1, fp); - - mem = malloc(filesize-6); - src.data = malloc(src.width*src.height*(src.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - /* Simple16BitDecode(src.width,src.height,mem,src.data); */ - SimpleRleDecode(src.width,src.height,2,mem,src.data); - - free(mem); - fclose(fp); - } - } - - /* Load dst image from disk */ - - if (dstfname[0]) { - fp = fopen(dstfname, "rb"); - if (fp == NULL) - dstfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&dst.signature, 4, 1, fp); - if (dst.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n", dstfname); - exit(1); - } - fread(&dst.width, 2, 1, fp); - fread(&dst.height, 2, 1, fp); - fread(&dst.depth, 1, 1, fp); - fread(&dst.type, 1, 1, fp); - - mem = malloc(filesize-6); - dst.data = malloc(dst.width*dst.height*(dst.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - SimpleRleDecode(dst.width,dst.height,2,mem,dst.data); - - free(mem); - fclose(fp); - } - } - - diff.width = 0; - diff.height = 0; - - if (srcfname[0] && dstfname[0]) { - FxU32 count; - FxU16 *srcptr, *dstptr, *difptr; - - if ((src.width == dst.width) && (src.height == dst.height)) { - diff.width = src.width; - diff.height = src.height; - diff.depth = src.depth; - diff.data = malloc(diff.width*diff.height*(diff.depth/8)); - count = diff.width * diff.height; - srcptr = src.data; - dstptr = dst.data; - difptr = diff.data; - while (count) { - if (*srcptr == *dstptr) - *difptr = 0; - else - *difptr = *srcptr ^ *dstptr; - srcptr++; dstptr++; difptr++; - count--; - } - } - } - - - - sourceFormat = GR_LFB_SRC_FMT_565; - - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, src.data, sourceFormat, &bpp ); - } - else if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) - exit(1); - - while( frames-- ) { - - grBufferClear( 0x00303030, 0, 0 ); - - - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - 0, 0, sourceFormat, - imageWidth, imageHeight, imageWidth*bpp, image ); - tlConClear(); - if (txtdisplay) { - tlConOutput("1 - lfb source format (%s)\n", - sourceFormatString[sourceFormat] ); - if (srcfname[0]) - tlConOutput("s - display source image\n"); - else - tlConOutput("no source image\n"); - if (dstfname[0]) - tlConOutput("t - display test image\n"); - else - tlConOutput("no test image\n"); - if (srcfname[0] && dstfname[0]) { - if (diff.width > 0) - tlConOutput("d - display differences\n"); - else - tlConOutput("source and test image size are not the same\n"); - } - - tlConOutput("space - turn on/off text display\n"); - - tlConOutput("any other key to quit\n\n"); - } - - /* - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "s - display source image\n" - "t - display test image\n" - "d - display differences\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - */ - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - break; - case '+': - break; - case '-': - break; - case 's': - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - imageConvert( image, src.data, sourceFormat, &bpp ); - } - break; - case 't': - if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - break; - case 'd': - if (diff.width > 0) - imageConvert( image, diff.data, sourceFormat, &bpp ); - break; - case ' ': - txtdisplay = !txtdisplay; - break; - default: - frames = 0; - break; - } - } - } - - - grGlideShutdown(); - if (srcfname[0]) - free(src.data); - if (dstfname[0]) - free(dst.data); - if (srcfname[0] && dstfname[0]) - free(diff.data); - free(image); - exit(0); -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 640; - FxU32 shortStride = 640; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 480; y++ ) { - for( x = 0; x < 640; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = - srcData[y*640+x]; - break; - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*640+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*640+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*640+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*640+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - } - } - return; -} - - - diff --git a/glide2x/h3/glide/tests/h3dtst01.c b/glide2x/h3/glide/tests/h3dtst01.c deleted file mode 100644 index 066b624..0000000 --- a/glide2x/h3/glide/tests/h3dtst01.c +++ /dev/null @@ -1,200 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef __linux__ -#include -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#include "tlib.h" - -#define H3D_RED 0x000000ff -#define H3D_GREEN 0x0000ff00 -#define H3D_YELLOW 0x0000ffff -#define H3D_BLACK 0x00000000 - -GrHwConfiguration hwconfig; -static char version[80]; -static int scrWidth, scrHeight, boxwidth, boxheight, origin; - -void init(void) { - GrState state; - - grGlideGetState(&state); - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - - grColorMask(FXTRUE,0); // make sure color buf is on - grDepthBufferFunction( GR_CMP_ALWAYS ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - grGlideSetState(&state); -} - -void drawBoxes(int w, int h, unsigned long c1, unsigned long c2) { - GrVertex p1,p2,p3,p4; - - p1.x = 1.f; - p1.y = 1.f; - p2.x = (float)w; - p2.y = 1.f; - p3.x = 1.f; - p3.y = (float)h; - p4.x = (float)w; - p4.y = (float)h; - grConstantColorValue( c1 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); - - p1.y += origin; - p2.y += origin; - p3.y += origin; - p4.y += origin; - grConstantColorValue( c2 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); -} - -int main( int argc, char **argv) { - int keepworking = 1; - GrScreenResolution_t resolution; - int redraw = 1; - int redrawPattern = 0; - int patternon = 1; - -#ifdef H3D - resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; -#else - resolution = GR_RESOLUTION_640x480; -#endif - - /* Initialize Glide */ - grGlideInit(); - grGlideGetVersion( version ); - grSstQueryHardware( &hwconfig ); - grSstSelect( 0 ); - if ( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2,1 ) ) { - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - } else { - keepworking = 0; - } - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - scrWidth = grSstScreenWidth(); - scrHeight = grSstScreenHeight(); - origin = (int)scrHeight-240; // top of right eye buffer - boxheight = (int)240; - boxwidth = (int)scrWidth; - - while( keepworking) { - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '=' : - case '+' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - redraw = 1; - } - break; - case '_': - case '-' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - redraw = 1; - } - break; - case '.' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - } - break; - case ',' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - } - break; - case 'p': - patternon ^= 1; - redrawPattern = 1; - break; - case 'q': - keepworking = 0; - break; - case ' ': - redraw = 1; - default: - break; - } - } - - if (redraw) { - grColorMask(FXTRUE,0); - grBufferClear( 0, 0, 0 ); - drawBoxes(boxwidth,boxheight,H3D_RED,H3D_YELLOW); - redraw = 0; - grBufferSwap( 1 ); - } else if (redrawPattern) { -#ifdef H3D - grHints(GR_HINT_H3DENABLE,patternon); // set the pattern on or off -#endif - redrawPattern = 0; - } - } - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/h3/glide/tests/h3dtst02.c b/glide2x/h3/glide/tests/h3dtst02.c deleted file mode 100644 index f8bbbe3..0000000 --- a/glide2x/h3/glide/tests/h3dtst02.c +++ /dev/null @@ -1,292 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - -#ifdef H3D - GrScreenResolution_t resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; - float scrWidth = 640.0f; - float scrHeight = 240.0f; -#else - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#endif - int frames = -1; - - Mode mode; - - int i; -#ifdef H3D - int eye,offset; -#endif - static TlVertex3D srcVerts[100]; - float angle; - -// GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - -// if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); -#ifdef H3D - grClipWindow(0, 0, grSstScreenWidth(), grSstScreenHeight()); -#else - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); -#endif -// } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - -#ifdef H3D - for( eye = 0; eye < 2; eye++) { - offset = (int)(eye * (grSstScreenHeight() - scrHeight)); // y offset for right eye - grClipWindow(0, offset, (FxU32) scrWidth, (FxU32) scrHeight + offset); - - for( i = 0; i < 100; i+=2 ) { - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.x = (tlScaleX( prjVerts[i].x ) + (((eye*2)-1)*(vtxA.oow-.5f)*16)); - vtxA.x += SNAP_BIAS; - vtxA.y = tlScaleY( prjVerts[i].y ) + offset; - vtxA.y += SNAP_BIAS; - vtxA.a = 255.0f; - - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.x = SNAP_BIAS + (tlScaleX( prjVerts[i+1].x ) + (((eye*2)-1)*(vtxB.oow-.5f)*16)); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ) + offset; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - } -#else - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } -#endif - - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/h3/glide/tests/lava.3df b/glide2x/h3/glide/tests/lava.3df deleted file mode 100644 index f6aef2e7cc5c29c2be89a677527e474449cf7a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88450 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 diff --git a/glide2x/h3/glide/tests/light.3df b/glide2x/h3/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/h3/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/h3/glide/tests/makefile b/glide2x/h3/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/h3/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/h3/glide/tests/makefile.distrib b/glide2x/h3/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/h3/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/h3/glide/tests/makefile.linux b/glide2x/h3/glide/tests/makefile.linux deleted file mode 100644 index ce0a9c7..0000000 --- a/glide2x/h3/glide/tests/makefile.linux +++ /dev/null @@ -1,77 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) - diff --git a/glide2x/h3/glide/tests/matt1.3df b/glide2x/h3/glide/tests/matt1.3df deleted file mode 100644 index c02118d70b7a09cd4e8c812890313d3ca7e66bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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%0A@@9x?#-118Xy2(9)_v$Ki zUZ9yI)cg);B0LeTh!v4dBwe$tX~9e_Cy*yKT4pP&y?as1o)37Nch$D_IeyV2SA78A zMz-mk=IpOut#!a_nhQX&{|ZkoT&%^9Q9@%>1vR zCgiXAHsmg2;Gm))j{T?vl$(JlbRhD=x#B8zLlpx0+XP1zGjmsw-K!_Az4i(v@N`qB zu6-kX5DFKwPsxaxW8hdstJl@ici##mmxAwe{lYxFu{UtJ=yU)V7q}l^HO$#hI-|^C zo%&bzNu?J)L<;g&aY_=0{kvM{yV$(Pxf;9StEg91;QJ-N=fL?2c^Ts6fqclEr4%j- zp(BMFT+sPKQqwse$?ZS~<4J0giy1g6k`&v}K0((UZ_*#^6f8H3oXn@8K{| zK5#~eqMySL`idsenby?mwNT7-8Dt8M+m-bWT10||g5pt{u; zaBzs{9}0~eyv*P@w}tE<>rZnH_LbHsdIF9$(NdXzk4hIv=3*|!bA%;bOE-8fA!7v3 zP`bu>f+?pi^Ha`zxKUl>9<%qYQSkK*VBd9xdJd&<99uGA9x&5K5mRM&!hMOJ5Ge9) zdf|Px6&^?0b~s1J@>A2h7qj(TANO{H^3R zu0fk)r|fZbEn+TB_=c;HD&U|4&m#MinXus4+bwUG_jF1-5gGSM-+0&f(P7uu;~o|7 zdI(6de>NdBhe>tZAt=8r-0sM2YiNh#C+L;9nX>{0|L> zsKYVniRMM!WKIwzzTI}&lmtqn;!86BD_TwR)_a_MthN1*fZ2U z0#1Hg&nTZLKmVac9%mndex63$RCjjLw$*mgm}R@^Oj#%dzmJg-r?!xY4Vo0)bn8C~ zr!%{&SY0p+(LwQSWR^~i;C(iHo4aDEOT0kT1Gb~)cib(0yB6DozV~vH+x2tDn}GT> z_hi;Zp`vS3pZ@cTg$S?_+X;=O<$=K2(oSpW=xDoyx7ba*!;K3OE`uvuid2lERtYNS z)hvyyFKw*1ih(|zdk5a7e)h8XjN73^%0|51v8LbJujHUExV|&w*;b}s+$N+5iuA#s zHoIP1Z3jni_l&R-90}JJ))jVVzq^y2WKN(W-e`@-`f(Ee!28%5bo%oCb@cD8+(%QL zbOgLg5V?6g-RP+H0$GAm>1DI$myWI~qt^2?HhJC0q$^zfUK;xV!#gW~3yIAJ+LP4kaHN!KofE`%VeM10*7`YN=k_{}K0 z1=?ZkO2{mty2b5?n{wPcn3L2@TlnYgm40c3T-q+fakTN5Bsa}>3B5`q99{dRMz_fw zX$g96z%wyT?d4KEsZU4JWkK<-LB2IPdzY>5>99S;HZA4Rzey%0m5b%Jt1G0Ho?iKx zvW2<mDI7!A^szg~zES|y%+|arar<~b)y)TG LO^IZu`0oD&YPtbf diff --git a/glide2x/h3/glide/tests/miro.3df b/glide2x/h3/glide/tests/miro.3df deleted file mode 100644 index 313b6748691df72d531253612e431081598eba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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

m7cIAS4V0eG5 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 CG9h*V diff --git a/glide2x/h3/glide/tests/p8.3df b/glide2x/h3/glide/tests/p8.3df deleted file mode 100644 index 391f60b980b30a1b82c595f812e38f9aa34e610d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86520 zcmeFaO>Y}Xw&yKcPL)wMl6`H7QUjz!()20O^;lL3$TDHFS=?`-ZTU)W^v~NG(59Y)rKGM`Tz1LTkamr7idn}d=WDvPDGqI zC(dice|bL2zrI_$`{j%KUmkt?JU{tw-#tRUoC9@zOeALeRtvR=G}$wzyE$= z|L&%~Z!YZX)or&Io^BQv_6voDuAaMlmpZ;*c>45fm1!^BE!TaYKP!_^;Bgx7rqhf{jc^HzUqFp@amiIRX4wVzwq_b zZx;6VpDui_-@a0r?*-?Zr%xAN@jPu&KX`TZ`dY93?*792SKq7bE4{u^pI)h4LG36k zynp{*b?xh!?!q^ep$&RHRUf|6>uLKd_4j?;zP}}(fBPTm>*m5Mwc)8=UD`^Y^}4Gz z0{gwj=xep9D;Nd67~kLj?)UmzpNzG}?|a~>O!uxn^&8LJ<(|fPUt{%^Uf-x~jQ#H! zSH1ZDmF|C~vR_d~b^q=C-xmId+VqY3{B#5U6p;R zd*7(tU+dLYd)sQmJ}=$-o5rK9Iq+0t_EfN+#%=go^*+^{CA>}oAwFbH^TEP zz4&Zvz7*nTUTM7AYHM3~x+@%LJ_$!pRqmDW`bzD4rE!0+y1!Ss?`f~@Z>pXD@A|)v zK&4VHf1FOI%epF+R;yB(POJB;)$?}w{PE*&zun!<=XoXX_PMw?xm~HOtnhT@;%c?t ztMt!5Q&+isUZ%#RPU_{?$;7^`tndl!-Q9AzeV)$)3n*NVA74T&mn)UY?UfZ?pTjd~ zz+YK0cx6H4wY>cJF|D)S{44jasVkLgHtY3HCzEj;*L9q9+Htzwp)S`=r~Cbet|;QY z-{(%Z+i39VIKyGTpUI3yh)hAEGkHD zU%qyBe7{ie{g*G#%NrZMpUqNtIz1fLYSd2)fXqcpXu+V%Z#7*!>HE!Q_5R`_kZD7^ zO$&feYdW15FFKtszBoN?Ha9kC!EbRJ?Av_z-gU#xEzjEug7yQ~_140{;r^knXNSe& z>$PszTPqz7Zk7(m3&+J`@ts~{y}E;1jb9JEv?m#pO7KLN4d~QIylQxX91p zrt02W^R$o^e)l`xFE2m7rqgD#SPX9t!e;{hu6VdVxaqy_c8d$)&BM~off}_>1I7zQ zHKbOfEj;JCg+jT!vr{N!v(|t@A&U0)a=9q-{nOL+^;F7r2RFIrZ5i~-7R-0=p}K4~ z40E~ZlrcKih|WIDX2o}hhsAf@Zj9j=7qe@{<7=~V4-EA5p3DQ+-Pt)WN0IAhvy3}f zH_U^BPRIATW3LzkYlXtz9tgMRpnBhLwc>df!@f4#*L*uJhMR}atUYRrFh2XhtSc6K zJ?;*=nk$>WUoJPB#;<@5&JFKDaC%z3|DREzz};kK*!-YPK%M8lgY`ie1dEG>0@!?V z6`BY0gFzVb%b z@%i|>ZV=S#VDj@B5CqU4cWSlOD>Jc@t5-{Mq4uVW32pSDOr_;Yqym%FP zc1R2Mg;{2v&@R-|mf7q$hR$!mAG7#~1Gz5i1@IlG-?ugd0dvtP-*I}qQb|>QD1G1? zb0Cx9IbhFo?~(6Vv!P$ZJtIAviOa^LuJykJg}p1;O~*x1>59`pK3_(9UX2%-Bh>~>ibvRUBPYFX73Ma#>MQ>&Fq`=!~nWAPX$ zU(m0K3&cFZ zpO(yX-#Z<2B3_+N`@v)~x!rpIYJxs&`ZroGbo=ljzudWVUPgOsKlru%puM=*esFXY z1eB>%f&hKEdOx3+w*BC@y6Ji7`AbWQW?#L}Oemi}Xm>hGOOxAYXI4A9_vF>&ul!Z1 zj7DhU_4;`^pTBbljqO~|w;!CH9UZk=YN9m!)_ckGa+n_mH9s1=qEw8;v(_QmIA*DHqCs0??R;($mr4 zS$~^N``q46>0&MBb8>q$LL0WfG8rT#q-8G21zm3o8b+7%{WotK4Pf#e_}y*-y;9lO zplrVne10_v-T1$)|C!A8Htjgm#dn|s8EJkXtHb>EoONn5gzIgF$UNvd$g1$pot@=n zMtg71^d_`yMwRi3qMv_GrA*raM+x_3<)tjMz+_=&5E3>#8<{)^QYkn%FMA4zXvPVA zKDmd!#j~^_mot5@(E!ubG`S6rN4lUaC9K@rEHjoXSp`^C!p*mOmO7hFv;(vNexL8& z3(@)?uU=y$XB)vVWRyZ#pnV^lb0KZ9)&p%S@YplwBU32U|ehQ7;S(S z_`XT(%sa`RlKkek@2gjg)}R2eUnjQidmct`3vJDc1N0!EVYWVDkP zzc`L@Yoo|yCcPDw9A|IOXwJ9=Pi}?=8ELOOfCiDFm>1KjQGNm+n;yE}Hs8H3{h|?AW&Y1*rG2BoUhnuAIeldXO5fXi z`SQ>4wWAB^dpJao1^2wb7bW;^oZ5a*<^?joVFGU7YF%2zz|yfSJZ94y_x8ne;QOKK zL$5nHc=>W?$DrqOFJHoO;5jz$4ByAcVjCCh%_UrBfUN+=!%R|O#@fol3N*hxN6R%U zrYzdBaBPNVU#r!?E2E5z_UAtb0ld~mw^BJf1H(`doU&A^)fjs)Zgwv2@I)Av_Q4G} z2gAq<(7ly?oAuVPqtt3>U+{X<)v(c^Uzu(d1k5$Ge8(vkPfmKhN`-Yk;qr!6-hq^~ z%b+K^pZyB8gLPy`v+vDo-{FTRC(x)}!y&pgT+wmxW6rKUd2;QipZ@E$tECUCt50OR zKo?4?0_c^s8eWaJ3>v?6 z>&aEaA!|hxt*oTeKV6+Y`O}|duaVV8->*5&JzYmf(Itkd_@s63(b3FrTu{K%qjDA=kwM3 zRt|{h{cTwY^7)mO#l_|2>(^;Be(wkEkJI)8JnAbev?+m=e6v>m>-W+mZ{Ke;s`ue} z%y{@8ToIo&`ZXGv`N`qq=;XE9P@1>vHX8Uy>-F7Tq$Zw8r}1pVnRybedwsoL$4j1Q z;F(NPD^|2ipJ}~rFp;&@I#V7NA17zTNYacA6o z|KPxNN25oNkerPxP#YLSCo2>(8S__Dzm-SdraqIpz!0mc?@w+E>RJNRW}#u2Hc_ix z{AKX11+JUR<@1xT8TWm$&vh{>Iqb-v-Qcxce)*E;?SjAl zGu0zmWHP`Q+)SYVLrdZoBsG|w&M2N1!11AZU>mn#Juvu%LcLxn92`*AcmS}$w%w-; zcHMdFyRFS&0;&r)Jzd$iYZsU|JTNv~jInuPjM`acbGaM3QmK62qEKwyp*Oy8}^wymvm<`C3uLr{a?b+v)LxT&##_1ySGIND{r%o7O>7k@%&yc|NOJ{CEO%d zlNK0$!_CQUFmIj&vk*`g9x>m&2S4bp=+5Zfc)ksP_Pc4d_HMpt^M1gk@nj)6quW`` zNj6IytzA)s$FtLEwVua%I54P(ImWfU&2y$VqoGC7rytSOKYgN2c160-%K7BmubcKw6f@QUN?*UuQ)uS*72E#e#r?;R9s!+u)haO7 z*B?D18lL*^KVDx)SLavmaT)aa?K$33c%Xfz(`ev$z8j5h*W_}0H|ag2>*y$o-n=2W6P(^R~%n@Fu3(x}Edg*=r;tR6|W9jFc!fNNZ@8GvMW|YSZ*F%gY9i%EX?a_ zURj$3uLaHX4xd?Dyw@8W=5KU9;dX-s^({qj|%;lxor2n&)jDK0{6(ji6i0H-L7a zIruRWbfSat4gVX@TdWT23Q^HEW6YCkUOsu($51`gJs#hD>b>?Z=GW_sxyLLF<2Htx zA*s~%_QkxzQ>d7XK@7(zT;aXxU7jtbs`#u=ld<-xy4qbLI7P^u_zY<_j+F{vij7i)*0y*@oXI)eK3ilM{v zxo8tneAMEt9Ud~PUdKBA=TPmt(Z0yyI=BCfAK3@{sV3kH@!e&8~e= z%=&&Q(Ydju5nn?NBXVBrJzg14egW)sS=ocE1?1Bl9ia_mvq+=~eE7`kH6k_)J{%tI zuPE7@z{m4XH1($+fj=CUKFE82O+Q}PcjvSBQK7Ev-F0k>z!-XtX zgO&l+E}NI;lbP3^o9%)8QfQqlU~;y>Gu#{kyUZ>BtzSYq$NpKKlu zwBM3tmcwE2mhcYVnRVdZe0pKXieP!=HXnJ;GRup_`RqM*X|Vr~dF3BwmO)IUGm5F@ zb(h3zzx)LZgtC(vPVkK5KVz(I^zGfKZfPmWDxY0jUHzp*L@e|Vm6L&Nk<;}$wpwNx zd8N>NtPE>k19*V#Xz9D|Cmv2cJkSWYuB{A?wd}E<(w5C>lQrL=#sU4T$F8Q5Z+|RfM#=N$Eb{P2MfIR z_Li2&0#35YmCr4HQY@lh!557G!_TjgJuLn{6WZbH%mL}q@l3Exa$9eT3-4n7FFTEF zF0MPd{qiM{F1d`&Hue*`B0O6r`PC=3pTXg?MgvZU2k7%W`uXWMGaW6Jyj-$1i3k@l zh>po3w>6f1M2yCWc1J5lPbFI1ap0(zIpok9zgncK>!PO}K7+D|S3o~TN@uSrWNPGk zWf03(hMGj~nd7VqNmrCTV_fC%@ClnfXom22uV<~pGD`G1+!`Cebc!#{eBjI=YZdx9 zS>$g;=d`G(ICfee4x@@;NbZ2xuJlK=l4Jv@wU%7`!rHS9r zbTMcQ3%BKzI}Wi!NYQ9cc%jWF4Fy803CD#lu~^zKmQ9Y&Ig0Rn!@Y@N=R3LPsg&h} zQ#0BTHETr>RMWk^tthJ3pNk6{RC}jocv;~X8yoP51UeLHT*9)Cg)(uG_N4s8p#JNn5<@TXuK2WpF}4_(c+>>IPgJAGlt{_Vqav&BzW+) z$U-!ZiNs7!Ikj`&ET!ff$4|z}d@T6H%`(r}$;UMG1U@a`0`ExFm#~41{s#O@=)fRO zi@bSeOOoH3ctYsw{Px~<&cd6?UQRX^Wav50&JH={=vkKCf#d^~5#wTe0)THyyw#{1 z)}h%1>tG<+8^(UU%qa&a;0O;X)JJ*CDyPo3%55d9jL1WvqO%)xR_Nid)jB;jYq+(5 zxtC-W8s2F?For`ii?OQHDrO!WfwesG!kH&`{`$_CliQh4J0p;N%l-i56&H(!b;jN7 zXh^`rA+bhgQ-Rt`ihZ;h0QPN{0i!2K*Y4!gxOc@|%H=rw!Yw<&^VoS>P?9Yo-Qahr9_8{_rdhx;I>Om63L zd`~RP^V|2tj)}DcUE6RDMMCpNV`$gdIiNXK$aI<Simd|Ea|NVdc>Dtwqa?5|Zx_YJ6BD;He znGA!~E8xL#N>b&+O?IPzQZ2iiT6jT^+yzdgixvE@6Zk%V@vKE5!E>;}pqKNj<7{vL z{4?3*KmGLYKVAEetN)HIl?Nj^TAH1rr(oUj*kBDAsRHZj^AIYMV41iZ2f~@@zdV9 zTQ2j$FRo4Iq^(mw?PJe5?FOf8^YwLpv$g`2Zx)F^PrXGWMuYYJe4gkfI3MvT_{-se zW;-*D4apbpHN2dQ`<7)i8sVkHV7!ddez zCW;6Z)9t9oY_L2FbXFMC3yE;yDQZil9zSkB@O^>Sg&fH})&wqadI=rB53qUK?$2-U zZT!%u+YjC=YuuvFOm7FbybQ}=(`0Isl)yggBbrdX{^$|jYo1Qt`DD#z$9?mkp@CZ+ z)B}#dF252ZO>8`IQNT;!Tf8~HB+!YOpgk7hWVk2)u>IiQwss#;F->L+pNwiI zlh31hbMd#m8)pFj+^g5+MTNds_zCz9qO$aC-^gaGzwH+kMt>+6Meu4S3Tj z@4%(Sg#z;p$UHUQy*FGH3N7v41Kt^Td*P|(yUhYd%CLR;4X$~htFAp~knpj*@nYo7 zr-IdmeLfg-i;pqFDEsi(UVO~ zMH}X=-?oyn_BESFM~pjTmQXsM2@VWj7XJq2 z7=^>(Z`@#oP4*Xnx}Y9T@W@lF=ETSsixz_iohR^(&+xZFV|BlT z&2QWx-W87ySTsJ9%)GbRjSbsffc8?-JWFt}`RzHBfxe2?{pm;3tQ}osnW8D1Zi{w} zU4}dMNq#sUa3Wvvr&14kb0jUAjBv_viWT|gj`KXSdZ-l*8O`i@#9yrz@yN_K%41_O z?HgFs6~&j8;mKBt!vGtOydXue4ue3CU@t?usr@B`j*;?l|ZCiDBz zBRh>L zU3RJ(l$lNwbC3TX`1Z*=ZNh4RUO!acIu-%4<+r!7Gs5Z9Y0EB0)=2t2Z@ssCZhN=f z@o@9tU~-#Z$oRGFUPYY6dF9AdqmkL#2jQVI42e?1@=gvf>#bd^-r&wwbi5wO21`qL zXSxIP%3%++sCFXT$s8i)jy&gX*K&)=D1RDfK3aw==ck05>}3@{DQ`SEhS=?soFlX3 zTN}VCQlNQ)u)&gDfluyo*I;Y8<+m!JFYe=f^`DXTl)q{F3Rt#fqtR;pTb$QPb|D&E zoQu0fHYb^2mg_g@T08`Q5o-g^8FSA=HfH3J;E~eI@{KJd2=MNhXNBL7HFuEVFw$6# z^WZ7@tjGwKU1&MZLd}>bd8XNX^G35sIpz4u$T3Z@4|H&kM923;do({R_@7RRpv3!2 z+@yMvGnWcC(lHpwq1_THj#sLw2W zrq^Gbm#ECczqddL@ z?3L%cMP7vEoiO&MZ5z!d*k}C^Woj1+qf27s$Xqh4S=of@nPW+=vFD9O=`>lR%stCB zXO|23l;^#9LykGC&VHQZ4hJ`0W9^o-B2Ax`ke6&T1O5Q^iGC()g2KG?(P~nyxK&`+r=Z4IDso-dYraFLGAEIk6N# zA)_4l(%;$BLSKl1G5FwFRj{+c#a;)ldvXHzH~7pd+G??w_MS8%vGy3pA$9S#(`h0lP1;6EHffuPakxFP58P$!ZRbs>l9)vH6@Gs6BU(-b{gJrUSL8cq%PWU}k`tTv8&;t$*fXQFjR5>TaJoF}U7+pi{ z0xGHpwr10o@qJ1W>4Qz+t>S?!vz%Cfl6?B?3qQ|&XZQ2-GBy@=Mdw^__EAS`X8&~4 zl6kkBZ_}oCch6(bIyv8VraAixa<;j}ysJVg)r+&tu>r6{JRbIXoo__e+dl7T?MdD` zwt?%{AL~Lx=l#wd&NXj8SYF19pJbPlJ#Lb{ogH1uG-g)8t}e7QqAAGR{;f_V11H__X*=?f%gt_ZfpUq30=ngxCugKvE&_Y>(wa`^ z+i&kKkzr0`JGti8f_SU{5iOhN-ur$m$E>jfCzxfaLR!-QXWSvj+w#9H7mzg#`4t=} z`}-N6r>E!2Jxx|ZEFbtb@Qm#3O{aJzv5~VvVokSqzFl5KQ^t#>7R)5O*`VlMiDHu8 zZdyhh(lhz4)>1S;a!>KgCGah$l*s74JiDQj?j9$mgV?PPBbmm{e35dd{T|}{3?lIE5on}t{ zy48J&dq2)O|4%_<*0Gjx;dx712~R=_ozLE1W?q-ez8~-6A?!nUN#?h(e3AK$%?jE> z^EGLBb`9%VCewaE{utB*W^MF&Co_4_y|PO5EYk06h7}gtv#fLSoUqXohs?@i6mEIQ zP=1nKPFpPd9N5Qk77nY^>>4_jon@Y2lvZ%TQ~ojU{OZ-Q<`Z*}*y(JRh&@_N#{E3@ zo>4%LvE3G8p8t2sW5q3wFHbVZ!d28R0PF+-4p@7MYD>;C=X7}JAD^Z1{9KMaQ*jJs z{a=0Z;i@wKE&Kc(7~pgqV%T}1-wkfU@5w)A7O={*!zg>e$;P8q-gcHlkFz}m51$cF z$1biL8@fBc0G49|x)@ou3F!~NNh%Cbu>4}D{! z)#`N2JI^_8z%mY_S)jRKdsJMDImX-U>Xj44_^@?NAflK5%@%0ANqU_0^sOTJ2K~;|W!-tA(zeB_;G4IJP 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 diff --git a/glide2x/h3/glide/tests/plib.c b/glide2x/h3/glide/tests/plib.c deleted file mode 100644 index aac8164..0000000 --- a/glide2x/h3/glide/tests/plib.c +++ /dev/null @@ -1,1397 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - -/* static helper prototypes */ -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/h3/glide/tests/plib.h b/glide2x/h3/glide/tests/plib.h deleted file mode 100644 index 933e272..0000000 --- a/glide2x/h3/glide/tests/plib.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/qatest00.c b/glide2x/h3/glide/tests/qatest00.c deleted file mode 100644 index 0690717..0000000 --- a/glide2x/h3/glide/tests/qatest00.c +++ /dev/null @@ -1,1239 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL} }, - { {GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL} }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre = 0, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre = 0, /* last algo texture */ - hFstDwnlTxtre = 0, /* first lod download texture */ - hLstDwnlTxtre = 0, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) - { - if ( rv == -1 ) - { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", tlGetResolutionList() ); - exit(1); - } - - switch( match ) - { - case 'n': - frames = atoi( remArgs[0] ); - break; - - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], &scrWidth, &scrHeight ); - break; - } - } /* while */ - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - - if ( frames == -1 ) - { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, 60, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - exit(1); -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/h3/glide/tests/qatest00.h b/glide2x/h3/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/h3/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/qatest01.c b/glide2x/h3/glide/tests/qatest01.c deleted file mode 100644 index 7e9bcd1..0000000 --- a/glide2x/h3/glide/tests/qatest01.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -int main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/rgb332.3df b/glide2x/h3/glide/tests/rgb332.3df deleted file mode 100644 index f06219ae82ac55624b8fa021bacc569e2afc0956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87432 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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while(( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) )) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - diff --git a/glide2x/h3/glide/tests/test01.c b/glide2x/h3/glide/tests/test01.c deleted file mode 100644 index deae094..0000000 --- a/glide2x/h3/glide/tests/test01.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test02.c b/glide2x/h3/glide/tests/test02.c deleted file mode 100644 index 03a74a3..0000000 --- a/glide2x/h3/glide/tests/test02.c +++ /dev/null @@ -1,159 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test03.c b/glide2x/h3/glide/tests/test03.c deleted file mode 100644 index 2205235..0000000 --- a/glide2x/h3/glide/tests/test03.c +++ /dev/null @@ -1,154 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen(0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test04.c b/glide2x/h3/glide/tests/test04.c deleted file mode 100644 index 3c33d77..0000000 --- a/glide2x/h3/glide/tests/test04.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test05.c b/glide2x/h3/glide/tests/test05.c deleted file mode 100644 index 11829a4..0000000 --- a/glide2x/h3/glide/tests/test05.c +++ /dev/null @@ -1,191 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test06.c b/glide2x/h3/glide/tests/test06.c deleted file mode 100644 index 9ef1cd6..0000000 --- a/glide2x/h3/glide/tests/test06.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test07.c b/glide2x/h3/glide/tests/test07.c deleted file mode 100644 index da05ef3..0000000 --- a/glide2x/h3/glide/tests/test07.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + alpha blend on constant alpha */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test08.c b/glide2x/h3/glide/tests/test08.c deleted file mode 100644 index 90d26ec..0000000 --- a/glide2x/h3/glide/tests/test08.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test09.c b/glide2x/h3/glide/tests/test09.c deleted file mode 100644 index 9a9d0de..0000000 --- a/glide2x/h3/glide/tests/test09.c +++ /dev/null @@ -1,212 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) )) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test10.c b/glide2x/h3/glide/tests/test10.c deleted file mode 100644 index 9cb1d70..0000000 --- a/glide2x/h3/glide/tests/test10.c +++ /dev/null @@ -1,207 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - - - diff --git a/glide2x/h3/glide/tests/test11.c b/glide2x/h3/glide/tests/test11.c deleted file mode 100644 index 305bc66..0000000 --- a/glide2x/h3/glide/tests/test11.c +++ /dev/null @@ -1,260 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(0); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - exit(1); - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/h3/glide/tests/test12.c b/glide2x/h3/glide/tests/test12.c deleted file mode 100644 index 4abd5e1..0000000 --- a/glide2x/h3/glide/tests/test12.c +++ /dev/null @@ -1,345 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -int -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - exit(1); - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} /* main */ - - - diff --git a/glide2x/h3/glide/tests/test13.c b/glide2x/h3/glide/tests/test13.c deleted file mode 100644 index 740c29c..0000000 --- a/glide2x/h3/glide/tests/test13.c +++ /dev/null @@ -1,174 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test14.c b/glide2x/h3/glide/tests/test14.c deleted file mode 100644 index 42170ed..0000000 --- a/glide2x/h3/glide/tests/test14.c +++ /dev/null @@ -1,184 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - short zBias; - short zDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test15.c b/glide2x/h3/glide/tests/test15.c deleted file mode 100644 index 95d820d..0000000 --- a/glide2x/h3/glide/tests/test15.c +++ /dev/null @@ -1,217 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test16.c b/glide2x/h3/glide/tests/test16.c deleted file mode 100644 index a696250..0000000 --- a/glide2x/h3/glide/tests/test16.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test17.c b/glide2x/h3/glide/tests/test17.c deleted file mode 100644 index d2e7a01..0000000 --- a/glide2x/h3/glide/tests/test17.c +++ /dev/null @@ -1,292 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test18.c b/glide2x/h3/glide/tests/test18.c deleted file mode 100644 index 20bdaa5..0000000 --- a/glide2x/h3/glide/tests/test18.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test19.c b/glide2x/h3/glide/tests/test19.c deleted file mode 100644 index 7867175..0000000 --- a/glide2x/h3/glide/tests/test19.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; - -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} diff --git a/glide2x/h3/glide/tests/test20.c b/glide2x/h3/glide/tests/test20.c deleted file mode 100644 index f99640f..0000000 --- a/glide2x/h3/glide/tests/test20.c +++ /dev/null @@ -1,320 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test21.c b/glide2x/h3/glide/tests/test21.c deleted file mode 100644 index 4aec274..0000000 --- a/glide2x/h3/glide/tests/test21.c +++ /dev/null @@ -1,374 +0,0 @@ - /* -** -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test22.c b/glide2x/h3/glide/tests/test22.c deleted file mode 100644 index 042cf3d..0000000 --- a/glide2x/h3/glide/tests/test22.c +++ /dev/null @@ -1,306 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/test23.c b/glide2x/h3/glide/tests/test23.c deleted file mode 100644 index ff48f4d..0000000 --- a/glide2x/h3/glide/tests/test23.c +++ /dev/null @@ -1,260 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - int speed; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/h3/glide/tests/test24.c b/glide2x/h3/glide/tests/test24.c deleted file mode 100644 index 1d6b088..0000000 --- a/glide2x/h3/glide/tests/test24.c +++ /dev/null @@ -1,255 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/h3/glide/tests/test25.c b/glide2x/h3/glide/tests/test25.c deleted file mode 100644 index 7864a0f..0000000 --- a/glide2x/h3/glide/tests/test25.c +++ /dev/null @@ -1,898 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - */ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime = 0; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame = 0, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nrbtea", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( remArgs[0] ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %ld\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); - exit(0); -} diff --git a/glide2x/h3/glide/tests/test26.c b/glide2x/h3/glide/tests/test26.c deleted file mode 100644 index 08a09e9..0000000 --- a/glide2x/h3/glide/tests/test26.c +++ /dev/null @@ -1,370 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "bdnr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - exit(1); - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - exit(0); -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 256; - FxU32 shortStride = 256; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+x]; - shortColor = ((0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f)); - shortData[y*shortStride+x] = shortColor; - break; - - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*256+x]; - longColor = ((0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8)); - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/h3/glide/tests/test27.c b/glide2x/h3/glide/tests/test27.c deleted file mode 100644 index 95cbf3a..0000000 --- a/glide2x/h3/glide/tests/test27.c +++ /dev/null @@ -1,204 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "Nnr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'N': - doNothing = 1; - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - grGlideShutdown(); - exit(0); -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/h3/glide/tests/test28.c b/glide2x/h3/glide/tests/test28.c deleted file mode 100644 index 79e5d32..0000000 --- a/glide2x/h3/glide/tests/test28.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -int main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - exit(1); - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - exit(0); -} - - - diff --git a/glide2x/h3/glide/tests/testdesc.txt b/glide2x/h3/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/h3/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/h3/glide/tests/testimg.bat b/glide2x/h3/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/h3/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/h3/glide/tests/tldata.inc b/glide2x/h3/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/h3/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/h3/glide/tests/tlib.c b/glide2x/h3/glide/tests/tlib.c deleted file mode 100644 index 408d306..0000000 --- a/glide2x/h3/glide/tests/tlib.c +++ /dev/null @@ -1,1787 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#include -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = (float)fontTable[(int) character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = (float)fontTable[(int) character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - return !!fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/h3/glide/tests/tlib.h b/glide2x/h3/glide/tests/tlib.h deleted file mode 100644 index d21dce9..0000000 --- a/glide2x/h3/glide/tests/tlib.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#define NDEBUG -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/h3/glide/tests/yiq.3df b/glide2x/h3/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5d95988c8b3e6585f30064d68b6ed2fe5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87319 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 Gmia$yEDt#V diff --git a/glide2x/h3/include/makefile b/glide2x/h3/include/makefile deleted file mode 100644 index 28ecd22..0000000 --- a/glide2x/h3/include/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = *.h - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/h3/include/makefile.linux b/glide2x/h3/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/h3/include/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/incsrc/fxhal.h b/glide2x/h3/incsrc/fxhal.h deleted file mode 100644 index 0c9d1c0..0000000 --- a/glide2x/h3/incsrc/fxhal.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef __FXHAL_H__ -#define __FXHAL_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#if defined(BUILD_HAL) -#define FX_DLL_DEFINITION -#endif -#include -#include - -#include - -// Allow SourceSafe to track Revision values -#define HAL_H_REV "$Revision$" - -// Just to unconfuse myself: -// -// CHIP FBI-REV TMU-REV DEV-ID -// SST1-0.6u 1 0 1 -// SST1-0.5u 2 1 1 -// SST-96 2 (1) 2 -// H3 A0 1 4 3 -// H3 A1 2 4 3 -// H3 B0 3 4 3 -// H4_OEM 1 4 4 -// H4 1 4 5 - -#define SST_DEVICE_ID_SST1 1 -#define SST_DEVICE_ID_SST96 2 -#define SST_DEVICE_ID_H3 3 -#define SST_DEVICE_ID_H4_OEM 4 -#define SST_DEVICE_ID_H4 5 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 4 - -//---------------------------------------------------------------------- -// the root of all Hal information -//---------------------------------------------------------------------- -typedef struct { - int csim; - int hsim; - int hw; - int csimio; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -//---------------------------------------------------------------------- -/* -** SST Hardware Initialization routine protypes -** -** If all initialization routines are called, it is assumed they are called -** in the following order: -** 0. fxHalInit(); -** 1. fxHalMapBoard(); -** 2. fxHalInitRegisters(); -** 3. fxHalInitGamma(); -** 4. fxHalInitVideo(); -** 5. fxHalShutdown(); -** -** fxHalShutdown() is called at the end of an application to turn off -** the graphics subsystem -** -*/ - -FX_ENTRY void FX_CALL fxHalPutenv(char *buf); -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); -FX_ENTRY FxU32 FX_CALL fxHalNumBoardsInSystem(void); -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); -FX_ENTRY FxBool FX_CALL fxHalInitCmdFifo( SstRegs *sst, int which, FxU32 fifoStart, - FxU32 size, FxBool directExec, FxBool disableHoles, FxBool agpEnable); -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitRenderingRegisters(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitGuiRegisters(SstGRegs *sstg); -FX_ENTRY FxBool FX_CALL fxHalInitCmdAgpRegisters(SstCRegs *sstc); -FX_ENTRY FxBool FX_CALL fxHalInitGamma(SstRegs *sst, FxFloat gamma); -FX_ENTRY FxBool FX_CALL fxHalInitGammaRGB(SstRegs *sst, FxFloat r, FxFloat g, FxFloat b); -FX_ENTRY FxBool FX_CALL fxHalInitVideo(SstRegs *sst, FxU32 resolution, - FxU32 refresh, FxVideoTimingInfo *); -FX_ENTRY FxBool FX_CALL fxHalIdle(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNop(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdle2(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalIdleNoNop2(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalInitUSWC(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalShutdown(SstRegs *sst); -FX_ENTRY void FX_CALL fxHalShutdownAll(void); -FX_ENTRY FxBool FX_CALL fxHalGetDeviceInfo(SstRegs *sst, FxDeviceInfo *); - -FX_ENTRY FxBool FX_CALL fxHalVsync(SstRegs *sst); -FX_ENTRY FxBool FX_CALL fxHalVsyncNot(SstRegs *sst); - -FX_ENTRY void FX_CALL -fxHalInitVideoOverlaySurface( - SstRegs *sst, // pointer to hw - FxU32 enable, // 1=enable Overlay surface (OS), 1=disable - FxU32 stereo, // 1=enable OS stereo, 0=disable - FxU32 horizScaling, // 1=enable horizontal scaling, 0=disable - FxU32 dudx, // horizontal scale factor (ignored if not - // scaling) - FxU32 verticalScaling, // 1=enable vertical scaling, 0=disable - FxU32 dvdy, // vertical scale factor (ignored if not - // scaling) - FxU32 filterMode, // duh - FxU32 tiled, // 0=OS linear, 1=tiled - FxU32 pixFmt, // pixel format of OS - FxU32 clutBypass, // bypass clut for OS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of OS - FxU32 stride); // distance between scanlines of the OS, in - // units of bytes for linear OS's and - // tiles for tiled OS's - -#if !defined(MSVC16) && !defined(THUNK32) && !defined(DIRECTX) - - #define GET8(s) s - #define GET16(s) s - #define GET(s) s - #define SET8(d,s) d = s - #define SET16(d,s) d = s - #define SET(d,s) d = s - #define SETF(d,s) (*(float *)&(d)) = s - - #define AGPMEMINIT() GDBG_ERROR("AGPMEMINIT","nyi for hardware\n"); - #define AGPMEMALLOC(sst,size) GDBG_ERROR("AGPMEMALLOC","nyi for hardware\n"); - #define AGPWRV(v,d) (v) = (d) - #define AGPRDV(v) (v) - #define AGPWRP(aHi,aLo,d) AGPWRV( *agpPhysToVirt(aHi,aLo), d ) - #define AGPRDP(aHi,aLo) AGPRDP( *agpPhysToVirt(aHi,aLo) ) - -#define GET_IO8(p) pioInByte(p) -#define GET_IO16(p) pioInWord(p) -#define GET_IO(p) pioInLong(p) -#define SET_IO8(p,d) pioOutByte(p,d) -#define SET_IO16(p,d) pioOutWord(p,d) -#define SET_IO(p,d) pioOutLong(p,d) - -#endif // #if !defined(MSVC16) && !defined(THUNK32) && !defined(DIRECTX) - -//--------------------------------------------------------------------------- -// internal HAL stuff not meant for external use -//--------------------------------------------------------------------------- -#if defined(BUILD_HAL) || defined(BUILD_DIAGS) - -// GMT: Init code SET/GET always go thru subroutines (allows for P6 fencing) -#define IGET(A) fxHalRead32((FxU32 *) &(A)) -#define ISET(A,D) fxHalWrite32((FxU32 *) &(A), D) - - - -// this is the FAKE address where the hardware lives -// we use a large address so attempts to write to it get an access violation -// and it has 28 zero bits so that we can easily figure out the board number -// and the offset into the board -#define SST_BAD_ADDRESS(a) (((FxU32)a&0xF0000000)==0 || ((FxU32)a&0x0C000000)!=0) -#define SST_FAKE_ADDRESS_MAKE(boardNum) (SstRegs *)(0x200000|((boardNum+1)<<28)) -#define SST_FAKE_ADDRESS_GET_BOARD(a) ((((FxU32)a>>28)&0xF)-1) -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE_OFFSET(a) ((FxU32)a&0x01FFFFFF) -#define SST_FAKE_ADDRESS_GET_BASE(a) ( ((FxU32)a&BIT(25))>>25 ) - -#define SST_BAD_PORT(a) (((FxU32)a&0xF000)==0) -#define SST_FAKE_PORT_MAKE(boardNum) (FxU16)((boardNum+1)<<12) -#define SST_FAKE_PORT_GET_BOARD(a) ((((FxU16)a>>12)&0xF)-1) -#define SST_FAKE_PORT_GET_OFFSET(a) ((FxU16)a&0x0FFF) - -extern HalInfo halInfo; - -// internal HAL routines -FxU32 fxHalRead32(FxU32 *addr); -void fxHalWrite32(FxU32 *addr, FxU32 data); - -void fxHalResetBoardInfo( FxDeviceInfo *info ); -FxBool fxHalFillDeviceInfo( SstRegs *sst ); -// FxBool fxHalGetFbiInfo( SstRegs *sst, FxDeviceInfo *info ); -// FxBool fxHalGetTmuInfo( SstRegs *sst, FxDeviceInfo *info ); -FxBool fxHalVaddrToBoardNumber( SstRegs *sst, FxU32 *boardNumber ); - -// GUI interface -FX_ENTRY void FX_CALL guiNewViewWindow(FxU32 boardNumber, const char *name); -void guiReadMessageQueue(void); -FxBool guiOpen( FxU32 boardNumber ); -void guiShutdown( SstRegs *sst ); - -#endif /* BUILD_HAL */ - -#endif /* !__FXHAL_H__ */ diff --git a/glide2x/h3/incsrc/fxvid.h b/glide2x/h3/incsrc/fxvid.h deleted file mode 100644 index 3750091..0000000 --- a/glide2x/h3/incsrc/fxvid.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __FX_VID_H__ -#define __FX_VID_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -/* Get old resolution/refresh definitions */ -#include - -/* XXX GMT: some of these are still machine dependent */ -typedef struct { - FxU32 hSyncOn; - FxU32 hSyncOff; - FxU32 vSyncOn; - FxU32 vSyncOff; - FxU32 hBackPorch; - FxU32 vBackPorch; - FxU32 xDimension; - FxU32 yDimension; - FxU32 memOffset; - FxU32 memFifoEntries_1MB; - FxU32 memFifoEntries_2MB; - FxU32 memFifoEntries_4MB; - FxU32 tilesInX_Over2; - FxU32 vFifoThreshold; - FxBool video16BPPIsOK; - FxBool video24BPPIsOK; - float clkFreq16bpp; - float clkFreq24bpp; -} FxVideoTimingInfo; - -#endif /* __FX_VID_H__ */ diff --git a/glide2x/h3/incsrc/gdebug.h b/glide2x/h3/incsrc/gdebug.h deleted file mode 100644 index 5bb405b..0000000 --- a/glide2x/h3/incsrc/gdebug.h +++ /dev/null @@ -1,144 +0,0 @@ -/*-*-c++-*-*/ -#ifndef __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include - -#if defined(FX_DLL_ENABLE) -#define FX_DLL_DEFINITION - -#endif -#include -#include - -#define GDBG_MAX_LEVELS 512 - -#ifndef GETENV -#ifndef __linux__ -#define GETENV(a) getenv(a) -#else -#define GETENV hwcGetenv -#endif -#endif - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) \ - gdbg_info(level, format , ## args) -#define GDBG_INFO_MORE(level, format, args...) \ - gdbg_info_more(level, format , ## args) -#define GDBG_PRINTF(format, args...) \ - gdbg_printf(format , ## args) - -#else - -#define GDBG_INFO gdbg_info -#define GDBG_INFO_MORE gdbg_info_more -#define GDBG_PRINTF gdbg_printf - -#endif - -#define GDBG_ERROR_SET_CALLBACK gdbg_error_set_callback -#define GDBG_ERROR_CLEAR_CALLBACK gdbg_error_clear_callback - -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel - -// otherwise GDBG_INFO does nothing -#else - -#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) -/* Turn off the dead code warnings. Also changed the macro definitions - * to use an 'if' rather than the ternary operator because the - * type of the result sub-expressions must match. - * - * w111: Meaningless use of an expression - * w201: Unreachable code - * w302: Expression only useful for side-effects. - */ -#pragma disable_message (111, 201, 302) -#endif /* defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__) */ - -// Standard C provides no clean way to do this, but the GNU C tools do.. -#ifdef __GNUC__ - -#define GDBG_INFO(level, format, args...) -#define GDBG_INFO_MORE(level, format, args...) -#define GDBG_PRINTF(format, args...) - -#else - -#define GDBG_INFO 0 && (unsigned long) -#define GDBG_INFO_MORE 0 && (unsigned long) -#define GDBG_PRINTF 0 && (unsigned long) - -#define GDBG_ERROR_SET_CALLBACK 0 && (unsigned long) -#define GDBG_ERROR_CLEAR_CALLBACK 0 && (unsigned long) - -#endif - -#define GDBG_GET_DEBUGLEVEL(x) 0 -#define GDBG_SET_DEBUGLEVEL(a,b) - - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_SHUTDOWN gdbg_shutdown -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_parse(const char *env); -FX_ENTRY void FX_CALL gdbg_shutdown(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); - -// these routines allow for a library (like Glide) to get called back -typedef void (*GDBGErrorProc)(const char* const procName, - const char* const format, - va_list args); -FX_ENTRY int FX_CALL gdbg_error_set_callback(GDBGErrorProc p); -FX_ENTRY void FX_CALL gdbg_error_clear_callback(GDBGErrorProc p); - -// these routines allow for some GUI code to get called once in a while -// so that it can keep the UI alive by reading the message queue -typedef void (*GDBGKeepAliveProc)(int adjust); -FX_ENTRY void FX_CALL gdbg_set_keepalive(GDBGKeepAliveProc p); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/h3/incsrc/h3.h b/glide2x/h3/incsrc/h3.h deleted file mode 100644 index abc73cb..0000000 --- a/glide2x/h3/incsrc/h3.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __H3_H__ -#define __H3_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include <3dfx.h> -#include -#include -#include -#include -#include -#include -#include - -#endif /* !__H3_H__ */ diff --git a/glide2x/h3/incsrc/h3cinit.h b/glide2x/h3/incsrc/h3cinit.h deleted file mode 100644 index a078997..0000000 --- a/glide2x/h3/incsrc/h3cinit.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*-c++-*- */ -/* $Header$ */ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** File name: h3cinit.h -** -** Description: Macros & function definitions for Banshee/Avenger. -** -** $Revision$ -** $Date$ -** -** $History: h3cinit.h $ -** -** ***************** Version 1 ***************** -** User: Sapphire Date: 2/17/99 Time: 8:26p -** Created in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/INCSRC -** -** ***************** Version 21 ***************** -** User: Michael Date: 1/05/99 Time: 8:45a -** Updated in $/devel/h3/Win95/dx/minivdd -** Implement the 3Dfx/STB unified header. -** -*/ - - -#ifndef __H3CINIT_H__ -#define __H3CINIT_H__ - -#include <3dfx.h> - -#define H3_GRXCLK_SPEED 100 -#define H4_GRXCLK_SPEED 143 -#define H4_OEM_GRXCLK_SPEED 141 -#define H4_BRINGUP_GRXCLK_SPEED 100 - -#ifdef H4 -#define DEFAULT_GRXCLK_SPEED H4_BRINGUP_GRXCLK_SPEED -#else -#define DEFAULT_GRXCLK_SPEED H3_GRXCLK_SPEED -#endif - -FxU32 // return # of MB of memory -h3InitGetMemSize(FxU32 regBase);// init register base - -FxU32 // return # of MB of memory -h3InitSgram(FxU32 regBase, // init iegister base - FxU32 sgramMode, - FxU32 sgramMask, - FxU32 sgramColor, - char *vendorName); // NULL or name of SGRAM vendor - -void -h3InitPlls(FxU32 regBase, // init iegister base - FxU32 grxSpeedInMHz, // desired GRX clock frequency (MHz) - FxU32 memSpeedInMHz); // desired MEM clock frequency (MHz) - -void -h4InitPlls(FxU32 regBase, // init register base - FxU32 deviceID, // H4 or H4_OEM - FxU32 grxSpeedInMHz); // desired clock frequency (MHz) - -void -h3InitVga( - FxU32 regBase, // memory base address - FxU32 legacyDecode); // 1=enable VGA decode, 0=disable - -void -h3InitVideoProc( - FxU32 regBase, // memory base address - FxU32 vidProcCfg); // vidProcCfg register control bits - -FxBool -h3InitSetVideoMode( - FxU32 regBase, // memory base address - FxU32 xRes, // x resolution - FxU32 yRes, // y resolution - FxU32 refresh, // refresh freq -#if defined(H3VDD) - FxU32 loadClut, // really a bool, should we load the lookup table - FxU32 scanlinedouble); // set scanline double bit and double y? -#else - FxU32 loadClut) ; // initialize clut entries? -#endif - -void -h3InitVideoDesktopSurface( - FxU32 regBase, - FxU32 enable, // 1=enable desktop surface (DS), 1=disable - FxU32 tiled, // 0=DS linear, 1=tiled - FxU32 pixFmt, // pixel format of DS - FxU32 clutBypass, // bypass clut for DS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of DS - FxU32 stride); // distance between scanlines of the DS, in - // units of bytes for linear DS's and tiles for - // tiled DS's - -void -h3InitVideoOverlaySurface( - FxU32 regBase, - FxU32 enable, // 1=enable Overlay surface (OS), 1=disable - FxU32 stereo, // 1=enable OS stereo, 0=disable - FxU32 horizScaling, // 1=enable horizontal scaling, 0=disable - FxU32 dudx, // horizontal scale factor (ignored if not - // scaling) - FxU32 verticalScaling, // 1=enable vertical scaling, 0=disable - FxU32 dvdy, // vertical scale factor (ignored if not - // scaling) - FxU32 filterMode, // duh - FxU32 tiled, // 0=OS linear, 1=tiled - FxU32 pixFmt, // pixel format of OS - FxU32 clutBypass, // bypass clut for OS? - FxU32 clutSelect, // 0=lower 256 CLUT entries, 1=upper 256 - FxU32 startAddress, // board address of beginning of OS - FxU32 stride); // distance between scanlines of the OS, in - // units of bytes for linear OS's and tiles for - // tiled OS's - -#ifndef H3VDD -void -h3InitMeasureSiProcess( - FxU32 regBase); // init register base -#endif // #ifndef H3VDD - -void -h3InitBlockWrite( - FxU32 regBase, - FxU32 enable, // 1=enable block writes, 0=disable - FxU32 threshhold); // block write threshhold - -void -h3InitResetAll( - FxU32 regBase); // init register base - -#endif /* __H3CINIT_H__ */ - diff --git a/glide2x/h3/incsrc/h3defs.h b/glide2x/h3/incsrc/h3defs.h deleted file mode 100644 index af1f393..0000000 --- a/glide2x/h3/incsrc/h3defs.h +++ /dev/null @@ -1,1346 +0,0 @@ -#ifndef __H3DEFS_H__ -#define __H3DEFS_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#if defined(H4) -#define MAX_NUM_TMUS 2 -#else -#define MAX_NUM_TMUS 1 -#endif - -// SST commands -#define SST_NOPCMD 1 -#define SST_TRIANGLECMD 2 -#define SST_FASTFILLCMD 3 -#define SST_SWAPBUFCMD 4 -#define SST_SBEGINTRICMD 5 -#define SST_SDRAWTRICMD 6 -#define SST_USERINTRCMD 7 - -// this crazy macro fixes the binary point within a floating point -// number so that it has 'fracbits' to the right of the binary point -// it also adds a '1' bit to the MSB so that slightly negative numbers -// end up looking like twos complement numbers (they carry out from the '1') -#define FLOAT_FIX(f,fracbits) ((f)+(float)(3L<<(22-(fracbits)))) - -#define SST_FLOAT(f,scale,shift) (unsigned long)((f)*((scale)*(float)(1L<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000L) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -#define BIT(n) (1UL<<(n)) -#define SST_MASK(n) (0xFFFFFFFFL >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST status bits --------------------------- -#define SST_FIFOLEVEL 0x3F -#define SST_PCIFIFO_FREE 0x1F -#define SST_PCIFIFO_BUSY BIT(5) -#define SST_VRETRACE BIT(6) -#define SST_FBI_BUSY BIT(7) -#define SST_TMU_BUSY BIT(8) -#define SST_TREX_BUSY SST_TMU_BUSY -#define SST_BUSY BIT(9) -#define SST_GUI_BUSY BIT(10) -#define SST_CMD0_BUSY BIT(11) -#define SST_CMD1_BUSY BIT(12) -#define SST_SWAPBUFPENDING_SHIFT 28 -#define SST_SWAPBUFPENDING (0x7L<= SST_IO_OFFSET && (a) < SST_CMDAGP_OFFSET ) -#define SST_IS_CMDAGP_ADDR(a) ( (a) >= SST_CMDAGP_OFFSET && (a) < SST_2D_OFFSET ) -#define SST_IS_2D_ADDR(a) ( (a) >= SST_2D_OFFSET && (a) < SST_3D_OFFSET ) -#define SST_IS_3D_ADDR(a) ( (a) >= SST_3D_OFFSET && (a) < SST_3D_ALT_OFFSET ) -#define SST_IS_3D_ALT_ADDR(a) ( (a) >= SST_3D_ALT_OFFSET && (a) < SST_TEX_OFFSET ) -#ifdef H4 -#define SST_IS_TEX_ADDR(a) ( (a) >= SST_TEX0_OFFSET && (a) < SST_RESERVED_OFFSET ) -#define SST_IS_TEX0_ADDR(a) ( (a) >= SST_TEX0_OFFSET && (a) < SST_TEX1_OFFSET ) -#define SST_IS_TEX1_ADDR(a) ( (a) >= SST_TEX1_OFFSET && (a) < SST_RESERVED_OFFSET ) -#else -#define SST_IS_TEX_ADDR(a) ( (a) >= SST_TEX_OFFSET && (a) < SST_RESERVED_OFFSET ) -#endif -#define SST_IS_RESERVED_ADDR(a) ( (a) >= SST_RESERVED_OFFSET && (a) < SST_YUV_OFFSET ) -#define SST_IS_YUV_ADDR(a) ( (a) >= SST_YUV_OFFSET && (a) < SST_LFB_OFFSET ) -#define SST_IS_LFB_ADDR(a) ( (a) >= SST_LFB_OFFSET && (a) < SST_RAW_LFB_OFFSET ) -#define SST_IS_RAW_LFB_ADDR(a) ( (a) >= SST_RAW_LFB_OFFSET && (a) < SST_MAX_LEGAL_OFFSET ) - -#define SST_IS_REGISTER_ADDR(a) ( (a) >= SST_IO_OFFSET && (a) < SST_TEX_OFFSET ) - -#define SST_BASE_ADDRESS(sst) ((FxI32)(sst)-SST_3D_OFFSET) -#define SST_IO_ADDRESS(sst) (SST_IO_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_CMDAGP_ADDRESS(sst) (SST_CMDAGP_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_GUI_ADDRESS(sst) (SST_2D_OFFSET+SST_BASE_ADDRESS(sst)) -#ifdef H4 -#define SST_TEX_ADDRESS(sst) (SST_TEX0_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_TEX0_ADDRESS(sst) (SST_TEX0_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_TEX1_ADDRESS(sst) (SST_TEX1_OFFSET+SST_BASE_ADDRESS(sst)) -#else -#define SST_TEX_ADDRESS(sst) (SST_TEX_OFFSET+SST_BASE_ADDRESS(sst)) -#endif -#define SST_LFB_ADDRESS(sst) (SST_LFB_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_YUV_ADDRESS(sst) (SST_YUV_OFFSET+SST_BASE_ADDRESS(sst)) -#define SST_PORT_ADDRESS(sst) (SST_FAKE_PORT_MAKE(SST_FAKE_ADDRESS_GET_BOARD(sst))) - -#define SST_IS_MOVECMD(iaddr) (iaddr >= (SST_CMDAGP_OFFSET + AGPREQSIZE) && iaddr <= (SST_CMDAGP_OFFSET + MOVECMD)) - - - -// SET macros for FBI -#define SET_FBI(d,s) SET (*(&(d)+0x100),s) -#define SET_FBIF(d,s) SETF(*(&(d)+0x100),s) - -// SET macros for TMU0 -#define SET_0(d,s) SET (*(&(d)+0x200),s) -#define SET_0F(d,s) SETF(*(&(d)+0x200),s) - -// SET macros for FBI+TMU0 -#define SET_FBI_0(d,s) SET (*(&(d)+0x300),s) -#define SET_FBI_0F(d,s) SETF(*(&(d)+0x300),s) - -// SET macros for TMU1 -#define SET_1(d,s) SET (*(&(d)+0x400),s) -#define SET_1F(d,s) SETF(*(&(d)+0x400),s) - -// SET macros for FBI+TMU1 -#define SET_FBI_1(d,s) SET (*(&(d)+0x500),s) -#define SET_FBI_1F(d,s) SETF(*(&(d)+0x500),s) - -#endif /* !__H3DEFS_H__ */ - diff --git a/glide2x/h3/incsrc/h3gdefs.h b/glide2x/h3/incsrc/h3gdefs.h deleted file mode 100644 index 44c2121..0000000 --- a/glide2x/h3/incsrc/h3gdefs.h +++ /dev/null @@ -1,307 +0,0 @@ -#ifndef __H3GDEFS_H__ -#define __H3GDEFS_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -// STB Begin Changes -// STB-SR 1/13/98 Adding code for bj -#ifdef _H2INC -#include "cmddefs.h" -#endif - -#ifndef _H2INC -// STB End Changes - -// compute 2D base from 3D base -#define SSTG_CHIP(sst) ((SstGRegs *)SST_GUI_ADDRESS(sst)) - -// STB Begin Changes -#endif -// STB End Changes - - -#define SSTG_XY_SIZE 13 - -//----------------- SSTG command bits --------------------------- -#define SSTG_COMMAND_SHIFT 0 -#define SSTG_COMMAND (0xF<>4)&0xF) == (rop&0xF) - -// It's so annoying to have to put that << in real code, I'm shifting -// the rops here, damnit -#define SSTG_ROP_SRCCOPY (0xccUL << SSTG_ROP0_SHIFT) - -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- -//----------------------- CMDFIFO Section --------------------------- - -// CVG/H3 abstraction -#define SSTC_IS_EITHER_CMDFIFO_ENABLED(sstc) \ - (((sstc)->cmdFifo0.baseSize & SST_EN_CMDFIFO) || ((sstc)->cmdFifo1.baseSize & SST_EN_CMDFIFO)) - -//----------------- SST cmdFifo*.baseSize bits --------------------------- -#define SST_CMDFIFO_SIZE 0xFF -#define SST_EN_CMDFIFO BIT(8) -#define SST_CMDFIFO_AGP BIT(9) -#define SST_CMDFIFO_DISABLE_HOLES BIT(10) - -// SST COMMAND PACKET defines -#define SSTCP_PKT_SIZE 3 -#define SSTCP_PKT SST_MASK(SSTCP_PKT_SIZE) -#define SSTCP_PKT0 0 -#define SSTCP_PKT1 1 -#define SSTCP_PKT2 2 -#define SSTCP_PKT3 3 -#define SSTCP_PKT4 4 -#define SSTCP_PKT5 5 -#define SSTCP_PKT6 6 -#define SSTCP_PKT7 7 - -#define SSTCP_BOGUS_WORDS_SHIFT 29 -#define SSTCP_BOGUS_WORDS (7 << SSTCP_BOGUS_WORDS_SHIFT) - -// packet 0 defines -#define SSTCP_PKT0_FUNC_SHIFT 3 -#define SSTCP_PKT0_FUNC (7<>2) & 0x7FF) << SSTCP_REGBASE_SHIFT ) -#else -#define SSTCP_REGBASE ((0x3FF)<>2) & 0x3FF) << SSTCP_REGBASE_SHIFT ) -#endif -#define SSTCP_PKT1_2D BIT(14) -#define SSTCP_INC BIT(15) -#define SSTCP_PKT1_NWORDS_SHIFT 16 -#define SSTCP_PKT1_NWORDS (0xFFFFUL< -#include -#include - -#define HWC_DEFAULT_FBI_REV 1 -#define HWC_DEFAULT_FBI_MEM 4 - -#define DEV_PRIVATE(hwc) ((FxDeviceInfo *)hwc->devInfo) - -#define HWC_BASE_ADDRESS(hwc) ((FxI32)(hwc->virtAddr[0])) -#define HWC_IO_ADDRESS(hwc) (SST_IO_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_CMDAGP_ADDRESS(hwc) (SST_CMDAGP_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_GUI_ADDRESS(hwc) (SST_2D_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_3D_ADDRESS(hwc) (SST_2D_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_TEX_ADDRESS(hwc) (SST_TEX_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_LFB_ADDRESS(hwc) (SST_LFB_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_YUV_ADDRESS(hwc) (SST_YUV_OFFSET+HWC_BASE_ADDRESS(hwc)) -#define HWC_PORT_ADDRESS(hwc) ((FxI32)(hwc->virtPort)) - -//----------------- useful addressing macros ----------------------- -// return pointer to SST at specified WRAP, CHIP, or TREX -#define HWC_WRAP(hwc,n) ((SstRegs *)((n)*0x4000+HWC_3D_ADDRESS(hwc))) -#define HWC_CHIP(hwc,n) ((SstRegs *)((n)*0x400+HWC_3D_ADDRESS(hwc))) -#define HWC_TMU(hwc,n) ((SstRegs *)((0x800<<(n))+HWC_3D_ADDRESS(hwc))) -#define HWC_TREX(hwc,n) HWC_TMU(hwc,n) - -#define HWC_IO_UNIT(hwc) ((SstIORegs *)HWC_IO_ADDRESS(hwc)) -#define HWC_CMDAGP_UNIT(hwc) ((SstCRegs *)HWC_CMDAGP_ADDRESS(hwc)) -#define HWC_GUI_UNIT(hwc) ((SstGRegs *)HWC_GUI_ADDRESS(hwc)) -#define HWC_3D_UNIT(hwc) ((SstRegs *)HWC_3D_ADDRESS(hwc)) - - -#define SST_DEVICE_ID_H3 3 - -#define MBYTE(n) (((FxU32)(n))<<20) -#define DEAD 0xDEAD - -// Maximum number of boards and TMUs supported -#define HAL_MAX_BOARDS 4 - -#define SST_FAKE_ADDRESS_GET_OFFSET(a) ((FxU32)a&0x0FFFFFFF) - -#define SST_FAKE_PORT_GET_OFFSET(a) ((FxU16)a&0x0FFF) - -typedef struct { - int csim; - int hsim; - int hw; - FxU32 boardsFound; // number of boards found - FxDeviceInfo boardInfo[HAL_MAX_BOARDS]; - - int pollLimit; // number of pixels to poll msg Q after - int pollCount; // current pixel counter - int video; // video output enabled - FxU32 csimLastRead; -} HalInfo; - -FX_ENTRY HalInfo * FX_CALL fxHalInit(FxU32 flags); - -FX_ENTRY FxBool FX_CALL fxHalInitRegisters(SstRegs *sst); - -FxBool guiOpen( FxU32 boardNumber ); - -FX_ENTRY FxU32 * FX_CALL agpPhysToVirt( FxU32 physAddrHi, FxU32 physAddrLo ); - -extern HalInfo halInfo; - -FxBool h3HwcMapBoard( HwcContext *hwc); - -FX_ENTRY SstRegs * FX_CALL fxHalMapBoard(FxU32 boardNum); - -FxBool h3HwcUnmapBoard( HwcContext *hwc); - -FxBool h3HwcShutdownBoard( HwcContext *hwc); - -FxBool h3HwcInitRegisters( HwcContext *hwc ); - -FxBool h3HwcInitRenderingRegisters( HwcContext *hwc); - -FxBool h3HwcInitGuiRegisters( HwcContext *hwc); - -FxBool h3HwcIdleNoNop( HwcContext *hwc); - -FxBool h3HwcInitVideo( HwcContext *hwc, FxU32 resolution, - FxU32 refresh, void *vti); - -FxBool h3HwcVideoEnable( HwcContext *hwc, FxBool enable ); - -FxBool h3HwcIdle( HwcContext *hwc ); - -FxBool h3HwcVsync( HwcContext *hwc); - -FxBool h3HwcVsyncNot( HwcContext *hwc); - -FxBool h3HwcInitCmdFifo( HwcContext *hwc, int which, FxU32 fifoStart, - FxU32 size, FxBool disableHoles, FxBool agpEnable); - -FxBool h3HwcFillDeviceInfo( HwcContext *hwc); - -FxBool h3HwcInitGamma( HwcContext *hwc, FxFloat gamma ); - -FxBool h3HwcInitGammaRGB( HwcContext *hwc, FxFloat r, FxFloat g, FxFloat b); - -void h3HwcStore8( HwcContext *hwc, volatile void *addr, FxU8 data ); - -void h3HwcStore16( HwcContext *hwc, volatile void *addr, FxU16 data ); - -void h3HwcStore32( HwcContext *hwc, volatile void *addr, FxU32 data ); - -FxU8 h3HwcLoad8( HwcContext *hwc, volatile void *addr ); - -FxU16 h3HwcLoad16( HwcContext *hwc, volatile void *addr ); - -FxU32 h3HwcLoad32( HwcContext *hwc, volatile void *addr ); - -FxBool h3HwcInitBuffer(HwcBuffer *this); - -FxBool h3HwcReadPixel(HwcBuffer *this, FxU32 which, int x, int y, HwcPixel *); - -FxBool h3HwcWritePixel(HwcBuffer *this, FxU32 which, int x, int y, HwcPixel *); - -FxBool h3HwcSetBuffer(HwcBuffer *this, HwcBufferType type); - -#endif /* !__H3HWC_H__ */ diff --git a/glide2x/h3/incsrc/h3info.h b/glide2x/h3/incsrc/h3info.h deleted file mode 100644 index 548804c..0000000 --- a/glide2x/h3/incsrc/h3info.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef __H3INFO_H__ -#define __H3INFO_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#if defined(__unix__) && ! defined(__H3REGS_H__) -// basic data types -#define FxU8 unsigned char -#define FxU16 unsigned short -#define FxU32 unsigned long -#define FxBool int -// defn of registers not reqd, treat (SstRegs *) as (void *) -typedef void SstRegs; -#endif - -#if defined(H4) -#define MAX_NUM_TMUS 2 -#else -#define MAX_NUM_TMUS 1 -#endif - -/* -** H3 Device Information Structure -** -*/ - -#define MAX_NUM_TMUS_SUPPORTED 4 -#if MAX_NUM_TMUS > MAX_NUM_TMUS_SUPPORTED -# error "need to increase MAX_NUM_TMUS_SUPPORTED" -#endif - -typedef struct { // H3 Device Information Structure - FxU32 size; // size of this structure - SstRegs *virtAddr[2]; // virtual memory base address - FxU32 physAddr[2]; // physical memory base address - FxU16 virtPort; // virtual i/o port base address - FxU16 physPort; // physical i/o port base address - FxU32 deviceNumber; // PCI device number - FxU32 vendorID; // PCI vendor ID - FxU32 deviceID; // PCI device ID - FxU32 fbiRevision; // FBI revision number - FxU32 fbiConfig; // FBI strapping pins - FxU32 fbiMemType; // FBI memory type (poweron strapping bits) - FxU32 fbiVideoWidth; // FBI video display X-resolution - FxU32 fbiVideoHeight; // FBI video display Y-resolution - FxU32 fbiVideoRefresh; // FBI video refresh rate - FxU32 fbiMemoryFifoEn; // FBI memory fifo enabled - FxU32 tmuRevision; // TMU revision number (for all TMUs) - FxU32 numberTmus; // number of TMUs installed - FxU32 tmuConfig; // TMU configuration bits - FxU32 fbiMemSize; // FBI frame buffer memory (in MBytes) - FxU32 tmuMemSize[MAX_NUM_TMUS_SUPPORTED]; // TMU texture memory (in MBytes) -#ifndef CVG - FxU8 *agpMem; // AGP true base address - FxU8 *agpVirtAddr; // AGP virtual base address - FxU32 agpSizeInBytes; // AGP memory size (in Bytes) - FxU32 agpBaseAddrH; // upper 4 bits of AGP physical base address - FxU32 agpBaseAddrL; // lower 32 bits of AGP physical base address - FxU32 agpRqDepth; // AGP request depth -#endif - - // These cannot be read from the hardware, so we shadow them here - FxU32 tmuInit0[MAX_NUM_TMUS_SUPPORTED]; - FxU32 tmuInit1[MAX_NUM_TMUS_SUPPORTED]; - - // Misc - FxU32 initGrxClkDone; - - // CSIM specific - SstRegs *sstCSIM; // pointer to CSIM structure - SstRegs *sstHW; // pointer to HW -} FxDeviceInfo; - -#endif /* !__H3INFO_H__ */ diff --git a/glide2x/h3/incsrc/h3regs.h b/glide2x/h3/incsrc/h3regs.h deleted file mode 100644 index e3b4233..0000000 --- a/glide2x/h3/incsrc/h3regs.h +++ /dev/null @@ -1,386 +0,0 @@ -#ifndef __H3REGS_H__ -#define __H3REGS_H__ - -/* -*-c++-*- */ -/* $Header$ */ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** -** $History: h3regs.h $ -** -** ***************** Version 1 ***************** -** User: Sapphire Date: 2/17/99 Time: 8:26p -** Created in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/INCSRC -** -** ***************** Version 21 ***************** -** User: Stb_srogers Date: 2/09/99 Time: 9:55a -** Updated in $/devel/h3/win95/dx/inc -** -** ***************** Version 20 ***************** -** User: Michael Date: 9/08/98 Time: 4:16p -** Updated in $/devel/h3/Win95/dx/inc -** MarkL's fix for 2281. Modify members of "stats" structure from ints to -** longs. -*/ - -// STB Begin Changes -// STB-SR 1/13/98 Adding code for bj -#ifdef _H2INC -typedef unsigned long FxU32; -#endif -// STB End Changes - -//----------------- SST chip I/O layout ------------------------- -// I/O registers remapped into memory space -// Includes init, dac/pll, video, and VGA registers -typedef volatile struct sstioregs { - - // Init Registers - FxU32 status; // aliased status register - FxU32 pciInit0; - FxU32 sipMonitor; - FxU32 lfbMemoryConfig; - FxU32 miscInit0; - FxU32 miscInit1; - FxU32 dramInit0; - FxU32 dramInit1; - FxU32 agpInit; - FxU32 tmuGbeInit; - FxU32 vgaInit0; - FxU32 vgaInit1; - FxU32 dramCommand; - FxU32 dramData; - FxU32 reservedZ[2]; - - // PLL Registers - FxU32 pllCtrl0; - FxU32 pllCtrl1; - FxU32 pllCtrl2; - - // DAC Registers - FxU32 dacMode; - FxU32 dacAddr; - FxU32 dacData; - - // Video Registers I - FxU32 vidMaxRGBDelta; - FxU32 vidProcCfg; - FxU32 hwCurPatAddr; - FxU32 hwCurLoc; - FxU32 hwCurC0; - FxU32 hwCurC1; - FxU32 vidInFormat; - FxU32 vidInStatus; - FxU32 vidSerialParallelPort; - FxU32 vidInXDecimDeltas; - FxU32 vidInDecimInitErrs; - FxU32 vidInYDecimDeltas; - FxU32 vidPixelBufThold; - FxU32 vidChromaMin; - FxU32 vidChromaMax; - FxU32 vidCurrentLine; - FxU32 vidScreenSize; - FxU32 vidOverlayStartCoords; - FxU32 vidOverlayEndScreenCoord; - FxU32 vidOverlayDudx; - FxU32 vidOverlayDudxOffsetSrcWidth; - FxU32 vidOverlayDvdy; - - // VGA Registers - FxU32 vgaRegister[12]; - - // Video Registers II - FxU32 vidOverlayDvdyOffset; - FxU32 vidDesktopStartAddr; - FxU32 vidDesktopOverlayStride; - FxU32 vidInAddr0; - FxU32 vidInAddr1; - FxU32 vidInAddr2; - FxU32 vidInStride; - FxU32 vidCurrOverlayStartAddr; -} SstIORegs; - -typedef volatile struct cmdfifo { - FxU32 baseAddrL; - FxU32 baseSize; - FxU32 bump; - FxU32 readPtrL; - FxU32 readPtrH; - FxU32 aMin; - FxU32 unusedA; - FxU32 aMax; - FxU32 unusedB; - FxU32 depth; - FxU32 holeCount; - FxU32 reserved; -} CmdFifo; - -//---------- SST chip AGP/CMD Transfer/Misc Register layout ------------------ -typedef volatile struct sstcregs { - // AGP - FxU32 agpReqSize; - FxU32 hostAddrLow; - FxU32 hostAddrHigh; - FxU32 graphicsAddr; - FxU32 graphicsStride; - FxU32 moveCMD; - FxU32 reservedL[2]; - - // CMD FIFO 0,1 - CmdFifo cmdFifo0; - CmdFifo cmdFifo1; - - FxU32 cmdFifoThresh; - FxU32 cmdHoleInit; - FxU32 reservedO[6]; - FxU32 reservedP[8]; - FxU32 reservedQ[8]; - FxU32 reservedR[8]; - // misc - FxU32 yuvBaseAddr; - FxU32 yuvStride; - FxU32 reservedS[6]; - FxU32 crc1; - FxU32 reservedT[3]; - FxU32 crc2; -} SstCRegs; - -//----------------- SST chip 2D layout ------------------------- -typedef volatile struct sstgregs { // THE 2D CHIP - FxU32 status; // aliased status register - FxU32 unused0; - FxU32 clip0min; - FxU32 clip0max; - FxU32 dstBaseAddr; - FxU32 dstFormat; - FxU32 srcColorkeyMin; - FxU32 srcColorkeyMax; - FxU32 dstColorkeyMin; - FxU32 dstColorkeyMax; - FxU32 bresError0; - FxU32 bresError1; - FxU32 rop; - FxU32 srcBaseAddr; - FxU32 commandEx; - FxU32 lineStipple; - FxU32 lineStyle; - FxU32 pattern0alias; - FxU32 pattern1alias; - FxU32 clip1min; - FxU32 clip1max; - FxU32 srcFormat; - FxU32 srcSize; - FxU32 srcXY; - FxU32 colorBack; - FxU32 colorFore; - FxU32 dstSize; - FxU32 dstXY; - FxU32 command; - FxU32 reserved[3]; - FxU32 launch[32]; - FxU32 colorPattern[64]; -#if COLORTRANSLUT - FxU32 colorTransLut[256]; -#endif -} SstGRegs; - -// STB Begin changes -// STB-SR 1/13/99 Adding code for bj -#ifndef _H2INC -// STB End changes - -//----------------- SST chip 3D layout ------------------------- -// registers are in groups of 8 for easy decode -typedef struct vertex_Rec { - unsigned long x; // 12.4 format - unsigned long y; // 12.4 -} vtxRec; - -typedef volatile struct sstregs { // THE 3D CHIP - // EXTERNAL registers - FxU32 status; // chip status, Read Only - FxU32 intrCtrl; // interrupt control - vtxRec vA; // Vertex A,B,C - vtxRec vB; - vtxRec vC; - - long r; // 12.12 Parameters - long g; // 12.12 - long b; // 12.12 - long z; // 20.12 - long a; // 12.12 - long s; // 14.18 - long t; // 14.18 - long w; // 2.30 - - long drdx; // X Gradients - long dgdx; - long dbdx; - long dzdx; - long dadx; - long dsdx; - long dtdx; - long dwdx; - - long drdy; // Y Gradients - long dgdy; - long dbdy; - long dzdy; - long dady; - long dsdy; - long dtdy; - long dwdy; - - unsigned long triangleCMD; // execute a triangle command (float) - unsigned long reservedA; - vtxRec FvA; // floating point version - vtxRec FvB; - vtxRec FvC; - - long Fr; // floating point version - long Fg; - long Fb; - long Fz; - long Fa; - long Fs; - long Ft; - long Fw; - - long Fdrdx; - long Fdgdx; - long Fdbdx; - long Fdzdx; - long Fdadx; - long Fdsdx; - long Fdtdx; - long Fdwdx; - - long Fdrdy; - long Fdgdy; - long Fdbdy; - long Fdzdy; - long Fdady; - long Fdsdy; - long Fdtdy; - long Fdwdy; - - unsigned long FtriangleCMD; // execute a triangle command - unsigned long fbzColorPath; // color select and combine - unsigned long fogMode; // fog Mode - unsigned long alphaMode; // alpha Mode - unsigned long fbzMode; // framebuffer and Z mode - unsigned long lfbMode; // linear framebuffer Mode - unsigned long clipLeftRight; // (6)10(6)10 - unsigned long clipBottomTop; // (6)10(6)10 - - unsigned long nopCMD; // execute a nop command - unsigned long fastfillCMD; // execute a fast fill command - unsigned long swapbufferCMD;// execute a swapbuffer command - unsigned long fogColor; // (8)888 - unsigned long zaColor; // 8(8)16 - unsigned long chromaKey; // (8)888 - unsigned long chromaRange; - unsigned long userIntrCmd; - - unsigned long stipple; // 32 bits, MSB masks pixels - unsigned long c0; // 8.8.8.8 (ARGB) - unsigned long c1; // 8.8.8.8 (ARGB) - struct { // statistic gathering variables - unsigned long fbiPixelsIn; - unsigned long fbiChromaFail; - unsigned long fbiZfuncFail; - unsigned long fbiAfuncFail; - unsigned long fbiPixelsOut; - } stats; - - unsigned long fogTable[32]; // 64 entries, 2 per word, 2 bytes each - - unsigned long reservedB[3]; - - unsigned long colBufferAddr; - unsigned long colBufferStride; - unsigned long auxBufferAddr; - unsigned long auxBufferStride; - unsigned long reservedC; - - unsigned long clipLeftRight1; - unsigned long clipBottomTop1; - unsigned long reservedD[6]; // NOTE: used to store TMUprivate ptr - - - unsigned long reservedE[8]; - - unsigned long reservedF[3]; - unsigned long swapBufferPend; - unsigned long leftOverlayBuf; - unsigned long rightOverlayBuf; - unsigned long fbiSwapHistory; - unsigned long fbiTrianglesOut; // triangles out counter - - FxU32 sSetupMode; - FxU32 sVx; - FxU32 sVy; - FxU32 sARGB; - FxU32 sRed; - FxU32 sGreen; - FxU32 sBlue; - FxU32 sAlpha; - - FxU32 sVz; - FxU32 sOowfbi; - FxU32 sOow0; - FxU32 sSow0; - FxU32 sTow0; - FxU32 sOow1; - FxU32 sSow1; - FxU32 sTow1; - - FxU32 sDrawTriCMD; - FxU32 sBeginTriCMD; - unsigned long reservedG[6]; - - unsigned long reservedH[8]; - - unsigned long reservedI[8]; - - unsigned long textureMode; // texture Mode - unsigned long tLOD; // texture LOD settings - unsigned long tDetail; // texture detail settings - unsigned long texBaseAddr; // current texture base address - unsigned long texBaseAddr1; - unsigned long texBaseAddr2; - unsigned long texBaseAddr38; - unsigned long trexInit0; // hardware init bits - unsigned long trexInit1; // hardware init bits - - unsigned long nccTable0[12]; // NCC decode tables, bits are packed - unsigned long nccTable1[12]; // 4 words Y, 4 words I, 4 words Q - - unsigned long tChromaKeyMin; - unsigned long tChromaKeyMax; -} SstRegs; - -// STB Begin changes -#endif // #ifndef _H2INC -// STB End changes - -#endif /* !__H3REGS_H__ */ diff --git a/glide2x/h3/incsrc/makefile b/glide2x/h3/incsrc/makefile deleted file mode 100644 index 5eba28f..0000000 --- a/glide2x/h3/incsrc/makefile +++ /dev/null @@ -1,29 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT)\h3 - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/h3/incsrc/makefile.linux b/glide2x/h3/incsrc/makefile.linux deleted file mode 100644 index 599b0d5..0000000 --- a/glide2x/h3/incsrc/makefile.linux +++ /dev/null @@ -1,29 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT)/$(FX_GLIDE_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/h3/incsrc/sst1vid.h b/glide2x/h3/incsrc/sst1vid.h deleted file mode 100644 index 4032513..0000000 --- a/glide2x/h3/incsrc/sst1vid.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 2 3/02/99 8:13p Dow -** Added new resolutiions. -** -** 10 2/27/99 12:28p Dow -** new resolutions -** -** 6 2/13/99 1:56p Dow -** Added new resolution constants -** -** 5 7/24/98 1:38p Hohn - * - * 4 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_1152x864 0x10 -#define GR_RESOLUTION_1280x960 0x11 -#define GR_RESOLUTION_1600x1024 0x12 -#define GR_RESOLUTION_1792x1344 0x13 -#define GR_RESOLUTION_1856x1392 0x14 -#define GR_RESOLUTION_1920x1440 0x15 -#define GR_RESOLUTION_2048x1536 0x16 -#define GR_RESOLUTION_2048x2048 0x17 -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_2048x2048 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/h3/incsrc/vector.h b/glide2x/h3/incsrc/vector.h deleted file mode 100644 index b2079f5..0000000 --- a/glide2x/h3/incsrc/vector.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __VECTOR_H__ -#define __VECTOR_H__ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include - -// Defines for different types of vector files -#define VECTORID_MAX 2 -#define VECTORID_CACHE 0 -#define VECTORID_DECOMPRESSOR 1 -#define VECTORID_CACHEm 1 << VECTORID_CACHE -#define VECTORID_DECOMPRESSORm 1 << VECTORID_DECOMPRESSOR - -extern void openVectorFiles(); -extern void closeVectorFiles( ); -extern void dumpVector( ); - - -typedef struct vectorFiles { - FILE * vectorHandles[VECTORID_MAX]; - void (* dumpVector)(); -} vectorFiles; - -// extern vectorFiles vectorf; - -typedef struct { - FxU32 data[2]; -} CBlock; - -typedef struct CacheOutput { - int u; - int v; - CBlock bank[ 4 ]; -} CacheOutput; - -typedef struct DecompOutput { - FxU32 Texel[4]; -} DecompOutput; - - -#endif diff --git a/glide2x/h3/incsrc/vxd.h b/glide2x/h3/incsrc/vxd.h deleted file mode 100644 index 02eedff..0000000 --- a/glide2x/h3/incsrc/vxd.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#ifndef _VXD_H_ -#define _VXD_H_ - -#if defined(KERNEL) && !defined(KERNEL_NT) -#define WANTVXDWRAPS -#define DEBUG -#include -#include -#include -#include -#pragma VxD_LOCKED_CODE_SEG -//#pragma VxD_LOCKED_DATA_SEG -#endif /* #ifdef KERNEL */ - -#endif /* #ifndef _VXD_H_ */ diff --git a/glide2x/h3/lib/makefile b/glide2x/h3/lib/makefile deleted file mode 100644 index 87862ca..0000000 --- a/glide2x/h3/lib/makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = *.lib - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak diff --git a/glide2x/h3/lib/makefile.linux b/glide2x/h3/lib/makefile.linux deleted file mode 100644 index 728178d..0000000 --- a/glide2x/h3/lib/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/libsrc/makefile b/glide2x/h3/libsrc/makefile deleted file mode 100644 index 67f7bfb..0000000 --- a/glide2x/h3/libsrc/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)\h3 - -!include $(BUILD_ROOT_SWLIBS)\include\nmake\3dfx.mak - diff --git a/glide2x/h3/libsrc/makefile.linux b/glide2x/h3/libsrc/makefile.linux deleted file mode 100644 index cef34c9..0000000 --- a/glide2x/h3/libsrc/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT)/$(FX_GLIDE_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/h3/makefile b/glide2x/h3/makefile deleted file mode 100644 index d614fda..0000000 --- a/glide2x/h3/makefile +++ /dev/null @@ -1,38 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = h3 - - - -SUBDIRS = bin binsrc lib libsrc include incsrc minihwc - -!if ("$(FX_HW_PROJECTS)" == "") -FX_HW_PROJECTS = glide -!endif - -SUBDIRS = $(SUBDIRS) $(FX_HW_PROJECTS) - -!endif - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak diff --git a/glide2x/h3/makefile.linux b/glide2x/h3/makefile.linux deleted file mode 100644 index 863e3b6..0000000 --- a/glide2x/h3/makefile.linux +++ /dev/null @@ -1,40 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = h3 - -# BUILD_ROOT_CHIP is used by 3dfx.mak to define the path to bat2sh.awk. -# This allows for more than one level of diag directory hierarchy. -export BUILD_ROOT_CHIP = $(BUILD_ROOT)/$(THISDIR) - -SUBDIRS = bin binsrc lib libsrc include incsrc minihwc - -ifeq ($(FX_HW_PROJECTS),) -FX_HW_PROJECTS = glide -endif - -SUBDIRS += $(FX_HW_PROJECTS) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - diff --git a/glide2x/h3/minihwc/dos_mode.c b/glide2x/h3/minihwc/dos_mode.c deleted file mode 100644 index c7b7b51..0000000 --- a/glide2x/h3/minihwc/dos_mode.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 4 10/08/98 10:14a Dow -** Fixes 512x384 sometimes -** -** 3 9/02/98 1:34p Peter -** watcom warnings -** -** 2 6/25/98 7:40p Dow -** Made it compile -** -*/ - -#include - -#include <3dfx.h> -#include -#include - -static FxU16 oldVidMode; - -typedef struct { - int xres; - int yres; - int mode; -} ResTableEntry; - -static ResTableEntry _table[] = { - { 512, 384, 0x188 }, - { 640, 480, 0x111 }, - { 800, 600, 0x114 }, - { 1024, 768, 0x117 }, - { 0, 0, 0 } -}; - -static unsigned long _tableSize = sizeof( _table ) / sizeof( ResTableEntry ); - -FxBool -setVideoMode( unsigned long dummy, int xres, int yres, int refresh, void *hmon ) -{ - union REGS r, rOut; - int i; - int mode; - - dummy = dummy; - - r.w.ax = 0x4f03; - int386(0x10, &r, &rOut); - - oldVidMode = rOut.w.bx; - - mode = 0; - for( i = 0; i < _tableSize; i++ ) { - if ( ( _table[i].xres == xres ) && - ( _table[i].yres == yres ) ) { - mode = _table[i].mode; - } - } - - if ( mode == 0 ) { - GDBG_INFO(80, "Setmode failed -- unimplemented resolution\n" ); - return FXFALSE; - } - - - r.w.ax = 0x4f02; - r.w.bx = mode; - - GDBG_INFO(80, "Setting mode 0x%x, 0x%x\n", r.w.ax, r.w.bx); - - /* Do VGA Magic */ - int386(0x10, &r, &rOut); - - /* XXXTACO!! - We should check the return value */ - - return FXTRUE; -} /* setVideoMode */ - -void -resetVideo( void ) -{ - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = oldVidMode; - GDBG_INFO(80, "resetVideo(): Setting mode 0x%x, 0x%x\n", r.w.ax, r.w.bx); - int386( 0x10, &r, &r ); -} /* resetVideo */ diff --git a/glide2x/h3/minihwc/dxdrvr.c b/glide2x/h3/minihwc/dxdrvr.c deleted file mode 100644 index 598012b..0000000 --- a/glide2x/h3/minihwc/dxdrvr.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 43 6/24/98 11:05a Dow -** better error message -** -** 42 6/11/98 7:45p Jdt -** Win98/NT5 Multimon 1st Pass -** -** 41 6/04/98 6:52p Dow -** Resolutions to 1600x1200 -** -** 40 5/27/98 3:10p Dow -** DOS happiness -** -** 39 4/14/98 11:55a Dow -** -** 38 4/05/98 2:19p Dow -** DOS/WIN32 stepping on each others' feet -** -** 37 4/03/98 2:03p Dow -** DOS Glide modes -** -** 36 3/11/98 8:27p Dow -** WinGlide - * - * 33 11/06/97 9:51a Jdt - * Fixes window resize events to not crash/hang - * - * 32 10/01/97 3:21p Atai - * fix 819, DOS tests flicker on glide - * - * 31 9/08/97 12:05p Atai - * fixed resize problem in dxControl() - * - * 30 8/28/97 10:24a Odo - * moved debugging varaible - * - * 29 8/27/97 10:32a Dow - * added more debugging info - * - * 28 8/21/97 4:24p Dow - * Fixed @#$%! C++ Comments, Added Debugging info -** -** $Revision$ -** $Date$ -** -*/ - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include - -#include -#define FX_DLL_DEFINIION -#include -#include - -#ifdef __DOS32__ -#include -#endif - -/* Local Headers */ -#include "minihwc.h" - -#define H3_BUF_MAGIC 0x666 - -FxBool tripleBuffering = 0; - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "HWC_BUFFER_FRONTBUFFER", - "HWC_BUFFER_BACKBUFFER", - "HWC_BUFFER_AUXBUFFER", - "HWC_BUFFER_DEPTHBUFFER", - "HWC_BUFFER_ALPHABUFFER", - "HWC_BUFFER_TRIPLEBUFFER", - "HWC_BUFFER_FIFOBUFFER", - "HWC_BUFFER_SCREENBUFFER", - "HWC_BUFFER_TEXTUREBUFFER" -}; -#endif - -#if defined( __WIN32__) && defined(HWC_ACCESS_DDRAW) -#define WIN32_LEAN_AND_MEAN -#include -#include - -#define NUM_BUFS 6 - -static HWND hWndApp = 0; -static FxU32 FifoOffset = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static hwcBufferDesc BufDesc[NUM_BUFS] = {0}; - -/* Direct Draw stuff */ -static LPDIRECTDRAWCLIPPER lpClipper = NULL; -static LPDIRECTDRAWSURFACE lpFront = NULL; -static LPDIRECTDRAWSURFACE lpBack = NULL; -static LPDIRECTDRAWSURFACE lpAux = NULL; -static LPDIRECTDRAWSURFACE lpTriple = NULL; -static LPDIRECTDRAW2 lpDD = NULL; -static LPDIRECTDRAW lpDD1 = NULL; - - - -FxBool -ErrorMessage(HWND hWnd, char *err) -{ - GDBG_INFO(0, "Error %s \n", err); -// MessageBox( hWnd, err, "ERROR", MB_OK ); - return FALSE; -} /* ErrorMessage */ - - - -/* - * Takes a DirectDraw Surface object (LPDIRECTDRAWSURFACE), looks up its - * description (DDSURFACEDESC), and returns a pointer to the surface and its - * stride value in pDesc. - */ -FxBool -_dxSurfaceToBufDesc(LPDIRECTDRAWSURFACE lpSurf, hwcBufferDesc *pDesc) -{ - DDSURFACEDESC ddsd; - - ddsd.dwSize = sizeof(ddsd); - if (IDirectDrawSurface2_Lock(lpSurf, NULL, &ddsd, DDLOCK_WAIT, NULL) - !=DD_OK) { - return ErrorMessage(hWndApp, "_dxSurfaceToBufDesc: DdrawSurface Lock failed\n"); - } - - /* pDesc->bufType should be filled in by caller */ - pDesc->bufOffset = (FxU32) (ddsd.lpSurface); /* virtual address. */ - pDesc->bufStride = (FxI32) (ddsd.lPitch); /* in bytes */ - pDesc->bufBPP = (FxI32) 16; - - IDirectDrawSurface2_Unlock(lpSurf, NULL); - return FXTRUE; -} /* _dxSurfaceToBufDesc */ - - - -/* - * Convert front, back and aux surfaces from DDraw to Glide bufDescriptors. - */ -FxBool -_dxDDrawToGlideDesc(hwcBufferDesc *pDesc) -{ - hwcBufferDesc *dFront = &pDesc[0]; - hwcBufferDesc *dBack = &pDesc[1]; - hwcBufferDesc *dAux = &pDesc[2]; - hwcBufferDesc *dFifo = &pDesc[3]; - hwcBufferDesc *dScreen = &pDesc[4]; - hwcBufferDesc *dTriple = &pDesc[5]; - - GDBG_INFO(80, "_dxDDrawToGlide entry\n"); - - /* Initialize all descriptors. */ - dScreen->bufMagic = H3_BUF_MAGIC; - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - /* Get info about screen (primary display) */ - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - if (!_dxSurfaceToBufDesc( lpFront, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - *dFront = *dBack = *dAux = *dFifo = - *dTriple = - *dScreen; - - dFront->bufType = HWC_BUFFER_FRONTBUFFER; - - /* Get info about back buffer */ - dBack->bufType = HWC_BUFFER_BACKBUFFER; - if (!_dxSurfaceToBufDesc( lpBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - - /* Get info about aux buffer */ - dAux->bufType = HWC_BUFFER_AUXBUFFER; - if (!_dxSurfaceToBufDesc( lpAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - - /* Get info about triple buffer */ - if (tripleBuffering) { - dTriple->bufType = HWC_BUFFER_TRIPLEBUFFER; - if (!_dxSurfaceToBufDesc( lpTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - } - - /* Get info about cmdFifo */ - dFifo->bufType = HWC_BUFFER_FIFOBUFFER; - dFifo->bufOffset = FifoOffset; - dFifo->bufStride = 65536 << 1; /* Fixme!!! what's this? */ - - /* Now convert buf addresses for draw buffers into video memory offsets */ - dFront->bufOffset -= dScreen->bufOffset; - dBack ->bufOffset -= dScreen->bufOffset; - dAux ->bufOffset -= dScreen->bufOffset; - if (tripleBuffering) - dTriple->bufOffset -= dScreen->bufOffset; - - GDBG_INFO(80, "_dxDDrawToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset); - GDBG_INFO(80, "_dxDDrawToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset); - if (tripleBuffering) - GDBG_INFO(80, "_dxDDrawToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset); - - GDBG_INFO(80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride); - return TRUE; -} /* _dxDDrawToGlideDesc */ - - -static GUID fooGuid; - -BOOL FAR PASCAL ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon ) { - DWORD *data = (DWORD*)ctx; - HMONITOR target = (HMONITOR)data[0]; - BOOL rv = DDENUMRET_OK; - - if ( target == hmon ) { - fooGuid = *guid; - data[1] = (DWORD)&fooGuid; - rv = DDENUMRET_CANCEL; - } - return rv; -} - -/* - * Allocate (or re-allocate for WM_SIZE) buffers from DDraw. - */ -FxBool -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, hwcBufferDesc *pDesc, void *hmon ) -{ - DDSURFACEDESC ddsd; - LPGUID ddGuid; - - GDBG_INFO(80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh); - - - ddGuid = NULL; - { - HMODULE ddraw = GetModuleHandle( "ddraw.dll" ); - - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - } - - - if (lpDD1 == NULL) { - if (DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - return ErrorMessage(hWndApp, "DirectDrawCreate Failed!"); - } else { - GDBG_INFO(80, "_dxAS: DDraw Obj created!\n"); - } - } else { - GDBG_INFO(80, "_dxAS: DDraw Obj already existed!\n"); - } - - lpDD = 0L; - - if (IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD) !=DD_OK) { - - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - return ErrorMessage(hWndApp, "DDraw2 interface object failed!"); - } else { - GDBG_INFO(80, "_dxAS: DDraw2 Obj created!\n"); - } - - /* - * Make sure this is done after creating direct draw object!!! - * First time, only one time, get ourselves a command fifo. - * Fix me - XXX - */ - if (FifoOffset == 0) { - /* CHD HACK!!! */ - FifoOffset = 0x200000U - 65536*3; /* fixme!!! why 3? */ - } - - /* - * If there are any previously allocated surfaces, free them now - * before asking for more. - */ - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - if ( !IsFullScreen ) { /* In a window */ - - GDBG_INFO(80, "_dxAS: Allocating buffers for a windowed mode\n"); - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - if (IDirectDraw2_GetDisplayMode( lpDD, &ddsd ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get display mode!"); - - if (ddsd.ddpfPixelFormat.dwRGBBitCount / 8 != 2) - return ErrorMessage(hWndApp, "Display is not in 16bpp format!"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD,hWndApp, DDSCL_NORMAL ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - GDBG_INFO(80, "_dxAS: Screen: xRes = %d, yRes = %d, stride = %d\n", - xRes, yRes, ddsd.lPitch); - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Create Clipper failed!\n"); - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) - return ErrorMessage(hWndApp, "Clipper SethWnd failed!\n"); - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) - return ErrorMessage(hWndApp, "Set Clipper failed!\n"); - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate secondary surface!" ); - - GDBG_INFO(80, "_dxAS: Back buffer allocated!\n"); - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO(80, "_dxAS: Aux Buffer allocated!\n"); - - } else { - - /* Full screen - Set Exclusive Mode, change resolution, */ - GDBG_INFO(80, "_dxAS: Setting Full screen exclusive mode!\n"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD, hWndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - if (IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0,0) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set display mode!"); - -#if WE_WERE_HELPLESS - /* Allocate Front/Back Buffer Surfaces, skip triple buffer XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX | - DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - /* Get back buffer information */ - ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; - if (IDirectDrawSurface2_GetAttachedSurface( lpFront, &ddsd.ddsCaps, - &lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get back buffer info!\n"); - - GDBG_INFO(80, "_dxAS: Full Screen: front/back buffer allocated!\n"); - - /* Allocate Aux Buffer Surface - XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO(80, "_dxAS: Full Screen: aux buffer allocated!\n"); - -/* - * Triple buffer hack: full-screen only for now. Allocate as Aux DD surf, - * after everything else N.B. Allocation order may be important!!! - * god knows how DD would implement dwBackBufferCount == 2 - */ - if (tripleBuffering) { - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpTriple, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate triple buffer" ); - - GDBG_INFO(80, "_dxAS: Triple buffer allocated!\n"); - } -#endif - - } -#if WE_WERE_HELPLESS - /* Convert direct draw surfaces to Glide's idea of buffer descriptors */ - return _dxDDrawToGlideDesc(pDesc); -#else /* We help ourselves */ - return FXTRUE; -#endif - -} /* _dxAllocSurfaces */ - -FxBool -_dxReallocSurfaces(int xRes, int yRes, int vRefresh, hwcBufferDesc *pDesc) - -{ - DDSURFACEDESC ddsd; - const char *errorMessage = "no error"; - - /* for now this is a goddamn baseball bat - it can be trimmed down */ - if ( !IsFullScreen ) { /* this *REALLY* should be called for fullscreen */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate primary surface!"; - goto FUBAR; - } - - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) { - errorMessage = "Create Clipper failed!\n"; - goto FUBAR; - } - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) { - errorMessage = "Clipper SethWnd failed!\n"; - goto FUBAR; - } - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) { - errorMessage = "Set Clipper failed!\n"; - goto FUBAR; - } - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate secondary surface!"; - goto FUBAR; - } - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate aux surface"; - goto FUBAR; - } - } - return _dxDDrawToGlideDesc(pDesc); -FUBAR: - /* if you don't free these you can't make another attempt */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - return ErrorMessage( hWndApp, (char*)errorMessage ); -} /* _dxReallocSurfaces */ - -/* - * Restore lost surfaces, or move the window. - * Note: Resizing is done by deleting and re-allocation, and is done in - * _dxAllocSurfaces(); - */ -static FxBool -_dxRestoreSurfaces(hwcBufferDesc *pDesc) -{ - if (lpDD == NULL) return TRUE; - - if (IDirectDrawSurface2_IsLost(lpFront) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpFront) != DD_OK) - return ErrorMessage(hWndApp, "Front Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpBack) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - if (IDirectDrawSurface2_IsLost(lpAux) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpAux) != DD_OK) - return ErrorMessage(hWndApp, "Aux Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpTriple) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpTriple) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - GDBG_INFO(80, "_dxRS: restore surfaces OK\n"); - return _dxDDrawToGlideDesc(pDesc); -} /* _dxRestoreSurfaces */ - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - hwcColorFormat cFormat, - hwcOriginLocation yOrigin, - int nColBuffers, - int nAuxBuffers, - hwcBufferDesc *pBufDesc, /* return values */ - int *width, - int *height, - hwcSwapType *swapType, - void *hmon -) -{ - int i; - - GDBG_INFO(80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers); - - /* - * Get ourselves a valid window handle - */ - hWndApp = (hWindow == 0) ? GetActiveWindow() : (HWND) hWindow; - - if (hWndApp == NULL) { - return MessageBox(NULL, "grSstWinOpen was passed a NULL window handle!\n\ -Contact the application Vendor\n", - "Programmer Error", MB_OK); - } - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - RECT rect; - - /* Find out how big the window is */ - GetClientRect(hWndApp, &rect); - IsFullScreen = FXFALSE; - Width = rect.right; - Height = rect.bottom; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512,1024,1280,1600,400}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256,768,1024,1200,300}; - - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_1600x1200)) - - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; - - Width = _w[sRes]; - Height = _h[sRes]; - } - - GDBG_INFO(80, "dxOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh); - - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc, hmon)) - return ErrorMessage(hWndApp, "failed dxOpen"); - - GDBG_INFO(80, "_dxAllocSurfaces OK!!!\n"); - - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO(80, "dxOpen: pBufDesc[%d]: \n", i); - GDBG_INFO(80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic); - GDBG_INFO(80, "\tbufType = 0x%x\n", pBufDesc[i].bufType); - GDBG_INFO(80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset); - GDBG_INFO(80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride); - GDBG_INFO(80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? HWC_SWAP_FLIP : HWC_SWAP_BLT; - - GDBG_INFO(80, "dxOpen: Returning TRUE\n"); - - return FXTRUE; - -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, hwcBufferDesc *pBufDesc, int *width, int *height) -{ - RECT rect; - int i; - - GDBG_INFO(80, "dxControl: code = %d\n", code); - - /* dx is not initizized */ - if ( lpDD== NULL ) { - return TRUE; - } - - /* Why was I called? */ - switch(code) { - case HWC_CONTROL_RESIZE: /* recreate surfaces */ - GetClientRect(hWndApp, &rect); - if ((Width != (FxU32) rect.right) || (Height != (FxU32) rect.bottom)) { - Width = rect.right; - Height = rect.bottom; - GDBG_INFO(120, "W and H changed to %d %d\n", - Width, Height); - - if (!_dxReallocSurfaces(Width, Height, 0, BufDesc)) { - /* - Let's find some other way to do this! - ErrorMessage(hWndApp, "dxControl: Resize failed\n"); */ - return FXFALSE; - } - } - break; - - case HWC_CONTROL_MOVE: - break; - - case HWC_CONTROL_ACTIVATE: - GDBG_INFO(120, "dxControl: Activate\n"); - break; - - case HWC_CONTROL_DEACTIVATE: - GDBG_INFO(120, "dxControl: DeActivate\n"); - break; - - default: - GDBG_INFO(120, "dxControl: Strange control %d\n", code); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO(80, "dxControl: code = %d, w = %d, h = %d\n", code, - Width, Height); - - return FXTRUE; -} /* dxControl */ - -FxBool -dxClose() -{ - GDBG_INFO(80, "dxClose:\n"); -/* - * fixme! nulling out this code fixes bug 541... why is unclear??? XXX - * A little more information... the problem is releasing lpDD1, and - * only in fullscreen mode. Temporary refined hack is to not release - * lpDD1 in fullscreen mode. Also rearrange code in dxAllocSurfaces - * to only create lpDD1 once per application execution. /PGJ - */ -#if 1 - // Release any allocated buffers - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - if(!IsFullScreen) { - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - } - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpDD ) IDirectDraw2_Release( lpDD ); - if (1 /* !IsFullScreen */) { - if( lpDD1 ) IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - } - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - lpDD = NULL; - -#endif /* 0 */ - GDBG_INFO(80, "dxClose: Returning TRUE\n"); - return FXTRUE; -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ - static RECT dest, src; - static POINT point; - static HRESULT hr; - - GDBG_INFO(80, "dxSwap:\n"); - if ( !IsFullScreen ) { - GDBG_INFO(120, "Swap: using BLTs\n"); - - src.left = 0; - src.right = Width-1; - src.top = 0; - src.bottom = Height-1; - - dest = src; - point.x = 0; - point.y = 0; - ClientToScreen( hWndApp, &point ); - dest.left += point.x; - dest.right += point.x; - dest.top += point.y; - dest.bottom += point.y; - - hr = IDirectDrawSurface_Blt( lpFront, - &dest, - lpBack, - &src, - DDBLT_WAIT, - NULL ); - - while( IDirectDrawSurface_GetBltStatus( lpFront, DDGBS_ISBLTDONE ) != - DD_OK ); - - if ( hr != DD_OK ) { - ErrorMessage(hWndApp, "Couldn't blit!\n"); - } - } - return; - -} /* dxSwap */ -#else /* it's either DOS or the Hoopti Lab Setup */ - -static FxU16 oldVidMode; - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - hwcColorFormat cFormat, - hwcOriginLocation yOrigin, - int nColBuffers, - int nAuxBuffers, - hwcBufferDesc *pBufDesc, // return values - int *width, - int *height, - hwcSwapType *swapType -) -{ -#define FN_NAME "dxOpen" - FxU32 mode; - hwcBufferDesc *dFront = &pBufDesc[0]; - hwcBufferDesc *dBack = &pBufDesc[1]; - hwcBufferDesc *dAux = &pBufDesc[2]; - hwcBufferDesc *dFifo = &pBufDesc[3]; - hwcBufferDesc *dScreen = &pBufDesc[4]; - hwcBufferDesc *dTriple = &pBufDesc[5]; - FxBool rv = FXTRUE; - FxU32 endAddr; - union REGS r, rOut; - - r.w.ax = 0x4f03; - int386(0x10, &r, &rOut); - - oldVidMode = rOut.w.bx; - GDBG_INFO(80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode); - - - GDBG_INFO(80, "%s: Resolution == 0x%x\n", FN_NAME, sRes); - - switch (sRes) { - case GR_RESOLUTION_640x480: - *width = 640; - *height = 480; - mode = 0x111; - break; - - case GR_RESOLUTION_800x600: - case GR_RESOLUTION_320x200: - case GR_RESOLUTION_320x240: - case GR_RESOLUTION_512x384: - case GR_RESOLUTION_400x256: - case GR_RESOLUTION_640x200: - case GR_RESOLUTION_640x350: - case GR_RESOLUTION_640x400: - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_856x480: - case GR_RESOLUTION_512x256: - case GR_RESOLUTION_NONE: - default: - GDBG_INFO(80, "%s: Unimplemented resolution\n", FN_NAME); - return FXFALSE; - break; - } - - - - r.w.ax = 0x4f02; - r.w.bx = mode; - - GDBG_INFO(80, "%s: Setting mode 0x%x, 0x%x\n", FN_NAME, r.w.ax, r.w.bx); - - /* Do VGA Magic */ - int386(0x10, &r, &rOut); - - /* AT3D buffers need to be 4K (Intel) page-aligned */ -#define BUMP(x, y) (((x) + ((y)-1)) & ~((y)-1)) -#define BUMP_PAGE(x) (BUMP(x, 1<<12)) - - /* Initialize all descriptors. */ - dFront->bufMagic = H3_BUF_MAGIC; - dFront->bufType = HWC_BUFFER_FRONTBUFFER; - dFront->bufOffset = 0; - dFront->bufStride = (*width)*2; - dFront->bufBPP = 16; - endAddr = BUMP_PAGE((*width)*(*height)*2); - - dBack->bufMagic = H3_BUF_MAGIC; - dBack->bufType = HWC_BUFFER_BACKBUFFER; - dBack->bufOffset = endAddr; - dBack->bufStride = (*width)*2; - dBack->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - tripleBuffering = (nColBuffers == 3); - if (tripleBuffering) { - dTriple->bufMagic = H3_BUF_MAGIC; - dTriple->bufType = HWC_BUFFER_TRIPLEBUFFER; - dTriple->bufOffset = endAddr; - dTriple->bufStride = (*width)*2; - dTriple->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - } - - dAux->bufMagic = H3_BUF_MAGIC; - dAux->bufType = HWC_BUFFER_AUXBUFFER; - dAux->bufOffset = endAddr; - dAux->bufStride = (*width)*2; - dAux->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - dFifo->bufMagic = H3_BUF_MAGIC; - dFifo->bufType = HWC_BUFFER_FIFOBUFFER; - dFifo->bufOffset = endAddr; - dFifo->bufStride = 65536; - dFifo->bufBPP = 16; - - dScreen->bufMagic = H3_BUF_MAGIC; - dScreen->bufType = HWC_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - GDBG_INFO(80, "%s: dFront = 0x%x, dBack = 0x%x, dAux = 0x%x\n", - FN_NAME, dFront, dBack, dAux, dFifo); - GDBG_INFO(80, "dxOpen: F:%.06x %5d B:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride); - -#ifdef GDBG_INFO_ON - { - int i; - - for (i = 0; i < 5; i++) { - GDBG_INFO(80, "%s: pBufDesc[%d] = 0x%x:\n", - FN_NAME, i, &pBufDesc[i]); - GDBG_INFO(80, "%s: pBufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[pBufDesc[i].bufType]); - GDBG_INFO(80, "%s: pBufDesc.bufOffset = 0x%x\n", - FN_NAME, pBufDesc[i].bufOffset ); - GDBG_INFO(80, "%s: pBufDesc.bufStride = 0x%x\n", - FN_NAME, pBufDesc[i].bufStride); - GDBG_INFO(80, "%s: pBufDesc.bufBPP = 0x%x\n", - FN_NAME, pBufDesc[i].bufBPP); - } - } -#endif - - *swapType = HWC_SWAP_FLIP; - -BAIL: - return rv; -#undef FN_NAME -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, hwcBufferDesc *pBufDesc, int *width, int *height) -{ - return FXTRUE; -} /* dxControl */ -FxBool -dxClose() -{ -#define FN_NAME "dxClose" - GDBG_INFO(80, "%s: Setting up VESA mode 640*480*\n", FN_NAME); - { - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = oldVidMode; - GDBG_INFO(80, "%s: Setting mode 0x%x, 0x%x\n", FN_NAME, r.w.ax, r.w.bx); - int386( 0x10, &r, &r ); - } - return FXTRUE; -#undef FN_NAME -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ -} /* dxSwap */ -#endif /* __DOS32__ || (defined(__WIN32__) && !defined(HWC_ACCESS_DDRAW) */ - - diff --git a/glide2x/h3/minihwc/exttest.c b/glide2x/h3/minihwc/exttest.c deleted file mode 100644 index 6df75d7..0000000 --- a/glide2x/h3/minihwc/exttest.c +++ /dev/null @@ -1,243 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 2 3/16/99 1:20a Dow -** Sync to various workarounds. -** -** 1 3/10/99 10:48a Peter -** mmmm.... yawmnw -** -** 1 3/10/99 10:46a Peter -** mmmm.... yawmnw -** -** 1 5/01/98 9:16a Dow -** -*/ - -#include -#include <3dfx.h> -#include "..\hwcext.h" -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include -#include - -/* Forward declarations */ -HWND hWndMain; - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) - { - case WM_SETCURSOR: - SetCursor(NULL); - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - break; - - case WM_CHAR: - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -void -main(int argc, char **argv) -{ - HWND hWndMain; - HANDLE hInstance = GetModuleHandle(NULL); - HDC dc; - int extRes; - hwcExtRequest_t req; - hwcExtResult_t res; - WNDCLASS wc; - BOOL rc; - - FxU32 contextID; - - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "ExtTestClass"; - rc = RegisterClass( &wc ); - - if( !rc ) { - printf("Failed to register class!\n"); - exit(1); - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "ExtTestClass", - "ExtEscape Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - - if( !hWndMain ) { - printf("Failed to create window\n"); - exit(2); - } - - /* HWCEXT_GETDRIVERVERSION */ - - req.which = HWCEXT_GETDRIVERVERSION; - - dc = GetDC(hWndMain); - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - if (extRes == 0) { - printf("No escape!\n"); - exit(3); - } - - printf("HWCEXT_GETDRIVERVERSION:\n\tMajor:\t0x%x\n\tMinor:\t0x%x\n", - res.optData.driverVersionRes.major, - res.optData.driverVersionRes.minor); - - /* HWCEXT_ALLOCCONTEXT */ - req.which = HWCEXT_ALLOCCONTEXT; - - req.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - req.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_ALLOCCONTEXT:\n\tStatus:\t0x%x\n\tContext ID:\t0x%x\n", - res.resStatus, res.optData.allocContextRes.contextID); - - contextID = res.optData.allocContextRes.contextID; - - /* HWCEXT_GETDEVICECONFIG */ - req.which = HWCEXT_GETDEVICECONFIG; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_GETDEVICECONFIG:\ -\n\tStatus:\t0x%x\ -\n\tdevNum:\t0x%x\ -\n\tvendorDI:\t0x%x\ -\n\tfbRam:\t0x%x\ -\n\tchipRev:\t0x%x\n", - res.resStatus, res.optData.deviceConfigRes.devNum, - res.optData.deviceConfigRes.vendorID, - res.optData.deviceConfigRes.fbRam, - res.optData.deviceConfigRes.chipRev); - - /* HWCEXT_GETLINEARADDR */ - req.which = HWCEXT_GETLINEARADDR; - - req.optData.linearAddrReq.devNum = 0; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_LINEARADDRESS:\ -\n\tStatus:\t0x%x\ -\n\tnumBaseAddrs: %d\ -\n\tbaseAddresses[0]: 0x%x\ -\n\tbaseAddresses[1]: 0x%x\ -\n\tbaseAddresses[2]: 0x%x\n", - res.resStatus, res.optData.linearAddressRes.numBaseAddrs, - res.optData.linearAddressRes.baseAddresses[0], - res.optData.linearAddressRes.baseAddresses[1], - res.optData.linearAddressRes.baseAddresses[2] - ); - - /* HWCEXT_RELEASECONTEXT */ - req.which = HWCEXT_RELEASECONTEXT; - - req.optData.releaseContextReq.contextID = contextID; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_RELEASECONTEXT:\n\tStatus:\t0x%x\n", res.resStatus); - -} /* main */ diff --git a/glide2x/h3/minihwc/fxhwc.h b/glide2x/h3/minihwc/fxhwc.h deleted file mode 100644 index 51da389..0000000 --- a/glide2x/h3/minihwc/fxhwc.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** Revision 1.1.1.1 1999/12/07 21:49:43 joseph -** Initial checkin into SourceForge. -** -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef FXHWC_H -#define FXHWC_H - - - -/* -** I/O Macros -*/ -#warning Here! -#define HWC_IO_LOAD(regInfo, reg, val) -GDBG_INFO(120, "%s: Storing 0x%x to IO Register %s\n", -((SstIORegs *) regInfo.ioMemBase)-> - - -#endif /* FXHWC_H not defined */ diff --git a/glide2x/h3/minihwc/gdebug.c b/glide2x/h3/minihwc/gdebug.c deleted file mode 100644 index 287a40d..0000000 --- a/glide2x/h3/minihwc/gdebug.c +++ /dev/null @@ -1,491 +0,0 @@ -/*-*-c++-*-*/ -#include "vxd.h" - -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include -#include -#include -#include - -#include <3dfx.h> - -#if __MWERKS__ -/* Dork w/ the console window */ -#include - -/* So the debug level comes from the right place */ -#include -#include -#endif /* __MWERKS__ */ - -#define FX_DLL_DEFINITION -#include -#include -#include - -#if defined(__WIN32__) && !defined(KERNEL) -#include -#endif /* defined(__WIN32__) && !defined(KERNEL) */ - -#define USE_DEBUG_STRING (__DOS32__ || __WIN32__) -#if USE_DEBUG_STRING -static FxBool UseDebugString = 0; -#endif /* USE_DEBUG_STRING */ - -#ifdef KERNEL_NT - -void __stdcall -EngDebugPrint( - char * StandardPrefix, - const char * DebugMessage, - va_list ap - ); - -#endif - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - - -#ifdef KERNEL -// gdbgout is array to store strings for debug output -//#include -static char gdbgout[512]; - -// for setting levels interactively through the debugger while you're -// running in the KERNEL mode -void setLevel(int level, int value) -{ - if (level >= GDBG_MAX_LEVELS) - level = GDBG_MAX_LEVELS - 1; - - gdbg_debuglevel[level] = value; -} - - -#ifndef KERNEL_NT -// we need to call a kernal printf. -extern int __cdecl klvfprintf(FILE *stream, - const char *format, - va_list arg ) ; -#endif - -static FILE *gdbg_msgfile; // GDBG info/error file -#else /* #ifdef KERNEL */ - -#ifndef __linux__ -static FILE *gdbg_msgfile = stdout; // GDBG info/error file -#else -static FILE *gdbg_msgfile; // GDBG info/error file -#endif - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static const char *setRange(const char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') { // if there's a second - buf += pos+1; - sscanf(buf,"%i%n",&r1,&pos); // then parse it - } - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -FX_EXPORT void FX_CSTYLE -gdbg_parse(const char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (sscanf(env,"%i%n",&level,&pos) <= 0) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -#endif /* #ifndef KERNEL */ - -FX_EXPORT void FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - -#if __MWERKS__ - SIOUXSettings.standalone = false; - SIOUXSettings.setupmenus = false; - SIOUXSettings.autocloseonquit = true; - SIOUXSettings.asktosaveonclose = false; -#endif - -#ifdef __linux__ - gdbg_msgfile = stderr; // GDBG info/error file -#endif - -#ifdef KERNEL - // put code in here to set the default level - gdbg_debuglevel[0] = 1; // always enable level 0 - gdbg_debuglevel[120] = 1; // always enable level 0 - done = 1; - env = 0; - return; -#else /* #ifdef KERNEL */ - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - gdbg_parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -#endif /* #ifndef KERNEL */ -} - -FX_EXPORT void FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); -#ifndef KERNEL - if (gdbg_msgfile != stdout) { // close any existing output file -#if USE_DEBUG_STRING - if (!UseDebugString) -#endif /* USE_DEBUG_STRING */ - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#endif /* #ifndef KERNEL */ -} - -#if defined(KERNEL) && !defined(KERNEL_NT) - extern void MyPrintf(); -#endif /* #ifdef KERNEL */ - -#ifdef KERNEL_NT -//---------------------------------------------------------------------- -// NT Debug print helper routine -//---------------------------------------------------------------------- -static void gdbg_NTPrint( const char *format, ... ) -{ - va_list arglist; - - va_start(arglist, format); - EngDebugPrint( "\nHAL: ", format, arglist ); - va_end(arglist); -} -#endif // KERNEL_NT - -static GDBGKeepAliveProc keepAliveProc; - -FX_EXPORT void FX_CSTYLE gdbg_set_keepalive(GDBGKeepAliveProc p) -{ - keepAliveProc = p; -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - if (gdbg_msgfile != NULL) { -#ifdef KERNEL - // shouldn't get here now - //commented out for now -KMW - //nwvsprintf(gdbgout,format,args); - //OutputDebugString("\n"); - //OutputDebugString("HAL: "); - //OutputDebugString(gdbgout); -#else -#if USE_DEBUG_STRING - if (UseDebugString) { - static char msgBuf[1024]; - - vsprintf(msgBuf, format, args); - -#if __DOS32__ - pciOutputDebugString(msgBuf); -#else - OutputDebugString(msgBuf); -#endif /* !__DOS32__ */ - } else -#endif /* USE_DEBUG_STRING */ - { - vfprintf(gdbg_msgfile,format,args); - // if there is a keepAlive callback, then call it - fflush(gdbg_msgfile); - } - - if (keepAliveProc) keepAliveProc(100); -#endif /* !KERNEL */ - } -} - -FX_EXPORT void FX_CSTYLE -gdbg_printf (const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_list args; - - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ - -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; -#ifndef KERNEL_NT - char newformat[4095]; -#endif - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); -#elif defined( KERNEL_NT ) - gdbg_NTPrint( "%s.%d:\t", gdbg_myname, level ); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else /* #ifndef KERNEL */ - Debug_Printf("%s.%d:\t", gdbg_myname, level); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); - FXUNUSED(newformat[0]); -#endif /* #ifndef KERNEL */ - - return (1); -} - - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -FX_EXPORT int FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); -#ifndef KERNEL - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -#elif defined( KERNEL_NT ) - va_start(args, format); - EngDebugPrint( "\nHAL: ", format, args ); - va_end(args); -#else - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); - FXUNUSED(args); -#endif /* #ifndef KERNEL */ - return (1); -} - -static GDBGErrorProc errorProcList[3]; - -FX_EXPORT int FX_CSTYLE gdbg_error_set_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - break; - } else if (errorProcList[i] == NULL) { - errorProcList[i] = p; - break; - } - } - - return (i < count); -} - -FX_EXPORT void FX_CSTYLE gdbg_error_clear_callback(GDBGErrorProc p) -{ - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] == p) { - errorProcList[i] = NULL; - break; - } - } -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -FX_EXPORT void FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ -#ifndef KERNEL - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); - - { - int i; - const int count = sizeof(errorProcList) / sizeof(errorProcList[0]); - - for(i = 0; i < count; i++) { - if (errorProcList[i] != NULL) { - va_start(args, format); - (*errorProcList[i])(kind, newformat, args); - va_end(args); - } - } - } -#elif defined( KERNEL_NT ) - va_list args; - - gdbg_NTPrint( "%s error (%s): ", gdbg_myname, kind); - va_start(args, format); - EngDebugPrint( "", format, args ); - va_end(args); -#else - Debug_Printf("%s error (%s): ", gdbg_myname, kind); - __asm lea eax, (format+4); - __asm mov ebx, format; - MyPrintf(); -#endif /* #ifndef KERNEL */ -} - -// return the error counter -FX_EXPORT int FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -FX_EXPORT int FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -FX_EXPORT void FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -FX_EXPORT int FX_CSTYLE -gdbg_set_file(const char *name) -{ -#ifndef KERNEL - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } - -#if USE_DEBUG_STRING - if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } else -#endif /* USE_DEBUG_STRING */ - { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - } - - return (outf != NULL); -#else /* #ifndef KERNEL */ - return 0; -#endif /* #ifndef KERNEL */ -} diff --git a/glide2x/h3/minihwc/hwcext.h b/glide2x/h3/minihwc/hwcext.h deleted file mode 100644 index 55db621..0000000 --- a/glide2x/h3/minihwc/hwcext.h +++ /dev/null @@ -1,459 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** File name: hwcext.h -** -** Description: Structures for the hwc extensions. -** -** $Header$ -** -** $History: hwcext.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:14p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/minihwc -** Fixes Phantom Menace, OGL, and others. -** -** ***************** Version 22 ***************** -** User: Michael Date: 2/26/99 Time: 10:21a -** Updated in $/devel/h3/Win95/dx/dd16 -** Proxy for KenW - These changes make alt-tab from winglide apps *much* -** more reliable. -** -** ***************** Version 21 ***************** -** User: Stuartb Date: 1/08/99 Time: 11:05a -** Updated in $/devel/h3/Win95/dx/dd16 -** Backed out LCDCTRL changes as advised by KMW. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 1/07/99 Time: 12:18p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added HWCEXT_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 19 ***************** -** User: Michael Date: 12/29/98 Time: 1:19p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -*/ -#ifndef HWCEXT_H -#define HWCEXT_H - -#if !defined( WINNT ) && !defined( __linux__ ) - -#define WIN32_LEAN_AND_MEAN -#include - -/* -** D3D notification function -*/ - -extern void D3notify(void); - -#endif /* WINNT */ - -/* -** Constants -*/ -#define HWCEXT_PROTOCOLREV 0x1 - -#define HWCEXT_MAX_BASEADDR 0x9 -#define HWCEXT_MAX_COLORBUFFERS 0x3 - -/* The HWC escape */ -#define EXT_HWC 0xfd3 - -/******************************************************************** -** Here's the protocol: -*********************************************************************/ - -/* -** HWCEXT_GETDRIVERVERION -** -** INPUT: Nothing -** OUTPUT: Driver Major & Minor Version -*/ -#define HWCEXT_GETDRIVERVERSION 0x0 -typedef struct hwcExtDriverVersionRes_s { - FxU32 - major, /* Driver major version */ - minor; /* Driver minor version */ -} hwcExtDriverVersionRes_t; - -/* -** HWCEXT_ALLOCCONTEXT -** -** INPUT: Nothing -** OUTPUT: Context ID -*/ -#define HWCEXT_ALLOCCONTEXT 0x1 - - -#define HWCEXT_ABAPPTYPE_FSEM 0x0 /* Full-screen app */ -#define HWCEXT_ABAPPTYPE_WIND 0x1 /* Windowed app */ - -/* Given to HWCEXT_ALLOCCONTEXT */ -typedef struct hwcExtAllocContextReq_s { - FxU32 - protocolRev, /* Revision of this protocol */ - appType; /* FSEM or WIND */ -} hwcExtAllocContextReq_t; - -/* Returned from HWCEXT_ALLOCCONTEXT*/ -typedef struct hwcExtAllocContextRes_s { - FxU32 - contextID; -} hwcExtAllocContextRes_t; - -/* -** HWCEXT_GETDEVICECONFIG -** -** INPUT: Device number (0 for first, 1 for second....) -** OUTPUT: VendorID, deviceID, fbRAM, chip rev -*/ -#define HWCEXT_GETDEVICECONFIG 0x2 -/* Given to HWCEXT_GETDEVICECONFIG */ -typedef struct hwcExtDeviceConfigReq_s { - HDC - dc; /* Device context */ - FxU32 - devNo; /* Device number (0, 1, ...) */ -} hwcExtDeviceConfigReq_t; - -/* Returned from HWCEXT_GETDEVICECONFIG */ -typedef struct hwcExtDeviceConfigRes_s { - FxU32 - devNum, /* Device Number */ - vendorID, /* PCI Vendor ID */ - deviceID, /* PCI Device ID */ - fbRam, /* How much frame buuffer RAM */ - chipRev; /* Chip Revision */ - FxU32 - pciStride, /* 1024, 2048, 4096, 8192, 16384 */ - hwStride, /* hardware x-translation stride */ - tileMark; /* hardware tile addressing watermark */ -} hwcExtDeviceConfigRes_t; - -/* -** HWCEXT_GETLINEARADDR -** -** INPUT: Device number -** OUTPUT: Number of base addresses, base address list -*/ -#define HWCEXT_GETLINEARADDR 0x3 -/* Given to HWCEXT_GETLINEARADDR */ -typedef struct hwcExtLinearAddrReq_s { - FxU32 devNum; /* Device Number */ - FxU32 pHandle; /* Process Handle */ -} hwcExtLinearAddrReq_t; - -/* Returned from HWCEXT_GETLINEARADDR */ -typedef struct hwcExtLinearAddrRes_s { - FxU32 - numBaseAddrs, /* # base addresses */ - baseAddresses[HWCEXT_MAX_BASEADDR]; /* linear Addresses */ -} hwcExtLinearAddrRes_t; - -/* -** HWCEXT_ALLOCFIFO -** -** OBSOLTE: Do not use -*/ -#define HWCEXT_ALLOCFIFO 0x4 - -typedef struct hwcExtAllocFIFORes_s { - FxU32 - commandBuffer, /* Command buffer */ - commandBufferSz, /* Size of command buffer */ - psBuffer, /* Persistent state buffer */ - psBufferSz; /* Size of persistent state buffer */ -} hwcExtAllocFIFORes_t; - -/* -** HWCEXT_EXECUTEFIFO -** -** INPUT: ptr to FIFO buffer, fifosize, persistent state FIFO & size -** OUTPUT: Status only. -** -*/ -#define HWCEXT_EXECUTEFIFO 0x5 - -/* Given to HWCEXT_EXECUTEFIFO */ -typedef struct hwcExtExecuteFifoReq_s { - /* NB: These fields must be first to support old drivers that do not - * support multiple fifo types. - */ - FxU32 - fifoPtr, /* Linear address of command stream to execute */ - fifoSize, /* Size of command stream (DWORDS) */ - statePtr, /* Linear address of persistent state buffer */ - stateSize; /* Size of persistent state buffer (DWORDS) */ - - FxU32 - fifoType; /* One of HWCEXT_FIFO_XXXX */ - - /* These are only necessary if fifoType != HWCEXT_FIFO_HOST */ - FxU32 - fifoOffset, /* HW relative address of command stream */ - stateOffset, /* HW relative address of state buffer */ - sentinalOffset, /* HW relative address of buffer to write serialNumber */ - serialNumber; /* Client specified value to write to indicate that the - * current command stream has been committed by the hw. - */ -} hwcExtExecuteFifoReq_t; - -/* -** HWCEXT_QUERYCONTEXT -** -** INPUT: Context ID -** OUTPUT: Status -*/ -#define HWCEXT_QUERYCONTEXT 0x6 - -#define HWC_CONTEXT_ACTIVE 0x0 -#define HWC_CONTEXT_LOST 0x1 - -/* -** HWCEXT_RELEASECONTEXT -** -** INPUT: Context ID -** OUTPUT: Status -*/ -#define HWCEXT_RELEASECONTEXT 0x7 - -/* Given to HWCEXT_RELEASECONTEXT */ -typedef struct hwcExtReleaseContextReq_s { - FxU32 - contextID; /* duh */ -} hwcExtReleaseContextReq_t; - -#define HWCEXT_HWCSETEXCLUSIVE 0x8 -#define HWCEXT_HWCRLSEXCLUSIVE 0x9 - -/* -** HWCEXT_I2C_WRITE_REQ -** -** INPUT: i2c address, register number, dwValue to write -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -*/ - -#define HWCEXT_I2C_WRITE_REQ 0xa - -typedef struct hwcExtI2CwriteReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ - FxU32 i2c_regValue; /* the value to write */ -} hwcExtI2CwriteReq_t; - -/* -** HWCEXT_I2C_READ_REQ -** -** INPUT: i2c address, register number -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -** value read: optRes.i2c_ReadRes.i2c_regValue -*/ - -#define HWCEXT_I2C_READ_REQ 0xb - -typedef struct hwcExtI2CreadReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ -} hwcExtI2CreadReq_t; - -#define HWCEXT_I2C_READ_RES 0xc - -typedef struct hwcExtI2CreadRes_s { - FxU32 i2c_regValue; /* the value read from reg above */ -} hwcExtI2CreadRes_t; - -/* -** HWCEXT_I2C_WRITE_REQ -** -** INPUT: i2c address, register number, dwValue to write -** OUTPUT: status (FXTRUE if OK, FXFALSE if fail, I2C_BUSY if busy) -*/ - -#define HWCEXT_I2C_MULTI_WRITE_REQ 0xd -typedef struct hwcExtI2CmultiWriteReq_s { - FxU32 deviceAddress; /* bus address of device */ - FxU32 i2c_regNum; /* sometimes called subaddress */ - FxU8 *i2c_regValues; /* the value to write */ - FxU32 i2c_numBytes; /* number of bytes to xfer */ -} hwcExtI2CmultiWriteReq_t; - - -/* -** HWCEXT_GETAGPINFO -** -** Get the relavent AGP info: linear address, physical address, size. -*/ -#define HWCEXT_GETAGPINFO 0xe -typedef struct hwcExtAGPInfoRes_s { - FxU32 - lAddr, /* Linear Address of AGP memory */ - pAddr, /* Physical Address of AGP memory */ - size; /* Size */ -} hwcExtAGPInfoRes_t; - -/* -** HWCEXT_VIDTIMING -** -** Send the FxVidTiming structure to the driver. -** -*/ -#define HWCEXT_VIDTIMING 0xf -typedef struct hwcExtVidTimingReq_s { - void *vidTiming; -} hwcExtVidTimingReq_t; - -/* HWCEXT_FIFOINFO - * - * Find out information about the current physcal location of the - * current command fifo. - */ -#define HWCEXT_FIFOINFO 0x10UL - -#define HWCEXT_FIFO_INVALID 0x00UL -#define HWCEXT_FIFO_FB 0x01UL /* FIFO in frame buffer */ -#define HWCEXT_FIFO_HOST 0x02UL /* FIFO in host memory */ -#define HWCEXT_FIFO_AGP 0x03UL /* FIFO in AGP */ - -typedef struct { - FxU32 fifoType; -} hwcExtFifoInfoRes_t; - -/* Returns the offset that a linear address is from a given 'base' - * linear page address. This offset is suitable for use as a hw - * relative address for buffers etc. - * - * mapAddr: Linear address used to be the 'base' of the physical - * address also mapped by remapAddr. - * remapAddr: Target linear addr to compute the offset for. - */ -#define HWCEXT_LINEAR_MAP_OFFSET 0x11UL - -typedef struct { - FxU32 - mapAddr, - remapAddr; -} hwcExtLinearMapInfoReq_t; - -typedef struct { - FxU32 linAddrOffset; -} hwcExtLinearMapInfoRes_t; - -/* HWCEXT_GAMMATABLE_DOWNLOAD - * - * Downloads a gamma table from Glide that is then impressed upon - * the hardware. This is a transient gamma, and is not preserved - * in the registry or anywhere in the drivers. There is no answer - * or status return. - * - * INPUT: a pointer to a complete gamma table (256 entries) - * - * OUTPUT: none - */ -#define HWCEXT_DOWNLOAD_GAMMA 0x12UL - -typedef struct { - FxU32 gammaPtr; - FxI32 numGammaEntries; -} hwcExtDownloadGammaReq_t; - - -/* HWCEXT_RESTORE_DESKTOP - * - * Restores the video settings to those of the desktop before glide - * exclusive mode took over. We need this because there are cases where - * we do not get a mode set call (Enable1) when task-switching (e.g., ALT-TAB) - * out of exclusive mode glide apps. We do this by calling the same function - * that is used to restore the desktop when returning from full screen - * DOS mode. This resets video, the cmdfifo, the desktop's cursor, sets - * some overlay video flags saying that the desktop was reset, etc. - * - * INPUT: none - * OUTPUT: none - */ -#define HWCEXT_RESTORE_DESKTOP 0x13UL - - - -/* -** The Request structure (given as input data to ExtEscape() ) -*/ -typedef struct hwcExtRequest_s { - FxU32 - contextID, /* ID of this context */ - which; /* Which request */ - union reqOptData { - hwcExtAllocContextReq_t allocContextReq; - hwcExtDeviceConfigReq_t deviceConfigReq; - hwcExtLinearAddrReq_t linearAddrReq; - hwcExtExecuteFifoReq_t executeFifoReq; - hwcExtReleaseContextReq_t releaseContextReq; - hwcExtI2CwriteReq_t i2c_WriteReq; - hwcExtI2CreadReq_t i2c_ReadReq; - hwcExtI2CmultiWriteReq_t i2c_MultiWriteReq; - hwcExtVidTimingReq_t vidTimingReq; - hwcExtLinearMapInfoReq_t mapInfoReq; - hwcExtDownloadGammaReq_t gamma; - } optData; -} hwcExtRequest_t; - -typedef struct hwcExtResult_s { - FxI32 - resStatus; - union resOptData { - hwcExtDriverVersionRes_t driverVersionRes; - hwcExtAllocContextRes_t allocContextRes; - hwcExtDeviceConfigRes_t deviceConfigRes; - hwcExtLinearAddrRes_t linearAddressRes; - hwcExtAllocFIFORes_t allocFifoRes; - hwcExtI2CreadRes_t i2c_ReadRes; - hwcExtAGPInfoRes_t agpInfoRes; - hwcExtFifoInfoRes_t fifoInfoRes; - hwcExtLinearMapInfoRes_t mapInfoRes; - /* no result for gamma download */ - } optData; -} hwcExtResult_t; - -#ifdef WINNT -/* - * Global structure used to store Glide state, used by the display driver - * - * This will need changing if one driver supports multiple boards. - * - */ - -typedef struct -{ - LONG glideGDIFlags; /* For cooperation with GDI. (Exclusive flag) */ - HANDLE glideProcessHandle; /* Handle of glide process that last mapped membases */ - BYTE* glideRegBase; /* Saved glide register base address */ - BYTE* glideLfbBase; /* Saved glide Lfb base address - for mapping only */ - BYTE* glideScreenBase; /* Saved glide screen base address - used by glide. */ - - ULONG vidProcCfg; - ULONG vidDesktopOverlayStride; -} GLIDESTATE; - -extern GLIDESTATE glideState; -#endif /* WINNT */ - -#endif /* HWCEXT_H not defined */ diff --git a/glide2x/h3/minihwc/hwcio.c b/glide2x/h3/minihwc/hwcio.c deleted file mode 100644 index caab19e..0000000 --- a/glide2x/h3/minihwc/hwcio.c +++ /dev/null @@ -1,808 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 1 3/04/98 4:13p Dow -** -*/ - - -char * ioRegNames[] = { - "status", - "pciInit0", - "sipMonitor", - "lfbMemoryConfig", - "miscInit0", - "miscInit1", - "dramInit0", - "dramInit1", - "agpInit", - "tmuGbeInit", - "vgaInit0", - "vgaInit1", - "dramCommand", - "dramData", - "reservedZ0", - "reservedZ1", - "pllCtrl0", - "pllCtrl1", - "pllCtrl2", - "dacMode", - "dacAddr", - "dacData", - "vidMaxRGBDelta", - "vidProcCfg", - "hwCurPatAddr", - "hwCurLoc", - "hwCurC0", - "hwCurC1", - "vidInFormat", - "vidInStatus", - "vidSerialParallelPort", - "vidInXDecimDeltas", - "vidInDecimInitErrs", - "vidInYDecimDeltas", - "vidPixelBufThold", - "vidChromaMin", - "vidChromaMax", - "vidCurrentLine", - "vidScreenSize", - "vidOverlayStartCoords", - "vidOverlayEndScreenCoord", - "vidOverlayDudx", - "vidOverlayDudxOffsetSrcWidth", - "vidOverlayDvdy", - "vgaRegister00", - "vgaRegister01", - "vgaRegister02", - "vgaRegister03", - "vgaRegister04", - "vgaRegister05", - "vgaRegister06", - "vgaRegister07", - "vgaRegister08", - "vgaRegister09", - "vgaRegister0a", - "vgaRegister0b", - "vidOverlayDvdyOffset", - "vidDesktopStartAddr", - "vidDesktopOverlayStride", - "vidInAddr0", - "vidInAddr1", - "vidInAddr2", - "vidInStride", - "vidCurrOverlayStartAddr" -}; - -char *cmdAGPRegNames[] = { - // AGP - "agpReqSize", - "hostAddrLow", - "hostAddrHigh", - "graphicsAddr", - "graphicsStride", - "moveCMD", - "reservedL0", - "reservedL1", - // CMD FIFO 0 - "baseAddrL0", - "baseSize0", - "bump0", - "readPtrL0", - "readPtrH0", - "aMin0", - "unusedA0", - "aMax0", - "unusedB0", - "depth0", - "holeCount0", - "reserved0", - // CMD FIFO 1 - "baseAddrL1", - "baseSize1", - "bump1", - "readPtrL1", - "readPtrH1", - "aMin1", - "unusedA1", - "aMax1", - "unusedB1", - "depth1", - "holeCount1", - "reserved1", - "cmdFifoThresh", - - "reservedO00", - "reservedO01", - "reservedO02", - "reservedO03", - "reservedO04", - "reservedO05", - "reservedO06", - "reserved007", - "reservedP00", - "reservedP01", - "reservedP02", - "reservedP03", - "reservedP04", - "reservedP05", - "reservedP06", - "reservedP07", - "reservedQ00", - "reservedQ01", - "reservedQ02", - "reservedQ03", - "reservedQ04", - "reservedQ05", - "reservedQ06", - "reservedQ07", - "reservedR00", - "reservedR01", - "reservedR02", - "reservedR03", - "reservedR04", - "reservedR05", - "reservedR06", - "reservedR07", - - // misc - "yuvBaseAddr", - "yuvStride" -}; - -char *waxRegNames[] = { - "status", - "unused0", - "clip0min", - "clip0max", - "dstBaseAddr", - "dstFormat", - "srcColorkeyMin", - "srcColorkeyMax", - "dstColorkeyMin", - "dstColorkeyMax", - "bresError0", - "bresError1", - "rop", - "srcBaseAddr", - "commandEx", - "lineStipple", - "lineStyle", - "pattern0alias", - "pattern1alias", - "clip1min", - "clip1max", - "srcFormat", - "srcSize", - "srcXY", - "colorBack", - "colorFore", - "dstSize", - "dstXY", - "command", - "reserved00", - "reserved01", - "reserved02", - "launch00", - "launch01", - "launch02", - "launch03", - "launch04", - "launch05", - "launch06", - "launch07", - "launch08", - "launch09", - "launch0A", - "launch0B", - "launch0C", - "launch0D", - "launch0E", - "launch0F", - "launch10", - "launch11", - "launch12", - "launch13", - "launch14", - "launch15", - "launch16", - "launch17", - "launch18", - "launch19", - "launch1A", - "launch1B", - "launch1C", - "launch1D", - "launch1E", - "launch1F", - "colorPattern00", - "colorPattern01", - "colorPattern02", - "colorPattern03", - "colorPattern04", - "colorPattern05", - "colorPattern06", - "colorPattern07", - "colorPattern08", - "colorPattern09", - "colorPattern0A", - "colorPattern0B", - "colorPattern0C", - "colorPattern0D", - "colorPattern0E", - "colorPattern0F", - "colorPattern10", - "colorPattern11", - "colorPattern12", - "colorPattern13", - "colorPattern14", - "colorPattern15", - "colorPattern16", - "colorPattern17", - "colorPattern18", - "colorPattern19", - "colorPattern1A", - "colorPattern1B", - "colorPattern1C", - "colorPattern1D", - "colorPattern1E", - "colorPattern1F", - "colorPattern20", - "colorPattern21", - "colorPattern22", - "colorPattern23", - "colorPattern24", - "colorPattern25", - "colorPattern26", - "colorPattern27", - "colorPattern28", - "colorPattern29", - "colorPattern2A", - "colorPattern2B", - "colorPattern2C", - "colorPattern2D", - "colorPattern2E", - "colorPattern2F", - "colorPattern30", - "colorPattern31", - "colorPattern32", - "colorPattern33", - "colorPattern34", - "colorPattern35", - "colorPattern36", - "colorPattern37", - "colorPattern38", - "colorPattern39", - "colorPattern3A", - "colorPattern3B", - "colorPattern3C", - "colorPattern3D", - "colorPattern3E", - "colorPattern3F", - "colorTransLut000", - "colorTransLut001", - "colorTransLut002", - "colorTransLut003", - "colorTransLut004", - "colorTransLut005", - "colorTransLut006", - "colorTransLut007", - "colorTransLut008", - "colorTransLut009", - "colorTransLut00A", - "colorTransLut00B", - "colorTransLut00C", - "colorTransLut00D", - "colorTransLut00E", - "colorTransLut00F", - "colorTransLut010", - "colorTransLut011", - "colorTransLut012", - "colorTransLut013", - "colorTransLut014", - "colorTransLut015", - "colorTransLut016", - "colorTransLut017", - "colorTransLut018", - "colorTransLut019", - "colorTransLut01A", - "colorTransLut01B", - "colorTransLut01C", - "colorTransLut01D", - "colorTransLut01E", - "colorTransLut01F", - "colorTransLut020", - "colorTransLut021", - "colorTransLut022", - "colorTransLut023", - "colorTransLut024", - "colorTransLut025", - "colorTransLut026", - "colorTransLut027", - "colorTransLut028", - "colorTransLut029", - "colorTransLut02A", - "colorTransLut02B", - "colorTransLut02C", - "colorTransLut02D", - "colorTransLut02E", - "colorTransLut02F", - "colorTransLut030", - "colorTransLut031", - "colorTransLut032", - "colorTransLut033", - "colorTransLut034", - "colorTransLut035", - "colorTransLut036", - "colorTransLut037", - "colorTransLut038", - "colorTransLut039", - "colorTransLut03A", - "colorTransLut03B", - "colorTransLut03C", - "colorTransLut03D", - "colorTransLut03E", - "colorTransLut03F", - "colorTransLut040", - "colorTransLut041", - "colorTransLut042", - "colorTransLut043", - "colorTransLut044", - "colorTransLut045", - "colorTransLut046", - "colorTransLut047", - "colorTransLut048", - "colorTransLut049", - "colorTransLut04A", - "colorTransLut04B", - "colorTransLut04C", - "colorTransLut04D", - "colorTransLut04E", - "colorTransLut04F", - "colorTransLut050", - "colorTransLut051", - "colorTransLut052", - "colorTransLut053", - "colorTransLut054", - "colorTransLut055", - "colorTransLut056", - "colorTransLut057", - "colorTransLut058", - "colorTransLut059", - "colorTransLut05A", - "colorTransLut05B", - "colorTransLut05C", - "colorTransLut05D", - "colorTransLut05E", - "colorTransLut05F", - "colorTransLut060", - "colorTransLut061", - "colorTransLut062", - "colorTransLut063", - "colorTransLut064", - "colorTransLut065", - "colorTransLut066", - "colorTransLut067", - "colorTransLut068", - "colorTransLut069", - "colorTransLut06A", - "colorTransLut06B", - "colorTransLut06C", - "colorTransLut06D", - "colorTransLut06E", - "colorTransLut06F", - "colorTransLut070", - "colorTransLut071", - "colorTransLut072", - "colorTransLut073", - "colorTransLut074", - "colorTransLut075", - "colorTransLut076", - "colorTransLut077", - "colorTransLut078", - "colorTransLut079", - "colorTransLut07A", - "colorTransLut07B", - "colorTransLut07C", - "colorTransLut07D", - "colorTransLut07E", - "colorTransLut07F", - "colorTransLut080", - "colorTransLut081", - "colorTransLut082", - "colorTransLut083", - "colorTransLut084", - "colorTransLut085", - "colorTransLut086", - "colorTransLut087", - "colorTransLut088", - "colorTransLut089", - "colorTransLut08A", - "colorTransLut08B", - "colorTransLut08C", - "colorTransLut08D", - "colorTransLut08E", - "colorTransLut08F", - "colorTransLut090", - "colorTransLut091", - "colorTransLut092", - "colorTransLut093", - "colorTransLut094", - "colorTransLut095", - "colorTransLut096", - "colorTransLut097", - "colorTransLut098", - "colorTransLut099", - "colorTransLut09A", - "colorTransLut09B", - "colorTransLut09C", - "colorTransLut09D", - "colorTransLut09E", - "colorTransLut09F", - "colorTransLut0A0", - "colorTransLut0A1", - "colorTransLut0A2", - "colorTransLut0A3", - "colorTransLut0A4", - "colorTransLut0A5", - "colorTransLut0A6", - "colorTransLut0A7", - "colorTransLut0A8", - "colorTransLut0A9", - "colorTransLut0AA", - "colorTransLut0AB", - "colorTransLut0AC", - "colorTransLut0AD", - "colorTransLut0AE", - "colorTransLut0AF", - "colorTransLut0B0", - "colorTransLut0B1", - "colorTransLut0B2", - "colorTransLut0B3", - "colorTransLut0B4", - "colorTransLut0B5", - "colorTransLut0B6", - "colorTransLut0B7", - "colorTransLut0B8", - "colorTransLut0B9", - "colorTransLut0BA", - "colorTransLut0BB", - "colorTransLut0BC", - "colorTransLut0BD", - "colorTransLut0BE", - "colorTransLut0BF", - "colorTransLut0C0", - "colorTransLut0C1", - "colorTransLut0C2", - "colorTransLut0C3", - "colorTransLut0C4", - "colorTransLut0C5", - "colorTransLut0C6", - "colorTransLut0C7", - "colorTransLut0C8", - "colorTransLut0C9", - "colorTransLut0CA", - "colorTransLut0CB", - "colorTransLut0CC", - "colorTransLut0CD", - "colorTransLut0CE", - "colorTransLut0CF", - "colorTransLut0D0", - "colorTransLut0D1", - "colorTransLut0D2", - "colorTransLut0D3", - "colorTransLut0D4", - "colorTransLut0D5", - "colorTransLut0D6", - "colorTransLut0D7", - "colorTransLut0D8", - "colorTransLut0D9", - "colorTransLut0DA", - "colorTransLut0DB", - "colorTransLut0DC", - "colorTransLut0DD", - "colorTransLut0DE", - "colorTransLut0DF", - "colorTransLut0E0", - "colorTransLut0E1", - "colorTransLut0E2", - "colorTransLut0E3", - "colorTransLut0E4", - "colorTransLut0E5", - "colorTransLut0E6", - "colorTransLut0E7", - "colorTransLut0E8", - "colorTransLut0E9", - "colorTransLut0EA", - "colorTransLut0EB", - "colorTransLut0EC", - "colorTransLut0ED", - "colorTransLut0EE", - "colorTransLut0EF", - "colorTransLut0F0", - "colorTransLut0F1", - "colorTransLut0F2", - "colorTransLut0F3", - "colorTransLut0F4", - "colorTransLut0F5", - "colorTransLut0F6", - "colorTransLut0F7", - "colorTransLut0F8", - "colorTransLut0F9", - "colorTransLut0FA", - "colorTransLut0FB", - "colorTransLut0FC", - "colorTransLut0FD", - "colorTransLut0FE", - "colorTransLut0FF" -}; - -char *sstRegNames[] = { - "status", - "intrCtrl", - "vAx", - "vAy", - "vBx", - "vBy", - "vCx", - "vCy", - - "r", - "g", - "b", - "z", - "a", - "s", - "t", - "w", - - "drdx", - "dgdx", - "dbdx", - "dzdx", - "dadx", - "dsdx", - "dtdx", - "dwdx", - - "drdy", - "dgdy", - "dbdy", - "dzdy", - "dady", - "dsdy", - "dtdy", - "dwdy", - - "triangleCMD", - "reservedA", - "FvA", - "FvA", - "FvB", - "FvB", - "FvC", - "FvC", - - "Fr", - "Fg", - "Fb", - "Fz", - "Fa", - "Fs", - "Ft", - "Fw", - - "Fdrdx", - "Fdgdx", - "Fdbdx", - "Fdzdx", - "Fdadx", - "Fdsdx", - "Fdtdx", - "Fdwdx", - - "Fdrdy", - "Fdgdy", - "Fdbdy", - "Fdzdy", - "Fdady", - "Fdsdy", - "Fdtdy", - "Fdwdy", - - "FtriangleCMD", - "fbzColorPath", - "fogMode", - "alphaMode", - "fbzMode", - "lfbMode", - "clipLeftRight", - "clipBottomTop", - - "nopCMD", - "fastfillCMD", - "swapbufferCMD", - "fogColor", - "zaColor", - "chromaKey", - "chromaRange", - "userIntrCmd", - - "stipple", - "c0", - "c1", - "fbiPixelsIn", - "fbiChromaFail", - "fbiZfuncFail", - "fbiAfuncFail", - "fbiPixelsOut", - - "fogTable00", - "fogTable01", - "fogTable02", - "fogTable03", - "fogTable04", - "fogTable05", - "fogTable06", - "fogTable07", - "fogTable08", - "fogTable09", - "fogTable0A", - "fogTable0B", - "fogTable0C", - "fogTable0D", - "fogTable0E", - "fogTable0F", - "fogTable10", - "fogTable11", - "fogTable12", - "fogTable13", - "fogTable14", - "fogTable15", - "fogTable16", - "fogTable17", - "fogTable18", - "fogTable19", - "fogTable1A", - "fogTable1B", - "fogTable1C", - "fogTable1D", - "fogTable1E", - "fogTable1F", - - "reservedB0", - "reservedB1", - "reservedB2", - - "colBufferAddr", - "colBufferStride", - "auxBufferAddr", - "auxBufferStride", - "reservedC", - - "clipLeftRight1", - "clipBottomTop1", - "reservedD00", - "reservedD01", - "reservedD02", - "reservedD03", - "reservedD04", - "reservedD05", - - "reservedE00", - "reservedE01", - "reservedE02", - "reservedE03", - "reservedE04", - "reservedE05", - - "reservedF0", - "reservedF1", - "reservedF2", - "swapBufferPend", - "leftOverlayBuf", - "rightOverlayBuf", - "fbiSwapHistory", - "fbiTrianglesOut", - - "sSetupMode", - "sVx", - "sVy", - "sARGB", - "sRed", - "sGreen", - "sBlue", - "sAlpha", - - "sVz", - "sOowfbi", - "sOow0", - "sSow0", - "sTow0", - "sOow1", - "sSow1", - "sTow1", - - "sDrawTriCMD", - "sBeginTriCMD", - "reservedG00", - "reservedG01", - "reservedG02", - "reservedG03", - "reservedG04", - "reservedG05", - - "reservedH00", - "reservedH01", - "reservedH02", - "reservedH03", - "reservedH04", - "reservedH05", - - "reservedI00", - "reservedI01", - "reservedI02", - "reservedI03", - "reservedI04", - "reservedI05", - - "textureMode", - "tLOD", - "tDetail", - "texBaseAddr", - "texBaseAddr1", - "texBaseAddr2", - "texBaseAddr38", - "trexInit0", - "trexInit1", - - "nccTable000", - "nccTable001", - "nccTable002", - "nccTable003", - "nccTable004", - "nccTable005", - "nccTable006", - "nccTable007", - "nccTable008", - "nccTable009", - "nccTable00A", - "nccTable00B", - - "nccTable100", - "nccTable101", - "nccTable102", - "nccTable103", - "nccTable104", - "nccTable105", - "nccTable106", - "nccTable107", - "nccTable108", - "nccTable109", - "nccTable10A", - "nccTable10B", - - "tChromaKeyMin", - "tChromaKeyMax" -}; diff --git a/glide2x/h3/minihwc/hwcio.h b/glide2x/h3/minihwc/hwcio.h deleted file mode 100644 index dd0afe6..0000000 --- a/glide2x/h3/minihwc/hwcio.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef HWCIO_H -#define HWCIO_H - -extern char *ioRegNames[]; -extern char *cmdAGPRegNames[]; -extern char *waxRegNames[]; -extern char *sstRegNames[]; - -/* -** I/O Macros -*/ -#define HWC_IO_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to IO Register %s\n", val,\ - ioRegNames[(offsetof(SstIORegs, reg)) >> 2]);\ -((SstIORegs *) regInfo.ioMemBase)->reg = val - -#define HWC_IO_LOAD(regInfo, reg, val)\ -val = ((SstIORegs *) regInfo.ioMemBase)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from IO Register %s\n", val,\ - ioRegNames[(offsetof(SstIORegs, reg)) >> 2]); - -#define HWC_CAGP_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to CAGP Register %s\n", val,\ - cmdAGPRegNames[(offsetof(SstCRegs, reg)) >> 2]);\ -((SstCRegs *) (regInfo.cmdAGPBase))->reg = val - -#define HWC_CAGP_LOAD(regInfo, reg, val)\ -val = ((SstCRegs *) (regInfo).cmdAGPBase)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from CAGP Register %s\n", val,\ - cmdAGPRegNames[(offsetof(SstCRegs, reg)) >> 2]); - -#define HWC_WAX_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to WAX Register %s\n", val,\ - waxRegnames[(offsetof(SstGRegs, reg)) >> 2]);\ -((SstGRegs *) regInfo->waxRegs)->reg = val - -#define HWC_WAX_LOAD(regInfo, reg, val)\ -val = ((SstGRegs *) regInfo->waxRegs)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from WAX Register %s\n", val,\ - waxRegnames[(offsetof(SstGRegs, reg)) >> 2]); - -#define HWC_SST_STORE(regInfo, reg, val)\ -GDBG_INFO(120, "Storing 0x%x to 3D Register %s\n", val,\ - sstRegNames[(offsetof(SstRegs, reg)) >> 2]);\ -((SstRegs *) regInfo->sstRegs)->reg = val - -#define HWC_SST_LOAD(regInfo, reg, val)\ -val = ((SstRegs *) regInfo->sstRegs)->reg;\ -GDBG_INFO(120, "Loaded 0x%x from WAX Register %s\n", val,\ - sstRegNames[(offsetof(SstRegs, reg)) >> 2]); - -#endif /* HWCIO_H not defined */ diff --git a/glide2x/h3/minihwc/initvga.h b/glide2x/h3/minihwc/initvga.h deleted file mode 100644 index d61b7ee..0000000 --- a/glide2x/h3/minihwc/initvga.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#ifndef _INITVGA_H_ -#define _INITVGA_H_ - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif - -/* -** Some Standard VGA Registers -*/ -/* Reading */ -#define VGA_MISC_OUTPUT_READ 0x3cc - -/* Writing */ -#define VGA_MISC_OUTPUT_WRITE 0x3c2 - -/* Read/Write */ -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#define VGA_REGISTER_CRTC 0x3D4 -#define VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX 0x0C -#define VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX 0x0D -#define AR_CRTC_SERIAL_OVERFLOW_INDEX 0x1C - -/* General Port I/O */ -#ifdef GDBG_INFO_ON - -#define OUTP(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outp(port, val) - -#define OUTPW(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outpw(port, val) - - -#define INP(port, val)\ -val = _inp(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#define INPW(port, val)\ -val = _inpW(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#else - -#define OUTP(port, val) _outp(port, val) -#define INP(port, val) val = _inp(port) - -#define OUTPW(port, val) _outpw(port, val) -#define INPW(port, val) val = _inpw(port) - -#endif - -/* Macros for Sequencer registers */ -#define SEQU_INDEX 0x3c4 -#define SEQU_DATA 0x3c5 - -/* Macros for CRTC registers */ -#define CRTC_INDEX 0x3d4 -#define CRTC_DATA 0x3d5 - -#ifdef GDBG_INFO_ON - -#define SEQU_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to Sequencer Index 0x%x\n", FN_NAME, val, reg));\ -_outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val)\ -_outp(SEQU_INDEX, reg);val = _inp(SEQU_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from Sequencer Index 0x%x\n", val, reg)); - -#define CRTC_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to CRTC Index 0x%x\n", FN_NAME, val, reg));\ -_outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,val)\ -_outp(CRTC_INDEX, reg); val = _inp(CRTC_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from CRTC Index 0x%x\n", FN_NAME, val, reg)) - -#else - -#define SEQU_SET(reg,val) _outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val) _outp(SEQU_INDEX, reg); val = _inp(SEQU_DATA) - -#define CRTC_SET(reg,val) _outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,d) _outp(CRTC_INDEX, reg); d = _inp(CRTC_DATA) - -#endif - - -#endif /* _INITVGA_H_ */ diff --git a/glide2x/h3/minihwc/linhwc.c b/glide2x/h3/minihwc/linhwc.c deleted file mode 100644 index 8193999..0000000 --- a/glide2x/h3/minihwc/linhwc.c +++ /dev/null @@ -1,1256 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -/* - We need to provide the following functions: - -char * -hwcGetErrorString(void); - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID); - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask); - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo); - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers); - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo); - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo); - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay); - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo); - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled); -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -static FxU32 fenceVar; -#define P6FENCE asm("xchg %%eax, %0" : : "m" (fenceVar) : "eax"); - -#define MAXFIFOSIZE 0x40000 -#define FIFOPAD 0x0000 -#define AUXPAD 0x1000 -#define HWC_TILED_BUFFER_BYTES 0x1000UL /* 128 Bytes x 32 lines */ -#define HWC_TILED_BUFFER_Y_ALIGN 0x20000UL -#define HWC_TILED_BUFFER_X_ADJUST 0x80UL - -static hwcInfo hInfo; -static char errorString[1024]; -static FxU32 saveVidProcCfg; -static FxU32 saveLfbMemoryConfig; -static FxU32 saveMiscInit0; -static FxU32 finalVidProcCfg; -static FxU32 finalLfbMemoryCfg; -static FxU32 finalVidDesktopOverlayStride; - -static Display *dpy = 0; -static int screenNum = 0; -static int screenWidth = 0; -static int screenHeight= 0; -static int screenDepth = 0; -static void* screenPhys = 0; -static int screenMem = 0; -static XF86VidModeModeInfo **vidModes = 0; -static int inDGA = 0; - -static FxU32 calcBufferStride(FxU32 xres, FxBool tiled); -static FxU32 calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled); -static FxU32 calcBufferSizeInTiles(FxU32 xres, FxU32 yres); -static FxU32 calcBufferHeightInTiles(FxU32 yres); -static FxU32 hwcBufferLfbAddr(FxU32 bufNum, const hwcBoardInfo* bInfo, - FxBool colBufAlignP); - -typedef struct envitem_t { - char *env; - char *val; - struct envitem_t *next; -} envitem; - -static envitem *first=0; -static int envinit=0; - -static void loadEnvFile() { - FILE *file; - char data[128]; - char *env, *val; - envitem *item; - int first_err=1; - - if (envinit) return; - envinit=1; - file=fopen("/etc/conf.3dfx/voodoo3", "r"); - if (!file) return; - while (1) { - if (!fgets(data, 128, file)) return; - if (*data=='#') continue; - if (*data=='\n') continue; - val=strchr(data, '='); - if (!val) { - if (first_err) { - fprintf(stderr, "In config file /etc/conf.3dfx/voodoo3:\n"); - first_err=0; - } - fprintf(stderr, "Malformed line: %s\n", data); - continue; - - } - *val=0; - env=data; - val++; - item=malloc(sizeof(envitem)); - item->env=malloc(strlen(env)+1); - strcpy(item->env, env); - item->val=malloc(strlen(val)+1); - strcpy(item->val, val); - item->next=first; - first=item; - } -} - -static void deleteEnvData() { - envitem *ptr, *next; - - ptr=first; - while (ptr) { - next=ptr->next; - if (ptr->env) free(ptr->env); - if (ptr->val) free(ptr->val); - free(ptr); - ptr=next; - } - first=0; - envinit=0; -} - -char * -hwcGetErrorString() -{ -#define FN_NAME "hwcGetErrorString" - return errorString; -#undef FN_NAME -} /* hwcGetErrorString */ - -static int initX(int index) { - int eventbase, errorbase, flags; - int banksize; - - if (dpy!=0) return FXTRUE; - dpy=XOpenDisplay(""); - if (!dpy) { - sprintf(errorString, "Banshee/V3 only runs under local X connection\n"); - return FXFALSE; - } - if (XF86DGAQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86DGAQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - sprintf(errorString,"Banshee/V3 requires DGA version 1.x\n"); - return FXFALSE; - } - } - screenNum=DefaultScreen(dpy); - XF86DGAGetVideoLL(dpy, screenNum, (int*)&screenPhys, &screenWidth, &banksize, - &screenMem); - screenMem*=1024; - screenHeight=DisplayHeight(dpy, screenNum); - screenDepth=DefaultDepth(dpy, screenNum); - if (XF86DGAQueryDirectVideo(dpy, DefaultScreen(dpy), &flags)==False || - !flags) { - sprintf(errorString,"Banshee/V3 requires X server to suppoer direct video\n"); - return FXFALSE; - } - hInfo.boardInfo[index].h3Mem = screenMem>>20; - return FXTRUE; -} - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID) { - int i; - FxU32 bn; - - pciOpen(); - - hInfo.nBoards = 0; - - errorString[0] = '\0'; - - for (i = 0; i < HWC_MAX_BOARDS; i++) { - hInfo.boardInfo[i].pciInfo.initialized = 0; - if (pciFindCardMulti(vID, dID, &bn, i)) { - hInfo.nBoards++; - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].pciInfo.initialized = 1; - hInfo.boardInfo[i].pciInfo.vendorID = vID; - hInfo.boardInfo[i].pciInfo.deviceID = dID; - /* - * NOTE: in the code above we learn about memsize here: - * hInfo.boardInfo[i].h3Mem - * - * However, in DOS, since we have not mapped the board yet, so we have - * to wait until later. (see hwcInitRegisters()) - dwj - */ - - /* Get some board Info */ - pciGetConfigData( PCI_REVISION_ID, bn, &hInfo.boardInfo[i].devRev); - - /* Get all the base addresses */ - pciGetConfigData(PCI_BASE_ADDRESS_0, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[0]); - pciGetConfigData(PCI_BASE_ADDRESS_1, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[1]); - pciGetConfigData(PCI_IO_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[2]); - pciGetConfigData(PCI_ROM_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[3]); - } - } - if (hInfo.nBoards) { - if (!initX(0)) return 0; - return &hInfo; - } else { - sprintf(errorString, "Can't find or access Banshee/V3 board\n"); - return 0; - } -} - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask) { - FxU32 bAddr; - - if (bInfo->pciInfo.initialized == FXFALSE) { - sprintf(errorString, "hwcMapBoard: Called before hwcInit\n"); - return FXFALSE; - } - - bInfo->linearInfo.initialized = FXTRUE; - - for (bAddr = 0; bAddr < HWC_NUM_BASE_ADDR; bAddr++) { - if ((bAddrMask >> bAddr) & 0x1) { - bInfo->linearInfo.linearAddress[bAddr] = (FxU32) - pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x2000000, &bInfo->deviceNum, bInfo->boardNum, bAddr); - } - } - return FXTRUE; -} - -FxBool -hwcUnmapBoard(hwcBoardInfo *bInfo) { - FxU32 bAddr; - - for (bAddr=0; bAddrlinearInfo.linearAddress[bAddr], 0x2000000); - } - return FXTRUE; -} - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo) { - int dramInit1; - - if (bInfo->linearInfo.initialized == FXFALSE) { - printf(errorString, "hwcInitRegisters Called before hwcMapBoard\n"); - return FXFALSE; - } - - bInfo->regInfo.initialized = FXTRUE; - - bInfo->regInfo.ioMemBase = - bInfo->linearInfo.linearAddress[0] + SST_IO_OFFSET; - bInfo->regInfo.cmdAGPBase = - bInfo->linearInfo.linearAddress[0] + SST_CMDAGP_OFFSET; - bInfo->regInfo.waxBase = - bInfo->linearInfo.linearAddress[0] + SST_2D_OFFSET; - bInfo->regInfo.sstBase = - bInfo->linearInfo.linearAddress[0] + SST_3D_OFFSET; - bInfo->regInfo.lfbBase = - bInfo->linearInfo.linearAddress[0] + SST_LFB_OFFSET; - bInfo->regInfo.rawLfbBase = - bInfo->linearInfo.linearAddress[1]; - bInfo->regInfo.ioPortBase = (FxU16) bInfo->pciInfo.pciBaseAddr[2] & ~0x1; - - /* Figure out if it's SDRAM */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - dramInit1 &= SST_MCTL_TYPE_SDRAM; - if ( dramInit1 & SST_MCTL_TYPE_SDRAM ) - bInfo->sdRAM = FXTRUE; - else - bInfo->sdRAM = FXFALSE; - - { - FxU32 - pciInit0, - pciCommandReg = - BIT(0) | /* enable i/o decode */ - BIT(1); /* enable memory decode */ - - /* Enable PCI memory and I/O decode */ - pciSetConfigData(PCI_COMMAND, bInfo->deviceNum, &pciCommandReg); - - HWC_IO_LOAD(bInfo->regInfo, pciInit0, pciInit0); - pciInit0 |= SST_PCI_READ_WS | SST_PCI_WRITE_WS; - HWC_IO_STORE(bInfo->regInfo, pciInit0, pciInit0); - } - - return FXTRUE; -} - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers) -{ -#define FN_NAME "hwcAllocBuffers" - FxBool - bufferAlignP; - FxU32 - bNum, - h3Mem = bInfo->h3Mem << 20, - bufStride, - bufSize; - FxI32 - i, - tramSize, fifoSize; - - if (bInfo->vidInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before video initialization\n", FN_NAME); - return FXFALSE; - } - - GDBG_INFO(80, "%s(0x%x, 0x%x, 0x%x)\n", FN_NAME, bInfo, nColBuffers, nAuxBuffers); - - /* I've decided on > 2 instead of == 3 because we may support more - than 3 buffers in the future, and want 4 to set the - triple-buffering bit in dramInit1, also */ - bInfo->vidInfo.tripleBuffering = (nColBuffers > 2); - - bInfo->vidInfo.stride = bufStride = - calcBufferStride(bInfo->vidInfo.xRes, bInfo->vidInfo.tiled); - - /* We want to place the FIFO after the tram but before the color - buffers with some pad */ - bufSize = calcBufferSize(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, - bInfo->vidInfo.tiled); - - bInfo->buffInfo.bufStride = bufStride; - bInfo->buffInfo.bufSize = bufSize; - - if (bInfo->vidInfo.tiled) { - bInfo->buffInfo.bufStrideInTiles = (bufStride >> 7); - bInfo->buffInfo.bufSizeInTiles = - calcBufferSizeInTiles(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes); - bInfo->buffInfo.bufHeightInTiles = - calcBufferHeightInTiles(bInfo->vidInfo.yRes); - } - - bInfo->buffInfo.initialized = FXTRUE; - bInfo->buffInfo.nColBuffers = nColBuffers; - bInfo->buffInfo.nAuxBuffers = nAuxBuffers; - - /* Subtract 0x1000 from h3mem to leave the X cursor (in high mem) alone */ - h3Mem-=0x1000; - - /* First, do the buffer allocation */ - - if (nAuxBuffers > 0) { - bInfo->buffInfo.auxBuffEnd = - bInfo->buffInfo.auxBuffStart = h3Mem; - - bInfo->buffInfo.auxBuffStart -= bufSize; - - /* auxBuffers start on odd pages, so we need to check to see if - * it's on an even page and, if so, make it odd. - * - * NB: We need to do the same sort of 'alignment' thing here as for - * the color buffers. - */ - bufferAlignP = ((bInfo->buffInfo.auxBuffStart & 0x1000UL) == 0); - if (bufferAlignP) bInfo->buffInfo.auxBuffStart -= 0x1000; - - } - - for (i = nColBuffers - 1; i >= 0; i--) { - if ((FxU32) i == (nColBuffers - 1)) { - FxU32 top; - if (nAuxBuffers > 0) - top = bInfo->buffInfo.auxBuffStart; - else - top = h3Mem; - - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = top; - } else { - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = - bInfo->buffInfo.colBuffStart[i + 1]; - } - - bInfo->buffInfo.colBuffStart[i] -= bufSize; - - /* As a memory access optmization colorBuffers start on even - * pages, while aux buffers start on odd pages. Thus we must - * check to see if we're startding on an odd page here and, if so, - * add a page to the start. - */ - bufferAlignP = ((bInfo->buffInfo.colBuffStart[i] & 0x1000UL) != 0); - if (bufferAlignP) bInfo->buffInfo.colBuffStart[i] -= 0x1000; - } - - /* Now we can calculate some other stuff... */ - bInfo->fbOffset = bInfo->buffInfo.colBuffStart[0]; - bInfo->tramOffset = 0; - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset - fifoSize; - if (tramSize < (FxI32)bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = bInfo->fbOffset - fifoSize; - - bInfo->fifoInfo.fifoLength -= 0x20000; - - if (tramSize>screenWidth*screenHeight*(screenDepth+7)/8+bInfo->min_tramSize) { - bInfo->tramOffset = screenWidth*screenHeight*(screenDepth+7)/8; - bInfo->tramSize = (FxU32)(tramSize-screenWidth*screenHeight*(screenDepth+7)/8); - } else { - bInfo->tramOffset = 0; - bInfo->tramSize = (FxU32)tramSize; - } - -#define LFBSTRIDE 0x1000 - { - FxU32 colBuffOffset = 0; - FxU32 colBufAlignP = 0; - - for (bNum = 0; bNum < nColBuffers; bNum++) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[bNum] = - hwcBufferLfbAddr(bNum, bInfo, colBufAlignP); - colBuffOffset += bufSize; - } - - if (nAuxBuffers > 0) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[nColBuffers] = - hwcBufferLfbAddr(nColBuffers, bInfo, colBufAlignP); - } - } - - GDBG_INFO(80, "%s: Board Info:\n", FN_NAME); - GDBG_INFO(80, "\thdc: 0x%x\n", bInfo->hdc); - GDBG_INFO(80, "\textContextID: 0x%x\n", bInfo->extContextID); - GDBG_INFO(80, "\tdevRev: 0x%x\n", bInfo->devRev); - GDBG_INFO(80, "\tfbOffset: 0x%x\n", bInfo->fbOffset); - GDBG_INFO(80, "\th3Rev: 0x%x\n", bInfo->h3Rev); - GDBG_INFO(80, "\th3Mem: 0x%x\n", bInfo->h3Mem); - GDBG_INFO(80, "\tboardNum: 0x%x\n", bInfo->boardNum); - GDBG_INFO(80, "\tdeviceNum: 0x%x\n", bInfo->deviceNum); - - GDBG_INFO(80, "%s: Buffer Info:\n", FN_NAME); - GDBG_INFO(80, "\tbufSize: 0x%x\n", bInfo->buffInfo.bufSize); - GDBG_INFO(80, "\tbufSizeInTiles: 0x%x\n", bInfo->buffInfo.bufSizeInTiles); - GDBG_INFO(80, "\tbufStride: 0x%x\n", bInfo->buffInfo.bufStride); - GDBG_INFO(80, "\tbufStrideInTiles:0x%x\n", bInfo->buffInfo.bufStrideInTiles); - GDBG_INFO(80, "\tbufHeightInTiles:0x%x\n", bInfo->buffInfo.bufHeightInTiles); - GDBG_INFO(80, "\tnColBuffers: 0x%x\n", bInfo->buffInfo.nColBuffers); - GDBG_INFO(80, "\tcolBuffStart: 0x%x\n", bInfo->buffInfo.colBuffStart); - GDBG_INFO(80, "\tcolBuffEnd: 0x%x\n", bInfo->buffInfo.colBuffEnd); - GDBG_INFO(80, "\tnAuxBuffers: 0x%x\n", bInfo->buffInfo.nAuxBuffers); - GDBG_INFO(80, "\tauxBuffStart: 0x%x\n", bInfo->buffInfo.auxBuffStart); - GDBG_INFO(80, "\tauxBuffEnd: 0x%x\n", bInfo->buffInfo.auxBuffEnd); - - GDBG_INFO(80, "%s: FIFO Info:\n", FN_NAME); - GDBG_INFO(80, "\tfifoStart: 0x%x\n", bInfo->fifoInfo.fifoStart); - GDBG_INFO(80, "\tfifoLength: 0x%x\n", bInfo->fifoInfo.fifoLength); - return FXTRUE; - -#undef FN_NAME -} /* hwcAllocBuffers */ - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitFifo" - FxBool - agpEnable = FXFALSE; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - if (bInfo->pciInfo.deviceID == 0x3) { /* banshee */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - } else { - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0xf << SST_HIGHWATER_SHIFT) | 0x8); - } - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, - ((bInfo->fifoInfo.fifoLength >> 12) - 1) | SST_EN_CMDFIFO | - (enableHoleCounting ? 0 : SST_CMDFIFO_DISABLE_HOLES) | - (agpEnable ? SST_CMDFIFO_AGP : 0)); - - GDBG_INFO(80 ,"%s: CMD FIFO placed at physical addr 0x%x\n", FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitFifo */ - -static void -hwcInitVideoOverlaySurface( - hwcRegInfo *rInfo, - FxU32 enable, /* 1=enable Overlay surface (OS), 1=disable */ - FxU32 stereo, /* 1=enable OS stereo, 0=disable */ - FxU32 horizScaling, /* 1=enable horizontal scaling, 0=disable */ - FxU32 dudx, /* horizontal scale factor (ignored if not */ - /* scaling) */ - FxU32 verticalScaling, /* 1=enable vertical scaling, 0=disable */ - FxU32 dvdy, /* vertical scale factor (ignored if not */ - /* scaling) */ - FxU32 filterMode, /* duh */ - FxU32 tiled, /* 0=OS linear, 1=tiled */ - FxU32 pixFmt, /* pixel format of OS */ - FxU32 clutBypass, /* bypass clut for OS? */ - FxU32 clutSelect, /* 0=lower 256 CLUT entries, 1=upper 256 */ - FxU32 startAddress, /* board address of beginning of OS */ - FxU32 stride) /* distance between scanlines of the OS, in */ - /* units of bytes for linear OS's and tiles for */ - /* tiled OS's */ -{ - FxU32 doStride; - FxU32 vidProcCfg; - - HWC_IO_LOAD((*rInfo), vidProcCfg, vidProcCfg); - - vidProcCfg &= ~(SST_OVERLAY_TILED_EN | - SST_OVERLAY_STEREO_EN | - SST_OVERLAY_HORIZ_SCALE_EN | - SST_OVERLAY_VERT_SCALE_EN | - SST_OVERLAY_TILED_EN | - SST_OVERLAY_PIXEL_FORMAT | - SST_OVERLAY_CLUT_BYPASS | - SST_OVERLAY_CLUT_SELECT); - - if (enable) - vidProcCfg |= SST_OVERLAY_EN; - - if (stereo) - vidProcCfg |= SST_OVERLAY_STEREO_EN; - - if (horizScaling) - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - if (verticalScaling) - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - if (tiled) { - vidProcCfg |= SST_OVERLAY_TILED_EN; - } - - vidProcCfg |= pixFmt; - - vidProcCfg &= ~SST_CURSOR_EN; /* Turn off HW Cursor */ - - if (clutBypass) - vidProcCfg |= SST_OVERLAY_CLUT_BYPASS; - - if (clutSelect) - vidProcCfg |= SST_OVERLAY_CLUT_SELECT; - - /* Overlay Hack: setup the state that I want */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - /* Check this because my cursor gets funny */ - vidProcCfg |= SST_CURSOR_EN; - - vidProcCfg |= SST_CHROMA_EN; - - /* Tile the 3D which will use the DESKTOP */ - /* Don't tile the 2D which will be the OVERLAY */ - vidProcCfg |= SST_DESKTOP_TILED_EN; - vidProcCfg &= ~SST_OVERLAY_TILED_EN; - - /* Setup the chroma range to magenta. */ - /* FIXME: it would be nice to be able to pick this */ - HWC_IO_STORE ((*rInfo), vidChromaMin, 0x0000F81F); - HWC_IO_STORE ((*rInfo), vidChromaMax, 0x0000F81F); - } - - HWC_IO_STORE((*rInfo), vidProcCfg, vidProcCfg); - - /* */ - HWC_IO_LOAD((*rInfo), vidDesktopOverlayStride, doStride); - doStride &= ~(SST_OVERLAY_LINEAR_STRIDE | SST_OVERLAY_TILE_STRIDE); - - - /* Overlay Hack: leave the stride alone for the hack */ - if (!GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - stride <<= SST_OVERLAY_STRIDE_SHIFT; - if (tiled) - stride &= SST_OVERLAY_TILE_STRIDE; - else - stride &= SST_OVERLAY_LINEAR_STRIDE; - doStride |= stride; - } - - HWC_IO_STORE((*rInfo), vidDesktopOverlayStride, doStride); - - finalVidDesktopOverlayStride = doStride; - -} /* hwcInitVideoOverlaySurface */ - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay) { - FxU32 pixFmt = SST_OVERLAY_PIXEL_RGB565D; - FxU32 stride, dramInit1, miscInit0, lfbMemoryConfig; - FxU32 scrWidth, scrHeight, ovlWidth, ovlHeight, scale, - vidOverlayDudx, vidOverlayDvdy, - vidProcCfg, vidScreenSize, vidOverlayEndScreenCoord; - int i, numModes; - - if (!dpy) { - if (!initX(0)) /* Should be the index of the card */ - return FXFALSE; - } - if (!GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - if (XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectGraphics)) { - inDGA=1; - } - } - if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numModes, - &vidModes)==False) { - sprintf(errorString, "Couldn't query vidmode list\n"); - return FXFALSE; - } - for (i=0; ihdisplay==bInfo->vidInfo.xRes) && - (vidModes[i]->vdisplay==bInfo->vidInfo.yRes)) - break; - if (i==numModes) { - sprintf(errorString, "Server doesn't support requested resolution\n"); - if (inDGA) { - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - inDGA=0; - } - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - return FXFALSE; - } - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[i])==False) { - sprintf(errorString, "Failed to set required video mode\n"); - return FXFALSE; - } - XSync(dpy, False); - - stride= (tiled) ? bInfo->buffInfo.bufStrideInTiles : bInfo->vidInfo.stride; - - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, saveVidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, lfbMemoryConfig, saveLfbMemoryConfig); - HWC_IO_LOAD(bInfo->regInfo, miscInit0, saveMiscInit0); - - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudxOffsetSrcWidth, - ((bInfo->vidInfo.xRes << 1) << 19)); - - /* Video pixel buffer threshold */ - { - FxU32 vidPixelBufThold; - FxU32 thold = 32; - - if (getenv("SSTVB_PIXTHOLD")) { - thold = atoi(getenv("SSTVB_PIXTHOLD")); - } - - thold &= 0x3f; - - vidPixelBufThold = (thold | (thold << 6) | (thold << 12)); - - HWC_IO_STORE(bInfo->regInfo, vidPixelBufThold, vidPixelBufThold); - } - - hwcInitVideoOverlaySurface( - &bInfo->regInfo, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - tiled, /* tiled */ - pixFmt, /* pixel format of OS */ - FXFALSE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, - (bInfo->vidInfo.yRes << SST_OVERLAY_Y_SHIFT) | - (bInfo->vidInfo.xRes & SST_OVERLAY_X) ); - - /* - Setup video scaling for half-modes - */ - - /* Get some important info */ - HWC_IO_LOAD(bInfo->regInfo, vidScreenSize, vidScreenSize); - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, vidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff; - scrHeight = (vidScreenSize >> SST_VIDEO_SCREEN_HEIGHT_SHIFT) & 0xfff; - - ovlWidth = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_X_SHIFT) & 0xfff; - ovlHeight = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_Y_SHIFT) & 0xfff; - - ovlWidth += 1; - ovlHeight += 1; - - /* Check to see if the screen and overlay dimensions match. - * There are two cases that can happen in reality. - * - * scrXXX > appXXX: This is a 'real' case, and the overlay dimension - * needs to mag scaled so that it fits the requested size. - * - * (scrXXX == appXXX) && (ovlXXX != scrXXX): This is a somewhat artificial - * case where someone left the overlay set to some value, and these did - * not get reset in the setVideoMode processing. (For example, if the user is - * running an application which bus masters data directly to our video overlay - * when launching a glide application). In this case we need to fiddle w/ the - * overlay dimension so that it matches the requested resolution. - * - * (scrXXX < appXXX): If setVideoMode is actually working correctly, this cannot - * happen because that code has to know that we can't do min scaling. - */ - - if (scrWidth > bInfo->vidInfo.xRes) { - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - ovlWidth = scrWidth; - - scale = ((float) bInfo->vidInfo.xRes) / ((float) ovlWidth); - - vidOverlayDudx = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudx, vidOverlayDudx); - } else if (ovlWidth != scrWidth) { - ovlWidth = scrWidth; - } - - if (scrHeight > bInfo->vidInfo.yRes) { - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - ovlHeight = scrHeight; - - scale = ((float) bInfo->vidInfo.yRes) / ((float) ovlHeight); - - vidOverlayDvdy = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDvdy, vidOverlayDvdy); - } else if (ovlHeight != scrHeight) { - ovlHeight = scrHeight; - } - - vidOverlayEndScreenCoord = (((ovlHeight - 1) << SST_OVERLAY_Y_SHIFT) | - ((ovlWidth - 1) << SST_OVERLAY_X_SHIFT)); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - vidProcCfg &= ~SST_OVERLAY_FILTER_MODE; - if (GETENV("SSTH3_OVERLAY_FILTER_2x2")) { - if (!(vidProcCfg & SST_VIDEO_2X_MODE_EN)) - vidProcCfg |= SST_OVERLAY_FILTER_2X2; - } else { - vidProcCfg |= SST_OVERLAY_FILTER_4X4; - } - - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, vidProcCfg); - - finalVidProcCfg = vidProcCfg; - - /* Get miscInit0 for y-sub */ - HWC_IO_LOAD(bInfo->regInfo, miscInit0, miscInit0); - - /* Clear out relavent bits */ - miscInit0 &= ~SST_YORIGIN_TOP; - miscInit0 |= ((bInfo->vidInfo.yRes - 1) << SST_YORIGIN_TOP_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, miscInit0, miscInit0); - - /* Set up lfbMemoryConfig */ - lfbMemoryConfig = - (bInfo->fbOffset >> 12) | - SST_RAW_LFB_ADDR_STRIDE_4K | - (bInfo->buffInfo.bufStrideInTiles << SST_RAW_LFB_TILE_STRIDE_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, lfbMemoryConfig); - - finalLfbMemoryCfg = lfbMemoryConfig; - - /* Set up dramInit1 for triple or double buffering */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - if (bInfo->vidInfo.tripleBuffering) - dramInit1 |= SST_TRIPLE_BUFFER_EN; - else - dramInit1 &= ~SST_TRIPLE_BUFFER_EN; - HWC_IO_STORE(bInfo->regInfo, dramInit1, dramInit1); - - HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, 0x100810); - - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - bInfo->buffInfo.bufStrideInTiles ); - - /* Overlay Hack: setup tiledness */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - /* The desktop is rarely tiled, though the video... - */ - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - ( bInfo->buffInfo.bufStride ) ); - /* Hack for 3d as desktop 2d as overlay */ - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStride << 16 ) | - ( bInfo->buffInfo.bufStrideInTiles ) ); - } - - HWC_IO_LOAD( bInfo->regInfo, vidDesktopOverlayStride, finalVidDesktopOverlayStride); - - return FXTRUE; -} - -void repaintX() { - XSetWindowAttributes xswa; - unsigned long mask=0; - Visual visual; - int win; - - xswa.background_pixmap = None; - mask |= CWBackPixmap; - xswa.override_redirect = True; - xswa.backing_store = NotUseful; - xswa.save_under = False; - mask |= (CWOverrideRedirect | CWBackingStore | CWSaveUnder); - visual.visualid = CopyFromParent; - win = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, - screenWidth, screenHeight, 0, - DefaultDepth(dpy, screenNum), InputOutput, &visual, - mask, &xswa); - XMapWindow (dpy, win); -} - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo) { - FxU32 depth; - - /* Disable FIFO */ - do { - HWC_CAGP_LOAD(bInfo->regInfo, cmdFifo0.depth, depth); - } while (depth); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, saveLfbMemoryConfig); - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, saveVidProcCfg); - HWC_IO_STORE(bInfo->regInfo, miscInit0, saveMiscInit0); - if (!dpy) return FXTRUE; - - /* Overlay Hack to get X to restore properly without using DGA direct - * graphics. */ - if (GETENV ("SSTH3_DESKTOP_OVERLAY")) - { - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[1])==False) { - GDBG_INFO(80, "Failed to return to previous video mode\n"); - } - } - - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[0])==False) { - GDBG_INFO(80, "Failed to return to previous video mode\n"); - } - if (inDGA) { - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - inDGA=0; - } - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - repaintX(); - XCloseDisplay(dpy); - dpy=0; - return FXTRUE; -} - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiled) -{ - FxU32 - strideInTiles; - - if (tiled == FXTRUE) { - /* Calculate tile width stuff */ - strideInTiles = (xres << 1) >> 7; - if ((xres << 1) & (HWC_TILE_WIDTH - 1)) - strideInTiles++; - - return (strideInTiles * HWC_TILE_WIDTH); - - } else { - return (xres << 1); - } -} /* calcBufferStride */ - -static FxU32 -calcBufferHeightInTiles(FxU32 yres) -{ - FxU32 - heightInTiles; /* Height of buffer in tiles */ - - - /* Calculate tile height stuff */ - heightInTiles = yres >> 5; - - if (yres & (HWC_TILE_HEIGHT - 1)) - heightInTiles++; - - return heightInTiles; - -} /* calcBufferHeightInTiles */ - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres) { - FxU32 - bufSizeInTiles; /* Size of buffer in tiles */ - - bufSizeInTiles = - calcBufferHeightInTiles(yres) * (calcBufferStride(xres, FXTRUE) >> 7); - - return bufSizeInTiles; - -} /* calcBufferSizeInTiles */ - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled) -{ - FxU32 - stride, - height, - bufSize; /* Size of buffer in bytes */ - - if (tiled) { - stride = calcBufferStride(xres, tiled); - height = HWC_TILE_HEIGHT * calcBufferHeightInTiles(yres); - } else { - stride = xres << 1; - height = yres; - } - - bufSize = stride * height; - - return bufSize; - -} /* calcBufferSize */ - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled) -{ -#define FN_NAME "hwcCheckMemSize" - FxU32 - bufSize, totSize; - - bufSize = calcBufferSize(xres, yres, tiled); - - totSize = (nColBuffers + nAuxBuffers) * bufSize; - - if (totSize < ((bInfo->h3Mem << 20) - 0x200000)) /* Need 2M for texture */ - return FXTRUE; - else - return FXFALSE; -#undef FN_NAME -} /* hwcCheckMemSize */ - -static FxU32 -pow2Round(FxU32 val, FxU32 pow2Const) -{ - const FxU32 pow2Mask = (pow2Const - 1UL); - - return ((val + pow2Mask) & ~pow2Mask); -} - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP) -{ - FxU32 retVal = 0x00UL; - - if (bInfo->vidInfo.tiled) { - retVal = (bInfo->fbOffset + - pow2Round(bufNum * bInfo->vidInfo.yRes * HWC_TILED_BUFFER_BYTES, - HWC_TILED_BUFFER_Y_ALIGN) + - (colBufAlignP ? HWC_TILED_BUFFER_X_ADJUST : 0)); - } else if (bufNum < bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.colBuffStart[bufNum]; - } else if (bufNum == bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.auxBuffStart; - } - - return retVal; -} - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ - return hwcInitFifo(bInfo, enableHoleCounting); -} - -#define RED_SHIFT 16 -#define GREEN_SHIFT 8 -#define BLUE_SHIFT 0 - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b) -{ -#define FN_NAME "hwcGammaTable" - FxU32 gRamp[256]; - FxU32 i; - FxU32 vidProcCfg; - FxU32 dacBase; - FxU32 rDacBase; - FxU32 rDacData; - - /* Load the table into the Display driver as above */ - for (i = 0; i < nEntries; i++) { - gRamp[i] = - ((r[i] & 0xff) << RED_SHIFT) | - ((g[i] & 0xff) << GREEN_SHIFT) | - ((b[i] & 0xff) << BLUE_SHIFT); - } - - /* - ** On W9X/DOS, we can do this ourselves--which is much easier than - ** mucking about with a bunch of 32-bit data in 16-bit driver - ** code. - */ - HWC_IO_LOAD( bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Determin which set of CLUT entries are selected */ - if (vidProcCfg & SST_OVERLAY_CLUT_SELECT) - dacBase = 256; - else - dacBase = 0; - - /* Print out some useful info RE the vidProcCfg register */ - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_SELECT) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_SELECT) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_EN) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_EN) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_BYPASS) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_BYPASS) ? 1 : 0); - - for (i = 0; i < nEntries; i++) { - int repeat = 100; - do { - HWC_IO_STORE( bInfo->regInfo, dacAddr, dacBase + i); - P6FENCE; - HWC_IO_LOAD( bInfo->regInfo, dacAddr, rDacBase); - P6FENCE; - repeat--; - } while (repeat && rDacBase != dacBase + i); - if (!repeat) { - GDBG_INFO(0, "%s:Error Writting DacAddr %d. DacBase =%d\n", - FN_NAME, dacBase+i, dacBase); - } - repeat = 100; - do { - HWC_IO_STORE( bInfo->regInfo, dacData, gRamp[i]); - P6FENCE; - HWC_IO_LOAD( bInfo->regInfo, dacData, rDacData); - P6FENCE; - repeat--; - } while (repeat && rDacData != gRamp[i]); - if (!repeat) { - GDBG_INFO(0, "%s:Error Writting Data [%d, %x]. DacBase =%d\n", - FN_NAME, i, gRamp[i], dacBase); - } - } - - return FXTRUE; - -#undef FN_NAME -} /* hwcGammaTable */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float gammaR, float gammaG, float gammaB) -{ -#define FN_NAME "hwcGammaRGB" - FxU32 - grRamp[256], ggRamp[256], gbRamp[256]; - int - i; - - GDBG_INFO(80, FN_NAME "(0x%x, %1.2f, %1.2f, %1.2f)\n", - bInfo, gammaR, gammaG, gammaB); - - /* - ** NB: The system eventually devised by Bob and Ken *may* require - ** separate R, G, and B vectors. - */ - - for (i = 0; i < 256; i++) { - grRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaR)) * 255.0F + 0.5F); - ggRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaG)) * 255.0F + 0.5F); - gbRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaB)) * 255.0F + 0.5F); - } - - - hwcGammaTable(bInfo, 256, grRamp, ggRamp, gbRamp); - - /* - ** Now that we have a gamma table, we can give it to the driver via - ** a call to ExtEscape() when that is defined..... - */ - - return FXFALSE; - -#undef FN_NAME -} /* hwcGammaRGB */ - -#define M 1 -#define K 1 - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetGrxClock" - FxU32 - pllCtrl1, - dramInit0 = 0xc17ae29, - dramInit1 = 0x26c031, - n, - m = 1; - - n = (FxU32) ((speedInMHz - 4.76f)/2.38f); - - pllCtrl1 = - (K << SST_PLL_K_SHIFT) | (m << SST_PLL_M_SHIFT) | (n << SST_PLL_N_SHIFT); - - GDBG_INFO(80, "%s: Setting Graphics Clock to %d\n", FN_NAME, speedInMHz); - - HWC_IO_STORE( bInfo->regInfo, dramInit0, dramInit0); - HWC_IO_STORE( bInfo->regInfo, dramInit1, dramInit1); - HWC_IO_STORE( bInfo->regInfo, pllCtrl1, pllCtrl1); - - return FXTRUE; - -#undef FN_NAME -} /* hwcSetGrxClock */ - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetMemClock" - return FXFALSE; -#undef FN_NAME -} /* hwcSetMemClock */ - -char * -hwcGetenv(char *a) -{ - envitem *ptr; - - char *result; - result=getenv(a); - if (result) return result; - if (!envinit) loadEnvFile(); - ptr=first; - while (ptr) { - if (!strcmp(ptr->env, a)) return ptr->val; - ptr=ptr->next; - } - return 0; -} diff --git a/glide2x/h3/minihwc/makefile b/glide2x/h3/minihwc/makefile deleted file mode 100644 index 0233177..0000000 --- a/glide2x/h3/minihwc/makefile +++ /dev/null @@ -1,76 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -!if "$(DEBUG)" == "1" -VCDEFS = $(VCDEFS) -DGDBG_INFO_ON -!endif - -!if "$(FX_TARGET)" == "DOS" -#Target Dos -PCILIB = $(BUILD_ROOT)\swlibs\lib\fxpci.lib -CINITLIB = $(BUILD_ROOT)\h3\lib\h3cinit.lib -VMODE = dos_mode.c - - -!else -#Target Windows -DXINCS = -I$(DIRECTXSDK)\include -DXDEFS = -DHWC_ACCESS_DDRAW -DXLIBS = $(DIRECTXSDK)\lib\dxguid.lib \ - $(DIRECTXSDK)\lib\ddraw.lib -CINITLIB = -VMODE = win_mode.c -!if "$(HWC_INIT_VXD)" == "1" -PCILIB = $(BUILD_ROOT)\swlibs\lib\fxpci.lib -CINITLIB = $(BUILD_ROOT)\h3\lib\h3cinit.lib -!else -LCDEFS = -DHWC_EXT_INIT -PRIVATE_HEADERS = $(PRIVATE_HEADERS) hwcext.h -!endif -!endif - -!if "$(FX_COMPILER)" == "MICROSOFT" -LCOPTS = /WX -!endif - -LDIRT = -LCINCS = $(LCINCS) \ - $(DXINCS) \ - -I$(DXDDK)\inc \ - -I$(DXDDK)\inc32 \ - -I$(BUILD_ROOT_SWLIBS)\include \ - -I$(BUILD_ROOT)\h3\include -LCDEFS = $(LCDEFS) $(DXDEFS) -HEADERS = $(PRIVATE_HEADERS) minihwc.h setmode.h hwcio.h - -CFILES = minihwc.c hwcio.c gdebug.c $(VMODE) - -SUBLIBRARIES = $(PCILIB) $(DXLIBS) $(CINITLIB) - -LIBRARIES= minihwc.lib - -INSTALL_DESTINATION = $(BUILD_ROOT)\h3 - - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - diff --git a/glide2x/h3/minihwc/makefile.linux b/glide2x/h3/minihwc/makefile.linux deleted file mode 100644 index f488661..0000000 --- a/glide2x/h3/minihwc/makefile.linux +++ /dev/null @@ -1,42 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = -LCOPTS = -LCINCS += -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT)/h3/include -HEADERS = minihwc.h setmode.h - - -OSDEPC = linhwc.c - -CFILES = $(OSDEPC) hwcio.c gdebug.c - -SUBLIBRARIES = $(PCILIB) - -LIBRARIES= libminihwc.a - -INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW) - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/h3/minihwc/minihwc.c b/glide2x/h3/minihwc/minihwc.c deleted file mode 100644 index b050372..0000000 --- a/glide2x/h3/minihwc/minihwc.c +++ /dev/null @@ -1,3807 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 4 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 122 3/17/99 3:46p Dow -** Luke Skywalker -** -** 121 3/11/99 8:37p Peter -** update vidOverlayEndScreenCoord when the overlay dims != screen dims -** (w/ optional scaling) -** -** 120 3/10/99 11:52a Peter -** initFifo enable hole counting parameter -** -** 119 3/09/99 12:31p Kcd -** Added MacOS stuff. Fixed refresh constant table (mis)use. -** -** 118 3/05/99 10:06p Peter -** allocate independent state buffers in parallel w/ the command buffers -** -** 117 3/03/99 3:52p Peter -** removed hemorrhaging GetDC and create glide private dc's for ExtEscape -** -** 116 3/02/99 8:03p Dow -** -** 115 2/27/99 12:24p Dow -** New resolutions -** -** 114 2/22/99 5:06p Peter -** cleaned up monitor enum crap -** -** 113 2/19/99 2:00p Atai -** fixed lfbBuffAddr for 800x600 triple buffering lfb access -** -** 112 2/17/99 2:36p Peter -** removed extra dd call, fail agp fifo if no dd agp support, release -** window dc after enum -** -** 111 2/13/99 1:57p Dow -** Added code for new resolutions -** -** 110 2/08/99 6:42p Atai -** use the active window display as sst 0 -** -** 109 2/02/99 4:37p Peter -** hwGetSurfaceinfo gets depth, releasing memory fifo creation dd object -** -** 108 1/25/99 6:37p Peter -** removed redundant macros -** -** 107 1/22/99 4:28p Dow -** Fixed 1600x1200 the right way. -** -** 106 1/22/99 3:02p Dow -** Turned off 2x2 filtering in 2x mode -** -** 105 1/21/99 1:43p Dow -** Fencing for Pallette Download -** -** 104 1/20/99 6:04p Peter -** cleaned up warning -** -** 103 1/20/99 1:51p Dow -** Pithy workaround for PCI gamma problem -** -** 102 1/14/99 11:38a Dow -** Left bits alone in vidproccfg -** -** 101 1/11/99 8:22p Peter -** fixed stride vs width effage that I somehow convinced myself was right -** -** 100 1/11/99 6:31p Dow -** Added Debugging -** -** 99 1/04/99 11:58a Peter -** added windowed context support -** -** 98 12/23/98 12:39p Peter -** hdc cleanup/hwcext_getlinearaddr is not idempotent -** -** 97 12/22/98 5:43p Atai -** turn on 2x mode for vidProcCfg if greater than or equal to 1280 -** -** 96 12/22/98 3:29p Jeske -** use h3InitGetMemSize() instead so that we don't have to worry about it -** screwing up dramInit1 like h3InitSgram() did in the past... -** -** 95 12/22/98 2:46p Atai -** fixed for Banshee/DOS draminit1 value -** -** 94 12/22/98 1:07p Peter -** all dd surface pointers must go through linear map offset to get their -** hw relative offsets -** -** 93 12/17/98 2:08p Jeske -** comment fix -** -** 92 12/16/98 7:13p Peter -** query directdraw object for surface memory area caps and set the -** process id when getting the linear addresses via -** -** 91 12/11/98 1:35p Peter -** window fifo serial # vs pixel cache -** -** 90 12/09/98 5:17p Dow -** Fixed video scaling for lame resolutions -** -** 89 12/07/98 2:18p Dow -** Added debug message for process handle -** -** 88 12/07/98 11:32a Dow -** Fixed 2X resolutions -** -** 87 12/06/98 11:04a Dow -** -** 86 12/04/98 8:42a Dow -** Fixed broken DOS build AGAIN -** -** 85 12/03/98 10:27p Dow -** Added stuff for hwcGetenv -** -** 84 12/03/98 9:11p Dow -** Fixed resolution check -** -** 83 12/02/98 9:35p Dow -** Query Resolutions -** -** 82 12/02/98 2:41p Jeske -** ugh... text badness -** -** 81 12/02/98 2:38p Jeske -** don't set the clocks unless they use the environment variable -** overrides, even for banshee... -** -** 80 12/02/98 2:06p Dow -** Gamma Fully Implemented -** -** 79 11/30/98 6:53p Peter -** video memory fifo's -** -** 78 11/24/98 12:25p Mikec -** made multi-mon on win95 happy -** -** 77 11/24/98 9:43a Atai -** detect multiple cards -** -** 76 11/23/98 3:28p Atai -** fixed the refresh rate stuff -** -** 75 11/20/98 4:48p Jeske -** avenger-dos, for now, make sure we don't call h3InitPlls() on avenger.. -** -** 74 11/19/98 1:51p Dow -** Fixed refresh/resolution issue -** -** 73 11/18/98 8:04p Dow -** grxclk -** -** 72 11/15/98 2:16a Atai -** set device id = 5. Hack for comdex -** -** 71 11/10/98 6:29p Atai -** added min_tramSize for board information. min_tramSize = 0x200000 if -** device id is 3 or mem size is 4 -** -** 70 10/30/98 3:44p Dow -** Fixed Tiled/Linear color/aux bug -** -** 69 10/29/98 5:15p Dow -** Fixed 512x384 -** -** 68 10/21/98 11:22a Peter -** dos happiness w/ the new chris pci library (nee tarolli) -** -** 67 10/14/98 3:37p Dow -** Gamma stuff -** -** 66 10/13/98 8:48p Dow -** Env Var for Board mem -** -** 65 10/08/98 10:15a Dow -** Triple buffering fix -** -** 64 9/18/98 3:08p Dow -** Fixed DOS build -** -** 63 9/17/98 3:58p Dow -** Vidmode Stuff -** -** 62 9/11/98 1:07p Peter -** rounding on raw lfb port addr -** -** 61 9/02/98 1:34p Peter -** watcom warnings -** -** 60 8/25/98 6:48p Dow -** Added scaling for low-res -** -** 59 8/25/98 3:07p Dow -** Checked res of hwcRLSEXCLUSIVE -** -** 58 8/06/98 7:49p Dow -** Moved detection of SDRAM -** -** 57 8/02/98 5:00p Dow -** Glide Surface Extension -** -** 56 7/29/98 3:34p Dow -** -** 55 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 54 7/24/98 6:34p Dow -** Fixed DOS Build -** -** 53 7/24/98 2:02p Dow -** AGP Stuff -** -** 52 7/23/98 1:18a Dow -** Bump & Grind -** -** 51 7/18/98 12:21a Jdt -** added state abuffer -** -** 50 7/16/98 10:26p Dow -** GIW Stuff -** -** 49 7/16/98 2:53p Dow -** Removed useless colBufferAddr frmo surface info -** -** 48 7/15/98 4:09p Dow -** GIW Stuff & DOS Protection -** -** 47 7/14/98 7:19p Dow -** protected some win32 stuff -** -** 46 7/13/98 10:35p Jdt -** Implemented hwcAllocWinFifo, hwcExecuteWinFifo. -** -** 45 7/08/98 5:45p Dow -** Moved fifo back up -** -** 44 7/02/98 12:11p Dow -** LFB fixes -** -** 43 6/30/98 10:28a Dow -** Fixed fouled checkin -** -** 41 6/25/98 6:45p Jdt -** Changes to remove the evil of dxdrvr.c -** -** 40 6/25/98 12:16p Dow -** Added (protected) alternate FIFO layout -** -** 39 6/16/98 6:11p Dow -** Rearranged texture memory -** -** 38 6/16/98 9:49a Dow -** Fixed protected stuff -** -** 37 6/16/98 9:35a Dow -** Comment -> GDBG_INFO conversion -** -** 36 6/12/98 10:09a Jdt -** Fix broken dos build. -** -** 35 6/11/98 7:44p Jdt -** Win98/NT5 Mulitmon 1st Pass -** -** 34 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 33 6/09/98 10:09a Dow -** Init register performance tweaks. -** -** 32 6/06/98 11:42a Dow -** Better buffer alignment for all resolutions. -** -** 31 6/06/98 10:11a Dow -** Changed AUXPAD from 0 to 0x1000 to offset aux buffer. -** -** 30 6/05/98 7:34p Dow -** Fixed 8x6-12x10 resolutions -** -** 29 6/05/98 6:21p Jeske -** now everyone will dxClose(), not just windows -** -** 28 6/05/98 6:37p Dow -** 1600x1200 perf tuning -** -** 27 6/05/98 5:28p Jeske -** apparently we need to not call h3InitSetVideoMode() for this to work, -** will this work in non640x480 resolutions? we may need to fix that later -** -** 26 6/05/98 3:27p Dow -** 1600x1200 Works -** -** 25 6/04/98 9:36p Jeske -** now we leave VGA legacy decoding on in hwcInitRegisters so we can set -** video modes -** -** 24 6/04/98 6:52p Dow -** Resolutions to 1600x1200 -** -** 23 6/03/98 1:52p Jeske -** added code to convert from Glide's ordinal refresh number to a refresh -** rate in Hz when calling h3InitSetVideoMode(). We really should specify -** -** 22 6/01/98 5:48p Jeske -** allow h3InitSetVideoMode to fail and handle it... -** -** 21 5/31/98 9:02a Dow -** 800x600 Resolution -** -** 20 5/28/98 6:34p Dow -** Fixed top scanline bug -** -** 19 5/27/98 3:35p Mc -** Removed blocks of HW_IO_LOAD and HW_IO_STORE that chris put in. -** -** 18 5/20/98 8:13p Dow -** device rev -** -** 17 5/20/98 4:16p Dow -** Added env var for FIFO size -** -** 16 5/15/98 2:46p Dow -** Attempt to patch back regs on NT -** -** 15 5/13/98 4:26p Dow -** Protected obsolete IO code that was bodging NT -** -** 14 4/27/98 2:30p Dow -** OpenProcess stuff -** -** 13 4/22/98 5:29p Dow -** Added calls to HWCEXT_HWCSETEXCLUSIVE and HWCEXT_HWCRLSEXCLUSIVE -** -** 12 4/16/98 10:14p Dow -** EXT_HWC is default init method -** -** 11 4/13/98 5:49p Dow -** Turning theory into practice -** -** 10 4/09/98 9:34p Dow -** synched with change in h3cinit -** -** 9 4/08/98 12:25p Dow -** LfbMemoryConfig fix -** -** 8 4/07/98 10:40p Dow -** LFB Fixes -** -** 7 4/05/98 2:19p Dow -** DOS/WIN32 stepping on each others' dicks -** -** 6 4/03/98 2:03p Dow -** DOS Glide modes -** -** 5 3/28/98 10:51a Dow -** Fixes for FIFO bug -** -** 4 3/20/98 1:11p Dow -** Now checking revision of chip -** -** 3 3/20/98 11:43a Dow -** fifo placement for windows -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#if !defined(GDBG_INFO_ON) || (GDBG_INFO_ON == 0) -#if defined(GDBG_INFO_ON) -#undef GDBG_INFO_ON -#endif /* defined(GDBG_INFO_ON) */ -#define GDBG_INFO_ON -#endif /* !defined(GDBG_INFO_ON) || (GDBG_INFO_ON == 0) */ - -#include -#include -#include - -#include <3dfx.h> - -#ifdef HWC_EXT_INIT -#include "hwcext.h" -#else -#include -#endif - -#include -#include -#include "hwcio.h" -#include "setmode.h" - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#include - -#include -#include "qmodes.h" -#define IS_32 -#define Not_VxD -#include -#include -#include - -#endif - -#ifdef macintosh -#include -#include -#endif - -#ifdef GETENV -#undef GETENV -#endif - -#define GETENV hwcGetenv - -#define MAXFIFOSIZE 0x40000 - -static hwcInfo hInfo; -static char errorString[1024]; -static int num_monitor = 0; -static FxU32 fenceVar; - - -#if defined(__WATCOMC__) -/* - * P6 Fence - * - * Here's the stuff to do P6 Fencing. This is required for the - * certain things on the P6 - * - * dpc - 21 may 1997 - FixMe! - * This was yoinked from sst1/include/sst1init.h, and should be - * merged back into something if we decide that we need it later. - */ -void -p6Fence(void); -#pragma aux p6Fence = \ -"xchg eax, fenceVar" \ -modify [eax]; - - -#define P6FENCE p6Fence() -#elif defined(__MSC__) -#define P6FENCE {_asm xchg eax, fenceVar} -#elif defined(__POWERPC__) && defined(__MWERKS__) -#define P6FENCE __eieio() -#else -#error "P6 Fencing in-line assembler code needs to be added for this compiler" -#endif /* Compiler specific fence commands */ - -/* Hack */ -#if macintosh -#define __DOS32__ 1 -#endif - -static FxU32 -pow2Round(FxU32 val, FxU32 roundVal); - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP); - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled); - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiles); - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres); - -static FxU32 -calcBufferHeightInTiles(FxU32 yres); - -static FxBool resolutionSupported[HWC_MAX_BOARDS][0xF]; - -/* -** Function Prototypes -*/ -#ifdef HWC_EXT_INIT - -typedef void *HMONITOR; -typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM); -typedef WINUSERAPI BOOL WINAPI -EnumDisplayMonitors_func( HDC hdc, - LPCRECT lprcClip, - MONITORENUMPROC lpfnEnum, - LPARAM dwData); - -typedef struct { - HDC dc; - HMONITOR mon; -} DevEnumRec; - -static BOOL CALLBACK -monitorEnum( HMONITOR handle, HDC dc, LPRECT rect, LPARAM param ) -{ - BOOL rv = TRUE; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, "monitorEnum: ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - if ( ExtEscape(dc, EXT_HWC, sizeof(ctxReq), (LPSTR) &ctxReq, sizeof(ctxRes), (LPSTR) &ctxRes) ) { - if ( ctxRes.optData.deviceConfigRes.vendorID == 0x121a ) { - DevEnumRec* - data = (DevEnumRec*)param; - LPCSTR - drvName = "DISPLAY", - devName = NULL; - - /* If we're on a multi-mon capable system then we may have - * different display type devices so we have to get the device - * name explicitly for the CreateDC call. - */ - if (handle != NULL) { -#define CCHDEVICENAME 32 - typedef struct { - DWORD cbSize; - RECT rcMonitor; - RECT rcWork; - DWORD dwFlags; - TCHAR szDevice[CCHDEVICENAME]; - } MONITORINFOEX, *LPMONITORINFOEX; - typedef BOOL (CALLBACK* GetMonitorInfoProc)(HMONITOR, LPMONITORINFOEX); - static GetMonitorInfoProc monitorInfoProc = NULL; - - if (monitorInfoProc == NULL) { - HMODULE user32 = GetModuleHandle("user32"); - - if (user32 != NULL) { - monitorInfoProc = (GetMonitorInfoProc)GetProcAddress(user32, "GetMonitorInfoA"); - } - } - - if (monitorInfoProc != NULL) { - MONITORINFOEX monInfo; - - monInfo.cbSize = sizeof(monInfo); - if ((*monitorInfoProc)(handle, &monInfo)) { - devName = monInfo.szDevice; - drvName = NULL; - } - } - } - - /* Make a private 'copy' of the dc so that we're not affected by - * other people dorking with dc's etc. - * - * FixMe: Is there a better way to do this? I did not see a - * CopyDC or anything like that. - */ - dc = CreateDC(drvName, - devName, - NULL, - NULL); - - data[num_monitor].dc = dc; - data[num_monitor].mon = handle; - - num_monitor++; - rv = (num_monitor < HWC_MAX_BOARDS); - } - } - - return rv; -} /* monitorEnum */ - -/* -** Use the active window display as the first sst device -*/ -static BOOL CALLBACK -displayMonitor( HMONITOR handle, HDC dc, LPRECT rect, LPARAM param ) -{ - BOOL rv = TRUE; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, "displayMonitor: ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - if ( ExtEscape(dc, EXT_HWC, sizeof(ctxReq), (LPSTR) &ctxReq, sizeof(ctxRes), (LPSTR) &ctxRes) ) { - if ( ctxRes.optData.deviceConfigRes.vendorID == 0x121a ) { - DevEnumRec* - data = (DevEnumRec*) param; - FxI32 - i; - - for (i = 0; i < num_monitor; i++) { - HDC *return_dc = ( HDC* ) data + (2*i); - HMONITOR *return_hmon = ( HMONITOR* ) data + (2*i+1); - - if ((data[i].dc == dc) && (data[i].mon == handle)) { - data[i].dc = data[0].dc; - data[i].mon = data[0].mon; - - data[0].dc = dc; - data[0].mon = handle; - - break; - } - } - rv = FALSE; - } - } - return rv; -} /* displayMonitor */ -#endif - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID) -{ -#define FN_NAME "hwcInit" -#ifdef HWC_EXT_INIT - { - DevEnumRec - data[HWC_MAX_BOARDS*2]; - int monitor; - - GDBG_INFO(80, "%s\n", FN_NAME); - errorString[0] = '\0'; - - /* find glide compatible devices */ - GDBG_INFO(80, "%s: Finding Glide compatible devices\n", FN_NAME); - { - /* Grab the DC of the Desktop. */ - HDC hdc = GetDC(NULL); - HMODULE user32 = GetModuleHandle( "user32.dll" ); - - for (monitor = 0; monitor < HWC_MAX_BOARDS; monitor++) { - data[monitor].dc = NULL; - data[monitor].mon = NULL; - } - num_monitor = 0; - - if ( user32 ) { - EnumDisplayMonitors_func* - enumDisplayMonitors = (void*)GetProcAddress( user32, "EnumDisplayMonitors" ); - - if ( enumDisplayMonitors ) { - HWND - curWindow = GetActiveWindow(); - - GDBG_INFO(80, "%s: multi-monitor capable OS ( NT5/W98 )\n", FN_NAME); - enumDisplayMonitors( hdc, 0, monitorEnum, (LPARAM)data ); - - /* - ** use the active window display (if there is one yet - ** associated w/ the current thread) as sst 0 - */ - if (curWindow != NULL) { - HDC curWindowDC = GetDC(curWindow); - - if (curWindowDC != NULL) { - enumDisplayMonitors( curWindowDC, 0, displayMonitor, (LPARAM)data ); - ReleaseDC(curWindow, curWindowDC); - } - } - } else { /* for win95/nt4, assume we have one board */ - monitorEnum(NULL, hdc, NULL, (LPARAM)&data); - } - } - - ReleaseDC(NULL, hdc); - } - - hInfo.nBoards = 0; - for (monitor = 0; monitor < num_monitor; monitor++) { - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - HDC - hdc = data[monitor].dc; - HMONITOR - hmon = data[monitor].mon; - int - status; - - /* Allocate a context with the Driver */ - ctxReq.which = HWCEXT_ALLOCCONTEXT; - ctxReq.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - ctxReq.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_ALLOCCONTEXT\n"); - status = ExtEscape(hdc, EXT_HWC, - sizeof(ctxReq), (LPSTR) &ctxReq, - sizeof(ctxRes), (LPSTR) &ctxRes); - - if (status < 1) { - if (status == 0) { - strcpy(errorString, "HWCEXT Not Implemented"); - } else { - strcpy(errorString, "HWCEXT: Alloc Context Failed"); - } - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - return NULL; - } - - hInfo.boardInfo[monitor].extContextID = ctxRes.optData.allocContextRes.contextID; - - hInfo.nBoards++; - hInfo.boardInfo[monitor].boardNum = monitor; - hInfo.boardInfo[monitor].hdc = hdc; - hInfo.boardInfo[monitor].hMon = hmon; - - ctxReq.which = HWCEXT_GETDEVICECONFIG; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG.\n"); - status = ExtEscape(hdc, EXT_HWC, - sizeof(ctxReq), (void *) &ctxReq, - sizeof(ctxRes), (void *) &ctxRes); - - hInfo.boardInfo[monitor].pciInfo.initialized = 1; - hInfo.boardInfo[monitor].pciInfo.vendorID = - ctxRes.optData.deviceConfigRes.vendorID; - - hInfo.boardInfo[monitor].pciInfo.deviceID = - ctxRes.optData.deviceConfigRes.deviceID; - hInfo.boardInfo[monitor].devRev = - ctxRes.optData.deviceConfigRes.chipRev; - hInfo.boardInfo[monitor].h3Mem = - (ctxRes.optData.deviceConfigRes.fbRam >> 20); - - hInfo.boardInfo[monitor].min_tramSize = - ((hInfo.boardInfo[monitor].h3Mem == 4 ) || - (hInfo.boardInfo[monitor].pciInfo.deviceID == 3)) ? 0x200000 : 0x400000; - - if (getenv("FX_GLIDE_FBRAM")) { - hInfo.boardInfo[monitor].h3Mem = atoi(getenv("FX_GLIDE_FBRAM")); - } - - checkResolutions(resolutionSupported[monitor], - (void *) hInfo.boardInfo[monitor].hMon); - } - } -#elif defined(HWC_GDX_INIT) - { - GDHandle screenDeviceHandle; - CntrlParam paramBlock; - OSErr myErr; - FxU32 i = 0; - hwcControl_t control; - - hInfo.nBoards = 0; - - screenDeviceHandle = DMGetFirstScreenDevice(dmOnlyActiveDisplays); - while(screenDeviceHandle) { - /* First, verify that it's a screen device */ - if(TestDeviceAttribute(screenDeviceHandle,screenDevice)) { - /* Then verify it actually has a driver, so we know gdRefNum - is valid. */ - if(!TestDeviceAttribute(screenDeviceHandle,noDriver)) { - /* HLock((Handle)screenDeviceHandle); */ - paramBlock.ioCRefNum = (*screenDeviceHandle)->gdRefNum; - /* HUnlock((Handle)screenDeviceHandle); */ - /* driver-specific status request */ - paramBlock.csCode = k3DfxGetDeviceConfig; - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - if (myErr == noErr) { - /* Woohoo! Save off the config info for this card */ - hInfo.nBoards++; - hInfo.boardInfo[i].hMon = screenDeviceHandle; - hInfo.boardInfo[i].devRev = - control.res.optData.deviceConfigRes.devRev; - hInfo.boardInfo[i].h3Mem = - control.res.optData.deviceConfigRes.h3Mem; - hInfo.boardInfo[i].pciInfo.vendorID = - control.res.optData.deviceConfigRes.vendorID; - hInfo.boardInfo[i].pciInfo.deviceID = - control.res.optData.deviceConfigRes.deviceID; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[0] = - control.res.optData.deviceConfigRes.hwBase; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[1] = - control.res.optData.deviceConfigRes.lfbBase; - hInfo.boardInfo[i].pciInfo.pciBaseAddr[2] = - control.res.optData.deviceConfigRes.ioPortBase; - hInfo.boardInfo[i].pciInfo.initialized = 1; - - /* No ROM info, don't care */ - i++; - } - } - } - screenDeviceHandle = DMGetNextScreenDevice(screenDeviceHandle,dmOnlyActiveDisplays); - } - } -#else /* HWC_GDX_INIT */ - { - int i; - FxU32 bn; - - pciOpen(); - - hInfo.nBoards = 0; - - errorString[0] = '\0'; - - for (i = 0; i < HWC_MAX_BOARDS; i++) { - hInfo.boardInfo[i].pciInfo.initialized = 0; - if (pciFindCardMulti(vID, dID, &bn, i)) { - hInfo.nBoards++; - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].boardNum = 0; - - hInfo.boardInfo[i].pciInfo.initialized = 1; - hInfo.boardInfo[i].pciInfo.vendorID = vID; - hInfo.boardInfo[i].pciInfo.deviceID = dID; - /* - * NOTE: in the code above we learn about memsize here: - * hInfo.boardInfo[i].h3Mem - * - * However, in DOS, since we have not mapped the board yet, we have - * to wait until later. (see hwcInitRegisters()) - dwj - */ - - /* Get some board Info */ - pciGetConfigData( PCI_REVISION_ID, bn, &hInfo.boardInfo[i].devRev); - - /* Get all the base addresses */ - pciGetConfigData(PCI_BASE_ADDRESS_0, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[0]); - pciGetConfigData(PCI_BASE_ADDRESS_1, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[1]); - pciGetConfigData(PCI_IO_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[2]); - pciGetConfigData(PCI_ROM_BASE_ADDRESS, bn, - &hInfo.boardInfo[i].pciInfo.pciBaseAddr[3]); - } - } - - } -#endif /* HWC_EXT_INIT */ - if (hInfo.nBoards) - return &hInfo; - else - return NULL; - -#undef FN_NAME -} /* hwcInit */ - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask) -{ -#define FN_NAME "hwcMapBoard" - - if (bInfo->pciInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInit\n", FN_NAME); - return FXFALSE; - } - - bInfo->linearInfo.initialized = FXTRUE; - -#ifdef HWC_EXT_INIT - { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_GETLINEARADDR; - req.optData.linearAddrReq.devNum = 0; - req.optData.linearAddrReq.pHandle = (FxU32)OpenProcess(PROCESS_ALL_ACCESS, - FALSE, - GetCurrentProcessId()); - - GDBG_INFO(80, FN_NAME ": Process Handle = 0x%x\n", - req.optData.linearAddrReq.pHandle); - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETLINEARADDR\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - if (res.resStatus != 1) { - strcpy(errorString, "HWCEXT_GETLINEARADDR Failed"); - return FXFALSE; - } - bInfo->linearInfo.linearAddress[0] = - res.optData.linearAddressRes.baseAddresses[0]; - bInfo->linearInfo.linearAddress[1] = - res.optData.linearAddressRes.baseAddresses[1]; - - /* What is this????? */ - bInfo->pciInfo.pciBaseAddr[2] = - res.optData.linearAddressRes.baseAddresses[1]; - } -#elif defined(HWC_GDX_INIT) - { - FxU32 - bAddr; - - /* memory mapped register spaces */ - for (bAddr = 0; bAddr < 2; bAddr++) { - if ((bAddrMask & (0x01UL << bAddr)) != 0x00UL) { - bInfo->linearInfo.linearAddress[bAddr] = bInfo->pciInfo.pciBaseAddr[bAddr]; - } - } - /* FixMe: This gets used to set the pll's so I guess we need it here - * unconditionally - */ - bInfo->linearInfo.linearAddress[2] = bInfo->pciInfo.pciBaseAddr[2]; - - /* Sorry, ROM mapping on MacOS seems whacked out for some reason. */ - bInfo->linearInfo.linearAddress[3] = 0; - - /* Kludge. Pass boardInfo to acceleration stuff. */ -#if GLIDE3 - { - extern hwcBoardInfo *acceleratorBoardInfo; - acceleratorBoardInfo = bInfo; - } -#endif - } -#else - { - FxU32 - bAddr; - - /* memory mapped register spaces */ - for (bAddr = 0; bAddr < 2; bAddr++) { - if ((bAddrMask & (0x01UL << bAddr)) != 0x00UL) { - bInfo->linearInfo.linearAddress[bAddr] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, bAddr); - } - } - - /* FixMe: This gets used to set the pll's so I guess we need it here - * unconditionally - */ - bInfo->linearInfo.linearAddress[2] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, 2); - - /* Does the caller want the rom bios? */ - if ((bAddrMask & 0x08UL) != 0x00UL) { - bInfo->linearInfo.linearAddress[3] = - (FxU32)pciMapCardMulti(bInfo->pciInfo.vendorID, bInfo->pciInfo.deviceID, - 0x1000000, &bInfo->deviceNum, bInfo->boardNum, 3); - } - } -#endif - - return FXTRUE; -#undef FN_NAME -} /* hwcMapBoard */ - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo) -{ -#define FN_NAME hwcInitRegisters - FxU32 - grxSpeedInMHz, memSpeedInMHz, - sgramMode, sgramMask, sgramColor; - - if (bInfo->linearInfo.initialized == FXFALSE) { - printf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - - bInfo->regInfo.initialized = FXTRUE; - - bInfo->regInfo.ioMemBase = - bInfo->linearInfo.linearAddress[0] + SST_IO_OFFSET; - bInfo->regInfo.cmdAGPBase = - bInfo->linearInfo.linearAddress[0] + SST_CMDAGP_OFFSET; - bInfo->regInfo.waxBase = - bInfo->linearInfo.linearAddress[0] + SST_2D_OFFSET; - bInfo->regInfo.sstBase = - bInfo->linearInfo.linearAddress[0] + SST_3D_OFFSET; - bInfo->regInfo.lfbBase = - bInfo->linearInfo.linearAddress[0] + SST_LFB_OFFSET; - bInfo->regInfo.rawLfbBase = - bInfo->linearInfo.linearAddress[1]; - bInfo->regInfo.ioPortBase = (FxU16) bInfo->pciInfo.pciBaseAddr[2] & ~0x1; - - /* Figure out if it's SDRAM */ - { - FxU32 dramInit1; - - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - bInfo->sdRAM = ((dramInit1 & SST_MCTL_TYPE_SDRAM) != 0x00UL); - - if (GETENV("SSTH3_SDRAM")) - bInfo->sdRAM = FXTRUE; - } - -#if !defined(HWC_EXT_INIT) && !defined(HWC_GDX_INIT) - { - FxU32 - pciInit0, - pciCommandReg = - BIT(0) | /* enable i/o decode */ - BIT(1); /* enable memory decode */ - - /* Enable PCI memory and I/O decode */ - pciSetConfigData(PCI_COMMAND, bInfo->deviceNum, &pciCommandReg); - - HWC_IO_LOAD(bInfo->regInfo, pciInit0, pciInit0); - pciInit0 |= SST_PCI_READ_WS | SST_PCI_WRITE_WS; - HWC_IO_STORE(bInfo->regInfo, pciInit0, pciInit0); - } -#endif - - if (GETENV("SSTH3_SGRAM_MODE")) - sgramMode = atoi(GETENV("SSTH3_SGRAM_MODE")); - else if (GETENV("SSTH3_SGRAM_222") && - (atoi(GETENV("SSTH3_SGRAM_222")) != 0)) - sgramMode = 0x27; - else - sgramMode = 0x37; - - if (GETENV("SSTH3_SGRAM_MASK")) - sgramMask = atoi(GETENV("SSTH3_SGRAM_MASK")); - else - sgramMask = 0xFFFFFFFF; - - if (GETENV("SSTH3_SGRAM_COLOR")) - sgramColor = atoi(GETENV("SSTH3_SGRAM_COLOR")); - else - sgramColor = 0; - - if (GETENV("SSTH3_GRXCLOCK")) - grxSpeedInMHz = atoi(GETENV("SSTH3_GRXCLOCK")); - else - grxSpeedInMHz = 100; - - if (GETENV("SSTH3_MEMCLOCK")) - memSpeedInMHz = atoi(GETENV("SSTH3_MEMCLOCK")); - else - memSpeedInMHz = 100; - -#if !defined(HWC_ACCESS_DDRAW) && !defined(HWC_GDX_INIT) - if (GETENV("HAL_NOINIT") == NULL || atoi(GETENV("HAL_NOINIT")) == 0) { - - /* - * final DOS initialiation - */ - - /* don't set the clocks unless they used the environment variables */ - - if (GETENV("SSTH3_GRXCLOCK") || GETENV("SSTH3_MEMCLOCK")) { - switch (bInfo->pciInfo.deviceID) { - case 0x03: /* banshee */ - h3InitPlls(bInfo->regInfo.ioPortBase, grxSpeedInMHz, memSpeedInMHz); - break; - case 0x5: /* voodoo3/avenger */ - break; - default: /* unknown board type!!! */ - return FXFALSE; - } - } - - /* read back the memory size, since we - * don't know it under DOS (see hwcInit) - dwj - */ - bInfo->h3Mem = h3InitGetMemSize(bInfo->regInfo.ioPortBase); - - h3InitVga(bInfo->regInfo.ioPortBase, FXTRUE); - } -#endif - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitRegisters */ - -#define FIFOPAD 0x0000 -#define AUXPAD 0x1000 - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers) -{ -#define FN_NAME "hwcAllocBuffers" - FxBool - bufferAlignP; - FxU32 - bNum, - h3Mem = bInfo->h3Mem << 20, - bufStride, - bufSize; - FxI32 - i, - tramSize, fifoSize; - - if (bInfo->vidInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before video initialization\n", FN_NAME); - return FXFALSE; - } - - GDBG_INFO(80, "%s(0x%x, 0x%x, 0x%x)\n", FN_NAME, bInfo, nColBuffers, nAuxBuffers); - - /* I've decided on > 2 instead of == 3 because we may support more - than 3 buffers in the future, and want 4 to set the - triple-buffering bit in dramInit1, also */ - bInfo->vidInfo.tripleBuffering = (nColBuffers > 2); - - bInfo->vidInfo.stride = bufStride = - calcBufferStride(bInfo->vidInfo.xRes, bInfo->vidInfo.tiled); - - /* We want to place the FIFO after the tram but before the color - buffers with some pad */ - bufSize = calcBufferSize(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, - bInfo->vidInfo.tiled); - - bInfo->buffInfo.bufStride = bufStride; - bInfo->buffInfo.bufSize = bufSize; - - if (bInfo->vidInfo.tiled) { - bInfo->buffInfo.bufStrideInTiles = (bufStride >> 7); - bInfo->buffInfo.bufSizeInTiles = - calcBufferSizeInTiles(bInfo->vidInfo.xRes, bInfo->vidInfo.yRes); - bInfo->buffInfo.bufHeightInTiles = - calcBufferHeightInTiles(bInfo->vidInfo.yRes); - } - - bInfo->buffInfo.initialized = FXTRUE; - bInfo->buffInfo.nColBuffers = nColBuffers; - bInfo->buffInfo.nAuxBuffers = nAuxBuffers; - - /* First, do the buffer allocation */ - - - if (nAuxBuffers > 0) { - bInfo->buffInfo.auxBuffEnd = - bInfo->buffInfo.auxBuffStart = h3Mem; - - bInfo->buffInfo.auxBuffStart -= bufSize; - - /* auxBuffers start on odd pages, so we need to check to see if - * it's on an even page and, if so, make it odd. - * - * NB: We need to do the same sort of 'alignment' thing here as for - * the color buffers. - */ - bufferAlignP = ((bInfo->buffInfo.auxBuffStart & 0x1000UL) == 0); - if (bufferAlignP) bInfo->buffInfo.auxBuffStart -= 0x1000; - - } - - for (i = nColBuffers - 1; i >= 0; i--) { - if ((FxU32) i == (nColBuffers - 1)) { - FxU32 top; - if (nAuxBuffers > 0) - top = bInfo->buffInfo.auxBuffStart; - else - top = h3Mem; - - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = top; - - } else { - bInfo->buffInfo.colBuffStart[i] = - bInfo->buffInfo.colBuffEnd[i] = - bInfo->buffInfo.colBuffStart[i + 1]; - } - - bInfo->buffInfo.colBuffStart[i] -= bufSize; - - /* As a memory access optmization colorBuffers start on even - * pages, while aux buffers start on odd pages. Thus we must - * check to see if we're startding on an odd page here and, if so, - * add a page to the start. - */ - bufferAlignP = ((bInfo->buffInfo.colBuffStart[i] & 0x1000UL) != 0); - if (bufferAlignP) bInfo->buffInfo.colBuffStart[i] -= 0x1000; - } - - /* Now we can calculate some other stuff... */ - bInfo->fbOffset = bInfo->buffInfo.colBuffStart[0]; -#if 0 - bInfo->tramOffset = - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset; - if (tramSize < bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = 0; - bInfo->tramOffset = (FxU32) fifoSize; - bInfo->tramSize = (FxU32) tramSize; - -#else - bInfo->tramOffset = 0; - fifoSize = MAXFIFOSIZE; - tramSize = bInfo->fbOffset - bInfo->tramOffset - fifoSize; - if (tramSize < (FxI32)bInfo->min_tramSize) { - /* Now we have to shrink the FIFO */ - tramSize = bInfo->min_tramSize; - fifoSize = bInfo->fbOffset - bInfo->min_tramSize; - if (fifoSize < 0) { - GDBG_INFO(80, "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - sprintf(errorString, - "%s: Not enough memory for resolution + min texture\n", - FN_NAME); - return FXFALSE; - } - } - - bInfo->fifoInfo.fifoLength = (FxU32) fifoSize; - bInfo->fifoInfo.fifoStart = bInfo->fbOffset - fifoSize; - - bInfo->fifoInfo.fifoLength -= 0x2000; - - bInfo->tramOffset = 0; - bInfo->tramSize = (FxU32) tramSize; - -#endif - -#if 1 -#define LFBSTRIDE 0x1000 - { - FxU32 colBuffOffset = 0; - FxU32 colBufAlignP = 0; - - for (bNum = 0; bNum < nColBuffers; bNum++) { - if ((colBuffOffset & 0x1000UL) != 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[bNum] = - hwcBufferLfbAddr(bNum, bInfo, colBufAlignP); - colBuffOffset += bufSize; - } - - if (nAuxBuffers > 0) { - if ((colBuffOffset & 0x1000UL) == 0) { - colBuffOffset += 0x1000UL; - colBufAlignP++; - } - bInfo->buffInfo.lfbBuffAddr[nColBuffers] = - hwcBufferLfbAddr(nColBuffers, bInfo, colBufAlignP); - } - } -#endif - - bInfo->buffInfo.initialized = FXTRUE; - - GDBG_INFO(80, "%s: Board Info:\n", FN_NAME); - GDBG_INFO(80, "\thdc: 0x%x\n", bInfo->hdc); - GDBG_INFO(80, "\textContextID: 0x%x\n", bInfo->extContextID); - GDBG_INFO(80, "\tdevRev: 0x%x\n", bInfo->devRev); - GDBG_INFO(80, "\tfbOffset: 0x%x\n", bInfo->fbOffset); - GDBG_INFO(80, "\th3Rev: 0x%x\n", bInfo->h3Rev); - GDBG_INFO(80, "\th3Mem: 0x%x\n", bInfo->h3Mem); - GDBG_INFO(80, "\tboardNum: 0x%x\n", bInfo->boardNum); - GDBG_INFO(80, "\tdeviceNum: 0x%x\n", bInfo->deviceNum); - - GDBG_INFO(80, "%s: Buffer Info:\n", FN_NAME); - GDBG_INFO(80, "\tbufSize: 0x%x\n", bInfo->buffInfo.bufSize); - GDBG_INFO(80, "\tbufSizeInTiles: 0x%x\n", bInfo->buffInfo.bufSizeInTiles); - GDBG_INFO(80, "\tbufStride: 0x%x\n", bInfo->buffInfo.bufStride); - GDBG_INFO(80, "\tbufStrideInTiles:0x%x\n", bInfo->buffInfo.bufStrideInTiles); - GDBG_INFO(80, "\tbufHeightInTiles:0x%x\n", bInfo->buffInfo.bufHeightInTiles); - GDBG_INFO(80, "\tnColBuffers: 0x%x\n", bInfo->buffInfo.nColBuffers); - for (i = 0; i < (FxI32) nColBuffers; i++) { - GDBG_INFO(80, "\tcolBuff %d Start: 0x%x\n", i, bInfo->buffInfo.colBuffStart[i]); - GDBG_INFO(80, "\tcolBuff %d End: 0x%x\n", i, bInfo->buffInfo.colBuffEnd[i]); - } - GDBG_INFO(80, "\tnAuxBuffers: 0x%x\n", bInfo->buffInfo.nAuxBuffers); - GDBG_INFO(80, "\tauxBuffStart: 0x%x\n", bInfo->buffInfo.auxBuffStart); - GDBG_INFO(80, "\tauxBuffEnd: 0x%x\n", bInfo->buffInfo.auxBuffEnd); - - GDBG_INFO(80, "%s: FIFO Info:\n", FN_NAME); - GDBG_INFO(80, "\tfifoStart: 0x%x\n", bInfo->fifoInfo.fifoStart); - GDBG_INFO(80, "\tfifoLength: 0x%x\n", bInfo->fifoInfo.fifoLength); - - return FXTRUE; -#undef FN_NAME -} /* hwcAllocBuffers */ - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitFifo" - FxBool - agpEnable = FXFALSE; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - if (bInfo->pciInfo.deviceID == 0x3) { /* banshee */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - } else { - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, - (0xf << SST_HIGHWATER_SHIFT) | 0x8); - } - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, (((bInfo->fifoInfo.fifoLength >> 12) - 1) | - SST_EN_CMDFIFO | - (enableHoleCounting ? 0 : SST_CMDFIFO_DISABLE_HOLES) | - (agpEnable ? SST_CMDFIFO_AGP : 0))); - - GDBG_INFO(80, "%s: CMD FIFO placed at physical addr 0x%x\n", - FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitFifo */ - -#if 0 -/* Currently unused. */ -static SstIORegs savedIORegs; -#endif - -void -hwcInitVideoOverlaySurface( - hwcRegInfo *rInfo, - FxU32 enable, /* 1=enable Overlay surface (OS), 1=disable */ - FxU32 stereo, /* 1=enable OS stereo, 0=disable */ - FxU32 horizScaling, /* 1=enable horizontal scaling, 0=disable */ - FxU32 dudx, /* horizontal scale factor (ignored if not */ - /* scaling) */ - FxU32 verticalScaling, /* 1=enable vertical scaling, 0=disable */ - FxU32 dvdy, /* vertical scale factor (ignored if not */ - /* scaling) */ - FxU32 filterMode, /* duh */ - FxU32 tiled, /* 0=OS linear, 1=tiled */ - FxU32 pixFmt, /* pixel format of OS */ - FxU32 clutBypass, /* bypass clut for OS? */ - FxU32 clutSelect, /* 0=lower 256 CLUT entries, 1=upper 256 */ - FxU32 startAddress, /* board address of beginning of OS */ - FxU32 stride) /* distance between scanlines of the OS, in */ - /* units of bytes for linear OS's and tiles for */ - /* tiled OS's */ -{ - FxU32 doStride; - FxU32 vidProcCfg; - - HWC_IO_LOAD((*rInfo), vidProcCfg, vidProcCfg); - - vidProcCfg &= ~(SST_OVERLAY_TILED_EN | - SST_OVERLAY_STEREO_EN | - SST_OVERLAY_HORIZ_SCALE_EN | - SST_OVERLAY_VERT_SCALE_EN | - SST_OVERLAY_TILED_EN | - SST_OVERLAY_PIXEL_FORMAT | - SST_OVERLAY_CLUT_BYPASS | - SST_OVERLAY_CLUT_SELECT); - - if (enable) - vidProcCfg |= SST_OVERLAY_EN; - - if (stereo) - vidProcCfg |= SST_OVERLAY_STEREO_EN; - - if (horizScaling) - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - if (verticalScaling) - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - if (tiled) { - vidProcCfg |= SST_OVERLAY_TILED_EN; - } - - vidProcCfg |= SST_OVERLAY_PIXEL_RGB565D; /* Turn on RGB565Dithered */ - vidProcCfg &= ~SST_CURSOR_EN; /* Turn off HW Cursor */ - vidProcCfg |= SST_OVERLAY_TILED_EN; /* Overlay tile space enable */ - - - if (clutBypass) - vidProcCfg |= SST_OVERLAY_CLUT_BYPASS; - - if (clutSelect) - vidProcCfg |= SST_OVERLAY_CLUT_SELECT; - - HWC_IO_STORE((*rInfo), vidProcCfg, vidProcCfg); - - /* */ - HWC_IO_LOAD((*rInfo), vidDesktopOverlayStride, doStride); - doStride &= ~(SST_OVERLAY_LINEAR_STRIDE | SST_OVERLAY_TILE_STRIDE); - - stride <<= SST_OVERLAY_STRIDE_SHIFT; - if (tiled) - stride &= SST_OVERLAY_TILE_STRIDE; - else - stride &= SST_OVERLAY_LINEAR_STRIDE; - doStride |= stride; - - HWC_IO_STORE((*rInfo), vidDesktopOverlayStride, doStride); - -} /* hwcInitVideoOverlaySurface */ - -FxU32 -hwcInitLookupRefresh(FxU32 ord_refresh) -{ -#define FN_NAME "hwcInitLookupRefresh" - FxU32 refresh_hz; - - switch(ord_refresh) { - case(GR_REFRESH_60Hz): - refresh_hz = 60; - break; - case(GR_REFRESH_70Hz): - refresh_hz = 70; - break; - case(GR_REFRESH_72Hz): - refresh_hz = 72; - break; - case(GR_REFRESH_75Hz): - refresh_hz = 75; - break; - case(GR_REFRESH_80Hz): - refresh_hz = 80; - break; - case(GR_REFRESH_85Hz): - refresh_hz = 85; - break; - case(GR_REFRESH_90Hz): - refresh_hz = 90; - break; - case(GR_REFRESH_100Hz): - refresh_hz = 100; - break; - case(GR_REFRESH_120Hz): - refresh_hz = 120; - break; - default: - GDBG_ERROR(FN_NAME, "Unsupported Refresh Rate -- defaulting to 60hz\n"); - refresh_hz = 60; - break; - } - return (refresh_hz); -#undef FN_NAME -} /* hwcInitLookupRefresh */ - -#ifdef HWC_ACCESS_DDRAW - -#define LINEAR_STRIDE_ALIGN 16UL - -static FxBool -_hwcLinear2HWAddr(const FxU32 linearAddr, - const FxU32 linearBaseAddr, - const FxU32 linearStride, - const hwcBoardInfo* bInfo, - hwcSurfaceInfo* ret) -{ -#define FN_NAME "_hwcLinear2HWAddr" - FxU32 - pciStride, /* page stride */ - hwStride, /* tile stride */ - tileMark, /* delineation between linear and tiled */ - lpTileBase; /* linear addr of tileMark */ - FxBool - retVal = FXFALSE, - isTiled; /* is the surface tiled? */ - - /* determine lfb baseAddress and hw offset to buffer */ - { - hwcExtRequest_t - req; /* Request to HWC_EXT */ - hwcExtResult_t - res; /* Result from HWC_EXT */ - - /* query for tile watermark & compute tile characteristics */ - req.which = HWCEXT_GETDEVICECONFIG; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - retVal = (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (LPSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_GETDEVICECONFIG failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errExit; - } - pciStride = res.optData.deviceConfigRes.pciStride; - hwStride = res.optData.deviceConfigRes.hwStride; - tileMark = res.optData.deviceConfigRes.tileMark; - - lpTileBase = linearBaseAddr + tileMark; - isTiled = (linearAddr >= lpTileBase); - } - - ret->pciStride = pciStride; - ret->tileBase = tileMark; - ret->lpSurface = linearAddr; - ret->lpLFB = linearBaseAddr; - ret->hwStride = hwStride; - - /* Compute things that depend on the offset wrt the tile mark */ - ret->isTiled = isTiled; - if (ret->isTiled) { - const FxU32 - tileStride = hwStride, - tilePitch = pciStride, - tileOffset = linearAddr - lpTileBase, - y = tileOffset / tilePitch, - x = tileOffset - (y * tilePitch), - tile = ((y / HWC_TILE_HEIGHT) * tileStride) + (x / HWC_TILE_WIDTH); - - ret->fbOffset = (tile << 12UL) + tileMark; - ret->fbStride = ret->hwStride | SST_BUFFER_MEMORY_TILED; - } else { - /* NB: Banshee (and derivatives) have a 16-byte alignment - * restriction on the stride and offset for color/aux buffers, but - * it is left to the client to correctly adjust for this when - * setting the values. - */ - ret->fbOffset = linearAddr - linearBaseAddr; - ret->fbStride = linearStride; - } - - __errExit: - return retVal; -#undef FN_NAME -} /* _hwcLinear2HWAddr */ - -static FxU32 -_hwcPixelFormat2Bytes(const DDPIXELFORMAT* pixelFormat) -{ -#define FN_NAME "_hwcPixelFormat2Bytes" - const DWORD - formatFlags = pixelFormat->dwFlags; - FxU32 - retVal = 0x00UL; - - if ((formatFlags & DDPF_PALETTEINDEXED8) == DDPF_PALETTEINDEXED8) { - retVal = 1; - } else if ((formatFlags & DDPF_RGB) == DDPF_RGB) { - retVal = (pixelFormat->dwRGBBitCount >> 0x03UL); - if ((retVal == 0) || (retVal > 2)) { - retVal = 0; - GDBG_INFO(80, FN_NAME": Invalid surface rgb bit count(0x%X)\n", - pixelFormat->dwRGBBitCount); - } - } else { - GDBG_INFO(80, FN_NAME": Invalid surface pixel format flags(0x%X)\n", - formatFlags); - } - - return retVal; -#undef FN_NAME -} /* _hwcPixelFormat2Bytes */ - -/*------------------------------------------------------------------- - Function: hwcGetSurfaceInfo - Date: 14-Jul-98 - Implementor(s): dow - Description: - Returns information about a Glide (or DDraw) surface - - Arguments: - - Return: - -------------------------------------------------------------------*/ -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* bInfo, - FxU32 *sfc, - hwcSurfaceInfo *ret) -{ -#define FN_NAME "hwcGetSurfaceInfo" - /* AssUMe it's a DDraw surface for now */ - LPDIRECTDRAWSURFACE2 - surf = (LPDIRECTDRAWSURFACE2) sfc; - DDSURFACEDESC - desc; - DWORD - ddErr; - FxBool - retVal; - FxU32 - lfbBase, /* linear addr for base of LFB */ - lpSurface; /* Linear addr for the surface */ - - /* Lock the surface and get some info */ - desc.dwSize = sizeof(desc); - ddErr = IDirectDrawSurface2_Lock(surf, 0, &desc, - DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, 0); - retVal = (ddErr == DD_OK); - if (!retVal) { - sprintf(errorString, "%s: IDirectDrawSurface2_Lock (0x%X)\n", - FN_NAME, ddErr); - GDBG_INFO(80, "%s", errorString); - goto __errExit; - } - - /* Grab the memory pointer */ - lpSurface = (DWORD) desc.lpSurface; - - /* Unlock the surface */ - desc.dwSize = sizeof(desc); - IDirectDrawSurface2_Unlock(surf, desc.lpSurface); - - /* Get surface dimensions here rather than re-getting the surface - * description later since these should all be valid here. - */ - ret->height = desc.dwHeight; - ret->width = desc.dwWidth; - ret->depth = _hwcPixelFormat2Bytes(&desc.ddpfPixelFormat); - retVal = (ret->depth != 0x00UL); - if (!retVal) { - sprintf(errorString, "%s: Invalid surface pixel format (0x%X)\n", - FN_NAME, desc.ddpfPixelFormat.dwFlags); - GDBG_INFO(80, "%s", errorString); - goto __errExit; - } - - /* Get base addresses of the board */ - { - hwcExtRequest_t - req; /* Request to HWC_EXT */ - hwcExtResult_t - res; /* Result from HWC_EXT */ - - /* This address was set when the board was mapped in hwcMapBoard */ - lfbBase = bInfo->linearInfo.linearAddress[1]; - - /* The DirectDraw driver may have re-mapped memory different than - * the 2d driver's hw mapping. We have to figure out the correct - * hw address for packet offsets and color buffer stuff. - */ - if (retVal) { - req.which = HWCEXT_LINEAR_MAP_OFFSET; - req.optData.mapInfoReq.mapAddr = lfbBase; - req.optData.mapInfoReq.remapAddr = lpSurface; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_LINEAR_MAP_OFFSET\n"); - retVal = (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (LPCSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_LINEAR_MAP_OFFSET failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - } - - /* lpSurface is now an address relative to the 2d driver's base - * address as returned by the HWCEXT_GETLINEARADDR callback. - */ - lpSurface = (lfbBase + res.optData.mapInfoRes.linAddrOffset); - } - } - if (!retVal) goto __errExit; - - /* Get the rest of the information about the hw relative address - * from the linear address's location in memory. - */ - retVal = _hwcLinear2HWAddr(lpSurface, - lfbBase, - desc.lPitch, - bInfo, - ret); - - __errExit: - return retVal; -#undef FN_NAME -} /* hwcGetSurfaceInfo */ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo) -{ -#define FN_NAME "hwcAllocWinContext" - FxU32 - retVal = 0x00UL; - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; - - /* Allocate a context with the Driver */ - ctxReq.which = HWCEXT_ALLOCCONTEXT; - ctxReq.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - ctxReq.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_WIND; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_ALLOCCONTEXT\n"); - if (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(ctxReq), (LPSTR)&ctxReq, - sizeof(ctxRes), (LPSTR)&ctxRes) < 1) { - strcpy(errorString, FN_NAME": HWCEXT_ALLOCCONTEXT failed"); - } else { - retVal = ctxRes.optData.allocContextRes.contextID; - } - - return retVal; -#undef FN_NAME -} /* hwcAllocWinContext */ - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId) -{ -#define FN_NAME "hwcFreeWinContext" - hwcExtRequest_t - req; - hwcExtResult_t - res; - - req.which = HWCEXT_RELEASECONTEXT; - req.optData.releaseContextReq.contextID = winContextId; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_RELEASECONTEXT\n"); - return (ExtEscape(bInfo->hdc, EXT_HWC, - sizeof(req), (void*)&req, - sizeof(res), (void*)&res) > 0); -#undef FN_NAME -} /* hwcFreeWinContext */ - - -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface) -{ -#define FN_NAME "hwcAllocWinFifo" - FxBool - retVal = FXFALSE; - hwcExtRequest_t - req; - hwcExtResult_t - res; - - /* Set undefined fifo type to start, and always clear the serial - * number for this context. - */ - fifo->fifoType = 0xFFFFFFFFUL; - - /* Check to see that we have valid surface owner to hang - * the command fifo surface off of. - */ - retVal = (surface != NULL); - if (retVal) { - LPDIRECTDRAW - objDD = NULL; - LPDIRECTDRAWSURFACE - objSentinal = NULL, - objFifo = NULL; - DDSURFACEDESC - fifoDesc, - sentinalDesc; - - /* Get the surface owner so that we can try to allocate a new - * surface for the fifo. On windows this will be a direct draw - * object, and we need a dd4 object for agp surfaces. - */ - { - LPDIRECTDRAWSURFACE2 - objSurface = NULL; - - /* Make sure that this is a Surface2 object so that we can get - * the DirectDraw object that owns this surface and piggy back - * our objects ontop of it. - */ - retVal = (IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)surface, - &IID_IDirectDrawSurface2, - &objSurface) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Require atleast IDirectDrawSurface2.\n", FN_NAME); - goto __errSurfaceFifo; - } - - /* Get the dd object for the surface creation */ - retVal = (IDirectDrawSurface2_GetDDInterface(objSurface, - &objDD) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not acquire DirectDraw object.\n", FN_NAME); - goto __errSurfaceDDObj; - } - - __errSurfaceDDObj: - if (objSurface != NULL) IDirectDrawSurface_Release(objSurface); - if (!retVal) goto __errSurfaceFifo; - } - - /* Is the 2d command fifo in agp or local frame buffer space? */ - memset(&req, 0, sizeof(req)); - memset(&res, 0, sizeof(res)); - - req.which = HWCEXT_FIFOINFO; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_FIFOINFO\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (void*)&req, - sizeof(res), (void*)&res) > 0); - if (!retVal) { - GDBG_INFO(80, "%s: HWCEXT_FIFOINFO failed to determine current 2d fifo type.\n", - FN_NAME); - goto __errSurfaceFifo; - } - - /* Basic surface type for the fifo */ - memset(&fifoDesc, 0, sizeof(fifoDesc)); - fifoDesc.dwSize = sizeof(fifoDesc); - fifoDesc.dwFlags = (DDSD_CAPS | - DDSD_WIDTH | DDSD_HEIGHT | - DDSD_PITCH | - DDSD_PIXELFORMAT); - - /* Set pixel format to make the allocation be 32-bit words */ - fifoDesc.ddpfPixelFormat.dwSize = sizeof(fifoDesc.ddpfPixelFormat); - fifoDesc.ddpfPixelFormat.dwFlags = (DDPF_ALPHAPIXELS | - DDPF_RGB); - fifoDesc.ddpfPixelFormat.dwRGBBitCount = 32UL; - fifoDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000UL; - fifoDesc.ddpfPixelFormat.dwRBitMask = 0x00FF0000UL; - fifoDesc.ddpfPixelFormat.dwGBitMask = 0x0000FF00UL; - fifoDesc.ddpfPixelFormat.dwBBitMask = 0x000000FFUL; - - /* We want the command fifo someplace that the hw can get to - * directly. Whether this is is local to the board or agp is - * controlled by where the 2d driver has its fifo. - */ - fifoDesc.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN | - DDSCAPS_VIDEOMEMORY); - - { - DDCAPS - ddCaps; - - /* Make sure that the DirectDraw driver knows about different - * video memory types before setting the bits to differentiate - * local from agp memory. - */ - memset(&ddCaps, 0, sizeof(ddCaps)); - ddCaps.dwSize = sizeof(ddCaps); - - retVal = (IDirectDraw_GetCaps(objDD, - &ddCaps, - NULL) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not determine if DirectDraw handles separate memory types.\n", - FN_NAME); - goto __errSurfaceFifo; - } - - /* Make the fifo type match the 2d fifo type if the driver can - * handle different memory types. - */ - switch (res.optData.fifoInfoRes.fifoType) { - case HWCEXT_FIFO_AGP: - if ((ddCaps.dwCaps2 & DDCAPS2_NONLOCALVIDMEM) != 0x00UL) { - fifoDesc.ddsCaps.dwCaps |= DDSCAPS_NONLOCALVIDMEM; - } else { - retVal = FXFALSE; - } - break; - - case HWCEXT_FIFO_FB: - if ((ddCaps.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM) != 0x00UL) - fifoDesc.ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; - break; - - case HWCEXT_FIFO_HOST: - default: - retVal = FXFALSE; - break; - } - if (!retVal) goto __errSurfaceFifo; - } - - /* Allocate a sentinal surface so that the client can 'know' when - * a given fifo segment has actually been executed by reading a - * client specified serial # out of the buffer. This only needs to - * be big enough to hold the size of a serial #, but we need to - * work around some sort of whacked agp bug when reading back. See - * hwcExecuteStatusWinFifo() for details. - */ - sentinalDesc = fifoDesc; - - sentinalDesc.dwHeight = 4; - sentinalDesc.dwWidth = 4; - - retVal = (IDirectDraw_CreateSurface(objDD, - &sentinalDesc, - &objSentinal, - 0) == DD_OK); - if (!retVal) { - GDBG_INFO(80, "%s: Could not allocate surface for serial #'s.\n", FN_NAME); - goto __errSurfaceFifo; - } - - /* Make stride and width the same so that we get the entire - * surface as teh command fifo for the hw to just jsr to. - * - * NB: Currently DirectDraw will not allow surfaces to have a - * width greater than that of the primary surface. We will fail if - * we don't get this surface w/o checking the primary surface's - * width because if we don't have a contiguous block it is going - * to be a pain to have the hw jsr to each of these 'lines'. It is - * likely that DirectDraw is not going to sub-allocate out of this - * slop like it could, but I would prefer not to take chances - * until we have to. - */ - fifoDesc.lPitch = 0x1000UL; - fifoDesc.dwWidth = (fifoDesc.lPitch >> 2UL); - - /* Try to allocate a surface that contains some # of command - * stream and persistant state buffers. This is - * allocated in hw page units (4k) rather than the client - * allocation units, but that should be transparent since - * the client will just not use the extra slop. - */ -#define MAX(__a, __b) (((__a) > (__b)) ? (__a) : (__b)) - { - const FxU32 - allocFifo = MAX(fifo->cmdBuf.allocUnit, 0x1000UL), - allocState = MAX(fifo->stateBuf.allocUnit, 0x1000UL), - allocUnit = pow2Round(allocFifo + allocState + 0xFFFUL, 0x1000UL); - const char* - numAllocStr = GETENV("FX_WINFIFO_INIT_ALLOC"); - FxU32 - numAlloc = ((numAllocStr == NULL) - ? 0x8UL - : atoi(numAllocStr)); - DWORD - ddErr; - - while(numAlloc > 0) { - fifoDesc.dwHeight = (allocUnit * numAlloc) / fifoDesc.lPitch; - ddErr = IDirectDraw_CreateSurface(objDD, - &fifoDesc, - &objFifo, - 0); - retVal = (ddErr == DD_OK); - if (retVal) break; - - if ((ddErr != DDERR_OUTOFVIDEOMEMORY) || - (ddErr != DDERR_OUTOFMEMORY)) break; - - /* Try a smaller allocation */ - numAlloc--; - } - if (!retVal) { - GDBG_INFO(80, "%s: Could not get cmdFifo DirectDraw surface. (0x%X)\n", - FN_NAME, ddErr); - goto __errSurfaceFifo; - } - - /* Its now safe to overwrite the client allocUnit's to the - * rounded allocation units because we've finally done all of - * the stuff that could fail. - */ - fifo->cmdBuf.size = allocFifo * numAlloc; - fifo->cmdBuf.allocUnit = allocFifo; - - fifo->stateBuf.size = allocState * numAlloc; - fifo->stateBuf.allocUnit = allocState; - } -#undef MAX - - /* Fill in the rest of the client's return buffer */ - fifo->fifoType = res.optData.fifoInfoRes.fifoType; - - fifo->surfaceFifo = (FxU32*)objFifo; - fifo->surfaceSentinal = (FxU32*)objSentinal; - - /* Do the lock so that we can write the sentinal, but the - * client is responsible for locking before use. - */ - if (hwcLockWinFifo(bInfo, fifo)) { - /* Write bogus serial # */ - *(volatile FxU32*)fifo->sentinalBufferAddr = 0x0UL; - - hwcUnlockWinFifo(bInfo, fifo); - } - - __errSurfaceFifo: - /* Free our directdraw objects if something bad happened. */ - if (!retVal) { - if (objSentinal != NULL) IDirectDrawSurface_Release(objSentinal); - if (objFifo != NULL) IDirectDrawSurface_Release(objFifo); - } - if (objDD != NULL) IDirectDraw_Release(objDD); - } - - /* Could not allocate directly accessible fifo so setup the host - * memory backed fifo which will get dumped at execute time. - */ - if (!retVal && (bInfo->hdc != 0x00UL)) { - fifo->fifoType = HWCEXT_FIFO_HOST; - - fifo->cmdBuf.hwOffset = 0x00UL; - fifo->cmdBuf.size = fifo->cmdBuf.allocUnit; - fifo->stateBuf.hwOffset = 0x00UL; - fifo->stateBuf.size = fifo->stateBuf.allocUnit; - - /* This can never fail since the client is responsible for - * allocating this memory. - */ - retVal = FXTRUE; - } - - return retVal; -#undef FN_NAME -} /* hwcAllocWinFifo */ - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcLockWinFifo" - FxBool - retVal = FXFALSE; - - if (fifo->fifoType == HWCEXT_FIFO_HOST) { - retVal = FXTRUE; - } else if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - DDSURFACEDESC - fifoDesc, - sentinalDesc; - - if (fifo->lockCount > 0) goto __alreadyLocked; - if ((fifo->surfaceFifo == NULL) || - (fifo->surfaceSentinal == NULL)) goto __errFifoLock; - - /* Get base pointer to the fifo surfaces. - * - * NB: In theory we should leave these locked for the duration of - * the of the fifo lock and we would need to set the - * DDLOCK_NOSYSLOCK flag when doing the lock. However, when we do - * this type of lock the directDraw driver re-maps the physical - * address to a new set of linear address pages. So we take advantage - * of the fact taht the current implementation will not move memory - * behind our backs outside of a surface lock. - */ -#define HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS 0 - fifoDesc.dwSize = sizeof(fifoDesc); - retVal = (IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)fifo->surfaceFifo, - NULL, - &fifoDesc, - HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS | - DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, - NULL) == DD_OK); - - /* NB: Since there's no working DDLOCK_NOSYSLOCK we unlock the surface - * here, and rely on the current implementation to leave the linear - * mapping to the hw intact after the unlocking. - */ - IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)fifo->surfaceFifo, NULL); - if (!retVal) { - strcpy(errorString, "Could not lock cmdFifo surface"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - sentinalDesc.dwSize = sizeof(sentinalDesc); - retVal = (IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)fifo->surfaceSentinal, - NULL, - &sentinalDesc, - HWC_DIRECTDRAW_DRIVER_NOSYSLOCK_FLAGS | - DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, - NULL) == DD_OK); - - /* NB: Since there's no working DDLOCK_NOSYSLOCK we unlock the surface - * here, and rely on the current implementation to leave the linear - * mapping to the hw intact after the unlocking. - */ - IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)fifo->surfaceSentinal, NULL); - if (!retVal) { - strcpy(errorString, "Could not lock serial # surface"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - fifo->cmdBuf.baseAddr = (FxU32)fifoDesc.lpSurface; - fifo->stateBuf.baseAddr = (fifo->cmdBuf.baseAddr + - fifo->cmdBuf.size); - fifo->sentinalBufferAddr = (FxU32)sentinalDesc.lpSurface; - - /* The DirectDraw driver may have re-mapped memory different than - * the 2d driver's hw mapping. We have to figure out the correct - * hw address for packet offsets and color buffer stuff. - */ - { - hwcExtRequest_t - req; - hwcExtResult_t - res; - const FxU32 - lfbBase = bInfo->linearInfo.linearAddress[1]; /* lfb space */ - FxU32 - tileMark; - - /* query for tile watermark & compute tile characteristics */ - req.which = HWCEXT_GETDEVICECONFIG; - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETDEVICECONFIG\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (LPSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_GETDEVICECONFIG failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - tileMark = res.optData.deviceConfigRes.tileMark; - - { - struct remapRec { - FxU32 remapAddr; - FxU32* remapOffset; - FxU32 surfaceType; - } remapAddrList[] = { - { fifo->cmdBuf.baseAddr, &fifo->cmdBuf.hwOffset, fifo->fifoType }, - { fifo->stateBuf.baseAddr, &fifo->stateBuf.hwOffset, fifo->fifoType }, - { fifo->sentinalBufferAddr, &fifo->sentinalBufferOffset, HWCEXT_FIFO_FB } - }; - FxU32 i; - - for(i = 0; i < sizeof(remapAddrList) / sizeof(remapAddrList[0]); i++) { - FxU32 hwOffset; - - req.which = HWCEXT_LINEAR_MAP_OFFSET; - req.optData.mapInfoReq.mapAddr = lfbBase; - req.optData.mapInfoReq.remapAddr = remapAddrList[i].remapAddr; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_LINEAR_MAP_OFFSET\n"); - retVal = (ExtEscape((HDC)bInfo->hdc, EXT_HWC, - sizeof(req), (LPCSTR)&req, - sizeof(res), (LPSTR)&res) > 0); - if (!retVal) { - strcpy(errorString, "HWCEXT_LINEAR_MAP_OFFSET failed"); - GDBG_INFO(80, "%s: %s.\n", FN_NAME, errorString); - goto __errFifoLock; - } - - /* Make sure we have the right offset for tiled/linear addresses */ - hwOffset = res.optData.mapInfoRes.linAddrOffset; - if ((remapAddrList[i].surfaceType == HWCEXT_FIFO_FB) && (hwOffset >= tileMark)) { - hwcSurfaceInfo surfaceInfo; - - retVal = _hwcLinear2HWAddr(remapAddrList[i].remapAddr, - remapAddrList[i].remapAddr - hwOffset, - 0x00UL, - bInfo, - &surfaceInfo); - if (!retVal) goto __errFifoLock; - hwOffset = surfaceInfo.fbOffset; - } - *remapAddrList[i].remapOffset = hwOffset; - } - } - } - - __alreadyLocked: - /* Finally, declare success */ - retVal = FXTRUE; - - __errFifoLock: - ; - } - - if (retVal) fifo->lockCount++; - - return retVal; -#undef FN_NAME -} /* hwcLockWinFifo */ - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcUnlockWinFifo" - FxBool - retVal = ((fifo->lockCount > 0) && - ((fifo->fifoType == HWCEXT_FIFO_HOST) || - (fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP))); - - if (retVal) { - fifo->lockCount--; - - if (fifo->lockCount == 0) { - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - /* Do nothing for now since the surfaces were unlocked in - * hwcLockWinFifo since we're not using the NOSYSLOCK flags - * when doing the DirectDraw surface lock. - */ - } - } - } - - return retVal; -#undef FN_NAME -} /* hwcUnlockWinFifo */ - -FxBool -hwcFreeWinFifo( hwcBoardInfo* bInfo, - HwcWinFifo* fifo ) -{ -#define FN_NAME "hwcFreeWinFifo" - - /* What type of fifo do we have? */ - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - if (fifo->surfaceFifo != NULL) { - LPDIRECTDRAWSURFACE - objFifo = (LPDIRECTDRAWSURFACE)fifo->surfaceFifo; - - IDirectDrawSurface_Release(objFifo); - - fifo->surfaceFifo = NULL; - fifo->cmdBuf.baseAddr = - fifo->cmdBuf.hwOffset = - fifo->cmdBuf.size = - fifo->stateBuf.baseAddr = - fifo->stateBuf.hwOffset = 0x00UL; - } - - if (fifo->surfaceSentinal != NULL) { - LPDIRECTDRAWSURFACE - objSentinal = (LPDIRECTDRAWSURFACE)fifo->surfaceSentinal; - - IDirectDrawSurface_Release(objSentinal); - - fifo->surfaceSentinal = NULL; - fifo->sentinalBufferAddr = - fifo->sentinalBufferOffset = 0x00UL; - } - } - - fifo->fifoType = HWCEXT_FIFO_INVALID; - - return FXTRUE; -#undef FN_NAME -} /* hwcFreeWinFifo */ - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteWinFifo" - hwcExtRequest_t req; - hwcExtResult_t res; - - memset( &req, 0, sizeof( req ) ); - memset( &res, 0, sizeof( res ) ); - - req.which = HWCEXT_EXECUTEFIFO; - req.contextID = winContextId; - - req.optData.executeFifoReq.fifoType = fifo->fifoType; - - req.optData.executeFifoReq.fifoPtr = fifo->cmdBuf.baseAddr; - req.optData.executeFifoReq.fifoSize = fifo->cmdBuf.size >> 2UL; - req.optData.executeFifoReq.statePtr = fifo->stateBuf.baseAddr; - req.optData.executeFifoReq.stateSize = fifo->stateBuf.size >> 2UL; - req.optData.executeFifoReq.serialNumber = serialNumber; - - if (fifo->fifoType != HWCEXT_FIFO_HOST) { - req.optData.executeFifoReq.fifoOffset = fifo->cmdBuf.hwOffset; - req.optData.executeFifoReq.stateOffset = fifo->stateBuf.hwOffset; - req.optData.executeFifoReq.sentinalOffset = fifo->sentinalBufferOffset; - } - - GDBG_INFO(80, FN_NAME": Id(0x%X) state(0x%X) cmd(0x%X)\n", - winContextId, - req.optData.executeFifoReq.stateSize, - req.optData.executeFifoReq.fifoSize); - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_EXECUTEFIFO\n"); - return ( ExtEscape( (HDC)bInfo->hdc, EXT_HWC, - sizeof( req ), (void*)&req, - sizeof( res ), (void*)&res ) > 0 ); -#undef FN_NAME -} /* hwcExecuteWinFifo */ - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteStatusWinFifo" - FxU32 - retVal = ~0x00UL; - - switch(fifo->fifoType) { - /* Host fifo always executes synchronously */ - case HWCEXT_FIFO_HOST: - retVal = serialNumber; - break; - - case HWCEXT_FIFO_FB: - case HWCEXT_FIFO_AGP: - { - volatile FxU32* - bufAddr = (volatile FxU32*)fifo->sentinalBufferAddr; - - /* We need to do some extra reads here so that we make sure taht - * the data we're returning is coherent w/ the actual frame - * buffer due to the intervening pixel cache. The cache is, - * currently, 4 dwords, and appears to be aligned on this - * boundary as well so reading 4 dwords away should be flushing. - * - * NB: The surface for the serial # was allocated big enough to - * handle this so we would not have to worry about it here. - */ - retVal = bufAddr[0]; - retVal = bufAddr[0 + 4]; - retVal = bufAddr[0]; - } - break; - - case HWCEXT_FIFO_INVALID: - default: - GDBG_ERROR(FN_NAME, "Invalid fifoType"); - break; - } - - return retVal; -#undef FN_NAME -} /* hwcExecuteStatusWinFifo */ - -#endif /* HWC_ACCESS_DDRAW */ - -#ifdef HWC_ACCESS_GDX - -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* bInfo, - FxU32 *sfc, - hwcSurfaceInfo *ret) -{ - CntrlParam paramBlock; - OSErr myErr; - GDXSurfaceDesc_t desc; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxGetDeviceConfig; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - if(myErr != noErr) - return FXFALSE; - - ret->tileBase = control.res.optData.deviceConfigRes.tileMark; - ret->lpLFB = control.res.optData.deviceConfigRes.lfbBase; - ret->pciStride = control.res.optData.deviceConfigRes.pciStride; - ret->hwStride = control.res.optData.deviceConfigRes.hwStride; - - gdxSurfaceGetDesc(sfc, &desc); - - ret->lpSurface = desc.surface; - ret->width = desc.width; - ret->height = desc.height; - ret->depth = desc.bytesPerPixel; - ret->fbStride = desc.pitch; - ret->fbOffset = ret->lpSurface - ret->lpLFB; - ret->isTiled = (ret->fbOffset >= ret->tileBase) ? FXTRUE : FXFALSE; - - return FXTRUE; -} /* hwcGetSurfaceInfo */ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxAllocWinContext; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - if (myErr == noErr) { - setLfbSwizzleMode(bInfo->regInfo.rawLfbBase,bInfo->regInfo.ioMemBase,control.res.optData.allocContextRes.depthMode); - return control.res.optData.allocContextRes.contextID; - } - return 0; -} - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxReleaseWinContext; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - control.req.contextID = winContextId; - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - return myErr == noErr ? FXTRUE : FXFALSE; -} - -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface) -{ -#define FN_NAME "hwcAllocWinFifo" - FxBool - retVal = FXFALSE; - - /* Set undefined fifo type to start, and always clear the serial - * number for this context. - */ - fifo->fifoType = 0xFFFFFFFFUL; - - /* Check to see that we have valid surface owner to hang - * the command fifo surface off of. - */ - retVal = (surface != NULL); - if (retVal) { - GDHandle gDevice; - GDXSurface_t - *objSentinal = NULL, - *objFifo = NULL; - GDXSurfaceDesc_t - fifoDesc, - sentinalDesc, - surfaceDesc; - - /* Get the graphics devices for the surface so we can allocate new - * surfaces on the same device. */ - - gdxSurfaceGetDesc(surface, &surfaceDesc); - - gDevice = surfaceDesc.owner; - - memset(&fifoDesc, 0, sizeof(fifoDesc)); - - /* Allocate a sentinal surface so that the client can 'know' when - * a given fifo segment has actually been executed by reading a - * client specified serial # out of the buffer. This only needs to - * be big enough to hold the size of a serial #, but we need to - * work around some sort of whacked agp bug when reading back. See - * hwcExecuteStatusWinFifo() for details. - */ - sentinalDesc = fifoDesc; - - sentinalDesc.height = 4; - sentinalDesc.width = 4; - sentinalDesc.bytesPerPixel = 4; - - objSentinal = gdxSurfaceAlloc(gDevice, &sentinalDesc); - - if (!objSentinal) { - GDBG_INFO(80, "%s: Could not allocate surface for serial #'s.\n", FN_NAME); - retVal = FXFALSE; - goto __errSurfaceFifo; - } - - /* Assume for now that 2D command fifo is in local framebuffer space */ - - /* Make pitch and width the same so that indexing is easy. - * Setup the allocation in hw page unit sizes. (4k bytes) - */ - fifoDesc.pitch = 0x1000UL; - fifoDesc.width = (fifoDesc.pitch >> 2UL); - fifoDesc.bytesPerPixel = 4; - - /* Try to allocate a surface that contains some # of command - * stream buffers and one persistant state buffer. This is - * allocated in hw page units (4k) rather than the client - * allocation units, but that should be transparent since - * the client will just not use the extra slop. - */ -#define MAX(__a, __b) (((__a) > (__b)) ? (__a) : (__b)) - { - const FxU32 - allocFifo = MAX(fifo->cmdBuf.allocUnit, 0x1000UL), - allocState = MAX(fifo->stateBuf.allocUnit, 0x1000UL), - allocUnit = pow2Round(allocFifo + allocState + 0xFFFUL, 0x1000UL); - const char* - numAllocStr = GETENV("FX_WINFIFO_INIT_ALLOC"); - FxU32 - numAlloc = ((numAllocStr == NULL) - ? 0x8UL - : atoi(numAllocStr)); - - while(numAlloc > 0) { - fifoDesc.height = (allocUnit * numAlloc) / fifoDesc.pitch; - /* objFifo = NULL; */ - objFifo = gdxSurfaceAlloc(gDevice,&fifoDesc); - if(objFifo) - break; - - /* Try a smaller allocation */ - numAlloc--; - } - if(!objFifo) { - GDBG_INFO(80, "%s: Could not get cmdFifo GDX Surface.\n", - FN_NAME); - retVal = FXFALSE; - goto __errSurfaceFifo; - } - - /* Its now safe to overwrite the client allocUnit's to the - * rounded allocation units because we've finally done all of - * the stuff that could fail. - */ - fifo->cmdBuf.size = allocFifo * numAlloc; - fifo->cmdBuf.allocUnit = allocFifo; - - fifo->stateBuf.size = allocState * numAlloc; - fifo->stateBuf.allocUnit = allocState; - } -#undef MAX - - retVal = FXTRUE; - /* Fill in some more of the return buffer info, but were not quite - * done and ready to declare success until we lock the fifo down. - */ - fifo->fifoType = HWCEXT_FIFO_FB; - - fifo->surfaceFifo = (FxU32*)objFifo; - fifo->surfaceSentinal = (FxU32*)objSentinal; - - /* Do the lock so that we can write the sentinal, but the - * client is responsible for locking before use. - */ - if (hwcLockWinFifo(bInfo, fifo)) { - /* Write bogus serial # */ - *(volatile FxU32*)fifo->sentinalBufferAddr = 0x0UL; - - hwcUnlockWinFifo(bInfo, fifo); - } - - __errSurfaceFifo: - /* Free our directdraw objects if something bad happened. */ - if (!retVal) { - if (objSentinal != NULL) gdxSurfaceFree(objSentinal); - if (objFifo != NULL) gdxSurfaceFree(objFifo); - } - } - - /* Could not allocate directly accessible fifo so setup the host - * memory backed fifo which will get dumped at execute time. - */ - if (!retVal) { - fifo->fifoType = HWCEXT_FIFO_HOST; - - fifo->cmdBuf.hwOffset = 0x00UL; - fifo->cmdBuf.size = fifo->cmdBuf.allocUnit; - fifo->stateBuf.hwOffset = 0x00UL; - fifo->stateBuf.size = fifo->stateBuf.allocUnit; - - /* This can never fail since the client is responsible for - * allocating this memory. - */ - retVal = FXTRUE; - } - - return retVal; -#undef FN_NAME -} - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcLockWinFifo" - FxBool - retVal = FXFALSE; - - if (fifo->fifoType == HWCEXT_FIFO_HOST) { - retVal = FXTRUE; - } else if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - - GDXSurfaceDesc_t - fifoDesc, - sentinalDesc; - - if (fifo->lockCount > 0) goto __alreadyLocked; - if ((fifo->surfaceFifo == NULL) || - (fifo->surfaceSentinal == NULL)) goto __errFifoLock; - - /* Get base pointer to the fifo surfaces. - */ - - gdxSurfaceGetDesc(fifo->surfaceFifo,&fifoDesc); - gdxSurfaceGetDesc(fifo->surfaceSentinal,&sentinalDesc); - - /* Since there's no remapping crap in MacOS, this is easy. */ - fifo->cmdBuf.baseAddr = fifoDesc.surface; - fifo->stateBuf.baseAddr = fifo->cmdBuf.baseAddr + fifo->cmdBuf.size; - fifo->sentinalBufferAddr = sentinalDesc.surface; - - /* Compute hardware offsets as well */ - fifo->cmdBuf.hwOffset = fifo->cmdBuf.baseAddr - bInfo->regInfo.rawLfbBase; - fifo->stateBuf.hwOffset = fifo->stateBuf.baseAddr - bInfo->regInfo.rawLfbBase; - fifo->sentinalBufferOffset = fifo->sentinalBufferAddr - bInfo->regInfo.rawLfbBase; - - __alreadyLocked: - /* Finally, declare success */ - retVal = FXTRUE; - - __errFifoLock: - ; - } - - if (retVal) fifo->lockCount++; - - return retVal; -#undef FN_NAME -} - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo) -{ -#define FN_NAME "hwcUnlockWinFifo" - FxBool - retVal = ((fifo->lockCount > 0) && - ((fifo->fifoType == HWCEXT_FIFO_HOST) || - (fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP))); - - if (retVal) { - fifo->lockCount--; - - if (fifo->lockCount == 0) { - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - /* Don't currently do anything since surfaces don't get moved - * around yet on MacOS. - */ - } - } - } - - return retVal; -#undef FN_NAME -} - -FxBool -hwcFreeWinFifo( hwcBoardInfo* bInfo, - HwcWinFifo* fifo ) -{ -#define FN_NAME "hwcFreeWinFifo" - - /* What type of fifo do we have? */ - if ((fifo->fifoType == HWCEXT_FIFO_FB) || - (fifo->fifoType == HWCEXT_FIFO_AGP)) { - if (fifo->surfaceFifo != NULL) { - gdxSurfaceFree(fifo->surfaceFifo); - - fifo->surfaceFifo = NULL; - fifo->cmdBuf.baseAddr = - fifo->cmdBuf.hwOffset = - fifo->cmdBuf.size = - fifo->stateBuf.baseAddr = - fifo->stateBuf.hwOffset = 0x00UL; - } - - if (fifo->surfaceSentinal != NULL) { - gdxSurfaceFree(fifo->surfaceSentinal); - - fifo->surfaceSentinal = NULL; - fifo->sentinalBufferAddr = - fifo->sentinalBufferOffset = 0x00UL; - } - } - - fifo->fifoType = HWCEXT_FIFO_INVALID; - - return FXTRUE; -#undef FN_NAME -} - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ - CntrlParam paramBlock; - OSErr myErr; - hwcControl_t control; - - memset( &control, 0, sizeof( control ) ); - - /* HLock((Handle)bInfo->hMon); */ - paramBlock.ioCRefNum = (*((GDHandle)bInfo->hMon))->gdRefNum; - /* HUnlock((Handle)bInfo->hMon); */ - - paramBlock.csCode = k3DfxExecuteFifo; /* driver-specific status request */ - *(hwcControl_t **)(¶mBlock.csParam[0]) = &control; - - control.req.contextID = winContextId; - control.req.optData.executeFifoReq.fifoType = fifo->fifoType; - control.req.optData.executeFifoReq.fifoPtr = fifo->cmdBuf.baseAddr; - control.req.optData.executeFifoReq.fifoSize = fifo->cmdBuf.size >> 2UL; - control.req.optData.executeFifoReq.statePtr = fifo->stateBuf.baseAddr; - control.req.optData.executeFifoReq.stateSize = fifo->stateBuf.size >> 2UL; - control.req.optData.executeFifoReq.serialNumber = serialNumber; - - if (fifo->fifoType != HWCEXT_FIFO_HOST) { - control.req.optData.executeFifoReq.fifoOffset = fifo->cmdBuf.hwOffset; - control.req.optData.executeFifoReq.stateOffset = fifo->stateBuf.hwOffset; - control.req.optData.executeFifoReq.sentinalOffset = fifo->sentinalBufferOffset; - } - - myErr = PBControl((ParmBlkPtr)¶mBlock, false); - - return myErr == noErr ? FXTRUE : FXFALSE; -} - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber) -{ -#define FN_NAME "hwcExecuteStatusWinFifo" - FxU32 - retVal = ~0x00UL; - - switch(fifo->fifoType) { - /* Host fifo always executes synchronously */ - case HWCEXT_FIFO_HOST: - retVal = serialNumber; - break; - - case HWCEXT_FIFO_FB: - case HWCEXT_FIFO_AGP: - { - volatile FxU32* - bufAddr = (volatile FxU32*)fifo->sentinalBufferAddr; - - /* We need to do some extra reads here so that we make sure taht - * the data we're returning is coherent w/ the actual frame - * buffer due to the intervening pixel cache. The cache is, - * currently, 4 dwords, and appears to be aligned on this - * boundary as well so reading 4 dwords away should be flushing. - * - * NB: The surface for the serial # was allocated big enough to - * handle this so we would not have to worry about it here. */ - retVal = (bufAddr[0]); - retVal = (bufAddr[0 + 4]); - retVal = (bufAddr[0]); - } - break; - - case HWCEXT_FIFO_INVALID: - default: - GDBG_ERROR(FN_NAME, "Invalid fifoType"); - break; - } - - return retVal; -#undef FN_NAME -} - -/* #define LINEAR_STRIDE_ALIGN 16UL */ -/* #define TILE_BIT 0x00008000UL */ - -#endif /* HWC_ACCESS_GDX */ - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo *vidTiming, - FxBool overlay) -{ -#define FN_NAME "hwcInitVideo" - FxU32 pixFmt = SST_OVERLAY_PIXEL_RGB565U; - FxU32 - stride= (tiled) ? bInfo->buffInfo.bufStrideInTiles : bInfo->vidInfo.stride; - FxU32 - scrWidth, scrHeight, - ovlWidth, ovlHeight, - vidProcCfg, vidScreenSize, vidOverlayEndScreenCoord, - vidOverlayDudx, vidOverlayDvdy, - dramInit1; - - FxBool - lfbMemoryConfig, - miscInit0; - - float - scale; - - -#ifdef HWC_EXT_INIT - hwcExtRequest_t - ctxReq; - hwcExtResult_t - ctxRes; -#endif - - { - FxU32 refresh; - static FxU32 refConstToRefreshHz[] = { - 60, /* GR_REFRESH_60Hz */ - 70, /* GR_REFRESH_70Hz */ - 72, /* GR_REFRESH_72Hz */ - 75, /* GR_REFRESH_75Hz */ - 80, /* GR_REFRESH_80Hz */ - 90, /* GR_REFRESH_90Hz */ - 100, /* GR_REFRESH_100Hz */ - 85, /* GR_REFRESH_85Hz */ - 120, /* GR_REFRESH_120Hz */ - 0 - }; - - if (bInfo->vidInfo.vRefresh > GR_REFRESH_120Hz) - refresh = 0; - else - refresh = bInfo->vidInfo.vRefresh; - - if ( !setVideoMode( (void*)bInfo->vidInfo.hWnd, - bInfo->vidInfo.xRes, - bInfo->vidInfo.yRes, - refConstToRefreshHz[refresh], /* Make sure we use the table, otherwise - we will always pass 0Hz to setVideoMode */ - bInfo->hMon ) ) { - GDBG_INFO(80, "%s: dxOpen() failed!\n", FN_NAME); - return FXFALSE; - } - } - -#ifdef HWC_EXT_INIT - ctxReq.which = HWCEXT_HWCSETEXCLUSIVE; - ctxReq.optData.linearAddrReq.devNum = 0; - - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_HWCSETEXCLUSIVE\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(ctxReq), (void *) &ctxReq, - sizeof(ctxRes), (void *) &ctxRes); - - if (ctxRes.resStatus != 1) { - strcpy(errorString, "HWCEXT_HWCSETEXCLUSIVE Failed"); - return FXFALSE; - } -#else - /* This is off for now until the rest of the alt-tab type things are done. */ -#if 0 - /* Before letting glide party on the hw check to see if we're on a - * system w/ a 2d environment, and make sure taht its happy about us - * doing this before dorking w/ things that are going to make it - * unhappy. - */ - if (Dpmi2DEnvironmentP()) { - bInfo->hdc = DpmiDeviceContextGet("3DFXVB"); - if (bInfo->hdc == 0x00UL) return FXFALSE; - - if (!DpmiDeviceContextDispatch(bInfo->hdc, FxDCIsFullscreenP)) return FXFALSE; - if (!DpmiDeviceContextDispatch(bInfo->hdc, FxDCExclusiveLock)) return FXFALSE; - } -#endif -#endif - - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudxOffsetSrcWidth, - ((bInfo->vidInfo.xRes << 1) << 19)); - - /* Video pixel buffer threshold */ - { - FxU32 vidPixelBufThold; - FxU32 thold = 32; - - if (getenv("SSTVB_PIXTHOLD")) { - thold = atoi(getenv("SSTVB_PIXTHOLD")); - } - - thold &= 0x3f; - - vidPixelBufThold = (thold | (thold << 6) | (thold << 12)); - - HWC_IO_STORE(bInfo->regInfo, vidPixelBufThold, vidPixelBufThold); - } - -#ifdef __WIN32__ - if (vidTiming) { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_VIDTIMING; - req.optData.vidTimingReq.vidTiming = (void *) vidTiming; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_VIDTIMING\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - /* Ignore failure */ - - } -#endif - -#ifdef __DOS32__ - /* Now call the cinit code */ - - h3InitVideoOverlaySurface( - bInfo->regInfo.ioPortBase, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - FXTRUE, /* tiled */ - pixFmt, /* pixel format of OS */ - FXTRUE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, - (bInfo->vidInfo.yRes << SST_OVERLAY_Y_SHIFT) | - (bInfo->vidInfo.xRes & SST_OVERLAY_X) ); -#else - hwcInitVideoOverlaySurface( - &bInfo->regInfo, - FXTRUE, /* 1=enable Overlay surface (OS), 1=disable */ - FXFALSE, /* 1=enable OS stereo, 0=disable */ - FXFALSE, /* 1=enable horizontal scaling, 0=disable */ - 0, /* horizontal scale factor (ignored if not) */ - FXFALSE, /* 1=enable vertical scaling, 0=disable */ - 0, /* vertical scale factor (ignored if not) */ - 0, /* Filter mode */ - FXTRUE, /* tiled */ - pixFmt, /* pixel format of OS */ - FXFALSE, /* bypass clut for OS? */ - 0, /* 0=lower 256 CLUT entries, 1=upper 256 */ - bInfo->buffInfo.colBuffStart[0],/* board address of beginning of OS */ - stride); /* distance between scanlines of the OS, in - units of bytes for linear OS's and tiles for - tiled OS's */ - HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0); - -#endif - - /* - Setup video scaling for half-modes - */ - - /* Get some important info */ - HWC_IO_LOAD(bInfo->regInfo, vidScreenSize, vidScreenSize); - HWC_IO_LOAD(bInfo->regInfo, vidProcCfg, vidProcCfg); - HWC_IO_LOAD(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff; - scrHeight = (vidScreenSize >> SST_VIDEO_SCREEN_HEIGHT_SHIFT) & 0xfff; - - ovlWidth = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_X_SHIFT) & 0xfff; - ovlHeight = ((vidOverlayEndScreenCoord) >> SST_OVERLAY_Y_SHIFT) & 0xfff; - - ovlWidth += 1; - ovlHeight += 1; - - /* Check to see if the screen and overlay dimensions match. - * There are two cases that can happen in reality. - * - * scrXXX > appXXX: This is a 'real' case, and the overlay dimension - * needs to mag scaled so that it fits the requested size. - * - * (scrXXX == appXXX) && (ovlXXX != scrXXX): This is a somewhat artificial - * case where someone left the overlay set to some value, and these did - * not get reset in the setVideoMode processing. (For example, if the user is - * running an application which bus masters data directly to our video overlay - * when launching a glide application). In this case we need to fiddle w/ the - * overlay dimension so that it matches the requested resolution. - * - * (scrXXX < appXXX): If setVideoMode is actually working correctly, this cannot - * happen because that code has to know that we can't do min scaling. - */ - - if (scrWidth > bInfo->vidInfo.xRes) { - vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN; - - ovlWidth = scrWidth; - - scale = ((float) bInfo->vidInfo.xRes) / ((float) ovlWidth); - - vidOverlayDudx = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDudx, vidOverlayDudx); - } else if (ovlWidth != scrWidth) { - ovlWidth = scrWidth; - } - - if (scrHeight > bInfo->vidInfo.yRes) { - vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN; - - ovlHeight = scrHeight; - - scale = ((float) bInfo->vidInfo.yRes) / ((float) ovlHeight); - - vidOverlayDvdy = (FxU32) (scale * ((float) (1 << 20))); - HWC_IO_STORE(bInfo->regInfo, vidOverlayDvdy, vidOverlayDvdy); - } else if (ovlHeight != scrHeight) { - ovlHeight = scrHeight; - } - - vidOverlayEndScreenCoord = (((ovlHeight - 1) << SST_OVERLAY_Y_SHIFT) | - ((ovlWidth - 1) << SST_OVERLAY_X_SHIFT)); - HWC_IO_STORE(bInfo->regInfo, vidOverlayEndScreenCoord, vidOverlayEndScreenCoord); - - vidProcCfg &= ~SST_OVERLAY_FILTER_MODE; - if (GETENV("SSTH3_OVERLAY_FILTER_2x2")) { - if (!(vidProcCfg & SST_VIDEO_2X_MODE_EN)) - vidProcCfg |= SST_OVERLAY_FILTER_2X2; - } else { - vidProcCfg |= SST_OVERLAY_FILTER_4X4; - } - - HWC_IO_STORE(bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Get miscInit0 for y-sub */ - HWC_IO_LOAD(bInfo->regInfo, miscInit0, miscInit0); - - /* Clear out relavent bits */ - miscInit0 &= ~SST_YORIGIN_TOP; - miscInit0 |= ((bInfo->vidInfo.yRes - 1) << SST_YORIGIN_TOP_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, miscInit0, miscInit0); - - /* Set up lfbMemoryConfig */ - lfbMemoryConfig = - (bInfo->fbOffset >> 12) | - SST_RAW_LFB_ADDR_STRIDE_4K | - (bInfo->buffInfo.bufStrideInTiles << SST_RAW_LFB_TILE_STRIDE_SHIFT); - - HWC_IO_STORE(bInfo->regInfo, lfbMemoryConfig, lfbMemoryConfig); - - /* Filthy memclock hack */ - if (getenv("H3_MEM_CLOCK")) { - int mHz; - FxU32 pllVal; - mHz = atoi(getenv("H3_MEM_CLOCK")); - - switch (mHz) { - case 50: - pllVal = 0x2806; - break; - - case 75: - pllVal = 0x7125; - break; - - case 80: - pllVal = 0x7925; - break; - - case 100: - pllVal = 0x2805; - break; - - default: - pllVal = 0; - gdbg_printf("%s: Bogus MEMCLOCK setting!\n", FN_NAME); - break; - } - - if (pllVal) { - HWC_IO_STORE(bInfo->regInfo, pllCtrl1, pllVal); - HWC_IO_STORE(bInfo->regInfo, pllCtrl2, pllVal); - gdbg_printf("%s: Setting memory clock to %d MHz\n", FN_NAME, - mHz); - } - - } - - /* Set up dramInit1 for triple or double buffering */ - HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); - if (bInfo->vidInfo.tripleBuffering) - dramInit1 |= SST_TRIPLE_BUFFER_EN; - else - dramInit1 &= ~SST_TRIPLE_BUFFER_EN; - - HWC_IO_STORE(bInfo->regInfo, dramInit1, dramInit1); - - HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, 0x100810); - - HWC_IO_STORE( bInfo->regInfo, vidDesktopOverlayStride, - ( bInfo->buffInfo.bufStrideInTiles << 16 ) | - bInfo->buffInfo.bufStrideInTiles ); - - return FXTRUE; - -#undef FN_NAME -} /* hwcInitVideo */ - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo) -{ -#define FN_NAME "hwcRestoreVideo" - FxU32 depth; - - /* Disable FIFO */ - do { - HWC_CAGP_LOAD(bInfo->regInfo, cmdFifo0.depth, depth); - } while (depth); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - -#ifdef HWC_ACCESS_DDRAW - - { - hwcExtRequest_t req; - hwcExtResult_t res; - - req.which = HWCEXT_HWCRLSEXCLUSIVE; - req.optData.linearAddrReq.devNum = 0; - GDBG_INFO(90, FN_NAME ": ExtEscape:HWCEXT_HWCRLSEXCLUSIVE\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - GDBG_INFO(80, "%s: sizeof(res) = %d\n", FN_NAME, sizeof(res)); - GDBG_INFO(80, "%s: res.resStatus = %d\n", FN_NAME, res.resStatus); - GDBG_INFO(80, "%s: &res = 0x%x\n", FN_NAME, &res); - - if (res.resStatus != 1) { - strcpy(errorString, "HWCEXT_HWCRLSEXCLUSIVE Failed"); - return FXFALSE; - } - - req.which = HWCEXT_RELEASECONTEXT; - req.optData.releaseContextReq.contextID = bInfo->extContextID; - GDBG_INFO(90, FN_NAME ": ExtEscape:HWCEXT_RELEASECONTEXT\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - } - -#ifdef HWC_EXT_INIT - - -#endif -#endif - -#ifndef HWC_EXT_INIT - /* This is off for now until the rest of the alt-tab stuff is done */ -#if 0 - /* Release our exclusive hw lock */ - DpmiDeviceContextDispatch(bInfo->hdc, FxDCUnlock); -#endif -#endif /* HWC_EXT_INIT */ - - /* Restore display */ - resetVideo(); - - return FXTRUE; -#undef FN_NAME -} /* hwcRestoreVideo */ - -char * -hwcGetErrorString() -{ -#define FN_NAME "hwcGetErrorString" - return errorString; -#undef FN_NAME -} /* hwcGetErrorString */ - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled) -{ -#define FN_NAME "hwcCheckMemSize" - FxU32 - bufSize, totSize; - - bufSize = calcBufferSize(xres, yres, tiled); - - totSize = (nColBuffers + nAuxBuffers) * bufSize; - - if (totSize < ((bInfo->h3Mem << 20) - bInfo->min_tramSize)) /* Need 2M for texture */ - return FXTRUE; - else - return FXFALSE; -#undef FN_NAME -} /* hwcCheckMemSize */ - -static FxU32 -calcBufferStride(FxU32 xres, FxBool tiled) -{ - FxU32 - strideInTiles; - - if (tiled == FXTRUE) { - /* Calculate tile width stuff */ - strideInTiles = (xres << 1) >> 7; - if ((xres << 1) & (HWC_TILE_WIDTH - 1)) - strideInTiles++; - - return (strideInTiles * HWC_TILE_WIDTH); - - } else { - return (xres << 1); - } -} /* calcBufferStride */ - -static FxU32 -calcBufferHeightInTiles(FxU32 yres) -{ - FxU32 - heightInTiles; /* Height of buffer in tiles */ - - - /* Calculate tile height stuff */ - heightInTiles = yres >> 5; - - if (yres & (HWC_TILE_HEIGHT - 1)) - heightInTiles++; - - return heightInTiles; - -} /* calcBufferHeightInTiles */ - -static FxU32 -calcBufferSizeInTiles(FxU32 xres, FxU32 yres) { - FxU32 - bufSizeInTiles; /* Size of buffer in tiles */ - - bufSizeInTiles = - calcBufferHeightInTiles(yres) * (calcBufferStride(xres, FXTRUE) >> 7); - - return bufSizeInTiles; - -} /* calcBufferSizeInTiles */ - -static FxU32 -calcBufferSize(FxU32 xres, FxU32 yres, FxBool tiled) -{ - FxU32 - stride, - height, - bufSize; /* Size of buffer in bytes */ - - if (tiled) { - stride = calcBufferStride(xres, tiled); - height = HWC_TILE_HEIGHT * calcBufferHeightInTiles(yres); - } else { - stride = xres << 1; - height = yres; - } - - bufSize = stride * height; - - return bufSize; - -} /* calcBufferSize */ - -/* How the hw treats lfb accesses are dependent on the 'type' of - * memory (tiled/linear) that the color/aux buffers are in. We - * pre-compute the actual lfb address here while we know about the - * memory space and if we adjusted the page alignment above. - * - * NB: If we are in tiled mode then the fact that we align the color - * buffers on page boundaries means that the y offset of the buffers - * may not actually be on a boundary for the tile addressing scheme. - * The 'rounding' done to HWC_TILED_BUFFER_Y_ALIGN adjust for this. - * - * NB: The memory optimization of aligning color buffers on even page - * boundaries will cause the tiled lfb access to be off by a page so - * we add in the width of a page (HWC_TILED_BUFFER_X_ADJUST) here. - */ -#define HWC_TILED_BUFFER_BYTES 0x1000UL /* 128 Bytes x 32 lines */ -#define HWC_TILED_BUFFER_Y_ALIGN 0x20000UL -#define HWC_TILED_BUFFER_X_ADJUST 0x80UL - -static FxU32 -hwcBufferLfbAddr(FxU32 bufNum, - const hwcBoardInfo* bInfo, - FxBool colBufAlignP) -{ - FxU32 retVal = 0x00UL; - - if (bInfo->vidInfo.tiled) { - retVal = (bInfo->fbOffset + - pow2Round(bufNum * bInfo->vidInfo.yRes * HWC_TILED_BUFFER_BYTES, - HWC_TILED_BUFFER_Y_ALIGN) + - colBufAlignP * HWC_TILED_BUFFER_X_ADJUST); - } else if (bufNum < bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.colBuffStart[bufNum]; - } else if (bufNum == bInfo->buffInfo.nColBuffers) { - retVal = bInfo->buffInfo.auxBuffStart; - } - - return retVal; -} - -static FxU32 -pow2Round(FxU32 val, FxU32 pow2Const) -{ - const FxU32 pow2Mask = (pow2Const - 1UL); - - return ((val + pow2Mask) & ~pow2Mask); -} - -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting) -{ -#define FN_NAME "hwcInitAGPFifo" -#if HWC_EXT_INIT - FxU32 - agpSize, agpLAddr, agpPAddr; - FxU32 - cagpRegs; /* pointer to Cmd/AGP regs */ - hwcExtRequest_t req; - hwcExtResult_t res; - - - if (bInfo->regInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcMapBoard\n", FN_NAME); - return FXFALSE; - } - cagpRegs = bInfo->regInfo.cmdAGPBase; - - if (bInfo->buffInfo.initialized == FXFALSE) { - sprintf(errorString, "%s: Called before hwcInitBuffers\n", FN_NAME); - return FXFALSE; - } - - req.which = HWCEXT_GETAGPINFO; - - GDBG_INFO(80, FN_NAME ": ExtEscape:HWCEXT_GETAGPINFO\n"); - ExtEscape((HDC) bInfo->hdc, EXT_HWC, sizeof(req), (void *) &req, - sizeof(res), (void *) &res); - - /* If we fail, bail and go to memory fifo */ - if (res.resStatus != 1) { - return hwcInitFifo(bInfo, enableHoleCounting); - } - - agpLAddr = res.optData.agpInfoRes.lAddr; - agpPAddr = res.optData.agpInfoRes.pAddr; - agpSize = res.optData.agpInfoRes.size; - - /* disable the CMD fifo */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, 0); - - bInfo->fifoInfo.agpFifo = 1; - bInfo->fifoInfo.agpVirtAddr = agpLAddr; - bInfo->fifoInfo.agpPhysAddr = agpPAddr; - bInfo->fifoInfo.fifoStart = agpPAddr; - bInfo->fifoInfo.agpSize = agpSize; - - GDBG_INFO(80, "%s AGP linear address = 0x%x\n", FN_NAME, agpLAddr); - GDBG_INFO(80, "%s AGP physical address = 0x%x\n", FN_NAME, agpPAddr); - GDBG_INFO(80, "%s AGP Size = 0x%x\n", FN_NAME, agpSize); - -#if 0 - From Windows code: - - SETDW(_FF(lpCRegs)->cmdFifo0.baseSize, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.baseAddrL, - (_FF(agpPhysAddr) >> 12) ); - SETDW(_FF(lpCRegs)->cmdFifo0.readPtrL, _FF(agpPhysAddr) ); - SETDW(_FF(lpCRegs)->cmdFifo0.readPtrH, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.aMin, _FF(agpPhysAddr) - 4); - SETDW(_FF(lpCRegs)->cmdFifo0.aMax, _FF(agpPhysAddr) - 4); - SETDW(_FF(lpCRegs)->cmdFifo0.depth, 0); - SETDW(_FF(lpCRegs)->cmdFifo0.holeCount, 0); - SETDW(_FF(lpCRegs)->cmdFifoThresh, 0x122); - SETDW(_FF(lpCRegs)->cmdFifo0.baseSize, 0x700); -#endif - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseAddrL, - bInfo->fifoInfo.fifoStart>>12); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrL, bInfo->fifoInfo.fifoStart); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.readPtrH, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMin, bInfo->fifoInfo.fifoStart-4); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.aMax, bInfo->fifoInfo.fifoStart-4); - - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.depth, 0); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.holeCount, 0); - /* Fifo LWM /HWM/ THRESHOLD */ - HWC_CAGP_STORE(bInfo->regInfo, cmdFifoThresh, (0x09 << SST_HIGHWATER_SHIFT) | 0x2); - HWC_CAGP_STORE(bInfo->regInfo, cmdFifo0.baseSize, - ((bInfo->fifoInfo.fifoLength >> 12) - 1) | SST_EN_CMDFIFO | - SST_CMDFIFO_DISABLE_HOLES | SST_CMDFIFO_AGP); - - GDBG_INFO(2,"%s: CMD FIFO placed at physical addr 0x%x\n", FN_NAME, - bInfo->fifoInfo.fifoStart); - - return FXTRUE; -#else /* !HWC_EXT_INIT */ - return hwcInitFifo(bInfo, enableHoleCounting); -#endif /* !HWC_EXT_INIT */ -#undef FN_NAME -} /* hwcInitAGPFifo */ - - -FxBool -hwcAllocAuxRenderingBuffer(hwcBoardInfo *bInfo, hwcBufferDesc *bp, int width, - int height) -{ -#define FN_NAME "hwcAllocAuxRenderingBuffer" - /* For now, these buffers */ - FxBool - rVal = FXFALSE; - - FxU32 - bufSize, - offset; - - bufSize = (width * height) << 2; - - offset = bInfo->fbOffset - bufSize; - - if ((offset - bInfo->tramSize) < bInfo->min_tramSize) { - sprintf(errorString, "%s: Insufficient memory", FN_NAME); - } else { - bp->bufOffset = offset; - bp->bufStride = width << 2; /* Below tiled memory for now */ - bp->bufBPP = 16; - bp->tiled = 0; - bp->bufType = HWC_BUFFER_AUXRENDER; - - bInfo->fbOffset -= bufSize; - - rVal = FXTRUE; - } - - return rVal; - -#undef FN_NAME -} /* hwcAllocAuxRenderingBuffer */ - -#define RED_SHIFT 16 -#define GREEN_SHIFT 8 -#define BLUE_SHIFT 0 - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b) -{ -#define FN_NAME "hwcGammaTable" - FxU32 gRamp[256]; - FxU32 i; - FxU32 vidProcCfg; - FxU32 dacBase; - - /* Load the table into the Display driver as above */ - for (i = 0; i < nEntries; i++) { - gRamp[i] = - ((r[i] & 0xff) << RED_SHIFT) | - ((g[i] & 0xff) << GREEN_SHIFT) | - ((b[i] & 0xff) << BLUE_SHIFT); - } - - /* - ** On W9X/DOS, we can do this ourselves--which is much easier than - ** mucking about with a bunch of 32-bit data in 16-bit driver - ** code. - */ - HWC_IO_LOAD( bInfo->regInfo, vidProcCfg, vidProcCfg); - - /* Determin which set of CLUT entries are selected */ - if (vidProcCfg & SST_OVERLAY_CLUT_SELECT) - dacBase = 256; - else - dacBase = 0; - - /* Print out some useful info RE the vidProcCfg register */ - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_SELECT) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_SELECT) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_EN) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_EN) ? 1 : 0); - GDBG_INFO(80, "%s: vidProcCFG(SST_OVERLAY_CLUT_BYPASS) = %d\n", - FN_NAME, (vidProcCfg & SST_OVERLAY_CLUT_BYPASS) ? 1 : 0); - - for (i = 0; i < nEntries; i++) { - HWC_IO_STORE( bInfo->regInfo, dacAddr, dacBase + i); - P6FENCE; - HWC_IO_STORE( bInfo->regInfo, dacData, gRamp[i]); - P6FENCE; - } - - return FXTRUE; - -#undef FN_NAME -} /* hwcGammaTable */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float gammaR, float gammaG, float gammaB) -{ -#define FN_NAME "hwcGammaRGB" - FxU32 - grRamp[256], ggRamp[256], gbRamp[256]; - int - i; - - GDBG_INFO(80, FN_NAME "(0x%x, %1.2f, %1.2f, %1.2f)\n", - bInfo, gammaR, gammaG, gammaB); - - /* - ** NB: The system eventually devised by Bob and Ken *may* require - ** separate R, G, and B vectors. - */ - - for (i = 0; i < 256; i++) { - grRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaR)) * 255.0F + 0.5F); - ggRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaG)) * 255.0F + 0.5F); - gbRamp[i] = (FxU32)((pow(i/255.0F, 1.0F/gammaB)) * 255.0F + 0.5F); - } - - - hwcGammaTable(bInfo, 256, grRamp, ggRamp, gbRamp); - - /* - ** Now that we have a gamma table, we can give it to the driver via - ** a call to ExtEscape() when that is defined..... - */ - - return FXFALSE; - -#undef FN_NAME -} /* hwcGammaRGB */ - - -#define M 1 -#define K 1 - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetGrxClock" - FxU32 - pllCtrl1, - dramInit0 = 0xc17ae29, - dramInit1 = 0x26c031, - n, - m = 1; - - n = (FxU32) ((speedInMHz - 4.76f)/2.38f); - - pllCtrl1 = - (K << SST_PLL_K_SHIFT) | (m << SST_PLL_M_SHIFT) | (n << SST_PLL_N_SHIFT); - - GDBG_INFO(80, "%s: Setting Graphics Clock to %d\n", FN_NAME, speedInMHz); - - HWC_IO_STORE( bInfo->regInfo, dramInit0, dramInit0); - HWC_IO_STORE( bInfo->regInfo, dramInit1, dramInit1); - HWC_IO_STORE( bInfo->regInfo, pllCtrl1, pllCtrl1); - - return FXTRUE; - -#undef FN_NAME -} /* hwcSetGrxClock */ - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz) -{ -#define FN_NAME "hwcSetMemClock" - - return FXFALSE; -#undef FN_NAME -} /* hwcSetMemClock */ - - - -FxBool -hwcResolutionSupported(hwcBoardInfo *bInfo, GrScreenResolution_t res) -{ -#define FN_NAME "hwcResolutionSupported" - static char *resNames[] = { - "GR_RESOLUTION_320x200", - "GR_RESOLUTION_320x240", - "GR_RESOLUTION_400x256", - "GR_RESOLUTION_512x384", - "GR_RESOLUTION_640x200", - "GR_RESOLUTION_640x350", - "GR_RESOLUTION_640x400", - "GR_RESOLUTION_640x480", - "GR_RESOLUTION_800x600", - "GR_RESOLUTION_960x720", - "GR_RESOLUTION_856x480", - "GR_RESOLUTION_512x256", - "GR_RESOLUTION_1024x768", - "GR_RESOLUTION_1280x1024", - "GR_RESOLUTION_1600x1200", - "GR_RESOLUTION_400x300", - "GR_RESOLUTION_1152x864", - "GR_RESOLUTION_1280x960", - "GR_RESOLUTION_1600x1024", - "GR_RESOLUTION_1792x1344", - "GR_RESOLUTION_1856x1392", - "GR_RESOLUTION_1920x1440", - "GR_RESOLUTION_2048x1536", - "GR_RESOLUTION_2048x2048" - }; - - struct WidthHeight_s { - FxU32 width; - FxU32 height; - } whByRes[] = { - {320, 200}, /* GR_RESOLUTION_320x200 */ - {320, 240}, /* GR_RESOLUTION_320x240 */ - {400, 256}, /* GR_RESOLUTION_400x256 */ - {512, 384}, /* GR_RESOLUTION_512x384 */ - {640, 200}, /* GR_RESOLUTION_640x200 */ - {640, 350}, /* GR_RESOLUTION_640x350 */ - {640, 400}, /* GR_RESOLUTION_640x400 */ - {640, 480}, /* GR_RESOLUTION_640x480 */ - {800, 600}, /* GR_RESOLUTION_800x600 */ - {960, 720}, /* GR_RESOLUTION_960x720 */ - {856, 480}, /* GR_RESOLUTION_856x480 */ - {512, 256}, /* GR_RESOLUTION_512x256 */ - {1024, 768}, /* GR_RESOLUTION_1024x768 */ - {1280, 1024}, /* GR_RESOLUTION_1280x1024 */ - {1600, 1200}, /* GR_RESOLUTION_1600x1200 */ - {400, 300}, /* GR_RESOLUTION_400x300 */ - {1152, 864}, /* GR_RESOLUTION_1152x864 */ - {1280, 960}, /* GR_RESOLUTION_1280x960 */ - {1600, 1024}, /* GR_RESOLUTION_1600x1024 */ - {1792, 1344}, /* GR_RESOLUTION_1792x1344 */ - {1856, 1392}, /* GR_RESOLUTION_1856x1392 */ - {1920, 1440}, /* GR_RESOLUTION_1920x1440 */ - {2048, 1536}, /* GR_RESOLUTION_2048x1536 */ - {2048, 2048} /* GR_RESOLUTION_2048x2048 */ - }; - - - GDBG_INFO(80, FN_NAME ": res == %s (0x%x), supported == %s\n", - resNames[res], resolutionSupported[bInfo->boardNum][res], - resolutionSupported[bInfo->boardNum][res] ? "FXTRUE" : "FXFALSE"); - - - /* Glide has very good checking to see if the memory required is - available, so we'll just return whether the driver can do it. */ - return resolutionSupported[bInfo->boardNum][res]; - -#undef FN_NAME -} /* hwcResolutionSupported */ - -#ifdef __WIN32__ -static char * -getRegPath() -{ - char *retVal = NULL; - OSVERSIONINFO ovi; - - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - GDBG_INFO(80, "OS == WNT\n"); - /* It is hardcoded on NT via Display Control code. see: - * $/devel/swtools/bansheecp2 */ - retVal = "SYSTEM\\CurrentControlSet\\Services\\3Dfx\\Device0\\glide"; - } else { - QDEVNODE QDevNode; - QIN Qin; - int status; - - GDBG_INFO(80, "OS == W9X\n"); - - Qin.dwSubFunc = QUERYDEVNODE; - { - HDC curDC = GetDC(NULL); - - status = ExtEscape ( curDC, QUERYESCMODE, - sizeof(Qin), (LPCSTR)&Qin, - sizeof(QDevNode), (LPSTR)&QDevNode ); - ReleaseDC(NULL, curDC); - } - - if ( status > 0 ) { - static char regPath[255]; - - CM_Get_DevNode_Key( QDevNode.dwDevNode, NULL, - ®Path, sizeof(regPath), - CM_REGISTRY_SOFTWARE ); - strcat(regPath, "\\glide"); - - retVal = regPath; - } - } - - return retVal; -} /* getRegPath */ -#endif - - -char * -hwcGetenv(char *a) -{ -#if __WIN32__ - char *retVal = NULL; - static char *regPath; - HKEY hKey; - DWORD type, szData; - static char strval[255]; - - /* This should work for both NT and Win95/98 (getRegPath works) */ - if (retVal = getenv(a)) - return retVal; - - szData = sizeof(strval); - - if (regPath == NULL) { - regPath = getRegPath(); - - GDBG_INFO(80, "_grGetEnv: regPath = %s\n", regPath); - - if (regPath == NULL) - return NULL; - } - - if (RegOpenKey(HKEY_CURRENT_USER, regPath, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, a, NULL, &type, strval, &szData) == - ERROR_SUCCESS) { - if (type != REG_SZ) { - retVal = NULL; - } else { - retVal = strval; - } - } - RegCloseKey(hKey); - } - - if ((retVal == NULL) && RegOpenKey(HKEY_LOCAL_MACHINE, regPath, &hKey) == ERROR_SUCCESS) { - - if (RegQueryValueEx(hKey, a, NULL, &type, strval, &szData) == - ERROR_SUCCESS) { - if (type != REG_SZ) { - retVal = NULL; - } else { - retVal = strval; - } - } - RegCloseKey(hKey); - } - return (char*)retVal; -#else - return getenv(a); -#endif -} /* _grGetenv */ diff --git a/glide2x/h3/minihwc/minihwc.h b/glide2x/h3/minihwc/minihwc.h deleted file mode 100644 index edc3eb1..0000000 --- a/glide2x/h3/minihwc/minihwc.h +++ /dev/null @@ -1,553 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 38 3/17/99 4:09p Dow -** It's my sandbox -** -** 37 3/10/99 11:52a Peter -** initFifo enable hole counting parameter -** -** 36 3/09/99 12:20p Kcd -** Made ioPort variable 32-bit for PPC. -** -** 35 3/05/99 10:06p Peter -** allocate independent state buffers in parallel w/ the command buffers -** -** 34 2/02/99 4:37p Peter -** hwGetSurfaceinfo gets depth -** -** 33 1/04/99 11:58a Peter -** added windowed context support -** -** 32 12/23/98 12:38p Peter -** hdc cleanup -** -** 31 12/03/98 10:27p Dow -** Added stuff for hwcGetenv -** -** 30 12/02/98 9:35p Dow -** Query Resolutions -** -** 29 11/30/98 6:53p Peter -** video memory fifo's -** -** 28 11/18/98 8:03p Dow -** grxclk -** -** 27 11/10/98 6:29p Atai -** added min_tramSize for board information. min_tramSize = 0x200000 if -** device id is 3 or mem size is 4 -** -** 26 10/30/98 3:44p Dow -** Fixed Tiled/Linear color/aux bug -** -** 25 10/21/98 11:22a Peter -** dos happiness w/ the new chris pci library (nee tarolli) -** -** 24 10/14/98 3:37p Dow -** Gamma stuff -** -** 23 10/08/98 10:15a Dow -** Triple buffering fix -** -** 22 9/17/98 3:58p Dow -** Vidmode Stuff -** -** 21 8/02/98 5:00p Dow -** Glide Surface Extension -** -** 20 7/29/98 3:09p Dow -** SDRAM Fixes -** -** 19 7/24/98 2:02p Dow -** AGP Stuff -** -** 18 7/23/98 1:18a Dow -** Bump & Grind -** -** 17 7/18/98 12:21a Jdt -** Added state buffer -** -** 16 7/16/98 10:26p Dow -** GIW Stuf -** -** 15 7/16/98 3:05p Dow -** Removed useless colBufferAddr from surface info -** -** 14 7/15/98 4:09p Dow -** GIW Stuff & DOS Protection -** -** 13 7/13/98 10:35p Jdt -** Added hwcWinFifo, hwcAllocWinFifo, hwcexecuteWinFifo -** -** 12 7/02/98 12:11p Dow -** LFB fixes -** -** 11 6/16/98 6:11p Dow -** Rearranged texture memory -** -** 10 6/12/98 9:22a Peter -** lfb read for triple buffering -** -** 9 6/11/98 7:44p Jdt -** Win98/NT5 Multimon 1st pass -** -** 8 6/10/98 9:49a Peter -** lfb buffer addressing -** -** 7 5/08/98 10:58a Dow -** Volatile declarations -** -** 6 4/16/98 10:14p Dow -** EXT_HWC is default init method -** -** 5 4/07/98 10:40p Dow -** LFB Fixes -** -** 4 3/28/98 10:51a Dow -** Fixes for FIFO bug -** -** 3 3/20/98 1:11p Dow -** Now checking revision of chip -** -** 2 3/11/98 8:27p Dow -** WinGlide -** -** 1 3/04/98 4:13p Dow -** -*/ -#ifndef MINIHWC_H -#define MINIHWC_H - -#ifdef HWC_EXT_INIT -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include <3dfx.h> -#include -#include - -/* -** Constants -*/ -#define HWC_MAX_BOARDS 4 /* Max # boards we can handle */ -#define HWC_NUM_BASE_ADDR 4 /* Max # base addresses - * - * 0-1 : Memory mapped registers - * 2 : i/o port - * 3 : rom (bios) - */ - -#define HWC_TILE_WIDTH_SHIFT SST_TILE_WIDTH_BITS -#define HWC_TILE_WIDTH (0x01UL << HWC_TILE_WIDTH_SHIFT) - -#define HWC_TILE_HEIGHT_SHIFT SST_TILE_HEIGHT_BITS -#define HWC_TILE_HEIGHT (0x01UL << HWC_TILE_HEIGHT_SHIFT) - -typedef FxU32 hwcBuffer; -#define HWC_BUFFER_FRONTBUFFER 0x0 -#define HWC_BUFFER_BACKBUFFER 0x1 -#define HWC_BUFFER_AUXBUFFER 0x2 -#define HWC_BUFFER_DEPTHBUFFER 0x3 -#define HWC_BUFFER_ALPHABUFFER 0x4 -#define HWC_BUFFER_TRIPLEBUFFER 0x5 -#define HWC_BUFFER_FIFOBUFFER 0x6 -#define HWC_BUFFER_SCREENBUFFER 0x7 -#define HWC_BUFFER_TEXTUREBUFFER 0x8 -#define HWC_BUFFER_AUXRENDER 0x9 -#define HWC_BUFFER_NONE 0xff - -typedef FxU32 hwcOriginLocation; -#define HWC_ORIGIN_UPPER_LEFT 0x0 -#define HWC_ORIGIN_LOWER_LEFT 0x1 - -typedef FxI32 hwcColorFormat; -#define HWC_COLORFORMAT_ARGB 0x0 -#define HWC_COLORFORMAT_ABGR 0x1 -#define HWC_COLORFORMAT_RGBA 0x2 -#define HWC_COLORFORMAT_BGRA 0x3 - -typedef FxU32 hwcSwapType; -#define HWC_SWAP_FLIP 0x0 -#define HWC_SWAP_BLT 0x1 - -typedef FxU32 hwcControl; -#define HWC_CONTROL_ACTIVATE 0x1 -#define HWC_CONTROL_DEACTIVATE 0x2 -#define HWC_CONTROL_RESIZE 0x3 -#define HWC_CONTROL_MOVE 0x4 - -/* -** Data Structures -*/ - -typedef struct hwcPCIInfo_s { - FxBool - initialized; - FxU32 - vendorID, /* PCI Vendor ID */ - deviceID, /* PCI Device ID */ - pciBaseAddr[HWC_NUM_BASE_ADDR]; -} hwcPCIInfo; - -typedef struct hwcLinearInfo_s { - FxBool - initialized; - FxU32 - linearAddress[HWC_NUM_BASE_ADDR]; -} hwcLinearInfo; - -typedef struct hwcRegInfo_s { - FxBool - initialized; - volatile FxU32 - ioMemBase, /* mem base for I/O aliases */ - cmdAGPBase, /* CMD/AGP register base */ - waxBase, /* 2D register base */ - sstBase, /* 3D register base */ - lfbBase, /* 3D lfb base */ - rawLfbBase; /* Raw LFB base (base address 1) */ -#if __POWERPC__ - ioPortBase; /* PPC does I/O via a 32-bit address */ -#else - volatile FxU16 - ioPortBase, /* I/O base address */ - pad; /* Keep things aligned */ -#endif -} hwcRegInfo; - -typedef struct hwcFifoInfo_s { - FxBool - agpFifo, - initialized; - FxU32 - agpVirtAddr, - agpPhysAddr, - agpSize, - fifoStart, /* Beg of fifo (offset from base) */ - fifoLength; /* Fifo size in bytes */ -} hwcFifoInfo; - -/* -** CHD: Reconcile the following two types -*/ - -typedef struct hwcBufferDesc_s { - FxU32 bufMagic; - hwcBuffer bufType; - FxU32 bufOffset; - FxI32 bufStride; - FxU32 bufSize; - FxU32 bufBPP; /* bits per pixel */ - FxU32 width, height; - FxBool tiled; /* Is it tiled? */ -} hwcBufferDesc; - -typedef struct hwcBufferInfo_s { - FxBool - initialized; - - FxU32 - bufSize, /* size of buffer in bytes */ - bufSizeInTiles, /* Buffer Size in tiles */ - bufStride, /* stride of buffer in bytes */ - bufStrideInTiles, /* stride of buffer in tiles */ - bufHeightInTiles, /* height of buffer in tiles */ - nColBuffers, /* # color buffers */ - colBuffStart[3], /* Beg of color buffers */ - colBuffEnd[3], /* End of color buffers */ - lfbBuffAddr[4], /* Start address of lfb (tiled relative) buffers. - * NB: This only includes enough space - * for 3 color buffers and 1 aux buffer. - */ - nAuxBuffers, /* # aux buffer (0 or 1) */ - auxBuffStart, /* End of aux buffer */ - auxBuffEnd; /* End of aux buffer */ - void - *colBuffPriv, /* Private color buffer info */ - *auxBuffPriv; /* Private aux buffer info */ - hwcBufferDesc - buffers[6]; /* 3 col + 1 aux + 1 tex + 1 fifo */ -} hwcBufferInfo; - -typedef struct hwcVidInfo_s { - FxU32 - hWnd; /* Window Handle */ - FxBool - initialized, - tiled; /* Is it tiled or linear? */ - GrScreenResolution_t - sRes; - GrScreenRefresh_t - vRefresh; - FxU32 - stride, /* Stride in bytes */ - xRes, /* X resolution */ - yRes, /* Y resolution */ - refresh; /* refresh rate */ - FxBool - tripleBuffering; /* Are we? */ -} hwcVidInfo; - -typedef struct hwcSurfaceInfo_s { - FxU32 - lpSurface, - fbOffset, - fbStride, - depth, - width, - height, - tileBase, - pciStride, - lpLFB, - hwStride; - FxBool - sdRam, - isTiled; -} hwcSurfaceInfo; - -typedef struct hwcAGPInfo_s { - FxU32 - linAddr, /* Linear address of AGP memory */ - physAddr, /* physical address of AGP memory */ - size; /* size of physical memory */ -} hwcAGPInfo; - - -/* Here's the wrapper in which we keep all of the above: */ -typedef struct hwcBoardInfo_s { - FxBool - sdRAM; /* Is the board SDRAM? */ - void - *hdc, /* This is really an HDC */ - *hMon; /* this is an HMONITOR */ - FxU32 - extContextID, /* HWC_EXT Context ID (if needed) */ - devRev, /* Device Revision */ - tramOffset, /* Offset to texture memory */ - tramSize, /* Size of texure memory */ - min_tramSize, /* minimum texture memory required */ - fbOffset, /* Frame Buffer Offset (in bytes) */ - h3Rev, /* Banshee Revision Number */ - h3Mem, /* Megs of RAM on board */ - boardNum, /* Board ID for hwc */ - deviceNum; /* Device ID for PCILib */ - hwcPCIInfo - pciInfo; - hwcLinearInfo - linearInfo; - hwcRegInfo - regInfo; - hwcFifoInfo - fifoInfo; - hwcBufferInfo - buffInfo; - hwcVidInfo - vidInfo; - void * - deviceConfigData; - hwcAGPInfo - agpInfo; -} hwcBoardInfo; - -/* Now, let's tie it all together */ -typedef struct hwcInfo_s { - FxU32 - nBoards; - hwcBoardInfo - boardInfo[HWC_MAX_BOARDS]; -} hwcInfo; - -#define HWC_WIN_FIFO_HOST 0x00UL -#define HWC_WIN_FIFO_LOCAL 0x01UL -#define HWC_WIN_FIFO_AGP 0x02UL - -typedef struct { - /* One of the HWCEXT_FIFO_XXX values defined in hwcext.h. */ - FxU32 - fifoType; - - /* If > 0 xxxBufferAddr is a valid fifo write */ - FxU32 - lockCount; - - /* Information about the current command stream to the hw fifo. - * Fields prefaced w/ cmd are for storing the current command stream - * since the last syncronization point via hwcExecuteFifo. Fields - * prefaced w/ state are the command stream to restore the state - * at the last call to hwcExecuteFifo. - * - * xxxBufferAddr: Linear address if lockedP == FXTRUE. - * xxxBufferOffset: HW relative address of the buffer. - * xxxBufferSize: Total size of valid range of the buffer. (bytes) - * xxxBufferAllocUnit: Minimum allocation unit for the buffer sub-allocation. (bytes) - */ - struct { - FxU32 - baseAddr, - hwOffset, - size, - allocUnit; - } cmdBuf, - stateBuf; - - FxU32 - sentinalBufferAddr, - sentinalBufferOffset; - - /* System dependent bookkepping state information if fifoType != - * HWCEXT_FIFO_HOST. This should be considered logically const to - * the client. - */ - FxU32 - *surfaceFifo, - *surfaceSentinal; -} HwcWinFifo; - -/* -** Function Prototypes -*/ - -hwcInfo * -hwcInit(FxU32 vID, FxU32 dID); - -FxBool -hwcMapBoard(hwcBoardInfo *bInfo, FxU32 bAddrMask); - -FxBool -hwcUnmapBoard(hwcBoardInfo *bInfo); - -FxBool -hwcInitRegisters(hwcBoardInfo *bInfo); - -FxBool -hwcAllocBuffers(hwcBoardInfo *bInfo, FxU32 nColBuffers, FxU32 nAuxBuffers); - -FxBool -hwcInitFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting); - -/* The enableHoleCounting parameter here is a bit of a red herring since - * having an agp fifo implies no hole counting. This routine will call - * the default hwcInitFifo when it cannot allocate an agp fifo, and the - * hole counting parameter only applies in this case. - */ -FxU32 -hwcInitAGPFifo(hwcBoardInfo *bInfo, FxBool enableHoleCounting); - -FxBool -hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo - *vidTiming, FxBool overlay); - -FxBool -hwcRestoreVideo(hwcBoardInfo *bInfo); - -char * -hwcGetErrorString(void); - -FxBool -hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers, - FxU32 nAuxBuffers, FxBool tiled); - -#ifdef __WIN32__ - -FxU32 -hwcAllocWinContext(hwcBoardInfo* bInfo); - -FxBool -hwcFreeWinContext(hwcBoardInfo* bInfo, - FxU32 winContextId); - -/* surfaceInfo: - * Describes the currently setup os surfaces. - * fifo: - * Input: - * cmdBuf.allocUnit: - * stateBuf.allocUnit: - * Minimum allocation unit of each section. - * Output: - * cmdBuf: - * stateBuf: - */ -FxBool -hwcAllocWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo, - FxU32* surface); - -FxBool -hwcFreeWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo); - -FxBool -hwcExecuteWinFifo(hwcBoardInfo* bInfo, - const FxU32 winContextId, - const HwcWinFifo* fifo, - const FxU32 serialNumber); - -FxU32 -hwcExecuteStatusWinFifo(hwcBoardInfo* bInfo, - const HwcWinFifo* fifo, - const FxU32 serialNumber); - -FxBool -hwcLockWinFifo(hwcBoardInfo* bInfo, - HwcWinFifo* fifo); - -FxBool -hwcUnlockWinFifo(hwcBoardInfo* binfo, - HwcWinFifo* fifo); - -FxBool -hwcGetSurfaceInfo(const hwcBoardInfo* binfo, - FxU32 *sfc, - hwcSurfaceInfo *ret); - -FxBool -hwcAllocAuxRenderingBuffer(hwcBoardInfo *bInfo, - hwcBufferDesc *bp, - int width, int height); - -#endif /* __WIN32__ */ - -FxBool -hwcGammaRGB(hwcBoardInfo *bInfo, float r, float g, float b); - -FxBool -hwcGammaTable(hwcBoardInfo *bInfo, FxU32 nEntries, FxU32 *r, FxU32 *g, FxU32 *b); - -FxBool -hwcSetGrxClock(hwcBoardInfo *bInfo, FxU32 speedInMHz); - -FxBool -hwcSetMemClock(hwcBoardInfo *bInfo, FxU32 speedInMHz); - -FxBool -hwcResolutionSupported(hwcBoardInfo *bInfo, GrScreenResolution_t res); - -char * -hwcGetenv(char *a); - - -#endif /* MINIHWC_H not defined */ diff --git a/glide2x/h3/minihwc/qmodes.h b/glide2x/h3/minihwc/qmodes.h deleted file mode 100644 index ab60193..0000000 --- a/glide2x/h3/minihwc/qmodes.h +++ /dev/null @@ -1,402 +0,0 @@ -/* $Header$ */ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** File name: qmodes.h -** -** Description: Structures, macros, etc to support query mode. -** -** $Revision$ -** $Date$ -** -** $History: qmodes.h $ -** -** ***************** Version 3 ***************** -** User: Dow Date: 3/17/99 Time: 6:14p -** Updated in $/Releases/Voodoo3/MT2/3Dfx/devel/H3/minihwc -** Fixes Phantom Menace, OGL, and others. -** -** ***************** Version 20 ***************** -** User: Stuartb Date: 2/25/99 Time: 12:48p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_CAPABLE. -** -** ***************** Version 19 ***************** -** User: Stuartb Date: 2/18/99 Time: 2:54p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added xlcd FPFLAGS for filter mode setting. -** -** ***************** Version 18 ***************** -** User: Andrew Date: 2/11/99 Time: 11:17a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added AGP Cap Query -** -** ***************** Version 17 ***************** -** User: Stuartb Date: 1/21/99 Time: 11:18a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added FPFLAG_SETRES and FPFLAG_SETREFR for app code. Removed -** broadcastMonitorChange calls. -** -** ***************** Version 16 ***************** -** User: Stuartb Date: 1/12/99 Time: 2:27p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_ANALOG_MONITOR & modified QUERY_LCDCTRL. -** -** ***************** Version 15 ***************** -** User: Stuartb Date: 1/08/99 Time: 3:34p -** Updated in $/devel/h3/Win95/dx/dd16 -** Added QUERY_LCDCTRL for control panel flat panel ops. -** -** ***************** Version 14 ***************** -** User: Bob Date: 1/05/99 Time: 5:57p -** Updated in $/devel/h3/WinNT/src/Video/Displays/H3 -** BIOS version reporting to Control Panel applet. -** -** Shared qmodes.h with Win9x and the rest of the universe. -** -** ***************** Version 13 ***************** -** User: Bob Date: 1/05/99 Time: 5:14p -** Updated in $/devel/h3/Win95/dx/dd16 -** Altered nesting of header files so that tv.h is not inside qmodes.h. -** -** This is a sharing issue with NT. -** -** ***************** Version 12 ***************** -** User: Larryw Date: 1/05/99 Time: 4:36p -** Updated in $/devel/swtools/3DfxV2ps -** Changed QUERY[GS]ETDESKTOPGAMMA back to QUERY[GS]ETGAMMA. -** -** ***************** Version 11 ***************** -** User: Larryw Date: 1/05/99 Time: 3:45p -** Updated in $/devel/swtools/3DfxV2ps -** Put MAX_BIOS_VERSION_STRING in; changed some Gamma query values -** -** ***************** Version 10 ***************** -** User: Andrew Date: 1/05/99 Time: 10:50a -** Updated in $/devel/h3/Win95/dx/dd16 -** Added new function to get the bios version string -** -** ***************** Version 9 ***************** -** User: Michael Date: 12/29/98 Time: 2:37p -** Updated in $/devel/h3/Win95/dx/dd16 -** Implement the 3Dfx/STB unified header. -** -** 8 10/10/98 5:21p Hsohel -** -** 7 10/10/98 4:52p Hsohel -** -** 6 10/10/98 3:36p Hsohel -** -** 5 10/09/98 3:54p Hsohel -** -** 4 7/13/98 5:26p Andrew -** Changed to support a gamma table -** -** 3 7/11/98 8:16a Andrew -** Added gamma correction -** -** 2 5/12/98 9:35a Andrew -** Added some minor changes for valid modes -** -** 1 4/22/98 2:47p Andrew -** Query Modes Protocol Information -** -** -*/ - -#ifndef _QMODES_H_ -#define _QMODES_H_ - -/* The QUERYMODES ESC Code */ -#define QUERYESCMODE (0x8001) - -#define TDFXACK (0x3DF0) -#define TDFXERR (0xFFFF) - -// General Queries -#define QUERYVERSION (0x0000) - -// Mode Queries -#define QUERYNUMMODES (0x0001) -#define QUERYMODES (0x0002) -#define QUERYDEVNODE (0x0003) - -// Virtual Desktop Queries -#define QUERYMAXFREEMEM (0x100) -#define QUERYSETVIRTUALSIZE (0x101) -#define QUERYGETSTARTADDR (0x102) -#define QUERYSETSTARTADDR (0x103) - -// Gamma Queries -#define QUERYGETGAMMA (0x200) -#define QUERYSETGAMMA (0x201) -#define QUERYGETGLIDEGAMMA (0x202) -#define QUERYSETGLIDEGAMMA (0x203) - -// BIOS Version -#define QUERYGETBIOSVERSION (0x280) - -// AGP Query -#define QUERYGETAGPCAPS (0x2A0) - -// TVOUT Queries -// see ..\inc\tv.h uses 0x300 -> 0x38f approx. - -// LCD CONTROL -#define QUERY_LCDCTRL (0x3a0) - -// ANALOG MONITOR ON/OFF override - -#define QUERY_ANALOG_MONITOR (0x3b0) - - -/* -** Protocol: -** -** Call will be of the form -** ExtEscape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, sizeof(Output), &Output); -** Escape(hdc, QUERYESCMODE, sizeof(QIN), &Qin, &Output); -** -*/ - - -/* -** Standard Input Structure -** -*/ -typedef struct qin { - DWORD dwSubFunc; // Subfunction -} QIN, FAR * LPQIN, * PQIN; - -/* -** -** -** INPUT: qin.dwSubFunc = QUERYVERSION -** OUTPUT: Driver Major & Minor Version -*/ -typedef struct qversion { - DWORD dwMajor; - DWORD dwMinor; - } QVERSION, FAR * LPQVERSION, * PQVERSION; - -#define QUERYMODE_MAJOR 0x00000000 -#define QUERYMODE_MINOR 0x00009999 - -/* -** Call this function first to know how many modes to allow -** the following structure for -** -** INPUT: qin.dwSubFunc = QUERYNUMMODES -** OUTPUT: Number of modes -*/ -typedef struct qnummode { - DWORD dwNum; - } QNUMMODE, FAR * LPQNUMMODE, * PQNUMODE; - -/* -** This is the mode information. You will need to allocate -** # modes * QMODE structures that the Driver will fill in. -** -** INPUT: qin.dwSubFunc = QUERYMODES -** OUTPUT: #Modes * QMODE -*/ -typedef struct qmode { - DWORD dwX; - DWORD dwY; - DWORD dwBpp; - DWORD dwRef; - DWORD dwValid; // This will be a field of flags - } QMODE, FAR * LPQMODE, * PQMODE; - -#define QUERY_MODE_VALID (0x000000001L) -#define QUERY_TV_MODE (0x000000002L) - -/* -** This is Devnode that the driver is using -** -** INPUT: qin.dwSubFunc = QUERYDEVNODE -** OUTPUT: dwDevNode -*/ -typedef struct qdevnode { - DWORD dwDevNode; // Monitor Device Node - DWORD dwValidDefGamma; // 1 ==> bGamma is valid; 0 ==> Invalid - BYTE bGamma; // Monitor Default Gamma - } QDEVNODE, FAR * LPQDEVNODE, * PQDEVNODE; - -#define QUERY_MONITOR_GAMMA_VALID (0x00000001L) - -/* -** This is maximum free memory available for Virtual Desktop Usage in -** this mode -** -** INPUT: qin.dwSubFunc = QUERYMAXFREEMEM -** OUTPUT: Maximum Free Memory -*/ -typedef struct qmaxfree { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwMaxFree; // Free Memory Available for Virtual Desktop - DWORD dwMaxX; // Maximum Free X ==> min(dwMaxFree/Y, MaxHardwareX) - DWORD dwMaxY; // Maximum Free Y ==> min(dwMaxFree/(X*BPP), MaxHardwareY) - } QMAXFREE, FAR * LPQMAXFREE, * PQMAXFREE; - -/* -** This is used to set the Virtual Desktop Size -** -** INPUT: qsetvsize.dwSubFunc = QUERYSETVIRTUALSIZE -** OUTPUT: None -*/ -typedef struct qsetvsize { - DWORD dwSubFunc; // Should be set to QUERYSETVIRTUALSIZE - DWORD dwX; // X Size in Pixels (X * BPP * Y <= MaxMemSize) - DWORD dwY; // Y Size in Lines - } QSETVSIZE, FAR * LPQSETVSIZE, * PQSETVSIZE; - -/* -** This is used to get the Virtual Desktop Start Address -** -** INPUT: qin.dwSubFunc = QUERYGETSTARTADDR -** OUTPUT: QGetStartAddr -*/ -typedef struct qgetstartaddr { - DWORD dwX; // X Location in Pixels - DWORD dwY; // Y Location in Lines - } QGETSTARTADDR, FAR * LPQGETSTARTADDR, * PQGETSTARTADDR; - -/* -** This is used to move the Virtual Desktop Start Address -** -** INPUT: qsetstartaddr.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetstartaddr { - DWORD dwSubFunc; // Should be set to QUERYSETSTARTADDR - DWORD dwX; // X Location in Pixels (Note: Start Addr = X * BPP + Y * Display Pitch) - DWORD dwY; // Y Location in Lines - } QSETSTARTADDR, FAR * LPQSETSTARTADDR, * PQSETSTARTADDR; - -/* -** This is used to get the gamma values currently in use -** -** INPUT: qin.dwSubFunc = QUERYGETGAMMA -** OUTPUT: QGETGAMMA -*/ -typedef struct qgetgamma { - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QGETGAMMA, FAR * LPQGETGAMMA, * PQGETGAMMA; - -/* -** This is used to set the Gamma Value -** -** INPUT: qSetGamma.dwSubFunc = QUERYSETSTARTADDR -** OUTPUT: None -*/ -typedef struct qsetgamma { - DWORD dwSubFunc; // Should be set to QUERYSETGAMMA - DWORD dwRed; // Red Gamma * 100 - DWORD dwGreen; // Green Gamma * 100 - DWORD dwBlue; // Blue Gamma * 100 - DWORD GammaTable[256]; // Gamma Table Defined as 0x00BBGGRR - } QSETGAMMA, FAR * LPQSETGAMMA, * PQSETGAMMA; - -#define MAX_BIOS_VERSION_STRING (32) - -/* -** This is used to get the BIOS version -** -** INPUT: qin.dwSubFunc = QUERYGETBIOSVERSION -** OUTPUT: QGETBIOSVERSION -*/ -typedef struct qgetbiosversion { - BYTE bBIOSVersion[MAX_BIOS_VERSION_STRING]; - } QGETBIOSVERSION, FAR * LPQGETBIOSVERSION, * PQGETBIOSVERSION; - - -/* -** This is used to get the AGP Caps -** -** INPUT: qin.dwSubFunc = QUERYGETAGPCAPS -** OUTPUT: QGETAGPCAPS -*/ -// These are also defined in h3g.h -#define IS_AGP_CARD (0x00000001L) //Card has AGP capabilities -#define IS_GART_AVAILABLE (0x00000002L) //VMM Gart Functions are present -#define IS_AGP_READY (IS_AGP_CARD|IS_GART_AVAILABLE) //We can do AGP Functions on this card - -typedef struct qgetagpcaps { - DWORD dwAGPCaps; - } QGETAGPCAPS, FAR * LPQGETAGPCAPS, * PQGETAGPCAPS; - -/* HWCEXT_LCDCTRL -* -* Enables or disables flat panel monitor and also returns current status as -* given in IN-OUT struct below: -* -*/ - -// CAUTION: this is mirrored in h3g.h!!! - -typedef struct { - DWORD dwSubFunc; // Should be set to QGETSET_LCDCTRL - DWORD maxWidth; // out - DWORD maxHeight; // out - DWORD refreshRate; // out - DWORD fpFlags; // in - out -} QGETSET_LCDCTRL; - -#define FPFLAG_ENABLED BIT(0) // is currently enabled (OUT) -#define FPFLAG_PRESENT BIT(1) // panel & controller connected (OUT) -#define FPFLAG_PRESENT_AT_BOOT BIT(2) // panel & controller connected - // at boot time (OUT) -#define FPFLAG_ENABLE BIT(3) // try to enable panel (IN) -#define FPFLAG_DISABLE BIT(4) // try to disable panel (IN) -#define FPFLAG_GET_DIMS BIT(5) // read the EDID to get panel's - // physical dimensions (IN) -#define FPFLAG_SETRES BIT(6) // current desktop resolution too hi - // (OUT) -#define FPFLAG_SETREFR BIT(7) // current refresh rate wrong (OUT) - -// filter bits -// 00 bilinear 01 gausian -// 10 crisp 11 extra crisp -#define FPFLAG_FILTER_SOFT BIT(8) // use these 2 bits together (IN) -#define FPFLAG_FILTER_HARD BIT(9) -#define FPFLAG_CAPABLE BIT(10) // board has controller & BIOS - - -typedef struct { - DWORD dwSubFunc; // Should be set to QUERY_ANALOG_MONITOR - DWORD monitorStatus; - DWORD monitorControl; -} QGETSET_MONITOR_CTL; - -#define ENABLE_MONITOR BIT(0) -#define DISABLE_MONITOR BIT(1) -#define MONITOR_IS_ENABLED BIT(2) - - -#ifdef WINNT -int QueryMode(PDEV *, LPQIN lpQIN, LPVOID lpOutput); -#else -int QueryMode(LPQIN lpQIN, LPVOID lpOutput); -#endif - -#endif diff --git a/glide2x/h3/minihwc/setmode.h b/glide2x/h3/minihwc/setmode.h deleted file mode 100644 index 54dc190..0000000 --- a/glide2x/h3/minihwc/setmode.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -FxBool setVideoMode( void *hwnd, - int xRes, - int yRes, - int refresh, - void *hmon ); -void resetVideo( void ); - -FxBool checkResolutions(FxBool *reslist, void *hmon); diff --git a/glide2x/h3/minihwc/test/exttest.c b/glide2x/h3/minihwc/test/exttest.c deleted file mode 100644 index af142ed..0000000 --- a/glide2x/h3/minihwc/test/exttest.c +++ /dev/null @@ -1,234 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 1 5/01/98 9:16a Dow -** -*/ - -#include -#include <3dfx.h> -#include "..\hwcext.h" -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include -#include - -/* Forward declarations */ -HWND hWndMain; - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) - { - case WM_SETCURSOR: - SetCursor(NULL); - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - break; - - case WM_CHAR: - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -void -main(int argc, char **argv) -{ - HWND hWndMain; - HANDLE hInstance = GetModuleHandle(NULL); - HDC dc; - int extRes; - hwcExtRequest_t req; - hwcExtResult_t res; - WNDCLASS wc; - BOOL rc; - - FxU32 contextID; - - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "ExtTestClass"; - rc = RegisterClass( &wc ); - - if( !rc ) { - printf("Failed to register class!\n"); - exit(1); - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "ExtTestClass", - "ExtEscape Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - - if( !hWndMain ) { - printf("Failed to create window\n"); - exit(2); - } - - /* HWCEXT_GETDRIVERVERSION */ - - req.which = HWCEXT_GETDRIVERVERSION; - - dc = GetDC(hWndMain); - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - if (extRes == 0) { - printf("No escape!\n"); - exit(3); - } - - printf("HWCEXT_GETDRIVERVERSION:\n\tMajor:\t0x%x\n\tMinor:\t0x%x\n", - res.optData.driverVersionRes.major, - res.optData.driverVersionRes.minor); - - /* HWCEXT_ALLOCCONTEXT */ - req.which = HWCEXT_ALLOCCONTEXT; - - req.optData.allocContextReq.protocolRev = HWCEXT_PROTOCOLREV; - req.optData.allocContextReq.appType = HWCEXT_ABAPPTYPE_FSEM; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_ALLOCCONTEXT:\n\tStatus:\t0x%x\n\tContext ID:\t0x%x\n", - res.resStatus, res.optData.allocContextRes.contextID); - - contextID = res.optData.allocContextRes.contextID; - - /* HWCEXT_GETDEVICECONFIG */ - req.which = HWCEXT_GETDEVICECONFIG; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_GETDEVICECONFIG:\ -\n\tStatus:\t0x%x\ -\n\tdevNum:\t0x%x\ -\n\tvendorDI:\t0x%x\ -\n\tfbRam:\t0x%x\ -\n\tchipRev:\t0x%x\n", - res.resStatus, res.optData.deviceConfigRes.devNum, - res.optData.deviceConfigRes.vendorID, - res.optData.deviceConfigRes.fbRam, - res.optData.deviceConfigRes.chipRev); - - /* HWCEXT_GETLINEARADDR */ - req.which = HWCEXT_GETLINEARADDR; - - req.optData.linearAddrReq.devNum = 0; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_LINEARADDRESS:\ -\n\tStatus:\t0x%x\ -\n\tnumBaseAddrs: %d\ -\n\tbaseAddresses[0]: 0x%x\ -\n\tbaseAddresses[1]: 0x%x\ -\n\tbaseAddresses[2]: 0x%x\n", - res.resStatus, res.optData.linearAddressRes.numBaseAddrs, - res.optData.linearAddressRes.baseAddresses[0], - res.optData.linearAddressRes.baseAddresses[1], - res.optData.linearAddressRes.baseAddresses[2] - ); - - /* HWCEXT_RELEASECONTEXT */ - req.which = HWCEXT_RELEASECONTEXT; - - req.optData.releaseContextReq.contextID = contextID; - - extRes = ExtEscape(dc, EXT_HWC, sizeof(req), (LPCSTR) &req, - sizeof(res), (LPCSTR) &res); - - printf("HWCEXT_RELEASECONTEXT:\n\tStatus:\t0x%x\n", res.resStatus); - -} /* main */ diff --git a/glide2x/h3/minihwc/test/makefile b/glide2x/h3/minihwc/test/makefile deleted file mode 100644 index f143cbd..0000000 --- a/glide2x/h3/minihwc/test/makefile +++ /dev/null @@ -1,39 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -LCINCS = $(LCINCS) -I$(BUILD_ROOT)\h3\include - -LLDLIBS = $(LIBOBJS) $(BUILD_ROOT)\h3\lib\miniHwc.lib\ - $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib\ - $(BUILD_ROOT_SWLIBS)\lib\fxmisc.lib - -CFILES = test.c exttest.c - -PROGRAMS = $(CFILES:.c=.exe) - - -!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -test: test.exe \ No newline at end of file diff --git a/glide2x/h3/minihwc/test/test.c b/glide2x/h3/minihwc/test/test.c deleted file mode 100644 index c9affeb..0000000 --- a/glide2x/h3/minihwc/test/test.c +++ /dev/null @@ -1,64 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include -#include - -void -main(int argc, char **argv) -{ - FxU32 - devId, venId, - i; - hwcInfo *hInfo; - - if (argc < 3) { - printf("usage: test vid did\n"); - exit(1); - } - - sscanf(argv[1], "%x", &venId); - sscanf(argv[2], "%x", &devId); - - if ((hInfo = hwcInit(venId, devId)) == NULL) { - printf(hwcGetErrorString()); - exit(2); - } - - printf("nBoards = %d\n", hInfo->nBoards); - - for (i = 0; i < hInfo->nBoards; i++) { - int pbAddr; - hwcPCIInfo *pciInfo = &hInfo->boardInfo[i].pciInfo; - - printf("Board %d\n", i); - printf("\tVendor ID = 0x%x\n", pciInfo->vendorID); - printf("\tDevice ID = 0x%x\n", pciInfo->deviceID); - - hwcMapBoard(&hInfo->boardInfo[i], 0x1ff); - for (pbAddr = 0; pbAddr < 9; pbAddr++) { - printf("\tPCI Base Address %d = 0x%x\n", pbAddr, pciInfo->pciBaseAddr[pbAddr]); - printf("\tLinear Address: 0x%x\n", - hInfo->boardInfo[i].linearInfo.linearAddress[pbAddr]); - } - } -} /* main */ - diff --git a/glide2x/h3/minihwc/tv.h b/glide2x/h3/minihwc/tv.h deleted file mode 100644 index 0edc136..0000000 --- a/glide2x/h3/minihwc/tv.h +++ /dev/null @@ -1,573 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** $Log$ -** -** 3 3/17/99 6:14p Dow -** Fixes Phantom Menace, OGL, and others. -** -** 10 3/02/99 4:20p Stuartb -** Removed obsolete TV_STANDARD_XXX defines. -** -** 9 2/16/99 3:47p Stuartb -** Added some BIOS_XXXX tvout & LCD defines. -** -** 8 2/13/99 6:45p Stuartb -** First cut at PAL_M, PAL_N, PAL_NC support in tvout. -** -** 7 99/01/26 11:51 Larryw -** Bringing the other tv.h's into sync with the changes made to -** $/devel/h3/Win95/dx/inc/tv.h (including QUERYENABLETV). -** -** 2 1/14/99 3:50p Stuartb -** Added #define QUERYENABLETV. -** -** 1 9/10/98 2:55p Stuartb -** Interface file for TVOUT. -** -** 2 7/11/98 8:18a Andrew -** changed some comments -** -** 1 5/12/98 9:34a Andrew -** First attempt at TV out interface -** -*/ - -#ifndef _TV_H_ -#define _TV_H_ - -#ifdef VDDONLY -#define FAR -#endif - -// TVOut Queries -#define QUERYTVAVAIL (0x300) // Returns Status Determined at Boot -#define QUERYTVSENSE (0x301) // Performs a Sense on the available connectors - -// Individual Queries on Capabilities -#define QUERYGETPICCAP (0x321) // Get Individual Picture Control Capability -#define QUERYGETFILTERCAP (0x322) // Get Individual Filter Control Capability -#define QUERYGETPOSCAP (0x323) // Get Individual Position Control Capability -#define QUERYGETSIZECAP (0x324) // Get Individual Size Control Capability -#define QUERYGETSPECIALCAP (0x325) // Get Individual Special Control Capability - -// Get Current Settings -#define QUERYGETSTANDARD (0x340) // Get Current Standard Setting -#define QUERYGETPICCONTROL (0x341) // Get Individual Picture Control Setting -#define QUERYGETFILTERCONTROL (0x342) // Get Individual Filter Control Setting -#define QUERYGETPOSCONTROL (0x343) // Get Position Control Setting -#define QUERYGETSIZECONTROL (0x344) // Get Size Control Setting -#define QUERYGETSPECIAL (0x345) // Get Individual Special Control Setting -#define QUERYGETCONSTATUS (0x346) // Get Connector Status - -// Set Settings -#define QUERYSETSTANDARD (0x360) // Set Current Standard Setting -#define QUERYSETPICCONTROL (0x361) // Set Individual Picture Control Setting -#define QUERYSETFILTERCONTROL (0x362) // Set Individual Filter Control Setting -#define QUERYSETPOSCONTROL (0x363) // Set Individual Position Control Setting -#define QUERYSETSIZECONTROL (0x364) // Set Individual Size Control Setting -#define QUERYSSETSPECIAL (0x365) // Set Individual Special Control Setting -#define QUERYSETCONSTATUS (0x366) // Set Connector Status - -// Registery Updates -#define QUERYCOMMITREG (0x380) // This should be called after the user hits ok -#define QUERYREFRESH (0x381) // This should be called if the user hits cancel - -// Enable/Disable TV-Out -#define QUERYDISABLETV (0x500) // Disable TV-Out and switch CRT On -#define QUERYENABLETV (0x501) // This just enables mode selection - -/* -** Call this function first to know how if a TV Encoder is -** available and what general functionality it provides -** -** INPUT: qin.dwSubFunc = QUERYTVAVAIL -** OUTPUT: TVSTATUS -*/ - -typedef struct tvcon { - DWORD dwType; // Type of the Connector - DWORD dwStatus; // Connector Status -} TVCON, FAR * LPTVCON, * PTVCON; - -// To be used in the Type Field of TVCON -#define TV_TYPE_SVIDEO (0x00000001L) -#define TV_TYPE_COMPOSITE (0x00000002L) -#define TV_TYPE_SCART (0x00000004L) -#define TV_TYPE_UNKNOWN (0x08L) // for broken bt868 rev d - -// To be used in the Status Field of TVCON -#define TV_PRESENT (0x00000001L) // Did sense determine TV on connector ? -#define TV_CONNECTOR_ENABLED (0x00000002L) // Is Connector Currently Enabled ? - -#define MAX_CONNECTORS (0x000000004L) - -// This structure defines what we are capable of -typedef struct qtvstatus { - DWORD dwEncoder; // Did I2C Query find a TV Encoder - DWORD dwStandard; // Bit Map of Standard's Supported - DWORD dwPicControl; // Bit Map of Picture Controls - DWORD dwFilterControl; // Bit Map of Filter Controls - DWORD dwPosControl; // Bit Map of Position Controls - DWORD dwSizeControl; // Bit Map of Size Controls - DWORD dwSpecial; // Bit Map of Special Controls - DWORD dwNumSimultaneous; // How many outputs can you support at the same time? - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - BYTE szName[10]; // Name of the Encoder - } QTVSTATUS, FAR * LPQTVSTATUS, * PTVSTATUS; - -// To be used in TVStatus.dwEncoder -#define TV_ENCODER_PRESENT (0x00000001L) - -// To be used in TVStatus.dwPicControl -#define TV_BRIGHTNESS (0x00000001) -#define TV_CONTRAST (0x00000002) -#define TV_GAMMA (0x00000004) -#define TV_HUE (0x00000008) -#define TV_SATURATION (0x00000010) -#define TV_SHARPNESS (0x00000020) - -// To be used in TVStatus.dwFilter -#define TV_FLICKER (0x10000001) -#define TV_CHROMA (0x10000002) -#define TV_LUMA (0x10000004) - -// To be used in TVStatus.dwPosControl -#define TV_HORIZONTAL (0x00000001) -#define TV_VERTICAL (0x00000002) - -// To be used in TVStatus.dwSizeControl -#define TV_UNDERSCAN (0x00000001) -#define TV_OVERSCAN (0x00000002) -#define TV_ADJUST_UNDERSCAN (0x00000004) -#define TV_ADJUST_OVERSCAN (0x00000008) - -// To be used in TVStatus.dwSpecial -#define TV_CLOSED_CAPTION (0x00000001) -#define TV_MACROVISION (0x00000002) -#define TV_LCDPANEL (0x00000004) /* Flat panel out */ - -// To be used in TVSetSpec.dwCap for miscellaneous features -#define TV_SETSPECIAL_CCAPTION (0x00000001) -#define TV_SETSPECIAL_MACROVISION (0x00000002) -#define TV_SETSPECIAL_LCDPANEL (0x00000004) /* Flat panel out */ -#define TV_SETSPECIAL_WR_LCDREG (0x00000005) /* For debug */ -#define TV_SETSPECIAL_RD_LCDREG (0x00000006) /* For debug */ - -#define MAX_SPECIAL_DATA 512 -/* -** Call this function to request the Driver to perform -** a sense on every connector -** -** INPUT: qin.dwSubFunc = QUERYTVSENSE -** OUTPUT: TVCONSTATUS -*/ - -typedef struct tvconstatus { - DWORD dwNumConnectors; // How many connectors does the Encoder support - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVCONSTATUS, FAR * LPTVCONSTATUS, * PTVCONSTATUS; - -/**************************************************************************** -** -** Get Capabilities -** -****************************************************************************/ - -typedef struct qind { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Capability of Interest -} QIND, FAR * LPQIND, * PQIND; - -/* -** Call this function to request the Driver to -** report individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCAP -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCAPDATA -*/ - -typedef struct tvcapdata { - DWORD dwCap; // Capability of Interest - DWORD dwNumSteps; // Number of Steps Supported by Hardware - } TVCAPDATA, FAR * LPTVCAPDATA, * PTVCAPDATA; - -/* -** Call this function to request the Driver to -** report all Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCAP -** OUTPUT: TVPOSCAP -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvposcap { - DWORD dwMaxLeft; // Maximum Left Position in Hardware Units - DWORD dwMaxRight; // Maximum Right Position in Hardware Units - DWORD dwHorGranularity; // Size of Movement in Pixels - DWORD dwMaxTop; // Maximum Top Position in Hardware Units - DWORD dwMaxBottom; // Maximum Bottom Position in Hardware Units - DWORD dwVGAGranularity; // Granularity in VGA Lines - } TVPOSCAP, FAR * LPTVPOSCAP, * PTVPOSCAP; - -/* -** Call this function to request the Driver to -** report all Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECAP -** OUTPUT: TVSIZECAP -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsizecap { - DWORD dwMaxHorInput; // Maximum Input Horizontal Size in Active Pixels - DWORD dwMaxVerInput; // Maximum Input Vertical Size in Active Lines - DWORD dwMaxHorOutput; // Maximum Output Horizontal Size in Active Pixels - DWORD dwMaxVerOutput; // Maximum Output Vertical Size in Active Pixels - DWORD dwMinHorInput; // Minimum Input Horizontal Size in Active Pixels - DWORD dwMinVerInput; // Minimum Input Vertical Size in Active Lines - DWORD dwMinHorOutput; // Minimum Output Horizontal Size in Active Pixels - DWORD dwMinVerOutput; // Minimum Output Vertical Size in Active Pixels - DWORD dwHorStepSize; // In Percentage * 1000 - DWORD dwVerStepSize; // In Percentage * 1000 - } TVSIZECAP, FAR * LPTVSIZECAP, * PTVSIZECAP; - -/* -** Call this function to request the Driver to -** report on a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIALCAP -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION | -** TV_LCDPANEL -** OUTPUT: TVSPECCAP -*/ - -/**************************************************************************** -** -** Get Current Settings -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** report current Standard Setting -** -** INPUT: qin.dwSubFunc = QUERYGETSTANDARD -** OUTPUT: TVGETSTANDARD -*/ -typedef struct tvgetstandard { - DWORD dwStandard; // Standard Currently in Use -} TVGETSTANDARD, FAR * LPTVGETSTANDARD, * PTVGETSTANDARD; - -/* -** Call this function to request the Driver to -** report current individual Picture Capability -** -** INPUT: qind.dwSubFunc = QUERYGETPICCONTROL -** qind.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** OUTPUT: TVCURCAP -*/ - -typedef struct tvcurcap { - DWORD dwCap; // Capability Requested - DWORD dwStep; // Current Hardware Step we are on - } TVCURCAP, FAR * LPTVCURCAP, * PTVCURCAP; - -/* -** Call this function to request the Driver to -** report current individual Filter Capability -** -** INPUT: qind.dwSubFunc = QUERYGETFILTERCONTROL -** qind.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** OUTPUT: TVCURCAP -*/ - -/* -** Call this function to request the Driver to -** report all current Position Capability -** -** INPUT: qin.dwSubFunc = QUERYGETPOSITIONCONTROL -** OUTPUT: TVCURPOS -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvcurpos { - DWORD dwCurLeft; // Current Left Position in Hardware Units - DWORD dwCurRight; // Current Right Position in Hardware Units - DWORD dwCurTop; // Current Top Position in Hardware Units - DWORD dwCurBottom; // Current Bottom Position in Hardware Units - } TVCURPOS, FAR * LPTVCURPOS, * PTVCURPOS; - -/* -** Call this function to request the Driver to -** report current Size Capability -** -** INPUT: qin.dwSubFunc = QUERYGETSIZECONTROL -** OUTPUT: TVCURSIZE -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvcursize { - DWORD dwCurHorInput; // Current Input Horizontal Size in Active Pixels - DWORD dwCurVerInput; // Current Input Vertical Size in Active Lines - DWORD dwCurHorOutput; // Current Output Horizontal Size in Active Pixels - DWORD dwCurVerOutput; // Current Output Vertical Size in Active Pixels - } TVCURSIZE, FAR * LPTVCURSIZE, * PTVCURSIZE; - -/* -** Call this function to request the Driver to -** report on current a Special Capability -** -** INPUT: qind.dwSubFunc = QUERYGETSPECIAL -** qind.dwCap = TV_CLOSED_CAPTION | -** TV_MACROVISION -** OUTPUT: TVCURSPEC -*/ - -/* -** Call this function to request the Driver to return -** in memory data on every connector -** -** INPUT: qin.dwSubFunc = QUERYGETCONSTATUS -** OUTPUT: TVCONSTATUS -*/ - - -/**************************************************************************** -** -** Set Functions -** -****************************************************************************/ - -/* -** Call this function to request the Driver to -** change the current Standard Setting -** -** INPUT: TvSetStandard.dwSubFunc = QUERYSETSTANDARD -** TvSetStandard.dwStandard = TV_STANDARD_NTSCRS170A | -** TV_STANDARD_NTSCM | -** TV_STANDARD_NTSCN | -** TV_STANDARD_NTSC443 | -** TV_STANDARD_NTSCJAPAN | -** TV_STANDARD_PALBDGHI | -** TV_STANDARD_PALM | -** TV_STANDARD_PALN | -** TV_STANDARD_PALN_ARGENTINA | -** -** OUTPUT: None -*/ -typedef struct tvsetstandard { - DWORD dwSubFunc; // Sub Function - DWORD dwStandard; // Standard Currently in Use -} TVSETSTANDARD, FAR * LPTVSETSTANDARD, * PTVSETSTANDARD; - -/* -** Call this function to request the Driver to -** set individual Picture Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETPICCONTROL -** TVSetCap.dwCap = TV_BRIGHTNESS | -** TV_CONTRAST | -** TV_GAMMA | -** TV_HUE | -** TV_SATURATION | -** TV_SHARPNESS -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -typedef struct tvsetcap { - DWORD dwSubFunc; // SubFunction - DWORD dwCap; // Capability Requested - LONG dwStep; // Hardware Step to set - } TVSETCAP, FAR * LPTVSETCAP, * PTVSETCAP; - -/* -** Call this function to request the Driver to -** set individual Filter Capability -** -** INPUT: TVSetCap.dwSubFunc = QUERYSETFILTERCONTROL -** TVSetCap.dwCap = TV_FLICKER | -** TV_CHROMA | -** TV_LUMA -** TVSetCap.dwStep = -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to -** move the Output Image -** -** INPUT: TVSetPos.dwSubFunc = QUERYSETPOSCONTROL -** TVSetPos.dwLeft = -** TVSetPos.dwRight = -** TVSetPos.dwTop = -** TVSetPos.dwBottom = -** OUTPUT: None -** Note this is a good match for Chrontel but unknown now to do this on Brooktree -*/ -typedef struct tvsetpos { - DWORD dwSubFunc; // SubFunction - DWORD dwLeft; // Left Position in Hardware Units - DWORD dwRight; // Right Position in Hardware Units - DWORD dwTop; // Top Position in Hardware Units - DWORD dwBottom; // Bottom Position in Hardware Units - } TVSETPOS, FAR * LPTVSETPOS, * PTVSETPOS; - -/* -** Call this function to request the Driver to -** set the resize the input/output -** -** INPUT: TVSetSize.dwSubFunc = QUERYSETSIZECONTROL -** TvSetSize.dwHorOutput = -** TvSetSize.dwVerOutput = -** OUTPUT: None -** Note this is a good match for BrookTree but unknown now to do this on Chrontel -*/ -typedef struct tvsetsize { - DWORD dwSubFunc; // SubFunction - DWORD dwOverScan; // Overscan enable/disable - DWORD dwHorOutput; // Output Horizontal Size in Active Pixels - DWORD dwVerOutput; // Output Vertical Size in Active Lines - } TVSETSIZE, FAR * LPTVSETSIZE, * PTVSETSIZE; - -/* -** Call this function to request the Driver to -** set the a Special Capability -** -** INPUT: TVSetSpec.dwSubFunc = QUERYSETSPECIAL -** TVSetSpec.dwCap = TV_SETSPECIAL_CCAPTION | -** TV_SETSPECIAL_MACROVISION | -** TV_SETSPECIAL_LCDPANEL -** OUTPUT: None -*/ -typedef struct tvsetspecial { - DWORD dwSubFunc; // Sub Function - DWORD dwCap; // Feature to set - DWORD dwIndex; // Index to data array: 0 - none - WORD wData[MAX_SPECIAL_DATA]; // Data array: format specific to caps - DWORD dwIPclock; // Flat panel clock - } TVSETSPECIAL, FAR * LPTVSETSPECIAL, * PTVSETSPECIAL; - -/* -** Call this function to request the Driver to enable/disable -** connectors -** -** INPUT: TVSetConnector.dwSubFunc = QUERYSETCONSTATUS -** Note i can range from 0 to < dwNumSimultaneous -** TVSetConnector.TVCon[i].dwType = TV_TYPE_SVIDEO | TV_TYPE_COMPOSITE | TV_TYPE_SCART -** TVSetConnector.TVCon[i].dwStatus = TV_CONNECTOR_ENABLED | 0x00 -** -** OUTPUT: None -*/ - -typedef struct tvsetconnector { - DWORD dwSubFunc; // SubFunction - TVCON TVCon[MAX_CONNECTORS]; // TV Connector Status - } TVSETCONNECTOR, FAR * LPTVSETCONNECTOR, * PTVSETCONNECTOR; - -/**************************************************************************** -** -** Registry Functions -** -****************************************************************************/ -/* -** Call this function to request the Driver to save -** in memory data to registry -** -** INPUT: qin.dwSubFunc = QUERYCOMMITREG -** OUTPUT: None -*/ - -/* -** Call this function to request the Driver to refresh -** in memory data with registry data -** -** INPUT: qin.dwSubFunc = QUERYREFRESH -** OUTPUT: None -*/ - - - -/**************************************************************************** -** -** Error codes -** -****************************************************************************/ -#define TV_STANDARD_UNSUPPORTED (0x00000001L) -#define TV_CONTROL_UNSUPPORTED (0x00000002L) -#define TV_INVALID_DEVICE (0x000000ffL) - - -/**************************************************************************** -** -** TV standards that we support taken from win98 ddk tvout.h -** -****************************************************************************/ - -#define VP_TV_STANDARD_NTSC_M 0x0001 // 75 IRE Setup -#define VP_TV_STANDARD_NTSC_M_J 0x0002 // Japan, 0 IRE Setup -#define VP_TV_STANDARD_PAL_B 0x0004 -#define VP_TV_STANDARD_PAL_D 0x0008 -#define VP_TV_STANDARD_PAL_H 0x0010 -#define VP_TV_STANDARD_PAL_I 0x0020 -#define VP_TV_STANDARD_PAL_M 0x0040 -#define VP_TV_STANDARD_PAL_N 0x0080 -#define VP_TV_STANDARD_SECAM_B 0x0100 -#define VP_TV_STANDARD_SECAM_D 0x0200 -#define VP_TV_STANDARD_SECAM_G 0x0400 -#define VP_TV_STANDARD_SECAM_H 0x0800 -#define VP_TV_STANDARD_SECAM_K 0x1000 -#define VP_TV_STANDARD_SECAM_K1 0x2000 -#define VP_TV_STANDARD_SECAM_L 0x4000 -#define VP_TV_STANDARD_WIN_VGA 0x8000 -// and the rest -#define VP_TV_STANDARD_NTSC_433 0x00010000 -#define VP_TV_STANDARD_PAL_G 0x00020000 -#define VP_TV_STANDARD_PAL_60 0x00040000 -#define VP_TV_STANDARD_SECAM_L1 0x00080000 - -#define VP_TV_STANDARD_PAL_NC VP_TV_STANDARD_SECAM_L1 - - -#define BIOS_NTSC 0x01 // 00001 -#define BIOS_PAL 0x02 // (BGDHI) 00010 -#define BIOS_PAL_N 0x0a // 01010 -#define BIOS_PAL_M 0x12 // 10010 -#define BIOS_PAL_Nc 0x1a // 11010 - -#define BIOS_TVSTD_MASK (BIOS_NTSC | BIOS_PAL | BIOS_PAL_N | BIOS_PAL_M | BIOS_PAL_Nc) -#define BIOS_LCD_ACTIVE 0x04 -#define BIOS_TVOUT_ACTIVE 0x20 - - -#endif diff --git a/glide2x/h3/minihwc/win_mode.c b/glide2x/h3/minihwc/win_mode.c deleted file mode 100644 index c8be745..0000000 --- a/glide2x/h3/minihwc/win_mode.c +++ /dev/null @@ -1,682 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -#include -#include <3dfx.h> -#include -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include "qmodes.h" -#define IS_32 -#define Not_VxD -#include -#include -#include - -/* Windows */ -#define SEPARATOR '\\' -/* UNIX */ -#define SEPARATOR2 '/' - -/* - * parseFilename - * - * Return the file name portion of a filename/path. - */ - -static char * -_parseFilename(char *name) -{ - int i; - - if (name == NULL) - return NULL; - for(i = strlen(name); i >= 0; i--) - if ((name[i] == SEPARATOR) || - (name[i] == SEPARATOR2)) - return (name + i + 1); - return name; -} /* End of parseFilename*/ - - -static int _set_exclusive_relaxed; -static int _set_vidmode_relaxed; - -static BOOL FAR PASCAL -ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon ) -{ - DWORD *data = (DWORD*)ctx; - HMONITOR target = (HMONITOR)data[0]; - BOOL rv = DDENUMRET_OK; - - if ( target == hmon ) { - if ( guid ) { - fooGuid = *guid; - data[1] = (DWORD)&fooGuid; - } else { - /* guid for primary display device */ - data[1] = 0; - } - rv = DDENUMRET_CANCEL; - } - return rv; -} - -typedef struct _emcStruct { - FxU32 xRes, yRes, Refresh; - FxBool modeOK; -} EMCData; - -static HRESULT WINAPI -enumModesCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext) -{ - EMCData *emcData = (EMCData *) lpContext; - - GDBG_INFO(80, "enumModesCallbac:\n"); - GDBG_INFO(80, "\tsurfaceDesc->dwWidth == %d\n", surfaceDesc->dwWidth); - GDBG_INFO(80, "\tsurfaceDesc->dwHeight == %d\n", surfaceDesc->dwHeight); - GDBG_INFO(80, - "\tsurfaceDesc->dwRefreshRate == %d\n",surfaceDesc->dwRefreshRate); - GDBG_INFO(80, "\tsurfaceDesc->ddpfPixelFormat.dwRGBBitCount == %d\n", - surfaceDesc->ddpfPixelFormat.dwRGBBitCount); - if ( - (surfaceDesc->dwWidth == emcData->xRes) && - (surfaceDesc->dwHeight == emcData->yRes) && - (surfaceDesc->ddpfPixelFormat.dwRGBBitCount == 16) && - (surfaceDesc->dwRefreshRate == emcData->Refresh)) { - emcData->modeOK = FXTRUE; - return DDENUMRET_CANCEL; - } else - return DDENUMRET_OK; - -} /* enumModesCallback */ - -static void -msgModeSetFailure(HRESULT hResult) -{ - - if (hResult& DDERR_GENERIC) - GDBG_INFO(80, "Mode set failed due to DDERR_GENERIC\n"); - - if (hResult & DDERR_INVALIDMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDMODE\n"); - - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDOBJECT\n"); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO(80, "Mode set failed due to DDERR_INVALIDPARAMS\n"); - - if (hResult & DDERR_LOCKEDSURFACES) - GDBG_INFO(80, "Mode set failed due to DDERR_LOCKEDSURFACES\n"); - - if (hResult & DDERR_NOEXCLUSIVEMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_NOEXCLUSIVEMODE\n"); - - if (hResult & DDERR_SURFACEBUSY) - GDBG_INFO(80, "Mode set failed due to DDERR_SURFACEBUSY\n"); - - if (hResult & DDERR_UNSUPPORTED) - GDBG_INFO(80, "Mode set failed due to DDERR_UNSUPPORTED\n"); - - if (hResult & DDERR_UNSUPPORTEDMODE) - GDBG_INFO(80, "Mode set failed due to DDERR_UNSUPPORTEDMODE\n"); - - if (hResult & DDERR_WASSTILLDRAWING) - GDBG_INFO(80, "Mode set failed due to DDERR_WASSTILLDRAWING\n"); - -} /* msgModeSetFailure */ - -static void -msgEnumDisplayModes(hResult) -{ - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO(80, "DDERR_INVALIDOBJECT\n"); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO(80, "DDERR_INVALIDPARAMS\n"); - -} /* msgEnumDisplayModes */ - -#ifdef __WIN32__ -static char * -getModesRegPath() -{ - char *retVal = NULL; - OSVERSIONINFO ovi; - - ovi.dwOSVersionInfoSize = sizeof ( ovi ); - GetVersionEx ( &ovi ); - if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - GDBG_INFO(80, "OS == WNT\n"); - /* It is hardcoded on NT via Display Control code. see: - * $/devel/swtools/bansheecp2 */ - retVal = "SYSTEM\\CurrentControlSet\\Services\\3Dfx\\Device0\\modes\\"; - } else { - QDEVNODE QDevNode; - QIN Qin; - int status; - - GDBG_INFO(80, "OS == W9X\n"); - - Qin.dwSubFunc = QUERYDEVNODE; - { - HDC curDC = GetDC(NULL); - - status = ExtEscape ( curDC, QUERYESCMODE, - sizeof(Qin), (LPCSTR)&Qin, - sizeof(QDevNode), (LPSTR)&QDevNode ); - ReleaseDC(NULL, curDC); - } - - if ( status > 0 ) { - static char regPath[255]; - - CM_Get_DevNode_Key( QDevNode.dwDevNode, NULL, - ®Path, sizeof(regPath), - CM_REGISTRY_SOFTWARE ); - strcat(regPath, "\\modes\\"); - - retVal = regPath; - } - } - - return retVal; -} /* getRegPath */ -#endif - -FxBool -setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon ) -{ - LPGUID ddGuid = NULL; - HMODULE ddraw = NULL; - DDSURFACEDESC ddsd; - HRESULT hResult; - DEVMODE devMode; - FxU32 bpp = 16; - EMCData emcData; /* Enum Modes Callbac Data */ - - GDBG_INFO( 80, "setVideoMode sees hwnd %x\n", hwnd); - hwndApp = ( hwnd == NULL ) ? GetActiveWindow() : hwnd; - - if ( hwndApp == NULL ) { - GDBG_INFO( 80, "Couldn't get a valid window handle\n" ); - } - - ddGuid = NULL; - ddraw = GetModuleHandle( "ddraw.dll" ); - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - - - EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode); - - /* - ** Oh, this is lovely. What we have here is a failure to - ** communicate. If the current mode is exactly the same as the - ** mode in which Glide wishes to run, then the DirecDraw driver - ** doesn't get called when we restore the video (or on an alt-tab) - ** this would be fine, except Glide has its way with the video - ** overlya registers. So, if we detect this case, we ask DDraw for - ** an 8-bit display, and fix up vidProcCfg in the minihwc. - */ - if ((devMode.dmPelsWidth == (FxU32) xRes) && - (devMode.dmPelsHeight == (FxU32) yRes) && - (devMode.dmBitsPerPel == 16UL)) { - bpp = 8; - } - - checkSpecialList(); - if (lpDD == NULL) { - /* only create directdraw object once */ - if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - } - else GDBG_INFO(80, "DDraw Obj created!\n"); - if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD ) != DD_OK ) { - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - return FXFALSE; - } - else GDBG_INFO(80, "DDraw2 Obj created!\n"); - } - - /* Set Exclusive Mode, change resolution, */ - GDBG_INFO(80, "Setting Full screen exclusive mode!\n"); - GDBG_INFO(80, "Calling IDD2_SetCoop: 0x%x, 0x%x, 0x%x\n", lpDD, hwndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); - - if ( - (hResult = - IDirectDraw2_SetCooperativeLevel(lpDD, hwndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN )) - != DD_OK) { - GDBG_INFO(80, "Couldn't set cooperative level: " ); - if (hResult & DDERR_EXCLUSIVEMODEALREADYSET) - GDBG_INFO_MORE(80, "DDERR_EXCLUSIVEMODEALREADYSET\n" ); - - if (hResult & DDERR_HWNDALREADYSET) { - GDBG_INFO_MORE(80, "DDERR_HWNDALREADYSET\n" ); - if (hResult == DDERR_HWNDALREADYSET) - _set_exclusive_relaxed = 1; - } - if (hResult & DDERR_HWNDSUBCLASSED) - GDBG_INFO_MORE(80, "DDERR_HWNDSUBCLASSED\n" ); - - if (hResult & DDERR_INVALIDOBJECT) - GDBG_INFO_MORE(80, "DDERR_INVALIDOBJECT\n" ); - - if (hResult & DDERR_INVALIDPARAMS) - GDBG_INFO_MORE(80, "DDERR_INVALIDPARAMS\n" ); - - if (hResult & DDERR_OUTOFMEMORY) - GDBG_INFO_MORE(80, "DDERR_OUTOFMEMORY\n" ); - - if (!_set_exclusive_relaxed) - return FXFALSE; - } - - GDBG_INFO(80, "FSEM Set\n" ); - GDBG_INFO(80, "Enumerating Display Modes.\n"); - - /* Figure out if we can support the requested display mode. If not, - try to use the same x & y res, but the default refresh rate.*/ - - - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.dwRefreshRate = refresh; - - /* Set these for use by the callback */ - emcData.xRes = xRes; - emcData.yRes = yRes; - emcData.Refresh = refresh; - emcData.modeOK = FXFALSE; - - hResult = IDirectDraw2_EnumDisplayModes(lpDD, 0, &ddsd, - (LPVOID) &emcData, enumModesCallback); - - if (hResult != DD_OK) { - GDBG_INFO(80, "Warning: EnumDisplayModes failed due to: \n"); - msgEnumDisplayModes(hResult); - } - - GDBG_INFO(80, "Setting Display Mode!\n"); - - if (emcData.modeOK) { - GDBG_INFO(80, "Found mode %dx%d. Attempting at %dHz\n", xRes, - yRes, refresh); - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, bpp, refresh, 0); - if (hResult != DD_OK) { - GDBG_INFO(80, "Couldn't set display mode\n" ); - msgModeSetFailure(hResult); - GDBG_INFO(80, "Retrying at default resolution\n"); - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0, 0 ); - - if (hResult != DD_OK) { - GDBG_INFO(80, "Setting video mode %dx%d@default refresh failed!\n", - xRes, yRes); - msgModeSetFailure(hResult); - - if (!_set_vidmode_relaxed) { - GDBG_INFO(80, "Returning FXFALSE\n"); - return FXFALSE; - } else { - GDBG_INFO(80, "Continuing operation due to relaxation condition\n"); - } - } - } - GDBG_INFO(80, "Display Mode Set\n" ); - } else { - - GDBG_INFO(80, "Did not find mode %dx%d@any refresh\n", xRes, yRes); - GDBG_INFO(80, "Setting video mode %dx%d@default refresh\n", xRes, yRes); - - /* - ** This is really a hack here. We use the registry key entry to work - ** around DDraw refresh rate problem. - */ - { - static char *regPath = NULL; - char mpath[256], mpath_8[256], tmp[32]; - FxU32 reg_flag = 1; - if (regPath == NULL) { - regPath = getModesRegPath(); - } - if ((regPath) && (bpp == 8)) { - HKEY hKey, hKey8; - FxU32 retVal; - DWORD type, szData, type8, szData8; - static char strval[255], strval8[255]; - - /* get the current bpp path */ - szData = sizeof(strval); - strcpy(mpath, regPath); - sprintf(tmp, "%d\\%d,%d",devMode.dmBitsPerPel,xRes,yRes); - strcat(mpath, tmp); - /* get the 8 bpp path */ - szData8 = sizeof(strval8); - strcpy(mpath_8, regPath); - sprintf(tmp, "8\\%d,%d",xRes,yRes); - strcat(mpath_8, tmp); - /* - ** Get the original refresh rate from registry key - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, "RefreshRate", NULL, &type, strval, - &szData) == ERROR_SUCCESS) { - /* - ** overwrite 8 bit registry with glide refresh rate and set - ** the display mode. this is a workaround of the DDraw - ** refresh rate problem - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath_8, &hKey8) - == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey8, "RefreshRate", NULL, &type8, - strval8, &szData8) == ERROR_SUCCESS) { - retVal = 1; - } else { - retVal = 0; - } - RegSetValueEx(hKey8, "RefreshRate", 0, REG_SZ, strval, - strlen(strval)); - hResult = IDirectDraw2_SetDisplayMode(lpDD, xRes, yRes, - bpp, 0, 0); - reg_flag = 0; - /* - ** reset the original refresh rate - */ - if (retVal) { - RegSetValueEx(hKey8, "RefreshRate", 0, - REG_SZ, strval8, strlen(strval8)); - } - RegCloseKey(hKey8); - /* - ** delete the key if the refresh rate isn't there in the - ** first place - */ - if (!retVal) { - RegDeleteValue(hKey8, "RefreshRate" ); - RegDeleteKey(hKey8, "RefreshRate" ); - } - RegCloseKey(hKey); - } - } else { - /* - ** We did not find the "RefreshRate" key in the - ** devMode.dmBitsPerPel node so let's see if it exists for - ** this resolution under the 8 bpp node: - */ - if (RegOpenKey(HKEY_LOCAL_MACHINE, mpath_8, &hKey8) - == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey8, "RefreshRate", NULL, &type8, strval8, - &szData8) == ERROR_SUCCESS) { - retVal = 1; - } else { - retVal = 0; - } - RegSetValueEx(hKey8, "RefreshRate", 0, REG_SZ, strval, - strlen(strval)); - hResult = IDirectDraw2_SetDisplayMode(lpDD, xRes, yRes, - bpp, 0, 0); - reg_flag = 0; - /* - ** reset the original refresh rate - */ - if (retVal) { - RegSetValueEx(hKey8, "RefreshRate", 0, - REG_SZ, strval8, strlen(strval8)); - } - RegCloseKey(hKey8); - /* - ** delete the key if the refresh rate isn't there in the - ** first place - */ - if (!retVal) { - RegDeleteValue(hKey8, "RefreshRate" ); - RegDeleteKey(hKey8, "RefreshRate" ); - } - RegCloseKey(hKey); - } - } - } - } - if (reg_flag) - hResult = IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, bpp, 0, 0 ); - } - - if (hResult != DD_OK) { - GDBG_INFO(80, "Failed!\n", - xRes, yRes); - msgModeSetFailure(hResult); - if (!_set_vidmode_relaxed) { - GDBG_INFO(80, "Returning FXFALSE\n"); - return FXFALSE; - } else { - GDBG_INFO(80, "Continuing operation due to relaxation condition\n"); - } - } - } - - return FXTRUE; - -} /* setVideoMode */ - -void -resetVideo( void ) -{ -#define FN_NAME "resetVideo" - if ( lpDD ) { - IDirectDraw2_RestoreDisplayMode( lpDD ); - GDBG_INFO(80, "%s: Restored Display Mode!\n", FN_NAME); - IDirectDraw2_SetCooperativeLevel( lpDD, hwndApp, DDSCL_NORMAL ); - GDBG_INFO(80, "%s: Set cooperative level!\n", FN_NAME); - IDirectDraw2_Release( lpDD ); - GDBG_INFO(80, "%s: Released lpDD!\n", FN_NAME); - - if ( lpDD1 ) { - IDirectDraw_Release( lpDD1 ); - GDBG_INFO(80, "%s: Released lpDD1!\n", FN_NAME); - } - } - lpDD = NULL; - lpDD1 = NULL; - - return; -#undef FN_NAME -} /* resetVideo */ - -typedef struct WidthHeight_s { - FxU32 width; - FxU32 height; -} WidthHeight_t; - -static WidthHeight_t widthHeightByResolution[] = { - {320, 200}, /* GR_RESOLUTION_320x200 */ - {320, 240}, /* GR_RESOLUTION_320x240 */ - {400, 256}, /* GR_RESOLUTION_400x256 */ - {512, 384}, /* GR_RESOLUTION_512x384 */ - {640, 200}, /* GR_RESOLUTION_640x200 */ - {640, 350}, /* GR_RESOLUTION_640x350 */ - {640, 400}, /* GR_RESOLUTION_640x400 */ - {640, 480}, /* GR_RESOLUTION_640x480 */ - {800, 600}, /* GR_RESOLUTION_800x600 */ - {960, 720}, /* GR_RESOLUTION_960x720 */ - {856, 480}, /* GR_RESOLUTION_856x480 */ - {512, 256}, /* GR_RESOLUTION_512x256 */ - {1024, 768}, /* GR_RESOLUTION_1024x768 */ - {1280, 1024}, /* GR_RESOLUTION_1280x1024 */ - {1600, 1200}, /* GR_RESOLUTION_1600x1200 */ - {400, 300}, /* GR_RESOLUTION_400x300 */ - {1152, 864}, /* GR_RESOLUTION_1152x864 */ - {1280, 960}, /* GR_RESOLUTION_1280x960 */ - {1600, 1024}, /* GR_RESOLUTION_1600x1024 */ - {1792, 1344}, /* GR_RESOLUTION_1792x1344 */ - {1856, 1392}, /* GR_RESOLUTION_1856x1392 */ - {1920, 1440}, /* GR_RESOLUTION_1920x1440 */ - {2048, 1536}, /* GR_RESOLUTION_2048x1536 */ - {2048, 2048} /* GR_RESOLUTION_2048x2048 */ -}; - -static char *resNames[] = { - "GR_RESOLUTION_320x200", - "GR_RESOLUTION_320x240", - "GR_RESOLUTION_400x256", - "GR_RESOLUTION_512x384", - "GR_RESOLUTION_640x200", - "GR_RESOLUTION_640x350", - "GR_RESOLUTION_640x400", - "GR_RESOLUTION_640x480", - "GR_RESOLUTION_800x600", - "GR_RESOLUTION_960x720", - "GR_RESOLUTION_856x480", - "GR_RESOLUTION_512x256", - "GR_RESOLUTION_1024x768", - "GR_RESOLUTION_1280x1024", - "GR_RESOLUTION_1600x1200", - "GR_RESOLUTION_400x300", - "GR_RESOLUTION_1152x864", - "GR_RESOLUTION_1280x960", - "GR_RESOLUTION_1600x1024", - "GR_RESOLUTION_1792x1344", - "GR_RESOLUTION_1856x1392", - "GR_RESOLUTION_1920x1440", - "GR_RESOLUTION_2048x1536", - "GR_RESOLUTION_2048x2048" -}; - - -static HRESULT WINAPI -checkResEMCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext) -{ -#define FN_NAME "checkResEMCallback" - FxBool *resList = (FxBool *) lpContext; - int res; - - GDBG_INFO(80, FN_NAME ":\n"); - GDBG_INFO(80, FN_NAME "\tsurfaceDesc->dwWidth == %d\n",surfaceDesc->dwWidth); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->dwHeight == %d\n",surfaceDesc->dwHeight); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->dwRefreshRate == %d\n",surfaceDesc->dwRefreshRate); - GDBG_INFO(80, FN_NAME - "\tsurfaceDesc->ddpfPixelFormat.dwRGBBitCount == %d\n", - surfaceDesc->ddpfPixelFormat.dwRGBBitCount); - - for ( - res = 0x0; - res < (sizeof(widthHeightByResolution) / sizeof(WidthHeight_t)); - res++) { - if ( - (surfaceDesc->dwWidth == widthHeightByResolution[res].width) && - (surfaceDesc->dwHeight == widthHeightByResolution[res].height) - ) { - resList[res] = FXTRUE; - return DDENUMRET_OK; - } - } - - return DDENUMRET_OK; -#undef FN_NAME -} /* checkResEMCallback */ - - -/* -** checkResolution - check to see if a given resolution is available -** -** This routine may only be called once and IT MUST BE CALLED FROM -** hwcInit(). -** Any other useage will be very very bad, as it will mess with the -** app's DirectDraw context. -*/ -FxBool -checkResolutions(FxBool *supportedByResolution, void *hmon) -{ -#define FN_NAME "checkResolution" - LPGUID ddGuid = NULL; - HMODULE ddraw = NULL; - HRESULT hResult; - - hwndApp = GetActiveWindow(); - - if ( hwndApp == NULL ) { - GDBG_INFO( 80, "Couldn't get a valid window handle\n" ); - } - - ddGuid = NULL; - ddraw = GetModuleHandle( "ddraw.dll" ); - if ( ddraw ) { - LPDIRECTDRAWENUMERATEEXA ddEnumEx; - ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); - if ( ddEnumEx ) { - DWORD data[2]; - data[0] = (DWORD)hmon; - data[1] = 0; - ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); - if ( data[1] ) { - ddGuid = (LPGUID)data[1]; - } - } - } - - checkSpecialList(); - if (lpDD == NULL) { - /* only create directdraw object once */ - if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - } - else GDBG_INFO(80, "DDraw Obj created!\n"); - if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD ) != DD_OK ) { - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - GDBG_INFO(80, "DDraw Obj Create Failed!\n"); - return FXFALSE; - } - else GDBG_INFO(80, "DDraw2 Obj created!\n"); - } - - hResult = IDirectDraw2_EnumDisplayModes(lpDD, 0, NULL, - (LPVOID) supportedByResolution, - checkResEMCallback); - - resetVideo(); - return FXTRUE; -#undef FN_NAME -} /* checkResolutions */ diff --git a/glide2x/makefile.linux b/glide2x/makefile.linux deleted file mode 100644 index ccb3b16..0000000 --- a/glide2x/makefile.linux +++ /dev/null @@ -1,62 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -export TOPDIR := $(shell pwd) - -THISDIR = devel -SUBDIRS = swlibs - -# We branched glide starting w/ Voodoo2(aka CVG) so -# make sure that the right thing happens. If this sort -# of branching happens again then add it to the list below. -ifeq ($(FX_GLIDE_HW),sst1) - SUBDIRS += sst1 -else - ifeq ($(FX_GLIDE_HW),sst96) - SUBDIRS += sst1 - else - ifeq ($(FX_GLIDE_HW),cvg) - SUBDIRS += cvg - else - ifeq ($(FX_GLIDE_HW),h3) - SUBDIRS += h3 - else - FX_GLIDE_HW = h3 - SUBDIRS += h3 - endif - endif - endif -endif - -# -# Other variables we need to set -# -export FX_HW_PROJECTS=glide -ifeq ($(HAL_HW),) - export HAL_HW=1 -endif -export FX_NO_GET_BOF=1 -export FX_GLIDE_HW -export SCRIPTDIR=$(TOPDIR)/swlibs/include/make - -include swlibs/include/make/3dfx.linux.mak diff --git a/glide2x/sst1/bin/makefile.linux b/glide2x/sst1/bin/makefile.linux deleted file mode 100644 index 360d40d..0000000 --- a/glide2x/sst1/bin/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(patsubst CVS,,$(patsubst makefile%,,$(wildcard *))) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/bin/makefile.unix b/glide2x/sst1/bin/makefile.unix deleted file mode 100644 index 1007a59..0000000 --- a/glide2x/sst1/bin/makefile.unix +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(patsubst makefile%,,$(wildcard *)) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/binsrc/makefile.linux b/glide2x/sst1/binsrc/makefile.linux deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/sst1/binsrc/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/binsrc/makefile.unix b/glide2x/sst1/binsrc/makefile.unix deleted file mode 100644 index 7316f8b..0000000 --- a/glide2x/sst1/binsrc/makefile.unix +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/makefile.linux b/glide2x/sst1/cmd/makefile.linux deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/sst1/cmd/makefile.linux +++ /dev/null @@ -1,27 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = cmd -SUBDIRS = pass - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/cmd/makefile.unix b/glide2x/sst1/cmd/makefile.unix deleted file mode 100644 index 84a17c5..0000000 --- a/glide2x/sst1/cmd/makefile.unix +++ /dev/null @@ -1,27 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -THISDIR = cmd -SUBDIRS = pass - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/cmd/pass/makefile.linux b/glide2x/sst1/cmd/pass/makefile.linux deleted file mode 100644 index 82d583c..0000000 --- a/glide2x/sst1/cmd/pass/makefile.linux +++ /dev/null @@ -1,40 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -LCOPTS = -LCINCS = -I$(BUILD_ROOT_HW)/include - -# sources -CFILES = pass.c -LLDLIBS = -L$(BUILD_ROOT_HW)/lib -linit -lsst1 \ - -L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci - - -# targets -PROGRAM = pass -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/pass/makefile.unix b/glide2x/sst1/cmd/pass/makefile.unix deleted file mode 100644 index e787ba3..0000000 --- a/glide2x/sst1/cmd/pass/makefile.unix +++ /dev/null @@ -1,40 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -LCOPTS = -LCINCS = -I$(BUILD_ROOT_SST1)/include - -# sources -CFILES = pass.c -LLDLIBS = -L$(BUILD_ROOT_SST1)/lib -linit -lsst1 \ - -L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci - - -# targets -PROGRAM = pass -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/cmd/pass/pass.c b/glide2x/sst1/cmd/pass/pass.c deleted file mode 100644 index fcd9fcd..0000000 --- a/glide2x/sst1/cmd/pass/pass.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#include -#include - -#include <3dfx.h> -#include -#include - -/* This should be exported, but isn't yet */ -#define SST1INIT_MAX_BOARDS 16 - -int main (int argc[], char* argv[]) -{ - FxU32* sst[SST1INIT_MAX_BOARDS]; - int num_sst; - int i; - - /* Map all the boards in the system */ - num_sst = 0; - do { - sst[num_sst] = sst1InitMapBoard (num_sst); - } while (sst[num_sst++] != NULL); - - /* Shut them all down */ - for (i = 0; i < num_sst; i += 1) - sst1InitVgaPassCtrl(sst[i], 1); - - return 0; -} diff --git a/glide2x/sst1/glide/makefile.linux b/glide2x/sst1/glide/makefile.linux deleted file mode 100644 index a00e768..0000000 --- a/glide2x/sst1/glide/makefile.linux +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = glide -SUBDIRS = src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/glide/makefile.unix b/glide2x/sst1/glide/makefile.unix deleted file mode 100644 index a00e768..0000000 --- a/glide2x/sst1/glide/makefile.unix +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = glide -SUBDIRS = src tests - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/glide/src/banner.inc b/glide2x/sst1/glide/src/banner.inc deleted file mode 100644 index 4401d19..0000000 --- a/glide2x/sst1/glide/src/banner.inc +++ /dev/null @@ -1,122 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - - -static int banner_width = 180; -static int banner_height = 90; -static unsigned short banner_data[] = { -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52aa, 0xad34, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xacee, 0x39a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x93ea, 0xd5d0, 0x944d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9383, 0xd506, 0x8beb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc63, 0xd506, 0xd58d, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a82, 0xd4e4, 0xd504, 0xc54d, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5202, 0xd4e3, 0xd4e3, 0xd505, 0xcd6d, 0x5aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xc483, 0xd503, 0xd504, 0xd569, 0x8baa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9364, 0xd4e2, 0xd4e2, 0xd4e2, 0xd505, 0xc54e, 0x4206, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e3, 0xd504, 0xd546, 0xd504, 0xd525, 0xc54d, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x93a4, 0xcd4c, 0x20e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd504, 0xd547, 0xd548, 0xd504, 0xd526, 0xbd2f, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd504, 0xd56a, 0xd634, 0xd569, 0xd525, 0xdd69, 0x8369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c3, 0xb487, 0xd504, 0xd528, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0x6ac4, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528a, 0x39e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd526, 0xd548, 0xd5cf, 0xd613, 0xd527, 0xd505, 0xd548, 0xacae, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49a1, 0xcce5, 0xd56a, 0xde12, 0xde98, 0xddce, 0xd548, 0xdd04, 0xc52e, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c5, 0xcce7, 0xd504, 0xd503, 0xd527, 0x7b48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0x9b83, 0xc4a4, 0xac23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5247, 0xc570, 0x736a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd505, 0xd58c, 0xd634, 0xd678, 0xd5f1, 0xd548, 0xd504, 0xd58b, 0x942c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xb444, 0xdd48, 0xddf0, 0xde98, 0xdeb9, 0xde55, 0xdd6b, 0xdd03, 0xdd8b, 0x7349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2902, 0x9be6, 0xd527, 0xd524, 0xd524, 0xdd03, 0xd526, 0x9c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x72c4, 0xac25, 0xd4e3, 0xd4e3, 0xd4e3, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd5cf, 0xacef, 0x4227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xd5f1, 0xd698, 0xd6ba, 0xd699, 0xd5cf, 0xd547, 0xd525, 0xd5ae, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b43, 0xdd04, 0xddae, 0xde76, 0xdeda, 0xdeda, 0xdeba, 0xddcf, 0xdd25, 0xdd47, 0xbd0c, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a04, 0xbc86, 0xdd24, 0xdd26, 0xddcf, 0xddcf, 0xdd25, 0xdd26, 0xb4ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x8b64, 0xc4a6, 0xd503, 0xd4e3, 0xd4e3, 0xd4e3, 0xd507, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9362, 0xd4e3, 0xd56b, 0xcdb2, 0x83cc, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd525, 0xd548, 0xd613, 0xd6b9, 0xd6ba, 0xd6ba, 0xd677, 0xddae, 0xd527, 0xdd25, 0xd58d, 0x62c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd505, 0xdd68, 0xde34, 0xdeda, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd8a, 0xdd25, 0xdd8c, 0x6b09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xcd06, 0xdd24, 0xdd68, 0xde33, 0xdeb9, 0xde34, 0xdd46, 0xdd25, 0xcd49, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6aa4, 0xa404, 0xd4e4, 0xd504, 0xd549, 0xd5ae, 0xd5ad, 0xd548, 0xd505, 0xbc86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xd4e2, 0xd4e3, 0xd506, 0xd58c, 0xb531, 0x5248, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd504, 0xd5ad, 0xd655, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xde76, 0xddae, 0xdd04, 0xdd47, 0xc54d, 0x4a06, 0x0000, 0x0000, 0x0000, 0x2921, 0xbc84, 0xdd46, 0xde11, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb8, 0xddf0, 0xdd46, 0xdd47, 0xbcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x9c07, 0xdd26, 0xdd26, 0xdd8a, 0xde55, 0xdeb9, 0xdedb, 0xde55, 0xdd8b, 0xdd25, 0xdd47, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x8b65, 0xbcc8, 0xd526, 0xd526, 0xd56a, 0xd612, 0xd676, 0xd698, 0xd5f2, 0xd525, 0xd506, 0x93c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xc462, 0xd4e3, 0xd503, 0xd504, 0xd527, 0xcdd1, 0x8c0d, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd505, 0xd5f1, 0xde98, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdeba, 0xde55, 0xdd8c, 0xdd25, 0xdd26, 0xbd2e, 0x2943, 0x0000, 0x0000, 0x9b83, 0xdd26, 0xddcd, 0xde77, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd89, 0xdd25, 0xddad, 0x6ae9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0xbca8, 0xdd46, 0xdd48, 0xddcf, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xde97, 0xddee, 0xdd25, 0xdd46, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0xa3e6, 0xcce5, 0xd504, 0xd547, 0xd58c, 0xd633, 0xd698, 0xd6ba, 0xd6ba, 0xd678, 0xd5d0, 0xd504, 0xd527, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b82, 0xd548, 0xd58b, 0xd549, 0xd4e3, 0xd505, 0xd58c, 0xbd51, 0x5aa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a24, 0xd526, 0xd526, 0xde35, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde34, 0xdd6a, 0xdd25, 0xdd26, 0xacac, 0x1081, 0x6aa3, 0xd504, 0xdd48, 0xde76, 0xdeda, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd25, 0xdd47, 0xb4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b25, 0xd507, 0xdd24, 0xdd8a, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xde97, 0xddef, 0xdd46, 0xdd46, 0x9c2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x7b26, 0xbc86, 0xd525, 0xdd04, 0xd546, 0xddd0, 0xde55, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd634, 0xd58c, 0xd504, 0xc4e9, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd527, 0xd5d0, 0xd656, 0xd5ad, 0xd527, 0xd505, 0xd527, 0xd5b0, 0x944d, 0x2924, 0x0000, 0x0000, 0x0000, 0x0000, 0x9384, 0xd525, 0xd58a, 0xde56, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xdd48, 0xdd24, 0xdd24, 0xa3c3, 0xc4a4, 0xdd48, 0xde10, 0xdeb9, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xde54, 0xdd68, 0xdd26, 0xdd8a, 0x5a87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xa407, 0xdd26, 0xdd45, 0xddab, 0xde55, 0xdeda, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdeb8, 0xde32, 0xdd46, 0xdd25, 0xb4cb, 0x0000, 0x0000, 0x0000, 0x5224, 0x9be7, 0xcce7, 0xdd04, 0xdd47, 0xdd8b, 0xde11, 0xde97, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6b9, 0xd612, 0xd569, 0xd504, 0xa3e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0xc4c5, 0xd5af, 0xd698, 0xd698, 0xd634, 0xd58c, 0xd525, 0xd526, 0xd56a, 0xbd70, 0x62e9, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xddf0, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeb9, 0xde32, 0xdd48, 0xdd25, 0xdd24, 0xdd46, 0xddcd, 0xdeb8, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xde97, 0xddee, 0xdd46, 0xdd46, 0xacad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5224, 0xc4e9, 0xdd25, 0xdd47, 0xde10, 0xde97, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xdd68, 0xdd25, 0xcd29, 0x3142, 0x7306, 0xb467, 0xd527, 0xdd25, 0xdd48, 0xddce, 0xde54, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd5d0, 0xd546, 0xd526, 0x7305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c2, 0x39a5, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e4, 0xd56b, 0xd655, 0xd6ba, 0xd6ba, 0xd698, 0xd5f1, 0xd549, 0xd504, 0xd525, 0xd5ad, 0x9c6d, 0x3163, 0x5a23, 0xd525, 0xdd47, 0xde55, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde32, 0xddce, 0xddcd, 0xde11, 0xde97, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde54, 0xdd47, 0xdd46, 0xddcd, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x8347, 0xd527, 0xdd46, 0xdd8a, 0xde32, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddab, 0xdd46, 0xdd24, 0xcd06, 0xdd46, 0xdd46, 0xdd8b, 0xddcd, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd654, 0xd58b, 0xd525, 0xcd4a, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x5a65, 0x7b27, 0x9bc7, 0xac46, 0xc4a5, 0x93e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a2, 0xd548, 0xd5f1, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6b9, 0xd656, 0xd5ae, 0xd525, 0xd504, 0xdd47, 0xc4c6, 0xb444, 0xdd26, 0xdd8a, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefa, 0xde97, 0xddab, 0xdd46, 0xdd67, 0xa48d, 0x0000, 0x0000, 0x3163, 0xac27, 0xdd68, 0xdd45, 0xddcd, 0xde75, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddcd, 0xdd47, 0xdd24, 0xdd67, 0xddac, 0xde12, 0xde76, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde12, 0xd569, 0xd526, 0xb468, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0x4a26, 0x7307, 0x93a6, 0xa426, 0xbca7, 0xd506, 0xd4e3, 0xd4e2, 0xd4e2, 0xd4e3, 0xb445, 0x18a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0xcce5, 0xd5ad, 0xd6b9, 0xd6ba, 0xd6ba, 0xd6ba, 0xdeba, 0xde99, 0xd654, 0xd56a, 0xd525, 0xdd03, 0xdd03, 0xdd48, 0xddef, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde52, 0xdd68, 0xdd45, 0xd5af, 0x4a05, 0x5a65, 0xc4e7, 0xdd46, 0xdd68, 0xddef, 0xde96, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xddef, 0xde31, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xddce, 0xdd25, 0xd547, 0x8366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39a4, 0x62c7, 0x8388, 0x9c29, 0xb487, 0xccc5, 0xd507, 0xd504, 0xd504, 0xd505, 0xd527, 0xd528, 0xd548, 0xd505, 0xd4e2, 0xc4c6, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xabe2, 0xd56b, 0xd678, 0xd6ba, 0xdeba, 0xd6ba, 0xdeda, 0xdeda, 0xdeba, 0xde98, 0xd5f0, 0xddad, 0xdd8c, 0xddcf, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xddab, 0xdd45, 0xdd68, 0xc4a7, 0xd548, 0xdd46, 0xdd89, 0xde32, 0xe6d9, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xdd8c, 0xdd04, 0xd56b, 0x4a04, 0x0000, 0x2944, 0x5a87, 0x7b48, 0x93e7, 0xac68, 0xc4ea, 0xd56a, 0xd527, 0xd525, 0xd505, 0xd526, 0xd549, 0xd58c, 0xd5d0, 0xd5f3, 0xd635, 0xd656, 0xd655, 0xd58c, 0xd506, 0xccc4, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae2, 0xd549, 0xd634, 0xd6b9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeda, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe6fa, 0xde31, 0xdd89, 0xe546, 0xdd45, 0xe567, 0xddaa, 0xe696, 0xe6fa, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde54, 0xdd6b, 0xdd03, 0xcd08, 0xa448, 0xbcc9, 0xd528, 0xd526, 0xd525, 0xd505, 0xd505, 0xd526, 0xd528, 0xd56a, 0xd5ce, 0xd633, 0xd677, 0xd699, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd677, 0xd5cf, 0xd506, 0xd505, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a48, 0xa48c, 0x940a, 0x734a, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xd506, 0xd5cf, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xad75, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0x94b2, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe6d9, 0xe653, 0xe5ed, 0xe5cc, 0xe631, 0xe6b8, 0xe6fb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde10, 0xdd49, 0xdd03, 0xdd03, 0xdd04, 0xdd27, 0xd547, 0xd569, 0xd5ae, 0xddf1, 0xd634, 0xd676, 0xd698, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd678, 0xd5f1, 0xd506, 0xd504, 0xa427, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a43, 0xc4a5, 0xd505, 0xd56c, 0xbd2d, 0xa4ae, 0x83cc, 0x5ac8, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb446, 0xddab, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x738e, 0xa534, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde75, 0xddce, 0xddcd, 0xde11, 0xde54, 0xde55, 0xde77, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd699, 0xd5f2, 0xd547, 0xd504, 0xbc85, 0x2922, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc482, 0xd4e3, 0xd504, 0xd505, 0xd527, 0xd56b, 0xcd90, 0xb4cd, 0x942c, 0x734b, 0x39c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8323, 0xdd47, 0xde54, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x5aeb, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd613, 0xd56a, 0xd505, 0xcd08, 0x5204, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4a3, 0xd526, 0xd569, 0xd526, 0xd505, 0xd505, 0xd504, 0xd525, 0xd548, 0xd5ae, 0xbd4e, 0xa48e, 0x838a, 0x5a45, 0x51e2, 0xd506, 0xddf0, 0xde97, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xb5b6, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xad55, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd655, 0xd58d, 0xd503, 0xd549, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4c6, 0xd5ae, 0xd677, 0xd655, 0xd612, 0xd5cf, 0xd56a, 0xd525, 0xd503, 0xd503, 0xd504, 0xd526, 0xd547, 0xccc4, 0xd505, 0xddce, 0xde77, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0x738e, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xdedb, 0xd6ba, 0xd677, 0xd58c, 0xd526, 0xd505, 0x93c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xccc6, 0xd5cd, 0xd677, 0xd699, 0xd6ba, 0xd6b9, 0xd699, 0xde77, 0xd611, 0xd58b, 0xdd47, 0xdd26, 0xdd26, 0xdd69, 0xde33, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xd69a, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xa514, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd698, 0xd5ad, 0xd526, 0xd505, 0xb48a, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc6, 0xd5f1, 0xd677, 0xd6ba, 0xdeba, 0xd6ba, 0xdeba, 0xdeba, 0xdeb9, 0xde98, 0xde55, 0xde76, 0xde97, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xd6ba, 0x8430, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0xad55, 0xe71c, 0xe71c, 0xe71c, 0xad75, 0x4228, 0x4a49, 0x7bcf, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd611, 0xd527, 0xd504, 0xc52b, 0x39a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc5, 0xd5f1, 0xd698, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x7bcf, 0xe71c, 0xe71c, 0xe71c, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x8c71, 0xbdf7, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde33, 0xd547, 0xd525, 0xcd28, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce7, 0xd5f1, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xc638, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xb5b6, 0x9cd3, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x52aa, 0xce59, 0xe71c, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0xa514, 0xce79, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x9cf3, 0x4a49, 0x4a49, 0x9cf3, 0xbdf7, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde34, 0xdd69, 0xdd25, 0xd569, 0x8389, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xd5f0, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xc638, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0xbdf7, 0xe73c, 0x8c71, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x7bef, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xce79, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xad55, 0x9cf3, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde55, 0xddad, 0xdd04, 0xdd26, 0xb4cb, 0x3185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcd09, 0xde11, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xbdd7, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x9cf3, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0xb5b6, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x4a69, 0x4a69, 0x632c, 0x4a49, 0x4a49, 0x528a, 0x4a49, 0x630c, 0x4228, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xddf0, 0xdd47, 0xdd04, 0xdd26, 0xd58b, 0xd5d0, 0xc56f, 0xbcee, 0xa46c, 0x940b, 0x838a, 0x6b09, 0x5247, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b03, 0xdd47, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xbdd7, 0xbdd7, 0xbdd7, 0x9cd3, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x8c71, 0x9cf3, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0xc638, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x4a69, 0x7bef, 0x4a69, 0x632c, 0x4a69, 0x630c, 0x4a49, 0x7bcf, 0x4a49, 0x8c71, 0x630c, 0x4228, 0xe71c, 0xd6ba, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeba, 0xde75, 0xddef, 0xdd69, 0xdd26, 0xdd26, 0xdd26, 0xdd05, 0xd505, 0xd525, 0xd526, 0xd526, 0xd548, 0xd549, 0xd56c, 0xc4e8, 0xb4a9, 0xa44a, 0x93eb, 0x7b6a, 0x62c8, 0x41e5, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0x8b86, 0xbc86, 0xd505, 0xdd26, 0xddce, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x9492, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0xbdd7, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0x9492, 0xb596, 0xc618, 0x7bef, 0x4a69, 0x7bef, 0x4a49, 0x8c71, 0x4a49, 0x4a49, 0xad75, 0x4a49, 0x7bcf, 0x9cf3, 0x4228, 0x8c51, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde76, 0xde54, 0xde33, 0xd611, 0xd5d0, 0xd5ae, 0xd58d, 0xd56b, 0xd549, 0xd527, 0xd525, 0xd504, 0xd4e3, 0xd4e3, 0xd504, 0xd504, 0xd506, 0xbc65, 0x4a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x9385, 0xbc65, 0xd527, 0xdd26, 0xdd46, 0xddad, 0xde55, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x630c, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0xad55, 0xef7d, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xd69a, 0xef5d, 0xef5d, 0xc618, 0xc618, 0x4a69, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xce79, 0x9cf3, 0x4228, 0x4228, 0x630c, 0x4228, 0x9cd3, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeba, 0xd6ba, 0xd6b9, 0xd699, 0xd698, 0xd678, 0xd677, 0xd656, 0xd5f2, 0xd548, 0xd504, 0xd4c2, 0x9bc4, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x93a6, 0xbca6, 0xd525, 0xd526, 0xdd47, 0xdd8c, 0xde11, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xd69a, 0xce59, 0xef5d, 0x9492, 0x8c71, 0x4a49, 0x4a49, 0xbdf7, 0xbdf7, 0x4228, 0x4228, 0x4228, 0x73ae, 0x4228, 0x4208, 0x73ae, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6ba, 0xd6ba, 0xd698, 0xd634, 0xd56a, 0xd505, 0xbc85, 0x6262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x5a65, 0x93a4, 0xc4a5, 0xd525, 0xd505, 0xd548, 0xd5ad, 0xd633, 0xde77, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x39e7, 0x2165, 0x2185, 0x2186, 0x21c6, 0x2a07, 0x3228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x94b2, 0x8410, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdd7, 0x52aa, 0x52aa, 0xa534, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xc618, 0x8c71, 0x7bcf, 0x4a49, 0x4228, 0x4228, 0x8c71, 0xe73c, 0x4228, 0x630c, 0x4208, 0x8c51, 0x8c51, 0xad55, 0xe71c, 0xc638, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xd6ba, 0xdeba, 0xd656, 0xd5ce, 0xd527, 0xd4e5, 0x9ba3, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6264, 0x9bc5, 0xc4a5, 0xd505, 0xd525, 0xd549, 0xd5ae, 0xd634, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x1904, 0x08e3, 0x0903, 0x0944, 0x0985, 0x09c6, 0x09e6, 0x09e6, 0x21e7, 0x3a08, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x8410, 0xef7d, 0xef7d, 0xd6ba, 0xad55, 0x8430, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0x5aeb, 0x630c, 0x5aeb, 0xbdf7, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0x5acb, 0x52aa, 0x52aa, 0x52aa, 0x528a, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x8c71, 0xbdf7, 0x8430, 0x7bcf, 0x8c71, 0x4228, 0x73ae, 0x4228, 0x630c, 0x4208, 0x9cd3, 0x4208, 0x4208, 0xce79, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd698, 0xd612, 0xd56b, 0xd504, 0xbc85, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6a83, 0x9bc4, 0xc4c6, 0xd505, 0xd526, 0xd569, 0xd5cf, 0xd655, 0xd698, 0xd6b9, 0xdeba, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x2986, 0x08c3, 0x08e3, 0x0903, 0x0924, 0x0965, 0x09c6, 0x09e7, 0x09e6, 0x09c6, 0x0985, 0x31c7, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4228, 0xad75, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdf7, 0x8c51, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x8c71, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xad75, 0x5acb, 0x5acb, 0x4228, 0x3186, 0x39c7, 0xb596, 0xdefb, 0xef5d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xbdd7, 0x9492, 0x4228, 0x4228, 0x4228, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xbdf7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xd5ad, 0xdd27, 0xd506, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x9bc5, 0xc4c5, 0xd4e3, 0xd4e3, 0xd505, 0xd58c, 0xd633, 0xd698, 0xd6b9, 0xd6ba, 0xd6ba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xb5b6, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x08e3, 0x08c3, 0x08c3, 0x0903, 0x0924, 0x0965, 0x09a6, 0x09e6, 0x09e7, 0x09c6, 0x0985, 0x0924, 0x4228, 0x4a69, 0x528a, 0x39e7, 0x08c2, 0x2165, 0x632c, 0x8c92, 0xb5b6, 0xd69a, 0xef7d, 0xf7be, 0xf7be, 0x9cf3, 0x630c, 0x630c, 0x630c, 0x632c, 0x632c, 0x632c, 0x632c, 0xdefb, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xdedb, 0x5aeb, 0x5acb, 0x52aa, 0x18e3, 0x0861, 0x0861, 0x4208, 0x73ae, 0x4208, 0x9cd3, 0x9492, 0xd69a, 0xdefb, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0x7bcf, 0x9cf3, 0x8c71, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde97, 0xde11, 0xdd47, 0xd526, 0xbc86, 0x6244, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3121, 0x6a82, 0x9b82, 0xbc63, 0xd505, 0xd58b, 0xd612, 0xd677, 0xd6b9, 0xd6ba, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x738e, 0x39e7, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0x9cf3, 0x4208, 0x4228, 0x4228, 0x1924, 0x08c3, 0x08e3, 0x0965, 0x0985, 0x09a6, 0x09e7, 0x0a28, 0x0a28, 0x09e7, 0x09a6, 0x0945, 0x31c6, 0x528a, 0x4a49, 0x0903, 0x08c2, 0x08c2, 0x08c2, 0x0903, 0x0965, 0x0965, 0x3a69, 0x73cf, 0x9d34, 0xce79, 0x9cf3, 0x632c, 0x632c, 0x6b4d, 0x6b4d, 0x6b4d, 0x6b4d, 0xb5b6, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xa514, 0x5aeb, 0x5aeb, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x0861, 0x0861, 0x632c, 0x4228, 0xce59, 0x7bcf, 0xa534, 0xdefb, 0xdedb, 0xe73c, 0xe73c, 0xce79, 0x4228, 0xe73c, 0xce59, 0xbdf7, 0x8c51, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeb8, 0xde54, 0xdd8c, 0xdd25, 0xd505, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0x7ae3, 0xa3e5, 0xc4a5, 0xd548, 0xd5cf, 0xde55, 0xde77, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xbdd7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0xce59, 0xe73c, 0xe71c, 0xe73c, 0xad75, 0x4208, 0x4208, 0x4208, 0x2985, 0x08e3, 0x0985, 0x09c6, 0x0a27, 0x0a28, 0x09e7, 0x0a07, 0x0a68, 0x0aa9, 0x0a69, 0x09c6, 0x2165, 0x4a69, 0x2185, 0x08e3, 0x08c2, 0x08c2, 0x08a2, 0x0903, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x2a28, 0x3a28, 0x52cb, 0x6b4d, 0x6b4d, 0x6b6d, 0x6b6d, 0xad55, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xe71c, 0x630c, 0x630c, 0x52aa, 0x2104, 0x3186, 0x0861, 0x0861, 0x31a6, 0x0861, 0x6b4d, 0x0861, 0x39c7, 0x4a49, 0x6b4d, 0xad55, 0x0861, 0x0861, 0x4a69, 0x0861, 0x8c51, 0x7bcf, 0xbdd7, 0xc618, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xbdf7, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd46, 0xdd26, 0xbc86, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0x5202, 0x8b43, 0xac25, 0xcd07, 0xdd8c, 0xddf0, 0xde54, 0xde98, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x31c7, 0x0944, 0x09a6, 0x09a5, 0x09e7, 0x0a27, 0x0a68, 0x0a28, 0x0a07, 0x0a28, 0x0a89, 0x0a89, 0x09c6, 0x31e7, 0x0903, 0x08e3, 0x08c2, 0x08e3, 0x08c2, 0x08c3, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x09a6, 0x0985, 0x0965, 0x3a28, 0x632c, 0x738e, 0x738e, 0x738e, 0xffff, 0xffff, 0xffff, 0xffff, 0x9492, 0x632c, 0x630c, 0x5acb, 0x39e7, 0x5acb, 0xc638, 0xc618, 0xbdd7, 0x39e7, 0x7bcf, 0x0861, 0x4208, 0x0861, 0x6b4d, 0x8c51, 0x0861, 0x2945, 0x2945, 0x8430, 0x10a2, 0x10a2, 0x10a2, 0x94b2, 0x738e, 0xdedb, 0xad75, 0xb5b6, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeb9, 0xde32, 0xdd8a, 0xdd47, 0xd506, 0x8b86, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6262, 0x9384, 0xb465, 0xd548, 0xddce, 0xde33, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4208, 0x31e7, 0x2186, 0x52ca, 0x634d, 0x1144, 0x09a6, 0x0a48, 0x0a89, 0x0a68, 0x0a48, 0x0a68, 0x0a48, 0x0965, 0x0924, 0x08e3, 0x0924, 0x0965, 0x0944, 0x0924, 0x0965, 0x09a6, 0x0985, 0x0965, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0965, 0x0965, 0x1985, 0x632c, 0x73ae, 0x738e, 0xdedb, 0xffff, 0xffff, 0xb596, 0x6b4d, 0x632c, 0x4208, 0x2124, 0x31a6, 0x7bef, 0xe73c, 0xf7be, 0xef5d, 0xc618, 0x528a, 0x4228, 0x73ae, 0x7bcf, 0x8c71, 0x10a2, 0x4a49, 0x94b2, 0x3186, 0x7bcf, 0x2945, 0x4a49, 0x0861, 0x2104, 0x2945, 0x8c51, 0x0861, 0x39c7, 0xdefb, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xdd8a, 0xdd46, 0xdd25, 0xd56b, 0xac8d, 0x6b09, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x72c3, 0x9bc4, 0xcce6, 0xddab, 0xde33, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x3186, 0x0903, 0x0924, 0x0903, 0x08e3, 0x0944, 0x0965, 0x0a68, 0x0aca, 0x0aca, 0x0aa9, 0x0a89, 0x09c6, 0x0924, 0x0903, 0x0985, 0x09c6, 0x09e7, 0x09e6, 0x09a6, 0x09c6, 0x0a27, 0x0a07, 0x09e7, 0x09e7, 0x09e6, 0x09a6, 0x0985, 0x0965, 0x0944, 0x2165, 0x6b6d, 0x7bcf, 0xffff, 0xffff, 0xffff, 0x6b6d, 0x6b4d, 0x5acb, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xf7be, 0xf7be, 0xf7be, 0x7bef, 0x528a, 0x528a, 0x8410, 0xef7d, 0xdedb, 0xe73c, 0xdedb, 0x7bcf, 0x738e, 0x39c7, 0x2104, 0x0861, 0x10a2, 0x528a, 0x2104, 0x0861, 0x94b2, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xddcd, 0xdd47, 0xdd25, 0xdd47, 0xddce, 0xc56f, 0x8c2d, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0xbc85, 0xdd68, 0xde11, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x39e7, 0x08e3, 0x08e3, 0x0944, 0x0903, 0x08e3, 0x0924, 0x0965, 0x0a48, 0x0aa9, 0x0aea, 0x0b0b, 0x0aca, 0x09c6, 0x0924, 0x0985, 0x0944, 0x0965, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x0a48, 0x0a89, 0x0aa9, 0x0a89, 0x0a28, 0x09c6, 0x0945, 0x0904, 0x5acb, 0x7bef, 0xc638, 0xe71c, 0xce79, 0x738e, 0x6b4d, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0xa514, 0xf7be, 0xf7be, 0xf7be, 0xbdd7, 0x528a, 0x528a, 0x528a, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xce59, 0x8c51, 0x94b2, 0xa534, 0xad75, 0x9cd3, 0x4a49, 0x39c7, 0xc638, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddef, 0xdd69, 0xdd46, 0xdd25, 0xdd47, 0xd5af, 0xacce, 0x6b2a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a1, 0xc4a6, 0xdd47, 0xde11, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x31a6, 0x08c2, 0x08c2, 0x0924, 0x0904, 0x08e3, 0x0904, 0x09e6, 0x0a48, 0x0a89, 0x0aaa, 0x0aca, 0x0a89, 0x0924, 0x0985, 0x09e7, 0x0985, 0x0944, 0x0944, 0x0985, 0x638d, 0x4aeb, 0x09c6, 0x09c6, 0x09e7, 0x0a48, 0x0aa9, 0x0aca, 0x0aaa, 0x0a89, 0x0a28, 0x0965, 0x3a08, 0x8410, 0x7bef, 0x7bcf, 0x7bcf, 0x738e, 0x4a49, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0xef5d, 0xffdf, 0xf7be, 0xf7be, 0xdefb, 0x52aa, 0x528a, 0x528a, 0xbdd7, 0xf79e, 0xef7d, 0xef7d, 0xd69a, 0xa514, 0x4208, 0x94b2, 0xd69a, 0xef5d, 0xef5d, 0xce79, 0xd69a, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde98, 0xde54, 0xddce, 0xdd48, 0xdd25, 0xdd48, 0xdd8c, 0xc570, 0x942d, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c2, 0xc4a5, 0xdd46, 0xddf0, 0xdeb7, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x39e7, 0x08c2, 0x08c2, 0x0944, 0x0924, 0x0924, 0x0944, 0x0985, 0x09e7, 0x0a28, 0x0a68, 0x0a69, 0x09a5, 0x0944, 0x0985, 0x0985, 0x0985, 0x0965, 0x0965, 0x73cf, 0xffdf, 0xffdf, 0xa534, 0x52cb, 0x3a69, 0x19e7, 0x0a27, 0x0a69, 0x0aa9, 0x0a89, 0x0a89, 0x0a68, 0x1985, 0x7bef, 0x8410, 0x7bef, 0x7bcf, 0x632c, 0x1082, 0x0861, 0x0861, 0x0861, 0x0861, 0xc618, 0xffdf, 0xdedb, 0x9492, 0xb5b6, 0xd6ba, 0x94b2, 0x528a, 0x528a, 0x8410, 0xf79e, 0xc638, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x5aeb, 0x8c71, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddf0, 0xdd6a, 0xdd26, 0xdd26, 0xdd47, 0xd58d, 0xaccd, 0x732a, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xc4c5, 0xdd46, 0xddef, 0xde98, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0x8c51, 0x4208, 0x4208, 0x4208, 0x31a6, 0x31c7, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x10e3, 0x0924, 0x0965, 0x0944, 0x0944, 0x0944, 0x0924, 0x0944, 0x0985, 0x09a6, 0x0944, 0x08e3, 0x09c6, 0x09a6, 0x0965, 0x0965, 0x0965, 0x21e7, 0xb5b6, 0xa514, 0x632c, 0x632c, 0x6b4d, 0x6b6d, 0x6b6d, 0x428a, 0x0a48, 0x0a89, 0x0a89, 0x0a68, 0x0a27, 0x09c6, 0x73ae, 0x8430, 0x7bef, 0x7bcf, 0x3186, 0x0861, 0x0861, 0x0861, 0x0861, 0x3186, 0xc618, 0xffff, 0xef7d, 0x2124, 0x0861, 0x0861, 0x4228, 0x4a69, 0x528a, 0x528a, 0x8410, 0x4a69, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x4228, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde34, 0xddcf, 0xdd47, 0xdd04, 0xd525, 0xd569, 0xc54e, 0x940b, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5203, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xbdf7, 0x9cf3, 0x6b4d, 0x08e3, 0x08e3, 0x2165, 0x31c7, 0x39e7, 0x3a07, 0x7bef, 0x4249, 0x0985, 0x09c6, 0x09a6, 0x0965, 0x0985, 0x1185, 0x1965, 0x0903, 0x08e3, 0x08a2, 0x0924, 0x09c6, 0x09a6, 0x0985, 0x0985, 0x09a6, 0x3a49, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x738e, 0x3208, 0x09e7, 0x0a89, 0x0a89, 0x0a48, 0x09c6, 0x0944, 0xad96, 0x9cd3, 0x8410, 0x52aa, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x5aeb, 0x630c, 0xffff, 0xffff, 0x9cd3, 0x0861, 0x0861, 0x0861, 0x39c7, 0x528a, 0x528a, 0x4a69, 0x4a69, 0x4a49, 0x39c7, 0x39e7, 0x4228, 0x4a49, 0x4228, 0x7bcf, 0xad55, 0xd69a, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde98, 0xde11, 0xdd6a, 0xd504, 0xd504, 0xd505, 0xd549, 0xb445, 0x7305, 0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xdd69, 0xde10, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x634d, 0x08c2, 0x08e3, 0x0903, 0x0924, 0x0944, 0x0944, 0x0924, 0x08e3, 0x0944, 0x09a6, 0x09a6, 0x0985, 0x0965, 0x31c7, 0x29a6, 0x08e3, 0x08e3, 0x08c2, 0x0944, 0x0985, 0x0985, 0x0965, 0x0944, 0x21c6, 0x5acb, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x4aaa, 0x0944, 0x0985, 0x0a69, 0x0a68, 0x0a28, 0x09a6, 0x0965, 0x3a69, 0x4228, 0x528a, 0x10a2, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x632c, 0x630c, 0xffff, 0xffff, 0xc638, 0x31a6, 0x0861, 0x0861, 0x10a2, 0x4a69, 0x4a69, 0x4208, 0x2965, 0x10a2, 0x0861, 0x0861, 0x1082, 0x39e7, 0x7bcf, 0xdefb, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xdeda, 0xdeb9, 0xde97, 0xde54, 0xde12, 0xddcf, 0xdd6a, 0xdd25, 0xd504, 0xc4a4, 0xac04, 0x8b64, 0x6aa4, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a42, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xe71c, 0x3a28, 0x08a2, 0x08e3, 0x08e3, 0x0924, 0x0944, 0x0965, 0x0944, 0x08e3, 0x08e3, 0x0965, 0x09a6, 0x09a6, 0x0985, 0x1185, 0x0924, 0x08e3, 0x08e3, 0x0924, 0x0924, 0x0944, 0x0965, 0x09a6, 0x11a6, 0x4a8a, 0x5aeb, 0x5aeb, 0x630c, 0x632c, 0x632c, 0x634d, 0x4289, 0x09a6, 0x0965, 0x0985, 0x0a89, 0x0a89, 0x0a27, 0x09c6, 0x0944, 0x0903, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x31a6, 0x9cf3, 0x630c, 0xa534, 0xb5b6, 0x5aeb, 0x5acb, 0x4228, 0x0861, 0x0861, 0x0861, 0x2945, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdeb8, 0xde54, 0xddee, 0xdd69, 0xdd46, 0xdd26, 0xcce6, 0xb444, 0x9b83, 0x72c2, 0x49c2, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6242, 0xcce5, 0xdd68, 0xde32, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x08a2, 0x0924, 0x0903, 0x0924, 0x0944, 0x0944, 0x0944, 0x0903, 0x08e3, 0x0985, 0x09c6, 0x0985, 0x0965, 0x0965, 0x0924, 0x0903, 0x0924, 0x09a6, 0x09a6, 0x0965, 0x0944, 0x0965, 0x3a28, 0x5acb, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x52aa, 0x2a28, 0x09a6, 0x09a6, 0x0985, 0x09c6, 0x0aa9, 0x0aa9, 0x0a68, 0x09e7, 0x0965, 0x08c3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x39c7, 0x630c, 0x5aeb, 0x5aeb, 0x5acb, 0x528a, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0x9492, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe6fb, 0xded9, 0xde96, 0xde53, 0xde10, 0xddac, 0xdd68, 0xdd45, 0xd505, 0xbc64, 0xa3c4, 0x8303, 0x5a22, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd4e6, 0xdd68, 0xde32, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xa555, 0x08a2, 0x0944, 0x0944, 0x0965, 0x0944, 0x0965, 0x0965, 0x0924, 0x0924, 0x0985, 0x0965, 0x0924, 0x0944, 0x0965, 0x0944, 0x0924, 0x0985, 0x09c6, 0x09c6, 0x09e7, 0x09a6, 0x0965, 0x21a6, 0x31e7, 0x3a28, 0x3269, 0x3248, 0x11a6, 0x0985, 0x09e6, 0x09a6, 0x0985, 0x09a6, 0x09e6, 0x0a48, 0x0a89, 0x0a68, 0x0a07, 0x3269, 0x7c10, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5acb, 0x52aa, 0x4208, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x94b2, 0xce59, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6fb, 0xe6d9, 0xe674, 0xe630, 0xe5aa, 0xdd68, 0xdd47, 0xdd47, 0xccc6, 0xac25, 0x8b64, 0x6284, 0x3142, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xd505, 0xdd48, 0xde54, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xce79, 0x0944, 0x0965, 0x0985, 0x0985, 0x0985, 0x0985, 0x09a6, 0x09a6, 0x0985, 0x0985, 0x0965, 0x0945, 0x0985, 0x0985, 0x0965, 0x09a6, 0x0a07, 0x0a07, 0x09e7, 0x09e7, 0x09e7, 0x0985, 0x0924, 0x0944, 0x0985, 0x0a07, 0x09e7, 0x0985, 0x0965, 0x09c6, 0x09c6, 0x0985, 0x0a27, 0x0a48, 0x0a28, 0x0a48, 0x0a48, 0x0a28, 0xa555, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x0861, 0x2104, 0x2124, 0x0861, 0x0861, 0x2945, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x3186, 0xb5b6, 0xf79e, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6f9, 0xe631, 0xe5cc, 0xe568, 0xe568, 0xd507, 0xb466, 0x93a5, 0x72a3, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd505, 0xdd69, 0xde33, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xb5b6, 0x52eb, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0944, 0x0985, 0x0965, 0x0965, 0x0944, 0x636d, 0x532c, 0x0985, 0x09c6, 0x0a28, 0x0a27, 0x0a28, 0x0a07, 0x0a07, 0x09c6, 0x0965, 0x0944, 0x0944, 0x0965, 0x09e6, 0x0a07, 0x09a6, 0x0965, 0x09c6, 0x09e7, 0x09c6, 0x0a48, 0x0a89, 0x0aca, 0x0aa9, 0x0a69, 0x6c0f, 0xf7be, 0xc618, 0x0861, 0x0861, 0x0861, 0x1082, 0x5acb, 0x6b4d, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x0861, 0x0861, 0x2104, 0x4a49, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe5ec, 0xe589, 0xe566, 0x9be6, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd4e4, 0xdd6a, 0xde32, 0xdeb9, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xe73c, 0xc659, 0x9d13, 0x73ef, 0x4aca, 0x4289, 0x428a, 0x5b4d, 0x8c92, 0xc638, 0xf79e, 0x9d14, 0x0985, 0x0a69, 0x0a89, 0x0a28, 0x0a07, 0x0a07, 0x0a28, 0x09e7, 0x0985, 0x0944, 0x0924, 0x0944, 0x09c6, 0x0a07, 0x09c6, 0x0965, 0x09a6, 0x0a27, 0x0a28, 0x0a48, 0x0a69, 0x0aca, 0x0aea, 0x53ef, 0xef7d, 0xffff, 0xe73c, 0x18c3, 0x0861, 0x0861, 0x0861, 0x18c3, 0x2965, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x2124, 0x7bef, 0xc638, 0xc618, 0x0861, 0x0861, 0x0861, 0x39c7, 0x8410, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe6f9, 0xe5ee, 0xe567, 0xdd68, 0x8326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd505, 0xdd04, 0xdd26, 0xdd48, 0xdd69, 0xdd6a, 0xdd8b, 0xdd8b, 0xddab, 0xddab, 0xddcc, 0xddee, 0xddee, 0xde0f, 0xe60f, 0xe630, 0xe674, 0xe6b7, 0xe6d7, 0xe6d8, 0xe6d7, 0xe6f9, 0xe71b, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xc659, 0x0a07, 0x0a89, 0x0a89, 0x0a28, 0x09c6, 0x09c6, 0x0a07, 0x0a48, 0x0a27, 0x09c6, 0x0985, 0x0985, 0x09c6, 0x0a27, 0x09e6, 0x09a5, 0x09a6, 0x09c6, 0x0a07, 0x0a48, 0x0a68, 0x0a89, 0x7491, 0xef7d, 0xffff, 0xffff, 0xffff, 0x9492, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5aeb, 0xad55, 0xb5b6, 0x9492, 0x630c, 0x52aa, 0xad55, 0xe73c, 0xffff, 0xffff, 0xffdf, 0x5acb, 0x0861, 0x0861, 0x10a2, 0x4228, 0xce59, 0x9cf3, 0x632c, 0x9492, 0xd6ba, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe60f, 0xe588, 0xdd69, 0x7b06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x49c2, 0x5202, 0x5a22, 0x6a62, 0x6aa3, 0x7ae3, 0x8303, 0x8b44, 0x8b64, 0x93a4, 0x9bc5, 0xa3e5, 0xac25, 0xb446, 0xb466, 0xbca6, 0xc4c7, 0xcce7, 0xcd08, 0xd528, 0xdd68, 0xe5cc, 0xe693, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xef7d, 0xadd7, 0x84d2, 0x536d, 0x1a68, 0x0a07, 0x09c6, 0x09e6, 0x0a28, 0x0a48, 0x0a48, 0x09e7, 0x0985, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0965, 0x09a6, 0x3aeb, 0xb5d7, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xf7be, 0xad55, 0x39e7, 0x0861, 0x0861, 0x0861, 0x52aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x630c, 0x9cd3, 0x3186, 0x2124, 0x31a6, 0xa534, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe60f, 0xe567, 0xdd6a, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe60f, 0xe6b6, 0xe73b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xe75d, 0xce79, 0xa575, 0x7c71, 0x434c, 0x0a89, 0x0a68, 0x0a28, 0x09c6, 0x0944, 0x0924, 0x0965, 0x0965, 0x0944, 0x21c6, 0x634c, 0xb5b6, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xce79, 0x9cf3, 0x7bcf, 0x5acb, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xef7d, 0x9cf3, 0x73ae, 0x39e7, 0x630c, 0xb596, 0x0861, 0x0861, 0x39e7, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe696, 0xe5ec, 0xe568, 0xdd48, 0x6ae6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xb446, 0xe5aa, 0xe651, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xe73c, 0xce9a, 0xb5f7, 0x9d34, 0x94b2, 0x94b2, 0x9d34, 0xad75, 0xc659, 0xef5d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xdefb, 0xe71c, 0x94b2, 0x9cf3, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf77c, 0xf739, 0xf6f6, 0xef39, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe5cc, 0xe568, 0xd548, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e5, 0xe5a9, 0xe630, 0xe6f9, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf738, 0xf671, 0xf62e, 0xf64f, 0xf64f, 0xee91, 0xeed6, 0xef3a, 0xef5c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6b7, 0xe5ab, 0xe567, 0xd549, 0x6285, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b65, 0xe588, 0xe631, 0xe6f8, 0xef3c, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf79d, 0xf738, 0xf670, 0xf5ea, 0xf5eb, 0xf62c, 0xee0b, 0xedeb, 0xee0c, 0xee71, 0xeeb5, 0xeef8, 0xef19, 0xef3b, 0xef3c, 0xef3c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe695, 0xe5cc, 0xe568, 0xd549, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xe568, 0xe60f, 0xe6d7, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf738, 0xf670, 0xf5eb, 0xd54b, 0x8bca, 0xb4ce, 0xcd6e, 0xe60d, 0xedeb, 0xedca, 0xedeb, 0xedec, 0xee2e, 0xee73, 0xeed7, 0xef1a, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe695, 0xe5cd, 0xe546, 0xd54b, 0x5a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xdd48, 0xe5ed, 0xe6d7, 0xe73b, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef3b, 0xef19, 0xeef8, 0xeeb4, 0xee71, 0xee70, 0xeed5, 0xf75a, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff12, 0xfed0, 0xff34, 0xffbb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf759, 0xf691, 0xf5eb, 0xcd2c, 0x0000, 0x0000, 0x0000, 0x2924, 0x62e9, 0x93ea, 0xb48a, 0xcd2b, 0xe5cc, 0xedca, 0xeda9, 0xedca, 0xe60e, 0xe674, 0xe6b6, 0xe6d8, 0xe6f9, 0xe6fa, 0xe71b, 0xe71c, 0xe71b, 0xe674, 0xe5ab, 0xe567, 0xcd29, 0x5224, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a23, 0xdd48, 0xe5cb, 0xe6b7, 0xe73b, 0xef3c, 0xef3c, 0xef3b, 0xef19, 0xeeb4, 0xee50, 0xedec, 0xedca, 0xdd69, 0xcd29, 0xedea, 0xee2d, 0xf718, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff76, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffba, 0xfed0, 0xfeae, 0xfe8e, 0xfed1, 0xff57, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffde, 0xf7be, 0xf79c, 0xf6b3, 0xf60b, 0xdd8c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0x6ac7, 0x93c9, 0xb48a, 0xcd2a, 0xe58a, 0xe5aa, 0xe5cb, 0xe5cc, 0xe5cd, 0xe60f, 0xe673, 0xe6b7, 0xe6d8, 0xe653, 0xe5aa, 0xe567, 0xcd08, 0x5205, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xcd08, 0xe5cc, 0xe6b5, 0xe71a, 0xe71b, 0xe6f9, 0xeeb5, 0xee30, 0xedcb, 0xedca, 0xd54a, 0xac27, 0x72c5, 0x20c1, 0xa407, 0xedeb, 0xf670, 0xf719, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff77, 0xfecf, 0xfecf, 0xff33, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff76, 0xfed0, 0xbceb, 0xc50b, 0xfe8f, 0xfeaf, 0xff13, 0xffbc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf6d5, 0xf60b, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3984, 0x6ac6, 0x93a7, 0xac47, 0xcce8, 0xe589, 0xe588, 0xe588, 0xe5aa, 0xe5ed, 0xe5cd, 0xe567, 0xe547, 0xcd09, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3962, 0xc4a6, 0xe5cb, 0xe672, 0xe6f9, 0xe673, 0xe60f, 0xe5cb, 0xeda9, 0xcd08, 0x9be6, 0x6284, 0x1081, 0x0000, 0x0000, 0x0000, 0xbcc9, 0xedeb, 0xf6b3, 0xf75a, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffde, 0xffde, 0xffde, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff77, 0xfef1, 0xfed0, 0xfecf, 0xfecf, 0xff54, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfed0, 0x7b69, 0x0000, 0x8389, 0xee2e, 0xfeaf, 0xfed1, 0xff78, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xee2e, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x6aa5, 0x93a6, 0xac46, 0xccc6, 0xdd47, 0xe567, 0xdd46, 0xe546, 0xcd09, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe587, 0xe5aa, 0xe5ec, 0xe5a9, 0xe568, 0xc4c7, 0x93a6, 0x5a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd6a, 0xf60c, 0xf6f7, 0xf77c, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffde, 0xffde, 0xffbd, 0xff16, 0xfed2, 0xfef3, 0xff79, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xff32, 0xff12, 0xaced, 0xacec, 0xff11, 0xfed0, 0xff75, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xfeb0, 0x41e5, 0x0000, 0x0000, 0x39a4, 0xbccb, 0xfe8f, 0xfe8f, 0xff14, 0xffbb, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xf64d, 0x4a05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x6ac4, 0x9385, 0xac25, 0xccc6, 0xc4ea, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xac26, 0xe567, 0xe567, 0xdd47, 0xbc87, 0x8b86, 0x49c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c3, 0xedeb, 0xf64e, 0xf718, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbe, 0xffbd, 0xff59, 0xfeb1, 0xfe6e, 0xfe6d, 0xfe8e, 0xff14, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfef0, 0xde53, 0x2103, 0x0000, 0xacee, 0xff11, 0xff11, 0xff75, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff11, 0xe60e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7327, 0xe5ee, 0xfe8f, 0xfed1, 0xff57, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f6, 0xf64d, 0xf64d, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be6, 0xdd27, 0xb446, 0x8324, 0x41a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xf5eb, 0xf690, 0xf739, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbd, 0xff7a, 0xfef4, 0xfe6e, 0xfe4d, 0xf66f, 0xee0d, 0xfe6e, 0xfed1, 0xff78, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff97, 0xff12, 0xf713, 0x62e8, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff11, 0xff75, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xc54d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0xb4ab, 0xfe6e, 0xfeaf, 0xfef3, 0xffbb, 0xffde, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffde, 0xff37, 0xf66e, 0xf64d, 0x7b26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x72e5, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be7, 0xf60c, 0xf6b3, 0xf75b, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xff7b, 0xfef4, 0xfe6f, 0xfe4d, 0xfe90, 0xd5af, 0x6ae8, 0x7b48, 0xfeb0, 0xfe8e, 0xff14, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff33, 0xa4ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff12, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ac6, 0xddcd, 0xfe8e, 0xfeb0, 0xff58, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffde, 0xff37, 0xf66f, 0xf64d, 0x8b88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbca8, 0xf60c, 0xf6f6, 0xf77c, 0xf7be, 0xf7be, 0xf77c, 0xf716, 0xf66f, 0xfe4d, 0xfe4d, 0xe610, 0x83aa, 0x18a2, 0x0000, 0x0000, 0xcd8f, 0xfe6e, 0xfed1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xff11, 0xd674, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff11, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xfef1, 0x7b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2943, 0xa449, 0xf64e, 0xfe8f, 0xff14, 0xff9b, 0xfffe, 0xffff, 0xffdf, 0xffdf, 0xff37, 0xfe8f, 0xf64d, 0x9be8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54a, 0xf62d, 0xf75a, 0xf79d, 0xf77c, 0xf738, 0xf691, 0xfe4d, 0xfe4d, 0xee50, 0xa46c, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfe8f, 0xfeaf, 0xfef2, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffb8, 0xfef1, 0xf6f3, 0x62e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff11, 0xff11, 0xff97, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff97, 0xfef2, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6286, 0xd58d, 0xfe6e, 0xfed1, 0xff37, 0xffbd, 0xffde, 0xffdf, 0xff79, 0xfeb1, 0xfe4d, 0xac49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0xedeb, 0xf64e, 0xf75a, 0xf75a, 0xf6d4, 0xf62d, 0xf62d, 0xf64f, 0xb4ed, 0x4a06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd2e, 0xfeaf, 0xfeb0, 0xff77, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff32, 0xa4cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff12, 0xffb8, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff96, 0xe650, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e2, 0x9c09, 0xf62e, 0xfe8e, 0xfed1, 0xff9c, 0xffde, 0xff79, 0xfed2, 0xfe4d, 0xb48a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xf60c, 0xf66f, 0xf6b2, 0xf66f, 0xf62c, 0xf66e, 0xcd8e, 0x6ae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a06, 0xf690, 0xfeaf, 0xff12, 0xffdc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff32, 0xd652, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff75, 0xc56e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5205, 0xcd2b, 0xfe6e, 0xfeb0, 0xff36, 0xff36, 0xfed2, 0xfe4d, 0xc4ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bc7, 0xf60b, 0xf60b, 0xf60b, 0xf62c, 0xddce, 0x838a, 0x18a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xacad, 0xfeb0, 0xfed0, 0xffb9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff98, 0xff11, 0xf714, 0x5ac8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff31, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff53, 0xa4ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ba8, 0xeded, 0xfe6d, 0xfe8f, 0xfe8f, 0xfe4d, 0xcd2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb489, 0xf60b, 0xf60c, 0xe60e, 0x9c2a, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3184, 0xee2f, 0xfed0, 0xff33, 0xffdb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffda, 0xff55, 0xff75, 0x9ccf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffda, 0xff33, 0x7b89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e4, 0xc4eb, 0xfe4d, 0xfe4d, 0xfe4d, 0xdd6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54b, 0xee0e, 0xb4ab, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940b, 0xfef1, 0xfef1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xfffe, 0xff76, 0xff53, 0xd654, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff33, 0xffd8, 0xffff, 0xfffd, 0xffb8, 0xff13, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b27, 0xe5cc, 0xfe4d, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39c7, 0xc5b4, 0x6ae7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0xde0f, 0xfef1, 0xff34, 0xffdb, 0xffff, 0xffff, 0xff97, 0xff32, 0xf736, 0x52a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff32, 0xffb7, 0xff96, 0xff32, 0xe691, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0xb48a, 0xee2f, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c3, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7348, 0xff12, 0xfef0, 0xff77, 0xfffe, 0xfffc, 0xff33, 0xff74, 0x9c8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff33, 0xff32, 0xff32, 0xff11, 0xc58e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7329, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdb0, 0xfed0, 0xff11, 0xff33, 0xff32, 0xff33, 0xd655, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xff11, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfed1, 0xfef1, 0xfef1, 0xff12, 0xf734, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff53, 0xff32, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb52e, 0xff11, 0xff11, 0xff75, 0x948e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xfef1, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a05, 0xf6b0, 0xff33, 0xce12, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa48c, 0xef15, 0x4a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2964, 0x73ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; -#define banner_pixel 16200 -#define MAXR 31 -#define MINR 0 -#define MAXG 63 -#define MING 0 -#define MAXB 31 -#define MINB 0 diff --git a/glide2x/sst1/glide/src/cpudetect.c b/glide2x/sst1/glide/src/cpudetect.c deleted file mode 100644 index a125f1c..0000000 --- a/glide2x/sst1/glide/src/cpudetect.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#include -#include - -int _cpu_detect_asm() { - struct utsname name; - - uname(&name); - if (!strcmp(name.machine, "i386")) return 3; - if (!strcmp(name.machine, "i486")) return 4; - if (!strcmp(name.machine, "i586")) return 5; - if (!strcmp(name.machine, "i686")) return 6; - fprintf(stderr, "Couldn't determine cpu type. Using i586\n"); - return 5; -} - -void single_precision_asm() { - asm("push %eax \n fnclex \n fstcw (%esp) \n movl (%esp), %eax \n " - "and $0x0000fcff, %eax \n movl %eax, (%esp) \n fldcw (%esp) \n pop %eax"); -} - - -void double_precision_asm() { - asm("push %eax \n fnclex \n fstcw (%esp) \n movw (%esp), %eax \n " - "and $0x0000fcff, %eax \n or $0x000002ff, %eax \n mov %eax, (%esp) \n " - "fldcw (%esp) \n pop %eax"); -} - diff --git a/glide2x/sst1/glide/src/cpudtect.S b/glide2x/sst1/glide/src/cpudtect.S deleted file mode 100644 index cb18e25..0000000 --- a/glide2x/sst1/glide/src/cpudtect.S +++ /dev/null @@ -1,130 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Header$ -# $Log$ -# Revision 1.1.1.1 1999/12/07 21:48:51 joseph -# Initial checkin into SourceForge. -# -# -# 2 3/04/97 9:10p Dow -# Neutered mutiplatform multiheaded monster. -# -# - -# This used to be cpudtect.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -.file "cpudtect.s" - -# 586P -# model FLAT,C - -# Data for data segment goes here -# DATA SEGMENT DWORD USE32 PUBLIC DATA; -# DATA ENDS - -# Some useful constants -# CPU Type -CPUTypeUnknown .ASSIGNA 0xffffffff -CPUTypePrePent .ASSIGNA 4 -CPUTypeP5 .ASSIGNA 5 -CPUTypeP6 .ASSIGNA 6 - -# References to external data: - -#_TEXT SEGMENT -# -# _cpu_detect_asm - detect the type of CPU -# -# USAGE: -# -# int __cdecl _cpu_detect_asm(void); -# -# returns 4 for non-pen - -.text -.align 4 -.globl _cpu_detect_asm -_cpu_detect_asm: -P6Stuff: - pusha # save all regs. - - # First, determine whether CPUID instruction is available. - # If it's not, then it's a 386 or 486. - pushf # push original EFLAGS. - pop %eax # pop into eax - mov %eax, %ecx # save original EFLAGS in ecx - xor $0x200000, %eax # flip ID bit in EFLAGS - push %eax # put it back on stack - popf # pop into EFLAGS - pushf # get EFLAGS back - pop %eax # into eax - xor %ecx, %eax # check to see if we could toggle ID - jz NotPentium # Sorry, not P5 or P6. - - # - # Now determine whether it's an intel P6 CPU. - # - ## Is it an Intel CPU? - xor %eax, %eax # eax = 0. - cpuid # get cpuid - xor $0x756e6547, %ebx # "Genu" - jnz NotIntel - xor $0x49656e69, %edx # "ineI" - jnz NotIntel - xor $0x6c65746e, %ecx # "ntel" - jnz NotIntel # - ## Verifying architecture family - mov $1, %eax - cpuid # get family/model/stepping - shr $8, %eax # rid of model & stepping number - and $0xf, %eax # use only family - cmp $6, %eax - jl IsP5 # It's a P5 - ## Else it's a P6 - # - # Intel P6 processor. - # Make sure it supports Memory Type Range Request registers - # -IsP6: - popa - mov $6, %eax # - ret # return - -IsP5: - popa - mov $5, %eax # - ret - -NotPentium: - popa - mov $4, %eax - ret - -NotIntel: - popa - mov $0xffffffff, %eax - ret - -.L_end__cpu_detect_asm: -.size _cpu_detect_asm,.L_end__cpu_detect_asm-_cpu_detect_asm -.END - - diff --git a/glide2x/sst1/glide/src/cpudtect.asm b/glide2x/sst1/glide/src/cpudtect.asm deleted file mode 100644 index 771ef02..0000000 --- a/glide2x/sst1/glide/src/cpudtect.asm +++ /dev/null @@ -1,160 +0,0 @@ -;; -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Log$ -; -; 2 3/04/97 9:10p Dow -; Neutered mutiplatform multiheaded monster. -;; -;; - -TITLE cpudtect.asm - -.586P -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -;; Data for data segment goes here -;_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'; -;_DATA ENDS - -;;; Some useful constants -; CPU Type -CPUTypeUnknown = 0ffffffffh -CPUTypePrePent = 4h -CPUTypeP5 = 5h -CPUTypeP6 = 6h - -;;; References to external data: - -_TEXT SEGMENT -;; -;; _cpu_detect_asm - detect the type of CPU -;; -;; USAGE: -;; -;; int __cdecl _cpu_detect_asm(void); -;; -;; returns 4 for non-pen - -PUBLIC _cpu_detect_asm -_cpu_detect_asm PROC NEAR -P6Stuff: - .586 - pushad ; save all regs. - - ; First, determine whether CPUID instruction is available. - ; If it's not, then it's a 386 or 486. - pushfd ; push original EFLAGS. - pop eax ; pop into eax - mov ecx, eax ; save original EFLAGS in ecx - xor eax, 0200000h ; flip ID bit in EFLAGS - push eax ; put it back on stack - popfd ; pop into EFLAGS - pushfd ; get EFLAGS back - pop eax ; into eax - xor eax, ecx ; check to see if we could toggle ID - jz NotPentium ; Sorry, not P5 or P6. - - ; - ; Now determine whether it's an intel P6 CPU. - ; - ;; Is it an Intel CPU? - xor eax, eax ; eax = 0. - cpuid ; get cpuid - xor ebx, 0756e6547h ; "Genu" - jnz NotIntel - xor edx, 049656e69h ; "ineI" - jnz NotIntel - xor ecx, 06c65746eh ; "ntel" - jnz NotIntel ; - ;; Verifying architecture family - mov eax, 1 - cpuid ; get family/model/stepping - shr eax, 8 ; rid of model & stepping number - and eax, 0fh ; use only family - cmp eax, 6 - jl IsP5 ; It's a P5 - ;; Else it's a P6 - ; - ; Intel P6 processor. - ; Make sure it supports Memory Type Range Request registers - ; -IsP6: - popad - mov eax, 6 ; - ret ; return - -IsP5: - popad - mov eax, 5 ; - ret - -NotPentium: - popad - mov eax, 4 - ret - -NotIntel: - popad - mov eax, 0ffffffffh - ret - -_cpu_detect_asm ENDP - - -;------------------------------------------------------------------------------ -; this routine sets the precision to single -; which effects all adds, mults, and divs - align 4 ; - PUBLIC single_precision_asm -single_precision_asm PROC NEAR -.586 - push eax ; make room - fnclex ; clear pending exceptions - fstcw WORD PTR [esp] - mov eax, DWORD PTR [esp] - and eax, 0000fcffh ; clear bits 9:8 - mov DWORD PTR [esp], eax - fldcw WORD PTR [esp] - pop eax - ret 0 -single_precision_asm ENDP - -;------------------------------------------------------------------------------ -; this routine sets the precision to double -; which effects all adds, mults, and divs - align 4 ; - PUBLIC double_precision_asm -double_precision_asm PROC NEAR -.586 - push eax ; make room - fnclex ; clear pending exceptions - fstcw WORD PTR [esp] - mov eax, DWORD PTR [esp] - and eax, 0000fcffh ; clear bits 9:8 - or eax, 000002ffh ; set 9:8 to 10 - mov DWORD PTR [esp], eax - fldcw WORD PTR [esp] - pop eax - ret 0 -double_precision_asm ENDP - -_TEXT ENDS -END \ No newline at end of file diff --git a/glide2x/sst1/glide/src/ddgump.c b/glide2x/sst1/glide/src/ddgump.c deleted file mode 100644 index 2caee27..0000000 --- a/glide2x/sst1/glide/src/ddgump.c +++ /dev/null @@ -1,604 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 2 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -extern GrMPState _gumpState; - -/* CHD BUG this belongs in fxglide.h */ -void FX_CSTYLE -_gumpTexCombineFunction( int virtual_tmu ); - -/* -** _gumpTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DDFUNC(_gumpTexCombineFunction, void, ( int virtual_tmu )) -{ - FxU32 texmode; - GrMPTextureCombineFnc_t tc; - - GR_BEGIN("_gumpTexCombineFunction",99,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",virtual_tmu)); - - texmode = gc->state.tmu_config[0].textureMode; - texmode &= ~( SST_TCOMBINE | SST_TACOMBINE ); - tc = _gumpState.tc_fnc; - - switch ( tc ) - { - case GR_MPTEXTURECOMBINE_ADD: - /* tmu0: other + local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_REPLACE | SST_TCA_REPLACE ); - } - else - { - texmode |= ( SST_TC_REPLACE | SST_TCA_REPLACE ); - } - break; - case GR_MPTEXTURECOMBINE_MULTIPLY: - /* tmu0: other * local */ - /* tmu1: local */ - /* pass0(tm0): local */ - /* pass1(tm1): local */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_REPLACE | SST_TCA_REPLACE ); - } - else - { - texmode |= ( SST_TC_REPLACE | SST_TCA_REPLACE ); - } - break; - case GR_MPTEXTURECOMBINE_DETAIL0: - /* tmu0: (other - local) * lod + local */ - /* = lod * other + (1 - lod) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lod + local */ - /* = (1 - lod) * local */ - /* pass1(tm1): (-local) * (1 - lod) + local */ - /* = lod * local */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - else - { - texmode |= ( SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - break; - case GR_MPTEXTURECOMBINE_DETAIL1: - /* tmu0: (other - local) * (1 - lod) + local */ - /* = (1 - lod) * other + lod * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * (1 - lod) + local */ - /* = lod * local */ - /* pass1(tm1): (-local) * lod + local */ - /* = (1 - lod) * local */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - else - { - texmode |= ( SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - break; - case GR_MPTEXTURECOMBINE_TRILINEAR0: - /* tmu0: (other - local) * lodbfrac + local */ - /* = lodbfrac * other + (1 - lodbfrac) * local */ - /* tmu1: local */ - /* pass0(tm0): (-local) * lodbfrac + local */ - /* = (1 - lodbfrac) * local */ - /* pass1(tm1): (-local) * (1 - lodbfrac) + local */ - /* = lodbfrac * local */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - else - { - texmode |= ( SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - break; - case GR_MPTEXTURECOMBINE_TRILINEAR1: - /* tmu0: (other - local) * (1 - lodbfrac) + local - = (1 - lodbfrac) * other + lodbfrac * local - tmu1: local - pass0(tm0): (-local) * (1 - lodbfrac) + local - = lodbfrac * local - pass1(tm1): (-local) * lodbfrac + local - = (1 - lodbfrac) * local - */ - if ( virtual_tmu == 0 ) - { - texmode |= ( SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - else - { - texmode |= ( SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC | - SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER ); - } - break; - case GR_MPTEXTURECOMBINE_SUBTRACT: - /* - tmu0: other - local - tmu1: local - doesn't work, alpha blender can't subtract - */ - GrErrorCallback( "_gumpTexCombineFunction: TEXTURE_SUBTRACT not supported", FXFALSE ); - return; - break; - default: - GrErrorCallback( "_gumpTexCombineFunction: Unsupported function", FXFALSE ); - return; - break; - } - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,0)->textureMode , texmode ); - PACKER_WORKAROUND; - GR_END_SLOPPY(); -} /* _gumpTexCombineFunction */ - -GR_ENTRY(guMPDrawTriangle, void, ( const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_BEGIN_NOFIFOCHECK("guMPDrawTriangle",98); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c)); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - /* check for multipass texture modes */ - /* xxx complex multipass mode checks should be moved into gtex/gglide */ - /* specific color combine modes use texture */ - /* this is equivalent to - fbzColorPath & SST_ENTEXTREMAP - cc_state & STATE_CC_REQUIRES_DECAL_STW */ - /* specific texture combine modes */ - /* xxx don't even check anymore, because you can't */ - - { - /* check for not possible on one tmu modes */ - /* alpha blend enabled (grAlphaBlendMode) - xxx some can work, with some cheats, even more - low bit alpha switches between iterated and constant rgb - (grAlphaControlsITRGBLighting) - alpha test (grAlphaTestFunction) - xxx actually, NEVER is ok too - chromakey - */ - - if ( ( gc->state.fbi_config.alphaMode & SST_ENALPHABLEND ) || - ( gc->state.fbi_config.fbzColorPath & SST_LOCALSELECT_OVERRIDE_WITH_ATEX ) || - ( gc->state.fbi_config.alphaMode & SST_ENALPHAFUNC ) || - ( gc->state.fbi_config.fbzMode & SST_ENCHROMAKEY ) - ) - { - GrErrorCallback( "guMPDrawTriangle: Illegal state", FXFALSE ); - } - - if ( _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_ADD || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL1 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR0 || - _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR1 ) - { - /* render pass with all effects */ - /* select other texture map */ - /* set alpha blend to add to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine bias */ - /* render other pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig; - FxU32 fogmode, fogmode_orig; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - GR_CHECK_SIZE(); - - /* first pass */ - - /* tmu setup */ - guTexSource( _gumpState.mmid[0] ); - _gumpTexCombineFunction( 0 ); - - /* render first pass */ - grDrawTriangle( a, b, c ); - - /* second pass */ - - /* xxx may need to copy texture coordinates, see - grTexCombineFunction's second parameter. if so, - we have to disable the second coordinate when drawing. */ - - /* tmu setup */ - guTexSource( _gumpState.mmid[1] ); - _gumpTexCombineFunction( 1 ); - - GR_SET_EXPECTED_SIZE(16); - /* enable alpha blend to add to destination buffers */ - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT); - - GR_SET( hw->alphaMode, alphamode ); - - /* if depth buffering, set to z= mode and disable writes */ - - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) - { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - - GR_SET( hw->fbzMode, fbzmode ); - } - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - GR_SET( hw->fogMode, fogmode ); - } - - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA ) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* render other pass */ - grDrawTriangle( a, b, c ); - - /* restore */ - GR_SET_EXPECTED_SIZE(16); - - /* restore alpha blending state */ - GR_SET( hw->alphaMode, alphamode_orig ); - - /* restore depth buffer state */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) { - GR_SET( hw->fbzMode, fbzmode_orig ); - } - - /* restore fog state */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, fogmode_orig ); - } - - /* restore ccu/acu state */ - GR_SET( hw->fbzColorPath, fbzcolorpath_orig ); - - goto all_done; - } - - else if ( _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_MULTIPLY ) - { - /* disable fog and color combine bias */ - /* render pass with all other effects */ - /* select other texture map */ - /* set alpha blend to multiply to dest buffer */ - /* if depth buffering, save depth buffer function, - set to z-equal */ - /* disable fog and color combine factor */ - /* render other pass */ - /* if fog or color combine w/bias */ - /* disable tmu */ - /* set alpha blend to add to dest buffer */ - /* enable fog and color combine bias */ - /* render bias pass */ - /* restore depth buffer function, restore alpha blend, enable fog - and color combine bias */ - - FxU32 alphamode, alphamode_orig; - FxU32 fbzcolorpath, fbzcolorpath_orig; - FxU32 fbzmode, fbzmode_orig; - FxU32 fogmode, fogmode_orig; - - alphamode = alphamode_orig = gc->state.fbi_config.alphaMode; - fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath; - - /* first pass */ - - /* tmu setup */ - - guTexSource( _gumpState.mmid[0] ); - _gumpTexCombineFunction( 0 ); - - /* disable bias */ - GR_SET_EXPECTED_SIZE(8); - - /* disable (fogta * fogColor) bias */ - /* xxx setting ADD_FOG with fog disabled is harmless */ - - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig = gc->state.fbi_config.fogMode; - fogmode |= SST_FOGADD; - GR_SET( hw->fogMode, fogmode ); - } - - /* disable biasing in color combine */ - /* this can change the parameters output */ - /* xxx consult add path for switch version */ - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA ) - { - fbzcolorpath &= ~SST_CC_ADD_CLOCAL; - } - */ - - fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL); - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* render first pass */ - - grDrawTriangle( a, b, c ); - - /* second pass */ - - /* xxx may sometimes need to copy texture coordinates */ - - /* tmu setup */ - - guTexSource( _gumpState.mmid[1] ); - _gumpTexCombineFunction( 1 ); - GR_SET_EXPECTED_SIZE(16); - - /* enable alpha blend to multiply to destination buffers */ - /* xxx alpha component blender can only handle factors of - 0 and 1 */ - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= SST_ENALPHABLEND | - (SST_A_COLOR << SST_RGBSRCFACT_SHIFT) | - (SST_A_ZERO << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ZERO << SST_ADSTFACT_SHIFT); - - GR_SET( hw->alphaMode, alphamode ); - - /* if depth buffering, set to z= mode and disable writes */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) - { - fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode; - fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC); - fbzmode |= GR_CMP_EQUAL; - GR_SET( hw->fbzMode, fbzmode ); - } - - /* disable fog */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, 0 ); - } - - /* disable factor and bias in color combine-- - decal, except for the cases that need texture alpha */ - /* this can change the parameters output */ - - fbzcolorpath = fbzcolorpath_orig; - fbzcolorpath &= ~( SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT | - SST_CC_REVERSE_BLEND ); - - /* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA - does not work, you need to do this instead of below. - - if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA ) - { - xxx see implementation notes on why this isn't implemented yet - GrErrorCallback( "guDrawTriangleMP: MULTIPLY and BLEND_ITRGB_ON_TEXALPHA not implemented yet!", FXFALSE ); - goto all_done; - } - */ - - fbzcolorpath |= SST_RGBSEL_TMUOUT; - GR_SET( hw->fbzColorPath, fbzcolorpath ); - GR_CHECK_SIZE_SLOPPY(); - - /* render second pass */ - grDrawTriangle( a, b, c ); - - /* if bias, third pass */ - if ( ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) - /* xxxXXXxxx it isn't very easy to check following any more! - || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ITALPHA || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_TIMES_ITALPHA_ADD_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_ADD_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_TEXTURE_SUB_ITRGB || - gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA || - gc->state.cc_fnc == GR_COLORCOMBINE_DIFF_SPEC_A || - gc->state.cc_fnc == GR_COLORCOMBINE_DIFF_SPEC_B */ ) - { - /* enable alpha blend to add to destination buffers */ - GR_SET_EXPECTED_SIZE(8); - - alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT); - alphamode |= SST_ENALPHABLEND | - (SST_A_ONE << SST_RGBSRCFACT_SHIFT) | - (SST_A_ONE << SST_RGBDSTFACT_SHIFT) | - (SST_A_ONE << SST_ASRCFACT_SHIFT) | - (SST_A_ONE << SST_ADSTFACT_SHIFT); - - GR_SET( hw->alphaMode, alphamode ); - - /* disable fog factor, leave fog bias enabled */ - /* xxx setting ADD_MULT with fog disabled is harmless */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - fogmode = fogmode_orig; - fogmode |= SST_FOGMULT; - GR_SET( hw->fogMode, fogmode ); - } - - /* disable factor in color combine, enable bias */ - /* this can change the parameters output */ - - fbzcolorpath = fbzcolorpath_orig; - fbzcolorpath &= ~( SST_ENTEXTUREMAP | - SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT | - SST_CC_REVERSE_BLEND ); - -#if 0 - /* xxx the following doesn't work anymore! */ - - switch ( gc->state.cc_fnc ) - { - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ITALPHA: - fbzcolorpath |= SST_CC_ADD_ALOCAL | SST_CC_ZERO_OTHER; - break; - - /* unimplemented in Glide */ - case GR_COLORCOMBINE_TEXTURE_TIMES_ITALPHA_ADD_ITRGB: - fbzcolorpath |= SST_CC_ADD_CLOCAL | SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB: - fbzcolorpath |= SST_CC_ADD_CLOCAL | SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB: - /* Can't do this on SST1, can't subtract in alpha blender */ - GrErrorCallback( "guDrawTriangleM: GR_COLORCOMBINE_TEXTURE_SUB_ITRGB does not work with GR_MPTEXTURECOMBINE_MULTIPLY.", FXFALSE ); - fbzcolorpath |= SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA: - fbzcolorpath |= SST_CC_ZERO_OTHER; - break; - - case GR_COLORCOMBINE_DIFF_SPEC_A: - fbzcolorpath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COLORCOMBINE_DIFF_SPEC_B: - fbzcolorpath |= SST_CC_ADD_ALOCAL; - break; - } -#endif - GR_CHECK_SIZE_SLOPPY(); - - /* render third pass */ - grDrawTriangle( a, b, c ); - } - - GR_SET_EXPECTED_SIZE(16); - - /* restore alpha blending state */ - GR_SET( hw->alphaMode, alphamode_orig ); - - /* restore depth buffer state */ - if ( gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER ) { - GR_SET( hw->fbzMode, fbzmode_orig ); - } - - /* restore fog state */ - if ( gc->state.fbi_config.fogMode & SST_ENFOGGING ) { - GR_SET( hw->fogMode, fogmode_orig ); - } - - /* restore ccu/acu state */ - GR_SET( hw->fbzColorPath, fbzcolorpath_orig ); - - goto all_done; - } - - else if ( _gumpState.tc_fnc == GR_MPTEXTURECOMBINE_SUBTRACT ) - { - GrErrorCallback( "gumpDrawTriangle: GR_MPTEXCOMBINE_SUBTRACT not implemented", FXFALSE ); - goto all_done; - } - } -all_done: - GR_END_SLOPPY(); -} diff --git a/glide2x/sst1/glide/src/diglide.c b/glide2x/sst1/glide/src/diglide.c deleted file mode 100644 index e0a3171..0000000 --- a/glide2x/sst1/glide/src/diglide.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 10 6/18/97 5:54p Dow - * P6 adjustments - * - * 9 3/13/97 2:51a Jdt - * Removed splash from grGlideInit(). - * - * 8 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 7 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 6 2/12/97 11:25a Hanson - * - * 5 1/18/97 11:38p Dow - * Removed _curGCFuncs Global (moved into _GlideRoot) - * - * 4 1/16/97 3:37p Dow - * Added _curGCFuncs global - * - * 3 1/14/97 10:44a Dow - * Modified grGlideInit to only call sstopen if splash screen is going to - * happen && HW != SST96 - * - * 2 1/09/97 10:50a Dow - * disabled splash screen for sst-96 - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform - * - * 32 11/17/96 11:16p Garymct - * Updated grSplash code to set all of the necessary state itself rather - * than expecting the caller to do so. - * - * 31 11/18/96 1:37a Tarolli - * fixed grAlphaBlendFunction warning bug - * - * 29 11/15/96 3:40p Jdt - * Fixed SST-96 build. - * - * 28 11/15/96 3:24p Tarolli - * renamed version.h to rcver.h , added some alpha blend function - * checking -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -/* the root of all EVIL */ -struct _GlideRoot_s GR_CDECL _GlideRoot; -/* This is global to speed up the function call wrappers */ - -/*--------------------------------------------------------------------------- -** -*/ -void -_grDisplayStats(void) -{ - int frames = _GlideRoot.stats.bufferSwaps; - - if (frames <= 0) frames = 1; - gdbg_info(80,"GLIDE STATISTICS: fifo spins: %7d\n", - _GlideRoot.stats.fifoSpins); - gdbg_info(80," triangles processed: %7d tris drawn: %7d\n", - _GlideRoot.stats.trisProcessed, - _GlideRoot.stats.trisDrawn); - gdbg_info(80," buffer swaps: %7d tris/frame: %7d , %d\n", - _GlideRoot.stats.bufferSwaps, - _GlideRoot.stats.trisProcessed/frames, - _GlideRoot.stats.trisDrawn/frames); - gdbg_info(80," points: %7d pnts/frame: %7d\n", - _GlideRoot.stats.pointsDrawn, - _GlideRoot.stats.pointsDrawn/frames); - gdbg_info(80," lines: %7d lines/frame: %7d\n", - _GlideRoot.stats.linesDrawn, - _GlideRoot.stats.linesDrawn/frames); - gdbg_info(80," texture downloads: %7d texture bytes: %7d\n", - _GlideRoot.stats.texDownloads, _GlideRoot.stats.texBytes); - gdbg_info(80," palette downloads: %7d palette bytes: %7d\n", - _GlideRoot.stats.palDownloads, _GlideRoot.stats.palBytes); -#ifdef GLIDE_DEBUG - /* these stats are only kept in debugging mode */ - gdbg_info(80," Min PCI FIFO free: 0x%04x (%d)\n", - _GlideRoot.stats.minPciFIFOFree, _GlideRoot.stats.minPciFIFOFree ); - gdbg_info(80," Min Memory FIFO free: 0x%04x (%d)\n", - _GlideRoot.stats.minMemFIFOFree, _GlideRoot.stats.minMemFIFOFree); -#endif -} -/* -** fifoFree is kept in bytes, each fifo entry is 8 bytes, but since there -** are headers involved, we assume an average of 2 registers per 8 bytes -** or 4 bytes of registers stored in every fifo entry -*/ -void -_grReCacheFifo( FxI32 n ) -{ - GR_DCL_GC; - gc->state.fifoFree = ((grSstStatus() >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff)<<2; - gc->state.fifoFree -= gc->hwDep.sst1Dep.swFifoLWM + n; -} - -FxI32 GR_CDECL -_grSpinFifo( FxI32 n ) -{ - GR_DCL_GC; - do { - _GlideRoot.stats.fifoSpins++; - _grReCacheFifo( n ); - } while (gc->state.fifoFree < 0); - return gc->state.fifoFree; -} - -/*--------------------------------------------------------------------------- -** No Comment -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer( void ) -{ - GR_DCL_GC; - if ( gc->state.screen_height == 640 ) { - if ( gc->fbuf_size == 1 ) { - return FXFALSE; - } - } else if ( gc->state.screen_width == 800 ) { - if ( ( gc->fbuf_size == 1 ) || - ( gc->fbuf_size == 2 ) ) { - return FXFALSE; - } - } - return FXTRUE; -} /* _grCanSupportDepthBuffer */ -#endif - -/*--------------------------------------------------------------------------- -** -*/ -void -_grSwizzleColor( GrColor_t *color ) -{ - GR_DCL_GC; - unsigned long red, green, blue, alpha; - - switch( gc->state.color_format ) { - case GR_COLORFORMAT_ARGB: - break; - case GR_COLORFORMAT_ABGR: - blue = *color & 0x00ff; - red = ( *color >> 16 ) & 0xff; - *color &= 0xff00ff00; - *color |= ( blue << 16 ); - *color |= red; - break; - case GR_COLORFORMAT_RGBA: - red = ( *color & 0x0000ff00 ) >> 8; - green = ( *color & 0x00ff0000 ) >> 16; - blue = ( *color & 0xff000000 ) >> 24; - alpha = ( *color & 0x000000ff ); - *color = ( alpha << 24 ) | ( blue << 16 ) | ( green << 8 ) | red; - break; - case GR_COLORFORMAT_BGRA: - red = ( *color & 0xff000000 ) >> 24; - green = ( *color & 0x00ff0000 ) >> 16; - blue = ( *color & 0x0000ff00 ) >> 8; - alpha = ( *color & 0x000000ff ); - *color = ( alpha << 24 ) | ( blue << 16 ) | ( green << 8 ) | red; - break; - } -} /* _grSwizzleColor */ - -/*--------------------------------------------------------------------------- -** grGlideGetVersion -** NOTE: allow this to be called before grGlideInit() -*/ -GR_DIENTRY(grGlideGetVersion, void, ( char version[80] )) -{ - GDBG_INFO((87,"grGlideGetVersion(0x%x) => \"%s\"\n",version,glideIdent+3)); - GR_ASSERT(version != NULL); - strcpy(version,glideIdent+3); -} /* grGlideGetVersion */ - -/*--------------------------------------------------------------------------- -** grGlideGetState -*/ -GR_DIENTRY(grGlideGetState, void, ( GrState *state )) -{ - GR_BEGIN_NOFIFOCHECK("grGlideGetState",87); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",state)); - GR_ASSERT(state != NULL); - *state = gc->state; - GR_END(); -} /* grGlideGetState */ - -/*--------------------------------------------------------------------------- -** grHints -*/ -GR_DIENTRY(grHints, void, (GrHint_t hintType, FxU32 hints)) -{ - extern void GR_CDECL single_precision_asm(void); - extern void GR_CDECL double_precision_asm(void); - GR_BEGIN_NOFIFOCHECK("grHints",85); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x)\n",hintType,hints)); - - switch (hintType) { - case GR_HINT_STWHINT: - if (gc->state.paramHints != hints) { - gc->state.paramHints = hints; - _grUpdateParamIndex(); - } - break; - case GR_HINT_FIFOCHECKHINT: - if (hints) { - gc->state.checkFifo = FXTRUE; - /* swFifoLWM is kept internally in bytes, hints are in fifo - entries */ - if (_GlideRoot.environment.swFifoLWM >= 0) - gc->hwDep.sst1Dep.swFifoLWM = - _GlideRoot.environment.swFifoLWM << 2; - else - gc->hwDep.sst1Dep.swFifoLWM = (hints & 0xffff) << 2; - - } else - gc->state.checkFifo = FXFALSE; - break; - case GR_HINT_FPUPRECISION: - hints ? double_precision_asm() : single_precision_asm(); - break; - case GR_HINT_ALLOW_MIPMAP_DITHER: - gc->state.allowLODdither = hints; - break; - default: - GR_CHECK_F( myName, 1, "invalid hints type" ); - } - GR_END(); -} /* grHints */ - -/*--------------------------------------------------------------------------- -** grGlideInit -*/ -GR_DIENTRY(grGlideInit, void, ( void )) -{ - GDBG_INIT(); - - GDBG_INFO((80,"grGlideInit()\n")); - _GlideInitEnvironment(); /* the main init code */ - FXUNUSED(*glideIdent); - - grResetTriStats(); - GDBG_INFO((281,"grGlideInit --done---------------------------------------\n")); -} /* grGlideInit */ - - -/*--------------------------------------------------------------------------- -** grGlideShamelessPlug - grGlideShamelessPlug -** -** Returns: -** -** Notes: -** -*/ -GR_DIENTRY(grGlideShamelessPlug, void, ( const FxBool mode )) -{ - GDBG_INFO((80,"grGlideShamelessPlug(%d)\n",mode)); - _GlideRoot.environment.shamelessPlug = mode; -} /* grGlideShamelessPlug */ - - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -GR_DIENTRY(grResetTriStats, void, ( void )) -{ - GDBG_INFO((80,"grResetTriStats()\n")); - _GlideRoot.stats.fifoSpins = 0; - _GlideRoot.stats.bufferSwaps = 0; - _GlideRoot.stats.linesDrawn = 0; - _GlideRoot.stats.trisProcessed = 0; - _GlideRoot.stats.trisDrawn = 0; - _GlideRoot.stats.texDownloads = 0; - _GlideRoot.stats.texBytes = 0; - _GlideRoot.stats.palDownloads = 0; - _GlideRoot.stats.palBytes = 0; -} /* grResetTriStats */ - - -/*--------------------------------------------------------------------------- -** grResetTriStats - Set triangle counters to zero. -*/ -GR_DIENTRY(grTriStats, void, ( FxU32 *trisProcessed, FxU32 *trisDrawn )) -{ - GDBG_INFO((80,"grTriStats() => %d %d\n", - _GlideRoot.stats.trisProcessed, - _GlideRoot.stats.trisDrawn)); - *trisProcessed = _GlideRoot.stats.trisProcessed; - *trisDrawn = _GlideRoot.stats.trisDrawn; -} /* grTriStats */ - -void GR_CDECL -_grFence( void ) -{ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_DCL_GC; - GDBG_INFO((125,"\t\t\t\t%d writes since last fence\n", - gc->hwDep.sst96Dep.writesSinceFence)); -#endif - GDBG_INFO((125,"\t\t\t\t\t\t\tFENCE\n")); - - P6FENCE; -} diff --git a/glide2x/sst1/glide/src/digutex.c b/glide2x/sst1/glide/src/digutex.c deleted file mode 100644 index f283685..0000000 --- a/glide2x/sst1/glide/src/digutex.c +++ /dev/null @@ -1,562 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 5 8/14/97 7:02p Pgj - * per GMT - * - * 4 5/05/97 4:24p Pgj - * Neuter guTexDownloadMipMap error message - * - * 3 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 2 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from ditex.c */ -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; - - -/*--------------------------------------------------------------------------- -** guTexAllocateMemory -*/ -GR_DIENTRY(guTexAllocateMemory, GrMipMapId_t, ( GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t format, - GrMipMapMode_t mipmap_mode, - GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect_ratio, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - )) -{ - FxU32 - memrequired, - memavail, - baseAddress, - tLod, - texturemode, - filterMode, /* filter mode bits */ - clampMode; /* clamp mode bits */ - - GrMipMapId_t - mmid = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - int - int_lod_bias; - GrTexInfo info; - - GR_BEGIN_NOFIFOCHECK("guTexAllocateMemory",99); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - tmu,odd_even_mask,width,height,format,mipmap_mode, - small_lod,large_lod,aspect_ratio, - s_clamp_mode,t_clamp_mode, minfilter_mode,magfilter_mode)); - /* - ** The constants are actually reverse of each other so the following - ** test IS valid! - */ - GR_CHECK_F(myName, small_lod < large_lod, "smallest_lod is larger than large_lod"); - - info.smallLod = small_lod; - info.largeLod = large_lod; - info.aspectRatio = aspect_ratio; - info.format = format; - memrequired = grTexTextureMemRequired(odd_even_mask, &info); - - /* - ** Make sure to not cross 2 MByte texture boundry - */ - if ((gc->tmu_state[tmu].freemem_base < 0x200000) && - (gc->tmu_state[tmu].freemem_base + memrequired > 0x200000)) - gc->tmu_state[tmu].freemem_base = 0x200000; - - /* - ** If we have enough memory and a free mip map handle then go for it - */ - memavail = guTexMemQueryAvail( tmu ); - - if ( memavail < memrequired ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - if (gc->mm_table.free_mmid >= MAX_MIPMAPS_PER_SST ) - return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - - /* - ** Allocate the mip map id - */ - mmid = gc->mm_table.free_mmid++; - - /* - ** calculate baseAddress (where LOD 0 would go) - */ - baseAddress = _grTexCalcBaseAddress( gc->tmu_state[tmu].freemem_base, - large_lod, - aspect_ratio, - format, - odd_even_mask ); - - GDBG_INFO((gc->myLevel," baseAddress = 0x%x (in bytes)\n",baseAddress)); - - /* - ** reduce available memory to reflect allocation - */ - gc->tmu_state[tmu].freemem_base += memrequired; - - /* - ** Create the tLOD register value for this mip map - */ - int_lod_bias = _grTexFloatLODToFixedLOD( lod_bias ); - tLod = mipmap_mode==GR_MIPMAP_DISABLE ? large_lod : small_lod; - tLod = SST_TLOD_MINMAX_INT(large_lod,tLod); - tLod |= _gr_evenOdd_xlate_table[odd_even_mask]; - tLod |= _gr_aspect_xlate_table[aspect_ratio]; - tLod |= int_lod_bias << SST_LODBIAS_SHIFT; - filterMode = ( - (minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - - clampMode = ( - (s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** Create the tTextureMode register value for this mip map - */ - texturemode = ( format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( trilinear ) { - texturemode |= SST_TRILINEAR; - - if ( odd_even_mask & GR_MIPMAPLEVELMASK_ODD ) - tLod |= SST_LOD_ODD; - - if ( odd_even_mask != GR_MIPMAPLEVELMASK_BOTH ) - tLod |= SST_LOD_TSPLIT; - } - - /* - ** Fill in the mm_table data for this mip map - */ - gc->mm_table.data[mmid].format = format; - gc->mm_table.data[mmid].mipmap_mode = mipmap_mode; - gc->mm_table.data[mmid].magfilter_mode = magfilter_mode; - gc->mm_table.data[mmid].minfilter_mode = minfilter_mode; - gc->mm_table.data[mmid].s_clamp_mode = s_clamp_mode; - gc->mm_table.data[mmid].t_clamp_mode = t_clamp_mode; - gc->mm_table.data[mmid].tLOD = tLod; - gc->mm_table.data[mmid].tTextureMode = texturemode; - gc->mm_table.data[mmid].lod_bias = int_lod_bias; - gc->mm_table.data[mmid].lod_min = small_lod; - gc->mm_table.data[mmid].lod_max = large_lod; - gc->mm_table.data[mmid].tmu = tmu; - gc->mm_table.data[mmid].odd_even_mask = odd_even_mask; - gc->mm_table.data[mmid].tmu_base_address = baseAddress; - gc->mm_table.data[mmid].trilinear = trilinear; - gc->mm_table.data[mmid].aspect_ratio = aspect_ratio; - gc->mm_table.data[mmid].data = 0; - /* gc->mm_table.data[mmid].ncc_table = 0; */ - gc->mm_table.data[mmid].sst = _GlideRoot.current_sst; - gc->mm_table.data[mmid].valid = FXTRUE; - gc->mm_table.data[mmid].width = width; - gc->mm_table.data[mmid].height = height; - - GR_RETURN(mmid); -} /* guTexAllocateMemory */ - -static void -_guTexRebuildRegisterShadows( GrMipMapId_t mmid ) -{ - GR_DCL_GC; - GrMipMapInfo *mminfo = &gc->mm_table.data[mmid]; - int texturemode = 0; - int tLod = 0; - FxU32 - filterMode, /* filter mode bits of texturemode */ - clampMode; /* clamp mode bits of texturemode */ - - /* build filterMode */ - filterMode = ( - (mminfo->minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (mminfo->magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0) - ); - clampMode = ( - (mminfo->s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (mminfo->t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - /* - ** build up tTextureMode - */ - texturemode |= ( mminfo->format << SST_TFORMAT_SHIFT ); - texturemode |= SST_TCLAMPW; - texturemode |= SST_TPERSP_ST; - texturemode |= filterMode; - texturemode |= clampMode; - - if ( mminfo->mipmap_mode == GR_MIPMAP_NEAREST_DITHER ) - texturemode |= SST_TLODDITHER; - - if ( mminfo->trilinear ) - texturemode |= SST_TRILINEAR; - - /* - ** build up tLOD - */ - tLod = mminfo->mipmap_mode == GR_MIPMAP_DISABLE ? mminfo->lod_max : mminfo->lod_min; - tLod = SST_TLOD_MINMAX_INT(mminfo->lod_max,tLod); - tLod |= _gr_evenOdd_xlate_table[mminfo->odd_even_mask]; - tLod |= _gr_aspect_xlate_table[mminfo->aspect_ratio]; - tLod |= mminfo->lod_bias << SST_LODBIAS_SHIFT; - - /* - ** assign them - */ - mminfo->tTextureMode = texturemode; - mminfo->tLOD = tLod; -} /* guTexRebuildRegisterShadows */ - - -/*--------------------------------------------------------------------------- -** guTexChangeAttributes -*/ -GR_DIENTRY(guTexChangeAttributes, FxBool, ( GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - )) -{ - GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexChangeAttributes",88); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n", - mmid,width,height,fmt,mm_mode, - smallest_lod,largest_lod,aspect, - s_clamp_mode,t_clamp_mode, minFilterMode,magFilterMode)); - /* - ** Make sure that mmid is not NULL - */ - if ( mmid == GR_NULL_MIPMAP_HANDLE ) { - GR_RETURN(FXFALSE); - } - - mminfo = &gc->mm_table.data[mmid]; - - /* - ** Fill in the mm_table data for this mip map - */ - if ( fmt != -1 ) - mminfo->format = fmt; - - if ( mm_mode != -1 ) - mminfo->mipmap_mode = mm_mode; - - if ( smallest_lod != -1 ) - mminfo->lod_min = smallest_lod; - if ( largest_lod != -1 ) - mminfo->lod_max = largest_lod; - if ( minFilterMode != -1 ) - mminfo->minfilter_mode = minFilterMode; - if ( magFilterMode != -1 ) - mminfo->magfilter_mode = magFilterMode; - if ( s_clamp_mode != -1 ) - mminfo->s_clamp_mode = s_clamp_mode; - if ( t_clamp_mode != -1 ) - mminfo->t_clamp_mode = t_clamp_mode; - if ( aspect != -1 ) - mminfo->aspect_ratio = aspect; - if ( width != -1 ) - mminfo->width = width; - if ( height != -1 ) - mminfo->height = height; - - _guTexRebuildRegisterShadows( mmid ); - GR_RETURN(FXTRUE); -} /* guTexChangeAttributes */ - -/*--------------------------------------------------------------------------- -** grTexCombineFunction - obsolete -** -*/ -GR_DIENTRY(grTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - guTexCombineFunction( tmu, tc ); -} - -/*--------------------------------------------------------------------------- -** guTexCombineFunction -** -** Sets the texture combine function. For a dual TMU system this function -** will configure the TEXTUREMODE registers as appropriate. For a -** single TMU system this function will configure TEXTUREMODE if -** possible, or defer operations until grDrawTriangle() is called. -*/ -GR_DIENTRY(guTexCombineFunction, void, - (GrChipID_t tmu, GrTextureCombineFnc_t tc)) -{ - GDBG_INFO((99,"guTexCombineFunction(%d,%d)\n",tmu,tc)); - switch ( tc ) { - case GR_TEXTURECOMBINE_ZERO: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DECAL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_ONE: - grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXTRUE, FXTRUE ); - break; - - case GR_TEXTURECOMBINE_ADD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_MULTIPLY: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_DETAIL_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_ODD: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_TRILINEAR_EVEN: - grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_SUBTRACT: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - case GR_TEXTURECOMBINE_OTHER: - grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE ); - break; - - default: - GrErrorCallback( "guTexCombineFunction: Unsupported function", FXTRUE ); - break; - } -} /* guTexCombineFunction */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMap -** -** Downloads a mip map (previously allocated with guTexAllocateMemory) to -** the hardware using the given data and ncctble. The "data" is assumed -** to be in row major order from largest mip map to smallest mip map. -*/ -GR_DIENTRY(guTexDownloadMipMap, void, - (GrMipMapId_t mmid, const void *src, const GuNccTable - *ncc_table ) ) -{ - GR_DCL_GC; - GrLOD_t lod; - const void *ptr = src; - - GDBG_INFO((99,"guTexDownloadMipMap(%d,0x%x,0x%x)\n",mmid,src,ncc_table)); - GR_ASSERT(gc != NULL); - GR_ASSERT(src != NULL); - GR_CHECK_F("guTexDownloadMipMap", - ( mmid == GR_NULL_MIPMAP_HANDLE ) || ( mmid >= gc->mm_table.free_mmid ), - "invalid mip map handle passed"); - -#if 0 /* Fixme!!! XXX ??? */ - GR_CHECK_F("guTexDownloadMipMap", - gc->mm_table.data[mmid].format == GR_TEXFMT_P_8, - "guTex* does not support palletted textures - use grTex* instead"); -#endif /* 0 */ - - /* - ** Bind data and ncc table to this mip map - */ - gc->mm_table.data[mmid].data = (void *) ptr; - if (gc->mm_table.data[mmid].format == GR_TEXFMT_YIQ_422 || - gc->mm_table.data[mmid].format == GR_TEXFMT_AYIQ_8422) { - gc->mm_table.data[mmid].ncc_table = *ncc_table; - } - - /* - ** Start downloading mip map levels, note that ptr is updated by the caller - */ - for ( lod = gc->mm_table.data[mmid].lod_max; lod <= gc->mm_table.data[mmid].lod_min; lod++ ) { - guTexDownloadMipMapLevel( mmid, lod, &ptr ); - } -} /* guTexDownloadMipMap */ - -/*--------------------------------------------------------------------------- -** guTexDownloadMipMapLevel -** -** Downloads a single mip map level to a mip map. "src" is considered to be -** row major data of the correct aspect ratio and format. -*/ -GR_DIENTRY(guTexDownloadMipMapLevel, void, - (GrMipMapId_t mmid, GrLOD_t lod, - const void **src_base)) -{ - FxU32 i; - const GrMipMapInfo *mminfo; - GR_DCL_GC; - - GDBG_INFO((99,"guTexDownloadMipMapLevel(%d,%d,0x%x)\n",mmid,lod,src_base)); - GR_ASSERT(src_base != NULL); - mminfo = &gc->mm_table.data[mmid]; - GR_CHECK_F( "guTexDownloadMipMapLevel", - ( lod > mminfo->lod_min ) || ( lod < mminfo->lod_max ), - "specified lod is out of range"); - - /* GMT: replace with array access */ - /* download this level */ - i = _grTexCalcBaseAddress( 0, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask); - grTexDownloadMipMapLevel( mminfo->tmu, - mminfo->tmu_base_address - i, - lod, - mminfo->lod_max, - mminfo->aspect_ratio, - mminfo->format, - mminfo->odd_even_mask, - (void *)*src_base ); - - /* update src_base to point to next mipmap level */ - *src_base = (void *) (((FxU32)*src_base) + - (_grMipMapHostSize[_gr_aspect_index_table[mminfo->aspect_ratio]][lod] - << (mminfo->format>=GR_TEXFMT_16BIT))); - -} /* guTexDownloadMipmapLevel */ - -/*--------------------------------------------------------------------------- -** guTexGetCurrentMipMap -*/ -GR_DIENTRY(guTexGetCurrentMipMap, GrMipMapId_t, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - - GR_RETURN(gc->state.current_mm[tmu]); -} /* guTexGetCurrentMipMap */ - -/*--------------------------------------------------------------------------- -** guTexGetMipMapInfo -*/ -GR_DIENTRY(guTexGetMipMapInfo, GrMipMapInfo *, ( GrMipMapId_t mmid )) -{ - GR_BEGIN_NOFIFOCHECK("guTexGetMipMapInfo",99); - GDBG_INFO_MORE((gc->myLevel,"(%d) => 0x%x\n",mmid,&gc->mm_table.data[mmid])); - return &( gc->mm_table.data[mmid] ); -} /* guTexGetMipMapInfo */ - -/*--------------------------------------------------------------------------- -** guTexMemQueryAvail -** -** returns the amount of available texture memory on a specified TMU. -*/ -GR_DIENTRY(guTexMemQueryAvail, FxU32, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base); -} /* guTexQueryMemAvail */ - -/*--------------------------------------------------------------------------- -** guTexMemReset -** -** Clears out texture buffer memory. -*/ -GR_DIENTRY(guTexMemReset, void, ( void )) -{ - int i; - - GR_BEGIN_NOFIFOCHECK("guTexMemReset",99); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - - memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) ); - gc->mm_table.free_mmid = 0; - - for ( i = 0; i < gc->num_tmu; i++ ) { - gc->state.current_mm[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].freemem_base = 0; - gc->tmu_state[i].ncc_mmids[0] = - gc->tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - gc->tmu_state[i].ncc_table[0] = - gc->tmu_state[i].ncc_table[1] = 0; - } - GR_END(); -} /* guTexMemReset */ - diff --git a/glide2x/sst1/glide/src/disst.c b/glide2x/sst1/glide/src/disst.c deleted file mode 100644 index 1f4053e..0000000 --- a/glide2x/sst1/glide/src/disst.c +++ /dev/null @@ -1,167 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 9 8/13/97 8:51a Pgj - * Fix Bug 710 - * - * 8 7/24/97 10:55a Dow - * Fixed bogus check in grSstQueryHardware - * - * 7 5/02/97 2:07p Pgj - * grSstScreenWidth/Height now FxU32 - * - * 6 3/17/97 6:25a Jdt - * Added initDeviceSelect to grSstSelect() - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 3 1/18/97 11:39p Dow - * Changed location of _curGCFuncs - * - * 2 1/16/97 3:39p Dow - * Added ref to _curGCFuncs during grSstSelect() - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include -#include <3dfx.h> - -#include -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - - -/*--------------------------------------------------------------------------- -** grSstQueryBoards -** -** NOTE: it is OK to call this routine before grGlideInit -*/ -GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc )) -{ - GDBG_INFO((80,"grSstQueryBoards(0x%x)\n",hwc)); - - hwc->num_sst = initNumBoardsInSystem(); - return FXTRUE; -} /* grSstQueryBoards */ - -/*--------------------------------------------------------------------------- -** grSstQueryHardware -** -*/ -GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc )) -{ - FxBool retVal; - - GDBG_INFO((80, "grSstQueryHardware\n")); - GDBG_INFO_MORE((80,"(0x%x)\n",hwc)); - - /* init and copy the data back to the user's structure */ - retVal = _GlideRoot.hwConfig.num_sst > 0; - *hwc = _GlideRoot.hwConfig; - - return(retVal); -} /* grSstQueryHardware */ - -/*--------------------------------------------------------------------------- -** grSstSelect -*/ -GR_DIENTRY(grSstSelect, void, ( int which )) -{ - if ( which >= _GlideRoot.hwConfig.num_sst ) - GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE ); - - _GlideRoot.current_sst = which; - _GlideRoot.curGC = &_GlideRoot.GCs[which]; -#ifdef GLIDE_MULTIPLATFORM - _GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs; -#endif - /* now begin a normal Glide routine's flow */ - { - GR_BEGIN_NOFIFOCHECK("grSstSelect",80); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",which)); - - _GlideRoot.packerFixAddress = ( FxU32 ) gc->tex_ptr; - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 3 ) << 21 ); - _GlideRoot.packerFixAddress += ( ( ( FxU32 ) 1 ) << 17 ); - - /* Now that we have selected a board, we can build the offests and register - lists for the optimized triangle setup code */ - _grRebuildDataList(); - - initDeviceSelect( which ); - - GR_END(); - } -} /* grSstSelect */ - -/*--------------------------------------------------------------------------- -** grSstScreenWidth -*/ -GR_DIENTRY(grSstScreenWidth, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_width; -} /* grSstScreenWidth */ - -/*--------------------------------------------------------------------------- -** grSstScreenHeight -*/ -GR_DIENTRY(grSstScreenHeight, FxU32, (void)) -{ - GR_DCL_GC; - GR_ASSERT(gc != NULL); - return gc->state.screen_height; -} - -/*--------------------------------------------------------------------------- -** grSstVidMode - override args to grSstOpen() -*/ -GR_DIENTRY(grSstVidMode, void, - (FxU32 whichSst, sst1VideoTimingStruct *vidTimings)) -{ - GDBG_INFO((80,"grSstVidMode(%d,0x%x)\n",whichSst,vidTimings)); -#ifdef GLIDE_DEBUG - if (whichSst >= MAX_NUM_SST) { - char errStr[1028]; - sprintf(errStr, "grSstVidMode: %d greater than MAX_NUM_SST (%d)\n", - whichSst, MAX_NUM_SST); - - GrErrorCallback(errStr, FXTRUE); - } -#endif - - _GlideRoot.GCs[whichSst].vidTimings = vidTimings; -} /* grSstVidMode */ - diff --git a/glide2x/sst1/glide/src/ditex.c b/glide2x/sst1/glide/src/ditex.c deleted file mode 100644 index f35484e..0000000 --- a/glide2x/sst1/glide/src/ditex.c +++ /dev/null @@ -1,642 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 11 8/19/97 5:02p Atai - * delete the hack for 4MB texture memory - * - * 10 8/14/97 6:45p Pgj - * Fixed bug per GMT - * - * 9 8/11/97 3:56p Atai - * fixed error message - * - * 8 8/11/97 1:39p Atai - * step 1: use environment variable to set up texture memory size - * - * 7 7/18/97 6:46p Jdt - * Protected access to vgInfo structure - * - * 6 3/15/97 8:09p Jdt - * Remove grTexDownloadTable from this file because I added SST-1 only - * code to it - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 3 2/12/97 12:34p Dow - * Fixed Hanson muckage - * - * 2 1/18/97 11:41p Dow - * Fixed Gary's "Last C Bug" analog - * Fixed usage of _grMipMapOffset_Tsplit - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ - -#include -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -FxU32 _gr_aspect_index_table[] = -{ - 3, - 2, - 1, - 0, - 1, - 2, - 3, -}; - -/* size in texels */ -FxU32 _grMipMapHostSize[4][16] = -{ - { /* 1:1 aspect ratio */ - 65536, /* 0 : 256x256 */ - 16384, /* 1 : 128x128 */ - 4096, /* 2 : 64x64 */ - 1024, /* 3 : 32x32 */ - 256, /* 4 : 16x16 */ - 64, /* 5 : 8x8 */ - 16, /* 6 : 4x4 */ - 4, /* 7 : 2x2 */ - 1, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 32768, /* 0 : 256x128 */ - 8192, /* 1 : 128x64 */ - 2048, /* 2 : 64x32 */ - 512, /* 3 : 32x16 */ - 128, /* 4 : 16x8 */ - 32, /* 5 : 8x4 */ - 8, /* 6 : 4x2 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 16384, /* 0 : 256x64 */ - 4096, /* 1 : 128x32 */ - 1024, /* 2 : 64x16 */ - 256, /* 3 : 32x8 */ - 64, /* 4 : 16x4 */ - 16, /* 5 : 8x2 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - }, - { /* 8:1 aspect ratio */ - 8192, /* 0 : 256x32 */ - 2048, /* 1 : 128x16 */ - 512, /* 2 : 64x8 */ - 128, /* 3 : 32x4 */ - 32, /* 4 : 16x2 */ - 8, /* 5 : 8x1 */ - 4, /* 6 : 4x1 */ - 2, /* 7 : 2x1 */ - 1, /* 8 : 1x1 */ - } -}; - -const int _grMipMapHostWH[GR_ASPECT_1x8+1][GR_LOD_1+1][2] = -{ - { - 256 , 32, - 128 , 16, - 64 , 8, - 32 , 4, - 16 , 2, - 8 , 1, - 4 , 1, - 2 , 1, - 1 , 1 - }, - { - 256 , 64, - 128 , 32, - 64 , 16, - 32 , 8, - 16 , 4, - 8 , 2, - 4 , 1, - 2 , 1, - 1 , 1 - }, - { - 256 , 128, - 128 , 64, - 64 , 32, - 32 , 16, - 16 , 8, - 8 , 4, - 4 , 2, - 2 , 1, - 1 , 1 - }, - { - 256 , 256, - 128 , 128, - 64 , 64, - 32 , 32, - 16 , 16, - 8 , 8, - 4 , 4, - 2 , 2, - 1 , 1 - }, - { - 128, 256, - 64, 128, - 32, 64 , - 16, 32 , - 8, 16 , - 4, 8 , - 2, 4 , - 1, 2 , - 1, 1 - }, - { - 64, 256, - 32, 128, - 16, 64 , - 8, 32 , - 4, 16 , - 2, 8 , - 1, 4 , - 1, 2 , - 1, 1 - }, - { - 32, 256, - 16, 128, - 8, 64 , - 4, 32 , - 2, 16 , - 1, 8 , - 1, 4 , - 1, 2 , - 1, 1 - } -}; - -/* translates GR_ASPECT_* to bits for the TLOD register */ -FxU32 _gr_aspect_xlate_table[] = -{ - (3<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (2<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - (1<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER, - 0<< SST_LOD_ASPECT_SHIFT, - 1<< SST_LOD_ASPECT_SHIFT, - 2<< SST_LOD_ASPECT_SHIFT, - 3<< SST_LOD_ASPECT_SHIFT -}; - -FxU32 _gr_evenOdd_xlate_table[] = -{ - 0xFFFFFFFF, /* invalid */ - SST_LOD_TSPLIT, /* even */ - SST_LOD_TSPLIT | SST_LOD_ODD, /* odd */ - 0, /* both */ -}; - -/* the size of each mipmap level in texels, 4 is the minimum no matter what */ -/* index is [aspect_ratio][lod] */ -unsigned long _grMipMapSize[4][16] = { - { /* 8:1 aspect ratio */ - 0x02000, /* 0 : 256x32 */ - 0x00800, /* 1 : 128x16 */ - 0x00200, /* 2 : 64x8 */ - 0x00080, /* 3 : 32x4 */ - 0x00020, /* 4 : 16x2 */ - 0x00010, /* 5 : 8x1 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 4:1 aspect ratio */ - 0x04000, /* 0 : 256x64 */ - 0x01000, /* 1 : 128x32 */ - 0x00400, /* 2 : 64x16 */ - 0x00100, /* 3 : 32x8 */ - 0x00040, /* 4 : 16x4 */ - 0x00010, /* 5 : 8x2 */ - 0x00008, /* 6 : 4x1 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 2:1 aspect ratio */ - 0x08000, /* 0 : 256x128 */ - 0x02000, /* 1 : 128x64 */ - 0x00800, /* 2 : 64x32 */ - 0x00200, /* 3 : 32x16 */ - 0x00080, /* 4 : 16x8 */ - 0x00020, /* 5 : 8x4 */ - 0x00008, /* 6 : 4x2 */ - 0x00004, /* 7 : 2x1 */ - 0x00004, /* 8 : 1x1 */ - }, - { /* 1:1 aspect ratio */ - 0x10000, /* 0 : 256x256 */ - 0x04000, /* 1 : 128x128 */ - 0x01000, /* 2 : 64x64 */ - 0x00400, /* 3 : 32x32 */ - 0x00100, /* 4 : 16x16 */ - 0x00040, /* 5 : 8x8 */ - 0x00010, /* 6 : 4x4 */ - 0x00004, /* 7 : 2x2 */ - 0x00004, /* 8 : 1x1 */ - }, -}; - - -/* the offset from mipmap level 0 of each mipmap level in texels */ -/* index is [aspect_ratio][lod] */ -unsigned long _grMipMapOffset[4][16]; -unsigned long _grMipMapOffset_Tsplit[4][16]; - -/* initialize the MipMap Offset arrays */ -void -_grMipMapInit(void) -{ - int ar,lod; - - for (ar=0; ar<4; ar++) { /* for each aspect ratio */ - _grMipMapOffset[ar][0] = 0; /* start off with offset=0 */ - for (lod=1; lod<=9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset[ar][lod] = _grMipMapOffset[ar][lod-1] + - _grMipMapSize[ar][lod-1]; - } - _grMipMapOffset_Tsplit[ar][0] = 0; /* start off with offset=0 */ - _grMipMapOffset_Tsplit[ar][1] = 0; /* start off with offset=0 */ - for (lod=2; lod<=9; lod++) { /* for each lod, add in prev size */ - _grMipMapOffset_Tsplit[ar][lod] = _grMipMapOffset_Tsplit[ar][lod-2] + - _grMipMapSize[ar][lod-2]; - } - } -} /* _grMipMapInit */ - -/*--------------------------------------------------------------------------- -** -*/ -FxU32 -_grTexTextureMemRequired( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd ) -{ - FxU32 memrequired; - - GR_CHECK_W("_grTexTextureMemRequired", small_lod < large_lod, - "small_lod bigger than large_lod" ); - GR_CHECK_F( "_grTexTextureMemRequired", evenOdd > GR_MIPMAPLEVELMASK_BOTH || evenOdd == 0, "invalid evenOdd mask" ); - - if ( aspect > GR_ASPECT_1x1 ) /* mirror aspect ratios */ - aspect = GR_ASPECT_1x8 - aspect; - - if ( evenOdd == GR_MIPMAPLEVELMASK_BOTH ) { - memrequired = _grMipMapOffset[aspect][small_lod+1]; - memrequired -= _grMipMapOffset[aspect][large_lod]; - } - else { - memrequired = 0; - /* construct XOR mask */ - evenOdd = (evenOdd == GR_MIPMAPLEVELMASK_EVEN) ? 1 : 0; - while (large_lod <= small_lod) { /* sum up all the mipmap levels */ - if ((large_lod ^ evenOdd) & 1) /* that match the XOR mask */ - memrequired += _grMipMapSize[aspect][large_lod]; - large_lod++; - } - } - - if ( format >= GR_TEXFMT_16BIT ) /* convert from texels to bytes */ - memrequired <<= 1; /* 2 bytes per texel */ - - memrequired += 7; /* round up to 8 byte boundary */ - memrequired &= ~7; - return memrequired; -} /* _grTexTextureMemRequired */ - -FxU16 -_grTexFloatLODToFixedLOD( float value ) -{ - float num_quarters; - int new_value; - - num_quarters = ( value + .125F ) / .25F; - new_value = ( int ) num_quarters; - - new_value &= 0x003F; - - return new_value; -} /* _grTexFloatLODToFixedLOD */ - -/*--------------------------------------------------------------------------- -** _grTexCalcBaseAddress -*/ -FxU32 -_grTexCalcBaseAddress( FxU32 start, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 odd_even_mask ) -{ - FxU32 sum_of_lod_sizes; - - if ( aspect > GR_ASPECT_1x1 ) /* mirror aspect ratios */ - aspect = GR_ASPECT_1x8 - aspect; - - if ( odd_even_mask == GR_MIPMAPLEVELMASK_BOTH ) - sum_of_lod_sizes = _grMipMapOffset[aspect][large_lod]; - else { - if ( - ((odd_even_mask == GR_MIPMAPLEVELMASK_EVEN) && (large_lod & 1)) || - ((odd_even_mask == GR_MIPMAPLEVELMASK_ODD) && !(large_lod & 1)) - ) - large_lod += 1; - sum_of_lod_sizes = _grMipMapOffset_Tsplit[aspect][large_lod]; - } - - if ( format >= GR_TEXFMT_16BIT ) - sum_of_lod_sizes <<= 1; - return ( start - sum_of_lod_sizes ); -} /* _grTexCalcBaseAddress */ - -/*--------------------------------------------------------------------------- -** grTexCalcMemRequired -*/ -GR_DIENTRY(grTexCalcMemRequired, FxU32, - ( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format )) -{ - FxU32 memrequired; - - memrequired = _grTexTextureMemRequired(small_lod, large_lod, - aspect, format, - GR_MIPMAPLEVELMASK_BOTH ); - GDBG_INFO((88,"grTexCalcMemRequired(%d,%d,%d,%d) => 0x%x(%d)\n", - small_lod,large_lod,aspect,format,memrequired,memrequired)); - return memrequired; -} /* grTexCalcMemRequired */ - - -/*--------------------------------------------------------------------------- -** grTexDetailControl -*/ -GR_DIENTRY(grTexDetailControl, void, - ( GrChipID_t tmu, int lod_bias, FxU8 detail_scale, - float detail_max )) -{ - FxU32 tDetail; - FxU32 dmax = ( FxU32 ) ( detail_max * _GlideRoot.pool.f255 ); - FxU32 dscale = detail_scale; - - GR_BEGIN_NOFIFOCHECK("grTexDetailControl",88); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%g)\n",tmu,detail_scale,detail_max)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_F( myName, lod_bias < -32 || lod_bias > 31, "lod_bias out of range" ); - GR_CHECK_F( myName, detail_scale > 7, "detail_scale out of range" ); - GR_CHECK_F( myName, detail_max < 0.0 || detail_max > 1.0, "detail_max out of range" ); - - tDetail = ( ( lod_bias << SST_DETAIL_BIAS_SHIFT ) & SST_DETAIL_BIAS ); - tDetail |= ( ( dmax << SST_DETAIL_MAX_SHIFT ) & SST_DETAIL_MAX ); - tDetail |= ( ( dscale << SST_DETAIL_SCALE_SHIFT ) & SST_DETAIL_SCALE ); - - /* MULTIPLAT */ - _grTexDetailControl( tmu, tDetail ); - GR_END(); -} /* grTexDetailControl */ - -GR_DIENTRY(grTexMinAddress, FxU32, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("grTexMinAddress",88); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU(myName,tmu); - FXUNUSED( tmu ); - GR_RETURN(0); -} /* grTexMinAddress */ - - -/*------------------------------------------------------------------- - Function: grTexMaxAddress - Date: 6/2 - Implementor(s): GaryT - Library: glide - Description: - Returns address of maximum extent of texture ram for a given TMU - Arguments: - tmu - Return: - the largest valid texture start Address - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexMaxAddress, FxU32, ( GrChipID_t tmu )) -{ - GR_BEGIN_NOFIFOCHECK("grTexMaxAddress",88); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU( myName, tmu ); - GR_RETURN(gc->tmu_state[tmu].total_mem-8); -} /* grTexMaxAddress */ - - -/*------------------------------------------------------------------- - Function: grTexTextureMemRequired - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns the tmu memory required to store the specified mipmap - ( Gary and I don't like the name of this function, but are - a little backed into a corner because of the existence - of grTexMemRequired() which does not imply any distinction - between texture memory and system ram ) - Arguments: - evenOdd - which set of mipmap levels are to be stored - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimensions - of texture - Return: - offset to be added to current texture base address to calculate next - valid texture memory download location - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexTextureMemRequired, FxU32, - ( FxU32 evenOdd, GrTexInfo *info)) -{ - FxU32 memrequired; - - GR_CHECK_F( "grTexTextureMemRequired", !info, "invalid info pointer" ); - memrequired = _grTexTextureMemRequired( info->smallLod, info->largeLod, - info->aspectRatio, info->format, - evenOdd ); - - GDBG_INFO((88,"grTexTextureMemRequired(%d,0x%x) => 0x%x(%d)\n", - evenOdd,info,memrequired,memrequired)); - return memrequired; -} /* grTexTextureMemRequired */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMap - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a texture mipmap to the specified tmu at the specified - base address. - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure defining dimension of - texture to be downloaded and containing texture data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadMipMap, void, - ( GrChipID_t tmu, FxU32 startAddress, FxU32 - evenOdd, GrTexInfo *info )) -{ - GR_DCL_GC; - GrLOD_t lod; - char *src_base; - FxU32 size = grTexTextureMemRequired( evenOdd, info ); - - FXUNUSED(gc); - - GDBG_INFO((89,"grTexDownloadMipMap(%d,0x%x,%d,0x%x\n",tmu,startAddress,evenOdd,info)); - GR_CHECK_TMU( "grTexDownloadMipMap", tmu ); - GR_CHECK_F( "grTexDownloadMipMap", startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F( "grTexDownloadMipMap", evenOdd > 0x3, "evenOdd mask invalid" ); - GR_CHECK_F( "grTexDownloadMipMap", !info, "info invalid" ); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) - GrErrorCallback("grTexDownloadMipMap: mipmap " - " cannot span 2 Mbyte boundary",FXTRUE); - - src_base = (char *)info->data; - - /*--------------------------------------------------------------- - Download one mipmap level at a time - ---------------------------------------------------------------*/ - for( lod = info->largeLod; lod <= info->smallLod; lod++ ) { - grTexDownloadMipMapLevel( tmu, - startAddress, - lod, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd, - src_base ); - - src_base += _grMipMapHostSize[_gr_aspect_index_table[info->aspectRatio]][lod] - << (info->format>=GR_TEXFMT_16BIT); - } -} /* grTexDownloadMipMap */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadTablePartial - Date: 6/3 - Implementor(s): GaryT - Library: glide - Description: - download part of a look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grTexDownloadTablePartial, void, - ( GrChipID_t tmu, GrTexTable_t type, - void *data, int start, int end )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadTablePartial",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x, %d,%d)\n",tmu,type,data,start,end)); - GR_CHECK_TMU(myName,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - GR_CHECK_F(myName, _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[0].tmuRev < 1, - "Texelfx rev 0 does not support paletted textures"); -#endif - - if ( type == GR_TEXTABLE_PALETTE ) /* Need Palette Download Code */ - _grTexDownloadPalette( tmu, (GuTexPalette *)data, start, end ); - else { /* Type is an ncc table */ - _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end ); - } - GR_END(); -} /* grTexDownloadTable */ - -/*--------------------------------------------------------------------------- -** grTexDownloadMipMapLevel -*/ -GR_DIENTRY(grTexDownloadMipMapLevel, void, - ( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, - GrLOD_t largeLod, GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, FxU32 evenOdd, void *data )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevel",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data)); - grTexDownloadMipMapLevelPartial( tmu, startAddress, - thisLod, largeLod, - aspectRatio, format, - evenOdd, data, - 0, _grMipMapHostWH[aspectRatio][thisLod][1]-1 ); - GR_END(); -} /* grTexDownloadMipmapLevel */ - -FxU16 rle_line[256]; -FxU16 *rle_line_end; - -#ifdef __WIN32__ -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) -{ - /* don't do anything just shut up the compiler */ -} -#endif - -#ifdef __GNUC__ -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest) { -} -#endif - diff --git a/glide2x/sst1/glide/src/fxbldno.c b/glide2x/sst1/glide/src/fxbldno.c deleted file mode 100644 index c4e86bb..0000000 --- a/glide2x/sst1/glide/src/fxbldno.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - * - * $Header$ - * $Log$ - * - * 1 7/25/97 9:05a Pgj - * generate fxbldno.h which defines BUILD_NUMBER - * - */ - -#include -#include -#include - -main(int argc, char **argv) -{ - struct tm locTime; - time_t sysTime; - char *build; - - time(&sysTime); - locTime = *localtime(&sysTime); - - if (build = getenv("BUILD_NUMBER")) { - printf("#define BUILD_NUMBER %s\n", build); - } else { - unsigned short magic; - magic = (locTime.tm_yday << 7) | - (locTime.tm_hour << 2) | - (locTime.tm_min / 15); - printf("#define BUILD_NUMBER %d\n", magic); - } - return 0; - -} /* end main() */ diff --git a/glide2x/sst1/glide/src/fxgasm.c b/glide2x/sst1/glide/src/fxgasm.c deleted file mode 100644 index 1f4d895..0000000 --- a/glide2x/sst1/glide/src/fxgasm.c +++ /dev/null @@ -1,194 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*---------------------------------------------------------------------- - * macros for creating assembler offset files - *----------------------------------------------------------------------*/ - -#ifndef __linux__ -#define NEWLINE printf("\n") -#define COMMENT printf(";----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("; Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t= %08xh\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t= %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t= %08xh\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t= %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t= %08xh\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t= %10d\n",pname,sizeof(p)) -#else -#define NEWLINE printf("\n"); -#define COMMENT printf("#----------------------------------------------------------------------\n") - -#define HEADER(str) NEWLINE; COMMENT; \ - printf("# Assembler offsets for %s struct\n",str);\ - COMMENT; NEWLINE - -#define OFFSET(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&p.o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&p.o)-(int)&p) - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define HWOFFSET(p, o, pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,(((int) &p.o)-(int)&p)>>2);\ - else printf("%s\t .EQU %10d\n",pname,(((int)&p.o)-(int)&p)) -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ - -#define OFFSET2(p,o,pname) if (hex) \ - printf("%s\t .EQU %08x\n",pname,((int)&o)-(int)&p); \ - else printf("%s\t .EQU %10d\n",pname,((int)&o)-(int)&p) - -#define SIZEOF(p,pname) if (hex) \ - printf("SIZEOF_%s\t .EQU %08x\n",pname,sizeof(p)); \ - else printf("SIZEOF_%s\t .EQU %10d\n",pname,sizeof(p)) -#endif - -int -main (int argc, char **argv) -{ - int hex=0; /* default is print in decimal */ - static Sstregs sst; - static struct _GlideRoot_s gr; - static GrGC gc; - static struct dataList_s dl; - - if (argc > 1) { - if (strcmp("-inline", argv[1]) == 0) { - Sstregs dummyRegs; - - printf("#ifndef __FX_INLINE_H__\n"); - printf("#define __FX_INLINE_H__\n"); - printf("\n"); - - printf("/* The # of 2-byte entries in the hw fog table */\n"); - printf("#define kInternalFogTableEntryCount 0x%XUL\n", - sizeof(dummyRegs.fogTable) >> 1); - - printf("\n"); - printf("#endif /* __FX_INLINE_H__ */\n"); - - return 0; - } - - hex = 1; - } - -#ifndef __linux__ - printf("SST_CHIP_MASK = 0%xh\n",SST_CHIP_MASK); -#else - printf("SST_CHIP_MASK .EQU 0x%x\n", SST_CHIP_MASK); -#endif - - HEADER ("SSTREGS"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - OFFSET (sst,FvA.x,"FVAX\t\t"); - OFFSET (sst,FvA.y,"FVAY\t\t"); - OFFSET (sst,FvB.x,"FVBX\t\t"); - OFFSET (sst,FvB.y,"FVBY\t\t"); - OFFSET (sst,FvC.x,"FVCX\t\t"); - OFFSET (sst,FvC.y,"FVCY\t\t"); - OFFSET (sst,FtriangleCMD,"FTRIANGLECMD\t"); -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) - HWOFFSET (sst,FvA.x,"FVAX\t\t"); - HWOFFSET (sst,FvA.y,"FVAY\t\t"); - HWOFFSET (sst,FvB.x,"FVBX\t\t"); - HWOFFSET (sst,FvB.y,"FVBY\t\t"); - HWOFFSET (sst,FvC.x,"FVCX\t\t"); - HWOFFSET (sst,FvC.y,"FVCY\t\t"); - HWOFFSET (sst,FtriangleCMD,"FTRIANGLECMD\t"); -#else -#error "Update fxgasm.c for this chip" -#endif - NEWLINE; -#ifdef GLIDE_USE_ALT_REGMAP - OFFSET2(sst.Fr_ALT,sst.Fdrdx_ALT,"FDPDX_OFFSET\t"); - OFFSET2(sst.Fr_ALT,sst.Fdrdy_ALT,"FDPDY_OFFSET\t"); -#else - OFFSET2(sst.Fr,sst.Fdrdx,"FDPDX_OFFSET\t"); - OFFSET2(sst.Fr,sst.Fdrdy,"FDPDY_OFFSET\t"); -#endif - HEADER ("GC"); - OFFSET (gc,base_ptr,"base_ptr\t"); - OFFSET (gc,reg_ptr,"reg_ptr\t\t"); - OFFSET (gc,lfb_ptr,"lfb_ptr\t\t"); - OFFSET (gc,state.cull_mode,"cull_mode\t"); - OFFSET (gc,dataList,"dataList\t"); -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - OFFSET (gc,state.fifoFree, "fifoFree\t"); -#endif -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - OFFSET (gc,hwDep.sst96Dep.writesSinceFence, "writesSinceFence" ); - OFFSET (gc,hwDep.sst96Dep.paramMask, "paramMask\t"); - OFFSET (gc,hwDep.sst96Dep.gwCommand, "gwCommand\t"); - OFFSET (gc,hwDep.sst96Dep.gwHeaders, "gwHeaders\t"); - OFFSET (gc,fifoData.hwDep.vg96FIFOData.fifoPtr, "fifoPtr\t\t"); - OFFSET (gc,fifoData.hwDep.vg96FIFOData.fifoSize, "fifoSize\t"); -#endif - SIZEOF (gr.GCs[0].state,"GrState\t"); - SIZEOF (gr.hwConfig,"GrHwConfiguration"); - SIZEOF (gr.GCs[0],"GC\t"); - NEWLINE; - - HEADER ("GlideRoot"); - OFFSET (gr,p6Fencer,"p6Fencer\t"); - OFFSET (gr,current_sst,"current_sst\t"); - OFFSET (gr,CPUType,"CPUType\t\t"); - OFFSET (gr,curGC,"curGC\t\t"); - OFFSET (gr,curTriSize,"curTriSize\t"); - OFFSET (gr,stats.trisProcessed,"trisProcessed\t"); - OFFSET (gr,stats.trisDrawn,"trisDrawn\t"); - SIZEOF (gr,"GlideRoot"); - NEWLINE; - - HEADER ("dataList"); - OFFSET (dl,i,"dl_i\t\t"); - OFFSET (dl,addr,"dl_addr\t\t"); - SIZEOF (dl,"dataList\t"); - NEWLINE; - - return 0; -} diff --git a/glide2x/sst1/glide/src/fxglide.h b/glide2x/sst1/glide/src/fxglide.h deleted file mode 100644 index 7886cbe..0000000 --- a/glide2x/sst1/glide/src/fxglide.h +++ /dev/null @@ -1,1406 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 86 2/12/98 4:01p Atai -** change refresh rate if oemdll updated for tv out - * - * 85 12/19/97 11:04a Atai - * oeminit dll stuff - * - * 84 12/03/97 9:36a Dow - * Fixed bug in grSstIsBusy() - * - * 83 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 82 9/11/97 9:31a Peter - * This is what happens when you don't listen to Chris - * - * 81 9/10/97 10:15p Peter - * fifo logic from GaryT - * - * 80 9/08/97 3:24p Peter - * fixed my fifo muckage - * - * 79 8/19/97 8:54p Peter - * lots of stuff, hopefully no muckage - * - * 78 8/01/97 11:48a Dow - * Made some macros use conventional FIFO accounting - * - * 77 7/10/97 1:36p Dow - * Modified Nudge of Love to work around likely hardware bug. - * - * 76 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 75 7/08/97 8:55p Dow - * Fixed muckage in the Nudge Of Love - * - * 74 7/08/97 1:29p Jdt - * Fixed watcom muckage - * - * 73 7/07/97 8:33a Jdt - * New tracing macros. - * - * 72 7/04/97 12:07p Dow - * Changed the DUMPGWH stuff, added const for triangle command packet - * - * 71 6/29/97 11:28p Jdt - * Added gwCommand - * - * 70 6/26/97 3:08p Dow - * New metrics for P6 stuff. - * - * 69 6/21/97 1:05p Dow - * Moved the Nudge of Love to a macro - * - * 68 6/20/97 5:50p Dow - * Changes for Chip Field - * - * 67 6/19/97 7:35p Dow - * More P6 Stuff - * - * 66 6/18/97 6:07p Dow - * Protected P6 Stuff - * - * 65 6/18/97 5:54p Dow - * P6 adjustments - * - * 64 6/16/97 12:45p Dow - * P6 Fixes - * - * 63 6/08/97 11:06p Pgj - * use Group Write for Texture Downloads - * - * 62 5/28/97 2:08p Dow - * Added checks for int10h when in debugging mode. - * - * 61 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 60 5/27/97 2:02p Dow - * Fixed up some macros--GR_CHECK_FOR_ROOM & a call to assert() - * - * 59 5/22/97 11:18a Dow - * Changed GR_ASSERT to fix stack muckage - * - * 58 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 57 5/15/97 12:20p Dow - * Fixed improper definition of GR_SET - * - * 56 5/04/97 12:47p Dow - * Added direct write macro fro grSstControl - * - * 55 5/02/97 2:07p Pgj - * screen_width/height now FxU32 - * - * 54 5/02/97 9:34a Dow - * Changed indentation of GrState to match the rest of file, modified - * GR_ASSERT - * - * 53 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 52 3/24/97 2:00p Dow - * Fixed some chip field problems - * - * 51 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 50 3/19/97 10:43p Dow - * windowsInit stuff - * - * 49 3/19/97 1:37a Jdt - * Added fbStride to gc - * - * 48 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 47 3/17/97 6:25a Jdt - * Added open flag to gc - * - * 46 3/16/97 12:38a Jdt - * Shouldn't have removed fifoData, duh.. - * - * 45 3/16/97 12:19a Jdt - * Removed redundant data - * - * 44 3/13/97 2:51a Jdt - * Removed lockIdle flag - * - * 43 3/13/97 1:18a Jdt - * Added flag for sli lfb reads. - * - * 42 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 41 3/04/97 9:11p Dow - * Neutered mutiplatform multiheaded monster. - * - * 40 2/26/97 2:18p Dow - * moved all debug set functions to __cdecl - * - * 39 2/26/97 11:54a Jdt - * Added glide buffer locking and fixed bug in GR_SET - * - * 38 2/19/97 4:42p Dow - * Fixed debug build for Watcom - * - * 37 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 36 2/12/97 5:31p Dow - * Fixed my ^$%^^&*^%^ error. - * - * 35 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 34 2/11/97 6:58p Dow - * Changes to support vid tiles and ser status - * - * 33 1/18/97 11:44p Dow - * Moved _curGCFuncs into _GlideRoot - * Added support for GMT's register debugging - * - * 32 1/16/97 3:41p Dow - * Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO - * - * 31 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 30 11/14/96 1:04p Jdt - * Test for keywords -** -*/ - -/* -** fxglide.h -** -** Internal declarations for use inside Glide. -** -** GLIDE_LIB: Defined if building the Glide Library. This macro -** should ONLY be defined by a makefile intended to build -** GLIDE.LIB or glide.a. -** -** GLIDE_HARDWARE: Defined if GLIDE should use the actual SST hardware. An -** application is responsible for defining this macro. -** -** GLIDE_NUM_TMU: Number of physical TMUs installed. Valid values are 1 -** and 2. If this macro is not defined by the application -** it is automatically set to the value 2. -** -*/ - -#ifndef __FXGLIDE_H__ -#define __FXGLIDE_H__ - -/* -** ----------------------------------------------------------------------- -** INCLUDE FILES -** ----------------------------------------------------------------------- -*/ -#include -#include -#include <3dfx.h> -#include -#include -#include -#include - -#if GLIDE_MULTIPLATFORM -#include "gcfuncs.h" -#endif - -/* isolate this 'hack' here so as to make the code look cleaner */ -#ifdef __WATCOMC__ -#define GR_CDECL __cdecl -#else -#define GR_CDECL -#endif - -/*==========================================================================*/ -/* -** GrState -** -** If something changes in here, then go into glide.h, and look for a -** declaration of the following form: -** -** #define GLIDE_STATE_PAD_SIZE N -** #ifndef GLIDE_LIB -** typedef struct { -** char pad[GLIDE_STATE_PAD_SIZE]; -** } GrState; -** #endif -** -** Then change N to sizeof(GrState) AS DECLARED IN THIS FILE! -** -*/ - -struct _GrState_s -{ - GrCullMode_t /* these go in front for cache hits */ - cull_mode; /* cull neg, cull pos, don't cull */ - - GrHint_t - paramHints; /* Tells us if we need to pointcast a - parameter to a specific chip */ - FxI32 - fifoFree; /* # free entries in FIFO */ - FxU32 - paramIndex, /* Index into array containing - parameter indeces to be sent ot the - triangle setup code */ - tmuMask; /* Tells the paramIndex updater which - TMUs need values */ - struct{ - FxU32 fbzColorPath; - FxU32 fogMode; - FxU32 alphaMode; - FxU32 fbzMode; - FxU32 lfbMode; - FxU32 clipLeftRight; - FxU32 clipBottomTop; - - FxU32 fogColor; - FxU32 zaColor; - FxU32 chromaKey; - - FxU32 stipple; - FxU32 color0; - FxU32 color1; - } fbi_config; /* fbi register shadow */ - - struct { - FxU32 textureMode; - FxU32 tLOD; - FxU32 tDetail; - FxU32 texBaseAddr; - FxU32 texBaseAddr_1; - FxU32 texBaseAddr_2; - FxU32 texBaseAddr_3_8; - GrMipMapMode_t mmMode; /* saved to allow MM en/dis */ - GrLOD_t smallLod, largeLod; /* saved to allow MM en/dis */ - FxU32 evenOdd; - GrNCCTable_t nccTable; - } tmu_config[GLIDE_NUM_TMU]; /* tmu register shadow */ - - FxBool /* Values needed to determine which */ - ac_requires_it_alpha, /* parameters need gradients computed */ - ac_requires_texture, /* when drawing triangles */ - cc_requires_it_rgb, - cc_requires_texture, - cc_delta0mode, /* Use constants for flat shading */ - allowLODdither, /* allow LOD dithering */ - checkFifo; /* Check fifo status as specified by hints */ - - FxU16 - lfb_constant_depth; /* Constant value for depth buffer (LFBs) */ - GrAlpha_t - lfb_constant_alpha; /* Constant value for alpha buffer (LFBs) */ - - FxI32 - num_buffers; /* 2 or 3 */ - - GrColorFormat_t - color_format; /* ARGB, RGBA, etc. */ - - GrMipMapId_t - current_mm[GLIDE_NUM_TMU]; /* Which guTex** thing is the TMU set - up for? THIS NEEDS TO GO!!! */ - - float - clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */ - clipwindowf_xmax, clipwindowf_ymax; - FxU32 - screen_width, screen_height; /* Screen width and height */ - float - a, r, g, b; /* Constant color values for Delta0 mode */ -}; - -typedef struct GrGC_s -{ - FxU32 - *base_ptr, /* base address of SST */ - *reg_ptr, /* pointer to base of SST registers */ - *tex_ptr, /* texture memory address */ - *lfb_ptr, /* linear frame buffer address */ - *slave_ptr; /* Scanline Interleave Slave address */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - gcFuncs; -#endif - - void *oemInit; - - struct dataList_s { - int i; /* index into GrVertex struct for src data */ - float *addr; /* address of hardware register to write to */ - } dataList[20+12*GLIDE_NUM_TMU+3];/* add 3 for: - fbi-tmu0 trans - tmu0-tmu1 trans - tmu1-tmu2 trans - */ - GrState - state; /* state of Glide/SST */ - - FxBool - nopCMD; /* Have we placed a NOP in the FIFO ? */ - - InitFIFOData - fifoData; - - union hwDep_u { - struct sst96Dep_s { -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) - FxBool - int10Called; /* Did the app call int10h? */ - void (__interrupt __far *prevInt10)(); -#endif - FxU32 - writesSinceFence, /* Writes since last fence */ - writesSinceHeader, /* Grouped Writes since last header */ - paramMask, /* Mask indicating required parameters */ - gwCommand, /* Command for initiating a triangle gw packet */ - gwHeaders[4]; /* Group write headers for SST96 */ - FxU32 - *serialStatus, /* address of serial status register */ - *fifoApertureBase; /* base of fifo apurture (if different) */ - -#if 0 - *fifoPtr, /* pointer to FIFO */ - fifoSize, /* # bytes left in FIFO */ - *fifoVirt, /* start virtual address */ - fifoPhys, /* start physical address */ - fifoMax, /* in bytes */ - fifoCur, /* how much used up so far */ - fifoLfb; /* use LFB, use hostblt if 0. */ -#endif - } sst96Dep; - struct sst1Dep_s { - FxU32 - /* fifoFree, # Free entries in FIFO */ - swFifoLWM; /* fudge factor */ - } sst1Dep; - - } hwDep; - - FxU32 lockPtrs[2]; /* pointers to locked buffers */ - FxU32 fbStride; - - struct { - FxU32 freemem_base; - FxU32 total_mem; - FxU32 next_ncc_table; - GrMipMapId_t ncc_mmids[2]; - const GuNccTable *ncc_table[2]; - } tmu_state[GLIDE_NUM_TMU]; - - int - grSstRez, /* Video Resolution of board */ - grSstRefresh, /* Video Refresh of board */ - fbuf_size, /* in MB */ - num_tmu; /* number of TMUs attached */ - - FxBool - scanline_interleaved; - - struct { - GrMipMapInfo data[MAX_MIPMAPS_PER_SST]; - GrMipMapId_t free_mmid; - } mm_table; /* mip map table */ - - /* LFB Flags */ - FxU32 lfbSliOk; - - /* DEBUG and SANITY variables */ - FxI32 myLevel; /* debug level */ - FxI32 counter; /* counts bytes sent to HW */ - FxI32 expected_counter; /* the number of bytes expected to be sent */ - - sst1VideoTimingStruct /* init code overrides */ - *vidTimings; - - FxBool open; /* Has GC Been Opened? */ - FxBool closedP; /* Have we closed since an init call? (see grSstWinOpen) */ -} GrGC; - -/* NOTE: this changes the P6FENCE macro expansion from sst1init.h !!! */ -#define p6FenceVar _GlideRoot.p6Fencer - -/* if we are debugging, call a routine so we can trace fences */ -#ifdef GLIDE_DEBUG -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GR_P6FENCE {_grFence(); gc->hwDep.sst96Dep.writesSinceFence = 0;} -#else /* SST1 */ -#define GR_P6FENCE _grFence(); -#endif /* SST1 or SST96 */ -#else /* Not DEBUG */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define GR_P6FENCE {P6FENCE; gc->hwDep.sst96Dep.writesSinceFence = 0;} -#else /* SST1 */ -#define GR_P6FENCE P6FENCE -#endif /* SST1 or SST96 */ -#endif /* DEBUG or not */ - -/* -** The root of all Glide data, all global data is in here -** stuff near the top is accessed a lot -*/ -struct _GlideRoot_s { - int p6Fencer; /* xchg to here to keep this in cache!!! */ - int current_sst; - FxU32 CPUType; - GrGC *curGC; /* point to the current GC */ - FxI32 curTriSize; /* the size in bytes of the current triangle */ - FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */ - FxU32 packerFixAddress; /* address to write packer fix to */ - FxBool windowsInit; /* Is the Windows part of glide initialized? */ - -#if GLIDE_MULTIPLATFORM - GrGCFuncs - curGCFuncs; /* Current dd Function pointer table */ -#endif - int initialized; - - struct { /* constant pool (minimizes cache misses) */ - float f0; - float fHalf; - float f1; - float f255; - float f256; - float ftemp1, ftemp2; /* temps to convert floats to ints */ - } pool; - - struct { /* environment data */ - FxBool ignoreReopen; - FxBool triBoundsCheck; /* check triangle bounds */ - FxBool noSplash; /* don't draw it */ - FxBool shamelessPlug; /* translucent 3Dfx logo in lower right */ - FxU32 rsrchFlags; - FxI32 swapInterval; /* swapinterval override */ - FxI32 swFifoLWM; - FxU32 snapshot; /* register trace snapshot */ - FxBool disableDitherSub; /* Turn off dither subtraction? */ - } environment; - - struct { - FxU32 minMemFIFOFree; - FxU32 minPciFIFOFree; - - FxU32 fifoSpins; /* number of times we spun on fifo */ - - FxU32 bufferSwaps; /* number of buffer swaps */ - FxU32 pointsDrawn; - FxU32 linesDrawn; - FxU32 trisProcessed; - FxU32 trisDrawn; - - FxU32 texDownloads; /* number of texDownload calls */ - FxU32 texBytes; /* number of texture bytes downloaded */ - - FxU32 palDownloads; /* number of palette download calls */ - FxU32 palBytes; /* number of palette bytes downloaded */ - } stats; - - GrHwConfiguration hwConfig; - - GrGC GCs[MAX_NUM_SST]; /* one GC per board */ -}; - - -extern struct _GlideRoot_s GR_CDECL _GlideRoot; -#if GLIDE_MULTIPLATFORM -extern GrGCFuncs _curGCFuncs; -#endif -/*==========================================================================*/ -/* Macros for declaring functions */ -#define GR_DDFUNC(name, type, args) \ -type FX_CSTYLE name args - -#define GR_ENTRY(name, type, args) \ -FX_ENTRY type FX_CSTYLE name args - -#define GR_DIENTRY(name, type, args) \ -FX_ENTRY type FX_CSTYLE name args - -/*==========================================================================*/ - -#define STATE_REQUIRES_IT_DRGB FXBIT(0) -#define STATE_REQUIRES_IT_ALPHA FXBIT(1) -#define STATE_REQUIRES_OOZ FXBIT(2) -#define STATE_REQUIRES_OOW_FBI FXBIT(3) -#define STATE_REQUIRES_W_TMU0 FXBIT(4) -#define STATE_REQUIRES_ST_TMU0 FXBIT(5) -#define STATE_REQUIRES_W_TMU1 FXBIT(6) -#define STATE_REQUIRES_ST_TMU1 FXBIT(7) -#define STATE_REQUIRES_W_TMU2 FXBIT(8) -#define STATE_REQUIRES_ST_TMU2 FXBIT(9) - -#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0) -#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1) -#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2) - -/* -** Parameter gradient offsets -** -** These are the offsets (in bytes)of the DPDX and DPDY registers from -** from the P register -*/ -#ifdef GLIDE_USE_ALT_REGMAP -#define DPDX_OFFSET 0x4 -#define DPDY_OFFSET 0x8 -#else -#define DPDX_OFFSET 0x20 -#define DPDY_OFFSET 0x40 -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) /* Stuff for group write packet header */ - -#define GWH_VTX_AX_BIT FXBIT(0) -#define GWH_VTX_AY_BIT FXBIT(1) -#define GWH_VTX_BX_BIT FXBIT(2) -#define GWH_VTX_BY_BIT FXBIT(3) -#define GWH_VTX_CX_BIT FXBIT(4) -#define GWH_VTX_CY_BIT FXBIT(5) -#define GWH_FSTARTR_BIT FXBIT(6) -#define GWH_FDRDX_BIT FXBIT(7) -#define GWH_FDRDY_BIT FXBIT(8) -#define GWH_FSTARTG_BIT FXBIT(9) -#define GWH_FDGDX_BIT FXBIT(10) -#define GWH_FDGDY_BIT FXBIT(11) -#define GWH_FSTARTB_BIT FXBIT(12) -#define GWH_FDBDX_BIT FXBIT(13) -#define GWH_FDBDY_BIT FXBIT(14) -#define GWH_FSTARTZ_BIT FXBIT(15) -#define GWH_FDZDX_BIT FXBIT(16) -#define GWH_FDZDY_BIT FXBIT(17) -#define GWH_FSTARTA_BIT FXBIT(18) -#define GWH_FDADX_BIT FXBIT(19) -#define GWH_FDADY_BIT FXBIT(20) -#define GWH_FSTARTS_BIT FXBIT(21) -#define GWH_FDSDX_BIT FXBIT(22) -#define GWH_FDSDY_BIT FXBIT(23) -#define GWH_FSTARTT_BIT FXBIT(24) -#define GWH_FDTDX_BIT FXBIT(25) -#define GWH_FDTDY_BIT FXBIT(26) -#define GWH_FSTARTW_BIT FXBIT(27) -#define GWH_FDWDX_BIT FXBIT(28) -#define GWH_FDWDY_BIT FXBIT(29) -#define GWH_FTRIANGLECMD_BIT FXBIT(30) -#define GWH_ENABLE_BIT FXBIT(31) - -#define GWH_VTX_BITS (GWH_VTX_AX_BIT | GWH_VTX_AY_BIT | \ - GWH_VTX_BX_BIT | GWH_VTX_BY_BIT | \ - GWH_VTX_CX_BIT | GWH_VTX_CY_BIT) -#define GWH_RGB_BITS (GWH_FSTARTR_BIT | GWH_FDRDX_BIT | GWH_FDRDY_BIT |\ - GWH_FSTARTG_BIT | GWH_FDGDX_BIT | GWH_FDGDY_BIT |\ - GWH_FSTARTB_BIT | GWH_FDBDX_BIT | GWH_FDBDY_BIT) -#define GWH_Z_BITS (GWH_FSTARTZ_BIT | GWH_FDZDX_BIT | GWH_FDZDY_BIT) -#define GWH_A_BITS (GWH_FSTARTA_BIT | GWH_FDADX_BIT | GWH_FDADY_BIT) -#define GWH_ST_BITS (GWH_FSTARTS_BIT | GWH_FDSDX_BIT | GWH_FDSDY_BIT |\ - GWH_FSTARTT_BIT | GWH_FDTDX_BIT | GWH_FDTDY_BIT) -#define GWH_W_BITS (GWH_FSTARTW_BIT | GWH_FDWDX_BIT | GWH_FDWDY_BIT) - -/* All gradient bits... used in trisetup_nogradients hack */ -#define GWH_DXY_BITS ( \ - GWH_FDRDX_BIT | GWH_FDRDY_BIT | GWH_FDGDX_BIT | GWH_FDGDY_BIT | \ - GWH_FDBDX_BIT | GWH_FDBDY_BIT | GWH_FDZDX_BIT | GWH_FDZDY_BIT | \ - GWH_FDADX_BIT | GWH_FDADY_BIT | GWH_FDSDX_BIT | GWH_FDSDY_BIT | \ - GWH_FDTDX_BIT | GWH_FDTDY_BIT | GWH_FDWDX_BIT | GWH_FDWDY_BIT ) - -void -_grDebugGroupWriteHeader(FxU32 header, FxU32 address); - -#if defined(GDBG_INFO_ON) -#define DUMPGWH(header, address) {\ - _grDebugGroupWriteHeader(header, address);\ -} -#else -#define DUMPGWH(header,address) -#endif - -#ifdef GLIDE_SANITY_SIZE -# define GW_UPDATE_COUNT(a) (gc->counter += a) -#else -# define GW_UPDATE_COUNT(a) -#endif - -#define FENCE_AMOUNT 128 - -#define GWH_REG_SHIFT 2 -#define GWH_WRAP_SHIFT 12 -#define GWH_CHIP_SHIFT 16 - -#define GWH_REG_OFFSET(a) ((FxU32) (a) - (FxU32) gc->reg_ptr) -#define GWH_REG(a) ((GWH_REG_OFFSET(a) >> GWH_REG_SHIFT) & 0xff) -#define GWH_WRAP(a) (((FxU32)(a) >> GWH_WRAP_SHIFT) & 0xf) -#define GWH_CHIP(a) (((FxU32)(a) >> GWH_CHIP_SHIFT) & 0xf) - -#define GWH_GEN_WRAP(w) (((w) & 0xf) << GWH_WRAP_SHIFT) -#define GWH_GEN_CHIP(c) (((c) & 0xf) << GWH_CHIP_SHIFT) - -#define GEN_PCI_ADDRESS - -#define GWH_FENCE_TRIANGLE \ -if ((gc->hwDep.sst96Dep.writesSinceFence + (_GlideRoot.curTriSize>>2 ) + 4) > FENCE_AMOUNT)\ - GR_P6FENCE - -#define GW_TRICMD_MASK 0x40000000 - -#define GWH_BUILD_PCI_ADDRESS(a,c,w)\ - (GWH_REG(a) | (GWH_WRAP(w) << GWH_WRAP_SHIFT) | (GWH_CHIP(c) << GWH_CHIP_SHIFT)) - -#define PUMA_DWORD_REG_OFFSET 0x100000 - -#define GWH_GEN_ADDRESS(a) \ - ((((FxU32)(a) - (FxU32) gc->lfb_ptr) >> 2) | PUMA_DWORD_REG_OFFSET | GWH_ENABLE_BIT) - -#ifdef DEBUG -# define GWH_RESET_WSH gc->hwDep.sst96Dep.writesSinceHeader = 0 -# define GWH_INC_WSH gc->hwDep.sst96Dep.writesSinceHeader++ -#else -# define GWH_RESET_WSH -# define GWH_INC_WSH -#endif - -#if defined( GLIDE_DEBUG ) - /* defined in GPCI.C */ -extern void GR_CDECL -_GR_SET_GW_CMD( volatile void *addr, unsigned long data ); -extern void GR_CDECL -_GR_SET_GW_HEADER( volatile void *addr, unsigned long data ); -extern void GR_CDECL -_GR_SET_GW_ENTRY( volatile void *addr, unsigned long data ); - -#define SET_GW_CMD( addr, offset, data ) \ -_GR_SET_GW_CMD( ((FxU32*)(addr))+(offset), (data) ); GR_INC_SIZE(4) - -#define SET_GW_HEADER( addr, offset, data ) \ -_GR_SET_GW_HEADER( ((FxU32*)(addr))+(offset), (data) ); GR_INC_SIZE(4) - -#define FSET_GW_ENTRY( addr, offset, data ) \ -{ \ - float _tacoFTemp; \ - _tacoFTemp = (data); \ - _GR_SET_GW_ENTRY( ((FxU32*)(addr))+(offset), (*(FxU32*)&_tacoFTemp) ); \ - GR_INC_SIZE(4);\ -} -#else - -#define SET_GW_CMD( addr, offset, data ) \ -*(addr+offset)=data; - -#define SET_GW_HEADER( addr, offset, data ) \ -*(addr+offset)=data; - -#define FSET_GW_ENTRY( addr, offset, data ) \ -*((float*)(addr+offset))=data; - -#endif - -#if SST96_ALT_FIFO_WRAP -#define GWH_PACKET_SIZE_CHECK(__s) \ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) ((__s) + 12)) {\ - gc->fifoData.hwDep.vg96FIFOData.blockSize = (__s) + 12; \ - initWrapFIFO(&gc->fifoData); \ - } -#else -#define GWH_PACKET_SIZE_CHECK(__s) \ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) ((__s) + 12)) {\ - _grSst96FifoMakeRoom();\ - GR_ASSERT(!(gc->fifoData.hwDep.vg96FIFOData.fifoSize < 0x1000));\ - } -#endif - -#define GWH_BEGIN_TRIANGLE_PACKET(header, address) \ -{\ - GWH_RESET_WSH;\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GWH_FENCE_TRIANGLE;\ - GDBG_INFO((120, "Beginning Grouped Write Packet\n"));\ - GDBG_INFO((120, "fifoPtr = 0x%x fifoSize = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - GDBG_INFO((120, "Base = 0x%x Mask = 0x%x\n", (FxU32) address, header));\ - GW_UPDATE_COUNT(8);\ - GWH_PACKET_SIZE_CHECK(_GlideRoot.curTriSize); \ - DUMPGWH(header,address);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = GWH_GEN_ADDRESS(address);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = header;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - gc->hwDep.sst96Dep.writesSinceFence += 2;\ -} - -#define GWH_FENCE_TEXDL \ -if ((gc->hwDep.sst96Dep.writesSinceFence + 34) >= FENCE_AMOUNT)\ - GR_P6FENCE - -#define GWH_BEGIN_TEXDL_PACKET(header, address) \ -{\ - GWH_RESET_WSH;\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GWH_FENCE_TEXDL;\ - GDBG_INFO((120, "Beginning Texture Grouped Write Packet\n"));\ - GDBG_INFO((120, "fifoPtr = 0x%x fifoSize = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - GDBG_INFO((120, "Base = 0x%x Mask = 0x%x\n", address, header));\ - GW_UPDATE_COUNT(8);\ - GWH_PACKET_SIZE_CHECK(34 << 2); \ - GLIDE_FIFO_CHECK(); \ - DUMPGWH(header,((((FxU32) address - (FxU32) gc->lfb_ptr)) >> 2) | GWH_ENABLE_BIT);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - ((((FxU32) address - (FxU32) gc->lfb_ptr)) >> 2) | GWH_ENABLE_BIT;\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = header;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - gc->hwDep.sst96Dep.writesSinceFence += 2;\ -} - -#define GR_SETF_GW(s) {\ -GLIDE_FIFO_CHECK(); \ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceHeader < 32);\ -GDBG_INFO((120, "Group Write: fifoPtr = 0x%x, value = %4.2f sinceFence = 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, s, gc->hwDep.sst96Dep.writesSinceFence));\ -*((float *) gc->fifoData.hwDep.vg96FIFOData.fifoPtr++) = s;\ -gc->fifoData.hwDep.vg96FIFOData.fifoSize-=4;\ -GW_UPDATE_COUNT(4);\ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ -gc->hwDep.sst96Dep.writesSinceFence++;\ -GWH_INC_WSH;\ -} - -#define GR_SET_GW(s) {\ -GLIDE_FIFO_CHECK(); \ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceHeader < 32);\ -GDBG_INFO((120, "Group Write: fifoPtr = 0x%x, value = 0x%x sinceFence=%d\n", gc->fifoData.hwDep.vg96FIFOData.fifoPtr, s, gc->hwDep.sst96Dep.writesSinceFence));\ -P6FENCEFIFO;\ -*gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = s;\ -gc->fifoData.hwDep.vg96FIFOData.fifoSize-=4;\ -GW_UPDATE_COUNT(4);\ -GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ -gc->hwDep.sst96Dep.writesSinceFence++;\ -GWH_INC_WSH;\ -} - -#endif /* stuff for group write packet header */ - -/*==========================================================================*/ -/* -** Here's the infamous Packer Bug Check and Workaround: -** XOR the two addresses together to find out which bits are different. -** AND the result with the bits that represent the chip field of the -** SST address. If ANY of them are different, then do the packer hack. -** Save this address as the last with which we compared. -*/ - -#define SST_CHIP_MASK 0x3C00 - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -#define GLIDE_DRIVER_NAME "Voodoo Graphics" -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#define GLIDE_DRIVER_NAME "Voodoo Rush" -#else -#define GLIDE_DRIVER_NAME "Unknown" -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - #define PACKER_WORKAROUND_SIZE 4 - - #define PACKER_WORKAROUND \ - if (_GlideRoot.CPUType == 6) {\ - GR_P6FENCE;\ - GR_SET( *(FxU32 *)_GlideRoot.packerFixAddress, 0 );\ - GR_P6FENCE;\ - } \ - else {\ - GR_SET( *(FxU32 *)_GlideRoot.packerFixAddress, 0 ); \ - } - - #define PACKER_BUGCHECK(a)\ - if ( (((FxU32) a) ^ lastAddress) & SST_CHIP_MASK ) {\ - PACKER_WORKAROUND; \ - lastAddress = (FxU32)a; \ - } - -#else - #define PACKER_WORKAROUND_SIZE 0 - #define PACKER_WORKAROUND - #define PACKER_BUGCHECK(a) -#endif - -/* On a P6 we have to fence around commands to ensure write-ordering */ -#if 0 -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -# ifdef GR_P6FENCE -# undef GR_P6FENCE -# endif -# define GR_P6FENCE -#endif -#endif - -/* GMT: a very useful macro for making sure that SST commands are properly - fenced on a P6, e.g. P6FENCH_CMD( GR_SET(hw->nopCMD,1) ); -*/ -/* #if (GLIDE_PLATFORM & GLIDE_HW_SST1) */ -#if 1 -#define P6FENCE_CMD( cmd ) \ - if (_GlideRoot.CPUType == 6) { /* if it's a p6 */ \ - GR_P6FENCE; /* then fence off the cmd */ \ - cmd; \ - GR_P6FENCE; /* to ensure write order */ \ - } \ - else \ - cmd -#else -#define P6FENCE_CMD( cmd ) cmd -#endif - -/*==========================================================================*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO - -void _grMipMapInit(void); -FxI32 FX_CSTYLE -_trisetup_asm(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); -FxI32 FX_CSTYLE -_trisetup(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); -FxI32 FX_CSTYLE -_trisetup_nogradients(const GrVertex *va, const GrVertex *vb, const GrVertex *vc ); - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -/* GMT: BUG need to make this dynamically switchable */ -#if defined(GLIDE_USE_C_TRISETUP) - #define TRISETUP _trisetup -#else - #define TRISETUP _trisetup_asm -#endif /* GLIDE_USE_C_TRISETUP */ - -/*==========================================================================*/ -/* -** Function Prototypes -*/ -#ifdef GLIDE_DEBUG -FxBool -_grCanSupportDepthBuffer( void ); -#endif - -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop); - -void -_grSwizzleColor( GrColor_t *color ); - -void -_grDisplayStats(void); - -void -_GlideInitEnvironment(void); - -void FX_CSTYLE -_grColorCombineDelta0Mode( FxBool delta0Mode ); - -void -_doGrErrorCallback( const char *name, const char *msg, FxBool fatal ); - -void _grErrorDefaultCallback( const char *s, FxBool fatal ); - -#ifdef __WIN32__ -void _grErrorWindowsCallback( const char *s, FxBool fatal ); -#endif /* __WIN32__ */ - -extern void -(*GrErrorCallback)( const char *string, FxBool fatal ); - -void GR_CDECL -_grFence( void ); - -int -_guHeapCheck( void ); - -void FX_CSTYLE -_grRebuildDataList( void ); - -void -_grReCacheFifo( FxI32 n ); - -FxI32 GR_CDECL -_grSpinFifo( FxI32 n ); - -void -_grShamelessPlug(void); - -FxBool -_grSstDetectResources(void); - -FxU16 -_grTexFloatLODToFixedLOD( float value ); - -void FX_CSTYLE -_grTexDetailControl( GrChipID_t tmu, FxU32 detail ); - -void FX_CSTYLE -_grTexDownloadNccTable( GrChipID_t tmu, FxU32 which, - const GuNccTable *ncc_table, - int start, int end ); -void FX_CSTYLE -_grTexDownloadPalette( GrChipID_t tmu, - GuTexPalette *pal, - int start, int end ); - -FxU32 -_grTexCalcBaseAddress( - FxU32 start_address, GrLOD_t largeLod, - GrAspectRatio_t aspect, GrTextureFormat_t fmt, - FxU32 odd_even_mask ); - -void -_grTexForceLod( GrChipID_t tmu, int value ); - -FxU32 -_grTexTextureMemRequired( GrLOD_t small_lod, GrLOD_t large_lod, - GrAspectRatio_t aspect, GrTextureFormat_t format, - FxU32 evenOdd ); -void FX_CSTYLE -_grUpdateParamIndex( void ); - -#if 0 -FX_ENTRY void FX_CALL -grSstConfigPipeline(GrChipID_t chip, GrSstRegister reg, FxU32 value); -#endif - -/*==========================================================================*/ -/* GMT: have to figure out when to include this and when not to -*/ -#if defined(GLIDE_DEBUG) || defined(GLIDE_ASSERT) || \ - defined(GLIDE_SANITY_ASSERT) || defined(GLIDE_SANITY_SIZE) || \ - defined(GDBG_INFO_ON) -#define DEBUG_MODE 1 -#include - -#if SST96_FIFO -/* sst96.c */ -extern void -_grSst96CheckFifoData(void); - -#define GLIDE_FIFO_CHECK() _grSst96CheckFifoData() -#else -#define GLIDE_FIFO_CHECK() -#endif -#else -#define GLIDE_FIFO_CHECK() -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) -/* NOTE: fifoFree is the number of entries, each is 8 bytes */ -#define GR_CHECK_FOR_ROOM(n) \ -{ \ - FxI32 fifoFree = gc->state.fifoFree - (n); \ - if (fifoFree < 0) \ - fifoFree = _grSpinFifo(n); \ - gc->state.fifoFree = fifoFree;\ -} -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -/* NOTE: fifoSize is in bytes, and each fifo entry is 8 bytes. Since - the fifoSize element of the sst96Dep data structure must be - accurate, we subtract after we write, instead of at the beginning - as above. */ -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && defined(GLIDE_DEBUG) -#define GR_CHECKINT10 if (gc->hwDep.sst96Dep.int10Called)_doGrErrorCallback("Glide Error:", "Application called Int 10 between grSstWinOpen and Close.\n", FXTRUE) -#else -#define GR_CHECKINT10 -#endif - -#if SST96_ALT_FIFO_WRAP - -#define GR_CHECK_FOR_ROOM(n) \ -{\ - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - ((n) << 1);\ - if (fifoSize < 0) {\ - gc->fifoData.hwDep.vg96FIFOData.blockSize = ((n) << 1); \ - initWrapFIFO(&gc->fifoData); \ - GR_CHECKINT10;\ - }\ -} -#else /* !SST96_ALT_FIFO_WRAP */ -#define GR_CHECK_FOR_ROOM(n) \ -{\ - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - ((n) << 1);\ - if (fifoSize < 0) {\ - _grSst96FifoMakeRoom();\ - GR_ASSERT(!(gc->fifoData.hwDep.vg96FIFOData.fifoSize < 0x1000));\ - GR_CHECKINT10;\ - }\ -} -#endif /* !SST96_ALT_FIFO_WRAP */ -#endif - -#ifdef GLIDE_SANITY_SIZE - -#define FIFO_SUB_VAL ((FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr - \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt) - -#define GR_CHECK_SIZE() \ - if(gc->counter != gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - ASSERT(gc->counter == gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 -#define GR_CHECK_SIZE_SLOPPY() \ - if(gc->counter > gc->expected_counter) \ - GDBG_ERROR("GR_ASSERT_SIZE","byte counter should be < %d but is %d\n", \ - gc->expected_counter,gc->counter); \ - ASSERT(gc->counter <= gc->expected_counter); \ - gc->counter = gc->expected_counter = 0 -#define GR_SET_EXPECTED_SIZE(n) \ - GLIDE_FIFO_CHECK(); \ - GDBG_INFO((gc->myLevel, \ - "FIFO: 0x%X 0x%X (0x%X)\n", \ - (n), \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr, \ - FIFO_SUB_VAL)); \ - GDBG_INFO((gc->myLevel, \ - "FIFOSize: 0x%X\n", \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoSize));\ - ASSERT(gc->counter == 0); \ - ASSERT(gc->expected_counter == 0); \ - GR_CHECK_FOR_ROOM((n)); \ - gc->expected_counter = n -#define GR_INC_SIZE(n) gc->counter += n -#else /* !GLIDE_SANITY_SIZE */ - /* define to do nothing */ -#define GR_CHECK_SIZE_SLOPPY() -#define GR_CHECK_SIZE() -#define GR_SET_EXPECTED_SIZE(n) GR_CHECK_FOR_ROOM((n)) -#define GR_INC_SIZE(n) -#endif /* !GLIDE_SANITY_SIZE */ - -#define GR_DCL_GC GrGC *gc = _GlideRoot.curGC -#define GR_DCL_HW Sstregs *hw = (Sstregs *)gc->reg_ptr - -#ifdef DEBUG_MODE - #define ASSERT(exp) GR_ASSERT(exp) - - #define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - static char myName[] = name; \ - GR_ASSERT(gc != NULL); \ - GR_ASSERT(hw != NULL); \ - gc->myLevel = level; \ - GDBG_INFO((gc->myLevel,"%s\n", myName)); \ - FXUNUSED( hw ) - -#else - #define ASSERT(exp) - - #define GR_BEGIN_NOFIFOCHECK(name,level) \ - GR_DCL_GC; \ - GR_DCL_HW; \ - FXUNUSED( hw ) -#endif - -#define GR_BEGIN(name,level,size) \ - GR_BEGIN_NOFIFOCHECK(name,level); \ - GR_SET_EXPECTED_SIZE(size) - -#if SST96_ALT_FIFO_WRAP -#define GR_EXIT_TRACE \ - GLIDE_FIFO_CHECK(); \ - GDBG_INFO((gc->myLevel, \ - "%s Done: FifoPtr(0x%X) FifoTest(0x%X)\n", \ - myName, \ - (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoPtr, \ - gc->fifoData.hwDep.vg96FIFOData.fifoSize)) -#else -#define GR_EXIT_TRACE GDBG_INFO((gc->myLevel, "%s Done\n", myName)) -#endif - -#define GR_END() {GR_CHECK_SIZE(); GR_EXIT_TRACE;} -#define GR_END_SLOPPY() {GR_CHECK_SIZE_SLOPPY(); GR_EXIT_TRACE;} -#define GR_RETURN(val) \ - if ( GDBG_GET_DEBUGLEVEL(gc->myLevel) ) { \ - GR_CHECK_SIZE(); \ - } \ - else \ - GR_END(); \ - GDBG_INFO((gc->myLevel,"%s() => 0x%x---------------------\n",myName,val,val)); \ - return val - -#ifndef GR_ASSERT -#if defined(GLIDE_SANITY_ASSERT) -# define GR_ASSERT(exp) if (!(exp)) _grAssert(#exp, __FILE__, __LINE__) -#else -# define GR_ASSERT(exp) -#endif -#endif - -#if defined(GLIDE_DEBUG) - #define GR_CHECK_F(name,condition,msg) \ - if ( condition ) _doGrErrorCallback( name, msg, FXTRUE ) - #define GR_CHECK_W(name,condition,msg) \ - if ( condition ) _doGrErrorCallback( name, msg, FXFALSE ) -#else - #define GR_CHECK_F(name,condition,msg) - #define GR_CHECK_W(name,condition,msg) -#endif - -/* macro define some basic and common GLIDE debug checks */ -#define GR_CHECK_TMU(name,tmu) \ - GR_CHECK_F(name, tmu < GR_TMU0 || tmu >= gc->num_tmu , "invalid TMU specified") - - -FxBool -_grSst96PCIFifoEmpty(void); -FxU32 -_grSst96Load32(FxU32 *s); -void -_grSst96Store32(FxU32 *d, FxU32 s); -void -_grSst96Store16(FxU16 *d, FxU16 s); -void -_grSst96Store32F(float *d, float s); -void -_grAssert(char *, char *, int); - -#if defined(SST96) -/* sst.h defines SET,GET,SETF, and SET16 */ -#undef SET -#undef SETF -#undef SET16 - -void GR_CDECL -_grSst96FifoMakeRoom(void); - -#define SST96_LFB_OFFSET 0x000000 -#define SST96_REG_OFFSET 0x400000 -#define SST96_TEX_OFFSET 0x600000 - -#ifdef SST96_FIFO -#ifdef GDBG_INFO_ON -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr); -#define DEBUGFIFOWRITE(a,b,c) \ -_grFifoWriteDebug((FxU32) a, (FxU32) b, (FxU32) c) -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr); -#define DEBUGFIFOFWRITE(a,b,c) \ -_grFifoFWriteDebug((FxU32) a, (float) b, (FxU32) c) -#else -#define DEBUGFIFOWRITE(a,b,c) -#define DEBUGFIFOFWRITE(a,b,c) -#endif - -/* -** Here lies the infamous Nudge Of Love. The Nudge Of Love is -** required to on P6s, where the read pointer trails the write -** pointer by 256 bytes (64 DWORDS). The problem with that is -** sometimes we really need the hardware to have read all the data we -** have sent--thus the Nudge, which gently strokes the read pointer -** through the last commands we've placed in the commadn FIFO. -** -** That would be all well and good except for one thing: If the -** frame time is very short, Jr, doesn't like the Nudge Of Love. So, -** instead of a whole bunch of nopCmds, we must draw a smallish -** triangle. The problem with that, however, is the app may be -** reusing the contents of the color or depth buffers. Thus, we have -** to disable the color and depth mask before drawing the triangle -** and replace the shadowed values after we draw it. -** -* dpc - 19 aug 1997 - FixMe! -* This macro is called the P6_NUDGE_OF_LOVE, but it was not previously -* conditional on running on a p6. Is this right? I moved the set expected -* size thing into here, and made usages of the macro not set the expected -* size and do the sloppy check. -*/ -#define P6_NUDGE_OF_LOVE \ -if (_GlideRoot.CPUType == 6) {\ - int i;\ - GR_SET_EXPECTED_SIZE(32 << 2); \ - GR_SET(hw->fbzMode, (gc->state.fbi_config.fbzMode & (~(SST_RGBWRMASK | SST_ZAWRMASK))));\ - GR_SETF(hw->FvA.x, 0.f);\ - GR_SETF(hw->FvA.y, 0.f);\ - GR_SETF(hw->FvB.x, 100.f);\ - GR_SETF(hw->FvB.y, 0.f);\ - GR_SETF(hw->FvC.x, 100.f);\ - GR_SETF(hw->FvC.y, 100.f);\ - GR_SETF(hw->FtriangleCMD, 1.f);\ - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode);\ - for (i = 0; i < 23; i++) GR_SET(hw->nopCMD, 0); \ - GR_CHECK_SIZE(); \ -} - -#define P6FENCEFIFO \ -if (_GlideRoot.CPUType == 6) {\ - GR_ASSERT(gc->hwDep.sst96Dep.writesSinceFence <= FENCE_AMOUNT);\ - if (gc->hwDep.sst96Dep.writesSinceFence == FENCE_AMOUNT) {\ - GR_P6FENCE;\ - }\ -} - -#define SST96_STORE_FIFO(addr,val){\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GR_ASSERT(gc->fifoData.hwDep.vg96FIFOData.fifoSize > 0);\ - P6FENCEFIFO;\ - DEBUGFIFOWRITE(addr, val, gc->fifoData.hwDep.vg96FIFOData.fifoPtr);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - (((FxU32) ((FxU32) addr) - ((FxU32) gc->lfb_ptr)) >> 2);\ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ = val;\ - gc->hwDep.sst96Dep.writesSinceFence+=2;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - GLIDE_FIFO_CHECK(); \ -} - -#define SST96_STOREF_FIFO(addr,fVal){\ - GR_ASSERT(!(((FxU32)(gc->fifoData.hwDep.vg96FIFOData.fifoPtr) & 0x7)));\ - GR_ASSERT(gc->fifoData.hwDep.vg96FIFOData.fifoSize);\ - P6FENCEFIFO;\ - DEBUGFIFOFWRITE((addr), fVal, gc->fifoData.hwDep.vg96FIFOData.fifoPtr);\ - GLIDE_FIFO_CHECK(); \ - *gc->fifoData.hwDep.vg96FIFOData.fifoPtr++ =\ - (((addr) - ((FxU32) gc->lfb_ptr)) >> 2);\ - *((float *)gc->fifoData.hwDep.vg96FIFOData.fifoPtr) = fVal;\ - gc->fifoData.hwDep.vg96FIFOData.fifoPtr++;\ - gc->hwDep.sst96Dep.writesSinceFence+=2;\ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= 8;\ - GLIDE_FIFO_CHECK(); \ -} - -#define SET16(d,s) SST96_STORE_FIFO((&d), (FxU32) s) -#define SET(d,s) SST96_STORE_FIFO((&d),s) -#define SETF(d,s) SST96_STOREF_FIFO(((FxU32)(&(d))), s) - -/* -** Here are some macro for the very few times when we must perform a -** direct write of the hardware--even when using the memory-backed -** command FIFO. -*/ -#ifndef GDBG_INFO_ON -#define SET_DIRECT(d,s) (hw->d) = (s) -#define SETF_DIRIECT(d,s) *((float *) &hw->d) = s -#else -#define REGOFFSET(d) (((FxU32) &hw->d - (FxU32) hw) >> 2) -#define SET_DIRECT(d,s)\ - GDBG_INFO((120, "DIRECT SET of register 0x%x with value 0x%x\n",\ - REGOFFSET(d), s));\ - (hw->d) = (s) -#define SETF_DIRECT(d,s)\ - GDBG_INFO((120, "DIRECT SET of register 0x%x with value %4.4f\n",\ - REGOFFSET(d), s));\ - *((float *) &hw->d) = s -#endif - -#else - -#ifndef GDBG_INFO_ON -#define GET(s) s -#define SET(d,s) d = s -#define SET16(d,s) d = s -#define SETF(d,s) (*(float *)&(d)) = s -#else -#undef GET - -#define GET(s) _grSst96Load32(&s) -#define SET(d,s) _grSst96Store32((FxU32 *)&d, s) -#define SET16(d,s) _grSst96Store16(&d,s) -#define SETF(d,s) _grSst96Store32F((float *) &d, s) -#endif /* GDBG_INFO_ON */ -#endif /* SST96_FIFO */ - -#endif /* defined(SST96) */ - -#if defined(GLIDE_DEBUG) && !defined(SST96) - extern FxU32 GR_CDECL _GR_GET(void *); - extern void GR_CDECL _GR_SET16(void *, unsigned short); - extern void GR_CDECL _GR_SET(void *, unsigned long); - extern void GR_CDECL _GR_SETF(void *, float); - - #define GR_GET(s) _GR_GET(&(s)) - #define GR_SET(d,s) {_GR_SET(&(d),s); SET(d,s); GR_INC_SIZE(4);} - #define GR_SETF(d,s) {_GR_SETF(&(d),s); SETF(d,s); GR_INC_SIZE(4);} - #define GR_SET16(d,s) {_GR_SET16(&(d),s); SET16(d,s); GR_INC_SIZE(2);} -#else - #define GR_GET(s) GET(s) - #define GR_SET(d,s) {SET(d,s); GR_INC_SIZE(4);} - #define GR_SETF(d,s) {SETF(d,s); GR_INC_SIZE(4);} - #define GR_SET16(d,s) {SET16(d,s); GR_INC_SIZE(2);} -#endif - - - -#define VG96_REGISTER_OFFSET 0x400000 -#define VG96_TEXTURE_OFFSET 0x600000 -/* make SST96 addresses */ -#define SST96_REG_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_REGISTER_OFFSET)) -#define SST96_LFB_PTR(a) \ - ((FxU32 *) a) -#define SST96_TEX_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_TEXTURE_OFFSET)) - -void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest); - -extern FxU16 rle_line[256]; -extern FxU16 *rle_line_end; - -#define RLE_CODE 0xE0 -#define NOT_RLE_CODE 31 - -#ifdef __WATCOMC__ -#pragma aux rle_decode_line_asm parm [edx] [edi] [esi] value [edi] modify exact [eax ebx ecx edx esi edi] = \ -" next_pixel: " \ -" xor ecx,ecx " \ -" mov al,byte ptr[edi] " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" " \ -" and al,0xE0 " \ -" cmp al,0xE0 " \ -" jne unique " \ -" " \ -" and cl,0x1F " \ -" mov al,cl " \ -" jz done_rle " \ -" " \ -" mov cl,byte ptr[edi] " \ -" inc edi " \ -" mov bx,word ptr[edx+ecx*2] " \ -" " \ -" copy_block: " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" dec al " \ -" jz next_pixel " \ -" jmp copy_block " \ -" " \ -" unique: " \ -" mov bx,word ptr[edx+ecx*2] " \ -" mov word ptr[esi],bx " \ -" add esi,0x2 " \ -" jmp next_pixel " \ -" done_rle: "; -#endif /* __WATCOMC__ */ - -#endif /* __FXGLIDE_H__ */ - diff --git a/glide2x/sst1/glide/src/fxinline.h b/glide2x/sst1/glide/src/fxinline.h deleted file mode 100644 index b9abb63..0000000 --- a/glide2x/sst1/glide/src/fxinline.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#ifndef __FX_INLINE_H__ -#define __FX_INLINE_H__ - -/* The # of 2-byte entries in the hw fog table */ -#define kInternalFogTableEntryCount 0x40UL - -#endif /* __FX_INLINE_H__ */ diff --git a/glide2x/sst1/glide/src/g3df.c b/glide2x/sst1/glide/src/g3df.c deleted file mode 100644 index 508df12..0000000 --- a/glide2x/sst1/glide/src/g3df.c +++ /dev/null @@ -1,523 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#ifdef __linux__ -#include -#endif - -extern const int _grMipMapHostWH[GR_ASPECT_1x8+1][GR_LOD_1+1][2]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _grMipMapHostSize[4][16]; - -static FxU16 ReadDataShort( FILE * ); -static FxU32 ReadDataLong( FILE * ); -static void Read8Bit( FxU8 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect ); -static void Read16Bit( FxU16 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect ); - -#if ( ( GLIDE_PLATFORM & ( GLIDE_OS_DOS32 | GLIDE_OS_WIN32 ) ) != 0 ) -const char *openmode = "rb"; -#else -const char *openmode = "r"; -#endif - -typedef struct -{ - const char *name; - GrTextureFormat_t fmt; - FxBool valid; -} CfTableEntry; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*--------------------------------------------------------------------------- -** gu3dfGetInfo -*/ -GR_DIENTRY(gu3dfGetInfo, FxBool, - ( const char *FileName, Gu3dfInfo *Info )) -{ - FILE *image_file; - FxU32 index, i; - FxU32 newlines = 0; - char version[5]; - char color_format[10]; - int aspect_width, aspect_height; - char buffer[100]; - int small_lod, large_lod; - FxBool ratio_found = FXFALSE; - FxBool format_found = FXFALSE; - GrAspectRatio_t wh_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_1x2, - GR_ASPECT_1x4, - GR_ASPECT_1x8 - }; - GrAspectRatio_t hw_aspect_table[] = - { - GR_ASPECT_1x1, - GR_ASPECT_2x1, - GR_ASPECT_4x1, - GR_ASPECT_8x1 - }; - CfTableEntry cftable[] = - { - { "I8", GR_TEXFMT_INTENSITY_8, FXTRUE }, - { "A8", GR_TEXFMT_ALPHA_8, FXTRUE }, - { "AI44", GR_TEXFMT_ALPHA_INTENSITY_44, FXTRUE }, - { "YIQ", GR_TEXFMT_YIQ_422, FXTRUE }, - { "RGB332", GR_TEXFMT_RGB_332, FXTRUE }, - { "RGB565", GR_TEXFMT_RGB_565, FXTRUE }, - { "ARGB8332", GR_TEXFMT_ARGB_8332, FXTRUE }, - { "ARGB1555", GR_TEXFMT_ARGB_1555, FXTRUE }, - { "AYIQ8422", GR_TEXFMT_AYIQ_8422, FXTRUE }, - { "ARGB4444", GR_TEXFMT_ARGB_4444, FXTRUE }, - { "AI88", GR_TEXFMT_ALPHA_INTENSITY_88, FXTRUE }, - { "P8", GR_TEXFMT_P_8, FXTRUE }, - { "AP88", GR_TEXFMT_AP_88, FXTRUE }, - { 0, 0, FXFALSE } - }; - - GDBG_INFO((81,"gu3dfGetInfo(%s,0x%x)\n",FileName,Info)); - /* - ** open the filen - */ - if( ( image_file = fopen( FileName, openmode ) ) == NULL ) - return FXFALSE; - - /* - ** check header - */ - index=0; - while(newlines<4) /* Read the header into a buffer. */ - if((buffer[index++]=getc(image_file))=='\n') - { - newlines++; - buffer[index-1] = ' '; - } - buffer[--index] = 0; - - /* - ** grab statistics out of the header - */ - if( sscanf(buffer,"3df v%s %s lod range: %i %i aspect ratio: %i %i\n", - &version, - color_format, - &small_lod, &large_lod, - &aspect_width, &aspect_height ) == 0 ) - return FXFALSE; - - /* - ** determine aspect ratio, height, and width - */ - i = 0; - ratio_found = FXFALSE; - while ( ( i < 4 ) && ( !ratio_found ) ) - { - if ( ( aspect_width << i ) == aspect_height ) - { - Info->header.aspect_ratio = wh_aspect_table[i]; - ratio_found = FXTRUE; - } - i++; - } - i = 0; - while ( ( i < 4 ) && ( !ratio_found ) ) - { - if ( ( aspect_height << i ) == aspect_width ) - { - Info->header.aspect_ratio = hw_aspect_table[i]; - ratio_found = FXTRUE; - } - i++; - } - if ( !ratio_found ) - return FXFALSE; - - /* - ** determine height and width of the mip map - */ - if ( aspect_width >= aspect_height ) - { - Info->header.width = large_lod; - Info->header.height = large_lod / aspect_width; - } - else - { - Info->header.height = large_lod; - Info->header.width = large_lod / aspect_height; - } - - - /* - ** calculate proper LOD values - */ - switch ( small_lod ) - { - case 1: - Info->header.small_lod = GR_LOD_1; - break; - case 2: - Info->header.small_lod = GR_LOD_2; - break; - case 4: - Info->header.small_lod = GR_LOD_4; - break; - case 8: - Info->header.small_lod = GR_LOD_8; - break; - case 16: - Info->header.small_lod = GR_LOD_16; - break; - case 32: - Info->header.small_lod = GR_LOD_32; - break; - case 64: - Info->header.small_lod = GR_LOD_64; - break; - case 128: - Info->header.small_lod = GR_LOD_128; - break; - case 256: - Info->header.small_lod = GR_LOD_256; - break; - } - - switch ( large_lod ) - { - case 1: - Info->header.large_lod = GR_LOD_1; - break; - case 2: - Info->header.large_lod = GR_LOD_2; - break; - case 4: - Info->header.large_lod = GR_LOD_4; - break; - case 8: - Info->header.large_lod = GR_LOD_8; - break; - case 16: - Info->header.large_lod = GR_LOD_16; - break; - case 32: - Info->header.large_lod = GR_LOD_32; - break; - case 64: - Info->header.large_lod = GR_LOD_64; - break; - case 128: - Info->header.large_lod = GR_LOD_128; - break; - case 256: - Info->header.large_lod = GR_LOD_256; - break; - } - - /* - ** determine the color format of the input image - */ - strupr( color_format ); - - i = 0; - format_found = FXFALSE; - while ( ( cftable[i].name != 0 ) && ( !format_found ) ) - { - if ( strcmp( color_format, cftable[i].name ) == 0 ) - { - Info->header.format = cftable[i].fmt; - format_found = FXTRUE; - } - i++; - } - - /* - ** close the input file - */ - fclose( image_file ); - - if ( format_found ) { - FxI32 lod; - Info->mem_required = 0; - for( lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++ ) { - Info->mem_required += - _grMipMapHostSize[_gr_aspect_index_table[Info->header.aspect_ratio]] - [lod] << (Info->header.format>=GR_TEXFMT_16BIT); - } - } - - return format_found; -} - -/*--------------------------------------------------------------------------- -** gu3dfLoad -*/ -GR_DIENTRY(gu3dfLoad, FxBool, ( const char *filename, Gu3dfInfo *info )) -{ - FILE *image_file = 0; - FxU32 index = 0; - FxU32 newlines = 0; - char buffer[100] = ""; - - GDBG_INFO((81,"gu3dfLoad(%s,0x%x)\n",filename,info)); - /* - ** open the file - */ - if ( ( image_file = fopen( filename, openmode ) ) == NULL ) - return FXFALSE; - - /* - ** examine the header - */ - index = 0; - while ( newlines < 4 ) - { - if ( ( buffer[index++] = getc( image_file ) ) == '\n') - { - newlines++; - buffer[index-1] = ' '; - } - } - buffer[--index] = 0; - - /* - ** If necessary, read in the YIQ decompression table - */ - if ( ( info->header.format == GR_TEXFMT_YIQ_422 ) || - ( info->header.format == GR_TEXFMT_AYIQ_8422 ) ) - { - /* - ** read in Y - */ - for ( index = 0; index < 16; index++ ) - info->table.nccTable.yRGB[index] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0xFF; - - /* - ** read in I - */ - for ( index = 0; index < 4; index++ ) - { - info->table.nccTable.iRGB[index][0] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - info->table.nccTable.iRGB[index][1] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - info->table.nccTable.iRGB[index][2] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - } - - /* - ** read in Q - */ - for ( index = 0; index < 4; index++ ) - { - info->table.nccTable.qRGB[index][0] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - info->table.nccTable.qRGB[index][1] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - info->table.nccTable.qRGB[index][2] = ( ( FxI16 ) ReadDataShort( image_file ) ) & 0x1FF; - } - - /* - ** pack the table Y entries - */ - for ( index = 0; index < 4; index++ ) - { - FxU32 packedvalue; - - packedvalue = ( ( FxU32 ) info->table.nccTable.yRGB[index*4+0] ); - packedvalue |= ( ( FxU32 ) info->table.nccTable.yRGB[index*4+1] ) << 8; - packedvalue |= ( ( FxU32 ) info->table.nccTable.yRGB[index*4+2] ) << 16; - packedvalue |= ( ( FxU32 ) info->table.nccTable.yRGB[index*4+3] ) << 24; - - info->table.nccTable.packed_data[index] = packedvalue; - } - - /* - ** pack the table I entries - */ - for ( index = 0; index < 4; index++ ) - { - FxU32 packedvalue; - - packedvalue = ( ( FxU32 ) info->table.nccTable.iRGB[index][0] ) << 18; - packedvalue |= ( ( FxU32 ) info->table.nccTable.iRGB[index][1] ) << 9; - packedvalue |= ( ( FxU32 ) info->table.nccTable.iRGB[index][2] ) << 0; - - info->table.nccTable.packed_data[index+4] = packedvalue; - } - - /* - ** pack the table Q entries - */ - for ( index = 0; index < 4; index++ ) - { - FxU32 packedvalue; - - packedvalue = ( ( FxU32 ) info->table.nccTable.qRGB[index][0] ) << 18; - packedvalue |= ( ( FxU32 ) info->table.nccTable.qRGB[index][1] ) << 9;; - packedvalue |= ( ( FxU32 ) info->table.nccTable.qRGB[index][2] ) << 0; - - info->table.nccTable.packed_data[index+8] = packedvalue; - } - } - - /* - ** If necessary, read in the Palette - */ - if ( ( info->header.format == GR_TEXFMT_P_8 ) || - ( info->header.format == GR_TEXFMT_AP_88 ) ) { - FxU32 i; - for( i = 0; i < 256; i++ ) - info->table.palette.data[i] = ReadDataLong( image_file ); - } - - /* - ** Read in the image - */ - switch ( info->header.format ) - { - case GR_TEXFMT_INTENSITY_8: - case GR_TEXFMT_ALPHA_8: - case GR_TEXFMT_ALPHA_INTENSITY_44: - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_RGB_332: - case GR_TEXFMT_P_8: - Read8Bit( info->data, image_file, info->header.small_lod, info->header.large_lod, info->header.aspect_ratio ); - break; - case GR_TEXFMT_RGB_565: - case GR_TEXFMT_ARGB_8332: - case GR_TEXFMT_ARGB_1555: - case GR_TEXFMT_AYIQ_8422: - case GR_TEXFMT_ARGB_4444: - case GR_TEXFMT_ALPHA_INTENSITY_88: - case GR_TEXFMT_AP_88: - Read16Bit( info->data, image_file, info->header.small_lod, info->header.large_lod, info->header.aspect_ratio ); - break; - - default: - return FXFALSE; - } - - /* - ** close the file - */ - fclose( image_file ); - - return FXTRUE; -} - -/* -** Read8Bit -** -** Read in an 8-bit texture map, unpacked. -*/ -static void Read8Bit( FxU8 *data, FILE *image_file, int small_lod, int large_lod, GrAspectRatio_t aspect_ratio ) -{ - int lod; - int width, height; - - for ( lod = large_lod; lod <= small_lod; lod++ ) - { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - fread( data, sizeof( char ), width*height, image_file ); - data += width*height; - } -} - -/* -** Read16Bit -** -** Read in a 16-bit texture map, unpacked. -*/ -static void Read16Bit( FxU16 *data, FILE *image_file, int small_lod, int large_lod, GrAspectRatio_t aspect_ratio ) -{ - int index; - int lod; - int width, height; - - for ( lod = large_lod; lod <= small_lod; lod++ ) - { - width = _grMipMapHostWH[aspect_ratio][lod][0]; - height = _grMipMapHostWH[aspect_ratio][lod][1]; - - for ( index = 0; index < ( width * height ); index++ ) - { - *data = ReadDataShort( image_file ); - data++; - } - } -} - -/* -** FxU16 ReadDataShort -*/ -static FxU16 ReadDataShort( FILE *fp ) -{ - FxU16 value; - - /* - ** read in the MSB - */ - value = ( ( FxU16 ) getc( fp ) ) << 8; - - /* - ** read in the LSB - */ - value |= ( getc( fp ) & 0x00FF ); - - return value; -} - -/* -** ReadDataLong -*/ -static FxU32 ReadDataLong( FILE *fp ) -{ - FxU32 data; - FxU8 byte[4]; - - fread(byte, 4, 1, fp); - data = (((FxU32) byte[0]) << 24) | - (((FxU32) byte[1]) << 16) | - (((FxU32) byte[2]) << 8) | - ((FxU32) byte[3]); - - return data; -} - - - diff --git a/glide2x/sst1/glide/src/gaa.c b/glide2x/sst1/glide/src/gaa.c deleted file mode 100644 index ad60d8b..0000000 --- a/glide2x/sst1/glide/src/gaa.c +++ /dev/null @@ -1,846 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 13 8/21/97 2:26p Atai - * fix FIFO size - * - * 12 7/25/97 2:55p Atai - * Remove slope calculation in edge sense code, use cross product instead. - * Move grAADrawTriEdgeSense() 1/area calculation after pci write command. - * - * 11 7/24/97 5:59p Atai - * optimize grAADrawPoint, grAADrawLine and grAADrawTriangle for sst1 - * - * 10 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 9 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - -/* -** ----------------------------------------------------------------------- -** -** Antialiasing rendering functions -** -** ----------------------------------------------------------------------- -*/ - -/*--------------------------------------------------------------------------- -** grAADrawPoint -** -** |-w-| -** A---B - -** |\ /| | -** | E | h -** |/ \| | -** D --C - -** w = h = 2pixels -** -** pci write command -** 1st triangle EDA -** 8 + 3 * n -** 2nd triangle BEC -** 8 -** 3rd triangle AED -** 5 -** 4th triangle ABE -** 8 -** total = 29 + 3 * n -*/ -GR_ENTRY(grAADrawPoint, void, ( const GrVertex *e )) -{ - int i, j; - float *fp; - struct dataList_s *dlp; - float dp; - float PX, PY; - - GR_BEGIN("grAADrawPoint",94,((_GlideRoot.curTriSize - _GlideRoot.curTriSizeNoGradient) >> 3) * 12 + 116); - - PX = e->x; - PY = e->y; - j = *(long *)&e->a; - j ^= 0x80000000; - - /* 1st triangle EDA */ - GR_SETF(hw->FvA.x, PX); - dp = PX - _GlideRoot.pool.f1; - GR_SETF(hw->FvB.x, dp); - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvC.x, dp); - dlp = gc->dataList; - GR_SETF(hw->FvA.y, PY); - dp = PY + _GlideRoot.pool.f1; - GR_SETF(hw->FvB.y, dp); - i = dlp->i; - GR_SETF(hw->FvC.y, dp); - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(e,i); - GR_SETF( fp[0], dp ); - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - GR_SET(hw->Fdady, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 0xffffffff) ); - - /* 2nd triangle BEC */ - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvA.x, dp); - GR_SETF(hw->FvB.x, PX); - dp = PY - _GlideRoot.pool.f1; - GR_SETF(hw->FvA.y, dp); - GR_SETF(hw->FvB.y, PY); - - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, j); - GR_SET(hw->Fdady, 0); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 0xffffffff) ); - - /* 3rd triangle AED */ - dp = PX - _GlideRoot.pool.f1; - GR_SETF(hw->FvA.x, dp); - GR_SETF(hw->FvC.x, dp); - - j ^= 0x80000000; - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 1) ); - - /* 4th triangle ABE */ - dp = PX + _GlideRoot.pool.f1; - GR_SETF(hw->FvB.x, dp); - GR_SETF(hw->FvC.x, PX); - dp = PY - _GlideRoot.pool.f1; - GR_SETF(hw->FvB.y, dp); - GR_SETF(hw->FvC.y, PY); - - GR_SET(hw->Fa, 0); - GR_SET(hw->Fdadx, 0); - GR_SET(hw->Fdady, j); - P6FENCE_CMD( GR_SET(hw->triangleCMD, 1) ); - - GR_END(); -} /* grAADrawPoint */ - -static void grSetVertexParameter(const GrVertex *v1) -{ - GR_DCL_GC; - GR_DCL_HW; - struct dataList_s *dlp; - int i; - float *fp, dp; - - dlp = gc->dataList; - i = dlp->i; - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dlp++; - i = dlp->i; - } - } -} - -/*--------------------------------------------------------------------------- -** grAADrawLine -** A(x1,y1-1.0)+ -** | \ -** | \ \ -** | \ \ -** V1(x1,y1)* \ -** | * \ \ -** | \ * \ -** | \ \ -** E(x1,y1+1.0)+ \ * \ \ -** \ * +B(x2,y2-1.0) -** \ \ * \ | -** \ | -** \ \ * \| -** \ +V2(x2,y2) -** \ \ | -** \ | -** \ \| -** +F(x2,y2+1.0) -** -** pci write command (x major line ) -** 1st triangle A-B-V2 -** 10 + 3 * n -** 2nd triangle A-V1-V2 -** 6 + n -** 3rd triangle V1-E-F -** 6 + n -** 4th triangle V1-V2-F -** 5 + n -** total = -*/ -GR_ENTRY(grAADrawLine, void, ( const GrVertex *v1, const GrVertex *v2 )) -{ - float adx; /* |dX| */ - const GrVertex *tv; - struct dataList_s *dlp; - int i; - float *fp, dp; - float tmp1, tmp2; - float dx, dy; /* delta X and Y */ - - GR_BEGIN("grAADrawLine",95, ((_GlideRoot.curTriSize - _GlideRoot.curTriSizeNoGradient) >> 3) * 24 + 108); - - GDBG_INFO((95,"grAADrawLine(0x%x,0x%x)\n",v1,v2)); - - /* turn off culling so triangles unconditionally draw */ - - /* draw from low Y to high Y */ - if ( v2->y < v1->y ) { - tv = v1; v1 = v2; v2 = tv; - } - - /* compute deltas and absolute deltas */ - dx = adx = v1->x - v2->x; - dy = v2->y - v1->y; - if ( adx < 0 ) - adx = -adx; - - if ( adx >= dy ) { /* X major line */ - - if (dx == 0.0f) - return; - - /* 1st triangle A-B-V2*/ - - GR_SETF( hw->FvA.x, v1->x); - dx = _GlideRoot.pool.f1 / dx; - GR_SETF( hw->FvA.y, v1->y - _GlideRoot.pool.f1); - tmp1 = -v1->a * dy; - GR_SETF( hw->FvB.x, v2->x); - GR_SETF( hw->FvB.y, v2->y - _GlideRoot.pool.f1); - tmp2 = -v2->a * dy; - GR_SETF( hw->FvC.x, v2->x); - dlp = gc->dataList; - GR_SETF( hw->FvC.y, v2->y); - i = dlp->i; - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dp -= FARRAY(v2, i); - GR_SETF( fp[DPDX_OFFSET>>2] , dp * dx); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - GR_SET( hw->Fa , 0 ); - dp = - tmp2 * dx; - GR_SETF( hw->Fdadx , dp ); - GR_SETF( hw->Fdady , v2->a ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dx ) ); - - /* 2nd triangle A-V1-V2*/ - GR_SETF( hw->FvB.x, v1->x); - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - dp = v1->a - v2->a; - GR_SETF( hw->FvB.y, v1->y); - dp -= tmp1; - GR_SETF( hw->Fdady , v1->a ); - dp *= dx; - GR_SETF( hw->Fdadx , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dx ) ); - - /* 3rd triangle v1-E-F */ - GR_SETF( hw->FvA.y, v1->y); - GR_SETF( hw->FvB.y, v1->y + _GlideRoot.pool.f1); - GR_SETF( hw->FvC.y, v2->y + _GlideRoot.pool.f1); - - grSetVertexParameter(v1); - - GR_SETF( hw->Fdady , -v1->a ); - dp = tmp1 * dx; - GR_SETF( hw->Fdadx , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dx ) ); - - /* 4th triangle V1-V2-F*/ - GR_SETF( hw->FvB.x, v2->x); - dp = v1->a - v2->a + tmp2; - GR_SETF( hw->FvB.y, v2->y); - dp *= dx; - - grSetVertexParameter(v1); - - GR_SETF( hw->Fdadx , dp ); - GR_SETF( hw->Fdady , -v2->a ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dx ) ); - - } else { /* Y major line */ - - if (dy == 0.0f) - return; - - /* 1st triangle v1-v2-b */ - GR_SETF( hw->FvA.x, v1->x); - tmp1 = v1->a * dx; - GR_SETF( hw->FvA.y, v1->y); - tmp2 = v2->a * dx; - GR_SETF( hw->FvB.x, v2->x); - dy = - 1.0f / dy; - GR_SETF( hw->FvB.y, v2->y); - GR_SETF( hw->FvC.x, v2->x - _GlideRoot.pool.f1); - dlp = gc->dataList; - GR_SETF( hw->FvC.y, v2->y); - i = dlp->i; - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(v1,i); - GR_SETF( fp[0], dp ); - dp -= FARRAY(v2, i); - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dp * dy ); - } - } - dp = (v1->a - tmp2 - v2->a); - GR_SETF( hw->Fdadx , v2->a ); - dp *= dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dy ) ); - - /* 2nd triangle v1-a-b */ - - GR_SETF( hw->FvB.x, v1->x - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, v1->y); - grSetVertexParameter(v1); - GR_SETF( hw->Fdadx , v1->a ); - dp = - tmp1 * dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dy ) ); - - /* 3rd triangle e-v1-v2 */ - GR_SETF( hw->FvA.x, v1->x + _GlideRoot.pool.f1); - dp = (v1->a - v2->a + tmp1); - GR_SETF( hw->FvB.x, v1->x); - dp *= dy; - GR_SETF( hw->FvC.x, v2->x); - - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - GR_SETF( hw->Fdadx , -v1->a ); - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, dy ) ); - - /* 4th triangle e-f-v2 */ - GR_SETF( hw->FvB.x, v2->x + _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, v2->y); - - grSetVertexParameter(v1); - GR_SET( hw->Fa , 0 ); - - GR_SETF( hw->Fdadx , -v2->a ); - dp = tmp2 * dy; - GR_SETF( hw->Fdady , dp ); - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, -dy ) ); - - } - GR_END(); -} /* grAADrawLine */ - -typedef enum { - aaEdgeSenseTop, - aaEdgeSenseLeft, - aaEdgeSenseBottom, - aaEdgeSenseRight -} aaEdgeSense; - -/* -** grAADrawTriEdgeSense -** -** This routine combines aaCalcEdgeSense(), grAADrawTriEdge(), and -** grAADrawEdgeTriangle(). The goal is to -** 1. reduce the number of divide from 3 to 1 -** 2. minimize pci write command. -*/ -static void -grAADrawTriEdgeSense(const GrVertex *a,const GrVertex *b,const GrVertex *c) -{ - const GrVertex *tv; - float dx, dy, m, dp; - aaEdgeSense sense; - - GR_BEGIN_NOFIFOCHECK("grAADrawTriEdgeSense",gc->myLevel); - - - if (a->y >= b->y) { - tv = a; a = b; b = tv; - } - dx = a->x - b->x; - dy = a->y - b->y; - - if (dx == 0.f) { - if (c->x > a->x) - sense = aaEdgeSenseLeft; - else - sense = aaEdgeSenseRight; - } - else if (dy == 0.0f) { - if (c->y > a->y) - sense = aaEdgeSenseBottom; - else - sense = aaEdgeSenseTop; - } - else { - float dcax, dcay, dcbx, dcby, cp; - dcax = a->x - c->x; - dcay = a->y - c->y; - dcbx = b->x - c->x; - dcby = b->y - c->y; - cp = dcax * dcby - dcay * dcbx; - - if (dx > 0.0f) { - if (dx >= -dy) /* X-major line */ - sense = (cp > 0) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp > 0) ? aaEdgeSenseRight : aaEdgeSenseLeft; - } - else { - if (dx <= dy) /* X-major line */ - sense = (cp < 0) ? aaEdgeSenseTop : aaEdgeSenseBottom; - else /* Y-major line */ - sense = (cp < 0) ? aaEdgeSenseLeft : aaEdgeSenseRight; - } - } - - switch (sense) { - case aaEdgeSenseTop: - /* pci comamnd 14 + 2 * n */ - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSizeNoGradient << 1); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvC.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvB.y, a->y + _GlideRoot.pool.f1); - dp = a->a * dy; - GR_SETF( hw->FvC.y, b->y + _GlideRoot.pool.f1); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, -a->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - - dp = b->a * dy; - GR_SETF( hw->FvB.x, b->x); - dp = a->a - b->a + dp; - GR_SETF( hw->FvB.y, b->y); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, -b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - break; - - case aaEdgeSenseLeft: - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.y, b->y); - m = 1.0f / dy; - GR_SETF( hw->FvA.x, a->x - _GlideRoot.pool.f1); - GR_SETF( hw->FvC.x, b->x - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - GR_SETF( hw->Fdadx, a->a); - dp = - a->a * dx * m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dy ) ); - - GR_SETF( hw->FvA.x, a->x); - dp = b->a * dx; - GR_SETF( hw->FvB.x, b->x); - dp = a->a - dp - b->a; - GR_SETF( hw->FvB.y, b->y); - - grSetVertexParameter(a); - - GR_SETF( hw->Fdadx, b->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dy ) ); - - break; - - case aaEdgeSenseBottom: - - if (dy < -1.0f) { - /* pci comamnd 17 + 2 * n */ - GR_SET_EXPECTED_SIZE(12+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvC.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a * dy; - dp *= m; - GR_SETF( hw->Fdadx, -dp); - GR_SETF( hw->Fdady, a->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - - GR_SETF( hw->FvA.y, a->y); - dp = b->a * dy; - GR_SETF( hw->FvB.x, b->x); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - dp = a->a - b->a - dp; - GR_SETF( hw->FvC.y, b->y); - grSetVertexParameter(a); - - GR_SETF( hw->Fdady, b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - } - else if (dy == 0.0f) { - - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvC.x, b->x); - GR_SETF( hw->FvC.y, b->y); - GR_SETF( hw->FvB.x, b->x); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - GR_SET( hw->Fdadx, 0); - GR_SETF( hw->Fdady, b->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a - b->a; - GR_SETF( hw->Fdady, a->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - } - else { - - /* pci comamnd 20 + 2 * n */ - GR_SET_EXPECTED_SIZE(24+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.x, a->x); - GR_SETF( hw->FvB.x, b->x); - GR_SETF( hw->FvC.x, a->x); - GR_SETF( hw->FvC.y, a->y); - m = 1.0f / dx; - GR_SETF( hw->FvA.y, a->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.y, b->y - _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = -a->a * dy * m; - GR_SETF( hw->Fdadx, dp); - GR_SETF( hw->Fdady, a->a); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, -dx ) ); - - GR_SETF( hw->FvA.x, b->x); - GR_SETF( hw->FvA.y, b->y - _GlideRoot.pool.f1); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - dp = b->a * dy; - GR_SETF( hw->FvC.x, b->x); - GR_SETF( hw->FvC.y, b->y); - - grSetVertexParameter(b); - GR_SET(hw->Fa, 0); - dp = a->a - dp - b->a; - GR_SETF( hw->Fdady, b->a); - dp *= m; - GR_SETF( hw->Fdadx, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dx ) ); - } - - break; - case aaEdgeSenseRight: - /* pci comamnd 16 + 2 * n */ - GR_SET_EXPECTED_SIZE(8+(_GlideRoot.curTriSizeNoGradient << 1)); - GR_SETF( hw->FvA.y, a->y); - GR_SETF( hw->FvB.x, a->x); - GR_SETF( hw->FvB.y, a->y); - GR_SETF( hw->FvC.y, b->y); - m = 1.0f / dy; - GR_SETF( hw->FvA.x, a->x + _GlideRoot.pool.f1); - GR_SETF( hw->FvC.x, b->x + _GlideRoot.pool.f1); - - grSetVertexParameter(a); - GR_SET(hw->Fa, 0); - - dp = a->a * dx; - GR_SETF( hw->Fdadx, -a->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dy ) ); - - GR_SETF( hw->FvA.x, a->x); - dp = b->a * dx; - GR_SETF( hw->FvB.x, b->x); - dp = dp + a->a - b->a; - GR_SETF( hw->FvB.y, b->y); - grSetVertexParameter(a); - - GR_SETF( hw->Fdadx, -b->a); - dp *= m; - GR_SETF( hw->Fdady, dp); - P6FENCE_CMD( GR_SETF( hw->triangleCMD, dy ) ); - break; - } - GR_END_SLOPPY(); -} /* grAADrawTriEdge */ - -#if 0 -/* -** aaCalculateSignOfSinTheta -** -*/ -float -aaCalculateSignOfSinTheta(GrVertex *a, GrVertex *b, GrVertex *c) -{ - float - x1, y1, x2, y2; - - /* - Now, we make two vectors: ab [x1 y1] and ac [x2 y2] - Fromt the cross product, we know that - - x1*y2 - x2*y1 = |ab|*|ac|*sin(theta), where theta is the angle - between the two lines. If sin(theta) > 0, c is above the line ab, - and if it's negative, it's below ab. - */ - x1 = b->x - a->x; - y1 = b->y - a->y; - - x2 = c->x - a->x; - y2 = c->y - a->y; - - return ((x1 * y2) - (x2 * y1)); - -} /* aaCalculateSignOfSinTheta */ -#endif - - -/*--------------------------------------------------------------------------- -** grAADrawTriangle -** -** NOTE: This doesn't quite work yet -*/ -GR_ENTRY(grAADrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c, FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias ) ) -{ - FxU32 - fbzMode, /* What we write to fbzMode */ - fbzModeOld; /* Squirrel away current fbzMode */ - - GR_BEGIN_NOFIFOCHECK("grAADrawTriangle",96); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x,%d,%d,%d)\n", - a,b,c,ab_antialias,bc_antialias,ca_antialias)); - - fbzModeOld = gc->state.fbi_config.fbzMode; - if ( TRISETUP ( a, b, c ) <= 0) {/* backfaced or zero area */ - GR_END(); - return; - } - /* Disable depth buffer writes for edge triangles */ - fbzMode = fbzModeOld; - fbzMode &= ~(SST_ZAWRMASK); - GR_SET_EXPECTED_SIZE(4); - GR_SET( hw->fbzMode, fbzMode ); - GR_CHECK_SIZE(); - - if ( ab_antialias ) { - grAADrawTriEdgeSense(a, b, c); - } - - if ( bc_antialias ) { - grAADrawTriEdgeSense(b, c, a); - } - - if ( ca_antialias ) { - grAADrawTriEdgeSense(c, a, b); - } - - /* Restore the old fbzMode */ - GR_SET_EXPECTED_SIZE(4); - GR_SET( hw->fbzMode, fbzModeOld ); - GR_END(); -} /* grAADrawTriangle */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygon -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygon, void, (const int nverts, const int ilist[], const GrVertex vlist[])) -{ - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygon",97); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[ilist[0]]; - b = &vlist[ilist[i]]; - c = &vlist[ilist[i+1]]; - if ( TRISETUP ( a, b, c ) <= 0 ) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - grAADrawTriEdgeSense(a, b, c); - - } else if (i == (nverts - 2)) { - grAADrawTriEdgeSense(c, a, b); - } - - grAADrawTriEdgeSense(b, c, a); - - } - GR_END(); -} /* grAADrawPolygon */ - -/*--------------------------------------------------------------------------- -** grAADrawPolygonVertexList -** NOTE: This routine does not do backface culling!!! -*/ - -GR_ENTRY(grAADrawPolygonVertexList, void, (const int nverts, const GrVertex vlist[])) -{ - int - i = 1; /* index into ilist */ - const GrVertex - *a, *b, *c; /* What we end up sending */ - FxI32 - res; - - GR_BEGIN_NOFIFOCHECK("grAADrawPolygonVertexList",97); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x)\n",nverts,vlist)); - - for (i=1; i < nverts - 1; i++) { - a = &vlist[0]; - b = &vlist[i]; - c = &vlist[i+1]; - - res = TRISETUP ( a, b, c ); - if (res <= 0) /* backfaced or zero area */ - continue; - - /* - ** Always draw the BC edge. - ** On the first triangle, additionally draw the AB edge. - ** On the last triangle, draw the CA edge. - */ - if (i == 1) { - grAADrawTriEdgeSense(a, b, c); - } else if (i == (nverts - 2)) { - grAADrawTriEdgeSense(c, a, b); - } - - grAADrawTriEdgeSense(b, c, a); - - } - GR_END(); -} /* grAADrawPolygonVertexList */ - - - diff --git a/glide2x/sst1/glide/src/gbanner.c b/glide2x/sst1/glide/src/gbanner.c deleted file mode 100644 index 597f031..0000000 --- a/glide2x/sst1/glide/src/gbanner.c +++ /dev/null @@ -1,184 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 9 5/02/97 2:08p Pgj - * screen_width/height now FxU32 - * - * 8 3/16/97 2:24a Jdt - * Fixed bug. Didn't initialize info. - * - * 7 3/12/97 11:51p Jdt - * Watcom warning. - * - * 6 3/12/97 4:20p Jdt - * Fixed for VG96 and optimized SST-1 - * - * 5 2/26/97 11:55a Jdt - * Updated banner for new lfb api - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GLIDE_PLUG -#include "banner.inc" -#endif - -/* display the translucent 3Dfx powerfield logo */ -void -_grShamelessPlug( void ) -{ -#ifdef GLIDE_PLUG - GrState state; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("_grShamelessPlug",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - grGlideGetState( &state ); - grDisableAllEffects(); - - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grClipWindow( 0, 0, - gc->state.screen_width - 1, - gc->state.screen_height - 1); - grDepthMask(FXFALSE); - grDepthBufferFunction(GR_CMP_ALWAYS); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - - grChromakeyValue( 0x0000 ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - grLfbConstantAlpha( (FxU8) 90); - grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); - - /* Attempt to lock with pixpipe enabled */ - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565,GR_ORIGIN_UPPER_LEFT, - FXTRUE, &info ) ) { - FxU32 *dstData; - FxU32 dstJump; - FxU32 *srcData; - FxI32 srcJump; - FxU32 srcScanlineLength; - FxU32 scrWidth = gc->state.screen_width; - FxU32 scrHeight = gc->state.screen_height; - - FxU32 scanline; - - /* Draw Banner in lower right of screen */ - if ( scrWidth < (FxU32)banner_width ) return; - if ( scrHeight < (FxU32)banner_height ) return; - - dstData = info.lfbPtr; - dstData = (FxU32*)( ((char*)dstData) + - (info.strideInBytes*((scrHeight-1)-banner_height)) + - ((scrWidth-banner_width)<<1) ); - dstJump = ((info.strideInBytes >> 1) - banner_width)>>1; - srcData = (FxU32*)&banner_data[banner_width*(banner_height-1)]; - srcScanlineLength = banner_width>>1; - srcJump = (-banner_width); - - for( scanline = 0; scanline < (FxU32)banner_height; scanline++ ) { - FxU32 *end = srcData + srcScanlineLength; - while( srcData < end ) *dstData++ = *srcData++; - dstData += dstJump; - srcData += srcJump; - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - } - grGlideSetState( &state ); - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FXUNUSED( state ); - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565,GR_ORIGIN_UPPER_LEFT, - FXFALSE, &info ) ) { - - FxU16 *dstData; - FxU32 dstJump; - FxU16 *srcData; - FxI32 srcJump; - FxU32 srcScanlineLength; - FxU32 scrWidth = gc->state.screen_width; - FxU32 scrHeight = gc->state.screen_height; - - FxU32 scanline; - - /* Draw Banner in lower right of screen */ - if ( scrWidth < (FxU32)banner_width ) return; - if ( scrHeight < (FxU32)banner_height ) return; - - dstData = info.lfbPtr; - dstData = (FxU16*)( ((char*)dstData) + - (info.strideInBytes*((scrHeight-1)-banner_height)) + - ((scrWidth-banner_width)<<1) ); - dstJump = ((info.strideInBytes >> 1) - banner_width); - srcData = (FxU16*)&banner_data[banner_width*(banner_height-1)]; - srcScanlineLength = banner_width; - srcJump = (-banner_width)*2; - - for( scanline = 0; scanline < (FxU32)banner_height; scanline++ ) { - FxU16 *end = srcData + srcScanlineLength; - while( srcData < end ) { - if ( *srcData ) - *dstData = *srcData; - dstData++; - srcData++; - } - dstData += dstJump; - srcData += srcJump; - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - } - -#else -# error "Shameless Plug Unimplemented on this Hardware" -#endif - - - GR_END(); -#endif -} /* _grShamelessPlug */ diff --git a/glide2x/sst1/glide/src/gdraw.c b/glide2x/sst1/glide/src/gdraw.c deleted file mode 100644 index 2761282..0000000 --- a/glide2x/sst1/glide/src/gdraw.c +++ /dev/null @@ -1,528 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 31 6/02/98 8:03p Peter -** Mmmmm.... points - * - * 30 9/07/97 1:52p Atai - * performance tuning for previous check-in - * - * 29 9/05/97 7:20p Atai - * fixed bug 764 (grDrawPoint integer snapping). - * - * 28 6/20/97 5:51p Dow - * Moved grDebugGroupWriteHEader to sst96.c - * - * 27 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 26 5/27/97 2:00p Dow - * Parenthesized a ternary op in GR_BEGIN to work around a Watcom compiler - * bug. - * - * 25 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 24 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 23 2/18/97 9:51a Jdt - * Ifdefed out some if(0) code to supress watcom warnings - * - * 22 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 21 11/18/96 12:13p Jdt - * Made all debugging code go through the C-call to the assembly trisetup - * code. - * - * 20 11/14/96 11:52p Jdt - * Fixed Watcom Assembly calling bug -** -*/ -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include - -#define SST_XY_HALF ( 1 << ( SST_XY_FRACBITS - 1 ) ) -#define SST_XY_ONE ( 1 << SST_XY_FRACBITS ) - -#define OUTBOUNDSX(a) ((a->x < 0.f ? 1 : 0) || (a->x > gc->state.screen_width ? 1 : 0)) -#define OUTBOUNDSY(a) ((a->y < 0.f ? 1 : 0) || (a->y > gc->state.screen_height ? 1 : 0)) -#define OUTBOUNDS(a) (OUTBOUNDSX(a) || OUTBOUNDSY(a)) - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - -/*--------------------------------------------------------------------------- - NOTE: by Gary Tarolli - - The following code is very carefully scheduled for MSVC4.2 Version 10.20.6166 - The trick is to schedule operations between PCI writes (GR_SET*). - This is because PCI writes cannot get off the CPU chip quickly and there - are about 6-12 dead clocks between back-to-back writes (P-90 to P-166). - So we try to do useful work during this time - this makes the code hard to - read because simple operations like mem++ may be broken up into three lines - of C code to perform, to allow the compiler to move the pieces around more. - PLEASE PLEASE PLEASE don't touch this code without benchmarkng it before - and after you touch it. Moving a line of code up/down changes performance! - ---------------------------------------------------------------------------*/ - - -/*--------------------------------------------------------------------------- -** grDrawPoint -*/ - -GR_ENTRY(grDrawPoint, void, ( const GrVertex *p )) -{ - int i, x,y; - struct dataList_s *dlp; - - /* GMT: gross overestimate of fifo requirements */ - GR_BEGIN("grDrawPoint",90,_GlideRoot.curTriSize); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",p));\ - - /* we snap to an integer by adding a large enough number that it - * shoves all fraction bits off the right side of the mantissa. - * - * NB: IEEE rounds to nearest integer by default, but applications - * can change the rounding mode so that it is difficult to get the - * correct truncation/ceiling operation w/ a simple adjustment to - * the bias. - * - * NB: The constant kNumMantissaBits defines how many bits of - * integer precision a coordinate can have. This needs to be atleast - * as large as the maximum hw screen resolution. We later use this - * to compute a logical 1/2 value to fill an entire pixel. - */ -#define kNumMantissaBits 18UL - { - const float bias = (const float)(3UL << kNumMantissaBits); - - /* Convert to 32-bit representation */ -#define FP_TRUNC_BIAS(__fpVal, __fpBias) \ - ((__fpVal) < (__fpBias) ? (float)((__fpVal) + (__fpBias)) : (__fpVal)) - _GlideRoot.pool.ftemp1 = FP_TRUNC_BIAS(p->x, bias); - _GlideRoot.pool.ftemp2 = FP_TRUNC_BIAS(p->y, bias); - - /* Mask off the real fractional bits from the mantissa */ - x = ((*(FxU32*)&_GlideRoot.pool.ftemp1 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (21UL - kNumMantissaBits))); - y = ((*(FxU32*)&_GlideRoot.pool.ftemp2 & (0xFFFFFFFFUL << (22UL - kNumMantissaBits))) + - (0x01UL << (21UL - kNumMantissaBits))); - } - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - _GlideRoot.stats.pointsDrawn++; - - /* draw a little triangle, with the lower left corner at pixel center */ - GR_SET( hw->vA.x, x ); - GR_SET( hw->vA.y, y ); - - x += (0x01UL << (21UL - kNumMantissaBits)); - GR_SET( hw->vB.x, x ); - GR_SET( hw->vB.y, y ); - - y += (0x01UL << (21UL - kNumMantissaBits)); - GR_SET( hw->vC.y, y ); - GR_SET( hw->vC.x, x ); - - /* we don't care what the slopes are because the pixel center that is drawn */ - /* is exactly at vertex A - isn't that wonderful */ - dlp = gc->dataList; - i = dlp->i; - while (i) { - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( *dlp->addr, 0.0F ); - if (i & 2) P6FENCE; - } - else - GR_SETF( *dlp->addr, FARRAY(p,i) ); - dlp++; - i = dlp->i; - } - P6FENCE_CMD( GR_SET( hw->triangleCMD, 0x0000001UL) ); - - GR_END_SLOPPY(); -} /* grDrawPoint */ - -/*--------------------------------------------------------------------------- -** grDrawLine -** -** NOTE: 1. this will not fill the last pixel in line because -** B2 or C is on the right edge and the right edge is not -** drawn. -** (0,0) -** -** A(x1,y1-0.5)+ -** | \ -** | \ \ -** (x1,y1)* \ -** | * \ -** | *\ \ -** B1(x1,y1+0.5)+ * \ -** \ \ * +B2(x2,y2-0.5) -** \ * | -** \ \ * | -** \ \ + (x2,y2) -** \ | -** \ | -** +C(x2,y2+0.5) -*/ - -GR_ENTRY(grDrawLine, void, ( const GrVertex *a, const GrVertex *b )) -{ - float m, dp; - #define DX _GlideRoot.pool.ftemp1 - #define ADY _GlideRoot.pool.ftemp2 - - int i,j; - float *fp; - struct dataList_s *dlp; - - - GR_BEGIN("grDrawLine",91,12+ _GlideRoot.curTriSize); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x)\n",a,b)); - -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - /* - ** compute absolute deltas and draw from low Y to high Y - */ - ADY = b->y - a->y; - i = *(long *)&ADY; - if ( i < 0 ) { - const GrVertex *tv; - tv = a; a = b; b = tv; - i ^= 0x80000000; /* ady = -ady; */ - (*(long *)&ADY) = i; - } - - DX = b->x - a->x; - j = *(long *)&DX; - if (j < 0 ) { - j ^= 0x80000000; /* adx = -adx; */ - } - - /* - ** X major line - */ - if (j >= i ) { /* if (adx > ady) */ - if (j == 0) goto all_done; /* check for zero-length lines */ - /* start up divide and overlap with as much integer stuff as possible*/ - m = _GlideRoot.pool.f1 / DX; - dlp = gc->dataList; - GR_SETF(hw->FvA.x,a->x); - dp = b->x; - GR_SETF(hw->FvB.x,dp); - GR_SETF(hw->FvC.x,dp) - _GlideRoot.stats.linesDrawn++; - - GR_SETF(hw->FvA.y,a->y - _GlideRoot.pool.fHalf); - - dp = b->y; - GR_SETF(hw->FvB.y,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(hw->FvC.y,dp + _GlideRoot.pool.fHalf); - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(a,i); - GR_SETF( fp[0], dp ); - dp = FARRAY(b,i) - dp; - GR_SETF( fp[DPDX_OFFSET>>2] , dp * m ); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , _GlideRoot.pool.f0 ); - } - } - P6FENCE_CMD( GR_SETF(hw->FtriangleCMD,_GlideRoot.pool.ftemp1) ); - - GR_SETF(hw->FvB.x,a->x); - GR_SETF(hw->FvB.y,a->y + _GlideRoot.pool.fHalf); - P6FENCE_CMD( GR_SETF(hw->FtriangleCMD,-_GlideRoot.pool.ftemp1)); - } - - /* - ** Y major line - */ - else { - m = _GlideRoot.pool.f1 / ADY; - dlp = gc->dataList; - GR_SETF(hw->FvA.y,a->y); - dp = b->y; - GR_SETF(hw->FvB.y,dp); - _GlideRoot.stats.linesDrawn++; - GR_SETF(hw->FvC.y,dp); - - GR_SETF(hw->FvA.x,a->x - _GlideRoot.pool.fHalf); - - dp = b->x; - GR_SETF(hw->FvB.x,dp - _GlideRoot.pool.fHalf); - - i = dlp->i; - GR_SETF(hw->FvC.x,dp + _GlideRoot.pool.fHalf); - - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0f ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - dp = FARRAY(a,i); - GR_SETF( fp[0], dp ); - dp = FARRAY(b,i) - dp; - GR_SETF( fp[DPDX_OFFSET>>2] , _GlideRoot.pool.f0 ); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dp * m ); - } - } - P6FENCE_CMD( GR_SET( hw->triangleCMD, 0xFFFFFFFF) ); - - GR_SETF(hw->FvB.x,a->x + _GlideRoot.pool.fHalf); - GR_SETF(hw->FvB.y,a->y); - P6FENCE_CMD( GR_SET( hw->triangleCMD, 1) ); - } - - GR_END_SLOPPY(); - return; - -all_done: /* come here on degenerate lines */ - _GlideRoot.stats.linesDrawn++; - GR_END_SLOPPY(); -} /* grDrawLine */ - -/*--------------------------------------------------------------------------- -** grDrawTriangle -*/ - -#if !defined(__linux__) || defined(GLIDE_USE_C_TRISETUP) || defined(GLIDE_DEBUG) -GR_ENTRY(grDrawTriangle, void, ( const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ -#if defined(GLIDE_USE_C_TRISETUP) || defined( __WATCOMC__ ) || defined( GLIDE_DEBUG ) - GR_BEGIN_NOFIFOCHECK("grDrawTriangle",92); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c)); - GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed"); - - /* Silly warning killer */ - if ( 0 ) goto all_done; - -#ifdef GLIDE_DEBUG -#if 0 -if (0) { /* GMT: only use this if needed */ - FxU32 statBits; /* bits we care about in status register */ - FxU32 status; - - status = GR_GET(hw->status); - if ((statBits = status & SST_FIFOLEVEL) < _GlideRoot.stats.minPciFIFOFree) - _GlideRoot.stats.minPciFIFOFree = statBits; - - statBits = (status >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff; - if (statBits < _GlideRoot.stats.minMemFIFOFree) - _GlideRoot.stats.minMemFIFOFree = statBits; -} -#endif - - if (_GlideRoot.environment.triBoundsCheck) { - if (OUTBOUNDS(a) || OUTBOUNDS(b) || OUTBOUNDS(c)) { - GDBG_PRINTF(("Triangle out of bounds:\n")); - GDBG_PRINTF(("a->x = %3.2f, a->y = %3.2f\n", a->x, a->y)); - GDBG_PRINTF(("b->x = %3.2f, b->y = %3.2f\n", b->x, b->y)); - GDBG_PRINTF(("c->x = %3.2f, c->y = %3.2f\n", c->x, c->y)); - GDBG_PRINTF(("Culling triangle based on these bogus values.\n")); - goto all_done; - } - } -#endif /* GLIDE_DEBUG */ - - /* _trisetup and _trisetup_asm return 0 if culled, 1 if drawn */ - TRISETUP( a, b, c ); - -all_done: - GR_END(); -#else -#if defined( __linux__ ) - asm("jmp grDrawTriangle_asm"); -#endif -# if defined( __MSC__ ) - extern void grDrawTriangle_asm(void); - {_asm jmp grDrawTriangle_asm} -# endif -#endif -} /* grDrawTriangle */ -#endif - -/*--------------------------------------------------------------------------- -** grDrawPlanarPolygon -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPlanarPolygon, void, ( int nverts, const int ilist[], const GrVertex vlist[] )) -{ -#if 1 - int n,i = nverts-2; - const GrVertex *firstv = &vlist[ilist[0]]; - - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygon",93); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - GR_CHECK_F(myName, !ilist || !vlist, "NULL pointer passed"); - - for ( i = 1; i < nverts - 1; i++ ) { - n = TRISETUP( firstv, &vlist[ilist[i]], &vlist[ilist[i+1]] ); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for ( i = i+1; i < nverts - 1; i++ ) { - _trisetup_nogradients( firstv, &vlist[ilist[i]], &vlist[ilist[i+1]] ); - } - -all_done: - GR_END(); -#else - grDrawPolygon(nverts, ilist, vlist); -#endif -} /* grDrawPlanarPolygon */ - -/*--------------------------------------------------------------------------- -** grDrawPlanarPolygonVertexList -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPlanarPolygonVertexList, void, ( int nverts, const GrVertex vlist[] )) -{ -#if 1 - int n,i = nverts-2; - const GrVertex *firstv = &vlist[0]; - - GR_BEGIN_NOFIFOCHECK("grDrawPlanarPolygonVertexList",93); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x)\n",nverts,vlist)); - GR_CHECK_F(myName, !vlist, "NULL pointer passed"); - - for ( i = 1; i < nverts - 1; i++ ) { - n = TRISETUP( firstv, &vlist[i], &vlist[i+1] ); - if (n > 0) break; /* stop after 1st non-zero-area triangle */ - if (n < 0) goto all_done; - } - /* now all the gradients are loaded into the chip, so we just have to */ - /* draw all the rest of the triangles */ - for ( i = i+1; i < nverts - 1; i++ ) { - _trisetup_nogradients( firstv, &vlist[i], &vlist[i+1] ); - } - -all_done: - GR_END(); -#else - grDrawPolygonVertexList(nverts, vlist); -#endif -} /* grDrawPlanarPolygonVertexList */ - -/*--------------------------------------------------------------------------- -** grDrawPolygon -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPolygon, void, ( int nverts, const int ilist[], const GrVertex vlist[] )) -{ - int i; - - GDBG_INFO((93,"grDrawPolygon(%d,0x%x,0x%x)\n",nverts,ilist,vlist)); - for ( i = 1; i < nverts - 1; i++ ) { - grDrawTriangle( &vlist[ilist[0]], &vlist[ilist[i]], &vlist[ilist[i+1]] ); - } -} /* grDrawPolygon */ - -/*--------------------------------------------------------------------------- -** grDrawPolygonVertexList -** -** Brute force "triangle-fan" implementation of a convex polygon drawer. -*/ - -GR_ENTRY(grDrawPolygonVertexList, void, ( int nverts, const GrVertex vlist[] )) -{ - int i; - - GDBG_INFO((93,"grDrawPolygonVertexList(%d,0x%x)\n",nverts,vlist)); - for ( i = 1; i < nverts - 1; i++ ) { - grDrawTriangle( &vlist[0], &vlist[i], &vlist[i+1] ); - } -} /* grDrawPolygonVertexList */ - -/*--------------------------------------------------------------------------- -** _grColorCombineDelta0Mode -** -** GMT: when we are in delta0 mode, color comes from the RGB iterators -** but the slopes are 0.0. So when we enter delta0 mode we set -** the iterators up and then we leave them alone during primitive -** rendering -*/ - -GR_DDFUNC(_grColorCombineDelta0Mode, void, ( FxBool delta0mode )) -{ - GR_BEGIN("_grColorCombineDelta0Mode",85,(delta0mode ? 9*4 : 0)); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",delta0mode)); - - if ( delta0mode ) { - GR_SETF( hw->Fr, gc->state.r ); - GR_SETF( hw->Fg, gc->state.g ); - GR_SETF( hw->Fb, gc->state.b ); - GR_SET( hw->drdx, 0); - GR_SET( hw->drdy, 0); - GR_SET( hw->dgdx, 0); - GR_SET( hw->dgdy, 0); - GR_SET( hw->dbdx, 0); - GR_SET( hw->dbdy, 0); - } - - gc->state.cc_delta0mode = delta0mode; - GR_END(); - -} /* _grColorCombineDeltaMode */ - diff --git a/glide2x/sst1/glide/src/gerror.c b/glide2x/sst1/glide/src/gerror.c deleted file mode 100644 index 246f80c..0000000 --- a/glide2x/sst1/glide/src/gerror.c +++ /dev/null @@ -1,161 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Header$ -** $Log$ - * - * 10 6/03/97 11:57p Pgj - * fix bug 558 - * - * 9 5/28/97 2:10p Dow - * Some mode setting, other cleanup - * - * 8 5/27/97 2:02p Dow - * added _grAssert - * - * 7 5/20/97 9:47a Pgj - * Use OutputDebugString for non-fatal errors under windows - * - * 6 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 5 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 4 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include - -#ifdef __WIN32__ -# include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if(GLIDE_PLATFORM & GLIDE_OS_DOS32) -# include -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) -# include -# include -#endif -#endif - -void (*GrErrorCallback)( const char *string, FxBool fatal ); - -void _doGrErrorCallback( const char *name, const char *msg, FxBool fatal ) -{ - char buf[1024]; - sprintf(buf,"%s: %s.\n", name, msg); - GrErrorCallback(buf,fatal); -} - -GR_DIENTRY(grErrorSetCallback, void, - ( void (*function) ( const char *string, FxBool fatal ) )) -{ - GDBG_INFO((80,"grErrorSetCallback(0x%x)",function)); - GrErrorCallback = function; -} - -#ifdef __WIN32__ -void -_grErrorWindowsCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) - { - GDBG_ERROR("glide",s); - MessageBox(NULL, s, NULL, MB_OK); - grSstWinClose(); - grGlideShutdown(); - exit(1); - } else { - OutputDebugString(s); - } -} -#endif - -void -_grErrorDefaultCallback( const char *s, FxBool fatal ) -{ - if ( fatal ) - { - grSstWinClose(); - grGlideShutdown(); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) && (GLIDE_PLATFORM & GLIDE_OS_DOS32) - { - /* Set Mode 3 before going */ - union REGS - inR, outR; - - inR.w.ax = 0x0003; - int386(0x10, &inR, &outR); - - } -#endif -#ifdef GDBG_INFO_ON - GDBG_ERROR("glide", s); - GDBG_PRINTF((s)); -#else - puts( s ); -#endif - exit( 1 ); - } - else - { -#ifdef GDBG_INFO_ON - GDBG_PRINTF((s)); -#else - puts( s ); -#endif - } -} - -#ifdef __DOS__ -int _guHeapCheck( void ) -{ - int i = _heapchk(); - - if ( i != _HEAPOK ) - printf( "heapchk: %d\n", i ); - - return ( i == 0 ); -} -#endif - -void -_grAssert(char *exp, char *fileName, int lineNo) -{ - initRestoreVideo(); - - GDBG_PRINTF(("ASSERTION FAILED:\n")); - GDBG_PRINTF(("\tExpression: %s\n", exp)); - GDBG_PRINTF(("\tFile: %s\n", fileName)); - GDBG_PRINTF(("\tLine: %d\n", lineNo)); - GDBG_PRINTF(("ABNORMAL TERMINATION\n")); - - exit(-1); - -} /* _grAssert */ diff --git a/glide2x/sst1/glide/src/gglide.c b/glide2x/sst1/glide/src/gglide.c deleted file mode 100644 index e2baa38..0000000 --- a/glide2x/sst1/glide/src/gglide.c +++ /dev/null @@ -1,2089 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 78 1/21/98 2:25p Peter -** fixed assertion muckage - * - * 77 1/12/98 10:25p Dow - * H3D Stereo Support - * - * 76 1/07/98 9:58a Jdt - * Include Z in datalist for GR_COMBINE_LOCAL_DEPTH...Fixes Bug 1084 - * - * 75 12/19/97 8:09a Peter - * fog table propogation - * - * 74 9/24/97 7:02p Atai - * 1. use initStatus() instead of grSstStatus() in grBufferNumPending - * 2. add one p6 nudge code in grBufferSwap() - * - * 73 9/07/97 12:14p Pgj - * fix bug 660 - * - * 72 9/05/97 4:46p Peter - * fixed fifo silliness, sorry - * - * 71 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 70 8/17/97 10:04p Pgj - * Fix bug 735 - * - * 69 8/01/97 11:48a Dow - * Added a size check for debugging - * - * 68 7/20/97 2:05p Dow - * Hopefully worked around VSYNC bug - * - * 67 7/18/97 6:48p Jdt - * grGlideShutdown now unsets _GlideRoot.initialized, further open/close - * symmetry fix - * - * 66 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 65 7/04/97 12:08p Dow - * Separated SST96 & SST1 versions of grRebuildDataList, fixed chip field - * muckage - * - * 64 6/30/97 6:43p Dow - * Added more blank lines - * - * 63 6/29/97 11:47p Jdt - * Adjustments for triangle optimization - * - * 62 6/29/97 1:58p Dow - * Fixed busted ifdef - * - * 61 6/26/97 3:09p Dow - * protected P6 stuff - * - * 60 6/20/97 5:52p Dow - * Changes to make chip field work - * - * 59 6/19/97 7:35p Dow - * More P6 Stuff - * - * 58 6/18/97 6:08p Dow - * Fixed bogus call to gdbg_error - * - * 57 6/18/97 5:54p Dow - * P6 adjustments - * - * 56 6/12/97 5:19p Pgj - * Fix bug 578 - * - * 55 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 54 5/22/97 2:18p Pgj - * maxx --> maxy - * - * 53 5/11/97 11:27p Pgj - * bug report 1152 - * - * 52 5/04/97 12:47p Dow - * Moved ClipWindow sanity check to internal routine as grSstControl needs - * it. - * - * 51 5/02/97 2:09p Pgj - * grClipWindow sanity checks coords (intersect w/screen rect) - * - * 50 3/24/97 2:00p Dow - * Fixed some chip field problems - * - * 49 3/22/97 7:04p Dow - * Fixed chip field - * - * 48 3/21/97 12:58p Dow - * Fixed error for SST1 - * - * 47 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 46 3/19/97 10:42p Dow - * Dither subtraction sense, windowsInit - * - * 45 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 44 3/17/97 6:26a Jdt - * Re-worked grGlideShutdown() - * - * 43 3/07/97 2:51p Jdt - * Fix for SST96 register offsets. - * - * 42 3/07/97 2:29p Dow - * Maybe fixed lines - * - * 41 3/05/97 1:07p Dow - * Clipping and origin changes for SST98 - * - * 40 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 39 3/01/97 2:48p Dow - * Moved buffer swap count increment so that it works for both VG & VR - * - * 38 2/26/97 11:56a Jdt - * Updated lfb api, fixed swapping - * - * 37 2/18/97 9:51a Jdt - * Removed a bunch of warnings, no functional changes. - * - * 36 2/12/97 10:39p Hanson - * - * 35 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 34 1/14/97 10:45a Dow - * Added check for pending swaps to grBufferSwap for VG96 - * Modified grBufferNumPending to work with VG96 - * - * 33 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 32 11/17/96 11:16p Garymct - * Updated grSplash code to set all of the necessary state itself rather - * than expecting the caller to do so. - * - * 31 11/18/96 1:37a Tarolli - * fixed grAlphaBlendFunction warning bug - * - * 29 11/15/96 3:40p Jdt - * Fixed SST-96 build. - * - * 28 11/15/96 3:24p Tarolli - * renamed version.h to rcver.h , added some alpha blend function - * checking -** -*/ - -#include -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "fxinline.h" - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#include "rcver.h" -static char glideIdent[] = "@#%" VERSIONSTR ; - -/*--------------------------------------------------------------------------- -** grAlphaBlendFunction -** -** GMT: BUG if grColorMask() turns off alphaplanes then destination alpha -** blending wont work! -*/ - -GR_ENTRY(grAlphaBlendFunction, void, ( GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaBlendFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d)\n",rgb_sf,rgb_df,alpha_sf,alpha_df)); - - /* Watcom warning suppressor */ - glideIdent[0] = glideIdent[0]; - - alphamode = gc->state.fbi_config.alphaMode; - if (alpha_sf != GR_BLEND_ONE && alpha_sf != GR_BLEND_ZERO) { - // GR_CHECK_W(myName, 1, "unsupported alpha source blend function"); - alpha_sf = GR_BLEND_ONE; - } - if (alpha_df != GR_BLEND_ONE && alpha_df != GR_BLEND_ZERO) { - // GR_CHECK_W(myName, 1, "unsupported alpha destination blend function"); - alpha_df = GR_BLEND_ZERO; - } - if ( rgb_sf == GR_BLEND_ONE && rgb_df == GR_BLEND_ZERO && - alpha_sf == GR_BLEND_ONE && alpha_df == GR_BLEND_ZERO ) - alphamode &= ~SST_ENALPHABLEND; - else - alphamode |= SST_ENALPHABLEND; - - alphamode &= ~( SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT ); - - alphamode |= ( ( ( FxU32 ) rgb_sf ) << SST_RGBSRCFACT_SHIFT ) | - ( ( ( FxU32 ) rgb_df ) << SST_RGBDSTFACT_SHIFT ) | - ( ( ( FxU32 ) alpha_sf ) << SST_ASRCFACT_SHIFT ) | - ( ( ( FxU32 ) alpha_df ) << SST_ADSTFACT_SHIFT ); - - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaBlendFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaCombine -*/ -GR_ENTRY(grAlphaCombine, void, (GrCombineFunction_t function, GrCombineFactor_t factor, GrCombineLocal_t local, GrCombineOther_t other, FxBool invert )) -{ - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN("grAlphaCombine",85,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert)); - GR_CHECK_W(myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported alpha combine function"); - GR_CHECK_W(myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported alpha combine scale factor"); - - GR_CHECK_W(myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported alpha combine local color"); - GR_CHECK_W(myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported alpha combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~( SST_ENTEXTUREMAP | - SST_ASELECT | - SST_ALOCALSELECT | - SST_CCA_ZERO_OTHER | - SST_CCA_SUB_CLOCAL | - SST_CCA_MSELECT | - SST_CCA_REVERSE_BLEND | - SST_CCA_ADD_CLOCAL | - SST_CCA_ADD_ALOCAL | - SST_CCA_INVERT_OUTPUT ); - - /* setup reverse blending first, then strip off the the high bit */ - if ( (factor & 0x8) == 0 ) - fbzColorPath |= SST_CCA_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.ac_requires_texture = ( factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA ) | - ( other == GR_COMBINE_OTHER_TEXTURE ); - gc->state.ac_requires_it_alpha = ( local == GR_COMBINE_LOCAL_ITERATED ) | - ( other == GR_COMBINE_OTHER_ITERATED ); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CCA_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_ALOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_ASELECT_SHIFT; - - - /* setup invert output bits */ - if ( invert ) - fbzColorPath |= SST_CCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch ( function ) { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CCA_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CCA_ZERO_OTHER | SST_CCA_SUB_CLOCAL | SST_CCA_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if ( gc->state.cc_requires_texture || gc->state.ac_requires_texture ) - fbzColorPath |= SST_ENTEXTUREMAP; - - /* transition into/out of texturing ... add nopCMD */ - if(oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)) - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - GR_END_SLOPPY(); -} /* grAlphaCombine */ - -/*--------------------------------------------------------------------------- -** grAlphaControlsITRGBLighting -** -** Determines whether the LSB of alpha controls what lighting is used-- -** Specifically whether grConstantColorValu or the interated RGB values are used -** during TEXTURE_TIMES_itrgb & TEXTURE_TIMES_ITRGB_DELTA0 color combine modes. -** -*/ - -GR_ENTRY(grAlphaControlsITRGBLighting, void, (FxBool enable)) -{ - FxU32 fbzColorPath; - - GR_BEGIN("grAlphaControlsITRGBLighting",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",enable)); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - if ( enable ) { - fbzColorPath |= SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } else { - fbzColorPath &= ~SST_LOCALSELECT_OVERRIDE_WITH_ATEX; - } - - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - GR_END(); -} /* grAlphaControlsITRGBLighting() */ - -/*--------------------------------------------------------------------------- -** grAlphaTestFunction -*/ - -GR_ENTRY(grAlphaTestFunction, void, ( GrCmpFnc_t fnc )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaTestFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",fnc)); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~(SST_ALPHAFUNC | SST_ENALPHAFUNC); - if ( fnc != GR_CMP_ALWAYS ) - alphamode |= ( ( fnc << SST_ALPHAFUNC_SHIFT ) | SST_ENALPHAFUNC ); - - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaTestFunction */ - -/*--------------------------------------------------------------------------- -** grAlphaTestReferenceValue -*/ - -GR_ENTRY(grAlphaTestReferenceValue, void, ( GrAlpha_t value )) -{ - FxU32 alphamode; - - GR_BEGIN("grAlphaTestReferenceValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",value)); - - alphamode = gc->state.fbi_config.alphaMode; - alphamode &= ~SST_ALPHAREF; - alphamode |= ( ( ( FxU32 ) value ) << SST_ALPHAREF_SHIFT ); - GR_SET( hw->alphaMode, alphamode ); - gc->state.fbi_config.alphaMode = alphamode; - GR_END(); -} /* grAlphaTestReferenceValue */ - -/*--------------------------------------------------------------------------- -** grBufferClear -*/ - -GR_ENTRY(grBufferClear, void, ( GrColor_t color, GrAlpha_t alpha, FxU16 depth )) -{ - GrColor_t oldc1; - FxU32 oldzacolor, zacolor; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_BEGIN("grBufferClear",86,44); -#else - GR_BEGIN("grBufferClear",86,24); -#endif - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x,0x%x)\n",color,alpha,depth)); - - oldc1 = gc->state.fbi_config.color1; - zacolor = oldzacolor = gc->state.fbi_config.zaColor; - - /* - ** Setup source registers - */ - if ( gc->state.fbi_config.fbzMode & SST_RGBWRMASK ) - { - _grSwizzleColor( &color ); - GR_SET( hw->c1, color ); - } - if ( ( gc->state.fbi_config.fbzMode & ( SST_ENALPHABUFFER | SST_ZAWRMASK ) ) == ( SST_ENALPHABUFFER | SST_ZAWRMASK ) ) - { - zacolor &= ~SST_ZACOLOR_ALPHA; - zacolor |= ( ( ( FxU32 ) alpha ) << SST_ZACOLOR_ALPHA_SHIFT ); - GR_SET( hw->zaColor, zacolor ); - } - if ( ( gc->state.fbi_config.fbzMode & ( SST_ENDEPTHBUFFER | SST_ZAWRMASK ) ) == ( SST_ENDEPTHBUFFER | SST_ZAWRMASK ) ) { - zacolor &= ~SST_ZACOLOR_DEPTH; - zacolor |= ( ( ( FxU32 ) depth ) << SST_ZACOLOR_DEPTH_SHIFT ); - GR_SET( hw->zaColor, zacolor ); - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* - ** On SST96, it's faster if clear the buffers separately if we need - ** to clear both of them. - */ - if ( - (gc->state.fbi_config.fbzMode & (SST_RGBWRMASK | SST_ZAWRMASK)) - == (SST_RGBWRMASK | SST_ZAWRMASK) - ) { - FxU32 fbzMode; - /* Disable ZA write and fill */ - fbzMode = gc->state.fbi_config.fbzMode & ~SST_ZAWRMASK; - GR_SET(hw->fbzMode, fbzMode); - GR_SET(hw->fastfillCMD,1); - - /* Disable RGB write mask and fill */ - fbzMode = gc->state.fbi_config.fbzMode & ~SST_RGBWRMASK; - GR_SET(hw->fbzMode, fbzMode); - GR_SET(hw->fastfillCMD,1); - - /* Restore fbzMode to previous state */ - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode); - - } else -#endif - /* - ** Execute the FASTFILL command - */ - P6FENCE_CMD( GR_SET(hw->fastfillCMD,1) ); - - - /* - ** Restore C1 and ZACOLOR - */ - GR_SET( hw->c1, oldc1 ); - GR_SET( hw->zaColor, oldzacolor ); - GR_END_SLOPPY(); -} /* grBufferClear */ - - -/*--------------------------------------------------------------------------- -** grBufferSwap -** -** NOTE: This routine should be COMPLETELY device-independant, -** but it isn't right now because we need to move all the -** code for the splash screen into the init library. -*/ - -GR_ENTRY(grBufferSwap, void, ( int swapInterval )) -{ -#define FN_NAME "grBuferSwap" - int vSync; - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#ifdef GDBG_INFO_ON - int - nTries; -#endif - - int pending; -#endif - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",swapInterval)); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FXUNUSED( vSync ); - -#ifdef GDBG_INFO_ON - nTries = 0; -#endif - - /* - * For improved speed we take the following steps - * 1. remove the status checking - * 2. modify grBufferNumPending so it does not need to do P6 nudge code - * 3. add one p6 nudge code - * Here is step 3. - * If we introduce new bugs in 2.43, please undo the above steps - */ - P6_NUDGE_OF_LOVE; - - pending = grBufferNumPending(); - - if (pending < 1 && gc->grSstRez != GR_RESOLUTION_NONE) { - GR_SET_EXPECTED_SIZE((9 << 2)); - GR_SET(hw->fbzMode, (gc->state.fbi_config.fbzMode & (~(SST_RGBWRMASK | SST_ZAWRMASK)))); - GR_SETF(hw->FvA.x, 0.f); - GR_SETF(hw->FvA.y, 0.f); - GR_SETF(hw->FvB.x, 640.f); - GR_SETF(hw->FvB.y, 0.f); - GR_SETF(hw->FvC.x, 640.f); - GR_SETF(hw->FvC.y, 480.f); - GR_SETF(hw->FtriangleCMD, 1.f); - GR_SET(hw->fbzMode, gc->state.fbi_config.fbzMode); - GR_CHECK_SIZE(); - } - - while (pending > 3) { -#ifdef GDBG_INFO_ON - GDBG_INFO((86, "%s: Checked pending %d times\n", FN_NAME, - ++nTries)); - if (nTries > 10000) - GDBG_ERROR(FN_NAME , "Exiting after %d tries for pending\n", nTries); -#endif /* GDBG_INFO_ON */ - pending = grBufferNumPending(); - } while (pending > 3); - - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) - _grShamelessPlug(); - - initSwapBuffers( swapInterval ); - -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(gc->grSstRez)) { - extern void pageflippingSwapWait(void); - do { - pending = grBufferNumPending(); - } while (pending > 0); - pageflippingSwapWait(); - } -#endif - - P6_NUDGE_OF_LOVE; - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - /* optionally display the 3Dfx powerfield logo overlay */ - if (_GlideRoot.environment.shamelessPlug) - _grShamelessPlug(); - - /* check for environmental override */ - if (_GlideRoot.environment.swapInterval >= 0) { - swapInterval = _GlideRoot.environment.swapInterval; - } - - GR_CHECK_F(myName, - ( swapInterval > 255 ) || ( swapInterval < 0 ), - "swap_interval out of range"); - - /* wait until there's 6 or fewer buffer swaps pending */ - /* the hardware counter is only 3 bits so we don't want it to overflow */ - /* also the latency gets too long */ - while (grBufferNumPending() > 6); - - /* if the interval is non-zero turn on VSYNC waiting */ - vSync = swapInterval > 0 ? 1 : 0; - - if ((swapInterval > 0) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.fbiRev == 1)) - { - /* Adjust for .6 micron FBI */ - if (swapInterval == 2) - swapInterval = 3; - else if (swapInterval != 1) - swapInterval <<= 1; - } else { - if (swapInterval > 0) swapInterval--; - } - - /* NOTE: we need a PCI read before and after the swap command */ - /* but since we already called grBufferNumPending() we've done a read */ - GR_SET_EXPECTED_SIZE(4); - P6FENCE_CMD( GR_SET(hw->swapbufferCMD, (swapInterval<<1) | vSync) ); - -#ifdef GLIDE_DEBUG - if (_GlideRoot.environment.snapshot > 0) { - static char saveDBG[GDBG_MAX_LEVELS]; - int i; - - /* turn off tracing after frame 0 and the snapshot frame */ - if (_GlideRoot.stats.bufferSwaps == 1 || - _GlideRoot.stats.bufferSwaps == _GlideRoot.environment.snapshot+1) - { - for (i=1; i> SST_SWAPBUFPENDING_SHIFT; -#elif (GLIDE_PLATFORM & GLIDE_HW_SST96) -#define SST96_SWAPPEND_SHIFT 0x4 -#define SST96_SWAPPEND_BITS (0x7 << SST96_SWAPPEND_SHIFT) - pend = ((status & SST96_SWAPPEND_BITS) >> SST96_SWAPPEND_SHIFT); -#else -# error "Implement BufferNumPending for this hardware" -#endif - - GDBG_INFO((86,"grBufferNumPending() => %d\n",pend)); - - return pend; - -} /* grBufferNumPending */ - -/*--------------------------------------------------------------------------- -** grChromakeyMode -*/ - -GR_ENTRY(grChromakeyMode, void, ( GrChromakeyMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grChromakeyMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fbzMode = gc->state.fbi_config.fbzMode; - if ( mode == GR_CHROMAKEY_ENABLE ) - fbzMode |= SST_ENCHROMAKEY; - else - fbzMode &= ~SST_ENCHROMAKEY; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grChromaKeyMode */ - -/*--------------------------------------------------------------------------- -** grChromakeyValue -*/ - -GR_ENTRY(grChromakeyValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grChromakeyValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->chromaKey, color ); - gc->state.fbi_config.chromaKey = color; - GR_END(); -} /* grChromaKeyValue */ - -/*--------------------------------------------------------------------------- -** _grClipNormalizeAndGenerateRegValues -** -** This routine normalizes clip variables to screen_width and -** screen_height, then generates the values to be written to the -** registers clipLeftRight and clipBottomTop. The reason for its -** existence is that BOTH grClipWindow() and grSstControl() need to -** write these registers. -*/ -void -_grClipNormalizeAndGenerateRegValues(FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy, FxU32 *clipLeftRight, - FxU32 *clipBottomTop) -{ -#define FN_NAME "_grClipNormalizeAndGenerateRegValues" - GR_DCL_GC; - - GDBG_INFO((41, "%s: minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy)); - - /* don't allow bogus clip coords!!! */ - if (maxx > gc->state.screen_width) maxx = gc->state.screen_width; - if (maxy > gc->state.screen_height) maxy = gc->state.screen_height; - if (minx > maxx) minx = maxx; - if (miny > maxy) miny = maxy; - - GDBG_INFO((41, "%s: normalized minx = %d, maxx = %d, miny = %d, maxy = %d\n", - FN_NAME, minx, maxx, miny, maxy)); - - *clipLeftRight = - ( minx << SST_CLIPLEFT_SHIFT ) | ( maxx << SST_CLIPRIGHT_SHIFT ); - - *clipBottomTop = - ( miny << SST_CLIPBOTTOM_SHIFT ) | ( maxy << SST_CLIPTOP_SHIFT ); - - GDBG_INFO((41, "%s: clipLeftRight = 0x%x, clipBottomTop = 0x%x\n", - FN_NAME, clipLeftRight, clipBottomTop)); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* Enable clipping */ - *clipLeftRight |= 0x80000000; -#endif -#undef FN_NAME -} /* _grClipNormalizeAndGenerateRegValues */ - -/*--------------------------------------------------------------------------- -** grClipWindow -*/ -GR_ENTRY(grClipWindow, void, ( FxU32 minx, FxU32 miny, FxU32 maxx, - FxU32 maxy )) -{ - FxU32 - clipLeftRight, /* SST Clipping Registers */ - clipBottomTop; - - GR_BEGIN("grClipWindow",41,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d %d,%d)\n",minx,miny,maxx,maxy)); - - _grClipNormalizeAndGenerateRegValues(minx, miny, maxx, maxy, - &clipLeftRight, &clipBottomTop); - - GR_SET( hw->clipLeftRight, clipLeftRight); - GR_SET( hw->clipBottomTop, clipBottomTop); - - gc->state.fbi_config.clipLeftRight = clipLeftRight; - gc->state.fbi_config.clipBottomTop = clipBottomTop; - - gc->state.clipwindowf_xmin = ( float ) minx; - gc->state.clipwindowf_xmax = ( float ) maxx; - gc->state.clipwindowf_ymin = ( float ) miny; - gc->state.clipwindowf_ymax = ( float ) maxy; - GR_END(); -} /* grClipWindow */ - -/*--------------------------------------------------------------------------- -** grColorCombine -*/ - -GR_ENTRY(grColorCombine, void, ( GrCombineFunction_t function, GrCombineFactor_t factor, GrCombineLocal_t local, GrCombineOther_t other, FxBool invert )) -{ - FxU32 fbzColorPath; - FxU32 oldTextureEnabled; - - GR_BEGIN("grColorCombine",85,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d,%d)\n",function,factor,local,other,invert)); - - GR_CHECK_W( myName, - function < GR_COMBINE_FUNCTION_ZERO || - function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported color combine function" ); - - GR_CHECK_W( myName, - (factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (factor & 0x7) > GR_COMBINE_FACTOR_TEXTURE_ALPHA || - factor > GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA, - "unsupported color combine scale factor"); - GR_CHECK_W( myName, - local < GR_COMBINE_LOCAL_ITERATED || local > GR_COMBINE_LOCAL_DEPTH, - "unsupported color combine local color"); - GR_CHECK_W( myName, - other < GR_COMBINE_OTHER_ITERATED || other > GR_COMBINE_OTHER_CONSTANT, - "unsupported color combine other color"); - - fbzColorPath = gc->state.fbi_config.fbzColorPath; - oldTextureEnabled = fbzColorPath & SST_ENTEXTUREMAP; - fbzColorPath &= ~( SST_ENTEXTUREMAP | - SST_RGBSELECT | - SST_LOCALSELECT | - SST_CC_ZERO_OTHER | - SST_CC_SUB_CLOCAL | - SST_CC_MSELECT | - SST_CC_REVERSE_BLEND | - SST_CC_ADD_CLOCAL | - SST_CC_ADD_ALOCAL | - SST_CC_INVERT_OUTPUT ); - - /* this is bogus, it should be done once, somewhere. */ - fbzColorPath |= SST_PARMADJUST; - - /* setup reverse blending first, then strip off the the high bit */ - if ( (factor & 0x8) == 0 ) - fbzColorPath |= SST_CC_REVERSE_BLEND; - factor &= 0x7; - - /* NOTE: we use boolean OR instead of logical to avoid branches */ - gc->state.cc_requires_texture = ( factor == GR_COMBINE_FACTOR_TEXTURE_ALPHA ) | - ( other == GR_COMBINE_OTHER_TEXTURE ); - gc->state.cc_requires_it_rgb = ( local == GR_COMBINE_LOCAL_ITERATED ) | - ( other == GR_COMBINE_OTHER_ITERATED ); - - /* setup scale factor bits */ - fbzColorPath |= factor << SST_CC_MSELECT_SHIFT; - - /* setup local color bits */ - fbzColorPath |= local << SST_LOCALSELECT_SHIFT; - - /* setup other color bits */ - fbzColorPath |= other << SST_RGBSELECT_SHIFT; - - /* setup invert output bits */ - if ( invert ) - fbzColorPath |= SST_CC_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - switch ( function ) - { - case GR_COMBINE_FUNCTION_ZERO: - fbzColorPath |= SST_CC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - fbzColorPath |= SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_CLOCAL; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - fbzColorPath |= SST_CC_ZERO_OTHER | SST_CC_SUB_CLOCAL | SST_CC_ADD_ALOCAL; - break; - } - - /* if either color or alpha combine requires texture then enable it */ - if ( gc->state.cc_requires_texture || gc->state.ac_requires_texture ) - fbzColorPath |= SST_ENTEXTUREMAP; - - /* if we transition into/out of texturing ... add nopCMD */ - if(oldTextureEnabled != (fbzColorPath & SST_ENTEXTUREMAP)) - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - - /* update register */ - GR_SET( hw->fbzColorPath, fbzColorPath ); - gc->state.fbi_config.fbzColorPath = fbzColorPath; - - /* setup paramIndex bits */ - _grUpdateParamIndex(); - - GR_END_SLOPPY(); -} /* grColorCombine */ - -/*--------------------------------------------------------------------------- -** grColorMask -*/ - -GR_ENTRY(grColorMask, void, ( FxBool rgb, FxBool alpha )) -{ - FxU32 fbzMode; - - GR_BEGIN("grColorMask",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x,0x%x)\n",rgb,alpha)); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_W( myName, - ( fbzMode & SST_ENDEPTHBUFFER ) && alpha, - "alpha writes enabled even though depth buffering" ); - GR_CHECK_W( myName, - (gc->state.num_buffers == 3) && alpha, - "alpha writes enabled while triple buffering" ); - - if ( rgb ) - fbzMode |= SST_RGBWRMASK; - else - fbzMode &= ~SST_RGBWRMASK; - - /* GMT: BUG leave SST_ENALPHABUFFER on if dest. alpha being used */ - /* Don't do anything if depth buffering on */ - /* XXX Should check for triple buffering too */ - - if ( !(fbzMode & SST_ENDEPTHBUFFER) && (gc->state.num_buffers != 3) ) { - if ( alpha ) - fbzMode |= SST_ENALPHABUFFER | SST_ZAWRMASK; - else - fbzMode &= ~(SST_ENALPHABUFFER | SST_ZAWRMASK); - } - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grColorMask */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue -*/ - -GR_ENTRY(grConstantColorValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grConstantColorValue",85,8); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->c0, color ); - GR_SET( hw->c1, color ); - gc->state.fbi_config.color0 = color; - gc->state.fbi_config.color1 = color; - GR_END(); -} /* grConstanColorValue */ - -/*--------------------------------------------------------------------------- -** grConstantColorValue4 -** GMT: obsolete routine -** GMT: send values to hardware immediately -*/ - -GR_ENTRY(grConstantColorValue4, void, ( float a, float r, float g, float b )) -{ - GR_BEGIN("grConstantColorValue4",85,12); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d,%d)\n",a,r,g,b)); - gc->state.a = a; - gc->state.r = r; - gc->state.g = g; - gc->state.b = b; - if ( gc->state.cc_delta0mode ) { - GR_SETF( hw->Fr, r ); - GR_SETF( hw->Fg, g ); - GR_SETF( hw->Fb, b ); - } - GR_END_SLOPPY(); -} /* grConstantColorValue4 */ - -/*--------------------------------------------------------------------------- -** grCullMode -** -** GMT: warning - gaa.c has the guts of this in-line -*/ - -GR_ENTRY(grCullMode, void, ( GrCullMode_t mode )) -{ - GR_BEGIN_NOFIFOCHECK("grCullMode",85); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - gc->state.cull_mode = mode; - GR_END(); -} /* grCullMode */ - -/*--------------------------------------------------------------------------- -** grDepthBiasLevel -** -** Sets the depth bias level. -*/ - -GR_ENTRY(grDepthBiasLevel, void, ( FxI16 level )) -{ - FxU32 zacolor; - - GR_BEGIN("grDepthBiasLevel",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",level)); - - zacolor = gc->state.fbi_config.zaColor; - zacolor = ( zacolor & ~SST_ZACOLOR_DEPTH ) | (level & SST_ZACOLOR_DEPTH); - GR_SET( hw->zaColor, zacolor ); - gc->state.fbi_config.zaColor = zacolor; - GR_END(); -} /* grDepthBiasLevel */ - -/*--------------------------------------------------------------------------- -** grDepthBufferFunction -*/ - -GR_ENTRY(grDepthBufferFunction, void, ( GrCmpFnc_t fnc )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthBufferFunction",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",fnc)); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~SST_ZFUNC; - fbzMode |= ( fnc << SST_ZFUNC_SHIFT ); - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDepthBufferFunction */ - -/*--------------------------------------------------------------------------- -** grDepthBufferMode -*/ - -GR_ENTRY(grDepthBufferMode, void, ( GrDepthBufferMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthBufferMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - /* - ** depth buffering cannot be enabled at the same time as triple buffering - */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_CHECK_F( myName, - mode != GR_DEPTHBUFFER_DISABLE && gc->state.num_buffers == 3 && gc->fbuf_size <= 2, - "cannot enable depth buffer when triple buffering" ); -#endif - /* - ** depth buffering cannot be enabled on systems running at: - ** 800x600 w/ 2MB - ** 640x480 w/ 1MB - */ - GR_CHECK_F( myName, - mode != GR_DEPTHBUFFER_DISABLE && !_grCanSupportDepthBuffer(), - "cannot enable depthbuffer with configuration" ); - - /* turn off all the bits and then turn them back on selectively */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~(SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS | SST_ZCOMPARE_TO_ZACOLOR); - - switch (mode) { - case GR_DEPTHBUFFER_DISABLE: - break; - - case GR_DEPTHBUFFER_ZBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_WBUFFER: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ENZBIAS; - break; - - case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - - case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS: - fbzMode |= SST_ENDEPTHBUFFER | SST_WBUFFER | SST_ZCOMPARE_TO_ZACOLOR; - break; - } - - /* - ** Update hardware and Glide state - */ - GR_SET( hw->fbzMode, fbzMode); - gc->state.fbi_config.fbzMode = fbzMode; - - _grUpdateParamIndex(); - GR_END(); -} /* grDepthBufferMode */ - -/*--------------------------------------------------------------------------- -** grDepthMask -*/ -GR_ENTRY(grDepthMask, void, ( FxBool enable )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDepthMask",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",enable)); - - fbzMode = gc->state.fbi_config.fbzMode; - GR_CHECK_F( myName, - enable && !_grCanSupportDepthBuffer(), - "called in a non-depthbufferable configuration" ); - - if ( enable ) - fbzMode |= SST_ZAWRMASK; - else - fbzMode &= ~SST_ZAWRMASK; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDepthMask */ - -/*--------------------------------------------------------------------------- -** grDisableAllEffects -*/ - -GR_ENTRY(grDisableAllEffects, void, ( void )) -{ - GDBG_INFO((87,"grDisableAllEffects()\n")); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grFogMode( GR_FOG_DISABLE ); -} /* grDisableAllEffects */ - -/*--------------------------------------------------------------------------- -** grDitherMode -*/ - -GR_ENTRY(grDitherMode, void, ( GrDitherMode_t mode )) -{ - FxU32 fbzMode; - - GR_BEGIN("grDitherMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fbzMode = gc->state.fbi_config.fbzMode & - ~( SST_ENDITHER | SST_DITHER2x2 | SST_ENDITHERSUBTRACT ); - - switch ( mode ) { - case GR_DITHER_DISABLE: - break; - case GR_DITHER_2x2: - fbzMode |= ( SST_ENDITHER | SST_DITHER2x2 ); - break; - case GR_DITHER_4x4: - /* test per bug 660 */ - if (_GlideRoot.environment.disableDitherSub == FXTRUE) { - fbzMode |= SST_ENDITHER; - } else { - fbzMode |= (SST_ENDITHER | SST_ENDITHERSUBTRACT); - } - break; - } - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grDitherMode */ - -/*--------------------------------------------------------------------------- -** grFogMode -*/ - -GR_ENTRY(grFogMode, void, ( GrFogMode_t mode )) -{ - FxU32 fogmode; - - GR_BEGIN("grFogMode",85,4); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mode)); - - fogmode = gc->state.fbi_config.fogMode; - fogmode &= ~( SST_ENFOGGING | SST_FOGADD | SST_FOGMULT | SST_FOG_ALPHA | SST_FOG_Z | SST_FOG_CONSTANT ); - - switch ( mode & 0xFF ) { /* switch based on lower 8 bits */ - case GR_FOG_DISABLE: - break; - case GR_FOG_WITH_ITERATED_ALPHA: - fogmode |= ( SST_ENFOGGING | SST_FOG_ALPHA ); - break; - case GR_FOG_WITH_ITERATED_Z: /* Bug 735 */ - fogmode |= ( SST_ENFOGGING | SST_FOG_Z ); - break; - case GR_FOG_WITH_TABLE: - fogmode |= ( SST_ENFOGGING ); - } - if ( mode & GR_FOG_MULT2 ) fogmode |= SST_FOGMULT; - if ( mode & GR_FOG_ADD2 ) fogmode |= SST_FOGADD; - - /* - ** Update the hardware and Glide state - */ - GR_SET( hw->fogMode, fogmode ); - gc->state.fbi_config.fogMode = fogmode; - - _grUpdateParamIndex(); - GR_END(); -} /* grFogMode */ - -/*--------------------------------------------------------------------------- -** grFogColorValue -*/ - -GR_ENTRY(grFogColorValue, void, ( GrColor_t color )) -{ - GR_BEGIN("grFogColorValue",85,4); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",color)); - - _grSwizzleColor( &color ); - GR_SET( hw->fogColor, color ); - gc->state.fbi_config.fogColor = color; - GR_END(); -} /* grFogColorValue */ - -/*--------------------------------------------------------------------------- -** grFogTable -*/ - -GR_ENTRY(grFogTable, void, ( const GrFog_t fogtable[kInternalFogTableEntryCount] )) -{ - int i, iend = kInternalFogTableEntryCount / 2 - 1; - const GrFog_t *locTable = fogtable; - - GR_BEGIN("grFogTable",85,kInternalFogTableEntryCount*2); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",fogtable)); - GR_ASSERT(fogtable != NULL); - GR_ASSERT(kInternalFogTableEntryCount == 64); - - for ( i = 0; i <= iend; i++ ) { - GrFog_t e0,e1,d0,d1; - - e0 = locTable[0]; /* lower entry */ - e1 = locTable[1]; /* upper entry */ - d0 = (e1-e0)<<2; /* del0 in .2 format */ - d1 = (i==iend) ? e1 : locTable[2]; /* don't access beyond end of table */ - d1 = (d1-e1)<<2; /* del1 in .2 format */ - - GR_SET( hw->fogTable[i], (e1<<24) | (d1<<16) | (e0<<8) | d0); - locTable += 2; - } - GR_END(); -} /* grFogTable */ - - - -/*------------------------------------------------------------------- - Function: grGlideShutdown - Date: 3/16 - Implementor(s): dow, gmt, jdt - Library: Glide - Description: - Shutdown the Glide Library. Iterate through all hardware and - call grSstWinClose(). Call InitShutdown() which unmaps all - hardware from linear memory. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grGlideShutdown, void, ( void )) -{ - _GlideRoot.windowsInit = FXFALSE; - - if ( _GlideRoot.initialized ) { - { /* GMT: reset the counter so we can proceed without assertions */ - GR_DCL_GC; - gc->counter = gc->expected_counter = 0; - } - { - int i; - GR_BEGIN_NOFIFOCHECK("grGlideShutdown",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - - for( i = 0; i < _GlideRoot.hwConfig.num_sst; i++ ) { - grSstSelect( i ); - grSstWinClose(); - } - - initClose(); - - _grDisplayStats(); - gc->grSstRez = GR_RESOLUTION_NONE; - gc->grSstRefresh = GR_REFRESH_NONE; - _GlideRoot.initialized = FXFALSE; - GR_END(); - } - } -} /* grGlideShutdown */ - -/*--------------------------------------------------------------------------- -** grGlideSetState -*/ - -GR_ENTRY(grGlideSetState, void, ( const GrState *state )) -{ - int tmu; - Sstregs *tmuregs; - - GR_BEGIN("grGlideSetState",87,(1+13+7*gc->num_tmu)*4+(gc->num_tmu+1)*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",state)); - GR_ASSERT(state != NULL); - - /* if texture mapping changed then we need to issue a NOP command*/ - if ( (gc->state.fbi_config.fbzColorPath ^ state->fbi_config.fbzColorPath) & - SST_ENTEXTUREMAP) - { - P6FENCE_CMD( GR_SET(hw->nopCMD,0) ); - } - - /* copy all the state */ - gc->state = *state; - - /* Update the hardware state from the saved state */ - GR_SET( hw->fbzColorPath, gc->state.fbi_config.fbzColorPath ); - GR_SET( hw->fogMode, gc->state.fbi_config.fogMode ); - GR_SET( hw->alphaMode, gc->state.fbi_config.alphaMode ); - GR_SET( hw->fbzMode, gc->state.fbi_config.fbzMode ); -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - GR_SET( hw->lfbMode, gc->state.fbi_config.lfbMode ); -#endif - GR_SET( hw->clipLeftRight, gc->state.fbi_config.clipLeftRight ); - GR_SET( hw->clipBottomTop, gc->state.fbi_config.clipBottomTop ); - GR_SET( hw->fogColor, gc->state.fbi_config.fogColor ); - GR_SET( hw->zaColor, gc->state.fbi_config.zaColor ); - GR_SET( hw->chromaKey, gc->state.fbi_config.chromaKey ); - GR_SET( hw->stipple, gc->state.fbi_config.stipple ); - GR_SET( hw->c0, gc->state.fbi_config.color0 ); - GR_SET( hw->c1, gc->state.fbi_config.color1 ); - - for ( tmu = 0; tmu < gc->num_tmu; tmu++ ) { - tmuregs = SST_TMU(hw,tmu); - PACKER_WORKAROUND; - GR_SET( tmuregs->textureMode, gc->state.tmu_config[tmu].textureMode ); - GR_SET( tmuregs->tLOD, gc->state.tmu_config[tmu].tLOD ); - GR_SET( tmuregs->tDetail, gc->state.tmu_config[tmu].tDetail ); - GR_SET( tmuregs->texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( tmuregs->texBaseAddr1, gc->state.tmu_config[tmu].texBaseAddr_1 ); - GR_SET( tmuregs->texBaseAddr2, gc->state.tmu_config[tmu].texBaseAddr_2 ); - GR_SET( tmuregs->texBaseAddr38, gc->state.tmu_config[tmu].texBaseAddr_3_8 ); - } - PACKER_WORKAROUND; - - /* NOTE: since glide state includes things like hints and - all cached variables like paramIndex we needn't recompute these, - BUT: we do need to rebuild stuff that depends on them!!! */ - - _grUpdateParamIndex(); - - GR_END_SLOPPY(); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - if (gc->state.fbi_config.fbzMode & SST_YORIGIN) - grSstOrigin(GR_ORIGIN_LOWER_LEFT); - else - grSstOrigin(GR_ORIGIN_UPPER_LEFT); -#endif - -} /* grGlideSetState */ - -/*--------------------------------------------------------------------------- -** grRenderBuffer -** -** Although SST1 supports triple buffering, it's a hack in the hardware, -** and the only drawbuffer modes supported by the fbzMode register are 0 -** (back) and 1 (front) -*/ - -GR_ENTRY(grRenderBuffer, void, ( GrBuffer_t buffer )) -{ - - GR_BEGIN_NOFIFOCHECK("grRenderBuffer",85); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",buffer)); - GR_CHECK_F( myName, buffer >= GR_BUFFER_AUXBUFFER, "invalid buffer" ); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - { - FxU32 fbzMode; - GR_SET_EXPECTED_SIZE( 4 ); - - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~( SST_DRAWBUFFER ); - fbzMode |= buffer == GR_BUFFER_FRONTBUFFER ? SST_DRAWBUFFER_FRONT : SST_DRAWBUFFER_BACK; - - GR_SET( hw->fbzMode, fbzMode ); - gc->state.fbi_config.fbzMode = fbzMode; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - initRenderBuffer( buffer ); -#else -# error "No renderbuffer implementation" -#endif - - GR_END(); -} /* grRenderBuffer */ - -GR_ENTRY(grCheckForRoom, void, (FxI32 n)) -{ - GR_DCL_GC; - GR_CHECK_FOR_ROOM(n); -} - -/*--------------------------------------------------------------------------- -** _grUpdateParamIndex -** -** Updates the paramIndex bits based on Glide state and the hints. -** -*/ -GR_DDFUNC(_grUpdateParamIndex, void, ( void )) -{ - GR_DCL_GC; - FxU32 paramIndex = 0; - FxU32 hints = gc->state.paramHints; - FxU32 fbzColorPath = gc->state.fbi_config.fbzColorPath; - FxU32 fogMode = gc->state.fbi_config.fogMode; - FxU32 fbzMode = gc->state.fbi_config.fbzMode; - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 gwHeaderNum = 0; - /* Set up bits for vtx a,b,c x & y */ - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] = GWH_VTX_BITS; -#endif - - /* - ** First, turn on every bit that we think we need. We can prune them - ** back later. - */ - - /* Turn on the texture bits based on what grTexCombine set */ - if (fbzColorPath & SST_ENTEXTUREMAP) { - /* No matter what, we need oow from the main grvertex structure */ - static FxU32 paramI_array[8] = { - STATE_REQUIRES_OOW_FBI, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1, - STATE_REQUIRES_OOW_FBI | STATE_REQUIRES_W_TMU2 | STATE_REQUIRES_ST_TMU2 | - STATE_REQUIRES_W_TMU0 | STATE_REQUIRES_ST_TMU0 | - STATE_REQUIRES_W_TMU1 | STATE_REQUIRES_ST_TMU1 - }; - GR_ASSERT(gc->state.tmuMask < sizeof(paramI_array)/sizeof(paramI_array[0])); - paramIndex |= paramI_array[gc->state.tmuMask]; - } - - /* See if we need iterated RGB */ - if ( gc->state.cc_requires_it_rgb && !gc->state.cc_delta0mode ) { - paramIndex |= STATE_REQUIRES_IT_DRGB; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= (GWH_RGB_BITS); -#endif - } - - /* See if we need to iterate alpha based on the value of - ac_requires_it_alpha */ - if (gc->state.ac_requires_it_alpha) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; -#endif - } - - /* See what fbzColorPath contributes - BUG 1084*/ - if ( ( fbzColorPath & SST_ALOCALSELECT ) == - ( SST_ALOCAL_Z ) ) { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } - - /* See what fbzMode contributes */ - if (fbzMode & SST_ENDEPTHBUFFER) { - if (fbzMode & SST_WBUFFER) { - paramIndex |= STATE_REQUIRES_OOW_FBI; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; -#endif - } else { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } - } - - /* See what fogMode contributes */ - if (fogMode & SST_ENFOGGING) { - if (fogMode & SST_FOG_Z) { - paramIndex |= STATE_REQUIRES_OOZ; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; -#endif - } else { - if (fogMode & SST_FOG_ALPHA) { - paramIndex |= STATE_REQUIRES_IT_ALPHA; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; -#endif - } else { - paramIndex |= STATE_REQUIRES_OOW_FBI; -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; -#endif - } - } - } - - /* - ** Now we know everything that needs to be iterated. Prune back - ** the stuff that isn't explicitly different - ** - ** NOTE: by GMT, STATE_REQUIRES_OOW_FBI is set whenever texture mapping - ** is enabled - */ - /* Turn off W for TMU0 if we don't have a hint */ - if (paramIndex & STATE_REQUIRES_W_TMU0) { - GR_ASSERT(paramIndex & STATE_REQUIRES_OOW_FBI); - if (!(hints & GR_STWHINT_W_DIFF_TMU0)) - paramIndex &= ~STATE_REQUIRES_W_TMU0; - } - - /* Turn off ST for TMU1 if TMU0 is active and TMU1 is not different */ - if (((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) == - (STATE_REQUIRES_ST_TMU0 | STATE_REQUIRES_ST_TMU1)) && - !(hints & GR_STWHINT_ST_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_ST_TMU1; - - /* Turn off W for TMU1 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU1) && !(hints & GR_STWHINT_W_DIFF_TMU1)) - paramIndex &= ~STATE_REQUIRES_W_TMU1; - -#if (GLIDE_NUM_TMU > 2) - /* Turn off ST for TMU1 if it's not different & any other is set up. */ - if ((paramIndex & (STATE_REQUIRES_ST_TMU0 | STATE_REQURES_ST_TMU1)) && - (paramIndex & STATE_REQUIRES_ST_TMU2) && - !(hints & GR_STWHINT_ST_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_ST_TMU2; - - /* Turn off W for TMU2 if we have a previous W, and don't have a hint */ - if ((paramIndex & STATE_REQUIRES_W_TMU2) && !(hints & GR_STWHINT_W_DIFF_TMU2)) - paramIndex &= ~STATE_REQUIRES_W_TMU2; -#endif - - gc->state.paramIndex = paramIndex; - - _grRebuildDataList(); - -} /* _grUpdateParamIndex */ - -#if defined(GLIDE_USE_ALT_REGMAP) - #define RED Fr_ALT - #define DRDX Fdrdx_ALT - #define DRDY Fdrdy_ALT - #define GRN Fg_ALT - #define DGDX Fdgdx_ALT - #define DGDY Fdgdy_ALT - #define BLU Fb_ALT - #define DBDX Fdbdx_ALT - #define DBDY Fdbdy_ALT - #define ALF Fa_ALT - #define DADX Fdadx_ALT - #define DADY Fdady_ALT - #define Z Fz_ALT - #define DZDX Fdzdx_ALT - #define DZDY Fdzdy_ALT - #define S Fs_ALT - #define DSDX Fdsdx_ALT - #define DSDY Fdsdy_ALT - #define T Ft_ALT - #define DTDX Fdtdx_ALT - #define DTDY Fdtdy_ALT - - #define W Fw_ALT - #define DWDX Fdwdx_ALT - #define DWDY Fdwdy_ALT -#else - - #define RED Fr - #define DRDX Fdrdx - #define DRDY Fdrdy - #define GRN Fg - #define DGDX Fdgdx - #define DGDY Fdgdy - #define BLU Fb - #define DBDX Fdbdx - #define DBDY Fdbdy - #define ALF Fa - #define DADX Fdadx - #define DADY Fdady - #define Z Fz - #define DZDX Fdzdx - #define DZDY Fdzdy - #define S Fs - #define DSDX Fdsdx - #define DSDY Fdsdy - #define T Ft - #define DTDX Fdtdx - #define DTDY Fdtdy - #define W Fw - #define DWDX Fdwdx - #define DWDY Fdwdy -#endif - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -/*--------------------------------------------------------------------------- -** _grRebuildDataList -*/ -GR_DDFUNC(_grRebuildDataList, void, ( void )) -{ - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params; - FxU32 gwHeaderNum, gwpSize; /* header + vertices */ - FxU32 i, packMask=1; - Sstregs *tmu0; - Sstregs *tmu1; - -#ifdef GDBG_INFO_ON - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif - - GDBG_INFO((80,"_grRebuildDataList() paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex)); - - curTriSize = params = 0; - i = gc->state.paramIndex; - if (_GlideRoot.CPUType == 6) packMask |= 2; - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - - /* init group write data */ - gwHeaderNum = 0; - gwpSize = 8; /* header + vertices */ - /* !!! fixme - jdt - this won't ever change, actually, but this is the safest - place I can think of to init this for now */ - gc->hwDep.sst96Dep.gwCommand = GWH_GEN_ADDRESS(&hw->FvA.x); - - /* - ((((FxU32)((FxU32) &hw->FvA.x) - (FxU32) gc->lfb_ptr) >> 2) | 0x100000 | ( 1L << (31) )); - */ - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] = 0; - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_VTX_BITS; - - if (i & STATE_REQUIRES_IT_DRGB) { - /* add 9 to size array for r,drdx,drdy,g,dgdx,dgdy,b,dbdx,dbdy */ - gc->dataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->RED; - gc->dataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->GRN; - gc->dataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&hw->BLU; - curTriSize += 3; - params += 3; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_RGB_BITS; - gwpSize += 9; - } - - if (i & STATE_REQUIRES_OOZ) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->Z; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_Z_BITS; - gwpSize += 3; - } - - if (i & STATE_REQUIRES_IT_ALPHA) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->ALF; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_A_BITS; - gwpSize += 3; - } - - /* TMU1 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->S; - gc->dataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->T; - curTriSize += 2; - params += 2; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_ST_BITS; - gwpSize += 6; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->W; - curTriSize += 1; - params += 1; - - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; - gwpSize += 3; - } - - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { - /* We do this a bit differently for grouped writes */ - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = - (float *) GWH_GEN_ADDRESS(&tmu0->FvA.x); - gc->dataList[curTriSize + 1].i = GR_VERTEX_OOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = 0L; - - if (gwpSize & 1) - ++gwpSize; /* Justify your love */ - gwpSize += 5; /* 2 header + grads */ - - ++gwHeaderNum; - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_W_BITS; - curTriSize += 2; - params += 1; - } - - gc->dataList[curTriSize++].i = 0; /* terminate the list with 0,* */ - /* followed by the FtriangleCMD reg */ - gc->dataList[curTriSize].i = packMask;/* encode P6 flag here for asm code */ - gc->dataList[curTriSize].addr = (float *)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - if (gwHeaderNum) { - if (gwpSize & 1) - ++gwpSize; /* justify your love */ - - /* If we've had a chip field change above then we need to start a - ** new packet for the triangle command, so we don't put it in the - ** original */ - gwpSize +=4; /* The triangleCMD GWP constitutes 4 DWORDS */ - } else { - gc->hwDep.sst96Dep.gwHeaders[gwHeaderNum] |= GWH_FTRIANGLECMD_BIT; - gwpSize++; /* Triangle Command */ - - if (gwpSize & 1) - ++gwpSize; /* justify the fifo */ - } - - _GlideRoot.curTriSize = gwpSize << 2; /* GR.curTriSize in bytes */ - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params<<3); - -#ifdef GDBG_INFO_ON - GDBG_INFO((282, "DataList\n")); - for (i = 0; gc->dataList[i].i; i++) { - GDBG_INFO((282," dataList[%d] = %2d 0x%x [%s]\n", - i,gc->dataList[i].i>>2,gc->dataList[i].addr, - (gc->dataList[i].i & 1) ? "packer" : p_str[gc->dataList[i].i>>2])); - } -#endif - -} /* _grRebuildDataList */ - -#else /* It's SST1 */ - -/*--------------------------------------------------------------------------- -** _grRebuildDataList -*/ -GR_DDFUNC(_grRebuildDataList, void, ( void )) -{ - GR_DCL_GC; - GR_DCL_HW; - int curTriSize, params, packerFlag; - FxU32 i, packMask=1; - Sstregs *tmu0; - Sstregs *tmu1; - -#ifdef GLIDE_DEBUG - static char *p_str[] = {"x","y","z","r","g","b","ooz","a","oow", - "s0","t0","w0","s1","t1","w1","s2","t2","w2"}; -#endif - - GDBG_INFO((80,"_grRebuildDataList() paramHints=0x%x paramIndex=0x%x\n", - gc->state.paramHints,gc->state.paramIndex)); - - curTriSize = params = 0; - i = gc->state.paramIndex; - if (_GlideRoot.CPUType == 6) packMask |= 2; -#ifdef GLIDE_USE_ALT_REGMAP - hw = SST_WRAP(hw,128); /* wrap 128-257 are alternate - register mappings */ -#endif /* GLIDE_USE_ALT_REGMAP */ - - tmu0 = SST_CHIP(hw,0xE); /* tmu 0,1,2 */ - tmu1 = SST_CHIP(hw,0xC); /* tmu 1,2 */ - - if (i & STATE_REQUIRES_IT_DRGB) { - /* add 9 to size array for r,drdx,drdy,g,dgdx,dgdy,b,dbdx,dbdy */ - gc->dataList[curTriSize + 0].i = GR_VERTEX_R_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->RED; - gc->dataList[curTriSize + 1].i = GR_VERTEX_G_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->GRN; - gc->dataList[curTriSize + 2].i = GR_VERTEX_B_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&hw->BLU; - curTriSize += 3; - params += 3; - } - - if (i & STATE_REQUIRES_OOZ) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOZ_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->Z; - curTriSize += 1; - params += 1; - } - - if (i & STATE_REQUIRES_IT_ALPHA) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_A_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->ALF; - curTriSize += 1; - params += 1; - } - - /* TMU1 --------------------------------- */ - /* always output to ALL chips, saves from having to change CHIP field */ - if (i & STATE_REQUIRES_ST_TMU0) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_SOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->S; - gc->dataList[curTriSize + 1].i = GR_VERTEX_TOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&hw->T; - curTriSize += 2; - params += 2; - } - - /* we squeeze FBI.OOW in here for sequential writes in the simple case */ - if (i & STATE_REQUIRES_OOW_FBI) { - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&hw->W; - curTriSize += 1; - params += 1; - } - /* NOTE: this is the first */ - if (i & STATE_REQUIRES_W_TMU0) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - gc->dataList[curTriSize + 1].i = GR_VERTEX_OOW_TMU0_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&tmu0->W; - curTriSize += 2; - params += 1; - } - - /* TMU1 --------------------------------- */ - if (i & STATE_REQUIRES_ST_TMU1) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - packerFlag = 0; - gc->dataList[curTriSize + 1].i = GR_VERTEX_SOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 1].addr = (float *)&tmu1->S; - gc->dataList[curTriSize + 2].i = GR_VERTEX_TOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 2].addr = (float *)&tmu1->T; - curTriSize += 3; - params += 2; - } - else packerFlag = 1; - - if (i & STATE_REQUIRES_W_TMU1) { - if (packerFlag) { - gc->dataList[curTriSize + 0].i = packMask; - gc->dataList[curTriSize + 0].addr = (float *)_GlideRoot.packerFixAddress; - curTriSize += 1; - } - gc->dataList[curTriSize + 0].i = GR_VERTEX_OOW_TMU1_OFFSET<<2; - gc->dataList[curTriSize + 0].addr = (float *)&tmu1->W; - curTriSize += 1; - params += 1; - } -#if (GLIDE_NUM_TMU > 2) - error WRITE THIS CODE; -#endif - - /* if last write was not to chip 0 */ - if ( SST_CHIP_MASK & (FxU32)gc->dataList[curTriSize-1].addr ) { - /* flag write as a packer bug fix */ - gc->dataList[curTriSize].i = packMask; - gc->dataList[curTriSize].addr = (float *)_GlideRoot.packerFixAddress; - curTriSize++; - } - - - gc->dataList[curTriSize++].i = 0; /* terminate the list with 0,* */ - /* followed by the FtriangleCMD reg */ - gc->dataList[curTriSize].i = packMask;/* encode P6 flag here for asm code */ - gc->dataList[curTriSize].addr = (float *)&hw->FtriangleCMD; - - /* 6 X,Y values plus AREA = 7, plus parameters */ - _GlideRoot.curTriSize = (6 + curTriSize + (params<<1)) <<2; - - /* Need to know tri size without gradients for planar polygons */ - _GlideRoot.curTriSizeNoGradient = _GlideRoot.curTriSize - (params<<3); - -#ifdef GLIDE_DEBUG - GDBG_INFO((282, "DataList\n")); - for (i = 0; gc->dataList[i].i; i++) { - GDBG_INFO((282," dataList[%d] = %2d 0x%x [%s]\n", - i,gc->dataList[i].i>>2,gc->dataList[i].addr, - (gc->dataList[i].i & 1) ? "packer" : - p_str[gc->dataList[i].i>>2])); - } -#endif - -} /* _grRebuildDataList */ - -#endif - -#if GLIDE_MULTIPLATFORM -/* - _grInitializeGCFuncs - initialize the gcFuncs Structure for this - device. -*/ -GR_DDFUNC(_grInitializeGCFuncs, void, (GrGC *gc)) -{ - - gc->gcFuncs._grColorCombineDelta0Mode = (void *) - GR_DDNAME(_grColorCombineDelta0Mode); - gc->gcFuncs._grRebuildDataList = (void *) GR_DDNAME(_grRebuildDataList); - gc->gcFuncs._grTexDetailControl = (void *) GR_DDNAME(_grTexDetailControl); - gc->gcFuncs._grTexDownloadNccTable = (void *) - GR_DDNAME(_grTexDownloadNccTable); - gc->gcFuncs._grTexDownloadPalette = (void *) - GR_DDNAME(_grTexDownloadPalette); - gc->gcFuncs._gumpTexCombineFunction = (void *) - GR_DDNAME(_gumpTexCombineFunction); - gc->gcFuncs._grUpdateParamIndex = (void *) - GR_DDNAME(_grUpdateParamIndex); - gc->gcFuncs._trisetup = (void *) GR_DDNAME(_trisetup); - gc->gcFuncs._trisetup_nogradients = (void *) - GR_DDNAME(_trisetup_nogradients); - gc->gcFuncs.grAADrawLine = (void *) GR_DDNAME(grAADrawLine); - gc->gcFuncs.grAADrawPoint = (void *) GR_DDNAME(grAADrawPoint); - gc->gcFuncs.grAADrawPolygon = (void *) GR_DDNAME(grAADrawPolygon); - gc->gcFuncs.grAADrawPolygonVertexList = (void *) - GR_DDNAME(grAADrawPolygonVertexList); - gc->gcFuncs.grAADrawTriangle = (void *) GR_DDNAME(grAADrawTriangle); - gc->gcFuncs.grAlphaBlendFunction = (void *) - GR_DDNAME(grAlphaBlendFunction); - gc->gcFuncs.grAlphaCombine = (void *) GR_DDNAME(grAlphaCombine); - gc->gcFuncs.grAlphaControlsITRGBLighting = (void *) - GR_DDNAME(grAlphaControlsITRGBLighting); - gc->gcFuncs.grAlphaTestFunction = (void *) - GR_DDNAME(grAlphaTestFunction); - gc->gcFuncs.grAlphaTestReferenceValue = (void *) - GR_DDNAME(grAlphaTestReferenceValue); - gc->gcFuncs.grBufferClear = (void *) GR_DDNAME(grBufferClear); - gc->gcFuncs.grBufferNumPending = (void *) - GR_DDNAME(grBufferNumPending); - gc->gcFuncs.grBufferSwap = (void *) GR_DDNAME(grBufferSwap); - gc->gcFuncs.grChromakeyMode = (void *) GR_DDNAME(grChromakeyMode); - gc->gcFuncs.grChromakeyValue = (void *) GR_DDNAME(grChromakeyValue); - gc->gcFuncs.grClipWindow = (void *) GR_DDNAME(grClipWindow); - gc->gcFuncs.grColorCombine = (void *) GR_DDNAME(grColorCombine); - gc->gcFuncs.grColorMask = (void *) GR_DDNAME(grColorMask); - gc->gcFuncs.grConstantColorValue = (void *) - GR_DDNAME(grConstantColorValue); - gc->gcFuncs.grConstantColorValue4 = (void *) - GR_DDNAME(grConstantColorValue4); - gc->gcFuncs.grCullMode = (void *) GR_DDNAME(grCullMode); - gc->gcFuncs.grDepthBiasLevel = (void *) GR_DDNAME(grDepthBiasLevel); - gc->gcFuncs.grDepthBufferFunction = (void *) - GR_DDNAME(grDepthBufferFunction); - gc->gcFuncs.grDepthBufferMode = (void *) GR_DDNAME(grDepthBufferMode); - - gc->gcFuncs.grDepthMask = (void *) GR_DDNAME(grDepthMask); - gc->gcFuncs.grDisableAllEffects = (void *) - GR_DDNAME(grDisableAllEffects); - gc->gcFuncs.grDitherMode = (void *) GR_DDNAME(grDitherMode); - gc->gcFuncs.grDrawLine = (void *) GR_DDNAME(grDrawLine); - gc->gcFuncs.grDrawPlanarPolygon = (void *) - GR_DDNAME(grDrawPlanarPolygon); - gc->gcFuncs.grDrawPlanarPolygonVertexList = (void *) - GR_DDNAME(grDrawPlanarPolygonVertexList); - gc->gcFuncs.grDrawPoint = (void *) GR_DDNAME(grDrawPoint); - gc->gcFuncs.grDrawPolygon = (void *) GR_DDNAME(grDrawPolygon); - gc->gcFuncs.grDrawPolygonVertexList = (void *) - GR_DDNAME(grDrawPolygonVertexList); - gc->gcFuncs.grDrawTriangle = (void *) GR_DDNAME(grDrawTriangle); - gc->gcFuncs.grFogColorValue = (void *) GR_DDNAME(grFogColorValue); - gc->gcFuncs.grFogMode = (void *) GR_DDNAME(grFogMode); - gc->gcFuncs.grFogTable = (void *) GR_DDNAME(grFogTable); - gc->gcFuncs.grGammaCorrectionValue = (void *) - GR_DDNAME(grGammaCorrectionValue); - gc->gcFuncs.grGlideSetState = (void *) GR_DDNAME(grGlideSetState); - gc->gcFuncs.grGlideShutdown = (void *) GR_DDNAME(grGlideShutdown); - gc->gcFuncs.grLfbConstantAlpha = (void *) - GR_DDNAME(grLfbConstantAlpha); - gc->gcFuncs.grLfbConstantDepth = (void *) - GR_DDNAME(grLfbConstantDepth); - gc->gcFuncs.grLfbLock = (void *)GR_DDNAME(grLfbLock); - gc->gcFuncs.grLfbUnlock = (void*)GR_DDNAME(grLfbUnlock); - gc->gcFuncs.grLfbWriteColorFormat = (void *) - GR_DDNAME(grLfbWriteColorFormat); - gc->gcFuncs.grLfbWriteColorSwizzle = (void *) - GR_DDNAME(grLfbWriteColorSwizzle); - gc->gcFuncs.grRenderBuffer = (void *) GR_DDNAME(grRenderBuffer); - gc->gcFuncs.grSstConfigPipeline = (void *) - GR_DDNAME(grSstConfigPipeline); - gc->gcFuncs.grSstIdle = (void *) GR_DDNAME(grSstIdle); - gc->gcFuncs.grSstIsBusy = (void *) GR_DDNAME(grSstIsBusy); - gc->gcFuncs.grSstOpen = (void *) GR_DDNAME(grSstOpen); - gc->gcFuncs.grSstOrigin = (void *) GR_DDNAME(grSstOrigin); - gc->gcFuncs.grSstPassthruMode = (void *) GR_DDNAME(grSstPassthruMode); - - gc->gcFuncs.grSstPerfStats = (void *) GR_DDNAME(grSstPerfStats); - gc->gcFuncs.grSstResetPerfStats = (void *) GR_DDNAME(grSstResetPerfStats); - gc->gcFuncs.grSstStatus = (void *) GR_DDNAME(grSstStatus); - gc->gcFuncs.grSstVRetraceOn = (void *) GR_DDNAME(grSstVRetraceOn); - gc->gcFuncs.grSstVideoLine = (void *) GR_DDNAME(grSstVideoLine); - gc->gcFuncs.grTexClampMode = (void *) GR_DDNAME(grTexClampMode); - gc->gcFuncs.grTexCombine = (void *) GR_DDNAME(grTexCombine); - gc->gcFuncs.grTexDownloadMipMapLevelPartial = (void *) - GR_DDNAME(grTexDownloadMipMapLevelPartial); - gc->gcFuncs.grTexFilterMode = (void *) GR_DDNAME(grTexFilterMode); - gc->gcFuncs.grTexLodBiasValue = (void *) GR_DDNAME(grTexLodBiasValue); - gc->gcFuncs.grTexMipMapMode = (void *) GR_DDNAME(grTexMipMapMode); - gc->gcFuncs.grTexMultibase = (void *) GR_DDNAME(grTexMultibase); - gc->gcFuncs.grTexMultibaseAddress = (void *) - GR_DDNAME(grTexMultibaseAddress); - gc->gcFuncs.grTexNCCTable = (void *) GR_DDNAME(grTexNCCTable); - gc->gcFuncs.grTexSource = (void *) GR_DDNAME(grTexSource); - gc->gcFuncs.guMPDrawTriangle = (void *) GR_DDNAME(guMPDrawTriangle); - gc->gcFuncs.guTexSource = (void *) GR_DDNAME(guTexSource); - gc->gcFuncs.ConvertAndDownloadRle=(void *) GR_DDNAME(ConvertAndDownloadRle); - gc->gcFuncs.grCheckForRoom=(void *) GR_DDNAME(grCheckForRoom); -} /* _grInitializeGCFuncs */ -#endif diff --git a/glide2x/sst1/glide/src/glfb.c b/glide2x/sst1/glide/src/glfb.c deleted file mode 100644 index 8a51b7e..0000000 --- a/glide2x/sst1/glide/src/glfb.c +++ /dev/null @@ -1,1020 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 23 6/30/97 10:51a Dow - * Changed size check in grLfbLock to warning - * - * 22 6/03/97 3:50p Pgj - * fix bugs 580 and 581 - * - * 21 5/05/97 2:25p Hanson - * Fixed unlock bug with grLfbUnlock. On Rush it would always return - * false. - * - * 20 5/02/97 9:43a Dow - * Changed indentation to match rest of file, made grLfbLock idle on Jr. - * - * 19 4/08/97 12:47p Jdt - * Bug in grLfbUnlock() - * - * 18 4/02/97 3:24a Hanson - * Fixed bug with locking read of Auxbuffer on SST1 - * - * 17 3/27/97 9:30p Hanson - * Fixed my mistake of masking out the no idle bit to late in the - * grLfbUnlock code. - * - * 16 3/26/97 5:04p Hanson - * - * 15 3/19/97 1:37a Jdt - * Added real stride computation. - * - * 14 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 13 3/13/97 1:18a Jdt - * Re-wrote grLfbWriteRegion to be faster and also be nice to the fifo. - * Added grLfbReadRegion for sli boards. Need an sli setup on whihc to - * test. - * - * 12 3/12/97 2:54p Jdt - * Fixes for vg96 - * - * 11 3/12/97 11:11a Jdt - * Fixed format bug. Fixed yorigin problem. Fixed locking bug. - * - * 10 3/06/97 9:03p Jdt - * Removed Watcom Warning. - * - * 9 3/05/97 9:35p Jdt - * Added grLfbWriteRegion - * - * 8 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 7 2/26/97 11:56a Jdt - * changed lfb api - * - * 6 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/*--------------------------------------------------------------------------- -** grLfbConstantAlpha -*/ -GR_ENTRY(grLfbConstantAlpha, void, ( GrAlpha_t alpha )) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantAlpha",82); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",alpha)); - - gc->state.lfb_constant_alpha = alpha; - GR_END(); -} /* grLfbConstantAlpha */ - -/*--------------------------------------------------------------------------- -** grLfbConstantDepth -*/ -GR_ENTRY(grLfbConstantDepth, void, ( FxU16 depth )) -{ - GR_BEGIN_NOFIFOCHECK("grLfbConstantDepth",82); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",depth)); - - gc->state.lfb_constant_depth = depth; - GR_END(); -} /* grLfbConstantDepth */ - - -/*------------------------------------------------------------------- - Function: grLfbLock - Date: 2/19 - Implementor(s): jdt - Library: Glide - Description: - Secures a pointer to a requested frame buffer and guarantees ordered - access to that buffer. - - Arguments: - type - type of lock, one of: - GR_LOCK_WRITE_ONLY - GR_LOCK_READ_ONLY - buffer - which buffer to lock, one of: - GR_BUFFER_FRONTBUFFER - GR_BUFFER_BACKBUFFER - GR_BUFFER_AUXBUFFER - writeMode - desired destination color format - origin - desired lfb origin - pixelPipeline - flag whether to process through pixpipe - info - pointer to info structure - Return: - FXTRUE - lock is successful - FXFALSE - lock fails - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbLock, FxBool,( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, GrOriginLocation_t origin, FxBool pixelPipeline, GrLfbInfo_t *info ) ) -{ - FxBool rv = FXTRUE; - FxU32 lockIdle; - - GR_BEGIN_NOFIFOCHECK("grLfbLock",82); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n", type, buffer, info)); - - GR_CHECK_F( myName, !info, - "Null info structure passed." ); - - /* changed from GR_CHECK_F to match the docuementation */ - - GR_CHECK_W(myName, (info->size != sizeof( GrLfbInfo_t )), - "Invalid size sent to grLfbLock()"); - - lockIdle = !(type & GR_LFB_NOIDLE); - type = type & ~(GR_LFB_NOIDLE); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - { - switch( type ) { - case GR_LFB_READ_ONLY: - { - FxU32 lfbMode; - - if ( gc->lockPtrs[type] != (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~( SST_LFB_READBUFSELECT | - SST_LFB_YORIGIN ); - - GR_SET_EXPECTED_SIZE( 4 ); - - /* You may not read-lock an SLI board */ - if ( (gc->scanline_interleaved == FXTRUE) && - (gc->lfbSliOk==1) ) { - GDBG_INFO((83, - "Read lock failure: read lock" - " disallowed for SLI, use " - "grLfbReadRegion()\n" )); - rv = FXFALSE; - } - - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - lfbMode |= SST_LFB_READFRONTBUFFER; - break; - case GR_BUFFER_BACKBUFFER: - lfbMode |= SST_LFB_READBACKBUFFER; - break; - case GR_BUFFER_AUXBUFFER: - lfbMode |= SST_LFB_READAUXBUFFER; - break; - default: - GR_CHECK_F( myName, - 1, - "illegal buffer parameter passed" ); - rv = FXFALSE; - break; - } - - lfbMode |= ( origin )?SST_LFB_YORIGIN:0; - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - - info->lfbPtr = gc->lfb_ptr; - info->strideInBytes = gc->fbStride * 2; - info->origin = origin; - - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - } - break; - case GR_LFB_WRITE_ONLY: - { - FxU32 lfbMode, zaColor, fbzMode; - - - if ( gc->lockPtrs[type] != (FxU32)-1 ) { - GDBG_INFO(( 83, "Write failure due to existing lock" )); - rv = FXFALSE; - } else { - GR_SET_EXPECTED_SIZE( 12 ); - - /* - ** Set up the constant depth register because it may have been - ** trashed by a call to grDepthBiasLevel (depthbiaslevel and - ** constant depth use the same register) - */ - zaColor = gc->state.fbi_config.zaColor; - zaColor = ((( FxU32 ) gc->state.lfb_constant_depth ) << SST_ZACOLOR_DEPTH_SHIFT ); - zaColor |= (gc->state.lfb_constant_alpha << SST_ZACOLOR_ALPHA_SHIFT); - GR_SET( hw->zaColor, zaColor ); - - /* - ** disable depth biasing - */ - fbzMode = gc->state.fbi_config.fbzMode; - fbzMode &= ~( SST_ENZBIAS ); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~( SST_LFB_WRITEBUFSELECT | - SST_LFB_YORIGIN | - SST_LFB_FORMAT | - SST_LFB_ENPIXPIPE ); - - switch( writeMode ) { - case GR_LFBWRITEMODE_RESERVED1: - case GR_LFBWRITEMODE_RESERVED2: - case GR_LFBWRITEMODE_RESERVED3: - case GR_LFBWRITEMODE_RESERVED4: - case GR_LFBWRITEMODE_RESERVED5: - case GR_LFBWRITEMODE_RESERVED6: - case GR_LFBWRITEMODE_RESERVED7: - rv = FXFALSE; - } - - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode == GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode == GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEBACKBUFFER; - break; - case GR_BUFFER_AUXBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_ZA16; - } else if ( writeMode != GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - lfbMode |= SST_LFB_WRITEFRONTBUFFER; - break; - default: - GR_CHECK_F( myName, - 1, - "illegal buffer parameter passed" ); - break; - } /* end switch(buffer) */ - - lfbMode |= ( writeMode << SST_LFB_FORMAT_SHIFT ); - lfbMode |= ( origin )?SST_LFB_YORIGIN:0; - - if ( pixelPipeline ) { - lfbMode |= SST_LFB_ENPIXPIPE; - fbzMode &= ~SST_YORIGIN; - fbzMode |= (origin)?SST_YORIGIN:0; - } - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - - GR_SET( hw->fbzMode, fbzMode ); - P6FENCE; /* This is required to flush the write - buffers before the actual LFB writes */ - - /* GMT: very low-risk race condition is probable here - if a direct LFB read is done aftewards, the lfbMode register might - not have settled in yet, and the pixel may be read in the wrong - mode. However, the 2 write above help reduce the chance of this. - The proper thing to do is to call grSstIdle() here, but that's - too slow. - */ - - info->lfbPtr = gc->lfb_ptr; - info->origin = origin; - info->writeMode = writeMode; - - switch( lfbMode & SST_LFB_FORMAT ) { - case SST_LFB_565: - case SST_LFB_555: - case SST_LFB_1555: - case SST_LFB_ZZ: - info->strideInBytes = gc->fbStride * 2; - break; - case SST_LFB_888: - case SST_LFB_8888: - case SST_LFB_Z565: - case SST_LFB_Z555: - case SST_LFB_Z1555: - info->strideInBytes = gc->fbStride * 4; - break; - } - - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - } - break; - default: - rv = FXFALSE; - GDBG_INFO((gc->myLevel, "Lock failed because of invalid lock type." )); - break; - } - } - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - switch( type ) { - case GR_LFB_READ_ONLY: - if ( gc->lockPtrs[type]!= (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - info->lfbPtr = initGetBufferPtr( buffer, &info->strideInBytes ); - if ( origin != GR_ORIGIN_UPPER_LEFT ) { - GDBG_INFO((gc->myLevel, - "Lock failed because of unsu" - "pported origin." )); - rv = FXFALSE; - } - info->origin = GR_ORIGIN_UPPER_LEFT; - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - } - break; - case GR_LFB_WRITE_ONLY: - if ( gc->lockPtrs[type]!= (FxU32)-1 ) { - GDBG_INFO(( 83, "Read lock failure due to existing lock" )); - rv = FXFALSE; - } else { - info->lfbPtr = initGetBufferPtr( buffer, &info->strideInBytes ); - if ( !info->lfbPtr ) { - GDBG_INFO((gc->myLevel, - "Lock failed because buffer doesn't exist" )); - rv = FXFALSE; - } - if ( origin != GR_ORIGIN_UPPER_LEFT ) { - GDBG_INFO((gc->myLevel, - "Lock failed because of unsupported origin." )); - rv = FXFALSE; - } - - /* Voodoo Rush lfb writes don't go through the pixel pipeline */ - switch( buffer ) { - case GR_BUFFER_FRONTBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode != GR_LFBWRITEMODE_565 ) { - rv = FXFALSE; - } - break; - case GR_BUFFER_BACKBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_565; - } else if ( writeMode != GR_LFBWRITEMODE_565 ) { - rv = FXFALSE; - } - break; - case GR_BUFFER_AUXBUFFER: - if (writeMode == GR_LFBWRITEMODE_ANY) { - writeMode = GR_LFBWRITEMODE_ZA16; - } else if ( writeMode != GR_LFBWRITEMODE_ZA16 ) { - rv = FXFALSE; - } - break; - default: - GR_CHECK_F( myName, 1, "illegal buffer parameter passed" ); - break; - } /* end switch(buffer) */ - - if ( pixelPipeline ) { - GDBG_INFO((gc->myLevel, - "Lock failed because pixelpipeline is not available on VG96." )); - rv = FXFALSE; - } - info->writeMode = writeMode; - info->origin = GR_ORIGIN_UPPER_LEFT; - if ( rv == FXTRUE ) - gc->lockPtrs[type] = buffer; - GDBG_INFO(( gc->myLevel, - "Write Lock Successful: ptr=0x%.08x stride=%.04d\n", - info->lfbPtr, - info->strideInBytes )); - } - break; - } /* end switch(type) */ - -#else -# error "No lfb implementation for this platform" -#endif - GR_CHECK_SIZE(); - /* We HAVE to idle on Jr., as out-of-order LFBs are unacceptable */ - if ( - lockIdle || - ( - _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == - GR_SSTTYPE_SST96 - ) - ) - grSstIdle(); - GR_RETURN( rv ); -} /* grLfbLock */ - -/*------------------------------------------------------------------- - Function: grLfbUnlock - Date: 2/21 - Implementor(s): jdt - Library: Glide - Description: - Unlock a previously locked buffer - Arguments: - type - type of lock ( read only/write only ) - buffer - which buffer to unlock - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ - -GR_ENTRY(grLfbUnlock, FxBool, ( GrLock_t type, GrBuffer_t buffer ) ) -{ - FxBool rval = FXFALSE; - - GR_BEGIN_NOFIFOCHECK("grLfbUnLock",83 ); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d)\n", type, buffer )); - - type = type & ~(GR_LFB_NOIDLE); - - GR_CHECK_F( myName, - type != GR_LFB_WRITE_ONLY && - type != GR_LFB_READ_ONLY, - "Bad type" ); - - GR_CHECK_F( myName, - buffer != GR_BUFFER_FRONTBUFFER && - buffer != GR_BUFFER_BACKBUFFER && - buffer != GR_BUFFER_AUXBUFFER, - "Bad buffer" ); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( gc->lockPtrs[type] == (FxU32)buffer ) { - rval = FXTRUE; - - if ( gc->scanline_interleaved == FXTRUE ) { - GR_SET_EXPECTED_SIZE( 12 ); - } else { - GR_SET_EXPECTED_SIZE( 8 ); - } - - /* Restore depth bias level */ - GR_SET( hw->zaColor, gc->state.fbi_config.zaColor ); - - /* turn back on depth biasing */ - GR_SET( hw->fbzMode, gc->state.fbi_config.fbzMode ); - - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw->nopCMD, 0x0 ); - - gc->lockPtrs[type] = (FxU32)-1; - } else { - GDBG_INFO((gc->myLevel, "Unlock failed because there was no matching lock" )); - rval = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( gc->lockPtrs[type] == (FxU32)buffer ) { - rval = FXTRUE; - - gc->lockPtrs[type] = (FxU32)-1; - } else { - GDBG_INFO((gc->myLevel, "Unlock failed because there was no matching lock" )); - rval = FXFALSE; - } -#endif - GR_RETURN( rval ); -} /* grLfbUnlock */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorFormat -** -*/ - -GR_ENTRY(grLfbWriteColorFormat, void, (GrColorFormat_t colorFormat)) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 lfbMode; - - GR_BEGIN("grLfbWriteColorFormat",82,8); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",colorFormat)); - - GR_CHECK_F(myName, - colorFormat < 0 || colorFormat > 0x3, - "invalid color format"); - - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~SST_LFB_RGBALANES; - lfbMode |= (colorFormat << SST_LFB_RGBALANES_SHIFT); - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw-> nopCMD, 0x0 ); - GR_END_SLOPPY(); -#else - return; -#endif -} /* grLfbWriteColorFormat */ - - -/*--------------------------------------------------------------------------- -** grLfbWriteColorSwizzle - set up SST for byte swizzling and word swapping -** -** Registers/Bits Affected: -** lfbMode: bit(11), bit(12) -** -** WARNING: GMT: SST_LFB_WRITE_SWAP16 changes pixel addressing!!! -*/ - -GR_ENTRY(grLfbWriteColorSwizzle, void, (FxBool swizzleBytes, FxBool swapWords)) -{ -#if !(GLIDE_PLATFORM & GLIDE_HW_SST96) - FxU32 lfbMode; - - GR_BEGIN("grLfbWriteColorSwizzle",82,8); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d)\n",swizzleBytes,swapWords)); - - /* Clear out the bits we'll set back if appropriate */ - lfbMode = gc->state.fbi_config.lfbMode; - lfbMode &= ~(SST_LFB_WRITE_SWAP16 | SST_LFB_WRITE_BYTESWAP); - - if (swizzleBytes) - lfbMode |= SST_LFB_WRITE_BYTESWAP; - - if (swapWords) - lfbMode |= SST_LFB_WRITE_SWAP16; - - GR_SET( hw->lfbMode, lfbMode ); - gc->state.fbi_config.lfbMode = lfbMode; - if ( gc->scanline_interleaved == FXTRUE ) - GR_SET( hw-> nopCMD, 0x0 ); - GR_END_SLOPPY(); -#else - return; -#endif -} /* grLfbWriteColorSwizzle */ - -/*------------------------------------------------------------------- - Function: grLfbWriteRegion - Date: 3/5 - Implementor(s): jdt - Library: Glide - Description: - Write a pixel rectangle to the frame buffer as efficiently as possible - Arguments: - dst_buffer - buffer to which to copy data - dst_x,dst_y - destination image start coordinates - src_format - data format of source image - src_width, src_height - - dimensions of source image - src_stride - stride of source image in bytes, not meaningful - for RLE images - src_data - pointer to source data memory - Return: - FXTRUE succeed - FXFALSE fail - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbWriteRegion, FxBool, ( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data )) -{ - FxBool rv = FXTRUE; - GrLfbInfo_t info; - GrLfbWriteMode_t writeMode; - - GR_BEGIN_NOFIFOCHECK("grLfbWriteRegion",82); - GDBG_INFO_MORE((gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,%d,0x%x)\n", - dst_buffer, dst_x, dst_y, - src_format, src_width, src_height, - src_stride, src_data )); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( src_format == GR_LFB_SRC_FMT_RLE16 ) - writeMode = GR_LFBWRITEMODE_565; - else - writeMode = src_format; - - info.size = sizeof( info ); - - if ( grLfbLock( GR_LFB_WRITE_ONLY | GR_LFB_NOIDLE, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = ( FxU32 * ) src_data; - dstData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (dst_y*info.strideInBytes) ); - scanline = src_height; - - switch( src_format ) { - /* 16-bit aligned */ - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - case GR_LFB_SRC_FMT_ZA16: - dstData = (FxU32*)(((FxU16*)dstData) + dst_x); - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if ( aligned ) { - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length - 2); - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - - if ( ((int)length) & 0x2 ) { - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - } else { - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length - 2); - - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - - if ( !(length & 0x2) ) { - GR_SET16( (*(FxU16*)&(dstData[0])), - (*(FxU16*)&(srcData[0])) ); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - } - break; - /* 32-bit aligned */ - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - dstData = ((FxU32*)dstData) + dst_x; - length = src_width * 4; - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - while( scanline-- ) { - GR_SET_EXPECTED_SIZE(length); - end = (FxU32*)((char*)srcData + length); - while( srcData < end ) { - GR_SET( dstData[0], srcData[0] ); - dstData++; - srcData++; - } - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - GR_CHECK_SIZE_SLOPPY(); - } - break; - case GR_LFB_SRC_FMT_RLE16: - /* needs to be implemented */ - rv = FXFALSE; - break; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, dst_buffer ); - } else { - rv = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( src_format == GR_LFB_SRC_FMT_RLE16 ) { - rv = FXFALSE; - GR_RETURN( rv ); - } else - writeMode = src_format; - - info.size = sizeof( info ); - - if ( grLfbLock( GR_LFB_WRITE_ONLY, - dst_buffer, - writeMode, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxI32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - - srcData = ( FxU32 * ) src_data; - dstData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (dst_y*info.strideInBytes)+ - (dst_x<<1)); - scanline = src_height; - length = src_width * 2; - aligned = !((int)dstData&0x2); - srcJump = src_stride - length; - dstJump = info.strideInBytes - length; - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - *(FxU16*)dstData = *(FxU16*)srcData; - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_WRITE_ONLY, dst_buffer ); - } else { - rv = FXFALSE; - } -#else -# error "No grLfbWriteRegion Implementation for this platform" -#endif - GR_RETURN( rv ); -} /* grLfbWriteRegion */ - - -/*------------------------------------------------------------------- - Function: grLfbReadRegion - Date: 3/12 - Implementor(s): jdt - Library: Glide - Description: - Grab a rectangle from the frame buffer into user supplied memory - Arguments: - src_buffer - buffer to read from - src_x - x coordinate of upper left corner rectangle to read - src_y - y coordinate of upper left corner of rectangle to read - src_width - width of rectangle to read - src_height - height of rectangle to read - dst_stride - distance between scanlines in destination buffer - dst_data - pointer to user memory in which to place image - Return: - FXTRUE - success - FXFALSE - failure - -------------------------------------------------------------------*/ -GR_ENTRY(grLfbReadRegion, FxBool, ( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data )) -{ - FxBool rv = FXTRUE; - GrLfbInfo_t info; - - GR_BEGIN_NOFIFOCHECK("grLfbReadRegion",82); - GDBG_INFO_MORE((gc->myLevel, - "(0x%x,%d,%d,%d,%d,%d,0x%x)\n", - src_buffer, src_x, src_y, - src_width, src_height, dst_stride, dst_data )); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - gc->lfbSliOk = 1; - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - FxU32 odd; /* is src_y odd? ( for sli ) */ - - dstData = ( FxU32 * ) dst_data; - srcData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1) ); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - odd = (src_y+src_height) & 0x1; - - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - if(gc->scanline_interleaved == FXTRUE) { - if((scanline+odd) & 0x1) - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - else - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - } - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - if(gc->scanline_interleaved == FXTRUE) { - if((scanline+odd) & 0x1) - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - else - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - } - - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_READ_ONLY, src_buffer ); - if ( gc->scanline_interleaved ) - sst1InitSliPciOwner( gc->base_ptr, SST_SLI_MASTER_OWNPCI ); - } else { - rv = FXFALSE; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - info.size = sizeof( info ); - if ( grLfbLock( GR_LFB_READ_ONLY, - src_buffer, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ) { - FxU32 *srcData; /* Tracking Source Pointer */ - FxU32 *dstData; /* Tracking Destination Pointer */ - FxU32 *end; /* Demarks End of each Scanline */ - FxU32 srcJump; /* bytes to next scanline */ - FxU32 dstJump; /* bytes to next scanline */ - FxU32 length; /* bytes to copy in scanline */ - FxU32 scanline; /* scanline number */ - int aligned; /* word aligned? */ - - dstData = ( FxU32 * ) dst_data; - srcData = ( FxU32 * ) ( ((char*)info.lfbPtr)+ - (src_y*info.strideInBytes) + - (src_x<<1) ); - scanline = src_height; - length = src_width * 2; - dstJump = dst_stride - length; - srcJump = info.strideInBytes - length; - aligned = !((int)srcData&0x2); - - if ( aligned ) { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( ((int)length) & 0x2 ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } else { - while( scanline-- ) { - end = (FxU32*)((char*)srcData + length - 2); - - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - - while( srcData < end ) - *dstData++ = *srcData++; - - if ( !(((int)length) & 0x2) ) { - (*(FxU16*)dstData) = (*(FxU16*)srcData); - dstData = (FxU32*)(((FxU16*)dstData) + 1 ); - srcData = (FxU32*)(((FxU16*)srcData) + 1 ); - } - - dstData = (FxU32*)(((char*)dstData)+dstJump); - srcData = (FxU32*)(((char*)srcData)+srcJump); - } - } - grLfbUnlock( GR_LFB_READ_ONLY, src_buffer ); - } else { - rv = FXFALSE; - } -#else -# error "No grLfbReadRegion Implementation for this platform" -#endif - GR_RETURN( rv ); -}/* grLfbReadRegion */ - diff --git a/glide2x/sst1/glide/src/glide.h b/glide2x/sst1/glide/src/glide.h deleted file mode 100644 index f0ed986..0000000 --- a/glide2x/sst1/glide/src/glide.h +++ /dev/null @@ -1,1518 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - -/* -** GLIDE.H -** -** The following #defines are relevant when using Glide: -** -** One of the following "platform constants" must be defined during -** compilation: -** -** __DOS__ Defined for 32-bit DOS applications -** __WIN32__ Defined for 32-bit Windows applications -** __sparc__ Defined for Sun Solaris/SunOS -** __linux__ Defined for Linux applications -** __IRIX__ Defined for SGI Irix applications -** -*/ -#ifndef __GLIDE_H__ -#define __GLIDE_H__ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** ----------------------------------------------------------------------- -** TYPE DEFINITIONS -** ----------------------------------------------------------------------- -*/ -typedef FxU32 GrColor_t; -typedef FxU8 GrAlpha_t; -typedef FxU32 GrMipMapId_t; -typedef FxU8 GrFog_t; -typedef void (FX_CALL *GrProc)(); - -/* -** ----------------------------------------------------------------------- -** CONSTANTS AND TYPES -** ----------------------------------------------------------------------- -*/ -#define MAX_NUM_SST 4 -#define MAX_MIPMAPS_PER_SST 1024 - -#ifndef GLIDE_LIB -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#define GR_FOG_TABLE_SIZE 128 -#else /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#define GR_FOG_TABLE_SIZE 64 -#endif /* !(defined(GLIDE3) && defined(GLIDE3_ALPHA)) */ -#endif /* GLIDE_LIB */ - -#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1) -#define GR_ZDEPTHVALUE_NEAREST 0xFFFF -#define GR_ZDEPTHVALUE_FARTHEST 0x0000 -#define GR_WDEPTHVALUE_NEAREST 0x0000 -#define GR_WDEPTHVALUE_FARTHEST 0xFFFF - -#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0) -#define GR_MIPMAPLEVELMASK_ODD FXBIT(1) -#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD ) - -#define GR_LODBIAS_BILINEAR 0.5 -#define GR_LODBIAS_TRILINEAR 0.0 - -typedef FxI32 GrChipID_t; -#define GR_TMU0 0x0 -#define GR_TMU1 0x1 -#define GR_TMU2 0x2 -#define GR_FBI 0x3 - -typedef FxI32 GrCombineFunction_t; -#define GR_COMBINE_FUNCTION_ZERO 0x0 -#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO -#define GR_COMBINE_FUNCTION_LOCAL 0x1 -#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2 -#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3 -#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6 -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7 -#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8 -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9 -#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL -#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10 - -typedef FxI32 GrCombineFactor_t; -#define GR_COMBINE_FACTOR_ZERO 0x0 -#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO -#define GR_COMBINE_FACTOR_LOCAL 0x1 -#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2 -#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3 -#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4 -#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5 -#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5 -#define GR_COMBINE_FACTOR_ONE 0x8 -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9 -#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa -#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb -#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc -#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA -#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd - - -typedef FxI32 GrCombineLocal_t; -#define GR_COMBINE_LOCAL_ITERATED 0x0 -#define GR_COMBINE_LOCAL_CONSTANT 0x1 -#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT -#define GR_COMBINE_LOCAL_DEPTH 0x2 - -typedef FxI32 GrCombineOther_t; -#define GR_COMBINE_OTHER_ITERATED 0x0 -#define GR_COMBINE_OTHER_TEXTURE 0x1 -#define GR_COMBINE_OTHER_CONSTANT 0x2 -#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT - - -typedef FxI32 GrAlphaSource_t; -#define GR_ALPHASOURCE_CC_ALPHA 0x0 -#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1 -#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2 -#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3 - - -typedef FxI32 GrColorCombineFnc_t; -#define GR_COLORCOMBINE_ZERO 0x0 -#define GR_COLORCOMBINE_CCRGB 0x1 -#define GR_COLORCOMBINE_ITRGB 0x2 -#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3 -#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4 -#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9 -#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa -#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb -#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc -#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd -#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe -#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf -#define GR_COLORCOMBINE_ONE 0x10 - -typedef FxI32 GrAlphaBlendFnc_t; -#define GR_BLEND_ZERO 0x0 -#define GR_BLEND_SRC_ALPHA 0x1 -#define GR_BLEND_SRC_COLOR 0x2 -#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR -#define GR_BLEND_DST_ALPHA 0x3 -#define GR_BLEND_ONE 0x4 -#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5 -#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6 -#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR -#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7 -#define GR_BLEND_RESERVED_8 0x8 -#define GR_BLEND_RESERVED_9 0x9 -#define GR_BLEND_RESERVED_A 0xa -#define GR_BLEND_RESERVED_B 0xb -#define GR_BLEND_RESERVED_C 0xc -#define GR_BLEND_RESERVED_D 0xd -#define GR_BLEND_RESERVED_E 0xe -#define GR_BLEND_ALPHA_SATURATE 0xf -#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE - -typedef FxI32 GrAspectRatio_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -//#define GLIDE3_DEBUG -#ifdef GLIDE3_DEBUG -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#else -#define GR_ASPECT_8x1 3 /* 8W x 1H */ -#define GR_ASPECT_4x1 2 /* 4W x 1H */ -#define GR_ASPECT_2x1 1 /* 2W x 1H */ -#define GR_ASPECT_1x1 0 /* 1W x 1H */ -#define GR_ASPECT_1x2 -1 /* 1W x 2H */ -#define GR_ASPECT_1x4 -2 /* 1W x 4H */ -#define GR_ASPECT_1x8 -3 /* 1W x 8H */ -#endif /* GLIDE3_DEBUG */ -#else -#define GR_ASPECT_8x1 0x0 /* 8W x 1H */ -#define GR_ASPECT_4x1 0x1 /* 4W x 1H */ -#define GR_ASPECT_2x1 0x2 /* 2W x 1H */ -#define GR_ASPECT_1x1 0x3 /* 1W x 1H */ -#define GR_ASPECT_1x2 0x4 /* 1W x 2H */ -#define GR_ASPECT_1x4 0x5 /* 1W x 4H */ -#define GR_ASPECT_1x8 0x6 /* 1W x 8H */ -#endif - -typedef FxI32 GrBuffer_t; -#define GR_BUFFER_FRONTBUFFER 0x0 -#define GR_BUFFER_BACKBUFFER 0x1 -#define GR_BUFFER_AUXBUFFER 0x2 -#define GR_BUFFER_DEPTHBUFFER 0x3 -#define GR_BUFFER_ALPHABUFFER 0x4 -#define GR_BUFFER_TRIPLEBUFFER 0x5 - -typedef FxI32 GrChromakeyMode_t; -#define GR_CHROMAKEY_DISABLE 0x0 -#define GR_CHROMAKEY_ENABLE 0x1 - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -typedef FxI32 GrChromaRangeMode_t; -#define GR_CHROMARANGE_RGB_ANY 0x0 -#define GR_CHROMARANGE_RGb_ANY 0x1 -#define GR_CHROMARANGE_RgB_ANY 0x2 -#define GR_CHROMARANGE_Rgb_ANY 0x3 -#define GR_CHROMARANGE_rGB_ANY 0x4 -#define GR_CHROMARANGE_rGb_ANY 0x5 -#define GR_CHROMARANGE_rgB_ANY 0x6 -#define GR_CHROMARANGE_rgb_ANY 0x7 -#define GR_CHROMARANGE_RGB_ALL 0x8 -#define GR_CHROMARANGE_RGb_ALL 0x9 -#define GR_CHROMARANGE_RgB_ALL 0xa -#define GR_CHROMARANGE_Rgb_ALL 0xb -#define GR_CHROMARANGE_rGB_ALL 0xc -#define GR_CHROMARANGE_rGb_ALL 0xd -#define GR_CHROMARANGE_rgB_ALL 0xe -#define GR_CHROMARANGE_rgb_ALL 0xf -#endif - -typedef FxI32 GrCmpFnc_t; -#define GR_CMP_NEVER 0x0 -#define GR_CMP_LESS 0x1 -#define GR_CMP_EQUAL 0x2 -#define GR_CMP_LEQUAL 0x3 -#define GR_CMP_GREATER 0x4 -#define GR_CMP_NOTEQUAL 0x5 -#define GR_CMP_GEQUAL 0x6 -#define GR_CMP_ALWAYS 0x7 - -typedef FxI32 GrColorFormat_t; -#define GR_COLORFORMAT_ARGB 0x0 -#define GR_COLORFORMAT_ABGR 0x1 - -#define GR_COLORFORMAT_RGBA 0x2 -#define GR_COLORFORMAT_BGRA 0x3 - -typedef FxI32 GrCullMode_t; -#define GR_CULL_DISABLE 0x0 -#define GR_CULL_NEGATIVE 0x1 -#define GR_CULL_POSITIVE 0x2 - -typedef FxI32 GrDepthBufferMode_t; -#define GR_DEPTHBUFFER_DISABLE 0x0 -#define GR_DEPTHBUFFER_ZBUFFER 0x1 -#define GR_DEPTHBUFFER_WBUFFER 0x2 -#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3 -#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4 - -typedef FxI32 GrDitherMode_t; -#define GR_DITHER_DISABLE 0x0 -#define GR_DITHER_2x2 0x1 -#define GR_DITHER_4x4 0x2 - -typedef FxI32 GrFogMode_t; -#define GR_FOG_DISABLE 0x0 -#define GR_FOG_WITH_ITERATED_ALPHA 0x1 -#define GR_FOG_WITH_TABLE 0x2 -#define GR_FOG_WITH_ITERATED_Z 0x3 /* Bug 735 */ -#define GR_FOG_MULT2 0x100 -#define GR_FOG_ADD2 0x200 - -typedef FxU32 GrLock_t; -#define GR_LFB_READ_ONLY 0x00 -#define GR_LFB_WRITE_ONLY 0x01 -#define GR_LFB_IDLE 0x00 -#define GR_LFB_NOIDLE 0x10 - -typedef FxI32 GrLfbBypassMode_t; -#define GR_LFBBYPASS_DISABLE 0x0 -#define GR_LFBBYPASS_ENABLE 0x1 - -typedef FxI32 GrLfbWriteMode_t; -#define GR_LFBWRITEMODE_565 0x0 /* RGB:RGB */ -#define GR_LFBWRITEMODE_555 0x1 /* RGB:RGB */ -#define GR_LFBWRITEMODE_1555 0x2 /* ARGB:ARGB */ -#define GR_LFBWRITEMODE_RESERVED1 0x3 -#define GR_LFBWRITEMODE_888 0x4 /* RGB */ -#define GR_LFBWRITEMODE_8888 0x5 /* ARGB */ -#define GR_LFBWRITEMODE_RESERVED2 0x6 -#define GR_LFBWRITEMODE_RESERVED3 0x7 -#define GR_LFBWRITEMODE_RESERVED4 0x8 -#define GR_LFBWRITEMODE_RESERVED5 0x9 -#define GR_LFBWRITEMODE_RESERVED6 0xa -#define GR_LFBWRITEMODE_RESERVED7 0xb -#define GR_LFBWRITEMODE_565_DEPTH 0xc /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_555_DEPTH 0xd /* RGB:DEPTH */ -#define GR_LFBWRITEMODE_1555_DEPTH 0xe /* ARGB:DEPTH */ -#define GR_LFBWRITEMODE_ZA16 0xf /* DEPTH:DEPTH */ -#define GR_LFBWRITEMODE_ANY 0xFF - - -typedef FxI32 GrOriginLocation_t; -#define GR_ORIGIN_UPPER_LEFT 0x0 -#define GR_ORIGIN_LOWER_LEFT 0x1 -#define GR_ORIGIN_ANY 0xFF - -typedef struct { - int size; - void *lfbPtr; - FxU32 strideInBytes; - GrLfbWriteMode_t writeMode; - GrOriginLocation_t origin; -} GrLfbInfo_t; - -typedef FxI32 GrLOD_t; -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#else -#define GR_LOD_256 0x8 -#define GR_LOD_128 0x7 -#define GR_LOD_64 0x6 -#define GR_LOD_32 0x5 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x3 -#define GR_LOD_4 0x2 -#define GR_LOD_2 0x1 -#define GR_LOD_1 0x0 -#endif /* GLIDE3_DEBUG */ -#else -#define GR_LOD_256 0x0 -#define GR_LOD_128 0x1 -#define GR_LOD_64 0x2 -#define GR_LOD_32 0x3 -#define GR_LOD_16 0x4 -#define GR_LOD_8 0x5 -#define GR_LOD_4 0x6 -#define GR_LOD_2 0x7 -#define GR_LOD_1 0x8 -#endif - -typedef FxI32 GrMipMapMode_t; -#define GR_MIPMAP_DISABLE 0x0 /* no mip mapping */ -#define GR_MIPMAP_NEAREST 0x1 /* use nearest mipmap */ -#define GR_MIPMAP_NEAREST_DITHER 0x2 /* GR_MIPMAP_NEAREST + LOD dith */ - - -typedef FxI32 GrSmoothingMode_t; -#define GR_SMOOTHING_DISABLE 0x0 -#define GR_SMOOTHING_ENABLE 0x1 - -typedef FxI32 GrTextureClampMode_t; -#define GR_TEXTURECLAMP_WRAP 0x0 -#define GR_TEXTURECLAMP_CLAMP 0x1 - -typedef FxI32 GrTextureCombineFnc_t; -#define GR_TEXTURECOMBINE_ZERO 0x0 /* texout = 0 */ -#define GR_TEXTURECOMBINE_DECAL 0x1 /* texout = texthis */ -#define GR_TEXTURECOMBINE_OTHER 0x2 /* this TMU in passthru mode */ -#define GR_TEXTURECOMBINE_ADD 0x3 /* tout = tthis + t(this+1) */ -#define GR_TEXTURECOMBINE_MULTIPLY 0x4 /* texout = tthis * t(this+1) */ -#define GR_TEXTURECOMBINE_SUBTRACT 0x5 /* Sutract from upstream TMU */ -#define GR_TEXTURECOMBINE_DETAIL 0x6 /* detail--detail on tthis */ -#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7 /* detail--detail on tthis+1 */ -#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8 /* trilinear--odd levels tthis*/ -#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9 /*trilinear--even levels tthis*/ -#define GR_TEXTURECOMBINE_ONE 0xa /* texout = 0xFFFFFFFF */ - -typedef FxI32 GrTextureFilterMode_t; -#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0 -#define GR_TEXTUREFILTER_BILINEAR 0x1 - -typedef FxI32 GrTextureFormat_t; -#define GR_TEXFMT_8BIT 0x0 -#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT -#define GR_TEXFMT_YIQ_422 0x1 -#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */ -#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */ -#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4 -#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */ -#define GR_TEXFMT_RSVD0 0x6 -#define GR_TEXFMT_RSVD1 0x7 -#define GR_TEXFMT_16BIT 0x8 -#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT -#define GR_TEXFMT_AYIQ_8422 0x9 -#define GR_TEXFMT_RGB_565 0xa -#define GR_TEXFMT_ARGB_1555 0xb -#define GR_TEXFMT_ARGB_4444 0xc -#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd -#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */ -#define GR_TEXFMT_RSVD2 0xf - -typedef FxU32 GrTexTable_t; -#define GR_TEXTABLE_NCC0 0x0 -#define GR_TEXTABLE_NCC1 0x1 -#define GR_TEXTABLE_PALETTE 0x2 - -typedef FxU32 GrNCCTable_t; -#define GR_NCCTABLE_NCC0 0x0 -#define GR_NCCTABLE_NCC1 0x1 - -typedef FxU32 GrTexBaseRange_t; -#define GR_TEXBASE_256 0x0 -#define GR_TEXBASE_128 0x1 -#define GR_TEXBASE_64 0x2 -#define GR_TEXBASE_32_TO_1 0x3 - -#ifdef GLIDE3 - -#define GLIDE3_VERTEX_LAYOUT 1 - -typedef FxU32 GrEnableMode_t; -#define GR_MODE_DISABLE 0x0 -#define GR_MODE_ENABLE 0x1 - -#define GR_AA_ORDERED 0x01 -#define GR_ALLOW_MIPMAP_DITHER 0x02 -#define GR_SHAMELESS_PLUG 0x03 -#define GR_VIDEO_SMOOTHING 0x04 - -typedef FxU32 GrCoordinateSpaceMode_t; -#define GR_WINDOW_COORDS 0x00 -#define GR_CLIP_COORDS 0x01 - -#endif - -#ifdef GLIDE3 -#ifdef GLIDE3_ALPHA -#define GLIDE3_EXTRA_STATE 392 -#else -#define GLIDE3_EXTRA_STATE 216 -#endif -#else -#define GLIDE3_EXTRA_STATE 0 -#endif - -#define GLIDE_STATE_PAD_SIZE 312 + GLIDE3_EXTRA_STATE - -#ifdef GLIDE_LIB -typedef struct _GrState_s GrState; -#else -typedef struct _GrState_s { - char pad[GLIDE_STATE_PAD_SIZE]; -} GrState; -#endif - -#ifdef GLIDE3 -/* Types of data in strips */ -#define GR_FLOAT 0 -#define GR_U8 1 - -/* Parameters for strips */ -#define GR_PARAM_XY 0x01 -#define GR_PARAM_Z 0x02 -#define GR_PARAM_W 0x03 -#define GR_PARAM_Q 0x04 - -#define GR_PARAM_A 0x10 -#define GR_PARAM_A0 GR_PARAM_A -#define GR_PARAM_A1 GR_PARAM_A+1 -#define GR_PARAM_A2 GR_PARAM_A+2 -#define GR_PARAM_A3 GR_PARAM_A+3 -#define GR_PARAM_A4 GR_PARAM_A+4 -#define GR_PARAM_A5 GR_PARAM_A+5 -#define GR_PARAM_A6 GR_PARAM_A+6 -#define GR_PARAM_A7 GR_PARAM_A+7 - -#define GR_PARAM_RGB 0x20 -#define GR_PARAM_RGB0 GR_PARAM_RGB -#define GR_PARAM_RGB1 GR_PARAM_RGB+1 -#define GR_PARAM_RGB2 GR_PARAM_RGB+2 -#define GR_PARAM_RGB3 GR_PARAM_RGB+3 -#define GR_PARAM_RGB4 GR_PARAM_RGB+4 -#define GR_PARAM_RGB5 GR_PARAM_RGB+5 -#define GR_PARAM_RGB6 GR_PARAM_RGB+6 -#define GR_PARAM_RGB7 GR_PARAM_RGB+7 - -#define GR_PARAM_PARGB 0x30 -#define GR_PARAM_PARGB0 GR_PARAM_PARGB -#define GR_PARAM_PARGB1 GR_PARAM_PARGB+1 -#define GR_PARAM_PARGB2 GR_PARAM_PARGB+2 -#define GR_PARAM_PARGB3 GR_PARAM_PARGB+3 -#define GR_PARAM_PARGB4 GR_PARAM_PARGB+4 -#define GR_PARAM_PARGB5 GR_PARAM_PARGB+5 -#define GR_PARAM_PARGB6 GR_PARAM_PARGB+6 -#define GR_PARAM_PARGB7 GR_PARAM_PARGB+7 - -#define GR_PARAM_ST0 0x40 -#define GR_PARAM_ST1 GR_PARAM_ST0+1 -#define GR_PARAM_ST2 GR_PARAM_ST0+2 -#define GR_PARAM_ST3 GR_PARAM_ST0+3 -#define GR_PARAM_ST4 GR_PARAM_ST0+4 -#define GR_PARAM_ST5 GR_PARAM_ST0+5 -#define GR_PARAM_ST6 GR_PARAM_ST0+6 -#define GR_PARAM_ST7 GR_PARAM_ST0+7 - -#define GR_PARAM_Q0 0x50 -#define GR_PARAM_Q1 GR_PARAM_Q0+1 -#define GR_PARAM_Q2 GR_PARAM_Q0+2 -#define GR_PARAM_Q3 GR_PARAM_Q0+3 -#define GR_PARAM_Q4 GR_PARAM_Q0+4 -#define GR_PARAM_Q5 GR_PARAM_Q0+5 -#define GR_PARAM_Q6 GR_PARAM_Q0+6 -#define GR_PARAM_Q7 GR_PARAM_Q0+7 - -#define GR_PARAM_DISABLE 0x00 -#define GR_PARAM_ENABLE 0x01 - -/* Componenets for strips */ -/* vertex */ -#define GR_VERTEX_XYZ 3 -#define GR_VERTEX_XYZW 4 -/* Color */ -#define GR_COLOR_RGB 3 -#define GR_COLOR_RGBA 4 -/* Texture */ -#define GR_TEX_NONE 0 -#define GR_TEX_ST 2 -#define GR_TEX_STW 3 - -/* grDrawVertexArray primitive type */ -#define GR_POINTS 0 -#define GR_LINE_STRIP 1 -#define GR_LINES 2 -#define GR_POLYGON 3 -#define GR_TRIANGLE_STRIP 4 -#define GR_TRIANGLE_FAN 5 -#define GR_TRIANGLES 6 - - -/* Stuff for grGet/grReset */ -#define GR_BITS_DEPTH 0x01 -#define GR_BITS_RGBA 0x02 -#define GR_FIFO_FULLNESS 0x03 -#define GR_FOG_TABLE_ENTRIES 0x04 -#define GR_GAMMA_TABLE_ENTRIES 0x05 -#define GR_IS_BUSY 0x06 -#define GR_LFB_PIXEL_PIPE 0x07 -#define GR_MAX_TEXTURE_SIZE 0x08 -#define GR_MAX_TEXTURE_ASPECT_RATIO 0x09 -#define GR_MEMORY_FB 0x0a -#define GR_MEMORY_TMU 0x0b -#define GR_MEMORY_UMA 0x0c -#define GR_NUM_BOARDS 0x0d -#define GR_NUM_POWER_OF_TWO_TEXTURES 0x0e -#define GR_NUM_FB 0x0f -#define GR_NUM_TMU 0x10 -#define GR_PENDING_BUFFERSWAPS 0x11 -#define GR_REVISION_FB 0x12 -#define GR_REVISION_TMU 0x13 -#define GR_STATS_LINES 0x14 /* grSet/grReset */ -#define GR_STATS_PIXELS_AFUNC_FAIL 0x15 -#define GR_STATS_PIXELS_CHROMA_FAIL 0x16 -#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x17 -#define GR_STATS_PIXELS_IN 0x18 -#define GR_STATS_PIXELS_OUT 0x19 -#define GR_STATS_PIXELS 0x1a /* grReset */ -#define GR_STATS_POINTS 0x1b /* grSet/grReset */ -#define GR_STATS_TRIANGLES_IN 0x1c -#define GR_STATS_TRIANGLES_OUT 0x1d -#define GR_STATS_TRIANGLES 0x1e /* grReset */ -#define GR_SWAP_HISTORY 0x1f -#define GR_TEXTURE_ALIGN 0x20 -#define GR_VIDEO_POSITION 0x21 -#define GR_VIEWPORT 0x22 -#define GR_WDEPTH_MIN_MAX 0x23 -#define GR_ZDEPTH_MIN_MAX 0x24 - -/* stuff for grGetString */ -#define GR_EXTENSION 0xa0 -#define GR_HARDWARE 0xa1 -#define GR_RENDERER 0xa2 -#define GR_VENDOR 0xa3 -#define GR_VERSION 0xa4 - -#endif - -/* -** ----------------------------------------------------------------------- -** STRUCTURES -** ----------------------------------------------------------------------- -*/ - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -#ifdef GLIDE3_DEBUG -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#else -typedef struct { - GrLOD_t smallLodLog2; - GrLOD_t largeLodLog2; - GrAspectRatio_t aspectRatioLog2; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif /* GLIDE3_DEBUG */ -#else -typedef struct { - GrLOD_t smallLod; - GrLOD_t largeLod; - GrAspectRatio_t aspectRatio; - GrTextureFormat_t format; - void *data; -} GrTexInfo; -#endif - -#ifndef GLIDE3_ALPHA -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -typedef struct -{ - int sst; /* SST where this texture map was stored */ - FxBool valid; /* set when this table entry is allocated*/ - int width, height; - GrAspectRatio_t aspect_ratio; /* aspect ratio of the mip map. */ - void *data; /* actual texture data */ - - GrTextureFormat_t format; /* format of the texture table */ - GrMipMapMode_t mipmap_mode; /* mip map mode for this texture */ - GrTextureFilterMode_t magfilter_mode; /* filtering to be used when magnified */ - GrTextureFilterMode_t minfilter_mode; /* filtering to be used with minified */ - GrTextureClampMode_t s_clamp_mode; /* how this texture should be clamped in s */ - GrTextureClampMode_t t_clamp_mode; /* how this texture should be clamped in t */ - FxU32 tLOD; /* Register value for tLOD register */ - FxU32 tTextureMode; /* Register value for tTextureMode register - not including non-texture specific bits */ - FxU32 lod_bias; /* LOD bias of the mip map in preshifted 4.2*/ - GrLOD_t lod_min, lod_max; /* largest and smallest levels of detail */ - int tmu; /* tmu on which this texture resides */ - FxU32 odd_even_mask; /* mask specifying levels on this tmu */ - FxU32 tmu_base_address; /* base addr (in TMU mem) of this texture */ - FxBool trilinear; /* should we blend by lod? */ - - GuNccTable ncc_table; /* NCC compression table (optional) */ -} GrMipMapInfo; -#endif - -typedef int GrSstType; -#define GR_SSTTYPE_VOODOO 0 -#define GR_SSTTYPE_SST96 1 -#define GR_SSTTYPE_AT3D 2 -#define GR_SSTTYPE_Voodoo2 3 - -typedef struct GrTMUConfig_St { - int tmuRev; /* Rev of Texelfx chip */ - int tmuRam; /* 1, 2, or 4 MB */ -} GrTMUConfig_t; - -typedef struct GrVoodooConfig_St { - int fbRam; /* 1, 2, or 4 MB */ - int fbiRev; /* Rev of Pixelfx chip */ - int nTexelfx; /* How many texelFX chips are there? */ - FxBool sliDetect; /* Is it a scan-line interleaved board? */ - GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ -} GrVoodooConfig_t; - -typedef struct GrSst96Config_St { - int fbRam; /* How much? */ - int nTexelfx; - GrTMUConfig_t tmuConfig; -} GrSst96Config_t; - -typedef GrVoodooConfig_t GrVoodoo2Config_t; - -typedef struct GrAT3DConfig_St { - int rev; -} GrAT3DConfig_t; - -typedef struct { - int num_sst; /* # of HW units in the system */ - struct { - GrSstType type; /* Which hardware is it? */ - union SstBoard_u { - GrVoodooConfig_t VoodooConfig; - GrSst96Config_t SST96Config; - GrAT3DConfig_t AT3DConfig; - GrVoodoo2Config_t Voodoo2Config; - } sstBoard; - } SSTs[MAX_NUM_SST]; /* configuration for each board */ -} GrHwConfiguration; - -typedef struct GrSstPerfStats_s { - FxU32 pixelsIn; /* # pixels processed (minus buffer clears) */ - FxU32 chromaFail; /* # pixels not drawn due to chroma key */ - FxU32 zFuncFail; /* # pixels not drawn due to Z comparison */ - FxU32 aFuncFail; /* # pixels not drawn due to alpha comparison */ - FxU32 pixelsOut; /* # pixels drawn (including buffer clears) */ -} GrSstPerfStats_t; - - -typedef struct { - float sow; /* s texture ordinate (s over w) */ - float tow; /* t texture ordinate (t over w) */ - float oow; /* 1/w (used mipmapping - really 0xfff/w) */ -} GrTmuVertex; - -/* -** GrVertex -** If these are changed the C & assembly language trisetup routines MUST -** be changed, for they will no longer work. -*/ -#if !GLIDE3_VERTEX_LAYOUT -typedef struct -{ - float x, y, z; /* X, Y, and Z of scrn space -- Z is ignored */ - float r, g, b; /* R, G, B, ([0..255.0]) */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float a; /* Alpha [0..255.0] */ - float oow; /* 1/W (used for W-buffering, texturing) */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_Z_OFFSET 2 -#define GR_VERTEX_R_OFFSET 3 -#define GR_VERTEX_G_OFFSET 4 -#define GR_VERTEX_B_OFFSET 5 -#define GR_VERTEX_OOZ_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_OOW_OFFSET 8 - -#else /* GLIDE3_VERTEX_LAYOUT */ -typedef struct -{ - float x, y; /* X and Y in screen space */ - float ooz; /* 65535/Z (used for Z-buffering) */ - float oow; /* 1/W (used for W-buffering, texturing) */ - float r, g, b, a; /* R, G, B, A [0..255.0] */ - float z; /* Z is ignored */ - GrTmuVertex tmuvtx[GLIDE_NUM_TMU]; -} GrVertex; - -#define GR_VERTEX_X_OFFSET 0 -#define GR_VERTEX_Y_OFFSET 1 -#define GR_VERTEX_OOZ_OFFSET 2 -#define GR_VERTEX_OOW_OFFSET 3 -#define GR_VERTEX_R_OFFSET 4 -#define GR_VERTEX_G_OFFSET 5 -#define GR_VERTEX_B_OFFSET 6 -#define GR_VERTEX_A_OFFSET 7 -#define GR_VERTEX_Z_OFFSET 8 - -#endif /* GLIDE3_VERTEX_LAYOUT */ - -#define GR_VERTEX_SOW_TMU0_OFFSET 9 -#define GR_VERTEX_TOW_TMU0_OFFSET 10 -#define GR_VERTEX_OOW_TMU0_OFFSET 11 -#define GR_VERTEX_SOW_TMU1_OFFSET 12 -#define GR_VERTEX_TOW_TMU1_OFFSET 13 -#define GR_VERTEX_OOW_TMU1_OFFSET 14 - -#if (GLIDE_NUM_TMU > 2) -#define GR_VERTEX_SOW_TMU2_OFFSET 15 -#define GR_VERTEX_TOW_TMU2_OFFSET 16 -#define GR_VERTEX_OOW_TMU2_OFFSET 17 -#endif - -typedef FxU32 GrLfbSrcFmt_t; -#define GR_LFB_SRC_FMT_565 0x00 -#define GR_LFB_SRC_FMT_555 0x01 -#define GR_LFB_SRC_FMT_1555 0x02 -#define GR_LFB_SRC_FMT_888 0x04 -#define GR_LFB_SRC_FMT_8888 0x05 -#define GR_LFB_SRC_FMT_565_DEPTH 0x0c -#define GR_LFB_SRC_FMT_555_DEPTH 0x0d -#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e -#define GR_LFB_SRC_FMT_ZA16 0x0f -#define GR_LFB_SRC_FMT_RLE16 0x80 - -typedef FxI32 GrPassthruMode_t; -#define GR_PASSTHRU_SHOW_VGA 0x0 -#define GR_PASSTHRU_SHOW_SST1 0x1 - -typedef FxU32 GrHint_t; -#define GR_HINTTYPE_MIN 0 -#define GR_HINT_STWHINT 0 -#define GR_HINT_FIFOCHECKHINT 1 -#define GR_HINT_FPUPRECISION 2 -#define GR_HINT_ALLOW_MIPMAP_DITHER 3 -#define GR_HINT_LFB_WRITE 4 -#define GR_HINT_LFB_PROTECT 5 -#define GR_HINT_LFB_RESET 6 -#define GR_HINTTYPE_MAX GR_HINT_LFB_RESET -#ifdef H3D -#define GR_HINT_H3DENABLE GR_HINTTYPE_MAX -#undef GR_HINTTYPE_MAX -#define GR_HINTTYPE_MAX GR_HIT_H3DENABLE -#endif - -typedef FxU32 GrSTWHint_t; -#define GR_STWHINT_W_DIFF_FBI FXBIT(0) -#define GR_STWHINT_W_DIFF_TMU0 FXBIT(1) -#define GR_STWHINT_ST_DIFF_TMU0 FXBIT(2) -#define GR_STWHINT_W_DIFF_TMU1 FXBIT(3) -#define GR_STWHINT_ST_DIFF_TMU1 FXBIT(4) -#define GR_STWHINT_W_DIFF_TMU2 FXBIT(5) -#define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6) - -typedef FxU32 GrControl_t; -#define GR_CONTROL_ACTIVATE 0x1 -#define GR_CONTROL_DEACTIVATE 0x2 -#define GR_CONTROL_RESIZE 0x3 -#define GR_CONTROL_MOVE 0x4 - -#define GR_GENERATE_FIFOCHECK_HINT_MASK(swHWM, swLWM) \ - (((swHWM & 0xffff) << 16) | (swLWM & 0xffff)) - -/* -** ----------------------------------------------------------------------- -** FUNCTION PROTOTYPES -** ----------------------------------------------------------------------- -*/ -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grDrawPlanarPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPlanarPolygonVertexList( int nverts, const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygon( int nverts, const int ilist[], const GrVertex vlist[] ); - -FX_ENTRY void FX_CALL -grDrawPolygonVertexList( int nverts, const GrVertex vlist[] ); - -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grDrawPoint( void *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( void *v1, void *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( void *a, void *b, void *c ); - -#else -FX_ENTRY void FX_CALL -grDrawPoint( const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grDrawLine( const GrVertex *v1, const GrVertex *v2 ); - -FX_ENTRY void FX_CALL -grDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); -#endif - -/* -** buffer management -*/ -FX_ENTRY void FX_CALL -grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU16 depth ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY int FX_CALL -grBufferNumPending( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grBufferSwap( int swap_interval ); - -FX_ENTRY void FX_CALL -grRenderBuffer( GrBuffer_t buffer ); - -/* -** error management -*/ -typedef void (*GrErrorCallbackFnc_t)( const char *string, FxBool fatal ); - -FX_ENTRY void FX_CALL -grErrorSetCallback( GrErrorCallbackFnc_t fnc ); - -/* -** SST routines -*/ -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grFinish(void); -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grFlush(void); -#endif - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstIdle(void); - -FX_ENTRY FxU32 FX_CALL -grSstVideoLine( void ); - -FX_ENTRY FxBool FX_CALL -grSstVRetraceOn( void ); - -FX_ENTRY FxBool FX_CALL -grSstIsBusy( void ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY FxBool FX_CALL -grSstWinOpen( - FxU32 hWnd, - GrScreenResolution_t screen_resolution, - GrScreenRefresh_t refresh_rate, - GrColorFormat_t color_format, - GrOriginLocation_t origin_location, - int nColBuffers, - int nAuxBuffers); - -FX_ENTRY void FX_CALL -grSstWinClose( void ); - -FX_ENTRY FxBool FX_CALL -grSstControl( FxU32 code ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxBool FX_CALL -grSstQueryHardware( GrHwConfiguration *hwconfig ); - -FX_ENTRY FxBool FX_CALL -grSstQueryBoards( GrHwConfiguration *hwconfig ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grSstOrigin(GrOriginLocation_t origin); - -FX_ENTRY void FX_CALL -grSstSelect( int which_sst ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -grSstScreenHeight( void ); - -FX_ENTRY FxU32 FX_CALL -grSstScreenWidth( void ); - -FX_ENTRY FxU32 FX_CALL -grSstStatus( void ); -#endif /* !GLIDE3_ALPHA */ - -/* -** Drawing Statistics -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grSstPerfStats(GrSstPerfStats_t *pStats); - -FX_ENTRY void FX_CALL -grSstResetPerfStats(void); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grResetTriStats(); - -FX_ENTRY void FX_CALL -grTriStats(FxU32 *trisProcessed, FxU32 *trisDrawn); - -/* -** Glide configuration and special effect maintenance functions -*/ -FX_ENTRY void FX_CALL -grAlphaBlendFunction( - GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, - GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df - ); - -FX_ENTRY void FX_CALL -grAlphaCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert - ); - -FX_ENTRY void FX_CALL -grAlphaControlsITRGBLighting( FxBool enable ); - -FX_ENTRY void FX_CALL -grAlphaTestFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grAlphaTestReferenceValue( GrAlpha_t value ); - -FX_ENTRY void FX_CALL -grChromakeyMode( GrChromakeyMode_t mode ); - -FX_ENTRY void FX_CALL -grChromakeyValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy ); - -FX_ENTRY void FX_CALL -grColorCombine( - GrCombineFunction_t function, GrCombineFactor_t factor, - GrCombineLocal_t local, GrCombineOther_t other, - FxBool invert ); - -FX_ENTRY void FX_CALL -grColorMask( FxBool rgb, FxBool a ); - -FX_ENTRY void FX_CALL -grCullMode( GrCullMode_t mode ); - -FX_ENTRY void FX_CALL -grConstantColorValue( GrColor_t value ); - -FX_ENTRY void FX_CALL -grConstantColorValue4( float a, float r, float g, float b ); - -FX_ENTRY void FX_CALL -grDepthBiasLevel( FxI16 level ); - -FX_ENTRY void FX_CALL -grDepthBufferFunction( GrCmpFnc_t function ); - -FX_ENTRY void FX_CALL -grDepthBufferMode( GrDepthBufferMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthMask( FxBool mask ); - -FX_ENTRY void FX_CALL -grDisableAllEffects( void ); - -FX_ENTRY void FX_CALL -grDitherMode( GrDitherMode_t mode ); - -FX_ENTRY void FX_CALL -grFogColorValue( GrColor_t fogcolor ); - -FX_ENTRY void FX_CALL -grFogMode( GrFogMode_t mode ); - -FX_ENTRY void FX_CALL -grFogTable( const GrFog_t ft[] ); - -FX_ENTRY void FX_CALL -grGammaCorrectionValue( float value ); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grLoadGammaTable( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue); -#endif - -FX_ENTRY void FX_CALL -grSplash(float x, float y, float width, float height, FxU32 frame); - -#ifdef GLIDE3 -FX_ENTRY FxBool FX_CALL -grGet( FxU32 pname, FxU32 plength, FxI32 *params ); - -FX_ENTRY const char * FX_CALL -grGetString( FxU32 pname ); - -FX_ENTRY FxBool FX_CALL -grReset( FxU32 what ); - -FX_ENTRY GrProc FX_CALL -grGetProcAddress( char *procName ); - -FX_ENTRY void FX_CALL -grEnable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grDisable( GrEnableMode_t mode ); - -FX_ENTRY void FX_CALL -grCoordinateSpace( GrCoordinateSpaceMode_t mode ); - -FX_ENTRY void FX_CALL -grDepthRange( FxFloat n, FxFloat f ); - -FX_ENTRY void FX_CALL -grViewport( FxI32 x, FxI32 y, FxI32 width, FxI32 height ); - -#endif -/* -** texture mapping control functions -*/ -FX_ENTRY FxU32 FX_CALL -grTexCalcMemRequired( - GrLOD_t lodmin, GrLOD_t lodmax, - GrAspectRatio_t aspect, GrTextureFormat_t fmt); - -FX_ENTRY FxU32 FX_CALL -grTexTextureMemRequired( FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY FxU32 FX_CALL -grTexMinAddress( GrChipID_t tmu ); - - -FX_ENTRY FxU32 FX_CALL -grTexMaxAddress( GrChipID_t tmu ); - - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexNCCTable( GrNCCTable_t table ); -#else -FX_ENTRY void FX_CALL -grTexNCCTable( GrChipID_t tmu, GrNCCTable_t table ); -#endif - -FX_ENTRY void FX_CALL -grTexSource( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexClampMode( - GrChipID_t tmu, - GrTextureClampMode_t s_clampmode, - GrTextureClampMode_t t_clampmode - ); - -FX_ENTRY void FX_CALL -grTexCombine( - GrChipID_t tmu, - GrCombineFunction_t rgb_function, - GrCombineFactor_t rgb_factor, - GrCombineFunction_t alpha_function, - GrCombineFactor_t alpha_factor, - FxBool rgb_invert, - FxBool alpha_invert - ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); -#endif - -FX_ENTRY void FX_CALL -grTexDetailControl( - GrChipID_t tmu, - int lod_bias, - FxU8 detail_scale, - float detail_max - ); - -FX_ENTRY void FX_CALL -grTexFilterMode( - GrChipID_t tmu, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode - ); - - -FX_ENTRY void FX_CALL -grTexLodBiasValue(GrChipID_t tmu, float bias ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMap( GrChipID_t tmu, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevel( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadMipMapLevelPartial( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - void *data, - int start, - int end ); - - -FX_ENTRY void FX_CALL -ConvertAndDownloadRle( GrChipID_t tmu, - FxU32 startAddress, - GrLOD_t thisLod, - GrLOD_t largeLod, - GrAspectRatio_t aspectRatio, - GrTextureFormat_t format, - FxU32 evenOdd, - FxU8 *bm_data, - long bm_h, - FxU32 u0, - FxU32 v0, - FxU32 width, - FxU32 height, - FxU32 dest_width, - FxU32 dest_height, - FxU16 *tlut); - -FX_ENTRY void FX_CALL -grCheckForRoom(FxI32 n); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY void FX_CALL -grTexDownloadTable( GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrTexTable_t type, - void *data, - int start, - int end ); -#else -FX_ENTRY void FX_CALL -grTexDownloadTable( GrChipID_t tmu, - GrTexTable_t type, - void *data ); - -FX_ENTRY void FX_CALL -grTexDownloadTablePartial( GrChipID_t tmu, - GrTexTable_t type, - void *data, - int start, - int end ); -#endif - -FX_ENTRY void FX_CALL -grTexMipMapMode( GrChipID_t tmu, - GrMipMapMode_t mode, - FxBool lodBlend ); - -FX_ENTRY void FX_CALL -grTexMultibase( GrChipID_t tmu, - FxBool enable ); - -FX_ENTRY void FX_CALL -grTexMultibaseAddress( GrChipID_t tmu, - GrTexBaseRange_t range, - FxU32 startAddress, - FxU32 evenOdd, - GrTexInfo *info ); - -/* -** utility texture functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY GrMipMapId_t FX_CALL -guTexAllocateMemory( - GrChipID_t tmu, - FxU8 odd_even_mask, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minfilter_mode, - GrTextureFilterMode_t magfilter_mode, - float lod_bias, - FxBool trilinear - ); - -FX_ENTRY FxBool FX_CALL -guTexChangeAttributes( - GrMipMapId_t mmid, - int width, int height, - GrTextureFormat_t fmt, - GrMipMapMode_t mm_mode, - GrLOD_t smallest_lod, GrLOD_t largest_lod, - GrAspectRatio_t aspect, - GrTextureClampMode_t s_clamp_mode, - GrTextureClampMode_t t_clamp_mode, - GrTextureFilterMode_t minFilterMode, - GrTextureFilterMode_t magFilterMode - ); - -FX_ENTRY void FX_CALL -guTexCombineFunction( - GrChipID_t tmu, - GrTextureCombineFnc_t fnc - ); - -FX_ENTRY GrMipMapId_t FX_CALL -guTexGetCurrentMipMap( GrChipID_t tmu ); - -FX_ENTRY GrMipMapInfo * FX_CALL -guTexGetMipMapInfo( GrMipMapId_t mmid ); - -FX_ENTRY FxU32 FX_CALL -guTexMemQueryAvail( GrChipID_t tmu ); - -FX_ENTRY void FX_CALL -guTexMemReset( void ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMap( - GrMipMapId_t mmid, - const void *src, - const GuNccTable *table - ); - -FX_ENTRY void FX_CALL -guTexDownloadMipMapLevel( - GrMipMapId_t mmid, - GrLOD_t lod, - const void **src - ); -FX_ENTRY void FX_CALL -guTexSource( GrMipMapId_t id ); -#endif /* !GLIDE3_ALPHA */ - -/* -** linear frame buffer functions -*/ - -FX_ENTRY FxBool FX_CALL -grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode, - GrOriginLocation_t origin, FxBool pixelPipeline, - GrLfbInfo_t *info ); - -FX_ENTRY FxBool FX_CALL -grLfbUnlock( GrLock_t type, GrBuffer_t buffer ); - -FX_ENTRY void FX_CALL -grLfbConstantAlpha( GrAlpha_t alpha ); - -FX_ENTRY void FX_CALL -grLfbConstantDepth( FxU16 depth ); - -FX_ENTRY void FX_CALL -grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords); - -FX_ENTRY void FX_CALL -grLfbWriteColorFormat(GrColorFormat_t colorFormat); - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxBool pixelPipeline, - FxI32 src_stride, void *src_data ); -#else -FX_ENTRY FxBool FX_CALL -grLfbWriteRegion( GrBuffer_t dst_buffer, - FxU32 dst_x, FxU32 dst_y, - GrLfbSrcFmt_t src_format, - FxU32 src_width, FxU32 src_height, - FxI32 src_stride, void *src_data ); -#endif - -FX_ENTRY FxBool FX_CALL -grLfbReadRegion( GrBuffer_t src_buffer, - FxU32 src_x, FxU32 src_y, - FxU32 src_width, FxU32 src_height, - FxU32 dst_stride, void *dst_data ); - - -/* -** Antialiasing Functions -*/ - -#ifndef GLIDE3_ALPHA - -FX_ENTRY void FX_CALL -grAADrawLine(const GrVertex *v1, const GrVertex *v2); - -FX_ENTRY void FX_CALL -grAADrawPoint(const GrVertex *pt ); - -FX_ENTRY void FX_CALL -grAADrawPolygon(const int nverts, const int ilist[], const GrVertex vlist[]); - -FX_ENTRY void FX_CALL -grAADrawPolygonVertexList(const int nverts, const GrVertex vlist[]); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grAADrawTriangle( - const GrVertex *a, const GrVertex *b, const GrVertex *c, - FxBool ab_antialias, FxBool bc_antialias, FxBool ca_antialias - ); - -/* -** glide management functions -*/ -FX_ENTRY void FX_CALL -grGlideInit( void ); - -FX_ENTRY void FX_CALL -grGlideShutdown( void ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideGetVersion( char version[80] ); -#endif /* !GLIDE3_ALPHA */ - -FX_ENTRY void FX_CALL -grGlideGetState( GrState *state ); - -FX_ENTRY void FX_CALL -grGlideSetState( const GrState *state ); - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -grGlideShamelessPlug(const FxBool on); - -FX_ENTRY void FX_CALL -grHints(GrHint_t hintType, FxU32 hintMask); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode); - -FX_ENTRY void FX_CALL -grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -FX_ENTRY void FX_CALL -grDrawVertexArrayLinear(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride); - -#endif - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __GLIDE_H__ */ diff --git a/glide2x/sst1/glide/src/glide.rc b/glide2x/sst1/glide/src/glide.rc deleted file mode 100644 index dc75c5f..0000000 --- a/glide2x/sst1/glide/src/glide.rc +++ /dev/null @@ -1,71 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" -#include "fxbldno.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#ifndef GLIDE3 -#define VERSIONNAME "glide2x.dll\0" -#else -#define VERSIONNAME "glide3x.dll\0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3Dfx Interactive, Inc.\0" - VALUE "FileDescription", "3Dfx Interactive, Inc. Glide DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1997\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", PRODNAME - VALUE "ProductVersion", VERSIONSTR - VALUE "Graphics Subsystem", HWSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/sst1/glide/src/glidesys.h b/glide2x/sst1/glide/src/glidesys.h deleted file mode 100644 index 1a7f2e7..0000000 --- a/glide2x/sst1/glide/src/glidesys.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ -#ifndef __GLIDESYS_H__ -#define __GLIDESYS_H__ - -/* -n** ----------------------------------------------------------------------- -** COMPILER/ENVIRONMENT CONFIGURATION -** ----------------------------------------------------------------------- -*/ - -/* Endianness is stored in bits [30:31] */ -#define GLIDE_ENDIAN_SHIFT 30 -#define GLIDE_ENDIAN_LITTLE (0x1 << GLIDE_ENDIAN_SHIFT) -#define GLIDE_ENDIAN_BIG (0x2 << GLIDE_ENDIAN_SHIFT) - -/* OS is stored in bits [0:6] */ -#define GLIDE_OS_SHIFT 0 -#define GLIDE_OS_UNIX 0x1 -#define GLIDE_OS_DOS32 0x2 -#define GLIDE_OS_WIN32 0x4 -#define GLIDE_OS_SYSTEM7 0x8 -#define GLIDE_OS_OS2 0x10 -#define GLIDE_OS_OTHER 0x20 /* For Proprietary Arcade HW */ - -#define GLIDE_SST_SHIFT 7 -#define GLIDE_SST_HW (0x2 << GLIDE_SST_SHIFT ) - -/* Hardware Type is stored in bits [9:12] */ -#define GLIDE_HW_SHIFT 9 -#define GLIDE_HW_SST1 (0x1 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SST96 (0x2 << GLIDE_HW_SHIFT) -#define GLIDE_HW_SSTH3 (0x4 << GLIDE_HW_SHIFT) - -/* -** Make sure we handle all instances of WIN32 -*/ -#ifndef __WIN32__ -# if defined ( _WIN32 ) || defined (WIN32) || defined(__NT__) -# define __WIN32__ -# endif -#endif - -/* We need two checks on the OS: one for endian, the other for OS */ -/* Check for endianness */ -#if defined(__IRIX__) || defined(__sparc__) || defined(MACOS) -# define GLIDE_ENDIAN GLIDE_ENDIAN_BIG -#else -# define GLIDE_ENDIAN GLIDE_ENDIAN_LITTLE -#endif - -/* Check for OS */ -#if defined(__IRIX__) || defined(__sparc__) || defined(__linux__) -# define GLIDE_OS GLIDE_OS_UNIX -#elif defined(__DOS__) -# define GLIDE_OS GLIDE_OS_DOS32 -#elif defined(__WIN32__) -# define GLIDE_OS GLIDE_OS_WIN32 -#endif - -#define GLIDE_SST GLIDE_SST_HW - - -/* Check for type of hardware */ -#ifdef SST96 -# define GLIDE_HW GLIDE_HW_SST96 -#elif defined(SSTH3) -# define GLIDE_HW GLIDE_HW_SSTH3 -#else /* Default to SST1 */ -# define GLIDE_HW GLIDE_HW_SST1 -#endif - - -#define GLIDE_PLATFORM (GLIDE_ENDIAN | GLIDE_OS | GLIDE_SST | GLIDE_HW) - -/* -** Control the number of TMUs -*/ -#ifndef GLIDE_NUM_TMU -# define GLIDE_NUM_TMU 2 -#endif - - -#if ( ( GLIDE_NUM_TMU < 0 ) && ( GLIDE_NUM_TMU > 3 ) ) -# error "GLIDE_NUM_TMU set to an invalid value" -#endif - -#endif /* __GLIDESYS_H__ */ diff --git a/glide2x/sst1/glide/src/glideutl.h b/glide2x/sst1/glide/src/glideutl.h deleted file mode 100644 index e578740..0000000 --- a/glide2x/sst1/glide/src/glideutl.h +++ /dev/null @@ -1,186 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 11 1/07/98 11:18a Atai - * remove GrMipMapInfo and GrGC.mm_table in glide3 - * - * 10 1/06/98 6:47p Atai - * undo grSplash and remove gu routines - * - * 9 1/05/98 6:04p Atai - * move 3df gu related data structure from glide.h to glideutl.h - * - * 8 12/18/97 2:13p Peter - * fogTable cataclysm - * - * 7 12/15/97 5:52p Atai - * disable obsolete glide2 api for glide3 - * - * 6 8/14/97 5:32p Pgj - * remove dead code per GMT - * - * 5 6/12/97 5:19p Pgj - * Fix bug 578 - * - * 4 3/05/97 9:36p Jdt - * Removed guFbWriteRegion added guEncodeRLE16 - * - * 3 1/16/97 3:45p Dow - * Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO -*/ - -/* Glide Utility routines */ - -#ifndef __GLIDEUTL_H__ -#define __GLIDEUTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(GLIDE3) && defined(GLIDE3_ALPHA) -/* -** 3DF texture file structs -*/ - -typedef struct -{ - FxU32 width, height; - int small_lod, large_lod; - GrAspectRatio_t aspect_ratio; - GrTextureFormat_t format; -} Gu3dfHeader; - -typedef struct -{ - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} GuNccTable; - -typedef struct { - FxU32 data[256]; -} GuTexPalette; - -typedef union { - GuNccTable nccTable; - GuTexPalette palette; -} GuTexTable; - -typedef struct -{ - Gu3dfHeader header; - GuTexTable table; - void *data; - FxU32 mem_required; /* memory required for mip map in bytes. */ -} Gu3dfInfo; - -#endif - -#ifndef FX_GLIDE_NO_FUNC_PROTO -/* -** rendering functions -*/ - -#ifndef GLIDE3_ALPHA -FX_ENTRY void FX_CALL -guAADrawTriangleWithClip( const GrVertex *a, const GrVertex - *b, const GrVertex *c); - -FX_ENTRY void FX_CALL -guDrawTriangleWithClip( - const GrVertex *a, - const GrVertex *b, - const GrVertex *c - ); - -FX_ENTRY void FX_CALL -guDrawPolygonVertexListWithClip( int nverts, const GrVertex vlist[] ); - -/* -** hi-level rendering utility functions -*/ -FX_ENTRY void FX_CALL -guAlphaSource( GrAlphaSource_t mode ); - -FX_ENTRY void FX_CALL -guColorCombineFunction( GrColorCombineFnc_t fnc ); - -FX_ENTRY int FX_CALL -guEncodeRLE16( void *dst, - void *src, - FxU32 width, - FxU32 height ); - -FX_ENTRY FxU16 * FX_CALL -guTexCreateColorMipMap( void ); -#endif /* !GLIDE3_ALPHA */ - -#ifdef GLIDE3 -FX_ENTRY void FX_CALL -guGammaCorrectionRGB( FxFloat red, FxFloat green, FxFloat blue ); -#endif - -/* -** fog stuff -*/ -FX_ENTRY float FX_CALL -guFogTableIndexToW( int i ); - -FX_ENTRY void FX_CALL -guFogGenerateExp( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateExp2( GrFog_t fogtable[], float density ); - -FX_ENTRY void FX_CALL -guFogGenerateLinear(GrFog_t fogtable[], - float nearZ, float farZ ); - -/* -** endian stuff -*/ -#ifndef GLIDE3_ALPHA -FX_ENTRY FxU32 FX_CALL -guEndianSwapWords( FxU32 value ); - -FX_ENTRY FxU16 FX_CALL -guEndianSwapBytes( FxU16 value ); -#endif /* !GLIDE3_ALPHA */ - -/* -** hi-level texture manipulation tools. -*/ -FX_ENTRY FxBool FX_CALL -gu3dfGetInfo( const char *filename, Gu3dfInfo *info ); - -FX_ENTRY FxBool FX_CALL -gu3dfLoad( const char *filename, Gu3dfInfo *data ); - -#endif /* FX_GLIDE_NO_FUNC_PROTO */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GLIDEUTL_H__ */ diff --git a/glide2x/sst1/glide/src/gmovie.c b/glide2x/sst1/glide/src/gmovie.c deleted file mode 100644 index 8b26494..0000000 --- a/glide2x/sst1/glide/src/gmovie.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 3 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ -#include - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -GR_DIENTRY(guMovieStart, void, ( void )) -{ - GrErrorCallback( "guMovieStart: unsupported on SST hardware", FXFALSE ); -} - -GR_DIENTRY(guMovieStop, void, ( void )) -{ - GrErrorCallback( "guMovieStop: unsupported on SST hardware", FXFALSE ); -} - -GR_DIENTRY(guMovieSetName, void, ( const char *name )) -{ - GrErrorCallback( "guMovieSetName: unsupported on SST hardware", FXFALSE ); -} - diff --git a/glide2x/sst1/glide/src/gpci.c b/glide2x/sst1/glide/src/gpci.c deleted file mode 100644 index aab812c..0000000 --- a/glide2x/sst1/glide/src/gpci.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - * - * 45 11/01/97 12:11p Pgj - * glide.dll ---> glide2x.dll - * - * 44 10/21/97 8:20p Atai - * initialize vid timing to NLLL - * - * 43 8/18/97 3:11p Atai - * fix vg96 fb ram configuration - * - * 42 7/18/97 5:30p Jdt - * Fixes for open/shutdown symmetry - * - * 41 7/12/97 4:58p Dow - * Added DllMain - * - * 40 7/07/97 8:33a Jdt - * New tracing macros. - * - * 39 6/19/97 7:35p Dow - * More P6 Stuff - * - * 38 5/27/97 2:03p Dow - * added new env variable - * - * 37 5/19/97 7:35p Pgj - * Print cogent error message if h/w not found - * - * 36 4/15/97 12:59p Dow - * Bandaid for SST96/P6 - * - * 35 4/13/97 8:11p Jdt - * Change in init.h - * - * 34 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 33 3/24/97 7:37p Dow - * Now sets n tmus for hwConfig - * - * 32 3/18/97 9:08p Dow - * Added FX_GLIDE_NO_DITHER_SUB environment variable - * - * 31 3/17/97 6:27a Jdt - * Removed enumCB and pass 0 to enumHardware. - * - * 30 3/16/97 12:51a Jdt - * fix num_sst when detecting vg96 - * - * 29 3/16/97 12:39a Jdt - * Programmatic type-os - * - * 28 3/16/97 12:19a Jdt - * Completely re-wrote grSstDetectResources - * - * 27 3/06/97 4:54p Dow - * Fixed SLI - * - * 26 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 25 3/02/97 7:05p Dow - * Changes to support DOS DLLs - * - * 24 2/26/97 2:18p Dow - * moved all debug set macros to __cdecl - * - * 23 2/26/97 11:57a Jdt - * Fixed stack bug, fixed splash screen bug - * - * 22 2/19/97 4:42p Dow - * Fixed debug build for Watcom - * - * 21 2/18/97 10:39a Dow - * Added call to initRegisters for AT3D - * - * 20 2/18/97 9:51a Jdt - * Did some casting to remove warnings. - * - * 19 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 18 2/12/97 8:15p Dow - * Fixed VG base_pointe - * - * 17 2/12/97 9:20a Dow - * Fixed Watcom error wrt GDBG_ERROR call - * - * 16 2/11/97 6:59p Dow - * Changes to support vid tiles and ser status - * - * 15 1/18/97 11:48p Dow - * Re-added error callback set - * Added support for GMT's register debugging - * - * 14 1/14/97 6:41p Dow - * - * 13 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include -#include - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#include - -#include - -#if ( GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - -BOOL WINAPI -DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) -{ - switch( ul_reason_for_call ) { - case DLL_PROCESS_DETACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - grGlideShutdown(); - break; - case DLL_PROCESS_ATTACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - break; - case DLL_THREAD_ATTACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - break; - case DLL_THREAD_DETACH: - GDBG_INFO((80, "DllMain: DLL_PROCESS_DETACH\n")); - break; - default: - GDBG_INFO((80, "DllMain: Unhandled message.\n")); - break; - } - - return TRUE; - -} /* DllMain */ - - -#endif - -/*------------------------------------------------------------------- - Function: _grSstDetectResources - Date: -- - Implementor(s): Dow, Gmt, Jdt - Library: Glide - Description: - Discover devices on the PCI bus. - Discover configuration of detected devices. - Initialize all Glide GC's - - Recognized devices depend upon compile time flags - - This code should NOT initialize the hardware - any more than is necessary for discovery of - configuration - - Arguments: none - Return: - FXTRUE - at least one device was detected - FXFALSE - no devices were detected. - -------------------------------------------------------------------*/ -FxBool -_grSstDetectResources(void) -{ - InitDeviceInfo info; - int ctx, device; - FxBool rv = FXFALSE; - - GDBG_INFO((280,"_grSstDetectResources()\n")); - - initEnumHardware( 0 ); - - _GlideRoot.hwConfig.num_sst = 0; - for( ctx = 0, device = 0; - device < INIT_MAX_DEVICES; - device++ ) { - if ( initGetDeviceInfo( device, &info ) ) { -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if ( info.hwClass == INIT_VOODOO ) { - int tmu; - - _GlideRoot.hwConfig.SSTs[ctx].type = GR_SSTTYPE_VOODOO; - - _GlideRoot.GCs[ctx].base_ptr = (FxU32 *)info.hwDep.vgInfo.vgBaseAddr; - _GlideRoot.GCs[ctx].reg_ptr = (FxU32 *)info.hwDep.vgInfo.vgBaseAddr; - _GlideRoot.GCs[ctx].lfb_ptr = (FxU32 *)SST_LFB_ADDRESS(info.hwDep.vgInfo.vgBaseAddr); - _GlideRoot.GCs[ctx].tex_ptr = (FxU32 *)SST_TEX_ADDRESS(info.hwDep.vgInfo.vgBaseAddr); - _GlideRoot.GCs[ctx].slave_ptr = (FxU32 *)info.hwDep.vgInfo.slaveBaseAddr; - _GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE; - - _GlideRoot.GCs[ctx].scanline_interleaved = info.hwDep.vgInfo.sliDetect; - _GlideRoot.GCs[ctx].grSstRefresh = GR_REFRESH_NONE; - _GlideRoot.GCs[ctx].num_tmu = info.hwDep.vgInfo.nTFX; - _GlideRoot.GCs[ctx].fbuf_size = info.hwDep.vgInfo.pfxRam; - _GlideRoot.GCs[ctx].vidTimings = NULL; - - _GlideRoot.hwConfig.num_sst++; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.fbiRev = - info.hwDep.vgInfo.pfxRev; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.fbRam = - info.hwDep.vgInfo.pfxRam; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.sliDetect = - info.hwDep.vgInfo.sliDetect; - - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.nTexelfx = - info.hwDep.vgInfo.nTFX; - - for (tmu = 0; tmu < _GlideRoot.GCs[ctx].num_tmu; tmu++) { - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRam = - info.hwDep.vgInfo.tfxRam; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev = - info.hwDep.vgInfo.tfxRev; - - memset(&_GlideRoot.GCs[ctx].tmu_state[tmu], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[tmu])); - _GlideRoot.GCs[ctx].tmu_state[tmu].ncc_mmids[0] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[tmu].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[tmu].total_mem = info.hwDep.vgInfo.tfxRam<<20; - } - rv = FXTRUE; - ctx++; - } -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if ( info.hwClass == INIT_VG96 ) { - _GlideRoot.hwConfig.SSTs[ctx].type = GR_SSTTYPE_SST96; - - _GlideRoot.GCs[ctx].base_ptr = (FxU32 *)info.hwDep.vg96Info.vg96BaseAddr; - _GlideRoot.GCs[ctx].reg_ptr = (FxU32 *)SST96_REG_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].lfb_ptr = (FxU32 *)SST96_LFB_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].tex_ptr = (FxU32 *)SST96_TEX_PTR(info.hwDep.vg96Info.vg96BaseAddr); - _GlideRoot.GCs[ctx].slave_ptr = 0; - - _GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE; - _GlideRoot.GCs[ctx].grSstRefresh = GR_REFRESH_NONE; - - _GlideRoot.GCs[ctx].scanline_interleaved = FXFALSE; - _GlideRoot.GCs[ctx].num_tmu = info.hwDep.vg96Info.nTFX; - _GlideRoot.GCs[ctx].fbuf_size = info.hwDep.vg96Info.vg96Ram; - - _GlideRoot.hwConfig.num_sst++; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.nTexelfx = - info.hwDep.vg96Info.nTFX; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.fbRam = - info.hwDep.vg96Info.vg96Ram >> 20; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.tmuConfig.tmuRev = - info.hwDep.vg96Info.tfxRev; - _GlideRoot.hwConfig.SSTs[ctx].sstBoard.SST96Config.tmuConfig.tmuRam = - info.hwDep.vg96Info.tfxRam; - memset(&_GlideRoot.GCs[ctx].tmu_state[0], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[0])); - - _GlideRoot.GCs[ctx].tmu_state[0].ncc_mmids[0] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[0].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE; - _GlideRoot.GCs[ctx].tmu_state[0].total_mem = info.hwDep.vg96Info.tfxRam<<20; - - _GlideRoot.GCs[ctx].hwDep.sst96Dep.serialStatus = - (FxU32*)info.regs.hwDep.VG96RegDesc.serialStatus; - _GlideRoot.GCs[ctx].hwDep.sst96Dep.fifoApertureBase = - (FxU32*)info.regs.hwDep.VG96RegDesc.fifoApertureBase; - - initDeviceSelect( ctx ); - initSetWriteMethod( _grSst96Store32 ); - rv = FXTRUE; - ctx++; - } -#else -#error "Need to define detection parameters for this device" -#endif - } else { - break; - } - } - - return rv; -} /* _grSstDetectResources */ - - -static void -displayBoardInfo( int i, GrHwConfiguration *hwc ) -{ - if (hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) { - int tmuNum; - - GDBG_INFO((80,"SST board %d: 3Dfx Voodoo Graphics\n", i)); - GDBG_INFO((80,"\tPixelfx rev %d with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.VoodooConfig.fbiRev, - hwc->SSTs[i].sstBoard.VoodooConfig.fbRam - )); - GDBG_INFO((80,"\t%d Texelfx chips:\n", - hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx - )); - if (hwc->SSTs[i].sstBoard.VoodooConfig.sliDetect) - GDBG_INFO((80,"\tScanline Interleaved\n")); - for (tmuNum = 0; - tmuNum < hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx; - tmuNum++ ) - { - GDBG_INFO((80,"\t\tTexelfx %d: Rev %d, %d MB Texture\n", tmuNum, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRev, - hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRam - )); - } - } else if (hwc->SSTs[i].type == GR_SSTTYPE_SST96) { - GDBG_INFO((80,"SST board %d: 3Dfx Voodoo Rush\n", i)); - GDBG_INFO((80,"\tFBI Jr. with %d MB Frame Buffer\n", - hwc->SSTs[i].sstBoard.SST96Config.fbRam - )); - GDBG_INFO((80,"\tTexelfx chips: 1\n")); - - } - else - GDBG_INFO((80,"error: SSTs %d: unknown type\n",i)); -} /* displayBoardInfo */ - - -FxU32 -GR_CDECL - - -_cpu_detect_asm(void); - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#include -#endif - -void -_GlideInitEnvironment( void ) -{ - int i; - - if ( _GlideRoot.initialized ) /* only execute once */ - return; - GDBG_INIT(); /* init the GDEBUG libraray */ - GDBG_INFO((80,"_GlideInitEnvironment()\n")); - -#ifdef __WIN32__ - grErrorSetCallback(_grErrorWindowsCallback); -#else - grErrorSetCallback(_grErrorDefaultCallback); -#endif /* __WIN32__ */ - -#ifdef GLIDE_DEBUG - GDBG_INFO((0,"GLIDE DEBUG LIBRARY\n")); /* unconditional display */ -#endif - -#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { /* GMT: display the DLL pathname for sanity checking */ - char buf[132]; - if (GetModuleFileName(GetModuleHandle("glide2x.dll"),buf,sizeof(buf))) { -#ifdef GLIDE_DEBUG - GDBG_INFO((0,"DLL path: %s\n",buf)); /* unconditional display */ -#else - GDBG_INFO((80,"DLL path: %s\n",buf)); -#endif - } /* silent failure */ - } -#endif - - _GlideRoot.CPUType = _cpu_detect_asm(); - - if (getenv("FX_CPU")) _GlideRoot.CPUType = atoi(getenv("FX_CPU")); - _GlideRoot.environment.triBoundsCheck = - getenv("FX_GLIDE_BOUNDS_CHECK") != NULL; - _GlideRoot.environment.swapInterval = -1; - _GlideRoot.environment.swFifoLWM = -1; - _GlideRoot.environment.noSplash = - getenv("FX_GLIDE_NO_SPLASH") != NULL; - _GlideRoot.environment.shamelessPlug = - getenv("FX_GLIDE_SHAMELESS_PLUG") != NULL; - if (getenv("FX_GLIDE_LWM")) - _GlideRoot.environment.swFifoLWM = atoi(getenv("FX_GLIDE_LWM")); - if (getenv("FX_GLIDE_SWAPINTERVAL")) { - _GlideRoot.environment.swapInterval = - atoi(getenv("FX_GLIDE_SWAPINTERVAL")); - if (_GlideRoot.environment.swapInterval < 0) - _GlideRoot.environment.swapInterval = 0; - } - - if (getenv("FX_GLIDE_IGNORE_REOPEN")) - _GlideRoot.environment.ignoreReopen = FXTRUE; - - if (getenv("FX_GLIDE_NO_DITHER_SUB")) { - _GlideRoot.environment.disableDitherSub = FXTRUE; - } - - if (getenv("FX_SNAPSHOT")) - _GlideRoot.environment.snapshot = atoi(getenv("FX_SNAPSHOT")); - - GDBG_INFO((80," triBoundsCheck: %d\n",_GlideRoot.environment.triBoundsCheck)); - GDBG_INFO((80," swapInterval: %d\n",_GlideRoot.environment.swapInterval)); - GDBG_INFO((80," noSplash: %d\n",_GlideRoot.environment.noSplash)); - GDBG_INFO((80," shamelessPlug: %d\n",_GlideRoot.environment.shamelessPlug)); - GDBG_INFO((80," rsrchFlags: %d\n",_GlideRoot.environment.rsrchFlags)); - GDBG_INFO((80," cpu: %d\n",_GlideRoot.CPUType)); - GDBG_INFO((80," snapshot: %d\n",_GlideRoot.environment.snapshot)); - GDBG_INFO((80," disableDitherSub: %d\n",_GlideRoot.environment.disableDitherSub)); - /* GMT: BUG these are hardware dependent and really should come from the init code */ - _GlideRoot.stats.minMemFIFOFree = 0xffff; - _GlideRoot.stats.minPciFIFOFree = 0x3f; - - /* constant pool */ - _GlideRoot.pool.f0 = 0.0F; - _GlideRoot.pool.fHalf= 0.5F; - _GlideRoot.pool.f1 = 1.0F; - _GlideRoot.pool.f255 = 255.0F; - _GlideRoot.pool.f256 = 256.0F; - - _GlideRoot.current_sst = 0; /* make sure there's a valid GC */ - _GlideRoot.curGC = &_GlideRoot.GCs[0]; /* just for 'booting' the library */ - if (!_grSstDetectResources()) { - char s[128]; -#ifndef __linux__ - sprintf(s, - "_GlideInitEnvironment: glide2x.dll expected %s, none detected\n", - GLIDE_DRIVER_NAME); -#else - sprintf(s, - "_GlideInitEnvironment: libglide2x.so expected %s, none detected\n", - GLIDE_DRIVER_NAME); -#endif - GrErrorCallback(s, FXTRUE); - } - - /* GMT: this isn't really necessary since GlideRoot is static */ - for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) { - _GlideRoot.GCs[i].mm_table.free_mmid = 0; - displayBoardInfo( i, &_GlideRoot.hwConfig ); - } - - _grMipMapInit(); - _GlideRoot.initialized = FXTRUE; /* save this for the end */ - -} /* _GlideInitEnvironment */ - - - - -#if defined(GLIDE_DEBUG) - -/* GMT: tracing utilities */ - -/* STOLEN FROM SST.C */ -/*---------------------------------------------------------------------- - An array of SST register info - ----------------------------------------------------------------------*/ -typedef struct { - char *name; -} regInfo; - -static regInfo regsInfo[] = { - "STATUS", - "reserved0", - "vA.x", - "vA.y", - "vB.x", - "vB.y", - "vC.x", - "vC.y", - - "R", - "G", - "B", - "Z", - "A", - "S", - "T", - "W", - - "DRDX", - "DGDX", - "DBDX", - "DZDX", - "DADX", - "DSDX", - "DTDX", - "DWDX", - - "DRDY", - "DGDY", - "DBDY", - "DZDY", - "DADY", - "DSDY", - "DTDY", - "DWDY", - - "triangleCMD", - "reserved1", - "FvA.x", - "FvA.y", - "FvB.x", - "FvB.y", - "FvC.x", - "FvC.y", - - "FR", - "FG", - "FB", - "FZ", - "FA", - "FS", - "FT", - "FW", - - "FDRDX", - "FDGDX", - "FDBDX", - "FDZDX", - "FDADX", - "FDSDX", - "FDTDX", - "FDWDX", - - "FDRDY", - "FDGDY", - "FDBDY", - "FDZDY", - "FDADY", - "FDSDY", - "FDTDY", - "FDWDY", - - "FtriangleCMD", - "FBZCOLORPATH", - "FOGMODE", - "ALPHAMODE", - "FBZMODE", - "LFBMODE", - "CLIPLEFTRIGHT", - "CLIPBOTTOMTOP", - - "nopCMD", - "fastfillCMD", - "swapbufCMD", - "FOGCOLOR", - "ZACOLOR", - "CHROMAKEY", - "reserved2", - "reserved3", - - "STIPPLE", - "C0", - "C1", - "pixelsIN", - "chromaFAIL", - "zfuncFAIL", - "afuncFAIL", - "pixelsOUT", - - "FOGTABLE[0]", - "FOGTABLE[1]", - "FOGTABLE[2]", - "FOGTABLE[3]", - "FOGTABLE[4]", - "FOGTABLE[5]", - "FOGTABLE[6]", - "FOGTABLE[7]", - "FOGTABLE[8]", - "FOGTABLE[9]", - "FOGTABLE[10]", - "FOGTABLE[11]", - "FOGTABLE[12]", - "FOGTABLE[13]", - "FOGTABLE[14]", - "FOGTABLE[15]", - "FOGTABLE[16]", - "FOGTABLE[17]", - "FOGTABLE[18]", - "FOGTABLE[19]", - "FOGTABLE[20]", - "FOGTABLE[21]", - "FOGTABLE[22]", - "FOGTABLE[23]", - "FOGTABLE[24]", - "FOGTABLE[25]", - "FOGTABLE[26]", - "FOGTABLE[27]", - "FOGTABLE[28]", - "FOGTABLE[29]", - "FOGTABLE[30]", - "FOGTABLE[31]", - - "reserved_0", - "reserved_1", - "reserved_2", - "reserved_3", - "reserved_4", - "reserved_5", - "reserved_6", - "reserved_7", - - "PCIINTERRUPT", - "VRETRACE", - "BACKPORCH", - "VIDEODIMENS", - "FBIINIT0", - "FBIINIT1", - "FBIINIT2", - "FBIINIT3", - - "HSYNC", - "VSYNC", - "CLUTDATA", - "DACDATA", - - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - "reserved", - - "CHROMARANGE", - "CLIPLEFTRIGHT1", - "CLIPTOPBOTTOM1", - "COLBUFSETUP", - "AUXBUFSETUP", - "TEXCHIPSEL", - "SWAPPENDCMD", - "reserved96", - - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - "reserved96", - - - "TEXTUREMODE", - "TLOD", - "TDETAIL", - "TEXBASEADDR", - "TEXBASEADDR1", - "TEXBASEADDR2", - "TEXBASEADDR38", - "TREXINIT0", - - "TREXINIT1", - "NCCTABLE0[0]", - "NCCTABLE0[1]", - "NCCTABLE0[2]", - "NCCTABLE0[3]", - "NCCTABLE0[4]", - "NCCTABLE0[5]", - "NCCTABLE0[6]", - "NCCTABLE0[7]", - "NCCTABLE0[8]", - "NCCTABLE0[9]", - "NCCTABLE0[10]", - "NCCTABLE0[11]", - - "NCCTABLE1[0]", - "NCCTABLE1[1]", - "NCCTABLE1[2]", - "NCCTABLE1[3]", - "NCCTABLE1[4]", - "NCCTABLE1[5]", - "NCCTABLE1[6]", - "NCCTABLE1[7]", - "NCCTABLE1[8]", - "NCCTABLE1[9]", - "NCCTABLE1[10]", - "NCCTABLE1[11]", -}; - -#define MAXREGADDR sizeof(regsInfo)/sizeof(regInfo) - -static FxU32 last_addr = 0; /* TEX trace optimizer */ - -FxU32 GR_CDECL -_GR_GET(void *addr) -{ - GR_DCL_GC; - FxU32 chip, data, iaddr = (FxU32) addr; - - data = GET(*(FxU32 *)addr); - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - chip = (iaddr >> 10) & 0xF; - if (iaddr < 0x10000000) { /* sanity check */ - GDBG_ERROR("GET","bad address(> 2) & 0xFF; /* get offset into SST */ - ri = regsInfo+reg; - if (reg < MAXREGADDR) { - GDBG_INFO((120," GET(0x%x,%11d(0x%08x)) %d\t%s\n", - iaddr,data,data, chip,ri->name)); - } - else - GDBG_ERROR("GET","bad register address=0x%x\n", reg<<2); - } - return data; -} /* _GR_GET */ - -void GR_CDECL -_GR_SET(void *addr, unsigned long data) -{ - GR_DCL_GC; - FxU32 chip, iaddr = (FxU32) addr; - - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - if (iaddr < 0x10000000) { /* sanity check */ - GDBG_ERROR("SET","bad address(> 21) & 0x3; /* grab bits 22:21 */ - if (chip == 3) { - if (((iaddr>>17)&0x3F) == 0x31) { - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) %d\tPACKER\n", - iaddr,data,data,chip)); - } - } - else { - if (GDBG_GET_DEBUGLEVEL(195)) { /* optimized TEX data trace */ - if (iaddr == last_addr+4) - GDBG_PRINTF(("T+4 %x\n", data)); - else - GDBG_PRINTF(("TEX %x %x\n", iaddr,data)); - } - } - } - else if (iaddr & 0x400000) { /* are we in LFB territory? */ - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) 0\tLFB\n", - iaddr,data,data)); - } - else { - /* check for valid register read */ - int reg; - regInfo *ri; - - chip = (iaddr >> 10) & 0xF; - reg = (iaddr >> 2) & 0xFF; /* get offset into SST */ - ri = regsInfo+reg; - if (reg < MAXREGADDR) { - GDBG_INFO((120," SET(0x%x,%11d(0x%08x)) %d\t%s\n", - iaddr,data,data, chip,ri->name)); - } - else - GDBG_ERROR("SET","CHIP #%d bad register address=0x%x, data=%d(x%x)\n", - chip,reg<<2,data,data); - } - last_addr = iaddr; -} /* _GR_SET */ - -void GR_CDECL -_GR_SETF(void *addr, float data) -{ - _GR_SET(addr,*(unsigned long *)&data); -} /* _GR_SETF */ - -void GR_CDECL -_GR_SET16(void *addr, unsigned short data) -{ - GR_DCL_GC; - FxU32 iaddr = (FxU32)addr; - iaddr = iaddr - (FxU32)gc->base_ptr + 0x10000000; - GDBG_INFO((120," SET16(0x%x,%11d(0x%08x)) 0\tLFB16\n",iaddr,data,data)); - last_addr = 0; -} /* _GR_SET16 */ - -#endif /* defined(GLIDE_DEBUG) */ - -#if defined( GLIDE_DEBUG ) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - -extern char *regNames[]; - -static FxU32 thisMask; -static FxU32 thisWrite; -static FxU32 maxWrites; - -void GR_CDECL -_GR_SET_GW_CMD( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x7 ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x is not 8 byte aligned\n", - addr ); - } - /* validate enable bit */ - if ( ! (data&0x80000000) ) { - GDBG_ERROR( "SET GW CMD", - "Fifo command 0x%x missing flag bit\n", - data ); - } - /* validate reserved bits */ - if ( data&0x7fE00300 ) { - GDBG_ERROR( "SET GW CMD", - "Fifo command 0x%x reserved bits set!\n", - data ); - } - - GDBG_INFO((128, - "Writing Group Write Command: 0x%x\n", - data )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* dump chip field */ - { - FxU32 field = ( (data<<2) & 0xf0000 ) >> 16; - GDBG_INFO((128, " Chip Field: 0x%x\n", field )); - } - /* dump wrap field */ - { - FxU32 field = ( (data<<2) & 0x0f000 ) >> 12; - GDBG_INFO((128, " Wrap Field: 0x%x\n", field )); - } - /* dump register */ - { - FxU32 reg = ( data & 0xff ); - GDBG_INFO((128, " Register: %s(0x%x)\n", regNames[reg], reg )); - } - *(FxU32*)addr = data; -} - -void GR_CDECL -_GR_SET_GW_HEADER( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x3 ) { - GDBG_ERROR( "SET GW HEADER", - "Fifo address 0x%x is not DWORD aligned\n", - addr ); - } - GDBG_INFO((128, - "Writing Group Write Header: 0x%x\n", - data )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* validate bits - at least one must be set*/ - { - FxU32 val, bits, reg; - val = data; - bits = 0; - reg = 2; - while( val ) { - if ( val & 1 ) { - bits++; - GDBG_INFO((128, " Register: %s\n", regNames[reg] )); - } - val>>=1; - reg++; - } - GR_ASSERT( bits ); - GDBG_INFO((128, " --------------\n" )); - GDBG_INFO((128, " Total Bits: %d\n", bits )); - maxWrites = bits; - if ( maxWrites & 1 ) maxWrites++; - } - *(FxU32*)addr = data; - thisMask = data; - thisWrite = 0; -} - -void GR_CDECL -_GR_SET_GW_ENTRY( volatile void *addr, unsigned long data ) { - GR_DCL_GC; - /* validate pointer range */ - { - FxU32 min = (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoVirt; - FxU32 max = min + (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax; - if ( ((FxU32)addr) < min || ((FxU32)addr) > max ) { - GDBG_ERROR( "SET GW CMD", - "Fifo address 0x%x out of range(0x%x, 0x%x)\n", - addr, - gc->fifoData.hwDep.vg96FIFOData.fifoVirt, - gc->fifoData.hwDep.vg96FIFOData.fifoMax ); - } - - } - /* validate alignment */ - if ( ((FxU32)addr) & 0x3 ) { - GDBG_ERROR( "SET GW ENTRY", - "Fifo address 0x%x is not DWORD aligned\n", - addr ); - } - /* validate write within packet */ - if ( !thisMask || thisWrite > maxWrites ) { - GDBG_ERROR( "SET GW ENTRY", - "Group write entry attempted outside of a packet\n" ); - } - GDBG_INFO((128, - "Writing Group Write Entry\n" )); - GDBG_INFO((128, - " FIFO ADDR: 0x%.08x\n", addr )); - /* decode write */ - { - FxU32 reg, bit, write; - reg = 2; - bit = 1; - write = 0; - - while( bit ) { - if ( bit & thisMask ) { - if ( write == thisWrite ) break; - write++; - } - bit <<= 1; - reg++; - } - - if ( bit ) { - GDBG_INFO((128, - " REG: %s DATA: 0x%x(%f)\n", - regNames[reg], - data, - *(float*)&data )); - } else { - GDBG_INFO((128, - " PADDING\n" )); - } - } - *(FxU32*)addr = data; - thisWrite++; -} - -#endif /* defined( GLIDE_DEBUG) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) */ - diff --git a/glide2x/sst1/glide/src/gsplash.c b/glide2x/sst1/glide/src/gsplash.c deleted file mode 100644 index a85c4c1..0000000 --- a/glide2x/sst1/glide/src/gsplash.c +++ /dev/null @@ -1,896 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - ** $Header$ - ** $Log$ - * - * 14 12/19/97 8:09a Peter - * fog table propogation - * - * 13 7/07/97 3:05p Dow - * Moved fouled clears - * - * 12 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 11 3/16/97 12:42a Jdt - * Removed watcom warning - * - * 10 3/13/97 10:53p Jdt - * Rewrote with simple optimizations. Changed prototype for - * multi-resolution, and running as a better shameless plug. - * - * 9 3/13/97 2:52a Jdt - * Added arguments to splash. - * - * 8 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 7 3/01/97 6:24p Jdt - * Made splash force yorigin. - * - * 6 1/02/97 1:06p Dow - * Fixed state bug - * - * 3 11/17/96 11:16p Garymct - * Updated grSplash code to set all of the necessary state itself rather - * than expecting the caller to do so. - */ -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#include - -/*----------------------------- - Constants - -----------------------------*/ -#define MAX_NUM_VERTS 2556 - -#define FADEIN_END_PERCENT ( 0.3f ) -#define FADEOUT_BEGIN_PERCENT ( 0.8f ) - -#define SPIN_FRAMES 25 -#define SPIN_START 26 - -#define NO_TABLE ((GrTexTable_t)(~0)) - -/*----------------------------- - Macros - -----------------------------*/ -#define SNAP_BIAS ((float)(3<<18)) -#define SNAP_COORD(X) ((X)+SNAP_BIAS) - -/*----------------------------- - Types - -----------------------------*/ -typedef struct { - float x, y, z; /* object space coordinates */ - float nx, ny, nz; /* object space vertex normal for lighting */ - float s, t; /* pre-glide-ified texture coordinates */ -} Vert; - -typedef struct { - int v[3]; /* vertex indices into array of vertes for face */ - int mat_index; /* material index */ - int aa_edge_flags; -} Face; - -typedef float Vector[3]; -typedef float Matrix[16]; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -/*----------------------------- - Globals - -----------------------------*/ -/* xScale, xOffset, yScale, yOffset */ -static float viewPort[4] = { - 480.0f, 320.0f, - 480.0f, 240.0f -}; - -typedef struct { - GrTexInfo info; - FxU32 addr; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -static int do_phong = 0; -static int pass; -static int fog; -static int useTextures; -static Vector light = { -0.57735f, -0.57735f, -0.57735f }; -static Vector transformed_verts[MAX_NUM_VERTS]; -static Vector transformed_norms[MAX_NUM_VERTS]; - -#include "splshdat.c" - -static Texture textImage; -static Texture hiliteImage; -static Texture shadowImage; - -static FxU32 nextFreeBase; - -/*----------------------------- - Privates - -----------------------------*/ -static void sourceTexture( Texture *texture ) { - static Texture *lastTexture; - - if ( texture != lastTexture && useTextures ) { - grTexSource( GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info ); - if ( texture->tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture->tableType, - &texture->tableData ); - } - lastTexture = texture; - } -} - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} - -static void downloadTexture( Texture *texture, Gu3dfInfo *info ) { - texture->info.data = info->data; - texture->info.smallLod = info->header.small_lod; - texture->info.largeLod = info->header.large_lod; - texture->info.aspectRatio = info->header.aspect_ratio; - texture->info.format = info->header.format; - - texture->addr = nextFreeBase; - nextFreeBase += grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &texture->info ); - grTexDownloadMipMap( GR_TMU0, - texture->addr, - GR_MIPMAPLEVELMASK_BOTH, - &texture->info ); - - texture->tableType = texTableType( info->header.format ); - switch( texture->tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - texture->tableData = *(TextureTable*)(&info->table); - break; - default: - break; - } - - return; -} - -static void createTextures( void ) { - Gu3dfInfo *info; - - /* - * Download the texture for the "3D" part of the model. - */ - info = ( Gu3dfInfo * )text_3dfinfo_raw; - info->data = ( void * )text_3dfinfo_image; - - downloadTexture( &textImage, info ); - - /* - * Download the texture for the specular highlight. - */ - info = ( Gu3dfInfo * )hilite_3dfinfo_raw; - info->data = ( void * )hilite_3dfinfo_image; - downloadTexture( &hiliteImage, info ); - - /* - * Download the texture for the shadow. - */ - info = ( Gu3dfInfo * )shadow_3dfinfo_raw; - info->data = ( void * )shadow_3dfinfo_image; - downloadTexture( &shadowImage, info ); - return; -} - -static void vecMatMult( float *dstVec, float *srcVec, float *matrix ) { - dstVec[0] = - srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8] + - matrix[12]; - - dstVec[1] = - srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9] + - matrix[13]; - - dstVec[2] = - srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10] + - matrix[14]; -} - -static void normMatMult( float *dstVec, float *srcVec, float *matrix ) { - dstVec[0] = - srcVec[0] * matrix[0] + - srcVec[1] * matrix[4] + - srcVec[2] * matrix[8]; - - dstVec[1] = - srcVec[0] * matrix[1] + - srcVec[1] * matrix[5] + - srcVec[2] * matrix[9]; - - dstVec[2] = - srcVec[0] * matrix[2] + - srcVec[1] * matrix[6] + - srcVec[2] * matrix[10]; -} - -static void xfAndProj( int frame, int obj ) { - int vertex; - float *matrix; - - matrix = &mat[frame][obj][0]; - - for( vertex = 0; vertex < num_verts[obj]; vertex++ ) { - float *srcVec; - float *dstVec; - float oow; - - /* transform point */ - srcVec = (float*)&(vert[obj][vertex].x); - dstVec = (float*)transformed_verts[vertex]; - vecMatMult( dstVec, srcVec, matrix ); - - /* project point */ - oow = 1.0f / dstVec[2]; - dstVec[0] = dstVec[0] * oow * viewPort[0] + viewPort[1] + SNAP_BIAS; - dstVec[1] = dstVec[1] * oow * viewPort[2] + viewPort[3] + SNAP_BIAS; - - /* transform normal */ - srcVec = (float*)&(vert[obj][vertex].nx); - dstVec = (float*)transformed_norms[vertex]; - normMatMult( dstVec, srcVec, matrix ); - } -} - -static void setupMaterial( int material_index ) { - switch( material_index ) { - case 0: /* 3d */ - if( pass == 1 ) { - sourceTexture( &textImage ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - do_phong = 1; - } else if ( pass == 0xbeef ) { - /* Pantone 320C - 3D Green */ - grConstantColorValue( 0x00989100 ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE ); - } else { - sourceTexture( &hiliteImage ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - } - break; - case 1: /* fx */ - if ( pass == 0xbeef ) { - /* Black - fx */ - grConstantColorValue( 0x00 ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_ITERATED, - FXFALSE ); - do_phong = 1; - } else { - sourceTexture( &hiliteImage ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - do_phong = 1; - } - break; - case 2: - case 3: - case 4: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - do_phong = 0; - break; - } - return; -} - -static void calculateIntensity( int material_index, - Vector intensity_factor, - int frame ) { - switch( material_index ) { - case 0: - /* 3d */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 1: - /* fx */ - intensity_factor[0] = 0.125f; - intensity_factor[1] = 0.125f; - intensity_factor[2] = 0.125f; - break; - case 2: - /* cyan */ - intensity_factor[0] = ( 10.0f / 255.0f ); - intensity_factor[1] = ( 75.0f / 255.0f ); - intensity_factor[2] = ( 120.0f / 255.0f ); - break; - case 3: - /* white */ - intensity_factor[0] = 1.0f; - intensity_factor[1] = 1.0f; - intensity_factor[2] = 1.0f; - break; - case 4: - /* yellow */ - intensity_factor[0] = ( 248.0f / 255.0f ); - intensity_factor[1] = ( 204.0f / 255.0f ); - intensity_factor[2] = 0.0f; - break; - } -} - -static void drawFaces( int frame, int objnum ) { - int facenum; - int material_index; - float intensity_factor[3]; - GrVertex gvert[3]; - static int prev_mat_index = 0xffff; - int i; - FxBool aa_a, aa_b, aa_c; - - for( facenum = 0; facenum < num_faces[objnum]; facenum++ ) { - material_index = face[objnum][facenum].mat_index; - if( material_index != prev_mat_index ) { - setupMaterial( material_index ); - calculateIntensity( material_index, - intensity_factor, frame ); - prev_mat_index = material_index; - } - - if( ( material_index != 0 ) && ( pass == 2 ) ) - continue; - - aa_a = aa_b = aa_c = FXFALSE; - if( face[objnum][facenum].aa_edge_flags & 4 ) - aa_a = FXTRUE; - if( face[objnum][facenum].aa_edge_flags & 2 ) - aa_b = FXTRUE; - if( face[objnum][facenum].aa_edge_flags & 1 ) - aa_c = FXTRUE; - - for( i = 0; i < 3; i++ ) { - float *transformed_vert, *transformed_norm; - Vert *v; - int vertnum; - float factor; - - vertnum = face[objnum][facenum].v[i]; - transformed_vert = transformed_verts[vertnum]; - transformed_norm = transformed_norms[vertnum]; - v = &vert[objnum][vertnum]; - - gvert[i].x = transformed_vert[0]; - gvert[i].y = transformed_vert[1]; - gvert[i].oow = 1.0f / transformed_vert[2]; - gvert[i].tmuvtx[0].oow = gvert[i].oow; - gvert[i].tmuvtx[0].sow = v->s * gvert[i].oow; - gvert[i].tmuvtx[0].tow = v->t * gvert[i].oow; - - factor = - ( ( light[0] * transformed_norm[0] + - light[1] * transformed_norm[1] + - light[2] * transformed_norm[2] ) + 1.0f ) * 127.5f; - - gvert[i].r = factor * intensity_factor[0]; - gvert[i].g = factor * intensity_factor[1]; - gvert[i].b = factor * intensity_factor[2]; - gvert[i].a = 255.0f; - } - - if( pass == 2 ) { - for( i = 0; i < 3; i++ ) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - ( 128.0f + transformed_norm[0] * 128.0f ); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - ( 128.0f + transformed_norm[1] * 128.0f ); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - - grDrawTriangle( &gvert[0], &gvert[1], &gvert[2] ); - - continue; - } - - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - /* Do this if 3D. */ - if( material_index == 0 ) { - /* - * Draw the textured 3D without specular. - */ - sourceTexture( &textImage ); -#if 0 - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); -#endif - grAADrawTriangle( &gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c ); - } else if( material_index != 1 ) { - /* - * Just go ahead and draw for things that don't - * have specular highlights. - */ - grAADrawTriangle( &gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c ); - } - - if( do_phong && ( material_index != 0 ) ) { - /* - * figure out texture coords in [0..255.0f] based on the normal - * the specular highlight. - */ - for( i = 0; i < 3; i++ ) { - float *transformed_norm; - - transformed_norm = - transformed_norms[face[objnum][facenum].v[i]]; - - gvert[i].tmuvtx[0].sow = gvert[i].oow * - ( 128.0f + transformed_norm[0] * 128.0f ); - gvert[i].tmuvtx[0].tow = gvert[i].oow * - ( 128.0f + transformed_norm[1] * 128.0f ); - - gvert[i].r = intensity_factor[0] * 255.0f; - gvert[i].g = intensity_factor[1] * 255.0f; - gvert[i].b = intensity_factor[2] * 255.0f; - } - grAADrawTriangle( &gvert[0], &gvert[1], &gvert[2], - aa_a, aa_b, aa_c ); - } - } -} - -static void intersectLineWithZPlane( Vector result, Vector p1, - Vector p2, float z ) { - float t; - - t = ( z - p1[2] ) / ( p2[2] - p1[2] ); - result[0] = p1[0] + ( p2[0] - p1[0] ) * t; - result[1] = p1[1] + ( p2[1] - p1[1] ) * t; - result[2] = z; -} - -static float vectorMag( float *v ) { - return ( float )sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] ); -} - -static void drawShadow( int frame, int shadow_object_index, - int receiver_object_index, Vector light_position ) { - float *shadow_object_matrix; - float *receiver_object_matrix; - Vector view_verts[4]; - Vector projected_view_verts[4]; - int i; - - Vector local_verts[4] = { - { -280.0f, 0.0f, -160.0f }, - { -280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, 150.0f }, - { 280.0f, 0.0f, -160.0f } - }; - - float texcoords[4][2] = { - { 10.5f, 127.5f }, - { 10.5f, 0.5f }, - { 255.0f, 0.5f }, - { 255.0f, 127.5f } - }; - - GrVertex gvert[4]; - GrVertex projected_gvert[4]; - GrVertex light_gvert; - - /* - * The point relative to the back part of the shield that - * the shadow is going to be projected onto. - */ - Vector shadow_light; - - shadow_light[0] = light_position[0]; - shadow_light[1] = light_position[1]; - shadow_light[2] = light_position[2]; - - shadow_object_matrix = &mat[frame][shadow_object_index][0]; - receiver_object_matrix = &mat[frame][receiver_object_index][0]; - - /* - * Offset the light by the Z position of - * the backplane that we are projected - * onto. - */ - shadow_light[2] += receiver_object_matrix[14]; - - for( i = 0; i < 4; i++ ) { - vecMatMult( view_verts[i], local_verts[i], shadow_object_matrix ); - - /* - * project . . . - */ - gvert[i].oow = 1.0f / view_verts[i][2]; - gvert[i].x = - view_verts[i][0] * gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS; - gvert[i].y = - view_verts[i][1] * gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS; - - /* - * Set up texture coordinates. - */ - gvert[i].tmuvtx[0].sow = texcoords[i][0] * gvert[i].oow; - gvert[i].tmuvtx[0].tow = texcoords[i][1] * gvert[i].oow; - } - - - /* - * Intersect each line formed by the light source and a - * particular corner of the shadow object with the - * plane which the texture is to be projected onto. - */ - for( i = 0; i < 4; i++ ) { - Vector tmpvect; - float q; - - intersectLineWithZPlane( projected_view_verts[i], - shadow_light, - view_verts[i], - receiver_object_matrix[14] - 26.0f ); - projected_gvert[i].oow = 1.0f / projected_view_verts[i][2]; - projected_gvert[i].x = - projected_view_verts[i][0] * projected_gvert[i].oow * viewPort[0] + - viewPort[1] + SNAP_BIAS; - projected_gvert[i].y = - projected_view_verts[i][1] * projected_gvert[i].oow * viewPort[2] + - viewPort[3] + SNAP_BIAS; - - tmpvect[0] = projected_view_verts[i][0] - shadow_light[0]; - tmpvect[1] = projected_view_verts[i][1] - shadow_light[1]; - tmpvect[2] = projected_view_verts[i][2] - shadow_light[2]; - q = vectorMag( tmpvect ); - - /* - * Set up texture coordinates. - */ - projected_gvert[i].tmuvtx[0].oow = projected_gvert[i].oow * q; - projected_gvert[i].tmuvtx[0].sow = - texcoords[i][0] * projected_gvert[i].oow; - projected_gvert[i].tmuvtx[0].tow = - texcoords[i][1] * projected_gvert[i].oow; - } - - light_gvert.oow = 1.0f / shadow_light[2]; - light_gvert.x = shadow_light[0] * light_gvert.oow * viewPort[0] + - viewPort[1] + SNAP_BIAS; - light_gvert.y = shadow_light[1] * light_gvert.oow * viewPort[2] + - viewPort[3] + SNAP_BIAS; - - /* - * Draw a segment between the light and the point which hits - * the surface that the light is being projected onto. - */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - sourceTexture( &shadowImage ); - - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - - grDrawTriangle( &projected_gvert[0], - &projected_gvert[1], - &projected_gvert[2] ); - grDrawTriangle( &projected_gvert[0], - &projected_gvert[2], - &projected_gvert[3] ); - grDrawTriangle( &projected_gvert[0], - &projected_gvert[2], - &projected_gvert[1] ); - grDrawTriangle( &projected_gvert[0], - &projected_gvert[3], - &projected_gvert[2] ); - - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - -} - - -/*------------------------------------------------------------------- - Function: grSplash - Date: 3/13 - Implementor(s): GaryMcT - Library: Glide - Description: - Render the opening splash screen animation, or render - a single frame of the splash screen. - Arguments: - x, y - upper left hand coord of window - w, h - width and height of window to render - _frame - frame number to render ( ~0 to render all frames ) - Return: - none - -------------------------------------------------------------------*/ -GR_DIENTRY(grSplash,void,(float x,float y,float w,float h,FxU32 _frame)) -{ - GrState oldState; - int frame; - Vector lights[] = { - { 5.0f, 300.0f, -1500.0f }, - { 5.0f, 150.0f, -1000.0f }, - { -30.0f, 150.0f, -1000.0f }, - { -30.0f, 100.0f, -1000.0f }, - { 30.0f, 70.0f, -1000.0f }, - }; - GrFog_t fogTable[kInternalFogTableEntryCount]; - int fadeInFrames, fadeOutFrames; - - GR_BEGIN_NOFIFOCHECK( "grSplash", 85 ); - GDBG_INFO_MORE((gc->myLevel,"(%f,%f,%f,%f,%d)\n", - x, y, w, h, _frame )); - - /* Check Screen Dimensions and Check Avail of Depth Buffer */ - if ( (x > gc->state.screen_width) || - ((x+w) > gc->state.screen_width) || - ( y > gc->state.screen_height ) || - ((y+h) > gc->state.screen_height ) ) - return; - if ( gc->state.screen_height == 640 ) { - if ( gc->fbuf_size == 1 ) { - return; - } - } else if ( gc->state.screen_width == 800 ) { - if ( ( gc->fbuf_size == 1 ) || - ( gc->fbuf_size == 2 ) ) { - return; - } - } - - if ( !(gc->state.fbi_config.fbzMode & SST_YORIGIN) ) { - y = (( gc->state.screen_height - 1.0f ) - (h-1.0f) ) - y; - } - - viewPort[0] = w * ( 480.0f / 640.0f ); - viewPort[1] = x + ( w / 2.0f ); - viewPort[2] = h; - viewPort[3] = y + ( h / 2.0f ); - - grGlideGetState(&oldState); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - if ( _frame == 0 ) { - createTextures(); - useTextures = 1; - } else { - useTextures = 0; - } - - grAlphaTestFunction( GR_CMP_ALWAYS ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grConstantColorValue( 0xffffffff ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthMask( FXTRUE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - if ( useTextures ) - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - else - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE, - FXTRUE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grDepthBufferFunction( GR_CMP_LEQUAL ); - grCullMode( GR_CULL_NEGATIVE ); - // grClipWindow( (int)x, (int)y, (int)(x+w), (int)(y+h) ); - grFogColorValue( 0x0 ); - - fadeInFrames = (int)(((float)total_num_frames) * FADEIN_END_PERCENT); - fadeOutFrames = (int)(((float)total_num_frames) * - (1.0f - FADEOUT_BEGIN_PERCENT)); - - if ( _frame == 0 ) { /* Render Whole Animation */ - for( frame = 1; frame < total_num_frames; frame++ ) { - int i; - - /* Set Fog Value For This Frame */ - if( frame < fadeInFrames ) { - unsigned char fval = - ((unsigned char)255) - - ((unsigned char)( 255.0f * - (float)(frame+1) / - (float)fadeInFrames )); - for( i = 0; i < kInternalFogTableEntryCount; i++ ) - fogTable[i] = fval; - grFogMode( GR_FOG_WITH_TABLE ); - grFogTable( fogTable ); - fog = 1; - } else if( frame > total_num_frames-fadeOutFrames ) { - unsigned char fval = - ((unsigned char)255) - - (unsigned char)(255.0f* - ((float)(total_num_frames-frame))/ - ((float)fadeOutFrames)); - for( i = 0; i < kInternalFogTableEntryCount; i++ ) - fogTable[i] = fval; - grFogMode( GR_FOG_WITH_TABLE ); - grFogTable( fogTable ); - fog = 1; - } else { - grFogMode( GR_FOG_DISABLE ); - fog = 0; - } - grBufferClear( 0x00000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - pass = 1; - - /* - * Avoid Z-aliasing between the shield and the 3dfx by - * not writing Z for the shield. - */ - - grDepthMask( FXFALSE ); - /* cyan part of shield */ - xfAndProj( frame, 2 ); - drawFaces( frame, 2 ); - - /* yellow and white part of shield. */ - xfAndProj( frame, 0 ); - drawFaces( frame, 0 ); - - /* - * Reanable writes to the depth-buffer. - */ - grDepthMask( FXTRUE ); - - /* - * Draw the shadow projected from the 3Dfx logo onto - * the rest of the powershield. - */ - grDepthBufferFunction( GR_CMP_ALWAYS ); - grFogMode( GR_FOG_DISABLE ); - drawShadow( frame, 1, 0, lights[0] ); - if ( fog ) grFogMode( GR_FOG_WITH_TABLE ); /* hack around mp fog */ - grDepthBufferFunction( GR_CMP_LEQUAL ); - - /* 3Dfx logo */ - xfAndProj( frame, 1 ); - drawFaces( frame, 1 ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - pass = 2; - drawFaces( frame, 1 ); - pass = 1; - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grBufferSwap( 2 ); - } - } else { /* Render One Frame */ - frame = ((_frame>>1) % SPIN_FRAMES)+SPIN_START; - - grColorMask( FXFALSE, FXFALSE ); - grBufferClear( 0x00000000, 0, GR_WDEPTHVALUE_FARTHEST ); - grColorMask( FXTRUE, FXFALSE ); - - pass = 0xbeef; - - /* 3Dfx logo */ - xfAndProj( frame, 1 ); - drawFaces( frame, 1 ); - } - - /* - * Clean up after yourself! - */ - grGlideSetState(&oldState); - -} - - diff --git a/glide2x/sst1/glide/src/gsst.c b/glide2x/sst1/glide/src/gsst.c deleted file mode 100644 index 07645f8..0000000 --- a/glide2x/sst1/glide/src/gsst.c +++ /dev/null @@ -1,1423 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -** 79 7/06/98 3:05p Peter -** grSstWinOpen fails triple buffering -** -** 78 6/04/98 12:13p Peter -** splash dll rename -** -** 77 3/16/98 3:20p Atai -** fixed glide in a window bug. OEM DLL code bails out if res can not be -** found -** -** 76 3/02/98 10:42a Atai -** remove oemvidtiming for DOS -** -** 75 2/24/98 10:59a Atai -** modify for oem dll -** -** 74 2/23/98 11:03a Peter -** -** 73 2/12/98 8:21p Pgj -** -** 72 2/12/98 6:48p Atai -** fix typo -** -** 71 2/12/98 4:01p Atai -** change refresh rate if oemdll updated for tv out - * - * 70 1/12/98 10:25p Dow - * H3D Stereo Support - * - * 69 1/06/98 3:44p Atai - * fixed tv out related stuff for dos build. - * - * 68 12/19/97 11:04a Atai - * oeminit dll stuff - * - * 67 12/19/97 10:23a Dow - * Splash Screen stuff - * - * 66 12/03/97 9:36a Dow - * Fixed bug in grSstIsBusy() - * - * 65 12/02/97 7:20p Dow - * Added code for new splash screen - * - * 64 10/21/97 8:20p Atai - * added parameter for vid timing - * - * 63 10/06/97 1:14p Atai - * fix bug 824. added sli resolution checking - * - * 62 9/19/97 1:24p Peter - * more test27 fun - * - * 61 9/11/97 1:33p Atai - * In grSstWinOpen(), checking (nColBuffers+nAuxBuffers) for - * GR_RESOLUTION_800x600 and GR_RESOLUTION_856x480 - * - * 60 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 59 9/07/97 12:25p Pgj - * - * 58 9/07/97 12:14p Pgj - * fix bug 697 - * - * 57 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 56 7/09/97 10:18a Dow - * Further Nudge Of Love adjustments - * - * 55 7/07/97 3:05p Dow - * Moved some state BEFORE splash screen - * - * 54 6/26/97 3:09p Dow - * removed warning - * - * 53 6/24/97 3:40p Dow - * Protected Nude of Love - * - * 52 6/22/97 10:19a Dow - * Set cpuType filed inf fifoInfo before calling initEnableTransport - * - * 51 6/21/97 1:05p Dow - * Made it use the NUDGE_OF_LOVE macro - * - * 50 6/21/97 12:15p Dow - * Moved 128 DWORD nudge of love into grSstStatus() - * - * 49 6/21/97 11:39a Dow - * Fixed debug assertion - * - * 48 6/19/97 7:35p Dow - * More P6 Stuff - * - * 47 6/11/97 5:30p Pgj - * fix bug 594 (grSstPerfStats() returns inaccurate data on SLI systems) - * - * 46 6/05/97 11:15p Pgj - * - * 45 5/30/97 8:53a Dow - * Protected int10Called set in grSstWinOpen - * - * 44 5/28/97 2:11p Dow - * int10h handler - * - * 43 5/27/97 2:03p Dow - * added check for new env variable - * - * 42 5/22/97 11:25a Dow - * Fixed bogus polling for idle. - * - * 41 5/21/97 9:52a Jdt - * Added grSstControl() implementation for SST-1. - * - * 40 5/05/97 2:22p Dow - * Protected previous checkin with SST96 to avoid errors when compiling - * SST1 - * - * 39 5/05/97 1:35p Dow - * Changed grSstControl to modify clip1 instead of clip0 - * - * 38 5/04/97 12:48p Dow - * made grSstControl change clipLeftRight and clipBottomTop via direct - * writes. - * - * 37 5/02/97 2:11p Pgj - * screen_width/height now FxU32 - * - * 36 4/15/97 12:59p Dow - * Fixed clipping problem - * - * 35 4/13/97 8:11p Jdt - * Change in init.h - * - * 34 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 33 3/20/97 2:18a Dow - * added a fixme - * - * 32 3/19/97 10:43p Dow - * windowsInit stuff - * - * 31 3/19/97 1:37a Jdt - * Added some stride computation - * - * 30 3/18/97 9:55p Jdt - * Moved resolution guessing into init lib. - * - * 29 3/17/97 6:28a Jdt - * Rewrite of grSstWinOpen with new init code in mind. - * - * 28 3/16/97 12:39a Jdt - * Moved over to serialstatus stored in hwDep... - * - * 27 3/14/97 2:36a Murali - * Removed printfs(), and GDBG_INFO won't work at this stage. - * - * 26 3/13/97 11:02p Jdt - * Added new splash in. - * - * 25 3/13/97 5:54a Murali - * Second set of changes for WinGlide. - * - * 24 3/13/97 2:51a Jdt - * First step towards windowed splash - * - * 23 3/05/97 2:18p Murali - * Preliminary changes for Glide in a window. - * - * 22 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 21 2/26/97 11:58a Jdt - * Fixed grsstopen and grSstorigin - * - * 20 2/19/97 4:41p Dow - * Changed status read to use serial status on SST96 - * - * 19 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 18 1/14/97 10:48a Dow - * Modified grSstStatus to work w/ VG96 - * Made grSstIdle work with either VG or VG96 (via Init HAL) - * - * 17 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 16 11/24/96 9:35a Tarolli - * it now calls sst1InitNumBoardsInSystem(); instead of doing the work - * itself - * - * 15 11/15/96 4:05p Jdt - * Dllable for vg96 -** -*/ - -#include -#include -#include <3dfx.h> - -#include -#include - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -#include -#endif - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) -#define WIN32_LEAN_AND_MEAN -#include "oeminit.h" /* NEVER used by DOS */ -#include -#endif - -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && (GLIDE_PLATFORM & GLIDE_HW_SST96) && defined(GLIDE_DEBUG) -#include - /* int 10h interrupt handler */ -void __interrupt __far -_grInt10Handler() { -#define FN_NAME "_grInt10Handler" - GR_DCL_GC; - - gc->hwDep.sst96Dep.int10Called = FXTRUE; - -#undef FN_NAME -} /* _grInt10Handler */ -#endif - - -#ifdef H3D -#include -#define F_PATTERN 0 // flippy pattern (sst96) -#define T_PATTERN 1 // tippy pattern (sst1) - -typedef struct patColor_t { unsigned char r,g,b; } patColor; - -#define PAT_BLACK {0,0,0} -#define PAT_RED {255,0,0} -#define PAT_GREEN {0,255,0} -#define PAT_YELLOW {255,255,0} - -static h3dRez[]={240,300}; -#define H3DHEIGHT_FROM_REZ(r) (h3dRez[(r)-GR_RESOLUTION_AUTOFLIPPED_MIN]) - -static GrState defstate; // default winopen state - -static patColor sigPattern[] = { // signature color pattern - PAT_RED,PAT_RED,PAT_RED,PAT_RED,PAT_GREEN,PAT_YELLOW,PAT_YELLOW -}; - -static patColor disableColor[2] = {PAT_BLACK,PAT_BLACK}; // turn off adapter - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -static patColor enableColor[2] = {PAT_YELLOW,PAT_BLACK}; // use top and bottom mode 1 -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -static patColor enableColor[2] = {PAT_GREEN,PAT_BLACK}; // use pageflip mode -#endif -static patColor enableColor2[2] = {PAT_YELLOW,PAT_GREEN}; // use top and bottom mode 2 - -// TODO : get key value for tb mode 1/2 -static int getGetIntKeyValue(char * key) { -// RegCreateKeyEx(); - return 1; // use mode 1 -}; - -// TODO: should use _grSwizzleColor(...) -static unsigned long patColorToGR(patColor clr, GrColorFormat_t fmt) { - switch (fmt) { - case GR_COLORFORMAT_ARGB: - return ((unsigned long)(255<<24)|(unsigned long)(clr.r<<16)|((unsigned long)clr.g<<8)|(clr.b)); - case GR_COLORFORMAT_ABGR: - return ((unsigned long)(255<<24)|(unsigned long)(clr.b<<16)|((unsigned long)clr.g<<8)|(clr.r)); - case GR_COLORFORMAT_RGBA: - return ((unsigned long)(clr.r<<24)|(unsigned long)(clr.g<<16)|((unsigned long)clr.b<<8)|(255)); - case GR_COLORFORMAT_BGRA: - return ((unsigned long)(clr.b<<24)|(unsigned long)(clr.g<<16)|((unsigned long)clr.r<<8)|(255)); - } -} - -static void drawlinefb(GrVertex * lineLeft, GrVertex * lineRight) { - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - grDrawLine(lineLeft, lineRight); - grRenderBuffer(GR_BUFFER_BACKBUFFER); - grDrawLine(lineLeft, lineRight); -} - -static void initState(void) { - grAlphaBlendFunction( GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0 ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grConstantColorValue( ( FxU32 ) ~0 ); - _grColorCombineDelta0Mode( FXFALSE ); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask( FXTRUE, FXFALSE ); - grCullMode( GR_CULL_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthMask( FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grDepthBiasLevel( 0 ); - grDitherMode( GR_DITHER_4x4 ); - grFogMode( GR_FOG_DISABLE ); - grFogColorValue( 0x00000000 ); - grDisableAllEffects(); -} - -void setAutoflip(int enable) { - GrVertex lineLeft, lineRight; - GrState state; - int scrWidth = grSstScreenWidth(); - int line; - MSG msg; - GrColorFormat_t format; - static firstupdate = 1; - extern void initAT3DSetTiles(FxU32 PageFlipping, FxU32 nBuffers); - GR_DCL_GC; - - // wait for the window messages to flush - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - grGlideGetState(&state); // save the app. state - - initState(); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if (firstupdate) { - initAT3DSetTiles(0,gc->state.num_buffers); - firstupdate = 0; - } /* TODO:: setup regs for non-pageflipping seems to fix fb alignment... */ - if (enable) { - grSstIdle(); - initAT3DSetTiles(1,gc->state.num_buffers); - } /* setup regs for pageflipping */ -#endif - - grDepthBufferFunction( GR_CMP_ALWAYS ); - grDepthMask( FXFALSE ); - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, - FXFALSE ); - - format = state.color_format; - lineLeft.x = 0.f; - lineRight.x = (float)scrWidth-1; - lineLeft.z = lineRight.z = 0.f; - lineLeft.ooz = lineRight.ooz = 65535.f; -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - lineLeft.y = lineRight.y = 2.f; -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - lineLeft.y = lineRight.y = grSstScreenHeight() - H3DHEIGHT_FROM_REZ(gc->grSstRez) + 2.f; -#endif - - grColorMask(FXTRUE,0); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grClipWindow(0,0,grSstScreenWidth(),grSstScreenHeight()); - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - grRenderBuffer(GR_BUFFER_BACKBUFFER); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - grBufferSwap(1); - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - grSstOrigin(GR_ORIGIN_UPPER_LEFT); - - for (line = 0; line < 7; line++) { - grConstantColorValue( patColorToGR(sigPattern[line],format) ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - - grConstantColorValue( 0 ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - } - - for (line = 0; line < 2; line++) { - grConstantColorValue( patColorToGR(enable?(getGetIntKeyValue("\\SOFTWARE\\H3D\\TBMODE")==1?enableColor[line]:enableColor2[line]):disableColor[line],format) ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - - grConstantColorValue( 0 ); - drawlinefb(&lineLeft, &lineRight); - lineLeft.y = ++lineRight.y; - } - - // wait for adapter sync-up -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - for(line = 40; line>0; line--) { -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - for(line = 20; line>0; line--) { -#endif - grBufferSwap(1); - } - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - if (!enable) { - // grSstIdle(); - initAT3DSetTiles(0,gc->state.num_buffers); - } // setup regs for non-pageflipping -#endif - - line = 50000; - while ((grBufferNumPending() > 2) && (--line)); - - grGlideSetState(&state); // restore app. state - - // restore -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - if (GR_RESOLUTION_IS_AUTOFLIPPED(gc->grSstRez)) { - if (enable==1) { - switch (gc->grSstRez) { - case GR_RESOLUTION_640x240_AUTOFLIPPED: - gc->state.screen_height = 502; - break; - case GR_RESOLUTION_800x300_AUTOFLIPPED: - gc->state.screen_height = 620; - break; - } - } else { - switch (gc->grSstRez) { - case GR_RESOLUTION_640x240_AUTOFLIPPED: - gc->state.screen_height = 480; - case GR_RESOLUTION_800x300_AUTOFLIPPED: - gc->state.screen_height = 600; - } - } - grClipWindow(0,0,grSstScreenWidth(),grSstScreenHeight()); - } -#endif -} - -#endif - -/*------------------------------------------------------------------- - Function: grSstWinOpen - Date: 3/16 - Implementor(s): dow, gmt, murali, jdt - Library: Glide - Description: - - Initialize the selected SST - - Initialization has 4 Steps - - Video Init - - In the full screen case this includes setting the requested - resolution/refresh state and allocating any necessary OS - resource for the GC. - - In the windowed case, this involves acquiring all necessary - surfaces for rendering, back buffer and memory fifo - - Also perform any work necessary to enable access to 3D - registers - - Command Transport Init: - Assuming video registers are in a reset state, initialize - the appropriate command transport mechanism. All writes - to hardware prior to this action are direct writes, - afterwards, most commands will go throught the command - transport - - GC Init - - Initialize the current GC based on the user requested - open parameters and command transport data reported - during initialization. - - 3D State Init - - Push an initial state onto all of the 3D state registers. - - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer ( unsup ) - Return: - FXTRUE - glide successfully acquired the necessary resources and a - is ready for rendering - FXFALSE - glide was unsuccessful in getting the necessary resources, - or the requested configuration is unavailble on the host - hardware - any calls to glide rendering routines will result - in undefined behavior. - -------------------------------------------------------------------*/ -GR_ENTRY(grSstWinOpen, FxBool, ( - FxU32 hWnd, - GrScreenResolution_t resolution, - GrScreenRefresh_t refresh, - GrColorFormat_t format, - GrOriginLocation_t origin, - int nColBuffers, - int nAuxBuffers)) -{ - FxBool rv = FXTRUE; - int tmu; - InitFIFOData fifoInfo; - int xres, yres, fbStride; -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - FARPROC - oemInitMapBoard = NULL, - oemInitSetVideo = NULL, - oemInitVideoTiming = NULL; - OemInitInfo oemi; - sst1VideoTimingStruct *sstVideoRez = NULL, tvVidtiming; - FxBool oemvidtiming = FXFALSE; - FxU32 tvVidtiming_refreshRate = refresh; -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - GR_BEGIN_NOFIFOCHECK("grSstWinOpen",80); - GDBG_INFO_MORE((gc->myLevel, - "(rez=%d,ref=%d,cformat=%d,origin=%s,#bufs=%d, #abufs=%d)\n", - resolution,refresh,format, - origin ? "LL" : "UL", - nColBuffers, nAuxBuffers)); - GR_CHECK_F("grSstWinOpen", !gc, "no SST selected as current (gc==NULL)"); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) - /* The current init code does not do triple buffering, and we would - * have the same bug as v2 for lfb reads when triple buffering if - * we added this back. - */ - rv = (nColBuffers < 3); - if (!rv) { - GDBG_INFO(( gc->myLevel, - "grSstWinOpen failed because sst1 cannot really triple buffer\n")); - goto BAILOUT; - } -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST1) */ - - if (!_GlideRoot.environment.ignoreReopen) - GR_CHECK_F("grSstWinOpen", gc->open, "gc opened twice!" ); - - /* If we've been closed via grSstWinClose then we need to re-init - * the hw registers etc before init-ing video etc or bad ju-ju is - * in our future. - */ - if (gc->closedP) { - gc->closedP = FXFALSE; - if (!(pciOpen() && - (initMapBoard(_GlideRoot.current_sst) != NULL))) return FXFALSE; - } - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) && (!defined(GLIDE_DEBUG) || (GLIDE_DEBUG == 0)) - /* - ** load fxoem2x.dll and map board - */ - oemi.version = OEMINIT_VERSION; - oemi.vendorID = sst1BoardInfo[_GlideRoot.current_sst].vendorID; - oemi.deviceID = sst1BoardInfo[_GlideRoot.current_sst].deviceID; - oemi.boardID = OEMINIT_INVALID_BOARD_ID; - oemi.subvendorID = OEMINIT_INVALID_BOARD_ID; - oemi.linearAddress = gc->base_ptr; - oemi.slaveAddress = NULL; - if (gc->oemInit = LoadLibrary("fxoem2x.dll")) { - if (oemInitMapBoard = GetProcAddress(gc->oemInit, "_fxoemInitMapBoard@4")) { - oemInitMapBoard(&oemi); - } - } -#if defined(FX_OEM_BUILD) && !defined(FX_STATIC_BUILD) - else { - GrErrorCallback("Missing fxoem2x.dll", FXTRUE); - grSstWinClose(); - exit(0); - } -#endif /* FX_STATIC_BUILD */ -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) && (!defined(GLIDE_DEBUG) || (GLIDE_DEBUG == 0)) */ - - /*------------------------------------------------------ - Validate and Parse Arguments - ------------------------------------------------------*/ - /* - FIXME!! jdt - - There needs to be one large table of resolutions vs. - nColBuffers vs. nAuxBuffers that specifies required - ram and vald/invalid configurations - */ -#define SLI_DETECT _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.sliDetect - - if ((!SLI_DETECT) && - ((gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_800x600 && - (nColBuffers+nAuxBuffers) >= 3 ) || - (gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_856x480 && - (nColBuffers+nAuxBuffers) >= 3 ) || - (gc->fbuf_size <= 2 && - resolution == GR_RESOLUTION_960x720 ) )) - { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal screen resolution or " - "insufficient memory\n" )); - rv = FXFALSE; - goto BAILOUT; - } - -#ifdef H3D - if (!GR_RESOLUTION_IS_AUTOFLIPPED(resolution)) { -#endif - if ((resolution < GR_RESOLUTION_MIN) || - ((resolution > GR_RESOLUTION_MAX) && - (resolution != GR_RESOLUTION_NONE )) ) { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal screen resolution\n" )); - rv = FXFALSE; - goto BAILOUT; - } -#ifdef H3D - } else { // is autoflipped resolution - if ((resolution < GR_RESOLUTION_AUTOFLIPPED_MIN) || - (resolution > GR_RESOLUTION_AUTOFLIPPED_MAX) ) { - GDBG_INFO(( gc->myLevel, "grSstWinOpen failed " - "for illegal autoflipped screen resolution\n" )); - rv = FXFALSE; - goto BAILOUT; - } - } -#endif - -#if ( 1 ) - /*------------------------------------------------------ - Video Init - ------------------------------------------------------*/ -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - /* - ** initialize video timing data for oemdll - ** if tv out component exist, the oem dll need to modify the vidtiming - ** data in oemi. Glide will take the changes and pass it to - ** sst1InitVideoBuffers() - */ - { - if((sstVideoRez = sst1InitFindVideoTimingStruct(resolution,refresh))) { - tvVidtiming = *sstVideoRez; - oemi.vid.res = resolution; - oemi.vid.refresh = refresh; - oemi.vid.depth = 16; - oemi.vid.hSyncOn = tvVidtiming.hSyncOn; - oemi.vid.hSyncOff = tvVidtiming.hSyncOff; - oemi.vid.vSyncOn = tvVidtiming.vSyncOn; - oemi.vid.vSyncOff = tvVidtiming.vSyncOff; - oemi.vid.hBackPorch = tvVidtiming.hBackPorch; - oemi.vid.vBackPorch = tvVidtiming.vBackPorch; - oemi.vid.xDimension = tvVidtiming.xDimension; - oemi.vid.yDimension = tvVidtiming.yDimension; - oemi.vid.clkFreq16bpp = tvVidtiming.clkFreq16bpp; - oemi.vid.clkFreq24bpp = tvVidtiming.clkFreq24bpp; - - if (gc->oemInit) { - if ((oemInitVideoTiming = GetProcAddress(gc->oemInit, "_fxoemInitVideoTiming@4")) && - (oemInitMapBoard)) - oemvidtiming = oemInitVideoTiming(&oemi); - /* - ** video timing is updated by oem dll - */ - if (oemvidtiming) { - tvVidtiming.hSyncOn = oemi.vid.hSyncOn; - tvVidtiming.hSyncOff = oemi.vid.hSyncOff; - tvVidtiming.vSyncOn = oemi.vid.vSyncOn; - tvVidtiming.vSyncOff = oemi.vid.vSyncOff; - tvVidtiming.hBackPorch = oemi.vid.hBackPorch; - tvVidtiming.vBackPorch = oemi.vid.vBackPorch; - tvVidtiming.xDimension = oemi.vid.xDimension; - tvVidtiming.yDimension = oemi.vid.yDimension; - tvVidtiming.clkFreq16bpp = oemi.vid.clkFreq16bpp; - tvVidtiming.clkFreq24bpp = oemi.vid.clkFreq24bpp; - } - } - } - } -#endif - GDBG_INFO((gc->myLevel, " Video Init\n" )); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (oemvidtiming) - rv = initSetVideo( hWnd, resolution, - oemi.vid.refresh, format, origin, - nColBuffers, nAuxBuffers, - &xres, &yres, &fbStride, &tvVidtiming ); - else -#endif - rv = initSetVideo( hWnd, resolution, - refresh, format, origin, - nColBuffers, nAuxBuffers, - &xres, &yres, &fbStride, _GlideRoot.GCs[_GlideRoot.current_sst].vidTimings ); - if ( !rv ) goto BAILOUT; - GDBG_INFO((gc->myLevel, - " Video init succeeded. xRes = %.04d, yRes = %.04d\n", - xres, yres )); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - if ((oemInitSetVideo = GetProcAddress(gc->oemInit, "_fxoemInitSetVideo@4")) && - (oemInitMapBoard)) - oemInitSetVideo(&oemi); - } -#endif - - /*------------------------------------------------------ - Command Transport Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " Command Transport Init\n" )); - - /* Set up FifoInfo with CPU Type so that init code knows if it needs - to advance the write pointer beyond the read pointer for P6 */ - - fifoInfo.cpuType = _GlideRoot.CPUType; - - rv = initEnableTransport( &fifoInfo ); - if ( !rv ) goto BAILOUT; - - gc->nopCMD = FXFALSE; - -# if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - grHints( GR_HINT_FIFOCHECKHINT, - fifoInfo.hwDep.vgFIFOData.memFifoStatusLwm + 0x100 ); - _grReCacheFifo( 0 ); -# elif ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - gc->hwDep.sst96Dep.writesSinceFence = 0; -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) && defined(GLIDE_DEBUG) - /* Set int 10h interrupt handler */ - gc->hwDep.sst96Dep.int10Called = FXFALSE; - gc->hwDep.sst96Dep.prevInt10 = NULL; - GDBG_INFO((80, "Storing old int 10h interrupt handler (0x%x)\n", gc->hwDep.sst96Dep.prevInt10)); - - GDBG_INFO((80, "Overriding int 10h interrupt handler\n")); - _dos_setvect(0x10, _grInt10Handler); -#endif - - gc->fifoData = fifoInfo; - - GDBG_INFO((120, "After Init: fifoPtr = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoPtr )); - GDBG_INFO((120, "After Init: fifoSize = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoSize )); - GDBG_INFO((120, "After Init: fifoVirt = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoVirt )); - GDBG_INFO((120, "After Init: fifoPhys = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoPhys )); - GDBG_INFO((120, "After Init: fifoMax = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoMax )); - GDBG_INFO((120, "After Init: fifoCur = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoCur )); - GDBG_INFO((120, "After Init: fifoLfb = 0x%x\n", - fifoInfo.hwDep.vg96FIFOData.fifoLfb )); -# else -# error "Need to write command transport init for glide for this hw" -# endif - -#endif - - /*------------------------------------------------------ - GC Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " GC Init\n" )); - gc->state.screen_width = xres; - gc->state.screen_height = yres; - gc->state.num_buffers = nColBuffers; - gc->state.color_format = format; - gc->grSstRez = resolution; - gc->grSstRefresh = refresh; - - gc->lockPtrs[GR_LFB_READ_ONLY] = (FxU32)-1; - gc->lockPtrs[GR_LFB_WRITE_ONLY] = (FxU32)-1; - gc->lfbSliOk = 0; - gc->fbStride = fbStride; - - /* Initialize the read/write registers to all 0 */ - gc->state.fbi_config.fbzColorPath = 0; - gc->state.fbi_config.fogMode = 0; - gc->state.fbi_config.alphaMode = 0; - gc->state.fbi_config.fbzMode = 0; - gc->state.fbi_config.lfbMode = 0; - gc->state.fbi_config.clipLeftRight = 0; - gc->state.fbi_config.clipBottomTop = 0; - gc->state.fbi_config.fogColor = 0; - gc->state.fbi_config.zaColor = 0; - gc->state.fbi_config.chromaKey = 0; - gc->state.fbi_config.stipple = 0; - gc->state.fbi_config.color0 = 0; - gc->state.fbi_config.color1 = 0; - for (tmu = 0; tmu < gc->num_tmu; tmu += 1) - { - FxU32 textureMode = (FxU32)SST_SEQ_8_DOWNLD; - if ( (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type == - GR_SSTTYPE_VOODOO ) && - (_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[tmu].tmuRev == - 0 ) ) - { - textureMode = 0; - } - gc->state.tmu_config[tmu].textureMode = textureMode; - gc->state.tmu_config[tmu].tLOD = 0x00000000; - gc->state.tmu_config[tmu].tDetail = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_1 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_2 = 0x00000000; - gc->state.tmu_config[tmu].texBaseAddr_3_8 = 0x00000000; - gc->state.tmu_config[tmu].mmMode = GR_MIPMAP_NEAREST; - gc->state.tmu_config[tmu].smallLod = GR_LOD_1; - gc->state.tmu_config[tmu].largeLod = GR_LOD_1; - gc->state.tmu_config[tmu].evenOdd = GR_MIPMAPLEVELMASK_BOTH; - gc->state.tmu_config[tmu].nccTable = GR_NCCTABLE_NCC0; - } - - /*------------------------------------------------------ - 3D State Init - ------------------------------------------------------*/ - GDBG_INFO((gc->myLevel, " 3D State Init\n" )); - gc->state.fbi_config.fbzMode = - SST_ENRECTCLIP | - SST_ENZBIAS | - SST_DRAWBUFFER_BACK; - - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, 0); - grSstOrigin( origin ); - grAlphaBlendFunction( GR_BLEND_ONE , GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0 ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - grConstantColorValue( ( FxU32 ) ~0 ); - grClipWindow( 0, 0, gc->state.screen_width, - gc->state.screen_height ); - _grColorCombineDelta0Mode( FXFALSE ); - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_ITERATED, - FXFALSE); - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_CONSTANT, - FXFALSE); - grColorMask( FXTRUE, FXFALSE ); - grCullMode( GR_CULL_DISABLE ); - grDepthBiasLevel( 0 ); - grDepthMask( FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_DISABLE ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthBiasLevel( 0 ); - grDitherMode( GR_DITHER_4x4 ); - grFogMode( GR_FOG_DISABLE ); - grFogColorValue( 0x00000000 ); - grGammaCorrectionValue( 1.7f ); - guTexMemReset(); - switch (gc->num_tmu) { - case 3: - grTexClampMode( GR_TMU2, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU2, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU2, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU2, 0.0F); - grTexMipMapMode( GR_TMU2, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombineFunction( GR_TMU2, GR_TEXTURECOMBINE_ZERO ); - grTexCombine( GR_TMU2, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - case 2: - grTexClampMode( GR_TMU1, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU1, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU1, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU1, 0.0F); - grTexMipMapMode( GR_TMU1, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombine( GR_TMU1, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - case 1: - grTexClampMode( GR_TMU0, GR_TEXTURECLAMP_CLAMP, GR_TEXTURECLAMP_CLAMP ); - grTexDetailControl( GR_TMU0, 0, 1, 1.0F ); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexLodBiasValue( GR_TMU0, 0.0F); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - } - grLfbConstantAlpha( 0xFF ); - grLfbConstantDepth( 0 ); - - gc->open = FXTRUE; - _GlideRoot.windowsInit = FXTRUE; /* to avoid race with grSstControl() */ - -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(resolution)) { - setAutoflip(1); - } else -#endif - - { - GrState - state; - - grGlideGetState(&state); - -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - if (!_GlideRoot.environment.noSplash) { - HMODULE newSplash; - - if (newSplash = LoadLibrary("3dfxsplash2.dll")) { - FARPROC fxSplash; - - if (fxSplash = GetProcAddress(newSplash, "_fxSplash@16")) { - fxSplash(hWnd, gc->state.screen_width, - gc->state.screen_height, nAuxBuffers); - _GlideRoot.environment.noSplash = 1; - } - } - } -#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */ - - /* If it's still 0, then do the old one */ - if (!_GlideRoot.environment.noSplash) { - grSplash(0.0f, 0.0f, - (float) gc->state.screen_width, - (float) gc->state.screen_height, - 0); - _GlideRoot.environment.noSplash = 1; - } - grGlideSetState(&state); - } - - BAILOUT: - GR_RETURN( rv ); -} /* grSstWinOpen */ - -/*------------------------------------------------------------------- - Function: grSstWinClose - Date: 3/16 - Implementor(s): jdt - Library: Glide - Description: - Shut down the selected SST - - Shutdown has 4 steps - - 3D Idle - the 3D engine must be idled to make sure that there are no - commands executing in the transport when the registers are - reset - - GC Reset - the GC is flagged as unitialized - ( nosup ) - - Command Transport Disable - the command transport to the 3D device is put in a state - of reset. No further commands may be issued throught the - command transport - - Video Restore - video is restored to its pre-open state. - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY( grSstWinClose, void, ( void ) ) -{ -#define FN_NAME "grSstWinClose" - GR_BEGIN_NOFIFOCHECK("grSstWinClose",80); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - - if ( (gc != NULL) && gc->open ) { -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - FARPROC oemRestoreVideo = NULL; -#endif - /*-------------------------- - 3D Idle - --------------------------*/ - GDBG_INFO(( gc->myLevel, " 3D Idle\n" )); - initIdle(); - - /*-------------------------- - GC Reset - --------------------------*/ - GDBG_INFO(( gc->myLevel, " GC Reset\n" )); - gc->open = FXFALSE; - gc->closedP = FXTRUE; - - /*-------------------------- - Command Transport Disable - --------------------------*/ - GDBG_INFO(( gc->myLevel, " Command Transport Disable\n" )); - initDisableTransport(); - -#if (GLIDE_PLATFORM & GLIDE_OS_DOS32) && (GLIDE_PLATFORM & GLIDE_HW_SST96) && defined(GLIDE_DEBUG) - GDBG_INFO((80, "Restoring int 10h interrupt handler (0x%x)\n", gc->hwDep.sst96Dep.prevInt10)); - _dos_setvect(0x10, NULL); -#endif - - /*-------------------------- - Video Restore - --------------------------*/ - GDBG_INFO(( gc->myLevel, " Restore Video\n" )); - initRestoreVideo(); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - if (gc->oemInit) { - if (oemRestoreVideo = GetProcAddress(gc->oemInit, "_fxoemRestoreVideo@0")) - oemRestoreVideo(); - FreeLibrary(gc->oemInit); - } -#endif - } - - GR_END(); -#undef FN_NAME -} /* grSstWinClose */ - -GR_ENTRY(grSstControl, FxBool, ( GrControl_t code )) -{ -#define FN_NAME "grSstControl" - - GR_DCL_GC; - GDBG_INFO((41, "%s: code = 0x%x, windowsInit = %d\n", FN_NAME, - code, _GlideRoot.windowsInit)); - - if (_GlideRoot.windowsInit) { -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - /* For VG96, windows haven't been created, so there's no point - * trying to control it. - */ - /* Believe it or not, the following code really should be bracketed - like this. The reason is that GR_BEGIN_NOFIFOCHECK seg faults - when grSstControl is called before the Glide window is truly - initialized. This is a real concern, as grSstControl is called - from event loops, which are asynchronous. - */ - FxU32 - status, - xRes, yRes, - clipLeftRight, clipBottomTop; - FxU32 nTries; - - GR_BEGIN_NOFIFOCHECK(FN_NAME,80); - - /* We're either cleaning up or closed so forget about this one. */ - if (gc->closedP) goto __done; - xRes = initControl(code); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - - GDBG_INFO((80, "%s: initControl returned 0x%x\n", FN_NAME, xRes)); - - if (!xRes) return FXFALSE; - - yRes = xRes >> 16; - xRes = xRes & 0xffff; - - /* !! FIXME +++ this call should properly update the gc->fbStride, - this information is known only to the init layer and needs to be - exposed, it is only really necessary to lfblock right now, - and therefore is returned by initGetBufferPtr */ - - gc->state.screen_width = xRes; - gc->state.screen_height = yRes; - - /* Wait for Idle. */ - - nTries = 0; - do { - if (nTries++ > 999) { - GDBG_INFO((80, "%s: returning FALSE after %d checks for idle\n", - FN_NAME, nTries)); - return FXFALSE; - } - - status = GET(hw->status); - - } while (status & 0x1); - - /* Set ClipRect Via direct writes */ - _grClipNormalizeAndGenerateRegValues(0, 0, xRes, yRes, - &clipLeftRight, - &clipBottomTop); - SET_DIRECT(clipLeftRight1, clipLeftRight); - SET_DIRECT(clipBottomTop1, clipBottomTop); - - __done: - /* Do Nothing */; -#elif (GLIDE_PLATFORM&GLIDE_HW_SST1) - FxBool ctrlflag; - ctrlflag = initControl(code); -#if (GLIDE_PLATFORM & GLIDE_OS_WIN32) - { - FARPROC oemControl = NULL; - if (gc->oemInit) { - if ((oemControl = GetProcAddress(gc->oemInit, "_fxoemControl@4"))) - oemControl(code); - } - } -#endif - return ctrlflag; -#endif - - } - GDBG_INFO((41, "%s: Returning TRUE\n", FN_NAME)); - return FXTRUE; - -} /* grSstControl */ - -/*--------------------------------------------------------------------------- -** grSstPerfStats -*/ - -GR_ENTRY(grSstPerfStats, void, (GrSstPerfStats_t *pStats)) -{ -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) - FxU32 jr; -#endif - - GR_BEGIN_NOFIFOCHECK("grSstPerfStats",83); - GDBG_INFO_MORE((gc->myLevel,"(0x%x)\n",pStats)); - GR_CHECK_F(myName, !pStats, "NULL pointer"); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -/* - * fixme! this is a fix for bug 697. The right thing to do is - * define GR_GET properly in fxglide.h, but this breaks lots of other - * things, and this is the only place in glide where we actually read - * sst-1 registers, and this pools is mature, so... Also, note that - * these reads are not synchronized with the FIFO, so results are - * approximate. I'm not going to change this behavior for fear of - * introducing performance degradation in existing apps that may - * be instrumented with this call. The read of jr is a sanity check. - */ -#undef GETINDEX -#undef GETREADADDR -#undef GR_GET -#define GR_GET(s) *(GETREADADDR(s)) -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) hw) + 0x400000)) >> 2) -#define GETREADADDR(s) ((FxU32 *) (((FxU32) hw) + (GETINDEX(s) <<12))) - jr = GR_GET(hw->fbijrVersion); -#endif /* SST96 */ - pStats->pixelsIn = GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail = GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail = GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail = GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut = GR_GET(hw->stats.fbiPixelsOut); - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - if (gc->scanline_interleaved == FXTRUE) { - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_SLAVE_OWNPCI); - - pStats->pixelsIn += GR_GET(hw->stats.fbiPixelsIn); - pStats->chromaFail += GR_GET(hw->stats.fbiChromaFail); - pStats->zFuncFail += GR_GET(hw->stats.fbiZfuncFail); - pStats->aFuncFail += GR_GET(hw->stats.fbiAfuncFail); - pStats->pixelsOut += GR_GET(hw->stats.fbiPixelsOut); - - sst1InitSliPciOwner(gc->base_ptr, SST_SLI_MASTER_OWNPCI); - } -#endif - - GR_END(); -} /* grSstPerfStats */ - -/*--------------------------------------------------------------------------- -** grStatsResetPerfStats -*/ - -GR_ENTRY(grSstResetPerfStats, void, (void)) -{ - GR_BEGIN("grSstResetPerfStats",83,4); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - P6FENCE_CMD( GR_SET(hw->nopCMD,1) ); - GR_END(); -} /* grSstResetPerfStats */ - - -/*--------------------------------------------------------------------------- -** grSstStatus - return contents of status register -*/ - -GR_ENTRY(grSstStatus, FxU32, (void)) -{ - FxU32 stat; - - GR_BEGIN_NOFIFOCHECK( "grSstStatus", 85 ); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - P6_NUDGE_OF_LOVE; -#endif - - stat = initStatus(); - GDBG_INFO((84,"grSstStatus() => 0x%x\n", stat)); - GR_END(); - - return stat; -}/* grSstStatus */ - -/*--------------------------------------------------------------------------- -** grSstVideoLine - return current video line number -*/ - -GR_ENTRY(grSstVideoLine, FxU32, (void)) -{ - FxU32 vline = 1; -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - GR_DCL_GC; - GR_DCL_HW; - - vline = GR_GET(hw->vRetrace); - GDBG_INFO((84,"grSstVideoLine() => 0x%x (%d)\n",vline,vline)); -#endif - return vline; - -}/* grSstVideoLine */ - -/*--------------------------------------------------------------------------- -** grSstVRetrace - return contents of SST_VRETRACE bit of status register; -*/ - -GR_ENTRY(grSstVRetraceOn, FxBool, (void)) -{ - if (grSstStatus() & SST_VRETRACE) - return FXFALSE; - else - return FXTRUE; -}/* grSstVRetrace */ - -/*--------------------------------------------------------------------------- -** grSstIsBusy - find out if the SST is busy or not -*/ - -GR_ENTRY(grSstIsBusy, FxBool, (void)) -{ - FxBool busy; - GR_BEGIN_NOFIFOCHECK( "grSstIsBusy", 85 ); - - if (gc->nopCMD == FXFALSE) { - GR_SET_EXPECTED_SIZE(sizeof(FxU32)); - P6FENCE_CMD( GR_SET(hw->nopCMD,1) ); - gc->nopCMD = FXTRUE; - } - if ((busy = initBusy()) == FXFALSE) - gc->nopCMD = FXFALSE; - - GDBG_INFO((84,"grSstIsBusy() => 0x%x\n",busy)); - - GR_RETURN( busy ); - -}/* grSstIsBusy */ - -/*--------------------------------------------------------------------------- -** grGammaCorrectionValue - set the gamma correction value -*/ - -GR_ENTRY(grGammaCorrectionValue, void, (float gam)) -{ - GR_BEGIN_NOFIFOCHECK("grGammaCorrectionValue",80); - GDBG_INFO_MORE((gc->myLevel,"(%g)\n",gam)); - initGamma( gam ); - GR_END(); -} /* grGammaCorrectionValue */ - - -/*--------------------------------------------------------------------------- -** grSstIdle -*/ - -GR_ENTRY(grSstIdle, void, (void)) -{ - GR_BEGIN_NOFIFOCHECK("grSstIdle",83); - GDBG_INFO_MORE((gc->myLevel,"()\n")); - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - P6_NUDGE_OF_LOVE; -#endif - - initIdle(); - - GR_END_SLOPPY(); -} /* grSstIdle */ - - -/*--------------------------------------------------------------------------- -** grSstOrigin - Set the orgin orientation of the screen. -** -** Returns: -** -** Notes: -** -*/ - -GR_ENTRY(grSstOrigin, void, (GrOriginLocation_t origin )) -{ - FxU32 fbzMode; - - GR_BEGIN_NOFIFOCHECK("grSstOrigin",83); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",origin)); - - /* Initialize FBZMODE register */ - fbzMode = gc->state.fbi_config.fbzMode; - if (origin == GR_ORIGIN_LOWER_LEFT) - fbzMode |= SST_YORIGIN; - else - fbzMode &= ~(SST_YORIGIN); - - initOrigin( origin ); - - GR_SET_EXPECTED_SIZE(sizeof(FxU32)); - { - GR_SET( hw->fbzMode, fbzMode ); - } - GR_CHECK_SIZE(); - - gc->state.fbi_config.fbzMode = fbzMode; - GR_END(); -} /* grSstOrigin */ - -/* GMT: do we really have users for this??? - CHD: No. - JDT: Huh? If you're talking about grSstOrigin, you're smoking crack. - if you are talking about SstConfigPipeline, it is evil and must - be destroyed. :) - */ - -#include "gsstdef.h" - -/*--------------------------------------------------------------------------- -** grSstConfigPipeline -*/ - -GR_ENTRY(grSstConfigPipeline, void, (GrChipID_t chip, GrSstRegister reg, FxU32 value)) -{ - GR_BEGIN("grSstConfigPipeline",83,4); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,0x%x)\n",chip,reg,value)); - PACKER_WORKAROUND; - - switch (chip) { - case GR_TMU0: - case GR_TMU1: - case GR_TMU2: - hw = SST_TMU(hw,chip); - /* FALL THRU */ - case GR_FBI: - GR_SET( ((FxU32 *)hw)[reg], value ); - break; -#ifdef GLIDE_DEBUG - default: - { - char outString[256]; - - sprintf(outString, "grSstConfigPipeline: invalid chip ID specified (%d)\n", chip); - GrErrorCallback(outString, FXTRUE); - } -#endif - break; - } - PACKER_WORKAROUND; - GR_END(); -} /* grSstConfigPipeline */ diff --git a/glide2x/sst1/glide/src/gsstdef.h b/glide2x/sst1/glide/src/gsstdef.h deleted file mode 100644 index 065d9ae..0000000 --- a/glide2x/sst1/glide/src/gsstdef.h +++ /dev/null @@ -1,231 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -*/ -#ifndef __GSSTDEF_H__ -#define __GSSTDEF_H__ - -#include - -/*----------------- SST chip layout -----------------------*/ -typedef enum -{ - SSTR_STATUS, - SSTR_RESERVED0, - SSTR_VAX, - SSTR_VAY, - SSTR_VBX, - SSTR_VBY, - SSTR_VCX, - SSTR_VCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_R, - SSTR_DRDX, - SSTR_DRDY, - - SSTR_G, - SSTR_DGDX, - SSTR_DGDY, - - SSTR_B, - SSTR_DBDX, - SSTR_DBDY, - - SSTR_Z, - SSTR_DZDX, - SSTR_DZDY, - - SSTR_A, - SSTR_DADX, - SSTR_DADY, - - SSTR_S, - SSTR_DSDX, - SSTR_DSDY, - - SSTR_T, - SSTR_DTDX, - SSTR_DTDY, - - SSTR_W, - SSTR_DWDX, - SSTR_DWDY, -#else - SSTR_R, - SSTR_G, - SSTR_B, - SSTR_Z, - SSTR_A, - SSTR_S, - SSTR_T, - SSTR_W, - - SSTR_DRDX, - SSTR_DGDX, - SSTR_DBDX, - SSTR_DZDX, - SSTR_DADX, - SSTR_DSDX, - SSTR_DTDX, - SSTR_DWDX, - - SSTR_DRDY, - SSTR_DGDY, - SSTR_DBDY, - SSTR_DZDY, - SSTR_DADY, - SSTR_DSDY, - SSTR_DTDY, - SSTR_DWDY, -#endif - SSTR_TRIANGLECMD, - SSTR_RESERVED1, - - SSTR_FVAX, - SSTR_FVAY, - SSTR_FVBX, - SSTR_FVBY, - SSTR_FVCX, - SSTR_FVCY, -#ifdef GLIDE_USE_ALT_REGMAP - SSTR_FR, - SSTR_FDRDX, - SSTR_FDRDY, - - SSTR_FG, - SSTR_FDGDX, - SSTR_FDGDY, - - SSTR_FB, - SSTR_FDBDX, - SSTR_FDBDY, - - SSTR_FZ, - SSTR_FDZDX, - SSTR_FDZDY, - - SSTR_FA, - SSTR_FDADX, - SSTR_FDADY, - - SSTR_FS, - SSTR_FDSDX, - SSTR_FDSDY, - - SSTR_FT, - SSTR_FDTDX, - SSTR_FDTDY, - - SSTR_FW, - SSTR_FDWDX, - SSTR_FDWDY, -#else - SSTR_FR, - SSTR_FG, - SSTR_FB, - SSTR_FZ, - SSTR_FA, - SSTR_FS, - SSTR_FT, - SSTR_FW, - - SSTR_FDRDX, - SSTR_FDGDX, - SSTR_FDBDX, - SSTR_FDZDX, - SSTR_FDADX, - SSTR_FDSDX, - SSTR_FDTDX, - SSTR_FDWDX, - - SSTR_FDRDY, - SSTR_FDGDY, - SSTR_FDBDY, - SSTR_FDZDY, - SSTR_FDADY, - SSTR_FDSDY, - SSTR_FDTDY, - SSTR_FDWDY, -#endif - SSTR_FTRIANGLECMD, - SSTR_FBZCOLORPATH, - SSTR_FOGMODE, - SSTR_ALPHAMODE, - SSTR_FBZMODE, - SSTR_LFBMODE, - SSTR_CLIPLEFTRIGHT, - SSTR_CLIPBOTTOMTOP, - - SSTR_NOPCMD, - SSTR_FASTFILLCMD, - SSTR_SWAPBUFFERCMD, - SSTR_FOGCOLOR, - SSTR_ZACOLOR, - SSTR_CHROMAKEY, - SSTR_RESERVED2, - SSTR_RESERVED3, - - SSTR_STIPPLE, - SSTR_C0, - SSTR_C1, - - SSTR_FBIPIXELSIN, - SSTR_FBICHROMAFAIL, - SSTR_FBIZFUNCFAIL, - SSTR_FBIAFUNCFAIL, - SSTR_FBIPIXELSOUT, - - SSTR_FOGTABLE, - SSTR_RESERVED8 = SSTR_FOGTABLE + 32, - - SSTR_FBIINIT4 = SSTR_RESERVED8 + 8, - SSTR_VRETRACE, - SSTR_BACKPORCH, - SSTR_VIDEODIMENSIONS, - SSTR_FBIINIT0, - SSTR_FBIINIT1, - SSTR_FBIINIT2, - SSTR_FBIINIT3, - - SSTR_HSYNC, - SSTR_VSYNC, - SSTR_CLUTDATA, - SSTR_DACDATA, - SSTR_MAX_RGB_DELTA, - SSTR_RESERVED51, - - SSTR_TEXTUREMODE = SSTR_RESERVED51 + 51, - SSTR_TLOD, - SSTR_TDETAIL, - SSTR_TEXBASEADDR, - SSTR_TEXBASEADDR1, - SSTR_TEXBASEADDR2, - SSTR_TEXBASEADDR38, - SSTR_TEXINIT0, - SSTR_TEXINIT1, - - SSTR_NCCTABLE0, - SSTR_NCCTABLE1 = SSTR_NCCTABLE0 + 12, - SSTR_END_OF_REGISTER_SET -} GrSstRegister; - -#endif /* __GSSTDEF_H__ */ \ No newline at end of file diff --git a/glide2x/sst1/glide/src/gtex.c b/glide2x/sst1/glide/src/gtex.c deleted file mode 100644 index 1a7cfea..0000000 --- a/glide2x/sst1/glide/src/gtex.c +++ /dev/null @@ -1,752 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 12 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 11 3/03/97 10:58a Jdt - * Fixe for 2-pass trilinear - * - * 10 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -extern const int _grMipMapHostWH[GR_ASPECT_1x8+1][GR_LOD_1+1][2]; -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern FxU32 _gr_aspect_xlate_table[]; - -/*--------------------------------------------------------------------------- -** grTexClampMode -*/ - -GR_ENTRY(grTexClampMode, void, ( GrChipID_t tmu, GrTextureClampMode_t s_clamp_mode, GrTextureClampMode_t t_clamp_mode )) -{ - FxU32 texturemode; - FxU32 clampMode = ( - (s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) | - (t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0) - ); - - GR_BEGIN("grTexClampMode",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d,%d)\n",tmu,s_clamp_mode,t_clamp_mode)); - GR_CHECK_TMU(myName, tmu); - - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~( SST_TCLAMPS | SST_TCLAMPT ); - texturemode |= clampMode; - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texturemode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].textureMode = texturemode; - GR_END(); -} /* grTexClampMode */ - -/*--------------------------------------------------------------------------- -** grTexCombine -*/ - -GR_ENTRY(grTexCombine, void, ( GrChipID_t tmu, GrCombineFunction_t rgb_function, GrCombineFactor_t rgb_factor, GrCombineFunction_t alpha_function, GrCombineFactor_t alpha_factor, FxBool rgb_invert, FxBool alpha_invert )) -{ - FxU32 texturemode; - FxU32 tLod; - FxU32 tmuMask; - - GR_BEGIN("grTexCombine",88,8+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d)\n", - tmu, rgb_function, rgb_factor, - alpha_function, alpha_factor, - rgb_invert, alpha_invert)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_W( myName, - rgb_function < GR_COMBINE_FUNCTION_ZERO || - rgb_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture color combine function" ); - GR_CHECK_W( myName, - alpha_function < GR_COMBINE_FUNCTION_ZERO || - alpha_function > GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA, - "unsupported texture alpha combine function" ); - GR_CHECK_W( myName, - (rgb_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (rgb_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - rgb_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture color combine scale factor" ); - GR_CHECK_W( myName, - (alpha_factor & 0x7) < GR_COMBINE_FACTOR_ZERO || - (alpha_factor & 0x7) > GR_COMBINE_FACTOR_LOD_FRACTION || - alpha_factor > GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - "unsupported texture alpha combine scale factor" ); - - /* tmuMask tells grColorCombineFunction what to turn off an on if - the ccFunc requires texture mapping */ - texturemode = gc->state.tmu_config[tmu].textureMode; - texturemode &= ~(SST_TCOMBINE | SST_TACOMBINE); - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LOD_ODD); - - tmuMask = GR_TMUMASK_TMU0 << tmu; - gc->state.tmuMask &= ~tmuMask; - - /* setup scale factor bits */ - texturemode |= ( rgb_factor & 0x7 ) << SST_TC_MSELECT_SHIFT; - - if ( !( rgb_factor & 0x8 ) ) - texturemode |= SST_TC_REVERSE_BLEND; - - if ( ( ( rgb_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL ) || - ( ( rgb_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL_ALPHA ) ) - gc->state.tmuMask |= tmuMask; - - texturemode |= ( alpha_factor & 0x7 ) << SST_TCA_MSELECT_SHIFT; - - if ( !( alpha_factor & 0x8 ) ) - texturemode |= SST_TCA_REVERSE_BLEND; - - if ( ( ( alpha_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL ) || - ( ( alpha_factor & 0x7 ) == GR_COMBINE_FACTOR_LOCAL_ALPHA ) ) - gc->state.tmuMask |= tmuMask; - - /* setup invert output bits */ - - if ( rgb_invert ) - texturemode |= SST_TC_INVERT_OUTPUT; - - if ( alpha_invert ) - texturemode |= SST_TCA_INVERT_OUTPUT; - - /* setup core color combine unit bits */ - - switch ( rgb_function ) - { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TC_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TC_ZERO_OTHER | SST_TC_SUB_CLOCAL | SST_TC_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - } - - switch ( alpha_function ) - { - case GR_COMBINE_FUNCTION_ZERO: - texturemode |= SST_TCA_ZERO_OTHER; - break; - - case GR_COMBINE_FUNCTION_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER: - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL: - texturemode |= SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_CLOCAL; - gc->state.tmuMask |= tmuMask; - break; - - case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA: - texturemode |= SST_TCA_ZERO_OTHER | SST_TCA_SUB_CLOCAL | SST_TCA_ADD_ALOCAL; - gc->state.tmuMask |= tmuMask; - break; - } - - /* Hack to enable TWO-PASS Trilinear - - */ - if ( texturemode & SST_TRILINEAR ) { - if ( ( texturemode & SST_TC_ZERO_OTHER ) && - ( texturemode & SST_TC_BLEND_LODFRAC ) && - !( texturemode & SST_TC_REVERSE_BLEND ) ) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /* update register */ - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texturemode ); - GR_SET( SST_TMU(hw,tmu)->tLOD, tLod ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].textureMode = texturemode; - gc->state.tmu_config[tmu].tLOD = tLod; - - /* update paramIndex */ - _grUpdateParamIndex(); - - GR_END(); -} /* grTexCombine */ - -/* -** _grTexDetailControl, NOTE: its up to caller to account for bytes -*/ -GR_DDFUNC(_grTexDetailControl, void, ( GrChipID_t tmu, FxU32 detail )) -{ - GR_BEGIN("_grTexDetailControl",88,4+2*PACKER_WORKAROUND_SIZE); - - GR_CHECK_TMU( "_grTexDetailControl", tmu ); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tDetail , detail ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].tDetail = detail; - GR_END(); -} /* _grTexDetailControl */ - -/*--------------------------------------------------------------------------- -** grTexFilterMode -*/ - -GR_ENTRY(grTexFilterMode, void, ( GrChipID_t tmu, GrTextureFilterMode_t minfilter, GrTextureFilterMode_t magfilter )) -{ - FxU32 texMode; - - GR_BEGIN("grTexFilterMode",99,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d)\n",tmu,minfilter,magfilter)); - GR_CHECK_TMU( myName, tmu ); - - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~( SST_TMINFILTER | SST_TMAGFILTER ); - texMode |= (minfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) | - (magfilter == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texMode ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexFilterMode */ - -/*--------------------------------------------------------------------------- -** grTexLodBiasValue -*/ - -GR_ENTRY(grTexLodBiasValue, void, ( GrChipID_t tmu, float fvalue )) -{ - FxU32 tLod; - - GR_BEGIN("grTexLodBiasValue",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%g)\n",tmu,fvalue)); - GR_CHECK_TMU(myName,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~( SST_LODBIAS ); - tLod |= _grTexFloatLODToFixedLOD( fvalue ) << SST_LODBIAS_SHIFT; - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - GR_END(); -} /* grTexLodBiasValue */ - -/*------------------------------------------------------------------- - Function: grTexMipMapMode - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets the mip map mode for the specified TMU - "Ex" because glide's grTexMipMapMode is inadequate for - low level texture memory management - Arguments: - tmu - tmu to update - mmMode - mipmap mode - One of: - GR_MIPMAP_DISABLE - GR_MIPMAP_NEAREST - GR_MIPMAP_NEAREST_DITHER - lodBlend - enable lodBlending - FXTRUE - enabled - FXFALSE - disabled - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMipMapMode, void, ( GrChipID_t tmu, GrMipMapMode_t mmMode, FxBool lodBlend )) -{ - FxU32 - tLod, - texMode; - - GR_BEGIN("grTexMipMapMode",88,8+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,%d)\n",tmu,mmMode,lodBlend)); - GR_CHECK_TMU(myName,tmu); - - /*-------------------------------------------------------------- - Get Current tLod and texMode register values - --------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - texMode = gc->state.tmu_config[tmu].textureMode; - - /*-------------------------------------------------------------- - Clear LODMIN, LODMAX and LODDITHER - --------------------------------------------------------------*/ - tLod &= ~(SST_LODMIN|SST_LODMAX|SST_LOD_ODD); - texMode &= ~(SST_TLODDITHER|SST_TRILINEAR); - - /*-------------------------------------------------------------- - Encode Mipmap Mode Bits - --------------------------------------------------------------*/ - switch ( mmMode ) { - case GR_MIPMAP_DISABLE: - /*---------------------------------------------------------- - To disable mipmapping set the min and max lods to the same - value - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].largeLod); - break; - case GR_MIPMAP_NEAREST_DITHER: - if (gc->state.allowLODdither) - texMode |= SST_TLODDITHER; - /* intentional fall-through to set lodmin and lodmax values */ - case GR_MIPMAP_NEAREST: - /*---------------------------------------------------------- - Set LODMIN and LODMAX in the tLod register to the - actual min and max LODs of the current texture. - ----------------------------------------------------------*/ - tLod |= SST_TLOD_MINMAX_INT(gc->state.tmu_config[tmu].largeLod, - gc->state.tmu_config[tmu].smallLod); - break; - default: - GrErrorCallback( "grTexMipMapMode: invalid mode passed", FXFALSE ); - break; - } - gc->state.tmu_config[tmu].mmMode = mmMode; - - /*-------------------------------------------------------------- - Fix trilinear and evenOdd bits - - - This is a bit of a hack to make two pass trilinear work with - full textures. The assumption here is that the only reason - you would ever set up Multiply by LODFRAC w/o REVERSE BLEND - is for the ODD pass of trilinear. - --------------------------------------------------------------*/ - if ( lodBlend ) { - texMode |= SST_TRILINEAR; - if ( ( texMode & SST_TC_ZERO_OTHER ) && - ( texMode & SST_TC_BLEND_LODFRAC ) && - !( texMode & SST_TC_REVERSE_BLEND ) ) { - tLod |= SST_LOD_ODD; - } - } - tLod |= _gr_evenOdd_xlate_table[gc->state.tmu_config[tmu].evenOdd]; - - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->tLOD , tLod ); - GR_SET( hw->textureMode , texMode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexMipMapMode */ - -/*------------------------------------------------------------------- - Function: grTexMinAddress - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Returns address of start of texture ram for a TMU - Arguments: - tmu - Return: - integer texture base address, this pointer is not to be dereferenced - by the application, it is on to be used by grTexDownload(), - and grTExDownloadLevel() - -------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Function: grTexNCCTable - Date: 6/3 - Implementor(s): jdt - Library: glide - Description: - select one of the two NCC tables - Arguments: - tmu - which tmu - table - which table to select - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexNCCTable, void, ( GrChipID_t tmu, GrNCCTable_t table )) -{ - FxU32 texMode; - - GR_BEGIN("grTexNCCTable",88,4+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",tmu)); - GR_CHECK_TMU(myName,tmu); - GR_CHECK_F(myName, table>0x1, "invalid ncc table specified"); - - /*------------------------------------------------------------------ - Update local state - ------------------------------------------------------------------*/ - gc->state.tmu_config[tmu].nccTable = table; - - /*------------------------------------------------------------------ - Grab shadow texMode, update TexMode, update shadow/real register - ------------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~( SST_TNCCSELECT ); - if ( table ) - texMode |= SST_TNCCSELECT; - else - texMode &= ~(SST_TNCCSELECT); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->textureMode , texMode ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].textureMode = texMode; - GR_END(); -} /* grTexNCCTable */ - - -/*------------------------------------------------------------------- - Function: grTexSource - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Sets up the current texture for texture mapping on the specified - TMU. - Arguments: - tmu - which tmu - startAddress - texture start address - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexSource, void, ( GrChipID_t tmu, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info )) -{ - FxU32 baseAddress, texMode, tLod; - - GR_BEGIN("grTexSource",88,12+2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x,%d,0x%x)\n",tmu,startAddress,evenOdd,info)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_F( myName, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress" ); - GR_CHECK_F( myName, - startAddress + grTexTextureMemRequired( evenOdd, info ) >= gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F( myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F( myName, !info, "invalid info pointer" ); - - /*------------------------------------------------------------- - Update Texture Unit State - -------------------------------------------------------------*/ - gc->state.tmu_config[tmu].smallLod = info->smallLod; - gc->state.tmu_config[tmu].largeLod = info->largeLod; - gc->state.tmu_config[tmu].evenOdd = evenOdd; - - /*------------------------------------------------------------- - Calculate Base Address - -------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress( startAddress, - info->largeLod, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - /*------------------------------------------------------------- - Update Texture Mode - -------------------------------------------------------------*/ - texMode = gc->state.tmu_config[tmu].textureMode; - texMode &= ~SST_TFORMAT; - texMode |= ( info->format << SST_TFORMAT_SHIFT ) | SST_TPERSP_ST | SST_TCLAMPW; - - /*------------------------------------------------------------- - Compute TLOD (keep LODBIAS in tact) - -------------------------------------------------------------*/ - tLod = gc->state.tmu_config[tmu].tLOD; - tLod &= ~(SST_LODMIN | SST_LODMAX | SST_LOD_ASPECT | - SST_LOD_TSPLIT | SST_LOD_ODD | SST_LOD_S_IS_WIDER); - tLod |= SST_TLOD_MINMAX_INT(info->largeLod, - gc->state.tmu_config[tmu].mmMode==GR_MIPMAP_DISABLE ? - info->largeLod : info->smallLod); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[info->aspectRatio]; - - /* Write relevant registers out to hardware */ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -} /* grTexSource */ - - -/*------------------------------------------------------------------- - Function: grTexMultibase - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Enable multiple base addresses for texturing. - Arguments: - tmu - which tmu - enable - flag which enables/disables multibase - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibase, void, ( GrChipID_t tmu, FxBool enable )) -{ - FxU32 tLod; - - GR_BEGIN("grTexMultibase",88,4+PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d)\n",tmu,enable)); - GR_CHECK_TMU(myName,tmu); - - tLod = gc->state.tmu_config[tmu].tLOD; - if ( enable ) - tLod |= SST_TMULTIBASEADDR; - else - tLod &= ~SST_TMULTIBASEADDR; - /*-------------------------------------------------------------- - Write State To Hardware and Update Glide Shadow State - --------------------------------------------------------------*/ - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - - gc->state.tmu_config[tmu].tLOD = tLod; - GR_END(); -} /* grTexMultibase */ - -/*------------------------------------------------------------------- - Function: grTexMultibaseAddress - Date: 11/4/96 - Implementor(s): gmt - Library: Glide - Description: - Set the base address for a particular set of mipmaps - Arguments: - tmu - which tmu - range - range of lods that are based at this starting address - One of: - GR_TEXBASE_256 - GR_TEXBASE_128 - GR_TEXBASE_64 - GR_TEXBASE_32_TO_1 - startAddress - start address that data was downloaded to - hardware with using grTexDownload/Level - info - pointer to GrTexInfo structure containing - texture dimensions - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexMultibaseAddress, void, ( GrChipID_t tmu, GrTexBaseRange_t range, FxU32 startAddress, FxU32 evenOdd, GrTexInfo *info )) -{ - FxU32 baseAddress; - - GR_BEGIN("grTexMultibaseAddress",88,4+PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n",tmu,range,startAddress)); - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_F( myName, range > GR_TEXBASE_32_TO_1, "invalid range" ); - GR_CHECK_F( myName, startAddress >= gc->tmu_state[tmu].total_mem, "invalid startAddress" ); - GR_CHECK_F( myName, evenOdd > 0x3, "evenOdd mask invalid" ); - GR_CHECK_F( myName, info, "invalid info pointer" ); - - - /* Write relevant registers out to hardware and shadows */ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - switch (range) { - case GR_TEXBASE_256: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_256, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - break; - case GR_TEXBASE_128: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_128, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr1 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_1 = baseAddress; - break; - case GR_TEXBASE_64: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_64, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr2 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_2 = baseAddress; - break; - case GR_TEXBASE_32_TO_1: - baseAddress = _grTexCalcBaseAddress( startAddress, - GR_LOD_32, - info->aspectRatio, - info->format, - evenOdd ) >> 3; - GR_SET( hw->texBaseAddr38 , baseAddress ); - gc->state.tmu_config[tmu].texBaseAddr_3_8 = baseAddress; - break; - } - PACKER_WORKAROUND; - GR_END(); -} /* grTexMultibaseAddress */ - -#if 0 -/* -** _grTexForceLod -** -** Forces tLOD to a specific LOD level. This is useful only for -** debugging purposes. GMT: obsolete, please remove -*/ -void -_grTexForceLod( GrChipID_t tmu, int value ) -{ - GR_DCL_GC; - GR_DCL_HW; - FxU32 tLod = gc->state.tmu_config[0].tLOD; - - GR_CHECK_TMU("_grTexForceLod",tmu); - - tLod &= ~(SST_LODMIN | SST_LODMAX); - tLod |= SST_TLOD_MINMAX_INT(value,value); - - PACKER_WORKAROUND; - GR_SET( SST_TMU(hw,tmu)->tLOD , tLod ); - PACKER_WORKAROUND; - gc->state.tmu_config[tmu].tLOD = tLod; -} /* _grTexForceLod */ -#endif diff --git a/glide2x/sst1/glide/src/gtexdl.c b/glide2x/sst1/glide/src/gtexdl.c deleted file mode 100644 index ac6355e..0000000 --- a/glide2x/sst1/glide/src/gtexdl.c +++ /dev/null @@ -1,725 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 28 6/19/97 7:35p Dow - * More P6 Stuff - * - * 27 6/10/97 3:59p Garymct - * Fixed a bug in a sanity checking macro. - * - * 26 6/10/97 11:09a Pgj - * fix 8-bit & optimize - * - * 25 6/08/97 11:06p Pgj - * use Group Write for Texture Downloads - * - * 24 5/09/97 5:12p Jdt - * Removed redundant download of NCC Table - * - * 23 3/18/97 9:07p Dow - * Got rid of #$#%#$ // comments - * - * 22 3/15/97 8:08p Jdt - * Moved grTexDownloadTable into this file as it not precisely DI. - * - * 21 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 20 2/26/97 11:58a Jdt - * fixed a warning - * - * 19 2/19/97 4:25p Hanson - * Added Gary T's changes to the expected size value for texture downloads - * - * 18 2/18/97 9:52a Jdt - * Fixed some warnings. - * - * 17 2/12/97 2:09p Hanson - * Hopefully removed the rest of my muckage. - * - * 16 2/12/97 12:34p Dow - * Fixed Hanson muckage - * - * 15 2/12/97 12:03p Hanson - * Adjusted Convert and download code for Descent - * - * 14 2/12/97 11:30a Hanson - * Added ConvertRle function - * - * 13 1/27/97 2:29p Murali - * Changed texture download code to help compiler use registers optimally. - * - * 12 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 11 11/18/96 9:13a Sellers - * fixed bug in checking for crossing of 2 MByte texture boundry -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from gtex.c */ -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; -extern const int _grMipMapHostWH[GR_ASPECT_1x8+1][GR_LOD_1+1][2]; - -/*--------------------------------------------------------------------------- -** _grTexDownloadNccTable -** -** Downloads an ncctable to the specified _physical_ TMU(s). This -** function is called internally by Glide and should not be executed -** by an application. -*/ -GR_DDFUNC(_grTexDownloadNccTable, void, ( GrChipID_t tmu, FxU32 which, const GuNccTable *table, int start, int end )) -{ - int i; - FxU32 *hwNCC; - - GR_BEGIN_NOFIFOCHECK("_grTexDownloadNccTable",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d, 0x%x, %d,%d)\n",tmu,which,table,start,end)); - GR_ASSERT( start==0 ); - GR_ASSERT( end==11 ); - - /* check for null pointer */ - if ( table == 0 ) - return; - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - if (gc->tmu_state[tmu].ncc_table[which] != table ) { - GR_SET_EXPECTED_SIZE(48+2*PACKER_WORKAROUND_SIZE); - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - hwNCC = which == 0 ? hw->nccTable0 : hw->nccTable1; - - for ( i = 0; i < 12; i++ ) - GR_SET(hwNCC[i], table->packed_data[i] ); - - gc->tmu_state[tmu].ncc_table[which] = table; - PACKER_WORKAROUND; - P6FENCE; - GR_CHECK_SIZE(); - } - GR_END(); -} /* _grTexDownloadNccTable */ - -/*------------------------------------------------------------------- - Function: grTexDownloadTable - Date: 6/3 - Implementor(s): jdt, GaryMcT - Library: glide - Description: - download look up table data to a tmu - Arguments: - tmu - which tmu - type - what type of table to download - One of: - GR_TEXTABLE_NCC0 - GR_TEXTABLE_NCC1 - GR_TEXTABLE_PALETTE - void *data - pointer to table data - Return: - none - -------------------------------------------------------------------*/ -GR_ENTRY(grTexDownloadTable, void, - ( GrChipID_t tmu, GrTexTable_t type, void *data )) -{ - GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,%d,0x%x)\n",tmu,type,data)); - GR_CHECK_TMU(myName,tmu); - GR_CHECK_F(myName, type > 0x2, "invalid table specified"); - GR_CHECK_F(myName, !data, "invalid data pointer"); -#if ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - GR_CHECK_F(myName, _GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].sstBoard.VoodooConfig.tmuConfig[0].tmuRev < 1, - "Texelfx rev 0 does not support paletted textures"); -#endif - - if ( type == GR_TEXTABLE_PALETTE ) /* Need Palette Download Code */ - _grTexDownloadPalette( tmu, (GuTexPalette *)data, 0, 255 ); - else { /* Type is an ncc table */ - _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, 0, 11 ); - /* _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, 0, 11 ); */ - } - GR_END(); -} /* grTexDownloadTable */ - - -/*------------------------------------------------------------------- - Function: grTexDownloadMipMapLevelPartial - Date: 6/2 - Implementor(s): GaryMcT, Jdt - Library: glide - Description: - Downloads a mipmap level to the specified tmu at the given - texture start address - Arguments: - tmu - which tmu - startAddress - starting address for texture download, - this should be some value between grTexMinAddress() - and grTexMaxAddress() - thisLod - lod constant that describes the mipmap level - to be downloaded - largeLod - largest level of detail in complete mipmap to - be downloaded at startAddress of which level to - be downloaded is a part - aspectRatio - aspect ratio of this mipmap - format - format of mipmap image data - evenOdd - which set of mipmap levels have been downloaded for - the selected texture - One of: - GR_MIPMAPLEVELMASK_EVEN - GR_MIPMAPLEVELMASK_ODD - GR_MIPMAPLEVELMASK_BOTH - data - pointer to mipmap data - Return: - none - -------------------------------------------------------------------*/ - -GR_ENTRY(grTexDownloadMipMapLevelPartial, void, ( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 evenOdd, void *data, int t, int max_t )) -{ - const FxU8 *src8 = ( const FxU8 * ) data; - const FxU16 *src16 = ( const FxU16 * ) data; - FxI32 sh, bytesPerTexel; - FxU32 max_s, s, width, tex_address, tmu_baseaddress; - FxU32 tLod, texMode, baseAddress,size; - - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevelPartial",89); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d,%d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,data,t,max_t)); - size = _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd); - GR_CHECK_TMU(myName, tmu); - GR_CHECK_F(myName, startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F(myName, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > GR_LOD_1, "thisLod invalid"); - GR_CHECK_F(myName, largeLod > GR_LOD_1, "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > GR_ASPECT_1x8 || aspectRatio < GR_ASPECT_8x1, "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(myName, !data, "invalid data pointer"); - GR_CHECK_F(myName, max_t >= _grMipMapHostWH[aspectRatio][thisLod][1], "invalid end row"); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) - GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary",FXTRUE); - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if ( !(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - /*------------------------------------------------------------ - Determine max_s - ------------------------------------------------------------*/ - width = _grMipMapHostWH[aspectRatio][thisLod][0]; - if ( format < GR_TEXFMT_16BIT ) { /* 8-bit texture */ - bytesPerTexel = 1; - max_s = width >> 2; - if ( max_s <= 0 ) - max_s = 1; - } else { /* 16-bit texture */ - bytesPerTexel = 2; - max_s = width >> 1; - if ( max_s <= 0 ) - max_s = 1; - } - /* assume max_s is a power of two */ - GR_ASSERT(( (max_s) & (max_s -1) ) == 0); - - - /*------------------------------------------------------------ - Compute Base Address Given Start Address Offset - ------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress( startAddress, - largeLod, - aspectRatio, - format, - evenOdd ); - baseAddress >>= 3; - - /*------------------------------------------------------------ - Compute Physical Write Pointer - ------------------------------------------------------------*/ - tmu_baseaddress = (FxU32)gc->tex_ptr; - tmu_baseaddress += (((FxU32)tmu)<<21) + (((FxU32)thisLod)<<17); - - /*------------------------------------------------------------ - Compute pertinant contents of tLOD and texMode registers - ------------------------------------------------------------*/ - tLod = SST_TLOD_MINMAX_INT(largeLod,GR_LOD_1); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[aspectRatio]; - texMode = format << SST_TFORMAT_SHIFT; - if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) { - sh = 2; - texMode |= SST_SEQ_8_DOWNLD; - } - else sh = 3; - - /* account for 3 register writes and for smallest 1xN and 2xN levels */ - /* and also 4xN level for 8-bit textures (or 4x32x8bpp) */ - /* Also note that each texture write requires 10 actual fifo entry bytes */ - /* but since we are counting bytes/2 we multiply by 5 */ - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE + 32*5); - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* Flush the write buffers before the texture downloads */ - P6FENCE; - _GlideRoot.stats.texBytes += max_s * (max_t-t+1) * 4; - -# define SET_TRAM(a,b) GR_SET( *((FxU32 *)(a)) , (b) ) - /*------------------------------------------------------------ - Handle 8-bit Textures - ------------------------------------------------------------*/ - if ( format < GR_TEXFMT_16BIT ) { /* 8 bit textures */ - switch( width ) { - /* Cases 1, 2 and 4 don't need inner loops for s */ - case 1: /* 1xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU8*) src8); - src8 += 1; - tex_address += (1 << 9); - } - break; - - case 2: /* 2xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU16*) src8); - src8 += 2; - tex_address += (1 << 9); - } - break; - - case 4: /* 4xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU32*) src8); - src8 += 4; - tex_address += (1 << 9); - } - break; - - default: /* >4xN texture */ - if (sh == 3) { /* Old TMUs */ - /* Inner loop unrolled to process 2 dwords per iteration */ - for ( ; t <= max_t; t++) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - for ( s = 0; s < max_s; s+=2) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src8 ); - t1 = * (const FxU32 *) (src8 + 4); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 8, t1); - tex_address += 16; - src8 += 8; - } - } - } else { /* New TMUs */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -#define DW_PER_GWP 32 -#define W_PER_GWP (DW_PER_GWP << 1) -#define BYTES_PER_GWP (DW_PER_GWP << 2) -#define MASK(n) ((1 << (n)) - 1) - - for ( ; t <= max_t; t++ ) { - FxU32 t0, t1; - FxU32 j; - - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE((max_s + (max_s >> 4) + 2) << 2); - tex_address = tmu_baseaddress + ( t << 9 ); - if (max_s >= DW_PER_GWP) { /* can use maximum GWP(s) */ - for (s=0; s>1); j++) { - t0 = * (const FxU32 *) (src8 + (j << 3) ); - t1 = * (const FxU32 *) (src8 + (j << 3) + 4); - GR_SET_GW(t0); - GR_SET_GW(t1); - } - tex_address += (max_s << 2); - src8 += (max_s << 2); - } - } /* end for t */ - -#else /* SST-1 */ - for ( ; t <= max_t; t++) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - for ( s = 0; s < max_s; s+=2) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src8 ); - t1 = * (const FxU32 *) (src8 + 4); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 4, t1); - tex_address += 8; - src8 += 8; - } - } -#endif - } - break; - } - } else { - - /*------------------------------------------------------------ - Handle 16-bit Textures - ------------------------------------------------------------*/ - - switch( width ) { - /* Cases 1, 2 don't need inner loops for s */ - case 1: /* 1xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *src16 ); - src16 += 1; - tex_address += (1 << 9); - } - break; - - case 2: /* 2xN texture */ - tex_address = tmu_baseaddress + ( t << 9 ); - for ( ; t <= max_t; t++) { - SET_TRAM( tex_address, *(const FxU32 *)src16 ); - src16 += 2; - tex_address += (1 << 9); - } - break; - - default: /* All other textures */ -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - for ( ; t <= max_t; t++ ) { - FxU32 t0, t1; - FxU32 j; - - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE((max_s + (max_s >> 4) + 2) << 2); - tex_address = tmu_baseaddress + ( t << 9 ); - if (max_s >= DW_PER_GWP) { /* can use maximum GWP(s) */ - for (s=0; s>1); j++) { - t0 = * (const FxU32 *) (src16 + (j << 2) ); - t1 = * (const FxU32 *) (src16 + (j << 2) + 2); - GR_SET_GW(t0); - GR_SET_GW(t1); - } - tex_address += (max_s << 2); - src16 += (max_s << 1); - } - } /* end for t */ -#else /* SST-1 */ - for ( ; t <= max_t; t++ ) { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(max_s*5); - tex_address = tmu_baseaddress + ( t << 9 ); - /* Loop unrolled to process 2 dwords per iteration */ - for ( s = 0; s < max_s; s += 2 ) { - FxU32 t0, t1; - - t0 = * (const FxU32 *) (src16 ); - t1 = * (const FxU32 *) (src16 + 2); - SET_TRAM( tex_address , t0); - SET_TRAM( tex_address + 4, t1); - tex_address += 8; - src16 += 4; - } - } -#endif - break; - } - } /* end switch( width ) */ - - /* Flush the write buffers after the texture downloads */ - P6FENCE; - - /*------------------------------------------------------------ - Restore TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE); - PACKER_WORKAROUND; - GR_SET( hw->texBaseAddr , gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( hw->textureMode , gc->state.tmu_config[tmu].textureMode ); - GR_SET( hw->tLOD , gc->state.tmu_config[tmu].tLOD ); - PACKER_WORKAROUND; - -all_done: - _GlideRoot.stats.texDownloads++; - GR_END_SLOPPY(); -} /* grTexDownloadMipmapLevelPartial */ - - -/*------------------------------------------------------------------- - Function: _grTexDownloadPalette - Date: 6/9 - Implementor(s): jdt - Library: Glide - Description: - Private function to download a palette to the specified tmu - Arguments: - tmu - which tmu to download the palette to - pal - the pallete data - start - beginning index to download - end - ending index to download - Return: - none - -------------------------------------------------------------------*/ -GR_DDFUNC(_grTexDownloadPalette, void, ( GrChipID_t tmu, GuTexPalette *pal, int start, int end )) -{ - GR_BEGIN("_grTexDownloadPalette",89, 4*(end-start+1) + 2*PACKER_WORKAROUND_SIZE); - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x, %d,%d)\n",tmu,pal,start,end)); - GR_CHECK_F( myName, !pal, "pal invalid" ); - GR_CHECK_F( myName, start<0, "invalid start index" ); - GR_CHECK_F( myName, end>255, "invalid end index" ); - - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - _GlideRoot.stats.palDownloads++; - _GlideRoot.stats.palBytes += (end-start+1)<<2; - - while (start <= end) { - GR_SET( hw->nccTable0[4+(start&0x7)], - 0x80000000 | ((start & 0xFE) << 23) | (pal->data[start] & 0xffffff) ); - start++; - if ((start&0x7)==0) P6FENCE; - } - - PACKER_WORKAROUND; - P6FENCE; - GR_END(); -} /* _grTexDownloadPalette */ - - -#ifndef __linux__ -/* - Let me take this opportunity to register my formal opposition to - this function. Either we do this or we don't. Let's not hack like - this. - - CHD -*/ - -GR_ENTRY(ConvertAndDownloadRle, void, ( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 evenOdd, FxU8 *bm_data, long bm_h, FxU32 u0, FxU32 v0, FxU32 width, FxU32 height, FxU32 dest_width, FxU32 dest_height, FxU16 *tlut)) -{ - FxI32 sh; - FxU32 max_s,s,t,max_t,tex_address, tmu_baseaddress; - FxU32 tLod, texMode, baseAddress,size; - FxU32 offset,expected_size; - unsigned long i; - FxU16 *src; - extern FxU16 rle_line[256]; - extern FxU16 *rle_line_end; - - - GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevelPartial",89); - -/* make sure even number */ - width&=0xFFFFFFFE; - - max_s=width>>1; - max_t=height; - - GDBG_INFO_MORE((gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d)\n", - tmu,startAddress,thisLod,largeLod,aspectRatio, - format,evenOdd,bm_data,max_t)); - - size = _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd); - GR_CHECK_TMU(myName, tmu); - GR_CHECK_F(myName, startAddress + size > gc->tmu_state[tmu].total_mem, - "insufficient texture ram at startAddress" ); - GR_CHECK_F(myName, startAddress & 0x7, "unaligned startAddress"); - GR_CHECK_F(myName, thisLod > GR_LOD_1, "thisLod invalid"); - GR_CHECK_F(myName, largeLod > GR_LOD_1, "largeLod invalid"); - GR_CHECK_F(myName, thisLod < largeLod, "thisLod may not be larger than largeLod"); - GR_CHECK_F(myName, aspectRatio > GR_ASPECT_1x8 || aspectRatio < GR_ASPECT_8x1, "aspectRatio invalid"); - GR_CHECK_F(myName, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid"); - GR_CHECK_F(myName, !bm_data, "invalid data pointer"); - - GR_CHECK_F(myName, (dest_height-1) >= (FxU32)_grMipMapHostWH[aspectRatio][thisLod][1], "invalid end row"); - - if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) - GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary",FXTRUE); - - /*------------------------------------------------------------ - Skip this level entirely if not in odd/even mask - ------------------------------------------------------------*/ - if ( !(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN))) - goto all_done; - - /*------------------------------------------------------------ - Compute Base Address Given Start Address Offset - ------------------------------------------------------------*/ - baseAddress = _grTexCalcBaseAddress( startAddress, - largeLod, - aspectRatio, - format, - evenOdd ); - baseAddress >>= 3; - - /*------------------------------------------------------------ - Compute Physical Write Pointer - ------------------------------------------------------------*/ - tmu_baseaddress = (FxU32)gc->tex_ptr; - tmu_baseaddress += (((FxU32)tmu)<<21) + (((FxU32)thisLod)<<17); - - /*------------------------------------------------------------ - Compute pertinant contents of tLOD and texMode registers - ------------------------------------------------------------*/ - tLod = SST_TLOD_MINMAX_INT(largeLod,GR_LOD_1); - tLod |= _gr_evenOdd_xlate_table[evenOdd]; - tLod |= _gr_aspect_xlate_table[aspectRatio]; - texMode = format << SST_TFORMAT_SHIFT; - if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) { - sh = 2; - texMode |= SST_SEQ_8_DOWNLD; - } - else sh = 3; - - /* account for 6 register writes and for smallest 1xN and 2xN levels*/ - GR_SET_EXPECTED_SIZE(3*4 + 2*PACKER_WORKAROUND_SIZE); - - /*------------------------------------------------------------ - Update TLOD, texMode, baseAddress - ------------------------------------------------------------*/ - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* Flush the write buffers before the texture downloads */ - P6FENCE; - _GlideRoot.stats.texBytes += dest_width * (dest_height) * 2; - - /* here I can do my writes and conversion and I will be so happy */ - - offset=4+bm_h; - for (i=0; i>1; - expected_size=max_s*5; - - rle_line_end=rle_line+width+u0; - - for(t=0;theight) - { - GR_CHECK_SIZE_SLOPPY(); - GR_SET_EXPECTED_SIZE(expected_size); - tex_address = tmu_baseaddress + ( t << 9 ); - src=rle_line+u0; - for(s=0;stexBaseAddr , gc->state.tmu_config[tmu].texBaseAddr ); - GR_SET( hw->textureMode , gc->state.tmu_config[tmu].textureMode ); - GR_SET( hw->tLOD , gc->state.tmu_config[tmu].tLOD ); - PACKER_WORKAROUND; - -all_done: - _GlideRoot.stats.texDownloads++; - GR_END_SLOPPY(); -} -#endif diff --git a/glide2x/sst1/glide/src/gu.c b/glide2x/sst1/glide/src/gu.c deleted file mode 100644 index bfb21fa..0000000 --- a/glide2x/sst1/glide/src/gu.c +++ /dev/null @@ -1,432 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 12 12/19/97 8:09a Peter - * fog table propogation - * - * 11 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 10 3/05/97 9:36p Jdt - * Added guEncodeRLE16 - * - * 9 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include - -#include "fxglide.h" -#include "fxinline.h" - -#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) ) -#include -#endif - -/*--------------------------------------------------------------------------- -** guAlphaSource -*/ -GR_DIENTRY(guAlphaSource, void, ( GrAlphaSource_t mode )) -{ - GDBG_INFO((99,"guAlphaSource(%d)\n",mode)); - switch ( mode ) - { - case GR_ALPHASOURCE_CC_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_ALPHASOURCE_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA: - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - default: - GR_CHECK_F("grAlphaSource", 1, "unknown alpha source mode"); - break; - } - - /* xxx not needed at the moment, should update grFogxxx - _grVerifyNeedForITAlpha(); - */ -} /* guAlphaSource */ - -/*--------------------------------------------------------------------------- -** guColorCombineFunction -*/ -GR_DIENTRY(guColorCombineFunction, void, ( GrColorCombineFnc_t fnc )) -{ - GDBG_INFO((99,"guColorCombineFunction(%d)\n",fnc)); - - /* gross hack to get ITRGB_DELTA0 modes working */ - _grColorCombineDelta0Mode( FXFALSE ); - - switch ( fnc ) - { - case GR_COLORCOMBINE_ZERO: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_NONE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DECAL_TEXTURE: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0: - _grColorCombineDelta0Mode( FXTRUE ); - /* FALL THRU */ - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA: - grColorCombine( GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_TEXTURE_ALPHA, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_ITERATED, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_A: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_DIFF_SPEC_B: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - break; - - case GR_COLORCOMBINE_ONE: - grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXTRUE ); - break; - - default: - GR_CHECK_F("grColorCombineFunction", 1, "unsupported color combine function"); - break; - } -} /* guColorCombineFunction */ - -/*--------------------------------------------------------------------------- -** guEndianSwapWords -*/ -GR_DIENTRY(guEndianSwapWords, FxU32, ( FxU32 value )) -{ - return ( ( value & 0xFFFF0000 ) >> 16 ) | ( value << 16 ); -} - -/*--------------------------------------------------------------------------- -** guEndianSwapBytes -*/ -GR_DIENTRY(guEndianSwapBytes, FxU16, ( FxU16 value )) -{ - return ( ( value & 0xFF00 ) >> 8 ) | ( value << 8 ); -} - -/*--------------------------------------------------------------------------- -** guFogTableIndexToW -*/ -GR_DIENTRY(guFogTableIndexToW, float, ( int i )) -{ - return (float)pow(2.0,3.0+(double)(i>>2)) / (8-(i&3)); -} - -/*--------------------------------------------------------------------------- -** guFogGenerateExp -*/ -GR_DIENTRY(guFogGenerateExp, void, - ( GrFog_t fogtable[kInternalFogTableEntryCount], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO((99,"guFogGenerateExp(0x%x,%g)\n",fogtable,density)); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -dp ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) - { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -dp ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp */ - -/*--------------------------------------------------------------------------- -** guFogGenerateExp2 -*/ -GR_DIENTRY(guFogGenerateExp2, void, - ( GrFog_t fogtable[kInternalFogTableEntryCount], float density )) -{ - int i; - float f; - float scale; - float dp; - - GDBG_INFO((99,"guFogGenerateExp2(0x%x,%g)\n",fogtable,density)); - dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 ); - scale = 1.0F / ( 1.0F - ( float ) exp( -( dp * dp ) ) ); - - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) - { - dp = density * guFogTableIndexToW( i ); - f = ( 1.0F - ( float ) exp( -( dp * dp ) ) ) * scale; - - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateExp2 */ - -/*--------------------------------------------------------------------------- -** guFogGenerateLinear -*/ -GR_DIENTRY(guFogGenerateLinear, void, - ( GrFog_t fogtable[kInternalFogTableEntryCount], - float nearZ, float farZ )) -{ - int i; - float world_w; - float f; - - GDBG_INFO((99,"guFogGenerateLinear(0x%x,%g,%g)\n",fogtable,nearZ,farZ)); - for ( i = 0; i < kInternalFogTableEntryCount; i++ ) - { - world_w = guFogTableIndexToW( i ); - if ( world_w > 65535.0F ) - world_w = 65535.0F; - - f = ( world_w - nearZ ) / ( farZ - nearZ ); - if ( f > 1.0F ) - f = 1.0F; - else if ( f < 0.0F ) - f = 0.0F; - f *= 255.0F; - fogtable[i] = ( GrFog_t ) f; - } -} /* guFogGenerateLinear */ - -/* -** setlevel -*/ -static void -setlevel( FxU16 *data, FxU16 color, int width, int height ) -{ - int s, t; - - for ( t = 0; t < height; t++ ) - { - for ( s = 0; s < width; s++ ) - { - *data = color; - data++; - } - } -} /* setlevel */ - -/*--------------------------------------------------------------------------- -** guTexCreateColorMipMap -*/ -GR_DIENTRY(guTexCreateColorMipMap, FxU16 *, ( void )) -{ - FxU32 memrequired; - FxU16 *data; - FxU16 *start; - - GDBG_INFO((99,"guTexCreateColorMipMap()\n")); - memrequired = 2 * ( 256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 ); - start = data = malloc( memrequired ); - if ( !data ) - return 0; - - setlevel( data, 0xF800, 256, 256 ); - setlevel( data += 256*256, 0x07e0, 128, 128 ); - setlevel( data += 128*128, 0x001F, 64, 64 ); - setlevel( data += 64*64, 0xFFFF, 32, 32); - setlevel( data += 32*32, 0x0000, 16, 16 ); - setlevel( data += 16*16, 0xF800, 8, 8); - setlevel( data += 8*8, 0x07e0, 4, 4 ); - setlevel( data += 4*4, 0x001f, 2, 2 ); - setlevel( data += 2*2, 0xFFFF, 1, 1 ); - - return start; -} /* guTexCreateColoMipMap */ - -/* GMT: this code used to be in the code above but I removed it for - readability, the first section was case(1) the second section - was a replacement for the simple 32-bit copy loop -*/ -#if 0 - - /* GMT: from what I can tell its not bad to perform unaligned DWORD - loads on a P5, so we use the case 2) all the time - in fact, its twice as fast as doing aligned short copies - */ -if ((dstX ^ (((FxU32)src)>>1)) & 1) { - /* case 1) a simple 16-bit copy loop */ - for (x=0; x < w; x++) { - GR_SET16(lfbPtr[x], ((FxU16 *)src)[x]); - } -} -#endif - -#if 0 -/* GMT: I tried to unroll the loop but for some reason the - code scheduling was such that it was slower - I think it had to do with the way the 2 mov instructions paired - Perhaps they were unaligned in the cache? - */ -FxU32 a,b; -FxU32 *s = (FxU32 *)src; -FxU32 *d = lfbPtr; - -while (d < &lfbPtr[w-1]) { - a = s[0]; - b = s[1]; - GR_SET(d[0], a); - GR_SET(d[1], b); - s += 2; - d += 2; -} -if (w & 1) { - GR_SET(d[0], s[0]); -} -#endif - -/*------------------------------------------------------------------- - Function: guEncodeRle - Date: 3/5/96 - Implementor(s): jdt - Library: Glide Utilities - Description: - Encode an RGB565 image into RLE16 format - Arguments: - dst - destination rle image data ( NULL for bytecount only ) - src - source rgb565 image data - width - width of source data - height - height of source data - Return: - number of bytes in encoded rle image - -------------------------------------------------------------------*/ -GR_ENTRY( guEncodeRLE16, int, ( void *dst, void *src, FxU32 width, FxU32 height )) -{ - int byteCount = 0; - int sourceImageSizeInWords; - FxU16 *srcPixels; - FxU32 *dstPixels; - - sourceImageSizeInWords = width * height; - - srcPixels = src; - - if ( dst ) { - dstPixels = dst; - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - *dstPixels = ((((FxU32)length)<<16) | ((FxU32)color)); - dstPixels++; - - byteCount+=4; - - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } else { - while( sourceImageSizeInWords-- ) { - short length = 1; - short color = *srcPixels; - int lookAhead = 1; - - while( (sourceImageSizeInWords-length)&& - (color == srcPixels[lookAhead]) ) { - length++; - lookAhead++; - } - - byteCount+=4; - srcPixels+=length; - sourceImageSizeInWords-=length; - } - } - return byteCount; -} - diff --git a/glide2x/sst1/glide/src/guclip.c b/glide2x/sst1/glide/src/guclip.c deleted file mode 100644 index 40b861a..0000000 --- a/glide2x/sst1/glide/src/guclip.c +++ /dev/null @@ -1,423 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 6 8/14/97 5:32p Pgj - * remove dead code per GMT - * - * 5 6/27/97 4:16p Atai - * fixed guDrawTriangleWithClip bug (#484) by removing +1.0F and -1.0F in - * intersectTop(), intersectBottom(), intersectLeft(), and - * intersectRight() routine - * - * 4 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions -** -*/ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#define GU_PRIM_MAX_VERTICES 100 - -static void -calcParams(const GrVertex *a, const GrVertex *b, GrVertex *isect, float d) -{ - GR_DCL_GC; - if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) { - isect->r = a->r + d * ( b->r - a->r ); - isect->g = a->g + d * ( b->g - a->g ); - isect->b = a->b + d * ( b->b - a->b ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) { - isect->a = a->a + d * ( b->a - a->a ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOZ) { - isect->ooz = a->ooz + d * ( b->ooz - a->ooz ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) { - isect->oow = a->oow + d * ( b->oow - a->oow); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU0) { - isect->tmuvtx[0].oow = - a->tmuvtx[0].oow + d * ( b->tmuvtx[0].oow - a->tmuvtx[0].oow ); - isect->tmuvtx[0].sow = - a->tmuvtx[0].sow + d * ( b->tmuvtx[0].sow - a->tmuvtx[0].sow ); - isect->tmuvtx[0].tow = - a->tmuvtx[0].tow + d * ( b->tmuvtx[0].tow - a->tmuvtx[0].tow ); - } - - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU1) { - isect->tmuvtx[1].oow = - a->tmuvtx[1].oow + d * ( b->tmuvtx[1].oow - a->tmuvtx[1].oow ); - isect->tmuvtx[1].sow = - a->tmuvtx[1].sow + d * ( b->tmuvtx[1].sow - a->tmuvtx[1].sow ); - isect->tmuvtx[1].tow = - a->tmuvtx[1].tow + d * ( b->tmuvtx[1].tow - a->tmuvtx[1].tow ); - } - -#if (GLIDE_NUM_TMU > 2) - if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU2) { - isect->tmuvtx[2].oow = - a->tmuvtx[2].oow + d * ( b->tmuvtx[2].oow - a->tmuvtx[2].oow ); - isect->tmuvtx[2].sow = - a->tmuvtx[2].sow + d * ( b->tmuvtx[2].sow - a->tmuvtx[2].sow ); - isect->tmuvtx[2].tow = - a->tmuvtx[2].tow + d * ( b->tmuvtx[2].tow - a->tmuvtx[2].tow ); - } -#endif - -} /* calcParams */ - -static void -intersectTop( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymin - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymin; - - calcParams(a, b, intersect, d); - -} /* intersectTop */ - -static void -intersectBottom( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_ymax - a->y ) / ( b->y - a->y ); - - intersect->x = a->x + d * ( b->x - a->x ); - intersect->y = gc->state.clipwindowf_ymax; - - calcParams(a, b, intersect, d); - -} /* intersectBottom */ - -static void -intersectRight( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmax - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmax; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectRight */ - -static void -intersectLeft( const GrVertex *a, const GrVertex *b, GrVertex *intersect ) -{ - GR_DCL_GC; - float - d = ( gc->state.clipwindowf_xmin - a->x ) / ( b->x - a->x ); - - intersect->x = gc->state.clipwindowf_xmin; - intersect->y = a->y + d * ( b->y - a->y ); - - calcParams(a, b, intersect, d); - -} /* intersectLeft */ - -static FxBool -aboveYMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y > gc->state.clipwindowf_ymin ) ? FXTRUE : FXFALSE); -} /* aboveYMin */ - - -static FxBool -belowYMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->y < gc->state.clipwindowf_ymax ) ? FXTRUE : FXFALSE); -} /* belowYMax */ - -static FxBool -aboveXMin(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x > gc->state.clipwindowf_xmin ) ? FXTRUE : FXFALSE ); -} /* aboveXMin */ - -static FxBool -belowXMax(const GrVertex *p) -{ - GR_DCL_GC; - return (( p->x < gc->state.clipwindowf_xmax ) ? FXTRUE : FXFALSE ); -} /* belowXMax */ - -/* -** shClipPolygon -*/ -static void -shClipPolygon( - const GrVertex invertexarray[], - GrVertex outvertexarray[], - int inlength, int *outlength, - FxBool (*inside)(const GrVertex *p), - void (*intersect)( - const GrVertex *a, - const GrVertex *b, - GrVertex *intersect ) - ) -{ - GrVertex - s, p /*, intersection */; - int - j; - - *outlength = 0; - - s = invertexarray[inlength-1]; - for ( j = 0; j < inlength; j++ ) { - p = invertexarray[j]; - if ( inside( &p ) ) { - if ( inside( &s ) ) { - outvertexarray[*outlength] = p; - (*outlength)++; - }else { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - outvertexarray[*outlength] = p; - (*outlength)++; - } - } else { - if ( inside( &s ) ) { -#if 0 - intersect( &s, &p, &intersection ); - outvertexarray[*outlength] = intersection; -#else - intersect( &s, &p, &outvertexarray[*outlength] ); -#endif - (*outlength)++; - } - } - s = p; - } -} /* shClipPolygon */ - -/*--------------------------------------------------------------------------- -** guDrawTriangleWithClip -** -** NOTE: This routine snaps vertices by adding a large number then -** subtracting that same number again. In order for this to work -** you MUST set up the FPU to work in single precision mode. Code -** to perform this is listed in the Appendix to the Glide Programmer's -** Guide. -*/ -static const float vertex_snap_constant = ( float ) ( 1L << 19 ); - -GR_DIENTRY(guDrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - outlength; - - GDBG_INFO_MORE((99,"guDrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c)); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { - grDrawTriangle( a, b, c ); - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || \ - defined ( __DJGPP__ ) || defined (__GNUC__) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawTriangleWithClip */ - -/*--------------------------------------------------------------------------- -** guAADrawTriangleWithClip -*/ -GR_DIENTRY(guAADrawTriangleWithClip, void, - (const GrVertex *a, const GrVertex *b, const GrVertex *c )) -{ - GR_DCL_GC; - GrVertex - output_array[8], - output_array2[8], - input_array[3]; - int - i, - ilist[10], - outlength; - - GDBG_INFO_MORE((99,"guAADrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c)); - - /* - ** perform trivial accept - */ - if ( - ( a->x >= gc->state.clipwindowf_xmin) && - ( a->x < gc->state.clipwindowf_xmax ) && - ( a->y >= gc->state.clipwindowf_ymin ) && - ( a->y < gc->state.clipwindowf_ymax ) && - ( b->x >= gc->state.clipwindowf_xmin ) && - ( b->x < gc->state.clipwindowf_xmax ) && - ( b->y >= gc->state.clipwindowf_ymin ) && - ( b->y < gc->state.clipwindowf_ymax ) && - ( c->x >= gc->state.clipwindowf_xmin ) && - ( c->x < gc->state.clipwindowf_xmax ) && - ( c->y >= gc->state.clipwindowf_ymin ) && - ( c->y < gc->state.clipwindowf_ymax ) - ) - { - grAADrawTriangle( a, b, c, FXTRUE, FXTRUE, FXTRUE ); - return; - } - - /* - ** go ahead and clip and render - */ - input_array[0] = *a; - input_array[1] = *b; - input_array[2] = *c; - - shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || \ - defined ( __DJGPP__ ) || defined ( __GNUC__ ) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - ilist[i] = i; - } - - ilist[outlength] = 0; -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grAADrawPolygon( outlength, ilist, output_array2 ); -} /* guAADrawTriangleWithClip */ - - -/*--------------------------------------------------------------------------- -** guDrawPolygonVertexListWithClip -*/ -GR_DIENTRY(guDrawPolygonVertexListWithClip, void, - ( int nverts, const GrVertex vlist[] )) -{ - GrVertex - output_array[GU_PRIM_MAX_VERTICES+8], - output_array2[GU_PRIM_MAX_VERTICES+8]; - int - i, - outlength; - - GDBG_INFO_MORE((99,"guDrawPolygonVertexListWithClip(%d,0x%x)\n",nverts,vlist)); - /* - ** go ahead and clip and render - */ - shClipPolygon( vlist, output_array, nverts, &outlength, belowXMax, intersectRight ); - shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom ); - shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft ); - shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop ); - - /* - ** snap vertices then decompose the n-gon into triangles - */ -#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || \ - defined ( __DJGPP__ ) || defined ( __GNUC__ ) - for ( i = 0; i < outlength; i++ ) { - output_array2[i].x += vertex_snap_constant; - output_array2[i].x -= vertex_snap_constant; - output_array2[i].y += vertex_snap_constant; - output_array2[i].y -= vertex_snap_constant; - } -#else -# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER -#endif - grDrawPolygonVertexList( outlength, output_array2 ); -} /* guDrawPolygonVertexListWithClip */ diff --git a/glide2x/sst1/glide/src/gump.c b/glide2x/sst1/glide/src/gump.c deleted file mode 100644 index bbcb81a..0000000 --- a/glide2x/sst1/glide/src/gump.c +++ /dev/null @@ -1,90 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 7 11/12/97 5:11p Pgj - * stubs for evil guFb{Read|Write}Region() - * - * 6 3/09/97 10:31a Dow - * Added GR_DIENTRY for di glide functions - * - * 5 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -/* Implements multipass drawing */ - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" -#include "gump.h" - -/* CHD BUG this belongs in fxglide.h */ -void FX_CSTYLE -_gumpTexCombineFunction( int virtual_tmu ); - -GrMPState _gumpState; - -GR_DIENTRY(guMPInit, void, ( void )) -{ - int i; - - GDBG_INFO((98,"guMPInit()\n")); - for (i = 0; i < GLIDE_NUM_VIRTUAL_TMU; i += 1) - { - _gumpState.mmid[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE; - } - _gumpState.tc_fnc = GR_MPTEXTURECOMBINE_ADD; -} - -GR_DIENTRY(guMPTexCombineFunction, void, - ( GrMPTextureCombineFnc_t tc_fnc )) -{ - GDBG_INFO((98,"guMPTexCombineFunction(%d)\n",tc_fnc)); - _gumpState.tc_fnc = tc_fnc; -} - -GR_DIENTRY(guMPTexSource, void, - ( GrChipID_t virtual_tmu, GrMipMapId_t mmid )) -{ - GR_DCL_GC; - FXUNUSED( gc ); - GDBG_INFO((98,"guMPTexSource(%d,%d)\n",virtual_tmu,mmid)); - GR_CHECK_TMU("guMPTexSource",virtual_tmu); - _gumpState.mmid[virtual_tmu] = mmid; -} - -/*--------------------------------------------------------------------------- -** guFbReadRegion XXX obsolete -*/ -GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) ) -{ -} - -/*--------------------------------------------------------------------------- -** guFbWriteRegion XXX obsolete -*/ -GR_ENTRY(guFbWriteRegion, void, ( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes)) -{ -} diff --git a/glide2x/sst1/glide/src/gump.h b/glide2x/sst1/glide/src/gump.h deleted file mode 100644 index b8f6404..0000000 --- a/glide2x/sst1/glide/src/gump.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -*/ - -/* Multipass drawing */ - -#ifndef __GUMP_H__ -#define __GUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define GLIDE_NUM_VIRTUAL_TMU 2 /* Number of virtual TMUs */ - -typedef FxU32 GrMPTextureCombineFnc_t; -#define GR_MPTEXTURECOMBINE_ADD 0x0 /* */ -#define GR_MPTEXTURECOMBINE_MULTIPLY 0x1 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL0 0x2 /* */ -#define GR_MPTEXTURECOMBINE_DETAIL1 0x3 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR0 0x4 /* */ -#define GR_MPTEXTURECOMBINE_TRILINEAR1 0x5 /* */ -#define GR_MPTEXTURECOMBINE_SUBTRACT 0x6 /* */ - -typedef struct { - GrMipMapId_t mmid[GLIDE_NUM_VIRTUAL_TMU]; - GrMPTextureCombineFnc_t tc_fnc; -} GrMPState; - -FX_ENTRY void FX_CALL guMPInit( void ); -FX_ENTRY void FX_CALL guMPTexCombineFunction( GrMPTextureCombineFnc_t tc ); -FX_ENTRY void FX_CALL guMPTexSource( GrChipID_t virtual_tmu, GrMipMapId_t mmid ); -FX_ENTRY void FX_CALL guMPDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c ); - -#ifdef __cplusplus -} -#endif - -#endif /* __GUMP_H__ */ diff --git a/glide2x/sst1/glide/src/gutex.c b/glide2x/sst1/glide/src/gutex.c deleted file mode 100644 index 63c3ee8..0000000 --- a/glide2x/sst1/glide/src/gutex.c +++ /dev/null @@ -1,167 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 7 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 6 12/23/96 1:37p Dow - * chagnes for multiplatform glide - * - * 5 11/18/96 9:14a Sellers - * added checking for crossing of 2 MByte texture boundry -** -*/ - -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -/* externals from gtex.c and gtexdl.c */ -extern FxU32 _grMipMapHostSize[][16]; -extern FxU32 _gr_aspect_index_table[]; -extern FxU32 _gr_aspect_xlate_table[]; -extern FxU32 _gr_evenOdd_xlate_table[]; - -/*--------------------------------------------------------------------------- -** guTexSource -*/ - -GR_ENTRY(guTexSource, void, ( GrMipMapId_t mmid )) -{ - FxU32 texMode, tLod; - FxU32 oldtexMode; - FxU32 baseAddress; - int tmu; - const GrMipMapInfo *mminfo; - - GR_BEGIN_NOFIFOCHECK("guTexSource",99); - GDBG_INFO_MORE((gc->myLevel,"(%d)\n",mmid)); - - /* - ** Make sure that mmid is not NULL - */ - if ( mmid == GR_NULL_MIPMAP_HANDLE ) - { - return; - } - - /* - ** get a pointer to the relevant GrMipMapInfo struct - */ - mminfo = &gc->mm_table.data[mmid]; - tmu = mminfo->tmu; - - GR_CHECK_TMU( myName, tmu ); - GR_CHECK_W( myName, mmid == gc->state.current_mm[tmu], "setting same state twice" ); - - gc->state.current_mm[tmu] = mmid; - - /* - ** Set up new glide state for this mmid - */ - gc->state.tmu_config[tmu].mmMode = mminfo->mipmap_mode; - gc->state.tmu_config[tmu].smallLod = mminfo->lod_min; - gc->state.tmu_config[tmu].largeLod = mminfo->lod_max; - gc->state.tmu_config[tmu].evenOdd = mminfo->odd_even_mask; - gc->state.tmu_config[tmu].nccTable = 0; - - /* - ** Set up base address, texMode, and tLod registers - */ - baseAddress = mminfo->tmu_base_address >> 3; - texMode = mminfo->tTextureMode; - tLod = mminfo->tLOD; - - oldtexMode = gc->state.tmu_config[tmu].textureMode; - oldtexMode &= ~( SST_TFORMAT | SST_TCLAMPT | - SST_TCLAMPS | SST_TNCCSELECT | - SST_TLODDITHER | SST_TCLAMPW | - SST_TMAGFILTER | SST_TMINFILTER | - SST_TRILINEAR ); - texMode |= oldtexMode; - if (!gc->state.allowLODdither) - texMode &= ~SST_TLODDITHER; - - /* - ** Download the NCC table, if needed. - */ - if ( - (mminfo->format==GR_TEXFMT_YIQ_422) || - (mminfo->format==GR_TEXFMT_AYIQ_8422) - ) - { - int - table; /* ncc table we'll use */ - /* See if it's already down there */ - if (gc->tmu_state[tmu].ncc_mmids[0] == mmid) { - /* Table 0 has what we need, so make it current */ - table = 0; - } else if (gc->tmu_state[tmu].ncc_mmids[1] == mmid) { - /* Table 1 has what we need, so make it current */ - table = 1; - } else { - /* - ** it's not down there, so we need to pick the table and - ** download it - */ - /* Which table should we use? */ - table = gc->tmu_state[tmu].next_ncc_table; - /* Download NCC table */ - _grTexDownloadNccTable( tmu, table, &mminfo->ncc_table, 0, 11 ); - /* Set the mmid so we known it's down there */ - gc->tmu_state[tmu].ncc_mmids[table] = mmid; - /* Set the state to know which table was the LRA */ - gc->tmu_state[tmu].next_ncc_table = - (table == 0 ? 1 : 0); - } /* we had to download it */ - /* - ** Setting the TNCCSelect bit to 0 selects table 0, setting it to 1 - ** selects table 1 - */ - if (table == 0) - texMode &= ~(SST_TNCCSELECT); - else - texMode |= SST_TNCCSELECT; - } /* if it's an NCC texture */ - - GR_SET_EXPECTED_SIZE(12+2*PACKER_WORKAROUND_SIZE); - - /* Write relevant registers out to hardware */ - - PACKER_WORKAROUND; - hw = SST_TMU(hw,tmu); - GR_SET( hw->texBaseAddr , baseAddress ); - GR_SET( hw->textureMode , texMode ); - GR_SET( hw->tLOD , tLod ); - PACKER_WORKAROUND; - - /* update shadows */ - gc->state.tmu_config[tmu].texBaseAddr = baseAddress; - gc->state.tmu_config[tmu].textureMode = texMode; - gc->state.tmu_config[tmu].tLOD = tLod; - - GR_END(); -} /* guTexSource */ - diff --git a/glide2x/sst1/glide/src/gxdraw.c b/glide2x/sst1/glide/src/gxdraw.c deleted file mode 100644 index 179f8ca..0000000 --- a/glide2x/sst1/glide/src/gxdraw.c +++ /dev/null @@ -1,859 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 36 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 35 9/10/97 10:13p Peter - * fifo logic from GaryT, non-normalized fp first cut - * - * 34 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 33 8/01/97 11:49a Dow - * Added conventional FIFO accounting - * - * 32 7/07/97 3:43p Jdt - * Fixes to trisetup_nogradients - * - * 31 7/07/97 2:14p Jdt - * Mods to drawtriangle for parity with asm - * - * 30 7/07/97 8:33a Jdt - * New tracing macros. - * - * 29 7/04/97 12:08p Dow - * Fixed chip field muckage - * - * 28 7/01/97 7:44a Jdt - * Separated SST-1 and SST-96 trisetup implementations. - * - * 27 6/30/97 3:30p Jdt - * Fixed Watcom Wart. - * - * 26 6/30/97 3:23p Jdt - * rollback - * - * 24 6/29/97 11:49p Jdt - * First pass at triangle setup optimization for SST96 - * - * 23 6/20/97 5:53p Dow - * Change for subtle chip field bug - * - * 22 6/18/97 5:54p Dow - * P6 adjustments - * - * 21 5/27/97 11:37p Pgj - * Fix for Bug report 545 - * - * 20 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 19 3/21/97 12:42p Dow - * Made STWHints not send the Bend Over Baby Packet to FBI Jr. - * - * 18 3/04/97 9:45p Dow - * More neutering of the multiheaded... - * - * 17 3/04/97 9:08p Dow - * Neutered multiplatform multiheaded monster - * - * 16 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 15 12/23/96 1:37p Dow - * chagnes for multiplatform glide -** -*/ - -#include <3dfx.h> -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#ifdef GDBG_INFO_ON - /* Some debugging information */ -static char *indexNames[] = { - "GR_VERTEX_X_OFFSET", /* 0 */ - "GR_VERTEX_Y_OFFSET", /* 1 */ - "GR_VERTEX_Z_OFFSET", /* 2 */ - "GR_VERTEX_R_OFFSET", /* 3 */ - "GR_VERTEX_G_OFFSET", /* 4 */ - "GR_VERTEX_B_OFFSET", /* 5 */ - "GR_VERTEX_OOZ_OFFSET", /* 6 */ - "GR_VERTEX_A_OFFSET", /* 7 */ - "GR_VERTEX_OOW_OFFSET", /* 8 */ - "GR_VERTEX_SOW_TMU0_OFFSET", /* 9 */ - "GR_VERTEX_TOW_TMU0_OFFSET", /* 10 */ - "GR_VERTEX_OOW_TMU0_OFFSET", /* 11 */ - "GR_VERTEX_SOW_TMU1_OFFSET", /* 12 */ - "GR_VERTEX_TOW_TMU1_OFFSET", /* 13 */ - "GR_VERTEX_OOW_TMU1_OFFSET" /* 14 */ -}; -#endif - -/* - ** _trisetup - ** - ** This routine does all the setup needed for drawing a triangle. It - ** is intended to be an exact specification for the mechanisim used - ** to pass vertices to the assembly language triangle setup code, and - ** as such has no optimizations at all. Whenever a 'shortcut' - ** routine to draw triangles (such as for antialiasing, fast lines, - ** fast spans, polygons, etc) is needed, this code should be used as - ** the starting point. -** -*/ - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -GR_DDFUNC(_trisetup, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float ooa, dxAB, dxBC, dyAB, dyBC; - int i,j,culltest; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - volatile FxU32 *fifoPtr; - - culltest = gc->state.cull_mode; /* 1 if negative, 0 if positive */ - _GlideRoot.stats.trisProcessed++; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - culltest ^= 1; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - culltest ^= 1; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - culltest ^= 1; - } - } - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) - return 0; - - /* Backface culling, use sign bit as test */ - if (gc->state.cull_mode != GR_CULL_DISABLE) { - if ((j ^ (culltest<<31)) >= 0) { - return -1; - } - } - - /* Fence On P6 If Necessary */ - if ( _GlideRoot.CPUType == 6 ) { - /* In the macro there is a slop of 4 DWORDS that I have removed */ - if ( (gc->hwDep.sst96Dep.writesSinceFence + ( _GlideRoot.curTriSize >> 2 )) > 128 ) { - P6FENCE; - gc->hwDep.sst96Dep.writesSinceFence = 0; - } - gc->hwDep.sst96Dep.writesSinceFence += - _GlideRoot.curTriSize>>2; - } - - /* Wrap Fifo now if triangle is going to incur a wrap */ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) _GlideRoot.curTriSize ) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSize; - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize); - - /* Grab fifo pointer into a local */ - fifoPtr = gc->fifoData.hwDep.vg96FIFOData.fifoPtr; - - /* Settle Bookeeping */ - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= _GlideRoot.curTriSize; - gc->fifoData.hwDep.vg96FIFOData.fifoPtr += _GlideRoot.curTriSize>>2; - - /* Start first group write packet */ - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[0] ); - - ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - FSET_GW_ENTRY( fifoPtr, 2, fa[0] ); - FSET_GW_ENTRY( fifoPtr, 3, fa[1] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - FSET_GW_ENTRY( fifoPtr, 4, fb[0] ); - FSET_GW_ENTRY( fifoPtr, 5, fb[1] ); - - /* write out X & Y for vertex C */ - FSET_GW_ENTRY( fifoPtr, 6, fc[0] ); - FSET_GW_ENTRY( fifoPtr, 7, fc[1] ); - fifoPtr += 8; - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - while (i) { - fp = dlp->addr; - /* chip field change */ - if (i & 1) - goto secondary_packet; - else { - float dpAB, dpBC,dpdx, dpdy; - - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - FSET_GW_ENTRY( fifoPtr, 1, dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - dlp++; - i = dlp->i; - FSET_GW_ENTRY( fifoPtr, 2, dpdy ); - fifoPtr += 3; - } - } - - /* write triangle command */ -triangle_command: - FSET_GW_ENTRY( fifoPtr, 0, _GlideRoot.pool.ftemp1 ); - fifoPtr+=1; - - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - GR_ASSERT(fifoPtr == gc->fifoData.hwDep.vg96FIFOData.fifoPtr); - - GR_CHECK_SIZE(); - - _GlideRoot.stats.trisDrawn++; - - return 1; - -secondary_packet: - /* Round out last header */ - if (((FxU32) fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - /* Start new packet - note, there can only ever be two different packets - using gwHeaderNum++ would be more general, but this - reflects the actual implementation */ - SET_GW_CMD( fifoPtr, 0, (FxU32)fp ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[1] ); - fifoPtr+=2; - dlp++; - i = dlp->i; - while( i ) { - float dpAB, dpBC,dpdx, dpdy; - - fp = dlp->addr; - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - FSET_GW_ENTRY( fifoPtr, 1, dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - dlp++; - i = dlp->i; - FSET_GW_ENTRY( fifoPtr, 2, dpdy ); - fifoPtr += 3; - } - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, GW_TRICMD_MASK ); - fifoPtr += 2; - goto triangle_command; -} /* _trisetup */ -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) -GR_DDFUNC(_trisetup, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float ooa, dxAB, dxBC, dyAB, dyBC; - int i,j,culltest; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - - culltest = gc->state.cull_mode; /* 1 if negative, 0 if positive */ - _GlideRoot.stats.trisProcessed++; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - culltest ^= 1; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - culltest ^= 1; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - culltest ^= 1; - } - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) && defined(GLIDE_USE_ALT_REGMAP) - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) - return 0; - - /* Backface culling, use sign bit as test */ - if (gc->state.cull_mode != GR_CULL_DISABLE) { - if ((j ^ (culltest<<31)) >= 0) { - return -1; - } - } - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize); - - ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1; - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - GR_SETF( hw->FvA.x, fa[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvA.y, fa[GR_VERTEX_Y_OFFSET] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - GR_SETF( hw->FvB.x, fb[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvB.y, fb[GR_VERTEX_Y_OFFSET] ); - - /* write out X & Y for vertex C */ - GR_SETF( hw->FvC.x, fc[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvC.y, fc[GR_VERTEX_Y_OFFSET] ); - - /* - ** Divide the deltas by the area for gradient calculation. - */ - dxBC *= ooa; - dyAB *= ooa; - dxAB *= ooa; - dyBC *= ooa; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - /* - ** The src vector contains offsets from fa, fb, and fc to for which - ** gradients need to be calculated, and is null-terminated. - */ - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0F ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - float dpAB, dpBC,dpdx, dpdy; - - dpBC = FARRAY(fb,i); - dpdx = FARRAY(fa,i); - GR_SETF( fp[0], dpdx ); - - dpAB = dpdx - dpBC; - dpBC = dpBC - FARRAY(fc,i); - dpdx = dpAB * dyBC - dpBC * dyAB; - -GDBG_INFO((285,"p0,1x: %g %g dpdx: %g\n",dpAB * dyBC,dpBC * dyAB,dpdx)); - GR_SETF( fp[DPDX_OFFSET>>2] , dpdx ); - dpdy = dpBC * dxAB - dpAB * dxBC; - -GDBG_INFO((285,"p0,1y: %g %g dpdy: %g\n",dpBC * dxAB,dpAB * dxBC,dpdy)); - dlp++; - i = dlp->i; - GR_SETF( fp[DPDY_OFFSET>>2] , dpdy ); - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, _GlideRoot.pool.ftemp1 ) ); - _GlideRoot.stats.trisDrawn++; - - GR_CHECK_SIZE(); - _GlideRoot.stats.trisDrawn++; - return 1; -} /* _trisetup */ -#else -#error "Need to implement trisetup for this platform" -#endif - -/* -** _trisetup_nogradients -** -** This routine does all the setup needed for drawing a triangle except -** that it assumes that the gradients are already in the chip. -** -** Also we assume we don't have to test for backface triangles - this is -** typically done outside this routine, as in grDrawPlanarPolygon -*/ - -#if ( GLIDE_PLATFORM & GLIDE_HW_SST96 ) -GR_DDFUNC(_trisetup_nogradients, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - int i,j; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - volatile FxU32 *fifoPtr; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - } - } - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - _GlideRoot.stats.trisProcessed++; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) { - return 0; - } - - /* Fence On P6 If Necessary */ - if ( _GlideRoot.CPUType == 6 ) { - /* In the macro there is a slop of 4 DWORDS that I have removed */ - if ( (gc->hwDep.sst96Dep.writesSinceFence + - ( _GlideRoot.curTriSizeNoGradient >> 2 )) > 128 ) { - P6FENCE; - gc->hwDep.sst96Dep.writesSinceFence = 0; - } - gc->hwDep.sst96Dep.writesSinceFence += - _GlideRoot.curTriSizeNoGradient>>2; - } - - /* Wrap Fifo now if triangle is going to incur a wrap */ - if (gc->fifoData.hwDep.vg96FIFOData.fifoSize < (FxU32) _GlideRoot.curTriSizeNoGradient ) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSizeNoGradient; - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - - /* bookeeping */ - fifoPtr = gc->fifoData.hwDep.vg96FIFOData.fifoPtr; - gc->fifoData.hwDep.vg96FIFOData.fifoSize -= _GlideRoot.curTriSizeNoGradient; - gc->fifoData.hwDep.vg96FIFOData.fifoPtr += _GlideRoot.curTriSizeNoGradient>>2; - - /* packet header */ - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, (gc->hwDep.sst96Dep.gwHeaders[0] & ~GWH_DXY_BITS) ); - - FSET_GW_ENTRY( fifoPtr, 2, fa[0] ); - FSET_GW_ENTRY( fifoPtr, 3, fa[1] ); - - dlp = gc->dataList; - i = dlp->i; - - /* write out X & Y for vertex B */ - FSET_GW_ENTRY( fifoPtr, 4, fb[0] ); - FSET_GW_ENTRY( fifoPtr, 5, fb[1] ); - - /* write out X & Y for vertex C */ - FSET_GW_ENTRY( fifoPtr, 6, fc[0] ); - FSET_GW_ENTRY( fifoPtr, 7, fc[1] ); - fifoPtr += 8; - - dlp = gc->dataList; - i = dlp->i; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - while (i) { - fp = dlp->addr; - if (i & 1) - goto secondary_packet; - else { - float dpdx; - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - fifoPtr += 1; - dlp++; - i = dlp->i; - } - } - -triangle_command: - FSET_GW_ENTRY( fifoPtr, 0, _GlideRoot.pool.ftemp1 ); - fifoPtr += 1; - - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - GR_ASSERT(fifoPtr == gc->fifoData.hwDep.vg96FIFOData.fifoPtr); - - _GlideRoot.stats.trisDrawn++; - - return 1; - -secondary_packet: - /* Round out last packet */ - if (((FxU32) fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - - /* Start new packet - note, there can only ever be two different packets - using gwHeaderNum++ would be more general, but this - reflects the actual implementation */ - SET_GW_CMD( fifoPtr, 0, (FxU32)fp ); - SET_GW_HEADER( fifoPtr, 1, gc->hwDep.sst96Dep.gwHeaders[1] ); - fifoPtr+=2; - dlp++; - i = dlp->i; - while( i ) { - float dpdx; - dpdx = FARRAY(fa,i); - FSET_GW_ENTRY( fifoPtr, 0, dpdx ); - dlp++; - i = dlp->i; - fifoPtr += 1; - } - if (((FxU32)fifoPtr) & 0x7) { - FSET_GW_ENTRY( fifoPtr, 0, 0.0f ); - fifoPtr += 1; - } - SET_GW_CMD( fifoPtr, 0, gc->hwDep.sst96Dep.gwCommand ); - SET_GW_HEADER( fifoPtr, 1, GW_TRICMD_MASK ); - fifoPtr += 2; - goto triangle_command; -} /* _trisetup_nogradients */ - -#elif ( GLIDE_PLATFORM & GLIDE_HW_SST1 ) - -GR_DDFUNC(_trisetup_nogradients, FxI32, ( const GrVertex *va, const GrVertex *vb, const GrVertex *vc )) -{ - GR_DCL_GC; - GR_DCL_HW; - const float *fa = &va->x; - const float *fb = &vb->x; - const float *fc = &vc->x; - float dxAB, dxBC, dyAB, dyBC; - int i,j; - int ay, by, cy; - float *fp; - struct dataList_s *dlp; - - /* - ** Sort the vertices. - ** Whenever the radial order is reversed (from counter-clockwise to - ** clockwise), we need to change the area of the triangle. Note - ** that we know the first two elements are X & Y by looking at the - ** grVertex structure. - */ - ay = *(int *)&va->y; - by = *(int *)&vb->y; - if (ay < 0) ay ^= 0x7FFFFFFF; - cy = *(int *)&vc->y; - if (by < 0) by ^= 0x7FFFFFFF; - if (cy < 0) cy ^= 0x7FFFFFFF; - if (ay < by) { - if (by > cy) { /* acb */ - if (ay < cy) { - fa = &va->x; - fb = &vc->x; - fc = &vb->x; - } else { /* cab */ - fa = &vc->x; - fb = &va->x; - fc = &vb->x; - } - /* else it's already sorted */ - } - } else { - if (by < cy) { /* bac */ - if (ay < cy) { - fa = &vb->x; - fb = &va->x; - fc = &vc->x; - } else { /* bca */ - fa = &vb->x; - fb = &vc->x; - fc = &va->x; - } - } else { /* cba */ - fa = &vc->x; - fb = &vb->x; - fc = &va->x; - } - } -#if (GLIDE_PLATFORM & GLIDE_HW_SST1) && defined(GLIDE_USE_ALT_REGMAP) - hw = SST_WRAP(hw,128); /* use alternate register mapping */ -#endif - - GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSizeNoGradient); - - /* GMT: note that we spread out our PCI writes */ - /* write out X & Y for vertex A */ - GR_SETF( hw->FvA.x, fa[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvA.y, fa[GR_VERTEX_Y_OFFSET] ); - - /* Compute Area */ - dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET]; - dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET]; - - dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET]; - dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET]; - - /* write out X & Y for vertex B */ - GR_SETF( hw->FvB.x, fb[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvB.y, fb[GR_VERTEX_Y_OFFSET] ); - - /* this is where we store the area */ - _GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB; - _GlideRoot.stats.trisProcessed++; - - /* Zero-area triangles are BAD!! */ - j = *(long *)&_GlideRoot.pool.ftemp1; - if ((j & 0x7FFFFFFF) == 0) { - GR_CHECK_SIZE_SLOPPY(); - return 0; - } - - /* write out X & Y for vertex C */ - GR_SETF( hw->FvC.x, fc[GR_VERTEX_X_OFFSET] ); - GR_SETF( hw->FvC.y, fc[GR_VERTEX_Y_OFFSET] ); - - dlp = gc->dataList; - i = dlp->i; - -/* access a floating point array with a byte index */ -#define FARRAY(p,i) (*(float *)((i)+(int)(p))) - - /* - ** The src vector contains offsets from fa, fb, and fc to for which - ** gradients need to be calculated, and is null-terminated. - */ - while (i) { - fp = dlp->addr; - if (i & 1) { /* packer bug check */ - if (i & 2) P6FENCE; - GR_SETF( fp[0], 0.0F ); - if (i & 2) P6FENCE; - dlp++; - i = dlp->i; - } - else { - GR_SETF( fp[0], FARRAY(fa,i) ); - dlp++; - i = dlp->i; - } - } - - /* Draw the triangle by writing the area to the triangleCMD register */ - P6FENCE_CMD( GR_SETF( hw->FtriangleCMD, _GlideRoot.pool.ftemp1 ) ); - _GlideRoot.stats.trisDrawn++; - - GR_CHECK_SIZE(); - return 1; -} /* _trisetup_nogradients */ -#else -#error "Need Triangle Setup code for this hardware" -#endif - diff --git a/glide2x/sst1/glide/src/makefile.linux b/glide2x/sst1/glide/src/makefile.linux deleted file mode 100644 index b03f79c..0000000 --- a/glide2x/sst1/glide/src/makefile.linux +++ /dev/null @@ -1,199 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -# local defines, options, includes - -# Stuff for debugging -ifneq ($(DEBUG),) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -# Display Options (Hardware) -DSPOPTS = -DGLIDE_HARDWARE - -# Compile for specific hardware -ifeq ($(FX_GLIDE_HW),SST96) -HWSPEC = sst96.c -LCDEFS += -DSST96 -DGLIDE_USE_ALT_REGMAP - -ASMTRISETUP = xdraw96.S -# LIBOBJS = xdraw96.o - -FX_GLIDE_FIFO96 = 1 -FX_GLIDE_GROUP_WRITE=1 - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -else # Default to SST1 -LCDEFS += -DSST1 -LADEFS += /DSST1 -ASMTRISETUP = xdraw.S -# LIBOBJS = xdraw.o -endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# SST96 has no notion of alternate register mapping -ifneq ($(FX_GLIDE_HW),SST96) -# Turn on/off alt register set. (G lide R eg M ap OPTS) -ifeq ($(FX_GLIDE_REG_MAP),ORIG) -GRMOPTS = -DGLIDE_USE_ALT_REGMAP -ASM_REGMAP_DEFS = -DGLIDE_USE_ALT_REGMAP -else -endif -endif - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -LIBOBJS = -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifneq ($(FX_GLIDE_NO_PLUG),1) -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifneq ($(FX_GLIDE_NO_SPLASH),1) -LCDEFS += -DGLIDE_SPLASH -endif - -# Turn On group writes -ifneq ($(FX_GLIDE_GROUP_WRITE),) -LCDEFS += -DGROUP_WRITE -endif - -ifeq ($(FX_GLIDE_FIFO96),1) -LCDEFS += -DSST96_FIFO -endif - -ifdef GLIDE_SANITY_ALL -GLIDE_SANITY_SIZE = $(GLIDE_SANITY_ALL) -GLIDE_SANITY_ASSERT = $(GLIDE_SANITY_ALL) -endif - -ifdef GLIDE_SANITY_SIZE -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifdef GLIDE_SANITY_ASSERT -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS = -I$(SST1INC) -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(SST1INC) -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -CFILES = gsplash.c g3df.c gu.c guclip.c gpci.c gump.c\ - diglide.c disst.c ditex.c gbanner.c gerror.c\ - gmovie.c digutex.c ddgump.c gaa.c gdraw.c\ - gglide.c glfb.c gsst.c gtex.c gtexdl.c\ - gutex.c gxdraw.c $(HWSPEC) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c - -CODFILES = $(CFILES:.c=.cod) - -SST1INC = $(BUILD_ROOT_HW)/include -SWLIBSINC = $(BUILD_ROOT_SWLIBS)/include - -# sublibs for hardware -SUBLIBRARIES = \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT_HW)/lib/libinit.a \ - $(BUILD_ROOT_HW)/lib/libsst1.a \ - $(BUILD_ROOT_HW)/lib/libinit96.a - - -LINKLIBRARIES+=-lm -ifeq ($(FX_GLIDE_HW),SST96) -LINKLIBRARIES += -L$(XLOCATION)/lib -lX11 -lXext \ - -lXxf86rush -lXxf86dga -lXxf86vm -endif - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h - -LIBRARIES = libglide.a -SHARED_LIBRARY = libglide.so.2.46 - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -fxgasm : fxgasm.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT_HW)/include -I$(BUILD_ROOT_SWLIBS)/include $(LDFLAGS) - -fxgasm.h : fxgasm - ./fxgasm > fxgasm.h - -fxinline.h : fxgasm - ./fxgasm -inline > fxinline.h - -ASM_DEFINES = -DGLIDE_HARDWARE=1 -ifneq ($(DEBUG),) -ASM_DEFINES += -DGLIDE_DEBUG=1 -else -ASM_DEFINES += -DGLIDE_DEBUG=0 -endif - -xdraw.o : fxgasm.h xdraw.S -# $(CC) -c -o $@ xdraw.S $(ASM_OPTS) $(LAOPTS) - gasp xdraw.S $(ASM_DEFINES) | as -V -Qy -o xdraw.o - -xdraw96.o : fxgasm.h xdraw96. -# $(CC) -c -o $@ xdraw96.S $(ASM_OPTS) $(LAOPTS) - gasp xdraw96.S $(ASM_DEFINES) | as -V -Qy -o xdraw96.o - -gsplash.o : gsplash.c splshdat.c fxinline.h diff --git a/glide2x/sst1/glide/src/makefile.unix b/glide2x/sst1/glide/src/makefile.unix deleted file mode 100644 index 88d9539..0000000 --- a/glide2x/sst1/glide/src/makefile.unix +++ /dev/null @@ -1,197 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -# local defines, options, includes - -# Stuff for debugging -ifneq ($(DEBUG),) -DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON -GLIDE_SANITY_ALL = 1 -endif - -# Display Options (Hardware) -DSPOPTS = -DGLIDE_HARDWARE - -# Compile for specific hardware -ifeq ($(FX_GLIDE_HW),SST96) -HWSPEC = sst96.c -LCDEFS += -DSST96 -DGLIDE_USE_ALT_REGMAP - -ASMTRISETUP = xdraw96.s -LIBOBJS = xdraw96.o - -FX_GLIDE_FIFO96 = 1 -FX_GLIDE_GROUP_WRITE=1 - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -else # Default to SST1 -LCDEFS += -DSST1 -LADEFS += /DSST1 -ASMTRISETUP = xdraw.s -LIBOBJS = xdraw.o -endif - -# Optimization Options -# This is for turning on and off algorithmic optimizations, -# not flags to the C compiler. Usually this involves -# enabling/disabling assembly language code, but it can also -# change the way C code works, or how C code generates data to be -# used by various pieces of code. -# Usually these are set with environment variables or arguments to -# nmake. -# - -# SST96 has no notion of alternate register mapping -ifneq ($(FX_GLIDE_HW),SST96) -# Turn on/off alt register set. (G lide R eg M ap OPTS) -ifeq ($(FX_GLIDE_REG_MAP),ORIG) -GRMOPTS = -DGLIDE_USE_ALT_REGMAP -ASM_REGMAP_DEFS = -DGLIDE_USE_ALT_REGMAP -else -endif -endif - -# Turn on/off assembly language trisetup code. -# (C on is Assembly off) (A ssembly T ri S etup OPTS) -ifeq ($(FX_GLIDE_CTRISETUP),1) -ASMTRISETUP = -ATSOPTS = -DGLIDE_USE_C_TRISETUP -LIBOBJS = -endif - -OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS) - -# local defines, begin with basics and then add on -LCDEFS += -DGLIDE_LIB - -# Turn Off/On compilation of shameless plug -ifneq ($(FX_GLIDE_NO_PLUG),1) -LCDEFS += -DGLIDE_PLUG -endif - -# Turn Off/On splash screen -ifneq ($(FX_GLIDE_NO_SPLASH),1) -LCDEFS += -DGLIDE_SPLASH -endif - -# Turn On group writes -ifneq ($(FX_GLIDE_GROUP_WRITE),) -LCDEFS += -DGROUP_WRITE -endif - -ifeq ($(FX_GLIDE_FIFO96),1) -LCDEFS += -DSST96_FIFO -endif - -ifdef GLIDE_SANITY_ALL -GLIDE_SANITY_SIZE = $(GLIDE_SANITY_ALL) -GLIDE_SANITY_ASSERT = $(GLIDE_SANITY_ALL) -endif - -ifdef GLIDE_SANITY_SIZE -LCDEFS += -DGLIDE_SANITY_SIZE -endif -ifdef GLIDE_SANITY_ASSERT -LCDEFS += -DGLIDE_SANITY_ASSERT -endif - -# Local Defs, Includes, and Options (C) -LCINCS = -I$(SST1INC) -LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -# Local Defs, Includes, and Options (ASM) -LADEFS += $(ASM_REGMAP_DEFS) -LAINCS = -I$(SST1INC) -LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) - -AFILES = $(ASMTRISETUP) - -# sources -HEADERS = glide.h gump.h glidesys.h glideutl.h -PRIVATE_HEADERS = fxglide.h gsstdef.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -CFILES = gsplash.c g3df.c gu.c guclip.c gpci.c gump.c\ - diglide.c disst.c ditex.c gbanner.c gerror.c\ - gmovie.c digutex.c ddgump.c gaa.c gdraw.c\ - gglide.c glfb.c gsst.c gtex.c gtexdl.c\ - gutex.c gxdraw.c $(HWSPEC) \ - cpudetect.c - -OFILES = $(CFILES:.c=.o) - -OTHER_CFILES = fxgasm.c - -CODFILES = $(CFILES:.c=.cod) - -SST1INC = $(BUILD_ROOT_SST1)/include -SWLIBSINC = $(BUILD_ROOT_SWLIBS)/include - -# sublibs for hardware -SUBLIBRARIES = \ - $(BUILD_ROOT_SWLIBS)/lib/libfxmisc.a \ - $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a \ - $(BUILD_ROOT_SST1)/lib/libinit.a \ - $(BUILD_ROOT_SST1)/lib/libsst1.a \ - $(BUILD_ROOT_SST1)/lib/libinit96.a - - -LINKLIBRARIES+=-lm -ifeq ($(FX_GLIDE_HW),SST96) -LINKLIBRARIES += -L$(XLOCATION)/lib -lX11 -lXext \ - -lXxf86rush -lXxf86dga -lXxf86vm -endif - -# targets -LDIRT = fxgasm.o fxgasm fxgasm.h - -LIBRARIES = libglide2x.a -SHARED_LIBRARY = libglide2x.so - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -fxgasm : fxgasm.c $(HEADERS) $(PRIVATE_HEADERS) - $(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \ - -I$(BUILD_ROOT_SST1)/include -I$(BUILD_ROOT_SWLIBS)/include $(LDFLAGS) - -fxgasm.h : fxgasm - ./fxgasm > fxgasm.h - -fxinline.h : fxgasm - ./fxgasm -inline > fxinline.h - -ASM_DEFINES = -DGLIDE_HARDWARE=1 -ifneq ($(DEBUG),) -ASM_DEFINES += -DGLIDE_DEBUG=1 -else -ASM_DEFINES += -DGLIDE_DEBUG=0 -endif - -xdraw.o : fxgasm.h xdraw.s - gasp xdraw.s $(ASM_DEFINES) | as -V -Qy -o xdraw.o - -xdraw96.o : fxgasm.h xdraw96.s - gasp xdraw96.s $(ASM_DEFINES) | as -V -Qy -o xdraw96.o - -gsplash.o : gsplash.c splshdat.c fxinline.h diff --git a/glide2x/sst1/glide/src/rcver.h b/glide2x/sst1/glide/src/rcver.h deleted file mode 100644 index 04187ed..0000000 --- a/glide2x/sst1/glide/src/rcver.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#define MANVERSION 2 -#define MANREVISION 46 - -#ifndef GLIDE3 -#define VERSIONSTR "2.46\0" -#else -#define VERSIONSTR "3.0\0" -#endif - -#ifdef SST1 -# define HWSTR "Voodoo Graphics(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Graphics\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(SST96) -# define HWSTR " Voodoo Rush(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo Rush\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(CVG) || defined(VOODOO2) -# define HWSTR " Voodoo^2(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#elif defined(H3) -# define HWSTR " Banshee(tm)\0" -# ifdef NT_BUILD -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 NT\0" -# else -# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 95/98\0" -# endif /* NT_BUILD */ -#else -# define HWSTR "Unknown Chip\0" -#endif diff --git a/glide2x/sst1/glide/src/readme b/glide2x/sst1/glide/src/readme deleted file mode 100644 index 835083d..0000000 --- a/glide2x/sst1/glide/src/readme +++ /dev/null @@ -1,40 +0,0 @@ -GDEBUG levels: - -Level Description ------ ------------------------------------------------ - 80 init routines - 81 gu3df* - 82 grLfb* - 83 grSst* - 84 grSstStatus, grSstIsBusy, grSstVideoLine - 85 gr* misc state routines - 86 grBuffer* - 87 grDisableAllEffects, grGlide?etState - 88 grTex* attribute routines - 89 grTex* download routines - 90 grDrawPoint - 91 grDrawLine - 92 grDrawTriangle - 93 grDrawPolygon* - 94 grDrawAAPoint - 95 grDrawAALine - 96 grDrawAATriangle - 97 grDrawAAPolygon* - 98 guMP* routines - 99 gu* misc. routines -280 internal init routines -281 routine exit traces -282 dataList values - -GLIDE_PLATFORM: - - GLIDE_HARDWARE: - Defined if GLIDE should use the actual SST hardware. - - GLIDE_HW_*: - GLIDE_HW_SST1: - This macro is for compiling - GLIDE_HW_SST96: - This macro is for compiling Glide for SST96 - GLIDE_HW_H3: - This macro is for compiling Glide for H3 diff --git a/glide2x/sst1/glide/src/splshdat.c b/glide2x/sst1/glide/src/splshdat.c deleted file mode 100644 index 25645b0..0000000 --- a/glide2x/sst1/glide/src/splshdat.c +++ /dev/null @@ -1,17359 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -** -*/ - -static Vert vert_0[] = { -{ 273.149261f, -24.549585f, 271.420441f, 0.012590f, -0.999890f, 0.007876f, 189.411841f, 18.708570f }, -{ 262.776489f, -24.549574f, 143.489777f, 0.005015f, -0.999765f, 0.021108f, 187.071440f, 69.986058f }, -{ 484.061951f, -24.549578f, 188.438385f, 0.011169f, -0.999936f, -0.001735f, 236.999758f, 51.969644f }, -{ 383.791992f, -24.549570f, 84.710793f, 0.010803f, -0.999785f, 0.017720f, 214.376000f, 93.546010f }, -{ 563.586426f, -24.549566f, 46.677605f, 0.009678f, -0.999914f, -0.008881f, 254.942760f, 108.790640f }, -{ 432.198181f, -24.549561f, -5.186394f, 0.013545f, -0.999894f, 0.005335f, 225.297815f, 129.578823f }, -{ 542.840820f, -24.549555f, -77.795677f, 0.007103f, -0.999894f, -0.012739f, 250.261958f, 158.682259f }, -{ 407.995087f, -24.549522f, -95.083649f, 0.013879f, -0.999904f, -0.000529f, 219.836900f, 165.611674f }, -{ 494.434692f, -24.549543f, -205.726379f, 0.002522f, -0.999903f, -0.013725f, 239.340159f, 209.959770f }, -{ 300.809937f, -24.549547f, -171.150482f, 0.015764f, -0.999874f, -0.001621f, 195.652869f, 196.100972f }, -{ 331.928192f, -24.549507f, -274.878052f, 0.002234f, -0.999897f, -0.014178f, 202.674041f, 237.677320f }, -{ 155.591354f, -24.549513f, -202.268799f, 0.011551f, -0.999861f, -0.012043f, 162.887410f, 208.573894f }, -{ 138.303436f, -24.549505f, -288.708374f, -0.003900f, -0.999855f, -0.016564f, 158.986767f, 243.220826f }, -{ -10.372740f, -24.549486f, -178.065643f, 0.019735f, -0.999598f, -0.020336f, 125.441172f, 198.872725f }, -{ -76.066864f, -24.549473f, -316.369080f, -0.005668f, -0.999796f, -0.019403f, 110.618699f, 254.307860f }, -{ -148.676147f, -24.549513f, -212.641541f, 0.006169f, -0.999812f, -0.018392f, 94.235969f, 212.731524f }, -{ -235.115784f, -24.549473f, -316.369080f, -0.011969f, -0.999851f, -0.012476f, 74.732718f, 254.307860f }, -{ -276.606812f, -24.549515f, -191.895996f, 0.001960f, -0.999741f, -0.022663f, 65.371153f, 204.416240f }, -{ -394.164703f, -24.549477f, -267.962891f, -0.008901f, -0.999940f, -0.006464f, 38.846733f, 234.905569f }, -{ -352.673676f, -24.549488f, -136.574646f, -0.001484f, -0.999702f, -0.024356f, 48.208294f, 182.242196f }, -{ -490.977112f, -24.549486f, -167.692871f, -0.010745f, -0.999942f, -0.000498f, 17.003084f, 194.715083f }, -{ -404.537445f, -24.549494f, -81.253296f, -0.011367f, -0.999900f, -0.008360f, 36.506343f, 160.068151f }, -{ -563.586426f, -24.549498f, -29.389488f, -0.008846f, -0.999795f, 0.018188f, 0.620349f, 139.279968f }, -{ -421.825378f, -24.549501f, 8.643953f, -0.014278f, -0.999891f, -0.003750f, 32.605693f, 124.035300f }, -{ -522.095337f, -24.549541f, 105.456299f, -0.006669f, -0.999881f, 0.013889f, 9.981924f, 85.230734f }, -{ -363.046448f, -24.549541f, 112.371468f, -0.021114f, -0.999733f, -0.009357f, 45.867897f, 82.458980f }, -{ -446.028503f, -24.549519f, 205.726318f, 0.001853f, -0.999682f, 0.025132f, 27.144776f, 45.040260f }, -{ -304.267487f, -24.549698f, 160.777710f, -0.020407f, -0.999774f, 0.005967f, 59.130113f, 63.056674f }, -{ -325.013000f, -24.549555f, 267.962860f, 0.003703f, -0.999746f, 0.022221f, 54.449330f, 20.094447f }, -{ -203.997513f, -24.549549f, 198.811157f, -0.010313f, -0.999774f, 0.018587f, 81.753890f, 47.811998f }, -{ -138.303391f, -24.549589f, 316.369080f, 0.008523f, -0.999823f, 0.016755f, 96.576363f, 0.692140f }, -{ -44.948593f, -24.549578f, 178.065643f, -0.007338f, -0.999733f, 0.021901f, 117.639871f, 56.127275f }, -{ 79.524475f, -24.549589f, 302.538696f, 0.018197f, -0.999766f, 0.011712f, 145.724552f, 6.235663f }, -{ 107.185158f, -24.549576f, 164.235291f, 0.002913f, -0.999764f, 0.021512f, 151.965595f, 61.670797f }, -{ 257.177246f, -24.933891f, 247.388947f, -0.002196f, -0.999908f, 0.013383f, 189.411841f, 18.708570f }, -{ 248.097778f, -24.933882f, 127.560898f, 0.006178f, -0.999976f, 0.003207f, 187.071440f, 69.986058f }, -{ 449.640747f, -24.933884f, 170.658722f, 0.002530f, -0.999944f, 0.010309f, 236.999758f, 51.969644f }, -{ 357.436859f, -24.933876f, 80.888054f, 0.006209f, -0.999981f, -0.000250f, 214.376000f, 93.546010f }, -{ 521.126526f, -24.933874f, 43.160934f, 0.006734f, -0.999927f, 0.010037f, 254.942760f, 108.790640f }, -{ 404.311340f, -24.933870f, -2.458469f, 0.006431f, -0.999963f, -0.005670f, 225.297815f, 129.578823f }, -{ 501.943878f, -24.933863f, -69.597458f, 0.008351f, -0.999957f, 0.004028f, 250.261958f, 158.682259f }, -{ 380.763092f, -24.933832f, -86.167274f, 0.003817f, -0.999973f, -0.006297f, 219.836900f, 165.611674f }, -{ 459.521820f, -24.933853f, -187.305740f, 0.007558f, -0.999970f, -0.001392f, 239.340159f, 209.959770f }, -{ 277.039581f, -24.933857f, -148.476547f, 0.001550f, -0.999981f, -0.006005f, 195.652869f, 196.100972f }, -{ 310.612000f, -24.933817f, -250.478271f, 0.010282f, -0.999945f, -0.002099f, 202.674041f, 237.677320f }, -{ 143.869293f, -24.933823f, -182.877960f, 0.000385f, -0.999975f, -0.007022f, 162.887410f, 208.573894f }, -{ 126.038422f, -24.933817f, -261.421204f, 0.007580f, -0.999942f, -0.007664f, 158.986767f, 243.220826f }, -{ -12.511669f, -24.933794f, -160.756546f, 0.000504f, -0.999969f, -0.007865f, 125.441172f, 198.872725f }, -{ -76.663612f, -24.933783f, -297.401611f, 0.011523f, -0.999829f, -0.014451f, 110.618699f, 254.307860f }, -{ -148.031876f, -24.933823f, -192.176437f, -0.004257f, -0.999964f, -0.007337f, 94.235969f, 212.731524f }, -{ -229.626144f, -24.933783f, -288.089294f, 0.004915f, -0.999922f, -0.011510f, 74.732718f, 254.307860f }, -{ -271.880676f, -24.933825f, -170.771347f, -0.005194f, -0.999973f, -0.005174f, 65.371153f, 204.416240f }, -{ -371.136383f, -24.933788f, -242.218704f, 0.003027f, -0.999922f, -0.012100f, 38.846733f, 234.905569f }, -{ -331.104309f, -24.933798f, -120.729073f, -0.004534f, -0.999987f, -0.002245f, 48.208294f, 182.242196f }, -{ -457.056519f, -24.933796f, -151.361816f, -0.000889f, -0.999896f, -0.014400f, 17.003084f, 194.715083f }, -{ -375.726990f, -24.933802f, -71.798042f, -0.008099f, -0.999961f, 0.003607f, 36.506343f, 160.068151f }, -{ -521.126587f, -24.933805f, -27.175323f, -0.006509f, -0.999977f, 0.001914f, 0.620349f, 139.279968f }, -{ -393.095642f, -24.933809f, 1.511459f, -0.005247f, -0.999950f, 0.008552f, 32.605693f, 124.035300f }, -{ -489.623932f, -24.933847f, 94.842606f, -0.009209f, -0.999957f, -0.000960f, 9.981924f, 85.230734f }, -{ -339.383545f, -24.933847f, 99.110413f, -0.004875f, -0.999978f, 0.004578f, 45.867897f, 82.458980f }, -{ -420.171265f, -24.933825f, 190.964874f, -0.009048f, -0.999950f, 0.004143f, 27.144776f, 45.040260f }, -{ -291.672363f, -24.934004f, 144.238663f, -0.000427f, -0.999928f, 0.011948f, 59.130113f, 63.056674f }, -{ -309.379486f, -24.933861f, 249.619171f, -0.011270f, -0.999908f, 0.007562f, 54.449330f, 20.094447f }, -{ -195.040344f, -24.933855f, 180.815704f, 0.002731f, -0.999942f, 0.010459f, 81.753890f, 47.811998f }, -{ -136.935654f, -24.933895f, 293.288574f, -0.005146f, -0.999926f, 0.011049f, 96.576363f, 0.692140f }, -{ -48.893070f, -24.933884f, 161.229355f, 0.003108f, -0.999963f, 0.008062f, 117.639871f, 56.127275f }, -{ 72.555756f, -24.933893f, 275.836060f, -0.004433f, -0.999894f, 0.013872f, 145.724552f, 6.235663f }, -{ 102.042297f, -24.933882f, 146.974792f, 0.007025f, -0.999961f, 0.005404f, 151.965595f, 61.670797f } -}; - -static Face face_0[] = { -{ 61, 60, 59, 3, 0 }, -{ 55, 54, 53, 3, 0 }, -{ 57, 56, 55, 3, 0 }, -{ 39, 38, 37, 3, 0 }, -{ 37, 36, 35, 3, 0 }, -{ 53, 52, 51, 3, 0 }, -{ 41, 40, 39, 3, 0 }, -{ 43, 42, 41, 3, 0 }, -{ 59, 58, 57, 3, 0 }, -{ 63, 62, 61, 3, 0 }, -{ 45, 44, 43, 3, 0 }, -{ 35, 34, 67, 3, 0 }, -{ 67, 66, 65, 3, 0 }, -{ 51, 50, 49, 3, 0 }, -{ 49, 48, 47, 3, 0 }, -{ 65, 64, 63, 3, 0 }, -{ 47, 46, 45, 3, 0 }, -{ 41, 39, 37, 3, 0 }, -{ 43, 41, 37, 3, 0 }, -{ 43, 37, 35, 3, 0 }, -{ 45, 43, 35, 3, 0 }, -{ 45, 35, 67, 3, 0 }, -{ 47, 45, 67, 3, 0 }, -{ 47, 67, 65, 3, 0 }, -{ 49, 47, 65, 3, 0 }, -{ 49, 65, 63, 3, 0 }, -{ 51, 49, 63, 3, 0 }, -{ 51, 63, 61, 3, 0 }, -{ 53, 51, 61, 3, 0 }, -{ 53, 61, 59, 3, 0 }, -{ 53, 59, 57, 3, 0 }, -{ 53, 57, 55, 3, 0 }, -{ 61, 27, 26, 4, 2 }, -{ 26, 60, 61, 4, 0 }, -{ 60, 26, 25, 4, 2 }, -{ 25, 59, 60, 4, 0 }, -{ 55, 21, 20, 4, 2 }, -{ 20, 54, 55, 4, 0 }, -{ 54, 20, 19, 4, 2 }, -{ 19, 53, 54, 4, 0 }, -{ 57, 23, 22, 4, 2 }, -{ 22, 56, 57, 4, 0 }, -{ 56, 22, 21, 4, 2 }, -{ 21, 55, 56, 4, 0 }, -{ 39, 5, 4, 4, 2 }, -{ 4, 38, 39, 4, 0 }, -{ 38, 4, 3, 4, 2 }, -{ 3, 37, 38, 4, 0 }, -{ 37, 3, 2, 4, 2 }, -{ 2, 36, 37, 4, 0 }, -{ 36, 2, 1, 4, 2 }, -{ 1, 35, 36, 4, 0 }, -{ 53, 19, 18, 4, 2 }, -{ 18, 52, 53, 4, 0 }, -{ 52, 18, 17, 4, 2 }, -{ 17, 51, 52, 4, 0 }, -{ 41, 7, 6, 4, 2 }, -{ 6, 40, 41, 4, 0 }, -{ 40, 6, 5, 4, 2 }, -{ 5, 39, 40, 4, 0 }, -{ 43, 9, 8, 4, 2 }, -{ 8, 42, 43, 4, 0 }, -{ 42, 8, 7, 4, 2 }, -{ 7, 41, 42, 4, 0 }, -{ 59, 25, 24, 4, 2 }, -{ 24, 58, 59, 4, 0 }, -{ 58, 24, 23, 4, 2 }, -{ 23, 57, 58, 4, 0 }, -{ 63, 29, 28, 4, 2 }, -{ 28, 62, 63, 4, 0 }, -{ 62, 28, 27, 4, 2 }, -{ 27, 61, 62, 4, 0 }, -{ 45, 11, 10, 4, 2 }, -{ 10, 44, 45, 4, 0 }, -{ 44, 10, 9, 4, 2 }, -{ 9, 43, 44, 4, 0 }, -{ 35, 1, 0, 4, 2 }, -{ 0, 34, 35, 4, 0 }, -{ 34, 0, 33, 4, 2 }, -{ 33, 67, 34, 4, 0 }, -{ 67, 33, 32, 4, 2 }, -{ 32, 66, 67, 4, 0 }, -{ 66, 32, 31, 4, 2 }, -{ 31, 65, 66, 4, 0 }, -{ 51, 17, 16, 4, 2 }, -{ 16, 50, 51, 4, 0 }, -{ 50, 16, 15, 4, 2 }, -{ 15, 49, 50, 4, 0 }, -{ 49, 15, 14, 4, 2 }, -{ 14, 48, 49, 4, 0 }, -{ 48, 14, 13, 4, 2 }, -{ 13, 47, 48, 4, 0 }, -{ 65, 31, 30, 4, 2 }, -{ 30, 64, 65, 4, 0 }, -{ 64, 30, 29, 4, 2 }, -{ 29, 63, 64, 4, 0 }, -{ 47, 13, 12, 4, 2 }, -{ 12, 46, 47, 4, 0 }, -{ 46, 12, 11, 4, 2 }, -{ 11, 45, 46, 4, 0 } -}; - -static Vert vert_1[] = { -{ -227.530014f, -20.966743f, 18.889576f, -0.132901f, 0.000004f, -0.991129f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, -0.278891f, 0.000000f, 0.960323f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, -0.521000f, 0.000000f, 0.853557f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, -0.731747f, 0.000000f, 0.681577f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, -0.886449f, 0.000000f, 0.462826f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, -0.976238f, 0.000000f, 0.216703f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, -0.998414f, 0.000000f, -0.056296f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, -0.937504f, 0.000000f, -0.347976f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, -0.793604f, 0.000000f, -0.608435f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, -0.597880f, 0.000001f, -0.801586f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, -0.383174f, 0.000001f, -0.923676f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, -0.170028f, 0.000001f, -0.985439f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, -0.004631f, 0.000001f, -0.999989f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.101449f, 0.000001f, -0.994841f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.188036f, 0.000001f, -0.982162f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.268237f, 0.000001f, -0.963353f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.337432f, 0.000001f, -0.941350f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.393673f, 0.000001f, -0.919251f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.410820f, 0.000001f, -0.911717f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -0.366219f, -0.000001f, 0.930529f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, -0.315937f, -0.000001f, 0.948780f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, -0.243578f, -0.000001f, 0.969881f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, -0.175846f, -0.000001f, 0.984418f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, -0.111723f, -0.000001f, 0.993739f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, -0.050166f, -0.000001f, 0.998741f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.049994f, -0.000001f, 0.998749f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.221684f, -0.000001f, 0.975119f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.430806f, -0.000001f, 0.902444f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.647042f, -0.000001f, 0.762454f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.840384f, 0.000000f, 0.541992f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.966795f, 0.000000f, 0.255554f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.999957f, 0.000000f, -0.009295f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.976852f, 0.000000f, -0.213918f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.918400f, 0.000000f, -0.395654f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.827210f, 0.000000f, -0.561892f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.712639f, 0.000000f, -0.701531f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.586577f, 0.000000f, -0.809893f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.830953f, 0.000000f, 0.556343f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.560396f, -0.000001f, 0.828225f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.724928f, -0.000003f, 0.688825f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.857930f, -0.000002f, 0.513767f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.946024f, 0.000000f, 0.324095f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.990004f, 0.000000f, 0.141040f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.998047f, 0.000000f, -0.062465f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.945614f, 0.000000f, -0.325292f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.805843f, 0.000000f, -0.592129f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.600640f, 0.000000f, -0.799519f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.373832f, 0.000000f, -0.927496f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.160102f, 0.000000f, -0.987101f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.002576f, 0.000000f, -0.999997f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, -0.093624f, 0.000000f, -0.995608f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, -0.168365f, 0.000000f, -0.985725f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, -0.240737f, 0.000000f, -0.970590f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, -0.314259f, 0.000000f, -0.949337f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, -0.392630f, 0.000000f, -0.919696f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.543306f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.501817f, 0.000000f, 0.864974f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.426524f, 0.000000f, 0.904476f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.331870f, 0.000000f, 0.943325f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.220540f, 0.000000f, 0.975378f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.100336f, 0.000000f, 0.994954f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, -0.045215f, 0.000000f, 0.998977f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, -0.239464f, 0.000000f, 0.970905f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, -0.460291f, 0.000000f, 0.887768f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, -0.678343f, 0.000000f, 0.734745f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, -0.860689f, 0.000000f, 0.509130f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, -0.971980f, 0.000000f, 0.235065f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, -0.999103f, 0.000000f, -0.042355f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, -0.949258f, 0.000000f, -0.314499f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, -0.823833f, 0.000000f, -0.566833f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, -0.639055f, 0.000000f, -0.769161f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, -0.424211f, 0.000001f, -0.905563f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, -0.205822f, 0.000004f, -0.978589f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -0.000001f, 1.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.071640f, -0.000001f, 0.997431f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.268782f, -0.000001f, 0.963201f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.513694f, -0.000001f, 0.857974f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.734379f, 0.000000f, 0.678739f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.894190f, 0.000000f, 0.447688f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.979694f, 0.000000f, 0.200499f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.999373f, 0.000000f, -0.035418f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.959992f, 0.000000f, -0.280027f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.842717f, 0.000000f, -0.538357f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.643022f, 0.000000f, -0.765848f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.400098f, 0.000000f, -0.916472f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.167743f, 0.000000f, -0.985831f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.031064f, 0.000000f, -0.999517f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.894427f, 0.000000f, -0.447214f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.447214f, 0.000000f, 0.894427f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, -0.079186f, 0.000000f, 0.996860f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, -0.304705f, 0.000000f, 0.952447f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, -0.579111f, 0.000000f, 0.815249f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, -0.798828f, 0.000000f, 0.601559f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, -0.929901f, 0.000000f, 0.367810f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, -0.987642f, -0.000001f, 0.156725f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, -0.999434f, 0.000000f, -0.033649f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, -0.970480f, 0.000000f, -0.241182f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, -0.878100f, 0.000000f, -0.478477f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, -0.700409f, 0.000000f, -0.713742f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, -0.453361f, 0.000001f, -0.891327f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, -0.193834f, 0.000001f, -0.981034f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, -0.036044f, 0.000001f, -0.999350f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, -0.994427f, 0.000000f, 0.105425f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, -0.930341f, 0.000000f, 0.366696f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, -0.769108f, -0.000001f, 0.639119f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, -0.554146f, -0.000001f, 0.832420f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, -0.334245f, -0.000001f, 0.942486f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, -0.139337f, -0.000002f, 0.990245f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, -0.014576f, -0.000002f, 0.999894f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.038307f, -0.000002f, 0.999266f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.070572f, -0.000002f, 0.997507f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.105682f, -0.000002f, 0.994400f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.147635f, -0.000002f, 0.989042f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.202285f, -0.000002f, 0.979327f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.996088f, 0.000000f, -0.088370f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.125438f, 0.000002f, -0.992102f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, -0.222749f, 0.000002f, -0.974876f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, -0.174788f, 0.000002f, -0.984606f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, -0.124447f, 0.000002f, -0.992226f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, -0.075842f, 0.000002f, -0.997120f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, -0.032153f, 0.000002f, -0.999483f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.055747f, 0.000002f, -0.998445f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.226773f, 0.000002f, -0.973948f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.433606f, 0.000001f, -0.901103f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.640544f, 0.000000f, -0.767921f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.827378f, 0.000000f, -0.561646f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.960620f, 0.000000f, -0.277867f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.998339f, 0.000000f, -0.057605f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, -0.936759f, 0.000000f, 0.349975f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, -0.945897f, 0.000000f, -0.324468f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, -0.475466f, 0.000000f, 0.879734f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.529090f, -0.000002f, 0.848566f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, -0.347260f, -0.000006f, 0.937769f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, -0.267475f, 0.000000f, 0.963565f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.947348f, 0.000000f, -0.320206f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.937358f, 0.000000f, 0.348368f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.470435f, 0.000000f, -0.882435f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, -0.518991f, 0.000000f, -0.854780f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.311085f, 0.000000f, -0.950382f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.252382f, 0.000000f, -0.967628f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, 0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.301814f, 0.000000f, -0.953367f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.326641f, 0.000000f, -0.945149f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, 0.879074f, 0.000000f, -0.476685f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, -0.390384f, -0.000002f, 0.920652f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, -0.520918f, -0.000002f, 0.853607f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.065749f, -0.000003f, 0.997836f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, 0.641452f, -0.000002f, 0.767163f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, 0.914903f, -0.000001f, 0.403674f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.988384f, 0.000000f, 0.151978f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.999598f, 0.000000f, 0.028362f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, -0.997195f, 0.000000f, -0.074851f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, -0.873911f, 0.000001f, -0.486087f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.206069f, 0.000002f, -0.978537f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.497835f, 0.000001f, -0.867272f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.791861f, 0.000001f, -0.610702f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.982874f, 0.000000f, -0.184277f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649755f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, -0.459333f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544706f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282751f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113155f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015607f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302681f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511573f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.770417f, -0.000001f, 0.637540f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344197f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103992f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.932112f, 0.000000f, 0.362171f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.561654f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, -0.059665f, -0.000002f, 0.998218f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, -0.556104f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, -0.917639f, -0.000001f, 0.397415f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249357f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.199195f, 0.000001f, -0.979960f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529146f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.888400f, -0.000001f, 0.459070f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, -0.832354f, -0.000001f, 0.554244f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, -0.943875f, -0.000001f, 0.330303f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, -0.906859f, -0.000001f, 0.421435f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, -0.732608f, -0.000001f, 0.680651f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, -0.237380f, -0.000001f, 0.971417f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.272164f, -0.000002f, 0.962251f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.953239f, -0.000001f, 0.302219f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.189441f, 0.000002f, -0.981892f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.149986f, 0.000002f, -0.988688f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.671985f, 0.000002f, -0.740564f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.885876f, 0.000001f, -0.463921f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.955085f, 0.000001f, -0.296334f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.982240f, 0.000000f, -0.187627f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.998278f, 0.000000f, -0.058653f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.445434f, 0.000001f, -0.895315f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.872224f, -0.000001f, 0.489107f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.821354f, 0.000001f, -0.570419f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.488794f, 0.000002f, -0.872399f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.117071f, 0.000003f, -0.993124f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, -0.347726f, 0.000002f, -0.937596f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, -0.743957f, 0.000001f, -0.668227f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, -0.922915f, 0.000001f, -0.385003f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.319982f, 0.000002f, -0.947424f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.536214f, 0.000002f, -0.844082f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, -0.095167f, 0.000003f, -0.995461f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, -0.663668f, 0.000002f, -0.748027f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, -0.935434f, 0.000001f, -0.353502f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, -0.994825f, 0.000000f, 0.101602f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, -0.821232f, -0.000001f, 0.570594f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, -0.614743f, -0.000001f, 0.788728f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, -0.533800f, -0.000001f, 0.845611f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, -0.946986f, 0.000000f, 0.321275f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, -0.985542f, 0.000000f, -0.169429f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, -0.721135f, 0.000001f, -0.692794f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, -0.178468f, 0.000002f, -0.983946f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.275751f, 0.000003f, -0.961229f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, -0.805424f, -0.000001f, 0.592699f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, -0.393509f, -0.000002f, 0.919321f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, -0.070072f, -0.000003f, 0.997542f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.314714f, -0.000002f, 0.949187f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.737681f, -0.000002f, 0.675150f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.963322f, 0.000000f, 0.268347f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.999034f, 0.000000f, 0.043950f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.988647f, 0.000000f, 0.150259f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.722615f, -0.000001f, 0.691251f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, -0.065774f, -0.000002f, 0.997835f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, -0.508023f, -0.000002f, 0.861344f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, -0.634043f, -0.000002f, 0.773298f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, -0.988652f, 0.000000f, 0.150224f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.063729f, 0.000001f, -0.997967f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.606494f, 0.000001f, -0.795088f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.698230f, 0.000002f, -0.715873f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, 0.856732f, 0.006809f, -0.515717f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.996222f, 0.008519f, -0.086430f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.896470f, -0.000001f, 0.443104f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.487260f, -0.000002f, 0.873257f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, -0.092078f, -0.000002f, 0.995752f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, -0.563378f, -0.000001f, 0.826199f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, -0.789808f, -0.000001f, 0.613355f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, -0.878742f, -0.000001f, 0.477296f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.866044f, -0.000001f, 0.499968f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.738938f, 0.000002f, -0.673773f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.289883f, 0.000003f, -0.957062f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, -0.052447f, 0.000003f, -0.998624f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, -0.398492f, 0.000002f, -0.917172f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, -0.667370f, 0.000002f, -0.744726f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, -0.842882f, 0.000001f, -0.538099f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, -0.942324f, 0.000000f, -0.334701f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, -0.989253f, 0.000000f, -0.146212f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, -0.998414f, 0.000000f, 0.056296f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, -0.905095f, -0.000001f, 0.425210f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, -0.501771f, -0.000002f, 0.865000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.060412f, -0.000003f, 0.998173f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.917345f, -0.000001f, 0.398092f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.153606f, 0.000003f, -0.988132f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.141905f, 0.000002f, -0.989880f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.742680f, 0.000001f, -0.669646f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.967176f, 0.000000f, -0.254107f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.998594f, 0.000000f, 0.053008f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.912953f, -0.000001f, 0.408064f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.468894f, -0.000002f, 0.883254f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, -0.280562f, -0.000002f, 0.959836f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.673699f, 0.000002f, -0.739006f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.251252f, 0.000003f, -0.967922f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.027993f, 0.000002f, -0.999608f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, -0.249737f, 0.000002f, -0.968314f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, -0.534105f, 0.000002f, -0.845418f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, -0.779634f, 0.000001f, -0.626236f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, -0.929593f, 0.000001f, -0.368587f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, -0.989265f, 0.000000f, -0.146131f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.896316f, -0.004678f, -0.443391f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.997969f, -0.005230f, 0.063485f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.909068f, 0.001063f, 0.416646f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.726480f, -0.015559f, 0.687011f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.170193f, -0.000003f, 0.985411f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, -0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, -0.775277f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, -0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.975084f, 0.000000f, 0.221838f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -0.132902f, 0.000004f, -0.991129f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -0.113407f, 0.000000f, 0.993549f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, -0.196555f, 0.000000f, 0.980493f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, -0.441307f, 0.000000f, 0.897356f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, -0.666260f, 0.000000f, 0.745720f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, -0.841668f, 0.000000f, 0.539995f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, -0.953587f, 0.000000f, 0.301119f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, -0.999275f, 0.000000f, 0.038078f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, -0.968387f, 0.000000f, -0.249452f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, -0.849701f, 0.000000f, -0.527265f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, -0.667060f, 0.000001f, -0.745004f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, -0.455510f, 0.000001f, -0.890230f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, -0.240248f, 0.000001f, -0.970712f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, -0.052076f, 0.000001f, -0.998643f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.072102f, 0.000001f, -0.997397f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.159415f, 0.000001f, -0.987212f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.242432f, 0.000001f, -0.970168f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.315709f, 0.000001f, -0.948856f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.376381f, 0.000001f, -0.926465f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.410820f, 0.000001f, -0.911717f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -0.366218f, -0.000001f, 0.930529f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, -0.341209f, -0.000001f, 0.939987f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, -0.267103f, -0.000001f, 0.963668f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, -0.197940f, -0.000001f, 0.980214f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, -0.132733f, -0.000001f, 0.991152f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, -0.070438f, -0.000001f, 0.997516f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.010033f, -0.000001f, 0.999950f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.155949f, -0.000001f, 0.987765f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.359337f, -0.000001f, 0.933208f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.575202f, -0.000001f, 0.818011f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.780436f, -0.000001f, 0.625235f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.933968f, 0.000000f, 0.357358f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.997415f, 0.000000f, 0.071862f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.988370f, 0.000000f, -0.152067f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.941956f, 0.000000f, -0.335737f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.860949f, 0.000000f, -0.508692f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.752871f, 0.000000f, -0.658168f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.629290f, 0.000000f, -0.777170f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.889699f, 0.000000f, -0.456548f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.502007f, 0.000000f, 0.864864f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.672072f, -0.000002f, 0.740485f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.817837f, -0.000002f, 0.575450f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.921693f, -0.000001f, 0.387921f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.979689f, 0.000000f, 0.200522f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.999954f, 0.000000f, 0.009609f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.973138f, 0.000000f, -0.230221f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.862300f, 0.000000f, -0.506399f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.674528f, 0.000000f, -0.738249f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.449703f, 0.000000f, -0.893178f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.228732f, 0.000000f, -0.973489f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.046891f, 0.000000f, -0.998900f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, -0.067655f, 0.000000f, -0.997709f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, -0.143976f, 0.000000f, -0.989581f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, -0.216746f, 0.000000f, -0.976228f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, -0.289503f, 0.000000f, -0.957177f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, -0.365851f, 0.000000f, -0.930674f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, -0.419059f, 0.000000f, -0.907959f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.543307f, 0.000000f, 0.839534f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.522722f, 0.000000f, 0.852503f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.453797f, 0.000000f, 0.891105f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.365635f, 0.000000f, 0.930758f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.259367f, 0.000000f, 0.965779f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.141032f, 0.000000f, 0.990005f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.007245f, 0.000000f, 0.999974f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, -0.168689f, 0.000000f, 0.985669f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, -0.385508f, 0.000000f, 0.922705f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, -0.607191f, 0.000000f, 0.794556f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, -0.805587f, 0.000000f, 0.592477f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, -0.943840f, 0.000000f, 0.330403f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, -0.998820f, 0.000000f, 0.048575f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, -0.974605f, 0.000000f, -0.223930f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, -0.873964f, 0.000000f, -0.485991f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, -0.706060f, 0.000000f, -0.708152f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, -0.497756f, 0.000000f, -0.867317f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, -0.278017f, 0.000003f, -0.960576f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, -0.000001f, 1.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.035820f, -0.000001f, 0.999358f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.188416f, -0.000001f, 0.982089f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.431738f, -0.000001f, 0.901999f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.665230f, -0.000001f, 0.746638f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.848586f, 0.000000f, 0.529057f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.959076f, 0.000000f, 0.283149f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.999154f, 0.000000f, 0.041134f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.980586f, 0.000000f, -0.196088f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.892215f, 0.000000f, -0.451610f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.718364f, 0.000000f, -0.695667f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.483336f, 0.000000f, -0.875435f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.241852f, 0.000000f, -0.970313f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.062127f, 0.000000f, -0.998068f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 0.000000f, -1.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.447214f, 0.000001f, -0.894427f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.894427f, 0.000000f, 0.447214f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, -0.039593f, 0.000000f, 0.999216f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, -0.212191f, 0.000000f, 0.977228f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, -0.488613f, 0.000000f, 0.872501f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, -0.733828f, 0.000000f, 0.679335f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, -0.895536f, 0.000000f, 0.444989f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, -0.974747f, -0.000001f, 0.223313f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, -0.999602f, 0.000000f, 0.028209f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, -0.985715f, 0.000000f, -0.168424f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, -0.917976f, 0.000000f, -0.396636f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, -0.770297f, 0.000000f, -0.637685f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, -0.541864f, 0.000001f, -0.840466f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, -0.278852f, 0.000001f, -0.960334f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, -0.072088f, 0.000001f, -0.997398f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, -0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, -0.998610f, 0.000000f, 0.052712f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, -0.964760f, 0.000000f, 0.263130f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, -0.832175f, -0.000001f, 0.554513f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, -0.629247f, -0.000001f, 0.777205f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, -0.406003f, -0.000001f, 0.913872f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, -0.200640f, -0.000002f, 0.979665f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, -0.046194f, -0.000002f, 0.998932f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.027667f, -0.000002f, 0.999617f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.059760f, -0.000002f, 0.998213f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, 0.093534f, -0.000002f, 0.995616f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.132736f, -0.000002f, 0.991151f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.182424f, -0.000002f, 0.983220f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.675942f, -0.000001f, 0.736955f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, 0.550632f, 0.000001f, -0.834748f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.237575f, 0.000002f, -0.971369f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, -0.191361f, 0.000002f, -0.981520f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, -0.141331f, 0.000002f, -0.989962f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, -0.091701f, 0.000002f, -0.995787f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, -0.046066f, 0.000002f, -0.998938f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.018743f, 0.000002f, -0.999824f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.159913f, 0.000002f, -0.987131f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.363788f, 0.000001f, -0.931482f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.572373f, 0.000000f, -0.819993f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.768792f, 0.000000f, -0.639499f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.924396f, 0.000000f, -0.381433f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.993341f, 0.000000f, -0.115210f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 0.000010f, -1.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 0.000000f, -1.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, -0.468379f, 0.000000f, -0.883527f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, -0.933984f, 0.000000f, 0.357316f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, -0.950931f, 0.000000f, -0.309402f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.264544f, 0.000000f, 0.964374f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.337904f, -0.000006f, 0.941181f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, -0.534949f, -0.000002f, 0.844884f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.473674f, 0.000000f, 0.880700f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.942807f, 0.000000f, -0.333339f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.940870f, 0.000000f, 0.338768f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, -0.259495f, 0.000000f, -0.965744f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, -0.333727f, 0.000000f, -0.942670f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.504764f, 0.000000f, -0.863257f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, -0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, -0.894427f, 0.000000f, 0.447214f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.447214f, 0.000000f, 0.894427f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, -0.877850f, 0.000000f, 0.478935f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.319282f, 0.000000f, 0.947660f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, -0.287199f, 0.000000f, 0.957871f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, -0.447214f, 0.000000f, -0.894427f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, -0.879075f, 0.000000f, -0.476683f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.326650f, 0.000000f, -0.945145f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, -0.301802f, 0.000000f, -0.953371f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.894427f, 0.000000f, -0.447214f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.887750f, -0.000001f, 0.460327f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, -0.656342f, -0.000001f, 0.754463f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, -0.164366f, -0.000002f, 0.986400f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.467430f, -0.000002f, 0.884030f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.854905f, -0.000001f, 0.518785f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.975826f, 0.000000f, 0.218549f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.998390f, 0.000000f, 0.056724f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, -0.999299f, 0.000000f, -0.037426f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, -0.953521f, 0.000001f, -0.301328f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, -0.528723f, 0.000002f, -0.848795f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.303533f, 0.000002f, -0.952821f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.730358f, 0.000001f, -0.683065f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.929606f, 0.000001f, -0.368555f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, -0.239564f, -0.000003f, 0.970881f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.936927f, 0.000000f, -0.349526f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164321f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244727f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, -0.899584f, -0.000001f, 0.436747f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, -0.716919f, -0.000001f, 0.697157f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, -0.281539f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.701500f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454424f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.985821f, 0.000000f, 0.167802f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666523f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.156933f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158925f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, -0.164167f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.689773f, 0.000001f, -0.724025f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.444200f, -0.000001f, 0.895928f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, 0.953952f, -0.000001f, 0.299959f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, -0.949849f, -0.000001f, 0.312709f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, -0.922966f, -0.000001f, 0.384882f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, -0.819365f, -0.000002f, 0.573272f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, -0.451781f, -0.000002f, 0.892129f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.124905f, -0.000001f, 0.992169f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.720568f, -0.000001f, 0.693384f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.837365f, 0.000001f, -0.546645f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, -0.087364f, 0.000002f, -0.996176f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.525644f, 0.000002f, -0.850705f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.842037f, 0.000001f, -0.539420f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, 0.939937f, 0.000001f, -0.341349f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.975653f, 0.000001f, -0.219322f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.994216f, 0.000000f, -0.107397f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.890868f, 0.000001f, -0.454263f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, -0.207596f, -0.000003f, 0.978215f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.958465f, 0.000000f, -0.285210f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.558773f, 0.000001f, -0.829321f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.271646f, 0.000002f, -0.962397f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, -0.192636f, 0.000003f, -0.981270f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, -0.623712f, 0.000001f, -0.781654f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, -0.885465f, 0.000001f, -0.464706f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, -0.673915f, 0.000002f, -0.738809f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.651081f, 0.000002f, -0.759008f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.173318f, 0.000003f, -0.984866f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.507992f, 0.000002f, -0.861362f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, -0.871837f, 0.000001f, -0.489796f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, -0.998311f, 0.000000f, -0.058104f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, -0.909053f, -0.000001f, 0.416680f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, -0.664570f, -0.000001f, 0.747226f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, -0.548261f, -0.000001f, 0.836307f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.766243f, -0.000001f, 0.642551f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.996405f, 0.000000f, -0.084715f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, -0.876729f, 0.000001f, -0.480984f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, -0.363965f, 0.000001f, -0.931413f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.141328f, 0.000002f, -0.989963f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.547231f, 0.000002f, -0.836982f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, -0.401856f, 0.000002f, -0.915703f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, -0.955079f, -0.000001f, 0.296350f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, -0.497538f, -0.000001f, 0.867442f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, -0.179589f, -0.000002f, 0.983742f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.177231f, -0.000003f, 0.984169f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.598228f, -0.000002f, 0.801326f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.914330f, -0.000001f, 0.404969f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.996242f, 0.000000f, 0.086610f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.997125f, 0.000000f, 0.075777f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.884948f, -0.000001f, 0.465690f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.253386f, -0.000001f, 0.967365f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, -0.430647f, -0.000002f, 0.902520f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, -0.607827f, -0.000002f, 0.794070f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, -0.953798f, 0.000000f, 0.300449f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, -0.866611f, 0.000001f, -0.498984f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.580141f, 0.000001f, -0.814516f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.665820f, 0.000002f, -0.746113f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.767879f, 0.000002f, -0.640594f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.891623f, 0.013556f, -0.452576f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.949579f, 0.009083f, -0.313397f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.999304f, 0.016713f, 0.033337f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.955846f, 0.011386f, 0.293649f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, 0.656317f, -0.000002f, 0.754485f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.112970f, -0.000003f, 0.993598f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, -0.427813f, -0.000002f, 0.903867f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.738315f, -0.000001f, 0.674456f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, -0.858087f, -0.000001f, 0.513505f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, -0.011390f, -0.000002f, 0.999935f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.941545f, 0.000001f, -0.336887f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.381529f, 0.000002f, -0.924357f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.073515f, 0.000003f, -0.997294f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, -0.288270f, 0.000003f, -0.957549f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, -0.587254f, 0.000002f, -0.809402f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, -0.793964f, 0.000002f, -0.607965f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, -0.916096f, 0.000001f, -0.400960f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, -0.978307f, 0.000000f, -0.207162f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, -0.999894f, 0.000000f, -0.014533f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, -0.960752f, -0.000001f, 0.277410f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, -0.686978f, -0.000001f, 0.726678f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, -0.125351f, -0.000002f, 0.992112f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.605053f, -0.000002f, 0.796185f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.869424f, 0.000001f, -0.494066f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, -0.117972f, 0.000003f, -0.993017f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.569661f, 0.000002f, -0.821880f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.926161f, 0.000000f, -0.377127f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.999259f, 0.000000f, -0.038502f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.960848f, -0.000001f, 0.277074f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.688926f, -0.000002f, 0.724832f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, -0.016062f, -0.000002f, 0.999871f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.929230f, 0.000001f, -0.369503f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.302607f, 0.000003f, -0.953115f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.114406f, 0.000003f, -0.993434f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, -0.154137f, 0.000002f, -0.988049f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, -0.440071f, 0.000002f, -0.897963f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, -0.704223f, 0.000001f, -0.709979f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, -0.890730f, 0.000001f, -0.454533f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, -0.976876f, 0.000000f, -0.213806f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.448748f, 0.000001f, -0.893658f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.993879f, -0.002630f, 0.110439f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.839241f, 0.017509f, 0.543478f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.558370f, 0.001114f, 0.829591f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, -0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, -0.387639f, 0.000002f, -0.921811f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, -0.975084f, 0.000000f, 0.221837f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.395561f, -0.000001f, 0.918440f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.791121f, -0.000001f, 0.611659f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.487542f, -0.000001f, 0.873100f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, 0.775278f, 0.000002f, -0.631621f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.586264f, 0.000000f, -0.810120f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.987392f, 0.000000f, -0.158291f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.810120f, 0.000000f, 0.586264f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.158291f, 0.000000f, 0.987392f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, -0.586264f, 0.000000f, 0.810120f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, -0.987392f, 0.000000f, 0.158291f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, -0.810120f, 0.000000f, -0.586264f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, -0.158291f, 0.000000f, -0.987392f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.344805f, 0.000000f, -0.938674f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.907558f, 0.000000f, -0.419928f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.938674f, 0.000000f, 0.344805f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.419928f, 0.000000f, 0.907558f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, -0.344805f, 0.000000f, 0.938674f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, -0.907558f, 0.000000f, 0.419928f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, -0.938674f, 0.000000f, -0.344805f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, -0.419928f, 0.000000f, -0.907558f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.869996f, -0.000001f, 0.493059f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.688899f, 0.000002f, -0.724858f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.103299f, 0.000002f, -0.994650f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, -0.344449f, 0.000001f, -0.938805f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, -0.810154f, 0.000001f, -0.586217f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, -0.982148f, 0.000000f, -0.188111f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, -0.999661f, 0.000000f, -0.026047f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, -0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, -0.996832f, -0.000001f, 0.079535f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, -0.823749f, -0.000001f, 0.566955f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, -0.837145f, -0.000001f, 0.546981f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, -0.315664f, -0.000001f, 0.948871f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.447214f, 0.000001f, -0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.897364f, 0.000532f, -0.441290f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.908382f, 0.000909f, 0.418140f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.300433f, -0.000003f, 0.953803f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, -0.229252f, -0.000002f, 0.973367f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.166049f, -0.000002f, 0.986117f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.932011f, 0.000001f, -0.362429f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.245227f, 0.000003f, -0.969466f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, -0.191620f, 0.000002f, -0.981469f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, -0.659538f, 0.000001f, -0.751671f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, -0.954830f, 0.000001f, -0.297154f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, -0.998642f, 0.000000f, -0.052093f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, -0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, -0.498416f, 0.000001f, -0.866938f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, -0.824150f, -0.000001f, 0.566372f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, -0.830310f, -0.000001f, 0.557302f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, -0.631328f, -0.000001f, 0.775516f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.894427f, -0.000001f, 0.447214f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.447214f, -0.000001f, 0.894427f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.894427f, 0.000001f, -0.447214f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.448616f, 0.000001f, -0.893725f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.976683f, 0.000910f, 0.214684f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.592555f, 0.000522f, 0.805530f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, -0.111941f, -0.000003f, 0.993715f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.874270f, -0.000001f, 0.485440f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.760144f, 0.000001f, -0.649754f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.152177f, 0.000001f, -0.988353f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, -0.459334f, 0.000001f, -0.888264f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, -0.838627f, 0.000001f, -0.544707f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, -0.959193f, 0.000000f, -0.282752f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, -0.993577f, 0.000000f, -0.113154f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, -0.999878f, 0.000000f, 0.015606f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, -0.989803f, 0.000000f, 0.142441f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, -0.953092f, -0.000001f, 0.302682f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, -0.859240f, -0.000001f, 0.511572f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.601898f, -0.000001f, 0.798573f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, -0.064729f, -0.000002f, 0.997903f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.480740f, -0.000002f, 0.876863f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.770418f, -0.000001f, 0.637539f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, 0.938897f, 0.000000f, 0.344198f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.994578f, 0.000000f, 0.103993f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.454185f, 0.000001f, -0.890908f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.931736f, 0.000000f, -0.363137f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.932111f, 0.000000f, 0.362173f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.561655f, -0.000001f, 0.827372f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, -0.059664f, -0.000002f, 0.998219f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, -0.556105f, -0.000002f, 0.831112f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.458115f, -0.000001f, 0.888893f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, -0.917640f, -0.000001f, 0.397413f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.968412f, 0.000000f, -0.249358f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, -0.666434f, 0.000002f, -0.745564f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.199198f, 0.000001f, -0.979959f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.848531f, 0.000001f, -0.529145f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.988917f, 0.000000f, -0.148471f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, -0.239566f, -0.000003f, 0.970880f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.945756f, 0.000001f, -0.324877f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.339296f, 0.000002f, -0.940680f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, -0.247366f, 0.000001f, -0.968922f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, -0.746247f, 0.000001f, -0.665669f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.936926f, 0.000000f, -0.349528f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.986407f, 0.000000f, -0.164320f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, -0.999732f, 0.000000f, -0.023155f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, -0.995145f, 0.000000f, 0.098417f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, -0.969592f, -0.000001f, 0.244728f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, -0.899585f, -0.000001f, 0.436746f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, -0.716920f, -0.000001f, 0.697156f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, -0.281538f, -0.000002f, 0.959550f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.315299f, -0.000002f, 0.948992f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.701501f, -0.000002f, 0.712669f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.890786f, -0.000001f, 0.454423f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.985820f, 0.000000f, 0.167804f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.908369f, 0.000001f, -0.418169f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.465868f, 0.000001f, -0.884854f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.971167f, 0.000000f, 0.238399f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.745484f, -0.000001f, 0.666524f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.156935f, -0.000001f, 0.987609f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, -0.413582f, -0.000002f, 0.910467f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.916229f, -0.000001f, 0.400654f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, -0.458820f, -0.000001f, 0.888529f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, -0.987291f, 0.000000f, -0.158926f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, -0.833881f, 0.000001f, -0.551945f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, -0.164166f, 0.000002f, -0.986433f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.689776f, 0.000001f, -0.724023f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.972507f, 0.000000f, -0.232875f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, -1.000000f, 0.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -259.747955f, -20.966747f, 81.060303f, -1.000000f, 0.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, -1.000000f, 0.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -264.026886f, -20.966732f, -47.559727f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, -20.966757f, 116.550354f, -1.000000f, 0.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -148.686584f, -20.966743f, -55.110798f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 2.970489f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, -1.000000f, 0.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, -1.000000f, 0.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -259.747955f, 20.966745f, 81.060341f, -1.000000f, 0.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, -1.000000f, 0.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -264.026886f, 20.966764f, -47.559723f, -1.000000f, 0.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, -1.000000f, 0.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -148.686584f, 20.966726f, 116.550392f, -1.000000f, 0.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -148.686584f, 20.966757f, -55.110794f, -1.000000f, 0.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ 53.459190f, 21.106728f, -63.834198f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, -1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, -20.966743f, 18.889576f, 0.000000f, -1.000000f, 0.000000f, 11.312357f, 104.759467f }, -{ -227.530014f, -20.966749f, 49.094059f, 0.000000f, -1.000000f, 0.000000f, 24.483732f, 68.571409f }, -{ -220.271423f, -20.966749f, 49.922577f, 0.000000f, -1.000000f, 0.000000f, 33.541598f, 70.744057f }, -{ -214.348251f, -20.966755f, 52.198391f, 0.000000f, -1.000000f, 0.000000f, 41.630631f, 70.600333f }, -{ -209.753510f, -20.966747f, 55.606861f, 0.000001f, -1.000000f, 0.000000f, 48.621978f, 68.520264f }, -{ -206.480209f, -20.966747f, 59.833366f, 0.000000f, -1.000000f, 0.000000f, 54.386820f, 64.883859f }, -{ -204.521362f, -20.966749f, 64.563301f, 0.000000f, -1.000000f, 0.000000f, 58.796339f, 60.071098f }, -{ -203.869965f, -20.966747f, 69.481987f, 0.000000f, -1.000000f, 0.000000f, 61.721703f, 54.462037f }, -{ -204.699646f, -20.966759f, 74.975159f, 0.000000f, -1.000000f, 0.000000f, 63.123094f, 47.518821f }, -{ -207.067520f, -20.966751f, 79.783142f, 0.000000f, -1.000000f, 0.000000f, 62.382769f, 40.725774f }, -{ -210.791794f, -20.966751f, 83.766113f, 0.000000f, -1.000000f, 0.000000f, 59.657563f, 34.329668f }, -{ -215.690674f, -20.966751f, 86.784210f, 0.000000f, -1.000000f, 0.000000f, 55.104290f, 28.577385f }, -{ -221.582382f, -20.966751f, 88.697617f, 0.000000f, -1.000000f, 0.000000f, 48.879779f, 23.715683f }, -{ -228.285126f, -20.966751f, 89.366486f, 0.000000f, -1.000000f, 0.000000f, 41.140841f, 19.991411f }, -{ -233.272552f, -20.966751f, 89.153244f, 0.000000f, -1.000000f, 0.000000f, 35.072373f, 18.071997f }, -{ -238.232040f, -20.966751f, 88.499512f, 0.000000f, -1.000000f, 0.000000f, 28.845299f, 16.692535f }, -{ -243.261429f, -20.966751f, 87.384338f, 0.000000f, -1.000000f, 0.000000f, 22.333248f, 15.835422f }, -{ -248.458618f, -20.966747f, 85.786713f, 0.000000f, -1.000000f, 0.000000f, 15.409765f, 15.483181f }, -{ -253.921509f, -20.966747f, 83.685699f, 0.000000f, -1.000000f, 0.000000f, 7.948429f, 15.618211f }, -{ -259.747955f, -20.966747f, 81.060303f, 0.000000f, -1.000000f, 0.000000f, -0.177157f, 16.222941f }, -{ -259.747955f, -20.966751f, 111.264603f, 0.000000f, -1.000000f, 0.000000f, 12.994208f, -19.965071f }, -{ -253.885376f, -20.966755f, 113.571884f, 0.000000f, -1.000000f, 0.000000f, 21.024357f, -20.172935f }, -{ -247.666229f, -20.966757f, 115.459656f, 0.000000f, -1.000000f, 0.000000f, 29.298774f, -19.722674f }, -{ -241.153412f, -20.966763f, 116.927917f, 0.000000f, -1.000000f, 0.000000f, 37.742109f, -18.641708f }, -{ -234.409882f, -20.966763f, 117.976685f, 0.000000f, -1.000000f, 0.000000f, 46.278933f, -16.957548f }, -{ -227.498550f, -20.966763f, 118.605942f, 0.000000f, -1.000000f, 0.000000f, 54.833858f, -14.697611f }, -{ -220.482346f, -20.966763f, 118.815689f, 0.000000f, -1.000000f, 0.000000f, 63.331494f, -11.889319f }, -{ -205.143631f, -20.966763f, 117.432495f, 0.000000f, -1.000000f, 0.000000f, 81.105759f, -3.543264f }, -{ -191.825546f, -20.966755f, 113.455368f, 0.000000f, -1.000000f, 0.000000f, 95.327940f, 7.029456f }, -{ -180.870651f, -20.966755f, 107.142990f, 0.000000f, -1.000000f, 0.000000f, 105.700410f, 19.369521f }, -{ -172.621567f, -20.966755f, 98.754059f, 0.000000f, -1.000000f, 0.000000f, 111.925502f, 33.017599f }, -{ -167.420868f, -20.966753f, 88.547287f, 0.000000f, -1.000000f, 0.000000f, 113.705577f, 47.514307f }, -{ -165.611176f, -20.966751f, 76.781357f, 0.000000f, -1.000000f, 0.000000f, 110.742945f, 62.400328f }, -{ -166.340637f, -20.966751f, 68.696579f, 0.000000f, -1.000000f, -0.000001f, 106.343396f, 71.768664f }, -{ -168.510422f, -20.966749f, 61.101204f, 0.000000f, -1.000000f, 0.000000f, 100.431605f, 79.922555f }, -{ -172.092514f, -20.966755f, 54.065182f, 0.000000f, -1.000000f, 0.000000f, 93.071636f, 86.790413f }, -{ -177.058975f, -20.966747f, 47.658421f, 0.000000f, -1.000000f, -0.000001f, 84.327446f, 92.300650f }, -{ -183.381851f, -20.966743f, 41.950832f, 0.000000f, -1.000000f, 0.000000f, 74.263017f, 96.381707f }, -{ -191.033142f, -20.966743f, 37.012333f, 0.000000f, -1.000000f, 0.000000f, 62.942380f, 98.962027f }, -{ -181.454453f, -20.966751f, 32.298737f, 0.000000f, -1.000000f, 0.000000f, 72.363203f, 108.786445f }, -{ -173.805496f, -20.966743f, 26.319462f, 0.000000f, -1.000000f, 0.000000f, 78.920131f, 119.285616f }, -{ -168.002350f, -20.966745f, 19.235668f, 0.000000f, -1.000000f, 0.000000f, 82.783855f, 130.303376f }, -{ -163.961121f, -20.966740f, 11.208173f, 0.000000f, -1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, -20.966740f, 2.397420f, 0.000000f, -1.000000f, 0.000000f, 83.114247f, 153.270415f }, -{ -160.828827f, -20.966740f, -7.035602f, 0.000000f, -1.000000f, 0.000000f, 79.922191f, 164.907572f }, -{ -162.772522f, -20.966736f, -21.426922f, 0.000000f, -1.000000f, 0.000000f, 71.317727f, 181.302331f }, -{ -168.407867f, -20.966743f, -33.734730f, 0.000000f, -1.000000f, 0.000000f, 59.198844f, 193.590982f }, -{ -177.441193f, -20.966736f, -43.721256f, 0.000000f, -1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, -20.966732f, -51.148808f, 0.000000f, -1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, -20.966740f, -55.779682f, 0.000000f, -1.000000f, 0.000000f, 6.310721f, 204.252461f }, -{ -221.992554f, -20.966740f, -57.376118f, 0.000000f, -1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, -20.966740f, -57.068485f, 0.000000f, -1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, -20.966740f, -56.173542f, 0.000000f, -1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, -20.966740f, -54.733250f, 0.000000f, -1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, -20.966732f, -52.789539f, 0.000000f, -1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, -20.966732f, -50.384388f, 0.000000f, -1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, -20.966732f, -47.559727f, 0.000000f, -1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, -20.966738f, -14.334979f, 0.000000f, -1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, -20.966736f, -18.662861f, 0.000000f, -1.000000f, 0.000000f, -40.778150f, 136.752428f }, -{ -251.050217f, -20.966736f, -22.109791f, 0.000000f, -1.000000f, 0.000000f, -34.746278f, 143.624739f }, -{ -245.054810f, -20.966736f, -24.717709f, 0.000000f, -1.000000f, 0.000000f, -28.700379f, 149.363753f }, -{ -239.248169f, -20.966736f, -26.528568f, 0.000000f, -1.000000f, 0.000000f, -22.533070f, 154.065492f }, -{ -233.525421f, -20.966736f, -27.584324f, 0.000000f, -1.000000f, 0.000000f, -16.136991f, 157.825952f }, -{ -227.781708f, -20.966736f, -27.926914f, 0.000000f, -1.000000f, 0.000000f, -9.404798f, 160.741110f }, -{ -220.280746f, -20.966736f, -27.192783f, 0.000000f, -1.000000f, 0.000000f, -0.097693f, 163.132527f }, -{ -213.751633f, -20.966736f, -25.074284f, 0.000000f, -1.000000f, 0.000000f, 8.648720f, 163.441519f }, -{ -208.369156f, -20.966736f, -21.697269f, 0.000000f, -1.000000f, 0.000000f, 16.570136f, 161.742661f }, -{ -204.308121f, -20.966736f, -17.187603f, 0.000000f, -1.000000f, -0.000001f, 23.402251f, 158.110511f }, -{ -201.743317f, -20.966747f, -11.671123f, 0.000000f, -1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, -20.966740f, -5.273685f, 0.000000f, -1.000000f, 0.000000f, 32.741388f, 145.344557f }, -{ -201.724655f, -20.966740f, 1.288052f, 0.000000f, -1.000000f, 0.000000f, 34.554308f, 137.101264f }, -{ -204.242859f, -20.966745f, 7.031773f, 0.000000f, -1.000000f, 0.000000f, 34.041921f, 129.121540f }, -{ -208.243301f, -20.966740f, 11.810628f, 0.000000f, -1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, -20.966740f, 15.477796f, 0.000001f, -1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, -20.966743f, 17.886265f, 0.000000f, -1.000000f, 0.000000f, 19.839473f, 109.224409f }, -{ -148.686584f, -20.966757f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 148.362720f, 22.133174f }, -{ -72.924095f, -20.966761f, 116.550354f, 0.000000f, -1.000000f, 0.000000f, 239.134392f, 55.171337f }, -{ -44.133286f, -20.966759f, 113.442535f, 0.000000f, -1.000000f, 0.000000f, 272.273660f, 71.449816f }, -{ -20.467419f, -20.966759f, 104.692368f, 0.000000f, -1.000000f, 0.000000f, 296.812166f, 92.253563f }, -{ -1.975434f, -20.966759f, 91.159866f, 0.000000f, -1.000000f, 0.000000f, 313.066387f, 116.530870f }, -{ 11.293716f, -20.966763f, 73.704994f, 0.000000f, -1.000000f, 0.000000f, 321.352617f, 143.230046f }, -{ 19.291100f, -20.966763f, 53.187717f, 0.000000f, -1.000000f, 0.000000f, 321.987274f, 171.299429f }, -{ 21.967770f, -20.966759f, 30.467985f, 0.000000f, -1.000000f, 0.000000f, 315.286714f, 199.687265f }, -{ 19.338877f, -20.966749f, 6.999157f, 0.000000f, -1.000000f, 0.000000f, 301.902798f, 226.659149f }, -{ 11.340330f, -20.966751f, -13.645114f, 0.000000f, -1.000000f, 0.000000f, 283.317205f, 247.905254f }, -{ -2.195676f, -20.966743f, -30.821491f, 0.000000f, -1.000000f, 0.000000f, 259.609426f, 262.581684f }, -{ -21.436935f, -20.966740f, -43.886723f, 0.000000f, -1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, -20.966736f, -52.197575f, 0.000000f, -1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, -20.966743f, -55.110798f, 0.000000f, -1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, -20.966753f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 185.908946f, 78.488452f }, -{ -105.897141f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 138.492050f, 208.765350f }, -{ -77.958153f, -20.966742f, -23.647968f, 0.000000f, -1.000000f, 0.000000f, 171.965974f, 220.948864f }, -{ -58.874207f, -20.966740f, -21.368664f, 0.000000f, -1.000000f, 0.000000f, 195.824559f, 226.540055f }, -{ -44.341877f, -20.966745f, -15.146022f, 0.000000f, -1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, -20.966743f, -5.902942f, 0.000000f, -1.000000f, 0.000000f, 232.516059f, 218.910357f }, -{ -27.002363f, -20.966749f, 5.437657f, 0.000000f, -1.000000f, 0.000000f, 245.700060f, 208.321713f }, -{ -23.230320f, -20.966747f, 17.952679f, 0.000000f, -1.000000f, 0.000000f, 255.676941f, 194.972086f }, -{ -22.080179f, -20.966755f, 30.719687f, 0.000000f, -1.000000f, 0.000000f, 262.622269f, 180.177463f }, -{ -23.442402f, -20.966751f, 44.972424f, 0.000000f, -1.000000f, 0.000000f, 267.205431f, 162.507202f }, -{ -27.692215f, -20.966751f, 57.903645f, 0.000000f, -1.000000f, 0.000000f, 267.752663f, 145.160958f }, -{ -35.074326f, -20.966751f, 68.947113f, 0.000000f, -1.000000f, 0.000000f, 263.723906f, 128.710531f }, -{ -45.833443f, -20.966755f, 77.536469f, 0.000000f, -1.000000f, 0.000000f, 254.578922f, 113.727776f }, -{ -60.214287f, -20.966755f, 83.105392f, 0.000000f, -1.000000f, 0.000000f, 239.777576f, 100.784454f }, -{ -78.461555f, -20.966755f, 85.087540f, 0.000000f, -1.000000f, 0.000000f, 218.779751f, 90.452444f }, -{ 53.459190f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970485f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970482f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 2.970471f, 52.887688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 2.970478f, 61.040325f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 2.970474f, 68.629539f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 2.970473f, 75.245560f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 2.970474f, 80.478622f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 2.970474f, 83.918953f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 2.970474f, 85.156792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 2.970474f, 85.094475f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 2.970474f, 84.904106f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 2.970474f, 84.580559f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 2.970474f, 84.118721f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 2.970474f, 83.513466f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 2.970474f, 82.759666f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 2.970478f, 65.426537f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 2.970474f, 65.933624f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 2.970474f, 66.348511f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 2.970474f, 66.671196f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 2.970474f, 66.901688f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 2.970474f, 67.039986f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 2.970474f, 67.086082f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 2.970474f, 66.577293f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 2.970478f, 65.167015f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 2.970478f, 63.029404f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 2.970478f, 60.338612f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 2.970478f, 57.268784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970479f, 53.994072f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970478f, 37.767296f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970482f, 19.696451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 2.970489f, -63.834198f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 2.970482f, 10.661288f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 2.970477f, 25.597071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 2.970478f, 56.206810f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 2.970482f, 11.767657f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 2.970486f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 2.970482f, -3.168332f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 2.970490f, -33.040283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 243.335144f, 2.970478f, 56.104118f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970478f, 56.104118f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 252.174316f, 2.970475f, 54.095207f, -0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970479f, 54.095207f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 248.813965f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970477f, 44.635109f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 2.970478f, 56.341530f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 51.191429f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970478f, 56.341530f, 0.000002f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 264.026886f, 2.970477f, 44.635109f, 0.000003f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 261.908356f, 2.970467f, 51.721062f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 2.970471f, 48.634651f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970471f, 51.721062f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 2.970477f, 44.635109f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -92.719223f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 9.484118f, -90.693527f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 9.484118f, -89.192673f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 9.484118f, -90.116470f, -0.000001f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 80.447113f, 9.484106f, -92.906830f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 81.069901f, 9.484118f, -95.010895f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484118f, -97.592270f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 9.484118f, -97.720505f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 9.484118f, -95.573715f, 0.000000f, -1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 74.507790f, 9.484118f, -93.751663f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 9.484118f, -93.999222f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 9.484118f, -95.136749f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484118f, -97.015213f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.102959f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.339844f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 104.722122f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 111.632736f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 113.549179f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 116.619774f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.676575f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 110.364601f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 108.733131f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 106.325096f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.306671f, 9.484118f, -94.372665f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 9.484118f, -92.203903f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 9.484118f, -89.323883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 9.484118f, -89.280533f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 9.484118f, -90.026230f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 9.484118f, -95.155746f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 9.484118f, -94.450439f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 9.484118f, -95.135269f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 9.484118f, -96.915451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 128.513855f, 9.484118f, -99.379593f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.804985f, 9.484118f, -102.116226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 9.484118f, -104.713943f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -112.788498f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 9.484123f, -116.571518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.127060f, 9.484123f, -117.804031f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.305023f, 9.484123f, -118.637589f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.903000f, 9.484123f, -118.586227f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 149.472794f, 9.484123f, -117.781754f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.448669f, 9.484123f, -116.186508f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 148.102249f, 9.484123f, -115.096786f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.276031f, 9.484123f, -117.172348f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.652115f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 9.484123f, -117.808792f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.850311f, 9.484123f, -115.206024f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.073761f, 9.484123f, -111.634354f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 138.144791f, 9.484118f, -107.571106f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 9.484118f, -104.049301f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 9.484118f, -102.166397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -100.028793f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -97.335800f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 9.484118f, -94.538605f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 9.484118f, -93.718704f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 9.484118f, -93.732071f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 9.484118f, -94.706924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -98.297592f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 9.484118f, -92.526871f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 9.484118f, -89.665543f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 9.484118f, -88.951340f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 9.484118f, -89.072159f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 9.484118f, -90.715500f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 9.484118f, -94.111435f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 9.484118f, -96.502243f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 9.484123f, -113.100784f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 9.484123f, -113.846451f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.680603f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.124680f, 9.484123f, -114.032883f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 9.484123f, -113.553177f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484123f, -110.800797f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 9.484118f, -103.491226f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 9.484118f, -104.727600f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 9.484118f, -105.944382f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 9.484118f, -107.154037f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.162918f, 9.484122f, -109.601837f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 9.484123f, -112.551010f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.188812f, 9.484123f, -113.667160f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.447449f, 9.484123f, -114.070877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.715591f, 9.484123f, -113.693283f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.898224f, 9.484123f, -112.589005f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.430771f, 9.484123f, -111.777725f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 9.484123f, -117.276840f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 9.484123f, -118.160263f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 9.484123f, -118.815689f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 9.484123f, -118.315506f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 9.484123f, -116.887375f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 9.484123f, -114.639938f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 9.484123f, -111.681854f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 9.484118f, -108.121765f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 9.484118f, -104.068314f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 9.484118f, -96.903595f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.822617f, 9.484118f, -90.542221f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 9.484118f, -88.872086f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -89.897995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 9.484118f, -95.027512f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 9.484118f, -93.616898f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 9.484118f, -94.882645f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 9.484118f, -98.442444f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.747299f, 9.484118f, -103.940063f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 9.484122f, -109.302322f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 9.484123f, -112.812241f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 9.484123f, -113.911758f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 9.484123f, -118.378738f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 9.484123f, -118.195877f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 9.484123f, -116.165436f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.724243f, 9.484123f, -111.466034f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.448257f, 9.484123f, -113.686172f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 9.484123f, -118.046249f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 9.484118f, -105.863632f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 9.484123f, -118.687454f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ -227.530014f, 20.966755f, 18.889763f, 0.000000f, 1.000000f, 0.000000f, 11.312366f, 104.759421f }, -{ -227.530014f, 20.966747f, 49.094074f, 0.000000f, 1.000000f, 0.000000f, 24.483732f, 68.571394f }, -{ -220.271423f, 20.966747f, 49.922592f, 0.000000f, 1.000000f, 0.000000f, 33.541610f, 70.744042f }, -{ -214.348251f, 20.966747f, 52.198406f, 0.000000f, 1.000000f, 0.000000f, 41.630631f, 70.600318f }, -{ -209.753510f, 20.966751f, 55.606876f, 0.000000f, 1.000000f, 0.000000f, 48.621982f, 68.520264f }, -{ -206.480209f, 20.966751f, 59.833382f, 0.000000f, 1.000000f, 0.000000f, 54.386827f, 64.883844f }, -{ -204.521362f, 20.966751f, 64.563332f, 0.000000f, 1.000000f, 0.000000f, 58.796350f, 60.071068f }, -{ -203.869965f, 20.966747f, 69.482018f, 0.000000f, 1.000000f, 0.000000f, 61.721714f, 54.462006f }, -{ -204.699646f, 20.966745f, 74.975189f, 0.000000f, 1.000000f, 0.000000f, 63.123110f, 47.518791f }, -{ -207.067520f, 20.966745f, 79.783180f, 0.000000f, 1.000000f, 0.000000f, 62.382784f, 40.725728f }, -{ -210.791794f, 20.966745f, 83.766144f, 0.000000f, 1.000000f, 0.000000f, 59.657578f, 34.329638f }, -{ -215.690674f, 20.966745f, 86.784241f, 0.000000f, 1.000000f, 0.000000f, 55.104305f, 28.577339f }, -{ -221.582382f, 20.966745f, 88.697647f, 0.000000f, 1.000000f, 0.000000f, 48.879791f, 23.715652f }, -{ -228.285126f, 20.966745f, 89.366524f, 0.000000f, 1.000000f, 0.000000f, 41.140860f, 19.991366f }, -{ -233.272552f, 20.966745f, 89.153275f, 0.000000f, 1.000000f, 0.000000f, 35.072392f, 18.071967f }, -{ -238.232040f, 20.966745f, 88.499550f, 0.000000f, 1.000000f, 0.000000f, 28.845318f, 16.692474f }, -{ -243.261429f, 20.966745f, 87.384369f, 0.000000f, 1.000000f, 0.000000f, 22.333258f, 15.835392f }, -{ -248.458618f, 20.966745f, 85.786751f, 0.000000f, 1.000000f, 0.000000f, 15.409784f, 15.483151f }, -{ -253.921509f, 20.966745f, 83.685738f, 0.000000f, 1.000000f, 0.000000f, 7.948449f, 15.618150f }, -{ -259.747955f, 20.966745f, 81.060341f, 0.000000f, 1.000000f, 0.000000f, -0.177137f, 16.222895f }, -{ -259.747955f, 20.966743f, 111.264641f, 0.000000f, 1.000000f, 0.000000f, 12.994218f, -19.965132f }, -{ -253.885376f, 20.966743f, 113.571915f, 0.000000f, 1.000000f, 0.000000f, 21.024369f, -20.172966f }, -{ -247.666229f, 20.966742f, 115.459694f, 0.000000f, 1.000000f, 0.000000f, 29.298793f, -19.722705f }, -{ -241.153412f, 20.966742f, 116.927956f, 0.000000f, 1.000000f, 0.000000f, 37.742128f, -18.641769f }, -{ -234.409882f, 20.966742f, 117.976715f, 0.000000f, 1.000000f, 0.000000f, 46.278944f, -16.957608f }, -{ -227.498550f, 20.966742f, 118.605980f, 0.000000f, 1.000000f, 0.000000f, 54.833877f, -14.697672f }, -{ -220.482346f, 20.966742f, 118.815727f, 0.000000f, 1.000000f, 0.000000f, 63.331513f, -11.889380f }, -{ -205.143631f, 20.966742f, 117.432526f, 0.000000f, 1.000000f, 0.000000f, 81.105774f, -3.543295f }, -{ -191.825546f, 20.966743f, 113.455399f, 0.000000f, 1.000000f, 0.000000f, 95.327947f, 7.029410f }, -{ -180.870651f, 20.966740f, 107.143021f, 0.000000f, 1.000000f, 0.000000f, 105.700425f, 19.369491f }, -{ -172.621567f, 20.966740f, 98.754097f, 0.000000f, 1.000000f, 0.000000f, 111.925517f, 33.017553f }, -{ -167.420868f, 20.966738f, 88.547325f, 0.000000f, 1.000000f, 0.000000f, 113.705593f, 47.514262f }, -{ -165.611176f, 20.966738f, 76.781395f, 0.000000f, 1.000000f, 0.000000f, 110.742960f, 62.400282f }, -{ -166.340637f, 20.966747f, 68.696609f, 0.000000f, 1.000000f, 0.000000f, 106.343412f, 71.768634f }, -{ -168.510422f, 20.966751f, 61.101219f, 0.000000f, 1.000000f, 0.000000f, 100.431613f, 79.922540f }, -{ -172.092514f, 20.966747f, 54.065197f, 0.000000f, 1.000000f, 0.000000f, 93.071636f, 86.790398f }, -{ -177.058975f, 20.966749f, 47.658436f, 0.000000f, 1.000000f, 0.000000f, 84.327446f, 92.300634f }, -{ -183.381851f, 20.966749f, 41.950848f, 0.000000f, 1.000000f, 0.000000f, 74.263017f, 96.381691f }, -{ -191.033142f, 20.966749f, 37.012348f, 0.000000f, 1.000000f, 0.000000f, 62.942388f, 98.962011f }, -{ -181.454453f, 20.966749f, 32.298752f, 0.000000f, 1.000000f, 0.000000f, 72.363211f, 108.786445f }, -{ -173.805496f, 20.966751f, 26.319649f, 0.000000f, 1.000000f, 0.000000f, 78.920146f, 119.285570f }, -{ -168.002350f, 20.966755f, 19.235847f, 0.000000f, 1.000000f, 0.000000f, 82.783870f, 130.303345f }, -{ -163.961121f, 20.966755f, 11.208177f, 0.000000f, 1.000000f, 0.000000f, 84.125031f, 141.683643f }, -{ -161.597916f, 20.966753f, 2.397416f, 0.000000f, 1.000000f, 0.000000f, 83.114247f, 153.270422f }, -{ -160.828827f, 20.966753f, -7.035606f, 0.000000f, 1.000000f, 0.000000f, 79.922183f, 164.907587f }, -{ -162.772522f, 20.966755f, -21.426933f, 0.000000f, 1.000000f, 0.000000f, 71.317727f, 181.302347f }, -{ -168.407867f, 20.966755f, -33.734711f, 0.000000f, 1.000000f, 0.000000f, 59.198847f, 193.590963f }, -{ -177.441193f, 20.966757f, -43.721252f, 0.000000f, 1.000000f, 0.000000f, 44.021060f, 201.616710f }, -{ -189.578857f, 20.966757f, -51.148804f, 0.000000f, 1.000000f, 0.000000f, 26.239853f, 205.222777f }, -{ -204.527191f, 20.966757f, -55.779663f, 0.000000f, 1.000000f, 0.000000f, 6.310730f, 204.252446f }, -{ -221.992554f, 20.966764f, -57.376114f, 0.000000f, 1.000000f, 0.000000f, -15.310837f, 198.548949f }, -{ -229.371170f, 20.966764f, -57.068481f, 0.000000f, 1.000000f, 0.000000f, -24.017065f, 194.962735f }, -{ -236.805725f, 20.966764f, -56.173538f, 0.000000f, 1.000000f, 0.000000f, -32.534211f, 190.648469f }, -{ -244.142380f, 20.966764f, -54.733246f, 0.000000f, 1.000000f, 0.000000f, -40.696227f, 185.723508f }, -{ -251.227341f, 20.966764f, -52.789536f, 0.000000f, 1.000000f, 0.000000f, -48.337180f, 180.305151f }, -{ -257.906799f, 20.966764f, -50.384384f, 0.000000f, 1.000000f, 0.000000f, -55.291061f, 174.510773f }, -{ -264.026886f, 20.966764f, -47.559723f, 0.000000f, 1.000000f, 0.000000f, -61.391828f, 168.457698f }, -{ -264.026886f, 20.966753f, -14.334975f, 0.000000f, 1.000000f, 0.000000f, -46.903330f, 128.650867f }, -{ -257.339294f, 20.966755f, -18.662872f, 0.000000f, 1.000000f, 0.000000f, -40.778150f, 136.752450f }, -{ -251.050217f, 20.966759f, -22.109795f, 0.000000f, 1.000000f, 0.000000f, -34.746278f, 143.624746f }, -{ -245.054810f, 20.966759f, -24.717712f, 0.000000f, 1.000000f, 0.000000f, -28.700388f, 149.363761f }, -{ -239.248169f, 20.966759f, -26.528572f, 0.000000f, 1.000000f, 0.000000f, -22.533070f, 154.065507f }, -{ -233.525421f, 20.966759f, -27.584328f, 0.000000f, 1.000000f, 0.000000f, -16.136991f, 157.825968f }, -{ -227.781708f, 20.966759f, -27.926926f, 0.000000f, 1.000000f, 0.000000f, -9.404798f, 160.741125f }, -{ -220.280746f, 20.966759f, -27.192787f, 0.000000f, 1.000000f, 0.000000f, -0.097693f, 163.132535f }, -{ -213.751633f, 20.966759f, -25.074295f, 0.000000f, 1.000000f, 0.000000f, 8.648710f, 163.441542f }, -{ -208.369156f, 20.966755f, -21.697281f, 0.000000f, 1.000000f, 0.000000f, 16.570136f, 161.742676f }, -{ -204.308121f, 20.966755f, -17.187607f, 0.000000f, 1.000000f, 0.000000f, 23.402251f, 158.110519f }, -{ -201.743317f, 20.966753f, -11.671119f, 0.000000f, 1.000000f, 0.000000f, 28.880766f, 152.619616f }, -{ -200.849533f, 20.966753f, -5.273689f, 0.000000f, 1.000000f, 0.000000f, 32.741376f, 145.344564f }, -{ -201.724655f, 20.966753f, 1.288060f, 0.000000f, 1.000000f, 0.000000f, 34.554308f, 137.101256f }, -{ -204.242859f, 20.966751f, 7.031769f, 0.000000f, 1.000000f, 0.000000f, 34.041921f, 129.121548f }, -{ -208.243301f, 20.966755f, 11.810632f, 0.000000f, 1.000000f, 0.000000f, 31.332898f, 121.651460f }, -{ -213.565170f, 20.966755f, 15.477799f, 0.000000f, 1.000000f, 0.000000f, 26.555888f, 114.937053f }, -{ -220.047684f, 20.966755f, 17.886444f, 0.000000f, 1.000000f, 0.000000f, 19.839494f, 109.224379f }, -{ -148.686584f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 148.362750f, 22.133128f }, -{ -72.924095f, 20.966726f, 116.550392f, 0.000000f, 1.000000f, 0.000000f, 239.134392f, 55.171292f }, -{ -44.133286f, 20.966728f, 113.442566f, 0.000000f, 1.000000f, 0.000000f, 272.273660f, 71.449770f }, -{ -20.467419f, 20.966740f, 104.692406f, 0.000000f, 1.000000f, 0.000000f, 296.812196f, 92.253517f }, -{ -1.975434f, 20.966738f, 91.159897f, 0.000000f, 1.000000f, 0.000000f, 313.066387f, 116.530840f }, -{ 11.293716f, 20.966730f, 73.705025f, 0.000000f, 1.000000f, 0.000000f, 321.352617f, 143.230008f }, -{ 19.291100f, 20.966740f, 53.187733f, 0.000000f, 1.000000f, 0.000000f, 321.987274f, 171.299414f }, -{ 21.967770f, 20.966734f, 30.467978f, 0.000000f, 1.000000f, 0.000000f, 315.286714f, 199.687280f }, -{ 19.338877f, 20.966743f, 6.999154f, 0.000000f, 1.000000f, 0.000000f, 301.902798f, 226.659158f }, -{ 11.340330f, 20.966745f, -13.645118f, 0.000000f, 1.000000f, 0.000000f, 283.317205f, 247.905264f }, -{ -2.195676f, 20.966759f, -30.821503f, 0.000000f, 1.000000f, 0.000000f, 259.609396f, 262.581703f }, -{ -21.436935f, 20.966757f, -43.886719f, 0.000000f, 1.000000f, 0.000000f, 230.858877f, 269.844599f }, -{ -46.551262f, 20.966757f, -52.197571f, 0.000000f, 1.000000f, 0.000000f, 197.145034f, 268.850158f }, -{ -77.706444f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 158.547374f, 258.754495f }, -{ -148.686584f, 20.966757f, -55.110794f, 0.000000f, 1.000000f, 0.000000f, 73.505490f, 227.801797f }, -{ -105.897141f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 185.908961f, 78.488406f }, -{ -105.897141f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 138.492035f, 208.765369f }, -{ -77.958153f, 20.966759f, -23.647980f, 0.000000f, 1.000000f, 0.000000f, 171.965959f, 220.948887f }, -{ -58.874207f, 20.966755f, -21.368675f, 0.000000f, 1.000000f, 0.000000f, 195.824544f, 226.540074f }, -{ -44.341877f, 20.966753f, -15.146018f, 0.000000f, 1.000000f, 0.000000f, 215.949404f, 225.421851f }, -{ -33.878738f, 20.966745f, -5.902946f, 0.000000f, 1.000000f, 0.000000f, 232.516059f, 218.910365f }, -{ -27.002363f, 20.966743f, 5.437653f, 0.000000f, 1.000000f, 0.000000f, 245.700045f, 208.321724f }, -{ -23.230320f, 20.966747f, 17.952866f, 0.000000f, 1.000000f, 0.000000f, 255.676941f, 194.972041f }, -{ -22.080179f, 20.966734f, 30.719679f, 0.000000f, 1.000000f, 0.000000f, 262.622269f, 180.177478f }, -{ -23.442402f, 20.966742f, 44.972439f, 0.000000f, 1.000000f, 0.000000f, 267.205431f, 162.507187f }, -{ -27.692215f, 20.966743f, 57.903660f, 0.000000f, 1.000000f, 0.000000f, 267.752663f, 145.160943f }, -{ -35.074326f, 20.966740f, 68.947144f, 0.000000f, 1.000000f, 0.000000f, 263.723906f, 128.710501f }, -{ -45.833443f, 20.966738f, 77.536499f, 0.000000f, 1.000000f, 0.000000f, 254.578922f, 113.727730f }, -{ -60.214287f, 20.966738f, 83.105423f, 0.000000f, 1.000000f, 0.000000f, 239.777591f, 100.784424f }, -{ -78.461555f, 20.966738f, 85.087578f, 0.000000f, 1.000000f, 0.000000f, 218.779751f, 90.452398f }, -{ 53.459190f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 34.431496f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.459190f, 21.106716f, 52.887684f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.761124f, 21.106716f, 61.040321f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.744659f, 21.106709f, 68.629570f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 65.526382f, 21.106707f, 75.245590f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.222885f, 21.106714f, 80.478653f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.950760f, 21.106714f, 83.918983f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.826599f, 21.106714f, 85.156822f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.486267f, 21.106707f, 85.094505f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.371353f, 21.106707f, 84.904137f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 115.334160f, 21.106707f, 84.580589f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 119.227013f, 21.106707f, 84.118752f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.902229f, 21.106707f, 83.513496f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 126.212128f, 21.106707f, 82.759697f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.179916f, 21.106716f, 65.426567f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.235428f, 21.106709f, 65.933655f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.283180f, 21.106709f, 66.348541f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.268738f, 21.106709f, 66.671227f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.137703f, 21.106709f, 66.901718f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.835670f, 21.106709f, 67.040016f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 101.308228f, 21.106709f, 67.086113f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.838806f, 21.106709f, 66.577324f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 91.224388f, 21.106716f, 65.167046f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 87.527145f, 21.106716f, 63.029400f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 84.809280f, 21.106716f, 60.338608f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 83.132957f, 21.106716f, 57.268780f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106716f, 53.994068f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106718f, 37.767292f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.661545f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106720f, 19.696632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 82.560364f, 21.106728f, -63.834198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 109.261765f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.509918f, 21.106720f, 10.661286f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.660858f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.037323f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.299042f, 21.106712f, 25.597252f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 203.001129f, 21.106716f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.139038f, 21.106712f, 56.206806f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 189.569809f, 21.106720f, 11.767655f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 239.097778f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 202.161682f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.620132f, 21.106722f, -3.168342f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.679504f, 21.106724f, -33.040283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 246.695496f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 243.335144f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106712f, 56.104115f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 252.174316f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106709f, 54.095203f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 248.813965f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106710f, 44.635105f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 253.836212f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 51.191425f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106712f, 56.341526f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 264.026886f, 21.106710f, 44.635105f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 261.908356f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 258.931549f, 21.106709f, 48.634647f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106709f, 51.721058f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 255.954681f, 21.106710f, 44.635105f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.398365f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.399651f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 64.683319f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -92.719193f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 71.361206f, 21.091311f, -90.693512f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 75.070610f, 21.091311f, -89.192642f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 78.221947f, 21.091311f, -90.116440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 80.447113f, 21.091311f, -92.906815f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.069901f, 21.091311f, -95.010880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091311f, -97.592255f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 81.290161f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.288872f, 21.091311f, -97.720490f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 76.046646f, 21.091311f, -95.573685f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 74.507790f, 21.091311f, -93.751633f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 72.154381f, 21.091311f, -93.999207f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 70.869621f, 21.091311f, -95.136734f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091311f, -97.015182f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 69.684608f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.042702f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 112.247803f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.574234f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 103.539482f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.209610f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.385559f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.102959f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 101.339844f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 102.036247f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 103.170799f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 104.722122f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.933678f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.632736f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.549179f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 114.952675f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.387047f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 116.619774f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.104248f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 106.676575f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.374535f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.169655f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 113.774490f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.040123f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.618484f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 111.312141f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 110.364601f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 108.733131f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 107.208519f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 106.325096f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091320f, -118.046234f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 122.262253f, 21.091311f, -89.641495f, -0.000003f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.391785f, 21.091311f, -97.335770f, -0.000004f, 1.000000f, -0.000003f, 0.000000f, 255.000000f }, -{ 128.306671f, 21.091311f, -94.372635f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.111130f, 21.091311f, -92.203873f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.876404f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 131.574371f, 21.091311f, -89.323868f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 133.556717f, 21.091311f, -89.280518f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 135.214310f, 21.091311f, -90.026199f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 134.829590f, 21.091311f, -95.155716f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 132.649551f, 21.091311f, -94.450424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 130.914764f, 21.091311f, -95.135239f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 129.543335f, 21.091311f, -96.915436f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 128.513855f, 21.091307f, -99.379562f, -0.000005f, 1.000000f, -0.000004f, 0.000000f, 255.000000f }, -{ 127.804985f, 21.091307f, -102.116196f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.395340f, 21.091309f, -104.713913f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 127.263535f, 21.091320f, -118.046234f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -112.788467f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 155.668289f, 21.091312f, -116.571503f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.127060f, 21.091320f, -117.804016f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 152.305023f, 21.091320f, -118.637558f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 150.903000f, 21.091320f, -118.586197f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 149.472794f, 21.091320f, -117.781738f, 0.000003f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 148.448669f, 21.091320f, -116.186478f, 0.000012f, 1.000000f, 0.000005f, 0.000000f, 255.000000f }, -{ 148.102249f, 21.091320f, -115.096756f, 0.000003f, 1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 146.276031f, 21.091320f, -117.172318f, 0.000001f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 142.652115f, 21.091320f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 139.866501f, 21.091320f, -117.808762f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.850311f, 21.091320f, -115.206009f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 137.073761f, 21.091320f, -111.634323f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 138.144791f, 21.091309f, -107.571091f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 141.623840f, 21.091307f, -104.049286f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.391052f, 21.091307f, -102.166382f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -100.028778f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091311f, -97.335770f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.180527f, 21.091311f, -94.538589f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 145.869064f, 21.091311f, -93.718689f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.898575f, 21.091311f, -93.732040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.682312f, 21.091311f, -94.706894f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091307f, -98.297562f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 137.779068f, 21.091311f, -92.526840f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 141.658264f, 21.091311f, -89.665527f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.054428f, 21.091311f, -88.951309f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.152328f, 21.091311f, -89.072128f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 150.474655f, 21.091311f, -90.715469f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.600082f, 21.091311f, -94.111420f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.911179f, 21.091311f, -96.502228f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 152.932556f, 21.091312f, -113.100754f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 153.103531f, 21.091312f, -113.846436f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 153.680603f, 21.091312f, -114.199097f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 154.124680f, 21.091312f, -114.032852f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 154.796753f, 21.091312f, -113.553146f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091312f, -110.800781f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 147.909882f, 21.091307f, -103.491211f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 146.048050f, 21.091309f, -104.727585f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 144.556686f, 21.091309f, -105.944351f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 143.421539f, 21.091309f, -107.154007f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 142.628372f, 21.091309f, -108.369003f, 0.000003f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.162918f, 21.091312f, -109.601822f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.010925f, 21.091312f, -110.864899f, 0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 142.329147f, 21.091312f, -112.550995f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 143.188812f, 21.091320f, -113.667130f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 144.447449f, 21.091320f, -114.070847f, 0.000002f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 145.715591f, 21.091312f, -113.693268f, 0.000000f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 146.898224f, 21.091312f, -112.588989f, -0.000002f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 147.430771f, 21.091312f, -111.777710f, 0.000004f, 1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.749878f, 21.091312f, -117.276810f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 172.085159f, 21.091312f, -118.160233f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 168.812698f, 21.091312f, -118.815659f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.009262f, 21.091312f, -118.315475f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 163.547806f, 21.091312f, -116.887344f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 161.503128f, 21.091312f, -114.639908f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.950012f, 21.091312f, -111.681839f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 158.963303f, 21.091309f, -108.121750f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 158.617767f, 21.091307f, -104.068283f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 159.531387f, 21.091311f, -96.903564f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.822617f, 21.091311f, -90.542206f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.115997f, 21.091311f, -88.872055f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -89.897964f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 173.301041f, 21.091311f, -95.027481f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 169.582138f, 21.091311f, -93.616867f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 166.473557f, 21.091311f, -94.882629f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.462112f, 21.091307f, -98.442429f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 163.747299f, 21.091307f, -103.940048f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 164.523849f, 21.091312f, -109.302292f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 166.711029f, 21.091312f, -112.812210f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 171.313354f, 21.091312f, -113.911743f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.637802f, 21.091312f, -118.378708f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.602036f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 182.419891f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 181.128311f, 21.091312f, -118.195847f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.089645f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 179.323486f, 21.091312f, -116.165421f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.849426f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.687042f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 175.416977f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 178.200211f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 180.755478f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.239502f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 188.369019f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.688324f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 183.847443f, 21.091312f, -112.446503f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.081055f, 21.091312f, -113.181198f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 184.972198f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 186.488205f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.280289f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.281570f, 21.091312f, -118.046234f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 209.400085f, 21.091312f, -118.687424f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 200.872238f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 205.873535f, 21.091311f, -89.641495f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.041275f, 21.091309f, -105.863617f, 0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.169510f, 21.091309f, -105.863617f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 214.337250f, 21.091311f, -89.641495f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 219.338531f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 210.810699f, 21.091312f, -118.687424f, -0.000001f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 196.095139f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 197.530334f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 197.312714f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 195.569748f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.322433f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 191.887238f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 192.104858f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 193.847824f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 196.095139f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.530334f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 197.312714f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 195.569748f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 193.322433f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 191.887238f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 192.104858f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 193.847824f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 194.708786f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 194.708786f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 57.212021f, 9.401914f, -83.842834f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 58.647217f, 9.401917f, -82.099869f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 58.429596f, 9.401917f, -79.852554f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 56.686630f, 9.401917f, -78.417358f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.439316f, 9.401917f, -78.634979f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.004120f, 9.401917f, -80.377945f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 53.221741f, 9.401917f, -82.625259f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 54.964706f, 9.401914f, -84.060455f, 0.000000f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 57.212021f, 21.005835f, -83.842834f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.647217f, 21.005833f, -82.099869f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 58.429596f, 21.005833f, -79.852554f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 56.686630f, 21.005836f, -78.417358f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 54.439316f, 21.005836f, -78.634979f, 0.000000f, 1.000000f, -0.000002f, 0.000000f, 255.000000f }, -{ 53.004120f, 21.005833f, -80.377945f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 53.221741f, 21.005835f, -82.625259f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 54.964706f, 21.005835f, -84.060455f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 55.825668f, 21.005833f, -81.238907f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 55.825668f, 9.401917f, -81.238907f, 0.000000f, -1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -113.301437f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484123f, -117.725662f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 9.484123f, -118.792831f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 9.484123f, -118.666077f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 9.484123f, -117.373001f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 9.484123f, -114.541092f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484123f, -112.467911f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 9.484118f, -89.945480f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 9.484117f, -86.238449f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484117f, -82.331924f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -89.641510f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 9.484118f, -94.001602f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.060944f, 9.484123f, -112.446518f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 9.484123f, -113.977371f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 9.484123f, -113.985397f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -113.301422f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091312f, -117.725632f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.979660f, 21.091312f, -118.792801f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 92.633392f, 21.091312f, -118.666061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.303146f, 21.091312f, -117.372986f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 89.062927f, 21.091312f, -114.541061f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091312f, -112.467880f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.900543f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 85.630478f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 88.413712f, 21.091311f, -89.945450f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 90.968979f, 21.091311f, -86.238419f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.453003f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091309f, -82.331909f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -89.641495f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 98.582520f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 93.901825f, 21.091311f, -94.001587f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 94.047279f, 21.091312f, -112.455856f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 95.185699f, 21.091312f, -113.977341f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 96.701706f, 21.091312f, -113.985367f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -111.377884f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 9.484123f, -116.315048f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 9.484123f, -118.552078f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 9.484123f, -118.394455f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 9.484123f, -115.040680f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 9.484123f, -112.118805f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 9.484118f, -108.374069f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 221.961212f, 9.484118f, -103.811813f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.198090f, 9.484118f, -99.454697f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 9.484118f, -95.777939f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 9.484106f, -92.831436f, 0.000002f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 225.580368f, 9.484118f, -90.665039f, -0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 9.484118f, -88.927658f, 0.000000f, -1.000000f, 0.000003f, 0.000000f, 255.000000f }, -{ 232.490982f, 9.484118f, -89.470520f, 0.000001f, -1.000000f, 0.000002f, 0.000000f, 255.000000f }, -{ 234.407425f, 9.484118f, -91.009384f, 0.000001f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 9.484106f, -93.103928f, -0.000002f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 9.484118f, -99.154877f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 237.478027f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 9.484118f, -104.965958f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.534821f, 9.484123f, -110.009995f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 9.484123f, -113.130463f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 9.484123f, -114.199112f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 9.484123f, -113.485794f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 9.484118f, -101.247055f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 9.484118f, -96.746857f, -0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 231.222839f, 9.484118f, -94.098984f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 229.591370f, 9.484106f, -93.232178f, 0.000000f, -1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 9.484118f, -94.113220f, 0.000000f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 227.183350f, 9.484118f, -96.775345f, 0.000001f, -1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -111.377853f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 236.900940f, 21.091320f, -116.315018f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 233.106049f, 21.091320f, -118.552063f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.432480f, 21.091320f, -118.394440f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 224.397736f, 21.091320f, -115.040665f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 223.067856f, 21.091320f, -112.118790f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.243805f, 21.091312f, -108.374054f, -0.000001f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 221.961212f, 21.091311f, -103.811798f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 222.198090f, 21.091307f, -99.454666f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 222.894501f, 21.091311f, -95.777908f, 0.000000f, 1.000000f, -0.000001f, 0.000000f, 255.000000f }, -{ 224.029053f, 21.091311f, -92.831406f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 225.580368f, 21.091311f, -90.665024f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.791931f, 21.091311f, -88.927628f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.490982f, 21.091311f, -89.470505f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.407425f, 21.091311f, -91.009354f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 235.810913f, 21.091311f, -93.103912f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.245300f, 21.091307f, -99.154861f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 237.478027f, 21.091309f, -104.965942f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.962494f, 21.091312f, -104.965942f, 0.000000f, 1.000000f, 0.000001f, 0.000000f, 255.000000f }, -{ 227.534821f, 21.091320f, -110.009979f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.232788f, 21.091320f, -113.130447f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.027893f, 21.091320f, -114.199097f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 234.632736f, 21.091320f, -113.485764f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 226.898376f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.476730f, 21.091307f, -101.247040f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 232.170380f, 21.091311f, -96.746841f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 231.222839f, 21.091311f, -94.098953f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 229.591370f, 21.091311f, -93.232162f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 228.066772f, 21.091311f, -94.113205f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f }, -{ 227.183350f, 21.091311f, -96.775330f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 255.000000f } -}; - -static Face face_1[] = { -{ 1, 2, 350, 0, 4 }, -{ 1, 350, 349, 0, 3 }, -{ 2, 3, 351, 0, 4 }, -{ 2, 351, 350, 0, 2 }, -{ 3, 4, 352, 0, 4 }, -{ 3, 352, 351, 0, 2 }, -{ 4, 5, 353, 0, 4 }, -{ 4, 353, 352, 0, 2 }, -{ 5, 6, 354, 0, 4 }, -{ 5, 354, 353, 0, 2 }, -{ 6, 7, 355, 0, 4 }, -{ 6, 355, 354, 0, 2 }, -{ 7, 8, 356, 0, 4 }, -{ 7, 356, 355, 0, 2 }, -{ 8, 9, 357, 0, 4 }, -{ 8, 357, 356, 0, 2 }, -{ 9, 10, 358, 0, 4 }, -{ 9, 358, 357, 0, 2 }, -{ 10, 11, 359, 0, 4 }, -{ 10, 359, 358, 0, 2 }, -{ 11, 12, 360, 0, 4 }, -{ 11, 360, 359, 0, 2 }, -{ 12, 13, 361, 0, 4 }, -{ 12, 361, 360, 0, 2 }, -{ 13, 14, 362, 0, 4 }, -{ 13, 362, 361, 0, 2 }, -{ 14, 15, 363, 0, 4 }, -{ 14, 363, 362, 0, 2 }, -{ 15, 16, 364, 0, 4 }, -{ 15, 364, 363, 0, 2 }, -{ 16, 17, 365, 0, 4 }, -{ 16, 365, 364, 0, 2 }, -{ 17, 18, 366, 0, 4 }, -{ 17, 366, 365, 0, 2 }, -{ 18, 19, 367, 0, 6 }, -{ 18, 367, 366, 0, 2 }, -{ 20, 21, 369, 0, 4 }, -{ 20, 369, 368, 0, 3 }, -{ 21, 22, 370, 0, 4 }, -{ 21, 370, 369, 0, 2 }, -{ 22, 23, 371, 0, 4 }, -{ 22, 371, 370, 0, 2 }, -{ 23, 24, 372, 0, 4 }, -{ 23, 372, 371, 0, 2 }, -{ 24, 25, 373, 0, 4 }, -{ 24, 373, 372, 0, 2 }, -{ 25, 26, 374, 0, 4 }, -{ 25, 374, 373, 0, 2 }, -{ 26, 27, 375, 0, 4 }, -{ 26, 375, 374, 0, 2 }, -{ 27, 28, 376, 0, 4 }, -{ 27, 376, 375, 0, 2 }, -{ 28, 29, 377, 0, 4 }, -{ 28, 377, 376, 0, 2 }, -{ 29, 30, 378, 0, 4 }, -{ 29, 378, 377, 0, 2 }, -{ 30, 31, 379, 0, 4 }, -{ 30, 379, 378, 0, 2 }, -{ 31, 32, 380, 0, 4 }, -{ 31, 380, 379, 0, 2 }, -{ 32, 33, 381, 0, 4 }, -{ 32, 381, 380, 0, 2 }, -{ 33, 34, 382, 0, 4 }, -{ 33, 382, 381, 0, 2 }, -{ 34, 35, 383, 0, 4 }, -{ 34, 383, 382, 0, 2 }, -{ 35, 36, 384, 0, 4 }, -{ 35, 384, 383, 0, 2 }, -{ 36, 37, 385, 0, 4 }, -{ 36, 385, 384, 0, 2 }, -{ 37, 38, 386, 0, 4 }, -{ 37, 386, 385, 0, 2 }, -{ 38, 39, 387, 0, 4 }, -{ 38, 387, 386, 0, 2 }, -{ 39, 40, 388, 0, 4 }, -{ 39, 388, 387, 0, 2 }, -{ 40, 41, 389, 0, 4 }, -{ 40, 389, 388, 0, 2 }, -{ 41, 42, 390, 0, 4 }, -{ 41, 390, 389, 0, 2 }, -{ 42, 43, 391, 0, 4 }, -{ 42, 391, 390, 0, 2 }, -{ 43, 44, 392, 0, 4 }, -{ 43, 392, 391, 0, 2 }, -{ 44, 45, 393, 0, 4 }, -{ 44, 393, 392, 0, 2 }, -{ 45, 46, 394, 0, 4 }, -{ 45, 394, 393, 0, 2 }, -{ 46, 47, 395, 0, 4 }, -{ 46, 395, 394, 0, 2 }, -{ 47, 48, 396, 0, 4 }, -{ 47, 396, 395, 0, 2 }, -{ 48, 49, 397, 0, 4 }, -{ 48, 397, 396, 0, 2 }, -{ 49, 50, 398, 0, 4 }, -{ 49, 398, 397, 0, 2 }, -{ 50, 51, 399, 0, 4 }, -{ 50, 399, 398, 0, 2 }, -{ 51, 52, 400, 0, 4 }, -{ 51, 400, 399, 0, 2 }, -{ 52, 53, 401, 0, 4 }, -{ 52, 401, 400, 0, 2 }, -{ 53, 54, 402, 0, 4 }, -{ 53, 402, 401, 0, 2 }, -{ 54, 55, 403, 0, 4 }, -{ 54, 403, 402, 0, 2 }, -{ 55, 56, 404, 0, 6 }, -{ 55, 404, 403, 0, 2 }, -{ 57, 58, 406, 0, 4 }, -{ 57, 406, 405, 0, 3 }, -{ 58, 59, 407, 0, 4 }, -{ 58, 407, 406, 0, 2 }, -{ 59, 60, 408, 0, 4 }, -{ 59, 408, 407, 0, 2 }, -{ 60, 61, 409, 0, 4 }, -{ 60, 409, 408, 0, 2 }, -{ 61, 62, 410, 0, 4 }, -{ 61, 410, 409, 0, 2 }, -{ 62, 63, 411, 0, 4 }, -{ 62, 411, 410, 0, 2 }, -{ 63, 64, 412, 0, 4 }, -{ 63, 412, 411, 0, 2 }, -{ 64, 65, 413, 0, 4 }, -{ 64, 413, 412, 0, 2 }, -{ 65, 66, 414, 0, 4 }, -{ 65, 414, 413, 0, 2 }, -{ 66, 67, 415, 0, 4 }, -{ 66, 415, 414, 0, 2 }, -{ 67, 68, 416, 0, 4 }, -{ 67, 416, 415, 0, 2 }, -{ 68, 69, 417, 0, 4 }, -{ 68, 417, 416, 0, 2 }, -{ 69, 70, 418, 0, 4 }, -{ 69, 418, 417, 0, 2 }, -{ 70, 71, 419, 0, 4 }, -{ 70, 419, 418, 0, 2 }, -{ 71, 72, 420, 0, 4 }, -{ 71, 420, 419, 0, 2 }, -{ 72, 73, 421, 0, 4 }, -{ 72, 421, 420, 0, 2 }, -{ 73, 74, 422, 0, 4 }, -{ 73, 422, 421, 0, 2 }, -{ 74, 0, 348, 0, 6 }, -{ 74, 348, 422, 0, 2 }, -{ 75, 76, 424, 0, 4 }, -{ 75, 424, 423, 0, 3 }, -{ 76, 77, 425, 0, 4 }, -{ 76, 425, 424, 0, 2 }, -{ 77, 78, 426, 0, 4 }, -{ 77, 426, 425, 0, 2 }, -{ 78, 79, 427, 0, 4 }, -{ 78, 427, 426, 0, 2 }, -{ 79, 80, 428, 0, 4 }, -{ 79, 428, 427, 0, 2 }, -{ 80, 81, 429, 0, 4 }, -{ 80, 429, 428, 0, 2 }, -{ 81, 82, 430, 0, 4 }, -{ 81, 430, 429, 0, 2 }, -{ 82, 83, 431, 0, 4 }, -{ 82, 431, 430, 0, 2 }, -{ 83, 84, 432, 0, 4 }, -{ 83, 432, 431, 0, 2 }, -{ 84, 85, 433, 0, 4 }, -{ 84, 433, 432, 0, 2 }, -{ 85, 86, 434, 0, 4 }, -{ 85, 434, 433, 0, 2 }, -{ 86, 87, 435, 0, 4 }, -{ 86, 435, 434, 0, 2 }, -{ 87, 88, 436, 0, 4 }, -{ 87, 436, 435, 0, 2 }, -{ 88, 89, 437, 0, 6 }, -{ 88, 437, 436, 0, 2 }, -{ 90, 91, 439, 0, 4 }, -{ 90, 439, 438, 0, 2 }, -{ 91, 92, 440, 0, 4 }, -{ 91, 440, 439, 0, 2 }, -{ 92, 93, 441, 0, 4 }, -{ 92, 441, 440, 0, 2 }, -{ 93, 94, 442, 0, 4 }, -{ 93, 442, 441, 0, 2 }, -{ 94, 95, 443, 0, 4 }, -{ 94, 443, 442, 0, 2 }, -{ 95, 96, 444, 0, 4 }, -{ 95, 444, 443, 0, 2 }, -{ 96, 97, 445, 0, 4 }, -{ 96, 445, 444, 0, 2 }, -{ 97, 98, 446, 0, 4 }, -{ 97, 446, 445, 0, 2 }, -{ 98, 99, 447, 0, 4 }, -{ 98, 447, 446, 0, 2 }, -{ 99, 100, 448, 0, 4 }, -{ 99, 448, 447, 0, 2 }, -{ 100, 101, 449, 0, 4 }, -{ 100, 449, 448, 0, 2 }, -{ 101, 102, 450, 0, 4 }, -{ 101, 450, 449, 0, 2 }, -{ 102, 103, 451, 0, 4 }, -{ 102, 451, 450, 0, 2 }, -{ 103, 104, 452, 0, 4 }, -{ 103, 452, 451, 0, 2 }, -{ 104, 90, 438, 0, 4 }, -{ 104, 438, 452, 0, 2 }, -{ 106, 107, 455, 1, 6 }, -{ 106, 455, 454, 1, 3 }, -{ 108, 109, 457, 1, 4 }, -{ 108, 457, 456, 1, 3 }, -{ 109, 110, 458, 1, 4 }, -{ 109, 458, 457, 1, 2 }, -{ 110, 111, 459, 1, 4 }, -{ 110, 459, 458, 1, 2 }, -{ 111, 112, 460, 1, 4 }, -{ 111, 460, 459, 1, 2 }, -{ 112, 113, 461, 1, 4 }, -{ 112, 461, 460, 1, 2 }, -{ 113, 114, 462, 1, 4 }, -{ 113, 462, 461, 1, 2 }, -{ 114, 115, 463, 1, 4 }, -{ 114, 463, 462, 1, 2 }, -{ 115, 116, 464, 1, 4 }, -{ 115, 464, 463, 1, 2 }, -{ 116, 117, 465, 1, 4 }, -{ 116, 465, 464, 1, 2 }, -{ 117, 118, 466, 1, 4 }, -{ 117, 466, 465, 1, 2 }, -{ 118, 119, 467, 1, 4 }, -{ 118, 467, 466, 1, 2 }, -{ 119, 120, 468, 1, 4 }, -{ 119, 468, 467, 1, 2 }, -{ 120, 121, 469, 1, 4 }, -{ 120, 469, 468, 1, 2 }, -{ 121, 122, 470, 1, 4 }, -{ 121, 470, 469, 1, 2 }, -{ 122, 123, 471, 1, 4 }, -{ 122, 471, 470, 1, 2 }, -{ 123, 124, 472, 1, 4 }, -{ 123, 472, 471, 1, 2 }, -{ 124, 125, 473, 1, 4 }, -{ 124, 473, 472, 1, 2 }, -{ 125, 126, 474, 1, 4 }, -{ 125, 474, 473, 1, 2 }, -{ 126, 127, 475, 1, 4 }, -{ 126, 475, 474, 1, 2 }, -{ 127, 128, 476, 1, 4 }, -{ 127, 476, 475, 1, 2 }, -{ 128, 129, 477, 1, 4 }, -{ 128, 477, 476, 1, 2 }, -{ 129, 130, 478, 1, 4 }, -{ 129, 478, 477, 1, 2 }, -{ 130, 131, 479, 1, 4 }, -{ 130, 479, 478, 1, 2 }, -{ 131, 132, 480, 1, 4 }, -{ 131, 480, 479, 1, 2 }, -{ 132, 133, 481, 1, 4 }, -{ 132, 481, 480, 1, 2 }, -{ 133, 134, 482, 1, 4 }, -{ 133, 482, 481, 1, 2 }, -{ 134, 135, 483, 1, 4 }, -{ 134, 483, 482, 1, 2 }, -{ 135, 136, 484, 1, 4 }, -{ 135, 484, 483, 1, 2 }, -{ 136, 137, 485, 1, 6 }, -{ 136, 485, 484, 1, 2 }, -{ 138, 139, 487, 1, 6 }, -{ 138, 487, 486, 1, 3 }, -{ 140, 105, 453, 1, 6 }, -{ 140, 453, 488, 1, 3 }, -{ 141, 142, 490, 1, 4 }, -{ 141, 490, 489, 1, 2 }, -{ 142, 143, 491, 1, 4 }, -{ 142, 491, 490, 1, 2 }, -{ 143, 144, 492, 1, 4 }, -{ 143, 492, 491, 1, 2 }, -{ 144, 145, 493, 1, 4 }, -{ 144, 493, 492, 1, 2 }, -{ 145, 146, 494, 1, 4 }, -{ 145, 494, 493, 1, 2 }, -{ 146, 147, 495, 1, 4 }, -{ 146, 495, 494, 1, 2 }, -{ 147, 148, 496, 1, 4 }, -{ 147, 496, 495, 1, 2 }, -{ 148, 149, 497, 1, 4 }, -{ 148, 497, 496, 1, 2 }, -{ 149, 150, 498, 1, 4 }, -{ 149, 498, 497, 1, 2 }, -{ 150, 151, 499, 1, 4 }, -{ 150, 499, 498, 1, 2 }, -{ 151, 152, 500, 1, 4 }, -{ 151, 500, 499, 1, 2 }, -{ 152, 141, 489, 1, 4 }, -{ 152, 489, 500, 1, 2 }, -{ 153, 154, 502, 1, 4 }, -{ 153, 502, 501, 1, 2 }, -{ 154, 155, 503, 1, 4 }, -{ 154, 503, 502, 1, 2 }, -{ 155, 156, 504, 1, 4 }, -{ 155, 504, 503, 1, 2 }, -{ 156, 157, 505, 1, 4 }, -{ 156, 505, 504, 1, 2 }, -{ 157, 158, 506, 1, 4 }, -{ 157, 506, 505, 1, 2 }, -{ 158, 159, 507, 1, 4 }, -{ 158, 507, 506, 1, 2 }, -{ 159, 160, 508, 1, 4 }, -{ 159, 508, 507, 1, 2 }, -{ 160, 153, 501, 1, 4 }, -{ 160, 501, 508, 1, 2 }, -{ 161, 162, 510, 1, 4 }, -{ 161, 510, 509, 1, 2 }, -{ 162, 163, 511, 1, 4 }, -{ 162, 511, 510, 1, 2 }, -{ 163, 164, 512, 1, 4 }, -{ 163, 512, 511, 1, 2 }, -{ 164, 165, 513, 1, 4 }, -{ 164, 513, 512, 1, 2 }, -{ 165, 166, 514, 1, 4 }, -{ 165, 514, 513, 1, 2 }, -{ 166, 167, 515, 1, 4 }, -{ 166, 515, 514, 1, 2 }, -{ 167, 168, 516, 1, 4 }, -{ 167, 516, 515, 1, 2 }, -{ 168, 169, 517, 1, 4 }, -{ 168, 517, 516, 1, 2 }, -{ 169, 170, 518, 1, 4 }, -{ 169, 518, 517, 1, 2 }, -{ 170, 161, 509, 1, 4 }, -{ 170, 509, 518, 1, 2 }, -{ 171, 172, 520, 1, 4 }, -{ 171, 520, 519, 1, 2 }, -{ 172, 173, 521, 1, 4 }, -{ 172, 521, 520, 1, 2 }, -{ 173, 174, 522, 1, 4 }, -{ 173, 522, 521, 1, 2 }, -{ 174, 171, 519, 1, 4 }, -{ 174, 519, 522, 1, 2 }, -{ 175, 176, 524, 1, 4 }, -{ 175, 524, 523, 1, 2 }, -{ 176, 177, 525, 1, 4 }, -{ 176, 525, 524, 1, 2 }, -{ 177, 178, 526, 1, 4 }, -{ 177, 526, 525, 1, 2 }, -{ 178, 179, 527, 1, 4 }, -{ 178, 527, 526, 1, 2 }, -{ 179, 180, 528, 1, 4 }, -{ 179, 528, 527, 1, 2 }, -{ 180, 181, 529, 1, 4 }, -{ 180, 529, 528, 1, 2 }, -{ 181, 182, 530, 1, 4 }, -{ 181, 530, 529, 1, 2 }, -{ 182, 183, 531, 1, 4 }, -{ 182, 531, 530, 1, 2 }, -{ 183, 184, 532, 1, 4 }, -{ 183, 532, 531, 1, 2 }, -{ 184, 185, 533, 1, 4 }, -{ 184, 533, 532, 1, 2 }, -{ 185, 186, 534, 1, 4 }, -{ 185, 534, 533, 1, 2 }, -{ 186, 187, 535, 1, 4 }, -{ 186, 535, 534, 1, 2 }, -{ 187, 188, 536, 1, 4 }, -{ 187, 536, 535, 1, 2 }, -{ 188, 189, 537, 1, 4 }, -{ 188, 537, 536, 1, 2 }, -{ 189, 190, 538, 1, 4 }, -{ 189, 538, 537, 1, 2 }, -{ 190, 191, 539, 1, 4 }, -{ 190, 539, 538, 1, 2 }, -{ 191, 192, 540, 1, 4 }, -{ 191, 540, 539, 1, 2 }, -{ 192, 193, 541, 1, 4 }, -{ 192, 541, 540, 1, 2 }, -{ 193, 175, 523, 1, 4 }, -{ 193, 523, 541, 1, 2 }, -{ 194, 195, 543, 1, 4 }, -{ 194, 543, 542, 1, 2 }, -{ 195, 196, 544, 1, 4 }, -{ 195, 544, 543, 1, 2 }, -{ 196, 197, 545, 1, 4 }, -{ 196, 545, 544, 1, 2 }, -{ 197, 198, 546, 1, 4 }, -{ 197, 546, 545, 1, 2 }, -{ 198, 199, 547, 1, 4 }, -{ 198, 547, 546, 1, 2 }, -{ 199, 200, 548, 1, 4 }, -{ 199, 548, 547, 1, 2 }, -{ 200, 201, 549, 1, 4 }, -{ 200, 549, 548, 1, 2 }, -{ 201, 202, 550, 1, 4 }, -{ 201, 550, 549, 1, 2 }, -{ 202, 203, 551, 1, 4 }, -{ 202, 551, 550, 1, 2 }, -{ 203, 204, 552, 1, 4 }, -{ 203, 552, 551, 1, 2 }, -{ 204, 205, 553, 1, 4 }, -{ 204, 553, 552, 1, 2 }, -{ 205, 206, 554, 1, 4 }, -{ 205, 554, 553, 1, 2 }, -{ 206, 207, 555, 1, 4 }, -{ 206, 555, 554, 1, 2 }, -{ 207, 208, 556, 1, 4 }, -{ 207, 556, 555, 1, 2 }, -{ 208, 209, 557, 1, 4 }, -{ 208, 557, 556, 1, 2 }, -{ 209, 210, 558, 1, 4 }, -{ 209, 558, 557, 1, 2 }, -{ 210, 211, 559, 1, 4 }, -{ 210, 559, 558, 1, 2 }, -{ 211, 212, 560, 1, 4 }, -{ 211, 560, 559, 1, 2 }, -{ 212, 213, 561, 1, 4 }, -{ 212, 561, 560, 1, 2 }, -{ 213, 214, 562, 1, 4 }, -{ 213, 562, 561, 1, 2 }, -{ 214, 215, 563, 1, 4 }, -{ 214, 563, 562, 1, 2 }, -{ 215, 216, 564, 1, 4 }, -{ 215, 564, 563, 1, 2 }, -{ 216, 194, 542, 1, 4 }, -{ 216, 542, 564, 1, 2 }, -{ 217, 218, 566, 1, 4 }, -{ 217, 566, 565, 1, 2 }, -{ 218, 219, 567, 1, 4 }, -{ 218, 567, 566, 1, 2 }, -{ 219, 220, 568, 1, 4 }, -{ 219, 568, 567, 1, 2 }, -{ 220, 221, 569, 1, 4 }, -{ 220, 569, 568, 1, 2 }, -{ 221, 222, 570, 1, 4 }, -{ 221, 570, 569, 1, 2 }, -{ 222, 223, 571, 1, 4 }, -{ 222, 571, 570, 1, 2 }, -{ 223, 217, 565, 1, 4 }, -{ 223, 565, 571, 1, 2 }, -{ 224, 225, 573, 1, 4 }, -{ 224, 573, 572, 1, 2 }, -{ 225, 226, 574, 1, 4 }, -{ 225, 574, 573, 1, 2 }, -{ 226, 227, 575, 1, 4 }, -{ 226, 575, 574, 1, 2 }, -{ 227, 228, 576, 1, 4 }, -{ 227, 576, 575, 1, 2 }, -{ 228, 229, 577, 1, 4 }, -{ 228, 577, 576, 1, 2 }, -{ 229, 230, 578, 1, 4 }, -{ 229, 578, 577, 1, 2 }, -{ 230, 231, 579, 1, 4 }, -{ 230, 579, 578, 1, 2 }, -{ 231, 232, 580, 1, 4 }, -{ 231, 580, 579, 1, 2 }, -{ 232, 233, 581, 1, 4 }, -{ 232, 581, 580, 1, 2 }, -{ 233, 234, 582, 1, 4 }, -{ 233, 582, 581, 1, 2 }, -{ 234, 235, 583, 1, 4 }, -{ 234, 583, 582, 1, 2 }, -{ 235, 236, 584, 1, 4 }, -{ 235, 584, 583, 1, 2 }, -{ 236, 237, 585, 1, 4 }, -{ 236, 585, 584, 1, 2 }, -{ 237, 238, 586, 1, 4 }, -{ 237, 586, 585, 1, 2 }, -{ 238, 239, 587, 1, 4 }, -{ 238, 587, 586, 1, 2 }, -{ 239, 240, 588, 1, 4 }, -{ 239, 588, 587, 1, 2 }, -{ 240, 241, 589, 1, 4 }, -{ 240, 589, 588, 1, 2 }, -{ 241, 224, 572, 1, 4 }, -{ 241, 572, 589, 1, 2 }, -{ 242, 243, 591, 1, 4 }, -{ 242, 591, 590, 1, 2 }, -{ 243, 244, 592, 1, 4 }, -{ 243, 592, 591, 1, 2 }, -{ 244, 245, 593, 1, 4 }, -{ 244, 593, 592, 1, 2 }, -{ 245, 246, 594, 1, 4 }, -{ 245, 594, 593, 1, 2 }, -{ 246, 247, 595, 1, 4 }, -{ 246, 595, 594, 1, 2 }, -{ 247, 248, 596, 1, 4 }, -{ 247, 596, 595, 1, 2 }, -{ 248, 249, 597, 1, 4 }, -{ 248, 597, 596, 1, 2 }, -{ 249, 250, 598, 1, 4 }, -{ 249, 598, 597, 1, 2 }, -{ 250, 251, 599, 1, 4 }, -{ 250, 599, 598, 1, 2 }, -{ 251, 252, 600, 1, 4 }, -{ 251, 600, 599, 1, 2 }, -{ 252, 253, 601, 1, 4 }, -{ 252, 601, 600, 1, 2 }, -{ 253, 254, 602, 1, 4 }, -{ 253, 602, 601, 1, 2 }, -{ 254, 255, 603, 1, 4 }, -{ 254, 603, 602, 1, 2 }, -{ 255, 256, 604, 1, 4 }, -{ 255, 604, 603, 1, 2 }, -{ 256, 257, 605, 1, 4 }, -{ 256, 605, 604, 1, 2 }, -{ 257, 258, 606, 1, 4 }, -{ 257, 606, 605, 1, 2 }, -{ 258, 259, 607, 1, 4 }, -{ 258, 607, 606, 1, 2 }, -{ 259, 260, 608, 1, 4 }, -{ 259, 608, 607, 1, 2 }, -{ 260, 261, 609, 1, 4 }, -{ 260, 609, 608, 1, 2 }, -{ 261, 262, 610, 1, 4 }, -{ 261, 610, 609, 1, 2 }, -{ 262, 263, 611, 1, 4 }, -{ 262, 611, 610, 1, 2 }, -{ 263, 264, 611, 1, 4 }, -{ 264, 612, 611, 1, 2 }, -{ 264, 265, 613, 1, 4 }, -{ 264, 613, 612, 1, 2 }, -{ 265, 266, 614, 1, 4 }, -{ 265, 614, 613, 1, 2 }, -{ 266, 267, 615, 1, 4 }, -{ 266, 615, 614, 1, 2 }, -{ 267, 268, 616, 1, 4 }, -{ 267, 616, 615, 1, 2 }, -{ 268, 269, 617, 1, 4 }, -{ 268, 617, 616, 1, 2 }, -{ 269, 270, 618, 1, 4 }, -{ 269, 618, 617, 1, 2 }, -{ 270, 271, 619, 1, 4 }, -{ 270, 619, 618, 1, 2 }, -{ 271, 272, 620, 1, 4 }, -{ 271, 620, 619, 1, 2 }, -{ 272, 273, 621, 1, 4 }, -{ 272, 621, 620, 1, 2 }, -{ 273, 274, 622, 1, 4 }, -{ 273, 622, 621, 1, 2 }, -{ 274, 275, 623, 1, 4 }, -{ 274, 623, 622, 1, 2 }, -{ 275, 276, 624, 1, 4 }, -{ 275, 624, 623, 1, 2 }, -{ 276, 242, 590, 1, 4 }, -{ 276, 590, 624, 1, 2 }, -{ 277, 278, 626, 1, 4 }, -{ 277, 626, 625, 1, 2 }, -{ 278, 279, 627, 1, 4 }, -{ 278, 627, 626, 1, 2 }, -{ 279, 280, 628, 1, 4 }, -{ 279, 628, 627, 1, 2 }, -{ 280, 281, 629, 1, 4 }, -{ 280, 629, 628, 1, 2 }, -{ 281, 630, 629, 1, 2 }, -{ 281, 282, 631, 1, 4 }, -{ 281, 631, 630, 1, 2 }, -{ 282, 632, 631, 1, 2 }, -{ 282, 283, 633, 1, 4 }, -{ 282, 633, 632, 1, 2 }, -{ 283, 284, 634, 1, 4 }, -{ 283, 634, 633, 1, 2 }, -{ 284, 285, 635, 1, 4 }, -{ 284, 635, 634, 1, 2 }, -{ 285, 286, 636, 1, 4 }, -{ 285, 636, 635, 1, 2 }, -{ 286, 287, 637, 1, 4 }, -{ 286, 637, 636, 1, 2 }, -{ 287, 288, 638, 1, 4 }, -{ 287, 638, 637, 1, 2 }, -{ 288, 277, 625, 1, 4 }, -{ 288, 625, 638, 1, 2 }, -{ 289, 290, 640, 1, 4 }, -{ 289, 640, 639, 1, 2 }, -{ 290, 291, 641, 1, 4 }, -{ 290, 641, 640, 1, 2 }, -{ 291, 292, 642, 1, 4 }, -{ 291, 642, 641, 1, 2 }, -{ 292, 293, 643, 1, 4 }, -{ 292, 643, 642, 1, 2 }, -{ 293, 294, 644, 1, 4 }, -{ 293, 644, 643, 1, 2 }, -{ 294, 295, 645, 1, 4 }, -{ 294, 645, 644, 1, 2 }, -{ 295, 296, 646, 1, 4 }, -{ 295, 646, 645, 1, 2 }, -{ 296, 297, 647, 1, 4 }, -{ 296, 647, 646, 1, 2 }, -{ 297, 298, 648, 1, 4 }, -{ 297, 648, 647, 1, 2 }, -{ 298, 299, 649, 1, 4 }, -{ 298, 649, 648, 1, 2 }, -{ 299, 300, 650, 1, 4 }, -{ 299, 650, 649, 1, 2 }, -{ 300, 301, 651, 1, 4 }, -{ 300, 651, 650, 1, 2 }, -{ 301, 302, 652, 1, 4 }, -{ 301, 652, 651, 1, 2 }, -{ 302, 303, 653, 1, 4 }, -{ 302, 653, 652, 1, 2 }, -{ 303, 304, 654, 1, 4 }, -{ 303, 654, 653, 1, 2 }, -{ 304, 305, 655, 1, 4 }, -{ 304, 655, 654, 1, 2 }, -{ 305, 306, 656, 1, 4 }, -{ 305, 656, 655, 1, 2 }, -{ 306, 307, 657, 1, 4 }, -{ 306, 657, 656, 1, 2 }, -{ 307, 308, 658, 1, 4 }, -{ 307, 658, 657, 1, 2 }, -{ 308, 309, 659, 1, 4 }, -{ 308, 659, 658, 1, 2 }, -{ 309, 310, 660, 1, 4 }, -{ 309, 660, 659, 1, 2 }, -{ 310, 289, 639, 1, 4 }, -{ 310, 639, 660, 1, 2 }, -{ 311, 312, 662, 1, 4 }, -{ 311, 662, 661, 1, 2 }, -{ 312, 313, 663, 1, 4 }, -{ 312, 663, 662, 1, 2 }, -{ 313, 314, 664, 1, 4 }, -{ 313, 664, 663, 1, 2 }, -{ 314, 315, 665, 1, 4 }, -{ 314, 665, 664, 1, 2 }, -{ 315, 316, 666, 1, 4 }, -{ 315, 666, 665, 1, 2 }, -{ 316, 317, 667, 1, 4 }, -{ 316, 667, 666, 1, 2 }, -{ 317, 318, 668, 1, 4 }, -{ 317, 668, 667, 1, 2 }, -{ 318, 319, 669, 1, 4 }, -{ 318, 669, 668, 1, 2 }, -{ 319, 320, 670, 1, 4 }, -{ 319, 670, 669, 1, 2 }, -{ 320, 321, 671, 1, 4 }, -{ 320, 671, 670, 1, 2 }, -{ 321, 322, 672, 1, 4 }, -{ 321, 672, 671, 1, 2 }, -{ 322, 323, 673, 1, 4 }, -{ 322, 673, 672, 1, 2 }, -{ 323, 324, 674, 1, 4 }, -{ 323, 674, 673, 1, 2 }, -{ 324, 325, 675, 1, 4 }, -{ 324, 675, 674, 1, 2 }, -{ 325, 326, 676, 1, 4 }, -{ 325, 676, 675, 1, 2 }, -{ 326, 327, 677, 1, 4 }, -{ 326, 677, 676, 1, 2 }, -{ 327, 328, 678, 1, 4 }, -{ 327, 678, 677, 1, 2 }, -{ 328, 329, 679, 1, 4 }, -{ 328, 679, 678, 1, 2 }, -{ 329, 330, 680, 1, 4 }, -{ 329, 680, 679, 1, 2 }, -{ 330, 331, 681, 1, 4 }, -{ 330, 681, 680, 1, 2 }, -{ 331, 332, 681, 1, 4 }, -{ 332, 682, 681, 1, 2 }, -{ 332, 333, 683, 1, 4 }, -{ 332, 683, 682, 1, 2 }, -{ 333, 334, 683, 1, 4 }, -{ 334, 335, 684, 1, 4 }, -{ 334, 684, 683, 1, 2 }, -{ 335, 311, 661, 1, 4 }, -{ 335, 661, 684, 1, 2 }, -{ 336, 337, 686, 1, 4 }, -{ 336, 686, 685, 1, 2 }, -{ 337, 338, 687, 1, 4 }, -{ 337, 687, 686, 1, 2 }, -{ 338, 339, 688, 1, 4 }, -{ 338, 688, 687, 1, 2 }, -{ 339, 336, 685, 1, 4 }, -{ 339, 685, 688, 1, 2 }, -{ 340, 341, 690, 1, 4 }, -{ 340, 690, 689, 1, 2 }, -{ 341, 342, 691, 1, 4 }, -{ 341, 691, 690, 1, 2 }, -{ 342, 343, 692, 1, 4 }, -{ 342, 692, 691, 1, 2 }, -{ 343, 344, 693, 1, 4 }, -{ 343, 693, 692, 1, 2 }, -{ 344, 345, 694, 1, 4 }, -{ 344, 694, 693, 1, 2 }, -{ 345, 346, 695, 1, 4 }, -{ 345, 695, 694, 1, 2 }, -{ 346, 347, 696, 1, 4 }, -{ 346, 696, 695, 1, 2 }, -{ 347, 340, 689, 1, 4 }, -{ 347, 689, 696, 1, 2 }, -{ 706, 698, 697, 1, 2 }, -{ 705, 706, 697, 1, 4 }, -{ 707, 699, 698, 1, 2 }, -{ 706, 707, 698, 1, 4 }, -{ 708, 700, 699, 1, 2 }, -{ 707, 708, 699, 1, 4 }, -{ 709, 701, 700, 1, 2 }, -{ 708, 709, 700, 1, 4 }, -{ 710, 702, 701, 1, 2 }, -{ 709, 710, 701, 1, 4 }, -{ 711, 703, 702, 1, 2 }, -{ 710, 711, 702, 1, 4 }, -{ 712, 704, 703, 1, 2 }, -{ 711, 712, 703, 1, 4 }, -{ 705, 697, 704, 1, 2 }, -{ 712, 705, 704, 1, 4 }, -{ 722, 714, 713, 1, 2 }, -{ 721, 722, 713, 1, 4 }, -{ 723, 715, 714, 1, 2 }, -{ 722, 723, 714, 1, 4 }, -{ 724, 716, 715, 1, 2 }, -{ 723, 724, 715, 1, 4 }, -{ 725, 717, 716, 1, 2 }, -{ 724, 725, 716, 1, 4 }, -{ 726, 718, 717, 1, 2 }, -{ 725, 726, 717, 1, 4 }, -{ 727, 719, 718, 1, 2 }, -{ 726, 727, 718, 1, 4 }, -{ 728, 720, 719, 1, 2 }, -{ 727, 728, 719, 1, 4 }, -{ 721, 713, 720, 1, 2 }, -{ 728, 721, 720, 1, 4 }, -{ 729, 730, 750, 1, 4 }, -{ 729, 750, 749, 1, 2 }, -{ 730, 731, 751, 1, 4 }, -{ 730, 751, 750, 1, 2 }, -{ 731, 732, 752, 1, 4 }, -{ 731, 752, 751, 1, 2 }, -{ 732, 733, 753, 1, 4 }, -{ 732, 753, 752, 1, 2 }, -{ 733, 734, 754, 1, 4 }, -{ 733, 754, 753, 1, 2 }, -{ 734, 735, 755, 1, 4 }, -{ 734, 755, 754, 1, 2 }, -{ 735, 736, 756, 1, 4 }, -{ 735, 756, 755, 1, 2 }, -{ 736, 737, 757, 1, 4 }, -{ 736, 757, 756, 1, 2 }, -{ 737, 738, 758, 1, 4 }, -{ 737, 758, 757, 1, 2 }, -{ 738, 739, 759, 1, 4 }, -{ 738, 759, 758, 1, 2 }, -{ 739, 740, 760, 1, 4 }, -{ 739, 760, 759, 1, 2 }, -{ 740, 741, 761, 1, 4 }, -{ 740, 761, 760, 1, 2 }, -{ 741, 742, 762, 1, 4 }, -{ 741, 762, 761, 1, 2 }, -{ 742, 743, 763, 1, 4 }, -{ 742, 763, 762, 1, 2 }, -{ 743, 744, 764, 1, 4 }, -{ 743, 764, 763, 1, 2 }, -{ 744, 745, 765, 1, 4 }, -{ 744, 765, 764, 1, 2 }, -{ 745, 746, 766, 1, 4 }, -{ 745, 766, 765, 1, 2 }, -{ 746, 747, 767, 1, 4 }, -{ 746, 767, 766, 1, 2 }, -{ 747, 748, 768, 1, 4 }, -{ 747, 768, 767, 1, 2 }, -{ 748, 729, 749, 1, 4 }, -{ 748, 749, 768, 1, 2 }, -{ 769, 770, 800, 1, 4 }, -{ 769, 800, 799, 1, 2 }, -{ 770, 771, 801, 1, 4 }, -{ 770, 801, 800, 1, 2 }, -{ 771, 772, 802, 1, 4 }, -{ 771, 802, 801, 1, 2 }, -{ 772, 773, 803, 1, 4 }, -{ 772, 803, 802, 1, 2 }, -{ 773, 774, 804, 1, 4 }, -{ 773, 804, 803, 1, 2 }, -{ 774, 775, 805, 1, 4 }, -{ 774, 805, 804, 1, 2 }, -{ 775, 776, 806, 1, 4 }, -{ 775, 806, 805, 1, 2 }, -{ 776, 777, 807, 1, 4 }, -{ 776, 807, 806, 1, 2 }, -{ 777, 778, 808, 1, 4 }, -{ 777, 808, 807, 1, 2 }, -{ 778, 779, 809, 1, 4 }, -{ 778, 809, 808, 1, 2 }, -{ 779, 780, 810, 1, 4 }, -{ 779, 810, 809, 1, 2 }, -{ 780, 781, 811, 1, 4 }, -{ 780, 811, 810, 1, 2 }, -{ 781, 782, 812, 1, 4 }, -{ 781, 812, 811, 1, 2 }, -{ 782, 783, 813, 1, 4 }, -{ 782, 813, 812, 1, 2 }, -{ 783, 784, 814, 1, 4 }, -{ 783, 814, 813, 1, 2 }, -{ 784, 785, 815, 1, 4 }, -{ 784, 815, 814, 1, 2 }, -{ 785, 786, 816, 1, 4 }, -{ 785, 816, 815, 1, 2 }, -{ 786, 787, 817, 1, 4 }, -{ 786, 817, 816, 1, 2 }, -{ 787, 788, 818, 1, 4 }, -{ 787, 818, 817, 1, 2 }, -{ 788, 789, 819, 1, 4 }, -{ 788, 819, 818, 1, 2 }, -{ 789, 790, 820, 1, 4 }, -{ 789, 820, 819, 1, 2 }, -{ 790, 791, 821, 1, 4 }, -{ 790, 821, 820, 1, 2 }, -{ 791, 769, 799, 1, 4 }, -{ 791, 799, 821, 1, 2 }, -{ 792, 793, 823, 1, 4 }, -{ 792, 823, 822, 1, 2 }, -{ 793, 794, 824, 1, 4 }, -{ 793, 824, 823, 1, 2 }, -{ 794, 795, 825, 1, 4 }, -{ 794, 825, 824, 1, 2 }, -{ 795, 796, 826, 1, 4 }, -{ 795, 826, 825, 1, 2 }, -{ 796, 797, 827, 1, 4 }, -{ 796, 827, 826, 1, 2 }, -{ 797, 798, 828, 1, 4 }, -{ 797, 828, 827, 1, 2 }, -{ 798, 792, 822, 1, 4 }, -{ 798, 822, 828, 1, 2 }, -{ 829, 830, 846, 0, 6 }, -{ 829, 846, 845, 0, 3 }, -{ 831, 832, 848, 0, 6 }, -{ 831, 848, 847, 0, 3 }, -{ 833, 834, 850, 0, 6 }, -{ 833, 850, 849, 0, 3 }, -{ 836, 835, 851, 0, 6 }, -{ 836, 851, 852, 0, 3 }, -{ 837, 838, 854, 1, 6 }, -{ 837, 854, 853, 1, 3 }, -{ 839, 840, 856, 1, 6 }, -{ 839, 856, 855, 1, 3 }, -{ 841, 842, 858, 1, 6 }, -{ 841, 858, 857, 1, 3 }, -{ 843, 844, 860, 1, 6 }, -{ 843, 860, 859, 1, 3 }, -{ 919, 918, 917, 0, 6 }, -{ 881, 880, 879, 0, 6 }, -{ 920, 919, 917, 0, 4 }, -{ 881, 879, 878, 0, 2 }, -{ 882, 881, 878, 0, 4 }, -{ 882, 878, 877, 0, 2 }, -{ 883, 882, 877, 0, 4 }, -{ 883, 877, 876, 0, 2 }, -{ 884, 883, 876, 0, 4 }, -{ 920, 917, 916, 0, 2 }, -{ 921, 920, 916, 0, 4 }, -{ 921, 916, 915, 0, 2 }, -{ 922, 921, 915, 0, 4 }, -{ 922, 915, 914, 0, 2 }, -{ 884, 876, 875, 0, 2 }, -{ 885, 884, 875, 0, 4 }, -{ 923, 922, 914, 0, 4 }, -{ 923, 914, 913, 0, 2 }, -{ 885, 875, 874, 0, 2 }, -{ 886, 885, 874, 0, 4 }, -{ 923, 913, 912, 0, 2 }, -{ 924, 923, 912, 0, 4 }, -{ 924, 912, 911, 0, 2 }, -{ 925, 924, 911, 0, 4 }, -{ 925, 911, 910, 0, 2 }, -{ 926, 925, 910, 0, 4 }, -{ 926, 910, 909, 0, 2 }, -{ 927, 926, 909, 0, 4 }, -{ 927, 909, 908, 0, 2 }, -{ 928, 927, 908, 0, 4 }, -{ 928, 908, 907, 0, 2 }, -{ 929, 928, 907, 0, 4 }, -{ 929, 907, 906, 0, 2 }, -{ 929, 906, 905, 0, 2 }, -{ 930, 929, 905, 0, 4 }, -{ 930, 905, 904, 0, 2 }, -{ 930, 904, 903, 0, 2 }, -{ 931, 930, 903, 0, 4 }, -{ 931, 903, 902, 0, 2 }, -{ 931, 902, 901, 0, 2 }, -{ 932, 931, 901, 0, 4 }, -{ 932, 901, 900, 0, 2 }, -{ 932, 900, 899, 0, 2 }, -{ 933, 932, 899, 0, 4 }, -{ 934, 933, 899, 0, 4 }, -{ 887, 886, 874, 0, 4 }, -{ 887, 874, 873, 0, 2 }, -{ 888, 887, 873, 0, 4 }, -{ 888, 873, 872, 0, 2 }, -{ 889, 888, 872, 0, 4 }, -{ 889, 872, 871, 0, 2 }, -{ 890, 889, 871, 0, 4 }, -{ 890, 871, 870, 0, 2 }, -{ 891, 890, 870, 0, 4 }, -{ 892, 891, 870, 0, 4 }, -{ 892, 870, 869, 0, 2 }, -{ 893, 892, 869, 0, 4 }, -{ 894, 893, 869, 0, 4 }, -{ 894, 869, 868, 0, 2 }, -{ 895, 894, 868, 0, 4 }, -{ 896, 895, 868, 0, 4 }, -{ 896, 868, 867, 0, 2 }, -{ 897, 896, 867, 0, 4 }, -{ 898, 897, 867, 0, 4 }, -{ 898, 867, 866, 0, 2 }, -{ 899, 898, 866, 0, 4 }, -{ 899, 866, 865, 0, 2 }, -{ 934, 899, 865, 0, 0 }, -{ 934, 865, 864, 0, 2 }, -{ 935, 934, 864, 0, 4 }, -{ 935, 864, 863, 0, 2 }, -{ 861, 935, 863, 0, 4 }, -{ 862, 861, 863, 0, 5 }, -{ 959, 943, 942, 0, 2 }, -{ 960, 959, 942, 0, 4 }, -{ 960, 942, 941, 0, 2 }, -{ 961, 960, 941, 0, 4 }, -{ 961, 941, 940, 0, 2 }, -{ 962, 961, 940, 0, 4 }, -{ 962, 940, 939, 0, 2 }, -{ 963, 962, 939, 0, 4 }, -{ 963, 939, 938, 0, 2 }, -{ 964, 963, 938, 0, 4 }, -{ 964, 938, 937, 0, 2 }, -{ 965, 964, 937, 0, 4 }, -{ 937, 936, 951, 0, 4 }, -{ 951, 965, 937, 0, 4 }, -{ 951, 936, 950, 0, 2 }, -{ 952, 951, 950, 0, 4 }, -{ 952, 950, 949, 0, 2 }, -{ 953, 952, 949, 0, 4 }, -{ 944, 943, 959, 0, 4 }, -{ 944, 959, 958, 0, 2 }, -{ 945, 944, 958, 0, 4 }, -{ 945, 958, 957, 0, 2 }, -{ 946, 945, 957, 0, 4 }, -{ 946, 957, 956, 0, 2 }, -{ 947, 946, 956, 0, 4 }, -{ 947, 956, 955, 0, 2 }, -{ 948, 947, 955, 0, 4 }, -{ 948, 955, 954, 0, 2 }, -{ 949, 948, 954, 0, 4 }, -{ 953, 949, 954, 0, 1 }, -{ 984, 983, 982, 1, 6 }, -{ 984, 982, 981, 1, 2 }, -{ 984, 981, 980, 1, 2 }, -{ 985, 984, 980, 1, 4 }, -{ 985, 980, 979, 1, 2 }, -{ 986, 985, 979, 1, 4 }, -{ 987, 986, 979, 1, 4 }, -{ 987, 979, 978, 1, 2 }, -{ 988, 987, 978, 1, 4 }, -{ 988, 978, 977, 1, 2 }, -{ 989, 988, 977, 1, 4 }, -{ 989, 977, 976, 1, 2 }, -{ 990, 989, 976, 1, 4 }, -{ 991, 990, 976, 1, 4 }, -{ 992, 991, 976, 1, 4 }, -{ 992, 976, 975, 1, 2 }, -{ 993, 992, 975, 1, 4 }, -{ 966, 1001, 1000, 1, 6 }, -{ 967, 966, 1000, 1, 4 }, -{ 1000, 999, 998, 1, 6 }, -{ 1000, 998, 997, 1, 2 }, -{ 967, 1000, 997, 1, 0 }, -{ 970, 969, 968, 1, 6 }, -{ 970, 968, 967, 1, 2 }, -{ 970, 967, 997, 1, 0 }, -{ 970, 997, 996, 1, 2 }, -{ 971, 970, 996, 1, 4 }, -{ 972, 971, 996, 1, 4 }, -{ 973, 972, 996, 1, 4 }, -{ 973, 996, 995, 1, 2 }, -{ 974, 973, 995, 1, 4 }, -{ 974, 995, 994, 1, 2 }, -{ 975, 974, 994, 1, 4 }, -{ 993, 975, 994, 1, 1 }, -{ 1003, 1002, 1013, 1, 6 }, -{ 1003, 1013, 1012, 1, 2 }, -{ 1011, 1010, 1009, 1, 6 }, -{ 1012, 1011, 1009, 1, 4 }, -{ 1009, 1008, 1007, 1, 6 }, -{ 1009, 1007, 1006, 1, 2 }, -{ 1005, 1004, 1003, 1, 6 }, -{ 1006, 1005, 1003, 1, 4 }, -{ 1006, 1003, 1012, 1, 0 }, -{ 1006, 1012, 1009, 1, 0 }, -{ 1014, 1021, 1020, 1, 6 }, -{ 1015, 1014, 1020, 1, 4 }, -{ 1020, 1019, 1018, 1, 6 }, -{ 1020, 1018, 1017, 1, 2 }, -{ 1015, 1020, 1017, 1, 0 }, -{ 1016, 1015, 1017, 1, 5 }, -{ 1022, 1031, 1030, 1, 6 }, -{ 1023, 1022, 1030, 1, 4 }, -{ 1024, 1023, 1030, 1, 4 }, -{ 1024, 1030, 1029, 1, 2 }, -{ 1024, 1029, 1028, 1, 2 }, -{ 1025, 1024, 1028, 1, 4 }, -{ 1026, 1025, 1028, 1, 4 }, -{ 1026, 1028, 1027, 1, 3 }, -{ 1032, 1035, 1034, 1, 6 }, -{ 1033, 1032, 1034, 1, 5 }, -{ 1036, 1054, 1053, 1, 6 }, -{ 1037, 1036, 1053, 1, 4 }, -{ 1053, 1052, 1039, 1, 4 }, -{ 1048, 1047, 1046, 1, 6 }, -{ 1048, 1046, 1045, 1, 2 }, -{ 1048, 1045, 1044, 1, 2 }, -{ 1049, 1048, 1044, 1, 4 }, -{ 1049, 1044, 1043, 1, 2 }, -{ 1050, 1049, 1043, 1, 4 }, -{ 1050, 1043, 1042, 1, 2 }, -{ 1050, 1042, 1041, 1, 2 }, -{ 1050, 1041, 1040, 1, 2 }, -{ 1051, 1050, 1040, 1, 4 }, -{ 1051, 1040, 1039, 1, 2 }, -{ 1039, 1038, 1037, 1, 6 }, -{ 1039, 1037, 1053, 1, 0 }, -{ 1051, 1039, 1052, 1, 1 }, -{ 1063, 1062, 1078, 1, 4 }, -{ 1064, 1063, 1078, 1, 4 }, -{ 1064, 1078, 1084, 1, 2 }, -{ 1056, 1055, 1077, 1, 6 }, -{ 1065, 1064, 1084, 1, 4 }, -{ 1065, 1084, 1083, 1, 2 }, -{ 1066, 1065, 1083, 1, 4 }, -{ 1066, 1083, 1082, 1, 2 }, -{ 1067, 1066, 1082, 1, 4 }, -{ 1068, 1067, 1082, 1, 4 }, -{ 1069, 1068, 1082, 1, 4 }, -{ 1069, 1082, 1081, 1, 2 }, -{ 1070, 1069, 1081, 1, 4 }, -{ 1070, 1081, 1080, 1, 2 }, -{ 1071, 1070, 1080, 1, 4 }, -{ 1071, 1080, 1079, 1, 2 }, -{ 1072, 1071, 1079, 1, 4 }, -{ 1073, 1072, 1079, 1, 4 }, -{ 1073, 1079, 1078, 1, 2 }, -{ 1073, 1078, 1062, 1, 0 }, -{ 1073, 1062, 1061, 1, 2 }, -{ 1073, 1061, 1060, 1, 2 }, -{ 1074, 1073, 1060, 1, 4 }, -{ 1074, 1060, 1059, 1, 2 }, -{ 1075, 1074, 1059, 1, 4 }, -{ 1075, 1059, 1058, 1, 2 }, -{ 1076, 1075, 1058, 1, 4 }, -{ 1076, 1058, 1057, 1, 2 }, -{ 1076, 1057, 1056, 1, 2 }, -{ 1077, 1076, 1056, 1, 4 }, -{ 1085, 1102, 1101, 1, 6 }, -{ 1086, 1085, 1101, 1, 4 }, -{ 1086, 1101, 1100, 1, 2 }, -{ 1100, 1099, 1088, 1, 4 }, -{ 1088, 1087, 1086, 1, 6 }, -{ 1088, 1086, 1100, 1, 0 }, -{ 1088, 1099, 1098, 1, 2 }, -{ 1089, 1088, 1098, 1, 4 }, -{ 1089, 1098, 1097, 1, 2 }, -{ 1090, 1089, 1097, 1, 4 }, -{ 1096, 1095, 1094, 1, 6 }, -{ 1090, 1097, 1096, 1, 2 }, -{ 1091, 1090, 1096, 1, 4 }, -{ 1096, 1094, 1093, 1, 2 }, -{ 1092, 1091, 1096, 1, 4 }, -{ 1093, 1092, 1096, 1, 4 }, -{ 1133, 1149, 1148, 1, 2 }, -{ 1107, 1106, 1133, 1, 4 }, -{ 1108, 1107, 1133, 1, 4 }, -{ 1109, 1108, 1133, 1, 4 }, -{ 1110, 1109, 1133, 1, 4 }, -{ 1148, 1110, 1133, 1, 0 }, -{ 1104, 1103, 1137, 1, 6 }, -{ 1104, 1137, 1136, 1, 2 }, -{ 1126, 1125, 1124, 1, 6 }, -{ 1127, 1126, 1124, 1, 4 }, -{ 1127, 1124, 1123, 1, 2 }, -{ 1128, 1127, 1123, 1, 4 }, -{ 1128, 1123, 1122, 1, 2 }, -{ 1129, 1128, 1122, 1, 4 }, -{ 1130, 1129, 1122, 1, 4 }, -{ 1130, 1122, 1121, 1, 2 }, -{ 1131, 1130, 1121, 1, 4 }, -{ 1132, 1131, 1121, 1, 4 }, -{ 1132, 1121, 1120, 1, 2 }, -{ 1132, 1120, 1119, 1, 2 }, -{ 1132, 1119, 1139, 1, 0 }, -{ 1104, 1136, 1135, 1, 2 }, -{ 1110, 1148, 1147, 1, 2 }, -{ 1111, 1110, 1147, 1, 4 }, -{ 1111, 1147, 1146, 1, 2 }, -{ 1105, 1104, 1135, 1, 4 }, -{ 1112, 1111, 1146, 1, 4 }, -{ 1112, 1146, 1145, 1, 2 }, -{ 1113, 1112, 1145, 1, 4 }, -{ 1113, 1145, 1144, 1, 2 }, -{ 1114, 1113, 1144, 1, 4 }, -{ 1115, 1114, 1144, 1, 4 }, -{ 1115, 1144, 1143, 1, 2 }, -{ 1116, 1115, 1143, 1, 4 }, -{ 1117, 1116, 1143, 1, 4 }, -{ 1117, 1143, 1142, 1, 2 }, -{ 1117, 1142, 1141, 1, 2 }, -{ 1118, 1117, 1141, 1, 4 }, -{ 1118, 1141, 1140, 1, 2 }, -{ 1119, 1118, 1140, 1, 4 }, -{ 1119, 1140, 1139, 1, 2 }, -{ 1132, 1139, 1138, 1, 2 }, -{ 1138, 1133, 1132, 1, 2 }, -{ 1133, 1138, 1149, 1, 2 }, -{ 1134, 1133, 1106, 1, 4 }, -{ 1135, 1134, 1106, 1, 4 }, -{ 1135, 1106, 1105, 1, 2 }, -{ 1163, 1165, 1164, 1, 3 }, -{ 1165, 1163, 1162, 1, 2 }, -{ 1151, 1150, 1171, 1, 6 }, -{ 1165, 1162, 1161, 1, 2 }, -{ 1166, 1165, 1161, 1, 4 }, -{ 1166, 1161, 1160, 1, 2 }, -{ 1167, 1166, 1160, 1, 4 }, -{ 1167, 1160, 1159, 1, 2 }, -{ 1168, 1167, 1159, 1, 4 }, -{ 1168, 1159, 1158, 1, 2 }, -{ 1169, 1168, 1158, 1, 4 }, -{ 1169, 1158, 1157, 1, 2 }, -{ 1170, 1169, 1157, 1, 4 }, -{ 1170, 1157, 1156, 1, 2 }, -{ 1170, 1156, 1155, 1, 2 }, -{ 1170, 1155, 1154, 1, 2 }, -{ 1170, 1154, 1153, 1, 2 }, -{ 1171, 1170, 1153, 1, 4 }, -{ 1171, 1153, 1152, 1, 2 }, -{ 1171, 1152, 1151, 1, 2 }, -{ 1191, 1190, 1189, 1, 6 }, -{ 1191, 1189, 1188, 1, 2 }, -{ 1188, 1187, 1186, 1, 6 }, -{ 1188, 1186, 1185, 1, 2 }, -{ 1184, 1183, 1182, 1, 6 }, -{ 1173, 1172, 1196, 1, 6 }, -{ 1174, 1173, 1196, 1, 4 }, -{ 1175, 1174, 1196, 1, 4 }, -{ 1175, 1196, 1195, 1, 2 }, -{ 1176, 1175, 1195, 1, 4 }, -{ 1176, 1195, 1194, 1, 2 }, -{ 1177, 1176, 1194, 1, 4 }, -{ 1178, 1177, 1194, 1, 4 }, -{ 1179, 1178, 1194, 1, 4 }, -{ 1179, 1194, 1193, 1, 2 }, -{ 1180, 1179, 1193, 1, 4 }, -{ 1181, 1180, 1193, 1, 4 }, -{ 1181, 1193, 1192, 1, 2 }, -{ 1182, 1181, 1192, 1, 4 }, -{ 1182, 1192, 1191, 1, 2 }, -{ 1182, 1191, 1188, 1, 0 }, -{ 1182, 1188, 1185, 1, 0 }, -{ 1182, 1185, 1184, 1, 2 }, -{ 1197, 1200, 1199, 1, 6 }, -{ 1198, 1197, 1199, 1, 5 }, -{ 1203, 1202, 1201, 1, 6 }, -{ 1204, 1203, 1201, 1, 4 }, -{ 1208, 1207, 1206, 1, 6 }, -{ 1208, 1206, 1205, 1, 2 }, -{ 1201, 1208, 1205, 1, 4 }, -{ 1204, 1201, 1205, 1, 1 }, -{ 1265, 1266, 1267, 0, 6 }, -{ 1227, 1228, 1229, 0, 6 }, -{ 1265, 1267, 1268, 0, 2 }, -{ 1226, 1227, 1229, 0, 4 }, -{ 1226, 1229, 1230, 0, 2 }, -{ 1225, 1226, 1230, 0, 4 }, -{ 1225, 1230, 1231, 0, 2 }, -{ 1224, 1225, 1231, 0, 4 }, -{ 1224, 1231, 1232, 0, 2 }, -{ 1264, 1265, 1268, 0, 4 }, -{ 1264, 1268, 1269, 0, 2 }, -{ 1263, 1264, 1269, 0, 4 }, -{ 1263, 1269, 1270, 0, 2 }, -{ 1262, 1263, 1270, 0, 4 }, -{ 1223, 1224, 1232, 0, 4 }, -{ 1223, 1232, 1233, 0, 2 }, -{ 1262, 1270, 1271, 0, 2 }, -{ 1261, 1262, 1271, 0, 4 }, -{ 1222, 1223, 1233, 0, 4 }, -{ 1222, 1233, 1234, 0, 2 }, -{ 1260, 1261, 1271, 0, 4 }, -{ 1260, 1271, 1272, 0, 2 }, -{ 1259, 1260, 1272, 0, 4 }, -{ 1259, 1272, 1273, 0, 2 }, -{ 1258, 1259, 1273, 0, 4 }, -{ 1258, 1273, 1274, 0, 2 }, -{ 1257, 1258, 1274, 0, 4 }, -{ 1257, 1274, 1275, 0, 2 }, -{ 1256, 1257, 1275, 0, 4 }, -{ 1256, 1275, 1276, 0, 2 }, -{ 1255, 1256, 1276, 0, 4 }, -{ 1255, 1276, 1277, 0, 2 }, -{ 1254, 1255, 1277, 0, 4 }, -{ 1253, 1254, 1277, 0, 4 }, -{ 1253, 1277, 1278, 0, 2 }, -{ 1252, 1253, 1278, 0, 4 }, -{ 1251, 1252, 1278, 0, 4 }, -{ 1251, 1278, 1279, 0, 2 }, -{ 1250, 1251, 1279, 0, 4 }, -{ 1249, 1250, 1279, 0, 4 }, -{ 1249, 1279, 1280, 0, 2 }, -{ 1248, 1249, 1280, 0, 4 }, -{ 1247, 1248, 1280, 0, 4 }, -{ 1247, 1280, 1281, 0, 2 }, -{ 1247, 1281, 1282, 0, 2 }, -{ 1222, 1234, 1235, 0, 2 }, -{ 1221, 1222, 1235, 0, 4 }, -{ 1221, 1235, 1236, 0, 2 }, -{ 1220, 1221, 1236, 0, 4 }, -{ 1220, 1236, 1237, 0, 2 }, -{ 1219, 1220, 1237, 0, 4 }, -{ 1219, 1237, 1238, 0, 2 }, -{ 1218, 1219, 1238, 0, 4 }, -{ 1218, 1238, 1239, 0, 2 }, -{ 1218, 1239, 1240, 0, 2 }, -{ 1217, 1218, 1240, 0, 4 }, -{ 1217, 1240, 1241, 0, 2 }, -{ 1217, 1241, 1242, 0, 2 }, -{ 1216, 1217, 1242, 0, 4 }, -{ 1216, 1242, 1243, 0, 2 }, -{ 1216, 1243, 1244, 0, 2 }, -{ 1215, 1216, 1244, 0, 4 }, -{ 1215, 1244, 1245, 0, 2 }, -{ 1215, 1245, 1246, 0, 2 }, -{ 1214, 1215, 1246, 0, 4 }, -{ 1214, 1246, 1247, 0, 2 }, -{ 1213, 1214, 1247, 0, 4 }, -{ 1213, 1247, 1282, 0, 0 }, -{ 1212, 1213, 1282, 0, 4 }, -{ 1212, 1282, 1283, 0, 2 }, -{ 1211, 1212, 1283, 0, 4 }, -{ 1211, 1283, 1209, 0, 2 }, -{ 1211, 1209, 1210, 0, 3 }, -{ 1290, 1291, 1307, 0, 4 }, -{ 1290, 1307, 1308, 0, 2 }, -{ 1289, 1290, 1308, 0, 4 }, -{ 1289, 1308, 1309, 0, 2 }, -{ 1288, 1289, 1309, 0, 4 }, -{ 1288, 1309, 1310, 0, 2 }, -{ 1287, 1288, 1310, 0, 4 }, -{ 1287, 1310, 1311, 0, 2 }, -{ 1286, 1287, 1311, 0, 4 }, -{ 1286, 1311, 1312, 0, 2 }, -{ 1285, 1286, 1312, 0, 4 }, -{ 1285, 1312, 1313, 0, 2 }, -{ 1284, 1285, 1313, 0, 4 }, -{ 1284, 1313, 1299, 0, 2 }, -{ 1298, 1284, 1299, 0, 4 }, -{ 1298, 1299, 1300, 0, 2 }, -{ 1297, 1298, 1300, 0, 4 }, -{ 1297, 1300, 1301, 0, 2 }, -{ 1307, 1291, 1292, 0, 2 }, -{ 1306, 1307, 1292, 0, 4 }, -{ 1306, 1292, 1293, 0, 2 }, -{ 1305, 1306, 1293, 0, 4 }, -{ 1305, 1293, 1294, 0, 2 }, -{ 1304, 1305, 1294, 0, 4 }, -{ 1304, 1294, 1295, 0, 2 }, -{ 1303, 1304, 1295, 0, 4 }, -{ 1303, 1295, 1296, 0, 2 }, -{ 1302, 1303, 1296, 0, 4 }, -{ 1302, 1296, 1297, 0, 2 }, -{ 1302, 1297, 1301, 0, 1 }, -{ 1330, 1331, 1332, 1, 6 }, -{ 1329, 1330, 1332, 1, 4 }, -{ 1328, 1329, 1332, 1, 4 }, -{ 1328, 1332, 1333, 1, 2 }, -{ 1327, 1328, 1333, 1, 4 }, -{ 1327, 1333, 1334, 1, 2 }, -{ 1327, 1334, 1335, 1, 2 }, -{ 1326, 1327, 1335, 1, 4 }, -{ 1326, 1335, 1336, 1, 2 }, -{ 1325, 1326, 1336, 1, 4 }, -{ 1325, 1336, 1337, 1, 2 }, -{ 1324, 1325, 1337, 1, 4 }, -{ 1324, 1337, 1338, 1, 2 }, -{ 1324, 1338, 1339, 1, 2 }, -{ 1324, 1339, 1340, 1, 2 }, -{ 1323, 1324, 1340, 1, 4 }, -{ 1323, 1340, 1341, 1, 2 }, -{ 1348, 1349, 1314, 1, 6 }, -{ 1348, 1314, 1315, 1, 2 }, -{ 1346, 1347, 1348, 1, 6 }, -{ 1345, 1346, 1348, 1, 4 }, -{ 1345, 1348, 1315, 1, 0 }, -{ 1316, 1317, 1318, 1, 6 }, -{ 1315, 1316, 1318, 1, 4 }, -{ 1345, 1315, 1318, 1, 0 }, -{ 1344, 1345, 1318, 1, 4 }, -{ 1344, 1318, 1319, 1, 2 }, -{ 1344, 1319, 1320, 1, 2 }, -{ 1344, 1320, 1321, 1, 2 }, -{ 1343, 1344, 1321, 1, 4 }, -{ 1343, 1321, 1322, 1, 2 }, -{ 1342, 1343, 1322, 1, 4 }, -{ 1342, 1322, 1323, 1, 2 }, -{ 1342, 1323, 1341, 1, 1 }, -{ 1361, 1350, 1351, 1, 6 }, -{ 1360, 1361, 1351, 1, 4 }, -{ 1357, 1358, 1359, 1, 6 }, -{ 1357, 1359, 1360, 1, 2 }, -{ 1355, 1356, 1357, 1, 6 }, -{ 1354, 1355, 1357, 1, 4 }, -{ 1351, 1352, 1353, 1, 6 }, -{ 1351, 1353, 1354, 1, 2 }, -{ 1360, 1351, 1354, 1, 0 }, -{ 1357, 1360, 1354, 1, 0 }, -{ 1368, 1369, 1362, 1, 6 }, -{ 1368, 1362, 1363, 1, 2 }, -{ 1366, 1367, 1368, 1, 6 }, -{ 1365, 1366, 1368, 1, 4 }, -{ 1365, 1368, 1363, 1, 0 }, -{ 1365, 1363, 1364, 1, 3 }, -{ 1378, 1379, 1370, 1, 6 }, -{ 1378, 1370, 1371, 1, 2 }, -{ 1378, 1371, 1372, 1, 2 }, -{ 1377, 1378, 1372, 1, 4 }, -{ 1376, 1377, 1372, 1, 4 }, -{ 1376, 1372, 1373, 1, 2 }, -{ 1376, 1373, 1374, 1, 2 }, -{ 1375, 1376, 1374, 1, 5 }, -{ 1382, 1383, 1380, 1, 6 }, -{ 1382, 1380, 1381, 1, 3 }, -{ 1401, 1402, 1384, 1, 6 }, -{ 1401, 1384, 1385, 1, 2 }, -{ 1400, 1401, 1385, 1, 4 }, -{ 1394, 1395, 1396, 1, 6 }, -{ 1393, 1394, 1396, 1, 4 }, -{ 1392, 1393, 1396, 1, 4 }, -{ 1392, 1396, 1397, 1, 2 }, -{ 1391, 1392, 1397, 1, 4 }, -{ 1391, 1397, 1398, 1, 2 }, -{ 1390, 1391, 1398, 1, 4 }, -{ 1389, 1390, 1398, 1, 4 }, -{ 1388, 1389, 1398, 1, 4 }, -{ 1388, 1398, 1399, 1, 2 }, -{ 1387, 1388, 1399, 1, 4 }, -{ 1385, 1386, 1387, 1, 6 }, -{ 1400, 1385, 1387, 1, 0 }, -{ 1400, 1387, 1399, 1, 1 }, -{ 1426, 1410, 1411, 1, 2 }, -{ 1426, 1411, 1412, 1, 2 }, -{ 1432, 1426, 1412, 1, 4 }, -{ 1425, 1403, 1404, 1, 6 }, -{ 1432, 1412, 1413, 1, 2 }, -{ 1431, 1432, 1413, 1, 4 }, -{ 1431, 1413, 1414, 1, 2 }, -{ 1430, 1431, 1414, 1, 4 }, -{ 1430, 1414, 1415, 1, 2 }, -{ 1430, 1415, 1416, 1, 2 }, -{ 1430, 1416, 1417, 1, 2 }, -{ 1429, 1430, 1417, 1, 4 }, -{ 1429, 1417, 1418, 1, 2 }, -{ 1428, 1429, 1418, 1, 4 }, -{ 1428, 1418, 1419, 1, 2 }, -{ 1427, 1428, 1419, 1, 4 }, -{ 1427, 1419, 1420, 1, 2 }, -{ 1427, 1420, 1421, 1, 2 }, -{ 1426, 1427, 1421, 1, 4 }, -{ 1410, 1426, 1421, 1, 0 }, -{ 1409, 1410, 1421, 1, 4 }, -{ 1408, 1409, 1421, 1, 4 }, -{ 1408, 1421, 1422, 1, 2 }, -{ 1407, 1408, 1422, 1, 4 }, -{ 1407, 1422, 1423, 1, 2 }, -{ 1406, 1407, 1423, 1, 4 }, -{ 1406, 1423, 1424, 1, 2 }, -{ 1405, 1406, 1424, 1, 4 }, -{ 1404, 1405, 1424, 1, 4 }, -{ 1404, 1424, 1425, 1, 2 }, -{ 1449, 1450, 1433, 1, 6 }, -{ 1449, 1433, 1434, 1, 2 }, -{ 1448, 1449, 1434, 1, 4 }, -{ 1447, 1448, 1434, 1, 4 }, -{ 1434, 1435, 1436, 1, 6 }, -{ 1447, 1434, 1436, 1, 0 }, -{ 1446, 1447, 1436, 1, 4 }, -{ 1446, 1436, 1437, 1, 2 }, -{ 1445, 1446, 1437, 1, 4 }, -{ 1445, 1437, 1438, 1, 2 }, -{ 1442, 1443, 1444, 1, 6 }, -{ 1444, 1445, 1438, 1, 4 }, -{ 1444, 1438, 1439, 1, 2 }, -{ 1441, 1442, 1444, 1, 4 }, -{ 1444, 1439, 1440, 1, 2 }, -{ 1444, 1440, 1441, 1, 2 }, -{ 1499, 1486, 1454, 1, 4 }, -{ 1499, 1454, 1455, 1, 2 }, -{ 1499, 1455, 1456, 1, 2 }, -{ 1499, 1456, 1457, 1, 2 }, -{ 1499, 1457, 1458, 1, 2 }, -{ 1498, 1499, 1458, 1, 4 }, -{ 1485, 1451, 1452, 1, 6 }, -{ 1472, 1473, 1474, 1, 6 }, -{ 1484, 1485, 1452, 1, 4 }, -{ 1472, 1474, 1475, 1, 2 }, -{ 1471, 1472, 1475, 1, 4 }, -{ 1471, 1475, 1476, 1, 2 }, -{ 1470, 1471, 1476, 1, 4 }, -{ 1470, 1476, 1477, 1, 2 }, -{ 1470, 1477, 1478, 1, 2 }, -{ 1469, 1470, 1478, 1, 4 }, -{ 1469, 1478, 1479, 1, 2 }, -{ 1469, 1479, 1480, 1, 2 }, -{ 1468, 1469, 1480, 1, 4 }, -{ 1468, 1480, 1481, 1, 2 }, -{ 1467, 1468, 1481, 1, 4 }, -{ 1483, 1484, 1452, 1, 4 }, -{ 1497, 1498, 1458, 1, 4 }, -{ 1497, 1458, 1459, 1, 2 }, -{ 1496, 1497, 1459, 1, 4 }, -{ 1483, 1452, 1453, 1, 2 }, -{ 1496, 1459, 1460, 1, 2 }, -{ 1495, 1496, 1460, 1, 4 }, -{ 1495, 1460, 1461, 1, 2 }, -{ 1494, 1495, 1461, 1, 4 }, -{ 1494, 1461, 1462, 1, 2 }, -{ 1494, 1462, 1463, 1, 2 }, -{ 1493, 1494, 1463, 1, 4 }, -{ 1493, 1463, 1464, 1, 2 }, -{ 1492, 1493, 1464, 1, 4 }, -{ 1492, 1464, 1465, 1, 2 }, -{ 1491, 1492, 1465, 1, 4 }, -{ 1490, 1491, 1465, 1, 4 }, -{ 1489, 1490, 1465, 1, 4 }, -{ 1489, 1465, 1466, 1, 2 }, -{ 1488, 1489, 1466, 1, 4 }, -{ 1488, 1466, 1467, 1, 2 }, -{ 1487, 1488, 1467, 1, 4 }, -{ 1487, 1467, 1481, 1, 0 }, -{ 1486, 1487, 1481, 1, 4 }, -{ 1454, 1486, 1481, 1, 0 }, -{ 1454, 1481, 1482, 1, 2 }, -{ 1454, 1482, 1483, 1, 2 }, -{ 1453, 1454, 1483, 1, 4 }, -{ 1513, 1514, 1515, 1, 6 }, -{ 1512, 1513, 1515, 1, 4 }, -{ 1521, 1500, 1501, 1, 6 }, -{ 1511, 1512, 1515, 1, 4 }, -{ 1511, 1515, 1516, 1, 2 }, -{ 1510, 1511, 1516, 1, 4 }, -{ 1510, 1516, 1517, 1, 2 }, -{ 1509, 1510, 1517, 1, 4 }, -{ 1509, 1517, 1518, 1, 2 }, -{ 1508, 1509, 1518, 1, 4 }, -{ 1508, 1518, 1519, 1, 2 }, -{ 1507, 1508, 1519, 1, 4 }, -{ 1507, 1519, 1520, 1, 2 }, -{ 1506, 1507, 1520, 1, 4 }, -{ 1505, 1506, 1520, 1, 4 }, -{ 1504, 1505, 1520, 1, 4 }, -{ 1503, 1504, 1520, 1, 4 }, -{ 1503, 1520, 1521, 1, 2 }, -{ 1502, 1503, 1521, 1, 4 }, -{ 1501, 1502, 1521, 1, 4 }, -{ 1539, 1540, 1541, 1, 6 }, -{ 1538, 1539, 1541, 1, 4 }, -{ 1536, 1537, 1538, 1, 6 }, -{ 1535, 1536, 1538, 1, 4 }, -{ 1532, 1533, 1534, 1, 6 }, -{ 1545, 1522, 1523, 1, 6 }, -{ 1545, 1523, 1524, 1, 2 }, -{ 1545, 1524, 1525, 1, 2 }, -{ 1544, 1545, 1525, 1, 4 }, -{ 1544, 1525, 1526, 1, 2 }, -{ 1544, 1526, 1527, 1, 2 }, -{ 1544, 1527, 1528, 1, 2 }, -{ 1544, 1528, 1529, 1, 2 }, -{ 1543, 1544, 1529, 1, 4 }, -{ 1543, 1529, 1530, 1, 2 }, -{ 1543, 1530, 1531, 1, 2 }, -{ 1542, 1543, 1531, 1, 4 }, -{ 1542, 1531, 1532, 1, 2 }, -{ 1541, 1542, 1532, 1, 4 }, -{ 1538, 1541, 1532, 1, 0 }, -{ 1535, 1538, 1532, 1, 0 }, -{ 1534, 1535, 1532, 1, 4 }, -{ 1548, 1549, 1546, 1, 6 }, -{ 1548, 1546, 1547, 1, 3 }, -{ 1550, 1551, 1552, 1, 6 }, -{ 1550, 1552, 1553, 1, 2 }, -{ 1555, 1556, 1557, 1, 6 }, -{ 1554, 1555, 1557, 1, 4 }, -{ 1554, 1557, 1550, 1, 2 }, -{ 1554, 1550, 1553, 1, 1 }, -{ 1575, 1558, 1559, 0, 2 }, -{ 1575, 1559, 1560, 0, 2 }, -{ 1575, 1560, 1561, 0, 2 }, -{ 1575, 1561, 1562, 0, 2 }, -{ 1575, 1562, 1563, 0, 2 }, -{ 1575, 1563, 1564, 0, 2 }, -{ 1575, 1564, 1565, 0, 2 }, -{ 1575, 1565, 1558, 0, 2 }, -{ 1574, 1567, 1566, 0, 2 }, -{ 1574, 1568, 1567, 0, 2 }, -{ 1574, 1569, 1568, 0, 2 }, -{ 1574, 1570, 1569, 0, 2 }, -{ 1574, 1571, 1570, 0, 2 }, -{ 1574, 1572, 1571, 0, 2 }, -{ 1574, 1573, 1572, 0, 2 }, -{ 1574, 1566, 1573, 0, 2 }, -{ 1593, 1576, 1577, 0, 2 }, -{ 1593, 1577, 1578, 0, 2 }, -{ 1593, 1578, 1579, 0, 2 }, -{ 1593, 1579, 1580, 0, 2 }, -{ 1593, 1580, 1581, 0, 2 }, -{ 1593, 1581, 1582, 0, 2 }, -{ 1593, 1582, 1583, 0, 2 }, -{ 1593, 1583, 1576, 0, 2 }, -{ 1592, 1585, 1584, 0, 2 }, -{ 1592, 1586, 1585, 0, 2 }, -{ 1592, 1587, 1586, 0, 2 }, -{ 1592, 1588, 1587, 0, 2 }, -{ 1592, 1589, 1588, 0, 2 }, -{ 1592, 1590, 1589, 0, 2 }, -{ 1592, 1591, 1590, 0, 2 }, -{ 1592, 1584, 1591, 0, 2 }, -{ 1610, 1609, 1608, 1, 6 }, -{ 1610, 1608, 1607, 1, 2 }, -{ 1607, 1606, 1605, 1, 6 }, -{ 1607, 1605, 1604, 1, 2 }, -{ 1603, 1602, 1601, 1, 6 }, -{ 1595, 1594, 1613, 1, 6 }, -{ 1596, 1595, 1613, 1, 4 }, -{ 1596, 1613, 1612, 1, 2 }, -{ 1597, 1596, 1612, 1, 4 }, -{ 1598, 1597, 1612, 1, 4 }, -{ 1599, 1598, 1612, 1, 4 }, -{ 1599, 1612, 1611, 1, 2 }, -{ 1600, 1599, 1611, 1, 4 }, -{ 1601, 1600, 1611, 1, 4 }, -{ 1601, 1611, 1610, 1, 2 }, -{ 1601, 1610, 1607, 1, 0 }, -{ 1601, 1607, 1604, 1, 0 }, -{ 1601, 1604, 1603, 1, 2 }, -{ 1628, 1629, 1630, 1, 6 }, -{ 1627, 1628, 1630, 1, 4 }, -{ 1625, 1626, 1627, 1, 6 }, -{ 1624, 1625, 1627, 1, 4 }, -{ 1621, 1622, 1623, 1, 6 }, -{ 1633, 1614, 1615, 1, 6 }, -{ 1633, 1615, 1616, 1, 2 }, -{ 1632, 1633, 1616, 1, 4 }, -{ 1632, 1616, 1617, 1, 2 }, -{ 1632, 1617, 1618, 1, 2 }, -{ 1632, 1618, 1619, 1, 2 }, -{ 1631, 1632, 1619, 1, 4 }, -{ 1631, 1619, 1620, 1, 2 }, -{ 1631, 1620, 1621, 1, 2 }, -{ 1630, 1631, 1621, 1, 4 }, -{ 1627, 1630, 1621, 1, 0 }, -{ 1624, 1627, 1621, 1, 0 }, -{ 1623, 1624, 1621, 1, 4 }, -{ 1642, 1641, 1657, 1, 4 }, -{ 1643, 1642, 1657, 1, 4 }, -{ 1643, 1657, 1663, 1, 2 }, -{ 1635, 1634, 1656, 1, 6 }, -{ 1644, 1643, 1663, 1, 4 }, -{ 1644, 1663, 1662, 1, 2 }, -{ 1645, 1644, 1662, 1, 4 }, -{ 1645, 1662, 1661, 1, 2 }, -{ 1646, 1645, 1661, 1, 4 }, -{ 1647, 1646, 1661, 1, 4 }, -{ 1648, 1647, 1661, 1, 4 }, -{ 1648, 1661, 1660, 1, 2 }, -{ 1649, 1648, 1660, 1, 4 }, -{ 1649, 1660, 1659, 1, 2 }, -{ 1650, 1649, 1659, 1, 4 }, -{ 1650, 1659, 1658, 1, 2 }, -{ 1651, 1650, 1658, 1, 4 }, -{ 1652, 1651, 1658, 1, 4 }, -{ 1652, 1658, 1657, 1, 2 }, -{ 1652, 1657, 1641, 1, 0 }, -{ 1652, 1641, 1640, 1, 2 }, -{ 1652, 1640, 1639, 1, 2 }, -{ 1653, 1652, 1639, 1, 4 }, -{ 1653, 1639, 1638, 1, 2 }, -{ 1654, 1653, 1638, 1, 4 }, -{ 1654, 1638, 1637, 1, 2 }, -{ 1655, 1654, 1637, 1, 4 }, -{ 1655, 1637, 1636, 1, 2 }, -{ 1655, 1636, 1635, 1, 2 }, -{ 1656, 1655, 1635, 1, 4 }, -{ 1687, 1671, 1672, 1, 2 }, -{ 1687, 1672, 1673, 1, 2 }, -{ 1693, 1687, 1673, 1, 4 }, -{ 1686, 1664, 1665, 1, 6 }, -{ 1693, 1673, 1674, 1, 2 }, -{ 1692, 1693, 1674, 1, 4 }, -{ 1692, 1674, 1675, 1, 2 }, -{ 1691, 1692, 1675, 1, 4 }, -{ 1691, 1675, 1676, 1, 2 }, -{ 1691, 1676, 1677, 1, 2 }, -{ 1691, 1677, 1678, 1, 2 }, -{ 1690, 1691, 1678, 1, 4 }, -{ 1690, 1678, 1679, 1, 2 }, -{ 1689, 1690, 1679, 1, 4 }, -{ 1689, 1679, 1680, 1, 2 }, -{ 1688, 1689, 1680, 1, 4 }, -{ 1688, 1680, 1681, 1, 2 }, -{ 1688, 1681, 1682, 1, 2 }, -{ 1687, 1688, 1682, 1, 4 }, -{ 1671, 1687, 1682, 1, 0 }, -{ 1670, 1671, 1682, 1, 4 }, -{ 1669, 1670, 1682, 1, 4 }, -{ 1669, 1682, 1683, 1, 2 }, -{ 1668, 1669, 1683, 1, 4 }, -{ 1668, 1683, 1684, 1, 2 }, -{ 1667, 1668, 1684, 1, 4 }, -{ 1667, 1684, 1685, 1, 2 }, -{ 1666, 1667, 1685, 1, 4 }, -{ 1665, 1666, 1685, 1, 4 }, -{ 1665, 1685, 1686, 1, 2 } -}; - -static Vert vert_2[] = { -{ 171.834137f, -24.549576f, 161.761139f, 0.000000f, -1.000000f, 0.000000f, 167.258984f, 73.910260f }, -{ 385.145508f, -24.549585f, 281.452515f, 0.000000f, -1.000000f, 0.000000f, 214.952915f, 32.905991f }, -{ 336.557922f, -24.549572f, 123.839111f, 0.000000f, -1.000000f, 0.000000f, 204.089298f, 86.901717f }, -{ 526.168030f, -24.549603f, 127.394318f, 0.000000f, -1.000000f, 0.000000f, 246.483912f, 85.683761f }, -{ 387.515625f, -24.549564f, 39.699638f, 0.000000f, -1.000000f, 0.000000f, 215.482850f, 115.726499f }, -{ 540.388733f, -24.549561f, -4.147684f, 0.000000f, -1.000000f, 0.000000f, 249.663506f, 130.747868f }, -{ 398.181213f, -24.549526f, -46.809975f, 0.000000f, -1.000000f, 0.000000f, 217.867557f, 145.363252f }, -{ 559.349792f, -24.549519f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 253.902968f, 179.465822f }, -{ 342.483246f, -24.549520f, -126.209206f, 0.000000f, -1.000000f, 0.000000f, 205.414135f, 172.564107f }, -{ 451.509033f, -24.549507f, -264.861603f, 0.000000f, -1.000000f, 0.000000f, 229.791028f, 220.064120f }, -{ 233.457428f, -24.549515f, -184.277298f, 0.000000f, -1.000000f, 0.000000f, 181.037242f, 192.457275f }, -{ 252.418427f, -24.549503f, -317.004364f, 0.000000f, -1.000000f, 0.000000f, 185.276690f, 237.927362f }, -{ 87.694656f, -24.549515f, -183.092224f, 0.000000f, -1.000000f, 0.000000f, 148.446376f, 192.051290f }, -{ 27.256439f, -24.549471f, -341.890686f, 0.000000f, -1.000000f, 0.000000f, 134.933100f, 246.453003f }, -{ -72.288864f, -24.549515f, -178.351990f, 0.000000f, -1.000000f, 0.000000f, 112.675931f, 190.427367f }, -{ -154.058212f, -24.549473f, -325.299805f, 0.000000f, -1.000000f, 0.000000f, 94.393258f, 240.769243f }, -{ -220.421753f, -24.549486f, -172.426666f, 0.000000f, -1.000000f, 0.000000f, 79.555146f, 188.397447f }, -{ -346.038452f, -24.549469f, -367.962097f, 0.000000f, -1.000000f, 0.000000f, 51.468713f, 255.384635f }, -{ -318.781982f, -24.549488f, -146.355286f, 0.000000f, -1.000000f, 0.000000f, 57.562944f, 179.465822f }, -{ -466.914886f, -24.549479f, -242.345398f, 0.000000f, -1.000000f, 0.000000f, 24.442152f, 212.350443f }, -{ -383.960480f, -24.549492f, -96.582626f, 0.000000f, -1.000000f, 0.000000f, 42.989791f, 162.414540f }, -{ -552.239441f, -24.549492f, -101.322876f, 0.000000f, -1.000000f, 0.000000f, 5.364584f, 164.038467f }, -{ -421.882477f, -24.549498f, -27.848965f, 0.000000f, -1.000000f, 0.000000f, 34.510873f, 138.867531f }, -{ -559.349792f, -24.549505f, 49.180138f, 0.000000f, -1.000000f, 0.000000f, 3.774793f, 112.478631f }, -{ -412.401978f, -24.549538f, 71.696342f, 0.000000f, -1.000000f, 0.000000f, 36.630604f, 104.764969f }, -{ -510.762207f, -24.549515f, 174.796814f, 0.000000f, -1.000000f, 0.000000f, 14.638404f, 69.444450f }, -{ -348.408569f, -24.549543f, 140.429993f, 0.000000f, -1.000000f, 0.000000f, 50.938782f, 81.217951f }, -{ -411.216919f, -24.549555f, 264.861633f, 0.000000f, -1.000000f, 0.000000f, 36.895568f, 38.589741f }, -{ -258.343781f, -24.549547f, 187.832520f, 0.000000f, -1.000000f, 0.000000f, 71.076220f, 64.978641f }, -{ -254.788574f, -24.549561f, 338.335541f, 0.000000f, -1.000000f, 0.000000f, 71.871129f, 13.418798f }, -{ -133.912140f, -24.549547f, 193.757843f, 0.000000f, -1.000000f, 0.000000f, 98.897688f, 62.948714f }, -{ -43.847347f, -24.549593f, 367.962097f, 0.000000f, -1.000000f, 0.000000f, 119.035126f, 3.269238f }, -{ 37.922009f, -24.549547f, 183.092255f, 0.000000f, -1.000000f, 0.000000f, 137.317792f, 66.602568f }, -{ 168.278946f, -24.549589f, 315.819336f, 0.000000f, -1.000000f, 0.000000f, 166.464082f, 21.132490f } -}; - -static Face face_2[] = { -{ 18, 17, 16, 2, 6 }, -{ 8, 7, 6, 2, 6 }, -{ 20, 19, 18, 2, 6 }, -{ 22, 21, 20, 2, 6 }, -{ 4, 3, 2, 2, 6 }, -{ 10, 9, 8, 2, 6 }, -{ 6, 5, 4, 2, 6 }, -{ 26, 25, 24, 2, 6 }, -{ 28, 27, 26, 2, 6 }, -{ 24, 23, 22, 2, 6 }, -{ 30, 29, 28, 2, 6 }, -{ 12, 11, 10, 2, 6 }, -{ 2, 1, 0, 2, 6 }, -{ 0, 33, 32, 2, 6 }, -{ 32, 31, 30, 2, 6 }, -{ 14, 13, 12, 2, 6 }, -{ 16, 15, 14, 2, 6 }, -{ 4, 2, 0, 2, 0 }, -{ 6, 4, 0, 2, 0 }, -{ 8, 6, 0, 2, 0 }, -{ 10, 8, 0, 2, 0 }, -{ 12, 10, 0, 2, 0 }, -{ 12, 0, 32, 2, 0 }, -{ 14, 12, 32, 2, 0 }, -{ 14, 32, 30, 2, 0 }, -{ 16, 14, 30, 2, 0 }, -{ 16, 30, 28, 2, 0 }, -{ 16, 28, 26, 2, 0 }, -{ 18, 16, 26, 2, 0 }, -{ 20, 18, 26, 2, 0 }, -{ 20, 26, 24, 2, 0 }, -{ 20, 24, 22, 2, 0 } -}; - - -static Vert *vert[] = { -vert_0, -vert_1, -vert_2 -}; - -static int num_verts[] = { -68, -1694, -34 -}; - -static Face *face[] = { -face_0, -face_1, -face_2 -}; - -static int num_faces[] = { -100, -1606, -32 -}; - -static int total_num_frames = 75; - -static Matrix mat[75][3] = { -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 22198.351563, 1.000000}, - {1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -32.104950, -4.568500, 21760.089844, 1.000000}, - {1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -36.722248, 9.404100, 22230.794922, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 21601.316406, 1.000000}, - {0.881000, 0.187100, 0.434500, 0.000000, - -0.178600, -0.718900, 0.671800, 0.000000, - -0.438000, 0.669500, 0.600000, 0.000000, - -40.679047, 57.105099, 21262.400391, 1.000000}, - {1.008900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.008900, 0.000000, - 0.000000, 1.008900, 0.000000, 0.000000, - -36.722248, 9.404100, 21633.759766, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 20863.496094, 1.000000}, - {0.759600, 0.187100, 0.622900, 0.000000, - -0.326300, -0.718900, 0.613800, 0.000000, - -0.562600, 0.669500, 0.485100, 0.000000, - -35.966850, 57.105099, 20524.212891, 1.000000}, - {1.017400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.017400, 0.000000, - 0.000000, 1.017400, 0.000000, 0.000000, - -36.722248, 9.404100, 20895.939453, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 20000.533203, 1.000000}, - {0.598200, 0.187100, 0.779200, 0.000000, - -0.457200, -0.718900, 0.523600, 0.000000, - -0.658100, 0.669500, 0.344500, 0.000000, - -31.281849, 57.105099, 19661.962891, 1.000000}, - {1.025100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.025100, 0.000000, - 0.000000, 1.025100, 0.000000, 0.000000, - -36.722248, 9.404100, 20032.976563, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 19028.070313, 1.000000}, - {0.406500, 0.187100, 0.894300, 0.000000, - -0.563800, -0.718900, 0.406600, 0.000000, - -0.719000, 0.669500, 0.186800, 0.000000, - -26.903849, 57.105099, 18691.248047, 1.000000}, - {1.031600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031600, 0.000000, - 0.000000, 1.031600, 0.000000, 0.000000, - -36.722248, 9.404100, 19060.513672, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 17961.750000, 1.000000}, - {0.196700, 0.187100, 0.962400, 0.000000, - -0.640300, -0.718900, 0.270600, 0.000000, - -0.742500, 0.669500, 0.021700, 0.000000, - -23.081848, 57.105099, 17627.578125, 1.000000}, - {1.036500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.036500, 0.000000, - 0.000000, 1.036500, 0.000000, 0.000000, - -36.722248, 9.404100, 17994.193359, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 16817.216797, 1.000000}, - {-0.018200, 0.187100, 0.982200, 0.000000, - -0.683900, -0.718900, 0.124300, 0.000000, - -0.729300, 0.669500, -0.141000, 0.000000, - -20.007050, 57.105099, 16486.400391, 1.000000}, - {1.039500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.039500, 0.000000, - 0.000000, 1.039500, 0.000000, 0.000000, - -36.722248, 9.404100, 16849.660156, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 15610.111328, 1.000000}, - {-0.225800, 0.187100, 0.956000, 0.000000, - -0.694700, -0.718900, -0.023400, 0.000000, - -0.682900, 0.669500, -0.292300, 0.000000, - -17.795149, 57.105099, 15283.111328, 1.000000}, - {1.040000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.040000, 0.000000, - 0.000000, 1.040000, 0.000000, 0.000000, - -36.722248, 9.404100, 15642.555664, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 14356.078125, 1.000000}, - {-0.414200, 0.187100, 0.890800, 0.000000, - -0.675700, -0.718900, -0.163200, 0.000000, - -0.609900, 0.669500, -0.424100, 0.000000, - -16.485548, 57.105099, 14033.073242, 1.000000}, - {1.037200, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037200, 0.000000, - 0.000000, 1.037200, 0.000000, 0.000000, - -36.722248, 9.404100, 14388.522461, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 13070.758789, 1.000000}, - {-0.577800, 0.187100, 0.794500, 0.000000, - -0.631700, -0.718900, -0.290100, 0.000000, - -0.516900, 0.669500, -0.533500, 0.000000, - -16.012848, 57.105099, 12751.730469, 1.000000}, - {1.031000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031000, 0.000000, - 0.000000, 1.031000, 0.000000, 0.000000, - -36.722248, 9.404100, 13103.203125, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 11769.795898, 1.000000}, - {-0.715900, 0.187100, 0.672600, 0.000000, - -0.566400, -0.718900, -0.402900, 0.000000, - -0.408200, 0.669500, -0.620600, 0.000000, - -16.293648, 57.105099, 11454.640625, 1.000000}, - {1.022700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.022700, 0.000000, - 0.000000, 1.022700, 0.000000, 0.000000, - -36.722248, 9.404100, 11802.240234, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 10468.833984, 1.000000}, - {-0.827900, 0.187100, 0.528800, 0.000000, - -0.482200, -0.718900, -0.500600, 0.000000, - -0.286500, 0.669500, -0.685400, 0.000000, - -17.278248, 57.105099, 10157.392578, 1.000000}, - {1.013400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.013400, 0.000000, - 0.000000, 1.013400, 0.000000, 0.000000, - -36.722248, 9.404100, 10501.278320, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 9183.513672, 1.000000}, - {-0.912000, 0.187100, 0.365100, 0.000000, - -0.380400, -0.718900, -0.581800, 0.000000, - -0.153600, 0.669500, -0.726800, 0.000000, - -18.951847, 57.105099, 8875.574219, 1.000000}, - {1.004100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004100, 0.000000, - 0.000000, 1.004100, 0.000000, 0.000000, - -36.722248, 9.404100, 9215.958008, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 7929.480957, 1.000000}, - {-0.965100, 0.187100, 0.183100, 0.000000, - -0.261500, -0.718900, -0.644000, 0.000000, - -0.011100, 0.669500, -0.742800, 0.000000, - -21.328348, 57.105099, 7624.758301, 1.000000}, - {0.996000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.996000, 0.000000, - 0.000000, 0.996000, 0.000000, 0.000000, - -36.722248, 9.404100, 7961.925293, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 6722.375488, 1.000000}, - {-0.982200, 0.187100, -0.015200, 0.000000, - -0.126300, -0.718900, -0.683500, 0.000000, - 0.138800, 0.669500, -0.729800, 0.000000, - -24.438049, 57.105099, 6420.471191, 1.000000}, - {0.990300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.990300, 0.000000, - 0.000000, 0.990300, 0.000000, 0.000000, - -36.722248, 9.404100, 6754.819824, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 5577.841309, 1.000000}, - {-0.956000, 0.187100, -0.225800, 0.000000, - 0.023400, -0.718900, -0.694700, 0.000000, - 0.292300, 0.669500, -0.682900, 0.000000, - -28.305548, 57.105099, 5278.185547, 1.000000}, - {0.988000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.988000, 0.000000, - 0.000000, 0.988000, 0.000000, 0.000000, - -36.722248, 9.404100, 5610.285645, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 4511.521484, 1.000000}, - {-0.878200, 0.187100, -0.440200, 0.000000, - 0.183000, -0.718900, -0.670600, 0.000000, - 0.441900, 0.669500, -0.597100, 0.000000, - -32.898449, 57.105099, 4213.296387, 1.000000}, - {0.991400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.991400, 0.000000, - 0.000000, 0.991400, 0.000000, 0.000000, - -36.722248, 9.404100, 4543.965332, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 3539.058594, 1.000000}, - {-0.743400, 0.187100, -0.642200, 0.000000, - 0.341900, -0.718900, -0.605200, 0.000000, - 0.574900, 0.669500, -0.470500, 0.000000, - -38.008450, 57.105099, 3241.149658, 1.000000}, - {1.000100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000100, 0.000000, - 0.000000, 1.000100, 0.000000, 0.000000, - -36.722248, 9.404100, 3571.502441, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 2676.096436, 1.000000}, - {-0.553100, 0.187100, -0.811800, 0.000000, - 0.486100, -0.718900, -0.496800, 0.000000, - 0.676600, 0.669500, -0.306700, 0.000000, - -43.285347, 57.105099, 2377.160400, 1.000000}, - {1.011600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.011600, 0.000000, - 0.000000, 1.011600, 0.000000, 0.000000, - -36.722248, 9.404100, 2708.540283, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1938.275757, 1.000000}, - {-0.316400, 0.187100, -0.930000, 0.000000, - 0.601100, -0.718900, -0.349100, 0.000000, - 0.733900, 0.669500, -0.115000, 0.000000, - -48.290947, 57.105099, 1636.875488, 1.000000}, - {1.023400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.023400, 0.000000, - 0.000000, 1.023400, 0.000000, 0.000000, - -36.722248, 9.404100, 1970.719727, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.049500, 0.187100, -0.981100, 0.000000, - 0.673700, -0.718900, -0.171100, 0.000000, - 0.737300, 0.669500, 0.090500, 0.000000, - -52.555748, 57.105099, 1036.013794, 1.000000}, - {1.032800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.032800, 0.000000, - 0.000000, 1.032800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.225800, 0.187100, -0.956000, 0.000000, - 0.694700, -0.718900, 0.023400, 0.000000, - 0.682900, 0.669500, 0.292300, 0.000000, - -55.649448, 57.105099, 1031.074585, 1.000000}, - {1.037400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037400, 0.000000, - 0.000000, 1.037400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.491100, 0.187100, -0.850800, 0.000000, - 0.658600, -0.718900, 0.222200, 0.000000, - 0.570100, 0.669500, 0.476300, 0.000000, - -57.270248, 57.105099, 1025.276733, 1.000000}, - {1.037900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.037900, 0.000000, - 0.000000, 1.037900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.723400, 0.187100, -0.664600, 0.000000, - 0.561800, -0.718900, 0.409300, 0.000000, - 0.401200, 0.669500, 0.625200, 0.000000, - -57.111149, 57.105099, 1019.001221, 1.000000}, - {1.036800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.036800, 0.000000, - 0.000000, 1.036800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.892600, 0.187100, -0.410300, 0.000000, - 0.409000, -0.718900, 0.562000, 0.000000, - 0.189800, 0.669500, 0.718200, 0.000000, - -55.002949, 57.105099, 1012.916504, 1.000000}, - {1.034500, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.034500, 0.000000, - 0.000000, 1.034500, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.975800, 0.187100, -0.113200, 0.000000, - 0.214500, -0.718900, 0.661200, 0.000000, - -0.042300, 0.669500, 0.741600, 0.000000, - -51.079346, 57.105099, 1007.726318, 1.000000}, - {1.031200, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.031200, 0.000000, - 0.000000, 1.031200, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.963000, 0.187100, 0.193800, 0.000000, - -0.000200, -0.718900, 0.695100, 0.000000, - -0.269300, 0.669500, 0.692300, 0.000000, - -45.765148, 57.105099, 1004.021790, 1.000000}, - {1.027000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.027000, 0.000000, - 0.000000, 1.027000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.859000, 0.187100, 0.476600, 0.000000, - -0.210900, -0.718900, 0.662300, 0.000000, - -0.466500, 0.669500, 0.578100, 0.000000, - -39.690350, 57.105099, 1002.157410, 1.000000}, - {1.022400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.022400, 0.000000, - 0.000000, 1.022400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.681700, 0.187100, 0.707300, 0.000000, - -0.395700, -0.718900, 0.571500, 0.000000, - -0.615400, 0.669500, 0.416100, 0.000000, - -33.554749, 57.105099, 1002.187256, 1.000000}, - {1.017400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.017400, 0.000000, - 0.000000, 1.017400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.458000, 0.187100, 0.869100, 0.000000, - -0.539100, -0.718900, 0.438800, 0.000000, - -0.706900, 0.669500, 0.228400, 0.000000, - -27.984049, 57.105099, 1003.876953, 1.000000}, - {1.012300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.012300, 0.000000, - 0.000000, 1.012300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.217300, 0.187100, 0.958000, 0.000000, - -0.634300, -0.718900, 0.284200, 0.000000, - -0.741900, 0.669500, 0.037500, 0.000000, - -23.418049, 57.105099, 1006.781006, 1.000000}, - {1.007400, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.007400, 0.000000, - 0.000000, 1.007400, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.011500, 0.187100, 0.982300, 0.000000, - -0.683000, -0.718900, 0.128900, 0.000000, - -0.730300, 0.669500, -0.136000, 0.000000, - -20.090649, 57.105099, 1010.310059, 1.000000}, - {1.001600, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.001600, 0.000000, - 0.000000, 1.001600, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.214400, 0.187100, 0.958700, 0.000000, - -0.694900, -0.718900, -0.015100, 0.000000, - -0.686400, 0.669500, -0.284100, 0.000000, - -17.896347, 57.105099, 1014.017090, 1.000000}, - {0.994300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.994300, 0.000000, - 0.000000, 0.994300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.391300, 0.187100, 0.901000, 0.000000, - -0.679600, -0.718900, -0.145900, 0.000000, - -0.620500, 0.669500, -0.408500, 0.000000, - -16.604847, 57.105099, 1017.721558, 1.000000}, - {0.986100, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.986100, 0.000000, - 0.000000, 0.986100, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.545300, 0.187100, 0.817100, 0.000000, - -0.642900, -0.718900, -0.264400, 0.000000, - -0.538000, 0.669500, -0.512300, 0.000000, - -16.047749, 57.105099, 1021.376709, 1.000000}, - {0.977700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.977700, 0.000000, - 0.000000, 0.977700, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.679500, 0.187100, 0.709400, 0.000000, - -0.586800, -0.718900, -0.372600, 0.000000, - -0.440300, 0.669500, -0.598300, 0.000000, - -16.141548, 57.105099, 1025.005493, 1.000000}, - {0.969900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.969900, 0.000000, - 0.000000, 0.969900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.795500, 0.187100, 0.576300, 0.000000, - -0.510700, -0.718900, -0.471600, 0.000000, - -0.326100, 0.669500, -0.667400, 0.000000, - -16.893848, 57.105099, 1028.650513, 1.000000}, - {0.963300, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.963300, 0.000000, - 0.000000, 0.963300, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.890900, 0.187100, 0.413900, 0.000000, - -0.411300, -0.718900, -0.560400, 0.000000, - -0.192700, 0.669500, -0.717400, 0.000000, - -18.402348, 57.105099, 1032.325195, 1.000000}, - {0.958800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.958800, 0.000000, - 0.000000, 0.958800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.958000, 0.187100, 0.217300, 0.000000, - -0.284200, -0.718900, -0.634300, 0.000000, - -0.037500, 0.669500, -0.741900, 0.000000, - -20.845448, 57.105099, 1035.962158, 1.000000}, - {0.957000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.957000, 0.000000, - 0.000000, 0.957000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.982300, 0.187100, -0.013000, 0.000000, - -0.127900, -0.718900, -0.683200, 0.000000, - 0.137100, 0.669500, -0.730100, 0.000000, - -24.399748, 57.105099, 1039.308228, 1.000000}, - {0.958800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.958800, 0.000000, - 0.000000, 0.958800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.947100, 0.187100, -0.260700, 0.000000, - 0.048800, -0.718900, -0.693400, 0.000000, - 0.317100, 0.669500, -0.671800, 0.000000, - -29.005148, 57.105099, 1041.880859, 1.000000}, - {0.963900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.963900, 0.000000, - 0.000000, 0.963900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.844400, 0.187100, -0.502000, 0.000000, - 0.230600, -0.718900, -0.655700, 0.000000, - 0.483600, 0.669500, -0.563900, 0.000000, - -34.367550, 57.105099, 1043.237793, 1.000000}, - {0.971800, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.971800, 0.000000, - 0.000000, 0.971800, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.677300, 0.187100, -0.711500, 0.000000, - 0.399200, -0.718900, -0.569000, 0.000000, - 0.618000, 0.669500, -0.412200, 0.000000, - -40.015949, 57.105099, 1043.108643, 1.000000}, - {0.981700, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.981700, 0.000000, - 0.000000, 0.981700, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.460700, 0.187100, -0.867600, 0.000000, - 0.537700, -0.718900, -0.440500, 0.000000, - 0.706200, 0.669500, -0.230600, 0.000000, - -45.402149, 57.105099, 1041.465820, 1.000000}, - {0.993000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.993000, 0.000000, - 0.000000, 0.993000, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {-0.217300, 0.187100, -0.958000, 0.000000, - 0.634300, -0.718900, -0.284200, 0.000000, - 0.741900, 0.669500, -0.037500, 0.000000, - -50.026550, 57.105099, 1038.534790, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.034900, 0.187100, -0.981700, 0.000000, - 0.685900, -0.718900, -0.112600, 0.000000, - 0.726800, 0.669500, 0.153400, 0.000000, - -53.643948, 57.105099, 1034.605103, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.284000, 0.187100, -0.940400, 0.000000, - 0.692000, -0.718900, 0.066000, 0.000000, - 0.663700, 0.669500, 0.333600, 0.000000, - -56.130249, 57.105099, 1029.897339, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.513800, 0.187100, -0.837300, 0.000000, - 0.652400, -0.718900, 0.239800, 0.000000, - 0.557100, 0.669500, 0.491400, 0.000000, - -57.333046, 57.105099, 1024.724487, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.709500, 0.187100, -0.679400, 0.000000, - 0.570200, -0.718900, 0.397500, 0.000000, - 0.414100, 0.669500, 0.616700, 0.000000, - -57.182648, 57.105099, 1019.425110, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.858600, 0.187100, -0.477300, 0.000000, - 0.450800, -0.718900, 0.529100, 0.000000, - 0.244200, 0.669500, 0.701600, 0.000000, - -55.694046, 57.105099, 1014.342407, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.951600, 0.187100, -0.244000, 0.000000, - 0.301900, -0.718900, 0.626100, 0.000000, - 0.058300, 0.669500, 0.740600, 0.000000, - -52.966049, 57.105099, 1009.804321, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.982300, 0.187100, 0.005300, 0.000000, - 0.133200, -0.718900, 0.682200, 0.000000, - -0.131400, 0.669500, 0.731100, 0.000000, - -49.174549, 57.105099, 1006.104492, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -}, -{{1.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.000000, 0.000000, - 0.000000, 1.000000, 0.000000, 0.000000, - -41.462547, 14.736900, 1341.240845, 1.000000}, - {0.948800, 0.187100, 0.254600, 0.000000, - -0.044400, -0.718900, 0.693700, 0.000000, - -0.312800, 0.669500, 0.673800, 0.000000, - -44.562447, 57.105099, 1003.484802, 1.000000}, - {1.004900, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 1.004900, 0.000000, - 0.000000, 1.004900, 0.000000, 0.000000, - -36.722248, 9.404100, 1373.684814, 1.000000} -} -}; -#define RAW_NAME text_3dfinfo_raw -#define IMAGE_NAME text_3dfinfo_image -unsigned char RAW_NAME[] = { -0x40, -0x0, -0x0, -0x0, -0x40, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0xcf, -0x1, -0x27, -0x0, -0x23, -0x0, -0x1, -0x0, -0x0, -0x0, -0xef, -0x1, -0xe2, -0x1, -0xe, -0x0, -0x12, -0x0, -0xf4, -0x1, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x19, -0x0, -0x0, -0x0, -0x1c, -0x0, -0x0, -0x0, -0x1f, -0x0, -0x0, -0x0, -0x21, -0x0, -0x0, -0x0, -0x24, -0x0, -0x0, -0x0, -0x26, -0x0, -0x0, -0x0, -0x28, -0x0, -0x0, -0x0, -0x2a, -0x0, -0x0, -0x0, -0x2c, -0x0, -0x0, -0x0, -0x2e, -0x0, -0x0, -0x0, -0x30, -0x0, -0x0, -0x0, -0x32, -0x0, -0x0, -0x0, -0x34, -0x0, -0x0, -0x0, -0x36, -0x0, -0x0, -0x0, -0x37, -0x0, -0x0, -0x0, -0x39, -0x0, -0x0, -0x0, -0x3b, -0x0, -0x0, -0x0, -0x3c, -0x0, -0x0, -0x0, -0x3e, -0x0, -0x0, -0x0, -0x40, -0x0, -0x0, -0x0, -0x41, -0x0, -0x0, -0x0, -0x43, -0x0, -0x0, -0x0, -0x44, -0x0, -0x0, -0x0, -0x46, -0x0, -0x0, -0x0, -0x47, -0x0, -0x0, -0x0, -0x48, -0x0, -0x0, -0x0, -0x4a, -0x0, -0x0, -0x0, -0x4b, -0x0, -0x0, -0x0, -0x4d, -0x0, -0x0, -0x0, -0x4e, -0x0, -0x0, -0x0, -0x4f, -0x0, -0x0, -0x0, -0x51, -0x0, -0x0, -0x0, -0x52, -0x0, -0x0, -0x0, -0x53, -0x0, -0x0, -0x0, -0x54, -0x0, -0x0, -0x0, -0x56, -0x0, -0x0, -0x0, -0x57, -0x0, -0x0, -0x0, -0x58, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x5b, -0x0, -0x0, -0x0, -0x5c, -0x0, -0x0, -0x0, -0x5d, -0x0, -0x0, -0x0, -0x5e, -0x0, -0x0, -0x0, -0x5f, -0x0, -0x0, -0x0, -0x61, -0x0, -0x0, -0x0, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0x98, -0x0, -0x0, -0x0, -0x99, -0x0, -0x0, -0x0, -0x9a, -0x0, -0x0, -0x0, -0x9b, -0x0, -0x0, -0x0, -0x9c, -0x0, -0x0, -0x0, -0x9c, -0x0, -0x0, -0x0, -0x9d, -0x0, -0x0, -0x0, -0x9e, -0x0, -0x0, -0x0, -0x9f, -0x0, -0x0, -0x0, -0xa0, -0x0, -0x0, -0x0, -0xa0, -0x0, -0x0, -0x0, -0xa1, -0x0, -0x0, -0x0, -0xa2, -0x0, -0x0, -0x0, -0xa3, -0x0, -0x0, -0x0, -0xa4, -0x0, -0x0, -0x0, -0xa4, -0x0, -0x0, -0x0, -0xa5, -0x0, -0x0, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xe2, -0x13, -0xf7, -0xbf, -0x37, -0x1, -0x0, -0x0, -0xac, -0xf7, -0xf9, -0xbf, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x1, -0x0, -0x0, -0x0, -0xcc, -0xfa, -0x76, -0x0, -0x42, -0x52, -0x64, -0x81, -0x18, -0x52, -0x64, -0x81, -0x2, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0x4, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x66, -0xc, -0xfa, -0xbf, -0x18, -0x52, -0x64, -0x81, -0x7a, -0xc, -0xfa, -0xbf, -0x42, -0x52, -0x64, -0x81, -0x80, -0x1, -0x7a, -0x0, -0x4, -0x0, -0x0, -0x0, -0xf8, -0xfa, -0x76, -0x0, -0xef, -0x5b, -0xf7, -0xbf, -0xf8, -0xfa, -0x76, -0x0, -0xe8, -0x5d, -0xf7, -0xbf, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x4, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0xf7, -0xbf, -0x18, -0x52, -0x64, -0x81, -0x0, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x8d, -0xea, -0x40, -0x0, -0x4, -0x0, -0x0, -0x0, -0x80, -0x1, -0x7a, -0x0, -0x1, -0x0, -0x0, -0x0, -0xab, -0xea, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x38, -0x44, -0x41, -0x0, -0x28, -0xba, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0xb3, -0xba, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0xa, -0x31, -0x0, -0x0, -0x1, -0x0, -0x0, -0x0, -0x74, -0x1e, -0xa7, -0x0, -0x58, -0x15, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x9, -0x2e, -0xf, -0xe, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x40, -0x30, -0x30, -0x42, -0x32, -0x32, -0x21, -0x0, -0x22, -0x39, -0x22, -0x39, -0x39, -0x2, -0x2, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x29, -0x3, -0x9, -0xd, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x21, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x41, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x1, -0x8, -0x29, -0x9, -0xc, -0xe, -0xe, -0xf, -0x2e, -0x8, -0x3, -0x8, -0x2d, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x8, -0x3, -0x9, -0xe, -0xf, -0xd, -0xb, -0xa, -0x9, -0x29, -0x2, -0x39, -0x22, -0x0, -0x21, -0x33, -0x21, -0x33, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x32, -0x31, -0x20, -0x33, -0x0, -0x2, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x8, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xd, -0xe, -0xe, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2a, -0x2e, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x0, -0x23, -0x9, -0x2e, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x3, -0x23, -0x1, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x3, -0x2, -0x29, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x41, -0x42, -0x42, -0x31, -0x20, -0x0, -0x2, -0xc, -0xe, -0xe, -0xa, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x29, -0x9, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x1, -0x0, -0x20, -0x32, -0x41, -0x42, -0x30, -0x42, -0x31, -0x20, -0x22, -0x2, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x29, -0x2, -0x2, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x20, -0x20, -0x33, -0x21, -0x22, -0x2, -0x29, -0x2e, -0xe, -0xe, -0xa, -0x29, -0x3, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x3, -0x29, -0x29, -0x2d, -0x2e, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x20, -0x20, -0x33, -0x0, -0x22, -0x23, -0x2, -0x29, -0x29, -0x8, -0x9, -0x2a, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x23, -0x1, -0x2, -0x2, -0x3, -0x8, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x9, -0x3, -0x1, -0x0, -0x33, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0xc, -0xc, -0x2e, -0xe, -0xe, -0xe, -0x9, -0x29, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x3, -0x23, -0x0, -0x0, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x22, -0x1, -0x23, -0x1, -0x23, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x2, -0x2, -0x3, -0x9, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0xc, -0x8, -0x3, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x9, -0x2a, -0x8, -0x9, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x1, -0x22, -0x21, -0x20, -0x32, -0x31, -0x32, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x33, -0x21, -0x21, -0x33, -0x21, -0x0, -0x33, -0x0, -0x0, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xd, -0x9, -0x3, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xc, -0x9, -0x3, -0x8, -0x2e, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x42, -0x31, -0x20, -0x20, -0x33, -0x21, -0x0, -0x0, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x21, -0x20, -0x33, -0x20, -0x33, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x3, -0x29, -0x9, -0x9, -0xa, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x1, -0x22, -0x21, -0x32, -0x31, -0x42, -0x42, -0x30, -0x30, -0x42, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x2, -0x29, -0x3, -0x8, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x31, -0x42, -0x42, -0x30, -0x42, -0x42, -0x31, -0x20, -0x22, -0x1, -0x3, -0x8, -0xc, -0xb, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x29, -0x8, -0x8, -0x29, -0x2, -0x8, -0xc, -0xe, -0xf, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x31, -0x42, -0x30, -0x30, -0x30, -0x42, -0x31, -0x20, -0x0, -0x22, -0x2, -0x8, -0x29, -0x9, -0x9, -0x9, -0x8, -0x3, -0x1, -0x22, -0x33, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x1, -0x2, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x29, -0x8, -0x3, -0x2, -0x9, -0xc, -0xe, -0xf, -0xd, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x33, -0x20, -0x20, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x29, -0x2a, -0x9, -0x9, -0xa, -0x9, -0x9, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x33, -0x0, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xb, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x8, -0x3, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xe, -0xc, -0x2b, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0x9, -0x9, -0x8, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x39, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x3, -0x2, -0x29, -0x29, -0x8, -0x2, -0x29, -0x9, -0x2e, -0xf, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x8, -0x29, -0x3, -0x3, -0x2, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x8, -0x29, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x39, -0x1, -0x22, -0x23, -0x39, -0x23, -0x3, -0x29, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x3, -0x29, -0x8, -0x9, -0x8, -0x2a, -0x29, -0x3, -0x8, -0x9, -0x2e, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x2, -0x1, -0x23, -0x1, -0x39, -0x1, -0x22, -0x22, -0x39, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x39, -0x23, -0x29, -0x9, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x8, -0x2, -0x8, -0xa, -0xe, -0xf, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x2, -0x2, -0x1, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x31, -0x43, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x33, -0x39, -0x2, -0x9, -0xc, -0x2e, -0xe, -0xf, -0x2e, -0x9, -0x8, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x3, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x21, -0x33, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x31, -0x43, -0x31, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x2, -0x2, -0x29, -0x3, -0x3, -0x3, -0x2, -0x29, -0x2, -0x29, -0x2, -0x8, -0x2, -0x2, -0x2, -0x29, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xb, -0x2d, -0x2a, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x2, -0x2, -0x8, -0x2, -0x29, -0x29, -0x9, -0x9, -0xe, -0xe, -0xf, -0x2e, -0x9, -0x29, -0x2, -0x3, -0x2, -0x8, -0x2, -0x2, -0x2, -0x3, -0x29, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x3, -0x2, -0x3, -0x8, -0xc, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x8, -0x8, -0x2, -0x1, -0x22, -0x39, -0x39, -0x1, -0x23, -0x1, -0x23, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0x2e, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0x2b, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x29, -0x2, -0x2, -0x3, -0x2, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0xa, -0x2d, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0x2e, -0x9, -0x8, -0x29, -0x29, -0x8, -0x9, -0xa, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x29, -0x2a, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0xd, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0x9, -0x29, -0x29, -0x3, -0x3, -0x29, -0x29, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xa, -0xa, -0x2d, -0xa, -0xd, -0x8, -0x9, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x2b, -0x9, -0x29, -0x29, -0x2a, -0x29, -0x9, -0x9, -0xa, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x23, -0x1, -0x22, -0x1, -0x22, -0x1, -0x22, -0x1, -0x39, -0x1, -0x23, -0x1, -0x23, -0x1, -0x39, -0x1, -0x23, -0x29, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x2, -0x29, -0x29, -0x2a, -0x29, -0x8, -0x29, -0x2, -0x3, -0x8, -0x9, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x3, -0x2, -0x39, -0x22, -0x0, -0x22, -0x0, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x39, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x42, -0x31, -0x31, -0x32, -0x0, -0x22, -0x1, -0x2, -0x8, -0x8, -0x9, -0xa, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x8, -0x8, -0x29, -0x29, -0x8, -0x2a, -0x9, -0xc, -0xb, -0xd, -0xf, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x32, -0x20, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xe, -0x2e, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x31, -0x32, -0x20, -0x33, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xe, -0xf, -0xf, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x29, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x33, -0x21, -0x22, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0xd, -0xe, -0x2e, -0x2e, -0xd, -0x2e, -0xd, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x8, -0x3, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x20, -0x32, -0x32, -0x20, -0x33, -0x0, -0x1, -0x3, -0x29, -0x9, -0xa, -0xc, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xf, -0xf, -0xe, -0xe, -0xe, -0xf, -0xe, -0xf, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x23, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x21, -0x22, -0x1, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0xc, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x29, -0x8, -0x29, -0x8, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x8, -0x2, -0x2, -0x1, -0x22, -0x39, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x2, -0x1, -0x23, -0x1, -0x1, -0x23, -0x2, -0x2, -0x2, -0x29, -0x29, -0x8, -0x8, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x2d, -0xa, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x9, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x23, -0x0, -0x0, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x20, -0x33, -0x20, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x29, -0x9, -0x9, -0x2e, -0x2e, -0xd, -0xe, -0x2e, -0x2e, -0xb, -0xc, -0x9, -0x9, -0x29, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x2a, -0x29, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x33, -0x0, -0x22, -0x23, -0x2, -0x8, -0x9, -0x9, -0xc, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x2a, -0x29, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x3, -0x1, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x33, -0x20, -0x33, -0x20, -0x20, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x20, -0x33, -0x21, -0x33, -0x0, -0x22, -0x22, -0x39, -0x23, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0x2b, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x2, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x21, -0x21, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x21, -0x0, -0x1, -0x2, -0x8, -0xc, -0x2e, -0xd, -0xe, -0xf, -0xf, -0xf, -0xf, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x2b, -0x9, -0x2a, -0x29, -0x8, -0x8, -0x8, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x1, -0x22, -0x22, -0x22, -0x0, -0x33, -0x21, -0x32, -0x32, -0x20, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x9, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x9, -0x9, -0x29, -0x9, -0x29, -0x8, -0x29, -0x8, -0x2, -0x2, -0x2, -0x39, -0x22, -0x21, -0x33, -0x32, -0x32, -0x31, -0x31, -0x32, -0x31, -0x20, -0x33, -0x0, -0x22, -0x1, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x29, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0x9, -0x8, -0x8, -0x29, -0x3, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x33, -0x32, -0x31, -0x32, -0x42, -0x42, -0x31, -0x31, -0x32, -0x33, -0x0, -0x39, -0x2, -0x3, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0x2b, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x8, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x2a, -0x8, -0x8, -0x9, -0x0, -0x0, -0x33, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x42, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x39, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0x2e, -0xc, -0xa, -0xc, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x21, -0x33, -0x0, -0x33, -0x1, -0x30, -0x30, -0x30, -0x30, -0x40, -0x30, -0x40, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x63, -0x40, -0x40, -0x40, -0x30, -0x42, -0x20, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xb, -0x2e, -0x2e, -0xb, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0x9, -0x29, -0x2, -0x22, -0x33, -0x20, -0x31, -0x42, -0x31, -0x42, -0x42, -0x42, -0x41, -0x31, -0x32, -0x31, -0x42, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x30, -0x30, -0x30, -0x32, -0x20, -0x0, -0x23, -0x29, -0x8, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0x9, -0x9, -0xa, -0x9, -0xc, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x8, -0x29, -0x23, -0x22, -0x21, -0x33, -0x33, -0x20, -0x33, -0x0, -0x33, -0x21, -0x32, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x32, -0x32, -0x31, -0x31, -0x42, -0x31, -0x32, -0x32, -0x20, -0x21, -0x0, -0x22, -0x2, -0x2, -0x29, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0x2e, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x8, -0x9, -0x8, -0x29, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x9, -0x2a, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x2a, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xa, -0xc, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xa, -0xc, -0xc, -0xc, -0xa, -0xc, -0xa, -0x9, -0x3, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x39, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xa, -0x2d, -0xa, -0x9, -0xa, -0x9, -0xa, -0xa, -0x9, -0xa, -0xc, -0x9, -0x9, -0x9, -0x9, -0x9, -0x29, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x29, -0x3, -0x29, -0x8, -0x29, -0x8, -0x22, -0x0, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x33, -0x0, -0x33, -0x33, -0x21, -0x20, -0x33, -0x0, -0x0, -0x22, -0x2, -0x2, -0x29, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x33, -0x0, -0x0, -0x0, -0x22, -0x33, -0x21, -0x33, -0x0, -0x33, -0x0, -0x33, -0x0, -0x21, -0x33, -0x21, -0x33, -0x0, -0x0, -0x33, -0x21, -0x0, -0x0, -0x22, -0x2, -0x3, -0x29, -0x9, -0xc, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0x2e, -0xd, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x39, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x31, -0x32, -0x31, -0x32, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x1, -0x23, -0x2, -0x29, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x20, -0x32, -0x32, -0x31, -0x42, -0x31, -0x42, -0x42, -0x31, -0x42, -0x32, -0x30, -0x42, -0x41, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x0, -0x22, -0x23, -0x2, -0x2, -0x2, -0x8, -0x8, -0x29, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x9, -0x29, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x21, -0x32, -0x32, -0x42, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x20, -0x21, -0x22, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x9, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x2a, -0x29, -0x9, -0x8, -0x8, -0x8, -0x8, -0x8, -0x29, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x23, -0x22, -0x21, -0x20, -0x32, -0x42, -0x41, -0x30, -0x30, -0x30, -0x30, -0x30, -0x30, -0x42, -0x42, -0x31, -0x42, -0x31, -0x32, -0x31, -0x33, -0x21, -0x22, -0x2, -0x2, -0x8, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x29, -0x29, -0x29, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x3, -0x2, -0x2, -0x2, -0x39, -0x22, -0x0, -0x33, -0x32, -0x32, -0x31, -0x42, -0x42, -0x31, -0x42, -0x31, -0x42, -0x42, -0x32, -0x31, -0x32, -0x31, -0x20, -0x20, -0x0, -0x22, -0x2, -0x2, -0x8, -0xc, -0xa, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x2, -0x2, -0x39, -0x22, -0x0, -0x22, -0x39, -0x23, -0x2, -0x29, -0x2a, -0x9, -0xc, -0xc, -0xb, -0x2e, -0xc, -0xc, -0xa, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x33, -0x20, -0x20, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x32, -0x31, -0x33, -0x21, -0x33, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0xd, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x1, -0x22, -0x39, -0x39, -0x39, -0x2, -0x2, -0x3, -0x29, -0x8, -0x9, -0x2a, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x8, -0x8, -0x2a, -0x8, -0x8, -0x8, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x0, -0x0, -0x33, -0x33, -0x20, -0x33, -0x21, -0x33, -0x33, -0x20, -0x23, -0x2, -0x2, -0x3, -0x29, -0x29, -0x9, -0x9, -0xa, -0x2d, -0xa, -0xc, -0xc, -0xc, -0x2e, -0xc, -0xc, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x8, -0x3, -0x2, -0x2, -0x23, -0x1, -0x22, -0x39, -0x39, -0x39, -0x1, -0x22, -0x39, -0x39, -0x1, -0x2, -0x2, -0x29, -0x8, -0x9, -0x9, -0xa, -0x2d, -0xa, -0x2d, -0x9, -0x9, -0x8, -0x29, -0x3, -0x2, -0x23, -0x1, -0x22, -0x22, -0x39, -0x1, -0x22, -0x1, -0x22, -0x3b, -0x3, -0x8, -0x29, -0x9, -0x9, -0xc, -0xc, -0xb, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0xa, -0x9, -0x9, -0x29, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x0, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0x9, -0xa, -0xc, -0xc, -0xa, -0xa, -0x9, -0x9, -0x8, -0x3, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x39, -0x39, -0x2, -0x1, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0x2e, -0x2e, -0x2d, -0x9, -0x9, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x3, -0x3, -0x3, -0x8, -0x8, -0x2a, -0x2a, -0x9, -0x2a, -0x9, -0x8, -0x8, -0x29, -0x2, -0x2, -0x22, -0x0, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x22, -0x1, -0x2, -0x29, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xd, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x8, -0x29, -0x29, -0x29, -0x3, -0x3, -0x2, -0x2, -0x3, -0x2, -0x23, -0x39, -0x0, -0x33, -0x32, -0x31, -0x42, -0x42, -0x42, -0x41, -0x42, -0x31, -0x32, -0x33, -0x1, -0x2, -0x8, -0x9, -0xc, -0xb, -0xd, -0xe, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xc, -0xa, -0x9, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x29, -0x2a, -0x29, -0x8, -0x8, -0x9, -0x29, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x1, -0x1, -0x23, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x30, -0x42, -0x31, -0x32, -0x20, -0x33, -0x8, -0x9, -0x2e, -0xe, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x9, -0x9, -0xc, -0x25, -0x4, -0x4, -0x2b, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xe, -0x2e, -0xc, -0x9, -0x29, -0x3, -0x2, -0x2, -0x23, -0x1, -0x1, -0x23, -0x1, -0x1, -0x23, -0x1, -0x23, -0x1, -0x22, -0x22, -0x22, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x21, -0x20, -0x20, -0x32, -0x32, -0x32, -0x31, -0x32, -0x31, -0x32, -0x32, -0x21, -0x0, -0x39, -0x9, -0x2e, -0xe, -0xf, -0xc, -0x9, -0x8, -0x2, -0x2, -0x2, -0x3, -0x2, -0x29, -0x8, -0x9, -0x9, -0x9, -0xc, -0x2e, -0xe, -0xf, -0xe, -0xb, -0xc, -0x9, -0x3, -0x2, -0x39, -0x22, -0x0, -0x0, -0x33, -0x0, -0x0, -0x0, -0x22, -0x0, -0x22, -0x0, -0x0, -0x0, -0x33, -0x21, -0x32, -0x20, -0x32, -0x32, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x32, -0x32, -0x20, -0x20, -0x33, -0x0, -0x1, -0x3, -0xc, -0x2e, -0xe, -0xe, -0xa, -0x8, -0x2, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x29, -0x3, -0x29, -0x8, -0xa, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x2, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x22, -0x39, -0x22, -0x39, -0x39, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x42, -0x42, -0x42, -0x42, -0x42, -0x31, -0x32, -0x31, -0x20, -0x20, -0x20, -0x33, -0x0, -0x33, -0x0, -0x0, -0x39, -0x2, -0x8, -0xc, -0xe, -0xe, -0xe, -0xa, -0x29, -0x2, -0x8, -0x9, -0x9, -0x9, -0xa, -0xc, -0xa, -0xc, -0xa, -0xc, -0x9, -0x8, -0x8, -0x29, -0xc, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x39, -0x0, -0x33, -0x32, -0x31, -0x30, -0x30, -0x40, -0x40, -0x30, -0x30, -0x30, -0x42, -0x32, -0x32, -0x0, -0x0, -0x22, -0x22, -0x39, -0x39, -0x23, -0x2, -0x29, -0x9, -0xc, -0xe, -0xc, -0x8, -0x9, -0xc, -0x2e, -0xe, -0x2e, -0x9, -0x29, -0x2e, -0xe, -0x9, -0x8, -0x2, -0x2, -0x2, -0x1, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x33, -0x0, -0x0, -0x22, -0x8, -0x9, -0x2e, -0xe, -0x9, -0x29, -0xa, -0xe, -0xe, -0xe, -0xc, -0x8, -0x9, -0xe, -0x2e, -0x9, -0x2, -0x39, -0x0, -0x33, -0x0, -0x33, -0x21, -0x33, -0x33, -0x20, -0x33, -0x20, -0x32, -0x31, -0x32, -0x20, -0x22, -0x2e, -0x2e, -0x8, -0x29, -0x9, -0x29, -0x8, -0x29, -0x29, -0x9, -0x2e, -0xe, -0xc, -0x8, -0x2, -0x22, -0x0, -0x0, -0x33, -0x0, -0x39, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x32, -0x41, -0x42, -0x32, -0x1, -0xd, -0x2e, -0x3, -0x8, -0x9, -0x9, -0x29, -0x29, -0x29, -0x29, -0x9, -0xa, -0xd, -0xb, -0x9, -0x2, -0x22, -0x20, -0x20, -0x0, -0x22, -0x2, -0x29, -0x9, -0x2a, -0x29, -0x2, -0x22, -0x0, -0x0, -0x1, -0x8, -0x2e, -0xe, -0x9, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0x9, -0x8, -0x8, -0x2e, -0xe, -0xc, -0x3, -0x0, -0x20, -0x32, -0x32, -0x21, -0x22, -0x2, -0x2, -0x3, -0x2, -0x2, -0x2, -0x2, -0x23, -0x2, -0x9, -0x9, -0x2e, -0xe, -0xa, -0x29, -0xc, -0xe, -0xe, -0xe, -0xc, -0x8, -0xd, -0x2e, -0xa, -0x29, -0x22, -0x20, -0x32, -0x31, -0x31, -0x32, -0x33, -0x0, -0x0, -0x0, -0x0, -0x33, -0x0, -0x0, -0x33, -0x0, -0x2, -0x2, -0xa, -0xd, -0xe, -0x9, -0x29, -0x2a, -0x9, -0x2a, -0x29, -0xc, -0xe, -0x2e, -0x9, -0x23, -0x0, -0x32, -0x30, -0x30, -0x42, -0x33, -0x1, -0x3, -0x29, -0x29, -0x2, -0x21, -0x43, -0x30, -0x30, -0x42, -0x21, -0x2, -0x8, -0xa, -0xe, -0xe, -0x9, -0x3, -0x29, -0x3, -0x29, -0xe, -0xe, -0xa, -0x9, -0x2, -0x23, -0x39, -0x22, -0x22, -0x1, -0x2, -0x8, -0x9, -0xa, -0x9, -0x29, -0x2, -0x22, -0x20, -0x33, -0x0, -0x22, -0x2, -0x9, -0xc, -0xe, -0x2e, -0x9, -0x3, -0x29, -0x29, -0x8, -0x2e, -0xe, -0xc, -0x9, -0x3, -0x3, -0x2, -0x2, -0x8, -0x2, -0x29, -0x3, -0x8, -0x8, -0x2, -0x2, -0x23, -0x1, -0x22, -0x22, -0x22, -0x1, -0x9, -0xd, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x9, -0x29, -0x2a, -0xe, -0xe, -0xc, -0x2a, -0x8, -0x1, -0x22, -0x0, -0x0, -0x33, -0x20, -0x32, -0x31, -0x31, -0x31, -0x32, -0x32, -0x20, -0x20, -0x0, -0x23, -0xe, -0xe, -0x9, -0x2, -0x8, -0x2, -0x3, -0x29, -0x2, -0x2, -0x2, -0x29, -0x9, -0xe, -0xd, -0xa, -0x8, -0x1, -0x22, -0x22, -0x39, -0x39, -0x1, -0x1, -0x23, -0x1, -0x2, -0x3, -0x29, -0x8, -0x9, -0x9, -0xe, -0xe, -0x9, -0x3, -0x3, -0x2a, -0x2d, -0xb, -0xd, -0xb, -0xd, -0xb, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x8, -0x29, -0x8, -0x29, -0x3, -0x2, -0x2, -0x2, -0x29, -0x9, -0x9, -0xc, -0xa, -0x2e, -0x2e, -0xc, -0x2e, -0xd, -0xb, -0x2e, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0xe, -0x2e, -0xc, -0x9, -0x8, -0x8, -0x29, -0x8, -0x8, -0x29, -0x8, -0x3, -0x2, -0x2, -0x2, -0x2, -0x2, -0x29, -0x8, -0x29, -0x29, -0x9, -0x22, -0x2, -0x9, -0x2e, -0xe, -0x2e, -0x29, -0x8, -0x8, -0x29, -0x29, -0xc, -0xe, -0xe, -0x2e, -0x9, -0x8, -0x1, -0x22, -0x1, -0x22, -0x23, -0x1, -0x22, -0x22, -0x0, -0x20, -0x32, -0x42, -0x31, -0x42, -0x20, -0x2, -0x9, -0xc, -0xb, -0xd, -0xe, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xf, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0x2e, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x29, -0x39, -0x33, -0x32, -0x31, -0x20, -0x0, -0x29, -0x9, -0x2e, -0x2e, -0xe, -0xe, -0xe, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0xa, -0xc, -0x2e, -0x2e, -0x2e, -0xd, -0x2e, -0xc, -0x2b, -0x8, -0x29, -0x2, -0x1, -0x22, -0x33, -0x20, -0x32, -0x33, -0x1, -0x2, -0x3, -0x29, -0x2a, -0x9, -0xc, -0xa, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x3, -0x2, -0x2, -0x39, -0x22, -0x22, -0x39, -0x39, -0x1, -0x0, -0x32, -0x32, -0x20, -0x20, -0x20, -0x20, -0x20, -0x33, -0x39, -0x29, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0x8, -0x29, -0x2, -0x29, -0x9, -0xc, -0xb, -0xd, -0x2e, -0xa, -0xa, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x33, -0x21, -0x33, -0x20, -0x20, -0x32, -0x20, -0x20, -0x20, -0x33, -0x0, -0x39, -0x2, -0x9, -0x2e, -0xe, -0xe, -0xe, -0xd, -0xb, -0xc, -0x9, -0x9, -0x29, -0x9, -0x9, -0x9, -0x9, -0x9, -0x3, -0x29, -0x2, -0x2, -0x1, -0x0, -0x33, -0x32, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2, -0x8, -0x29, -0x9, -0x9, -0xa, -0x9, -0x9, -0xa, -0x2d, -0x2b, -0x9, -0x2a, -0x2a, -0x9, -0x9, -0xa, -0x9, -0xa, -0x9, -0x2, -0x39, -0x22, -0x0, -0x20, -0x31, -0x42, -0x30, -0x30, -0x32, -0x0, -0x2, -0x9, -0xc, -0xa, -0x2d, -0x2a, -0x29, -0x3, -0x29, -0x2a, -0x2d, -0xa, -0xc, -0xa, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x2, -0x42, -0x30, -0x30, -0x40, -0x40, -0x40, -0x40, -0x40, -0x40, -0x42, -0x21, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0xa, -0xa, -0x9, -0xa, -0xc, -0x2e, -0xe, -0xd, -0xb, -0x9, -0x2, -0x33, -0x20, -0x32, -0x32, -0x32, -0x3, -0x2, -0x2, -0x39, -0x0, -0x33, -0x20, -0x32, -0x20, -0x33, -0x0, -0x39, -0x2, -0x8, -0x9, -0x9, -0x9, -0x9, -0x9, -0x9, -0xc, -0x2e, -0x2e, -0x2e, -0xa, -0x2d, -0x9, -0x9, -0x9, -0x9, -0x9, -0x2a, -0x23, -0x1, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x0, -0x0, -0x2, -0x29, -0x9, -0xa, -0xc, -0xc, -0xa, -0xc, -0xa, -0xc, -0xa, -0x9, -0x8, -0x29, -0x2, -0x2, -0x2, -0x2, -0x23, -0x1, -0x23, -0x2, -0x20, -0x20, -0x20, -0x20, -0x33, -0x21, -0x0, -0x22, -0x22, -0x2, -0x8, -0xc, -0x2e, -0xe, -0xd, -0x2e, -0x2e, -0xc, -0xa, -0x9, -0x9, -0x29, -0x2, -0x23, -0x22, -0x0, -0x33, -0x20, -0x32, -0x31, -0x32, -0x32, -0x30, -0x42, -0x31, -0x32, -0x0, -0x22, -0x2, -0x29, -0x8, -0x9, -0xc, -0x2e, -0xe, -0xe, -0x2e, -0x2e, -0x9, -0x9, -0x29, -0x29, -0x8, -0x8, -0x8, -0x8, -0x2, -0x1, -0x33, -0x31, -0x30, -0x30, -0x30, -0x30, -0x31, -0x32, -0x32, -0x21, -0x23, -0x29, -0xc, -0x2e, -0xc, -0xa, -0x9, -0x3, -0x2, -0x23, -0x2, -0x29, -0x9, -0xc, -0xa, -0xc, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x39, -0x33, -0x20, -0x31, -0x43, -0x31, -0x42, -0x22, -0x39, -0x2, -0x29, -0x9, -0xa, -0x2e, -0x2e, -0x2e, -0xc, -0x9, -0x8, -0x2, -0x23, -0x1, -0x23, -0x2, -0x2, -0x3, -0x8, -0x29, -0x8, -0x9, -0x9, -0x9, -0x3, -0x2, -0x22, -0x0, -0x0, -0x0, -0x0, -0x2, -0x29, -0x9, -0xc, -0x2e, -0xe, -0xd, -0xe, -0xe, -0xe, -0x2e, -0x2e, -0xa, -0x9, -0x29, -0x2, -0x23, -0x1, -0x22, -0x2, -0x3, -0x8, -0x9, -0x9, -0x9, -0x8, -0x2, -0x1, -0x0, -0x0, -0x0, -0x22, -0x1, -0x29, -0xa, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xc, -0xb, -0xd, -0xe, -0xe, -0x2e, -0xa, -0x9, -0x9, -0x9, -0x8, -0x9, -0x29, -0x3, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x41, -0x42, -0x31, -0x20, -0x9, -0xe, -0x2e, -0x9, -0x8, -0x8, -0x2c, -0x9, -0x2d, -0xe, -0xe, -0x2e, -0x9, -0x2, -0x1, -0x22, -0x22, -0x22, -0x22, -0x22, -0x0, -0x0, -0x33, -0x20, -0x20, -0x20, -0x32, -0x20, -0x32, -0x32, -0x33, -0x1, -0x2e, -0xe, -0x9, -0x3, -0x29, -0x9, -0x9, -0x2a, -0x9, -0x8, -0x2e, -0xe, -0xa, -0x29, -0x2, -0x39, -0x1, -0x1, -0x23, -0x22, -0x21, -0x32, -0x30, -0x30, -0x30, -0x42, -0x32, -0x21, -0x0, -0x0, -0x1, -0x3, -0x2e, -0xa, -0x9, -0xe, -0xc, -0x9, -0x2e, -0x29, -0x39, -0x0, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0x2e, -0x8, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x2, -0x0, -0x33, -0x23, -0x8, -0x29, -0x0, -0x20, -0x22, -0x2e, -0xa, -0x9, -0xd, -0xc, -0x2a, -0x2e, -0x29, -0x20, -0x32, -0x21, -0x22, -0x39, -0x22, -0x22, -0x2, -0x29, -0x2e, -0x9, -0x8, -0x8, -0xd, -0x2b, -0x1, -0x33, -0x20, -0x1, -0x2a, -0x29, -0x0, -0x32, -0x20, -0x9, -0x2e, -0x9, -0x8, -0x8, -0x2e, -0xc, -0x3, -0x2, -0x39, -0x39, -0x0, -0x0, -0x0, -0x33, -0x39, -0xe, -0x8, -0x29, -0x9, -0x9, -0x9, -0xc, -0xa, -0x29, -0x2, -0x2, -0x2, -0x2, -0x8, -0x9, -0xa, -0x2a, -0xc, -0x2e, -0x9, -0x9, -0x2e, -0x2e, -0x9, -0x29, -0x2, -0x2, -0x23, -0x1, -0x22, -0x0, -0x39, -0x8, -0x2e, -0xe, -0xd, -0xe, -0xe, -0x2e, -0x2e, -0xd, -0xb, -0xc, -0x9, -0x29, -0x0, -0x32, -0x21, -0x22, -0x39, -0x2, -0x2, -0x29, -0x9, -0xa, -0x9, -0x9, -0x8, -0x9, -0x9, -0x2a, -0x29, -0x2, -0x2, -0x2, -0x22, -0x33, -0x32, -0x20, -0x0, -0x1, -0x2a, -0xc, -0x2e, -0xc, -0xa, -0x8, -0x9, -0x9, -0x2a, -0x33, -0x31, -0x42, -0x30, -0x42, -0x39, -0xa, -0xc, -0x9, -0x9, -0xa, -0x2e, -0x9, -0x2, -0x0, -0x0, -0x2, -0x39, -0x0, -0x20, -0x33, -0x1, -0x2a, -0xc, -0x2b, -0x2d, -0xa, -0x9, -0x8, -0x8, -0x29, -0x8, -0x31, -0x32, -0x0, -0x23, -0x29, -0xc, -0xe, -0x2e, -0xa, -0x9, -0x8, -0x8, -0x39, -0x20, -0x42, -0x42, -0x33, -0x1, -0x8, -0x2e, -0xc, -0x8, -0x2, -0x2, -0x29, -0x9, -0x9, -0x8, -0x2, -0x22, -0x20, -0x20, -0x2, -0xc, -0xe, -0x2e, -0x2e, -0xd, -0xa, -0x9, -0x2, -0x29, -0x8, -0x29, -0x2, -0x0, -0x20, -0x33, -0x2e, -0x9, -0x2a, -0x9, -0x9, -0xe, -0x29, -0x1, -0x22, -0x39, -0x33, -0x31, -0x32, -0x20, -0x33, -0x39, -0xa, -0x9, -0xc, -0x9, -0x0, -0x22, -0x0, -0x21, -0xa, -0x9, -0x2d, -0x2a, -0x20, -0x1, -0x1, -0x0, -0xc, -0x2a, -0x9, -0x9, -0x2, -0x39, -0x23, -0x2, -0x9, -0x2e, -0x2e, -0x2e, -0x9, -0x8, -0x39, -0x0, -0x39, -0x22, -0x1, -0x2a, -0x9, -0x9, -0x9, -0x29, -0x0, -0x32, -0x21, -0x2b, -0x9, -0xc, -0x8, -0x23, -0x20, -0x3, -0x9, -0x9, -0x9, -0x8, -0x22, -0x32, -0x9, -0xc, -0xb, -0x8, -0x2, -0x39, -0x0, -0x33, -0xa, -0x9, -0x0, -0x0, -0xa, -0xc, -0x3, -0x1, -0x0, -0x2, -0xa, -0x29, -0x29, -0x9, -0x3, -0x33, -0x9, -0x1, -0x2, -0x3, -0x3, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME -#define RAW_NAME hilite_3dfinfo_raw -#define IMAGE_NAME hilite_3dfinfo_image -unsigned char RAW_NAME[] = { -0x20, -0x0, -0x0, -0x0, -0x20, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0xeb, -0xa5, -0x40, -0x0, -0x41, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xb8, -0xfc, -0x7b, -0x0, -0xd4, -0xfc, -0x7b, -0x0, -0xc, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x0, -0x0, -0x0, -0x0, -0x94, -0xa4, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0xa, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xbc, -0xfc, -0x7b, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd3, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd5, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd7, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd9, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xdb, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdd, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xdf, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe1, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe4, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe6, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe8, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xeb, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xed, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xf0, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf3, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf6, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf9, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfc, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfe, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x0, -0x0, -0x41, -0x0, -0x41, -0x95, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x40, -0x69, -0xa0, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xd8, -0x9c, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0xfd, -0x90, -0x40, -0x0, -0x1, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x3c, -0x83, -0xe2, -0x0, -0x48, -0x8, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xf, -0x21, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xec, -0x41, -0x55, -0x0, -0x38, -0xfe, -0x7b, -0x0, -0x74, -0xe4, -0x61, -0x81, -0x94, -0xdf, -0x61, -0x81, -0x0, -0x0, -0x6b, -0x0, -0xe0, -0xae, -0xa0, -0x0, -0x58, -0x5, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x3, -0x2, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0x5, -0x7, -0xc, -0xb, -0xb, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xb, -0xe, -0x11, -0x16, -0x16, -0x15, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0x10, -0x14, -0x17, -0x1a, -0x20, -0x21, -0x1e, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x20, -0x22, -0x26, -0x2d, -0x2f, -0x2b, -0x26, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0xf, -0x16, -0x1f, -0x28, -0x30, -0x35, -0x3d, -0x40, -0x3d, -0x36, -0x2d, -0x26, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xc, -0x15, -0x1c, -0x28, -0x31, -0x41, -0x46, -0x4f, -0x54, -0x50, -0x47, -0x3f, -0x31, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1a, -0x25, -0x31, -0x3e, -0x4d, -0x60, -0x66, -0x79, -0x64, -0x5e, -0x4d, -0x3e, -0x31, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0xb, -0x14, -0x1f, -0x2a, -0x39, -0x4a, -0x63, -0x76, -0x94, -0xa4, -0x8c, -0x76, -0x5a, -0x4a, -0x39, -0x2a, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x16, -0x21, -0x2f, -0x40, -0x54, -0x6a, -0x91, -0xcf, -0xd9, -0xc5, -0x95, -0x76, -0x54, -0x40, -0x2f, -0x21, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x10, -0x1b, -0x27, -0x35, -0x47, -0x60, -0x81, -0xc1, -0xeb, -0xff, -0xe8, -0xb8, -0x73, -0x5d, -0x44, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0xe, -0x17, -0x27, -0x38, -0x4e, -0x69, -0x95, -0xc7, -0xec, -0xff, -0xe6, -0xbe, -0x81, -0x5c, -0x45, -0x31, -0x23, -0x17, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xb, -0x16, -0x1c, -0x2a, -0x3a, -0x4e, -0x5b, -0x73, -0x9a, -0xd1, -0xf9, -0xc0, -0x9d, -0x70, -0x5d, -0x4b, -0x32, -0x22, -0x16, -0xe, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x6, -0x13, -0x1c, -0x21, -0x2a, -0x43, -0x53, -0x64, -0x7c, -0xa7, -0x97, -0x94, -0x7a, -0x64, -0x52, -0x3c, -0x2e, -0x1f, -0x14, -0xb, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x7, -0x11, -0x1e, -0x2c, -0x33, -0x46, -0x55, -0x69, -0x72, -0x6d, -0x6c, -0x62, -0x54, -0x46, -0x33, -0x25, -0x1a, -0x11, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x11, -0x15, -0x1c, -0x28, -0x34, -0x47, -0x56, -0x55, -0x55, -0x54, -0x4b, -0x47, -0x34, -0x28, -0x1c, -0x15, -0xc, -0x4, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x7, -0xf, -0x16, -0x1f, -0x2a, -0x34, -0x42, -0x3f, -0x3f, -0x3f, -0x3d, -0x30, -0x29, -0x1f, -0x16, -0xf, -0x7, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x8, -0x10, -0x16, -0x1e, -0x25, -0x2e, -0x2c, -0x2c, -0x2c, -0x28, -0x21, -0x1b, -0x16, -0x10, -0x8, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x8, -0xe, -0x14, -0x19, -0x1c, -0x1c, -0x1c, -0x1c, -0x1a, -0x17, -0x14, -0xe, -0x8, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x6, -0xa, -0x11, -0x11, -0x13, -0x13, -0x13, -0x11, -0xe, -0xa, -0x6, -0x2, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x2, -0xa, -0x7, -0x8, -0x8, -0x8, -0x7, -0x5, -0x2, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x59, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x2, -0x5, -0x6, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x9, -0x11, -0x19, -0x1b, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x27, -0x31, -0x35, -0x2b, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x13, -0x26, -0x3f, -0x57, -0x60, -0x4c, -0x32, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x1a, -0x35, -0x5b, -0x9b, -0xb4, -0x77, -0x46, -0x26, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0xa, -0x20, -0x41, -0x78, -0xd8, -0xf3, -0x9a, -0x51, -0x2a, -0x13, -0x2, -0x0, -0x0, -0x0, -0x0, -0x1, -0xe, -0x20, -0x3d, -0x62, -0xa4, -0xb9, -0x7b, -0x4e, -0x28, -0x11, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x15, -0x29, -0x46, -0x62, -0x60, -0x52, -0x35, -0x1c, -0xa, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x8, -0x17, -0x28, -0x37, -0x35, -0x2e, -0x1e, -0xf, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1, -0x8, -0x12, -0x17, -0x18, -0x14, -0xc, -0x3, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0x4, -0x5, -0x4, -0x1, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x16, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x3, -0xd, -0xf, -0x4, -0x0, -0x0, -0x0, -0x1, -0x16, -0x3c, -0x44, -0x1f, -0x3, -0x0, -0x0, -0x4, -0x2c, -0x92, -0xae, -0x3a, -0xa, -0x0, -0x0, -0x4, -0x27, -0x6c, -0x7a, -0x32, -0x7, -0x0, -0x0, -0x0, -0xa, -0x22, -0x24, -0xf, -0x1, -0x0, -0x0, -0x0, -0x0, -0x2, -0x2, -0x0, -0x0, -0x0, -0x5, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x4, -0x5, -0x0, -0x1, -0x44, -0x53, -0x3, -0x1, -0x30, -0x38, -0x2, -0x1, -0x0, -0x0, -0x0, -0x12, -0x17, -0xd, -0xf, -0x11, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME -#define RAW_NAME shadow_3dfinfo_raw -#define IMAGE_NAME shadow_3dfinfo_image -unsigned char RAW_NAME[] = { -0x40, -0x0, -0x0, -0x0, -0x20, -0x0, -0x0, -0x0, -0x8, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x2, -0x0, -0x0, -0x0, -0x3, -0x0, -0x0, -0x0, -0xff, -0x1, -0xfc, -0x1, -0xee, -0x1, -0x19, -0x0, -0x10, -0x0, -0xe5, -0x1, -0x11, -0x0, -0x6, -0x0, -0xe8, -0x1, -0x9, -0x0, -0x8, -0x0, -0xeb, -0x1, -0x1, -0x0, -0x4, -0x0, -0x22, -0x22, -0x2b, -0x3c, -0x44, -0x44, -0x66, -0x77, -0x88, -0x99, -0xaa, -0xbb, -0xcc, -0xdd, -0xee, -0xff, -0x23, -0x4e, -0x3c, -0x7, -0xef, -0x1, -0x4, -0x0, -0x12, -0x1c, -0x88, -0x7, -0xfc, -0xff, -0xd3, -0x7, -0x10, -0x32, -0xb8, -0x7, -0x6, -0x22, -0x94, -0x7, -0x8, -0x12, -0xa0, -0x7, -0x4, -0x2, -0xac, -0x7, -0x62, -0x0, -0x0, -0x0, -0x63, -0x0, -0x0, -0x0, -0x64, -0x0, -0x0, -0x0, -0x65, -0x0, -0x0, -0x0, -0x66, -0x0, -0x0, -0x0, -0x67, -0x0, -0x0, -0x0, -0x69, -0x0, -0x0, -0x0, -0x6a, -0x0, -0x0, -0x0, -0x6b, -0x0, -0x0, -0x0, -0x6c, -0x0, -0x0, -0x0, -0x6d, -0x0, -0x0, -0x0, -0x6e, -0x0, -0x0, -0x0, -0x6f, -0x0, -0x0, -0x0, -0x70, -0x0, -0x0, -0x0, -0x71, -0x0, -0x0, -0x0, -0x72, -0x0, -0x0, -0x0, -0x73, -0x0, -0x0, -0x0, -0x74, -0x0, -0x0, -0x0, -0x75, -0x0, -0x0, -0x0, -0x76, -0x0, -0x0, -0x0, -0x77, -0x0, -0x0, -0x0, -0x78, -0x0, -0x0, -0x0, -0x79, -0x0, -0x0, -0x0, -0x7a, -0x0, -0x0, -0x0, -0x7b, -0x0, -0x0, -0x0, -0x7c, -0x0, -0x0, -0x0, -0x7d, -0x0, -0x0, -0x0, -0x7e, -0x0, -0x0, -0x0, -0x7f, -0x0, -0x0, -0x0, -0x80, -0x0, -0x0, -0x0, -0x81, -0x0, -0x0, -0x0, -0x82, -0x0, -0x0, -0x0, -0x83, -0x0, -0x0, -0x0, -0x84, -0x0, -0x0, -0x0, -0x85, -0x0, -0x0, -0x0, -0x86, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x87, -0x0, -0x0, -0x0, -0x88, -0x0, -0x0, -0x0, -0x89, -0x0, -0x0, -0x0, -0x8a, -0x0, -0x0, -0x0, -0x8b, -0x0, -0x0, -0x0, -0x8c, -0x0, -0x0, -0x0, -0x8d, -0x0, -0x0, -0x0, -0x8e, -0x0, -0x0, -0x0, -0x8f, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x90, -0x0, -0x0, -0x0, -0x91, -0x0, -0x0, -0x0, -0x92, -0x0, -0x0, -0x0, -0x93, -0x0, -0x0, -0x0, -0x94, -0x0, -0x0, -0x0, -0x95, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x96, -0x0, -0x0, -0x0, -0x97, -0x0, -0x0, -0x0, -0xeb, -0xa5, -0x40, -0x0, -0x41, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xb8, -0xfc, -0x7b, -0x0, -0xd4, -0xfc, -0x7b, -0x0, -0xc, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x0, -0x0, -0x0, -0x0, -0x94, -0xa4, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0x12, -0x9f, -0x40, -0x0, -0xa, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xbc, -0xfc, -0x7b, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xa6, -0x0, -0x0, -0x0, -0xa7, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa8, -0x0, -0x0, -0x0, -0xa9, -0x0, -0x0, -0x0, -0xaa, -0x0, -0x0, -0x0, -0xab, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xac, -0x0, -0x0, -0x0, -0xad, -0x0, -0x0, -0x0, -0xae, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xaf, -0x0, -0x0, -0x0, -0xb0, -0x0, -0x0, -0x0, -0xb1, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb2, -0x0, -0x0, -0x0, -0xb3, -0x0, -0x0, -0x0, -0xb4, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb5, -0x0, -0x0, -0x0, -0xb6, -0x0, -0x0, -0x0, -0xb7, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb8, -0x0, -0x0, -0x0, -0xb9, -0x0, -0x0, -0x0, -0xba, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbb, -0x0, -0x0, -0x0, -0xbc, -0x0, -0x0, -0x0, -0xbd, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbe, -0x0, -0x0, -0x0, -0xbf, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc0, -0x0, -0x0, -0x0, -0xc1, -0x0, -0x0, -0x0, -0xc2, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc3, -0x0, -0x0, -0x0, -0xc4, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc5, -0x0, -0x0, -0x0, -0xc6, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc7, -0x0, -0x0, -0x0, -0xc8, -0x0, -0x0, -0x0, -0xc9, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xca, -0x0, -0x0, -0x0, -0xcb, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcc, -0x0, -0x0, -0x0, -0xcd, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xce, -0x0, -0x0, -0x0, -0xcf, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd0, -0x0, -0x0, -0x0, -0xd1, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd2, -0x0, -0x0, -0x0, -0xd3, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd4, -0x0, -0x0, -0x0, -0xd5, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd6, -0x0, -0x0, -0x0, -0xd7, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd8, -0x0, -0x0, -0x0, -0xd9, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xda, -0x0, -0x0, -0x0, -0xdb, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdc, -0x0, -0x0, -0x0, -0xdd, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xde, -0x0, -0x0, -0x0, -0xdf, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe0, -0x0, -0x0, -0x0, -0xe1, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe2, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe3, -0x0, -0x0, -0x0, -0xe4, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe5, -0x0, -0x0, -0x0, -0xe6, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe7, -0x0, -0x0, -0x0, -0xe8, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xe9, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xea, -0x0, -0x0, -0x0, -0xeb, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xec, -0x0, -0x0, -0x0, -0xed, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xee, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xef, -0x0, -0x0, -0x0, -0xf0, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf1, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf2, -0x0, -0x0, -0x0, -0xf3, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf4, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf5, -0x0, -0x0, -0x0, -0xf6, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf7, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf8, -0x0, -0x0, -0x0, -0xf9, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfa, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfb, -0x0, -0x0, -0x0, -0xfc, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfd, -0x0, -0x0, -0x0, -0xfe, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x1b, -0x0, -0x0, -0x0, -0x0, -0x0, -0x41, -0x0, -0x41, -0x95, -0x40, -0x0, -0x2, -0x0, -0x0, -0x0, -0x40, -0x69, -0xa0, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1a, -0x0, -0x0, -0x0, -0xd8, -0x9c, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x1, -0x0, -0x0, -0x0, -0xfd, -0x90, -0x40, -0x0, -0x1, -0x0, -0x0, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0x3c, -0x83, -0xe2, -0x0, -0x48, -0x8, -0x0, -0x0, -0x68, -0x82, -0xe2, -0x0, -0xf, -0x21, -0x40, -0x0, -0xc0, -0x4f, -0x55, -0x0, -0xec, -0x41, -0x55, -0x0, -0x38, -0xfe, -0x7b, -0x0, -0x74, -0xe4, -0x61, -0x81, -0x94, -0xdf, -0x61, -0x81, -0x0, -0x0, -0x6b, -0x0, -0x40, -0xc4, -0xa0, -0x0, -0xb0, -0xa, -0x0, -0x0 -}; - -unsigned char IMAGE_NAME[] = { -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xe4, -0xd7, -0xd0, -0xcf, -0xd6, -0xe2, -0xf2, -0xfc, -0xff, -0xff, -0xfb, -0xe8, -0xdf, -0xdf, -0xdf, -0xdf, -0xde, -0xdf, -0xe0, -0xe2, -0xe7, -0xee, -0xf5, -0xfa, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf1, -0xc0, -0x94, -0x80, -0x79, -0x78, -0x7f, -0x91, -0xb1, -0xda, -0xf8, -0xfd, -0xe7, -0xab, -0x8c, -0x89, -0x89, -0x89, -0x89, -0x89, -0x8b, -0x8e, -0x96, -0xa1, -0xb4, -0xcf, -0xe8, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe3, -0x93, -0x60, -0x58, -0x58, -0x57, -0x55, -0x59, -0x6b, -0x96, -0xd4, -0xf7, -0xdc, -0x88, -0x5d, -0x59, -0x59, -0x5a, -0x5a, -0x5b, -0x5b, -0x5b, -0x5d, -0x60, -0x6a, -0x7e, -0xa0, -0xcc, -0xf0, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe2, -0x96, -0x72, -0x7a, -0x7e, -0x74, -0x60, -0x53, -0x53, -0x66, -0xa3, -0xe8, -0xdb, -0x84, -0x57, -0x52, -0x54, -0x5d, -0x67, -0x69, -0x68, -0x65, -0x5f, -0x59, -0x56, -0x58, -0x64, -0x86, -0xbc, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfa, -0xf7, -0xf4, -0xf3, -0xf6, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xef, -0xc8, -0xc1, -0xd1, -0xd6, -0xc4, -0x95, -0x62, -0x52, -0x57, -0x84, -0xd7, -0xd9, -0x84, -0x57, -0x52, -0x5b, -0x82, -0xac, -0xb6, -0xb4, -0xac, -0x9c, -0x83, -0x68, -0x58, -0x55, -0x5d, -0x7f, -0xc0, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xe5, -0xcc, -0xba, -0xb0, -0xaf, -0xc4, -0xeb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf7, -0xf8, -0xfb, -0xfc, -0xf5, -0xc9, -0x79, -0x55, -0x54, -0x7c, -0xd0, -0xd8, -0x85, -0x58, -0x52, -0x61, -0xa1, -0xe7, -0xf6, -0xf6, -0xf3, -0xe9, -0xd1, -0xa5, -0x72, -0x58, -0x54, -0x5f, -0x8d, -0xd6, -0xfb, -0xff, -0xff, -0xf8, -0xd2, -0x9f, -0x7e, -0x77, -0x7b, -0x81, -0xa8, -0xe5, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xd0, -0x7d, -0x55, -0x57, -0x88, -0xda, -0xd9, -0x85, -0x58, -0x53, -0x61, -0xa7, -0xf2, -0xff, -0xff, -0xff, -0xfe, -0xf9, -0xe2, -0xa7, -0x6a, -0x55, -0x56, -0x6c, -0xb2, -0xf2, -0xff, -0xfd, -0xe2, -0x9a, -0x69, -0x6c, -0x95, -0xb3, -0xbd, -0xd0, -0xed, -0xf5, -0xf8, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf7, -0xf6, -0xf9, -0xfe, -0xfe, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xda, -0xa6, -0x69, -0x55, -0x69, -0xaa, -0xeb, -0xdc, -0x85, -0x58, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd4, -0x87, -0x5b, -0x55, -0x5d, -0x93, -0xe3, -0xfd, -0xfa, -0xcc, -0x7a, -0x5e, -0x85, -0xd1, -0xf3, -0xf0, -0xd8, -0xbf, -0xb7, -0xc4, -0xe5, -0xfc, -0xff, -0xff, -0xf4, -0xd2, -0xbb, -0xbc, -0xd6, -0xf1, -0xf2, -0xf0, -0xf8, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd1, -0x94, -0x6b, -0x57, -0x64, -0x97, -0xd9, -0xf8, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xec, -0xa1, -0x62, -0x54, -0x58, -0x80, -0xd4, -0xf8, -0xef, -0xbb, -0x70, -0x5f, -0x8e, -0xda, -0xf4, -0xf2, -0xd5, -0x9d, -0x77, -0x7a, -0xaa, -0xe4, -0xfc, -0xf4, -0xc8, -0x8c, -0x76, -0x93, -0xcc, -0xf2, -0xf2, -0xed, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb8, -0x6b, -0x53, -0x56, -0x75, -0xb9, -0xf1, -0xfc, -0xdb, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xb0, -0x67, -0x55, -0x57, -0x77, -0xc7, -0xde, -0xba, -0x90, -0x65, -0x5b, -0x77, -0xa3, -0xb5, -0xcb, -0xe5, -0xc8, -0x8e, -0x68, -0x75, -0xaf, -0xdd, -0xcc, -0x8e, -0x6c, -0x85, -0xbe, -0xed, -0xfe, -0xfd, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xba, -0x6e, -0x54, -0x53, -0x64, -0x93, -0xd0, -0xf5, -0xdc, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xb4, -0x69, -0x56, -0x56, -0x74, -0xc0, -0xc7, -0x8f, -0x6e, -0x5b, -0x58, -0x64, -0x76, -0x80, -0xa6, -0xe7, -0xf2, -0xcc, -0x90, -0x6a, -0x77, -0x98, -0x8a, -0x70, -0x88, -0xc2, -0xef, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xd8, -0xa0, -0x76, -0x59, -0x53, -0x63, -0x96, -0xdc, -0xd9, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf2, -0xab, -0x65, -0x55, -0x57, -0x79, -0xca, -0xdf, -0xbd, -0x91, -0x65, -0x5b, -0x78, -0xa6, -0xb8, -0xce, -0xf3, -0xff, -0xf5, -0xcd, -0x8d, -0x65, -0x64, -0x66, -0x83, -0xc4, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xe5, -0xb9, -0x77, -0x55, -0x53, -0x70, -0xbb, -0xd2, -0x85, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe3, -0x95, -0x5e, -0x54, -0x59, -0x85, -0xd8, -0xf9, -0xf0, -0xba, -0x6f, -0x5f, -0x90, -0xdd, -0xf4, -0xf9, -0xff, -0xff, -0xfe, -0xe7, -0xa4, -0x6a, -0x5c, -0x63, -0x91, -0xd9, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe5, -0x96, -0x5c, -0x51, -0x62, -0xa5, -0xca, -0x84, -0x57, -0x52, -0x61, -0xa7, -0xf1, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf3, -0xc0, -0x77, -0x58, -0x54, -0x61, -0x9c, -0xe8, -0xfe, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xff, -0xfe, -0xed, -0xbf, -0x84, -0x6a, -0x70, -0x68, -0x74, -0xab, -0xe1, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xf8, -0xfd, -0xff, -0xff, -0xfe, -0xe8, -0x99, -0x5d, -0x52, -0x60, -0xa1, -0xc9, -0x84, -0x57, -0x52, -0x61, -0xa6, -0xef, -0xfd, -0xfd, -0xfc, -0xf9, -0xee, -0xc9, -0x8b, -0x5f, -0x54, -0x57, -0x74, -0xbd, -0xf5, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xe8, -0xb8, -0x81, -0x6f, -0x91, -0xb2, -0x96, -0x6e, -0x73, -0xa4, -0xdb, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe0, -0xca, -0xdd, -0xef, -0xf5, -0xeb, -0xc3, -0x7d, -0x56, -0x52, -0x66, -0xad, -0xcd, -0x85, -0x57, -0x52, -0x5f, -0x97, -0xd3, -0xe1, -0xdf, -0xd9, -0xca, -0xad, -0x83, -0x61, -0x55, -0x55, -0x66, -0x9d, -0xe1, -0xfd, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xfd, -0xe6, -0xb3, -0x7d, -0x6d, -0x93, -0xd0, -0xef, -0xd6, -0x98, -0x6c, -0x71, -0xa0, -0xd9, -0xf9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x85, -0x8c, -0xa4, -0xad, -0xa0, -0x7e, -0x5c, -0x51, -0x56, -0x7d, -0xc9, -0xd5, -0x84, -0x57, -0x52, -0x58, -0x6e, -0x87, -0x8c, -0x8a, -0x83, -0x77, -0x68, -0x5a, -0x54, -0x58, -0x68, -0x94, -0xd3, -0xf9, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xf5, -0xcd, -0x9b, -0x86, -0x9d, -0xd1, -0xf6, -0xff, -0xf8, -0xd4, -0x9e, -0x84, -0x91, -0xbd, -0xed, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xbe, -0x6f, -0x5a, -0x5f, -0x63, -0x5f, -0x56, -0x53, -0x58, -0x71, -0xac, -0xe9, -0xdb, -0x84, -0x57, -0x53, -0x54, -0x57, -0x5b, -0x5b, -0x5b, -0x5a, -0x58, -0x57, -0x5a, -0x63, -0x79, -0xa3, -0xd5, -0xf7, -0xff, -0xff, -0xff, -0xf8, -0xc2, -0x71, -0x60, -0x95, -0xe7, -0xfd, -0xfa, -0xe6, -0xd6, -0xd5, -0xe4, -0xf8, -0xff, -0xff, -0xff, -0xf9, -0xe4, -0xd5, -0xd4, -0xe0, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xd2, -0x8f, -0x6d, -0x61, -0x5e, -0x5d, -0x61, -0x6c, -0x85, -0xb2, -0xe3, -0xf9, -0xdf, -0x92, -0x6a, -0x66, -0x67, -0x67, -0x67, -0x67, -0x69, -0x6c, -0x70, -0x78, -0x89, -0xa4, -0xc5, -0xe6, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xf8, -0xc1, -0x71, -0x60, -0x95, -0xe7, -0xfe, -0xff, -0xfc, -0xfb, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfb, -0xfb, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf4, -0xd8, -0xbe, -0xaa, -0xa0, -0xa0, -0xa9, -0xbb, -0xd5, -0xef, -0xfd, -0xfe, -0xf0, -0xc8, -0xb4, -0xb2, -0xb2, -0xb3, -0xb3, -0xb3, -0xb6, -0xbb, -0xc3, -0xcd, -0xdc, -0xec, -0xf8, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf9, -0xc9, -0x83, -0x73, -0xa2, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf7, -0xf2, -0xee, -0xee, -0xf1, -0xf7, -0xfb, -0xff, -0xff, -0xff, -0xfe, -0xf8, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf5, -0xf6, -0xf7, -0xf8, -0xfa, -0xfc, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xe7, -0xc5, -0xbd, -0xd4, -0xf6, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xf6, -0xf6, -0xf9, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xfe, -0xfd, -0xfc, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xf4, -0xf1, -0xf2, -0xf3, -0xee, -0xf0, -0xf4, -0xf6, -0xf5, -0xf4, -0xf3, -0xf7, -0xf6, -0xf1, -0xea, -0xea, -0xf0, -0xf6, -0xf7, -0xf5, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xe7, -0xd4, -0xce, -0xd0, -0xcb, -0xcd, -0xcd, -0xd3, -0xd4, -0xd9, -0xd3, -0xd7, -0xd8, -0xd6, -0xcc, -0xd0, -0xd4, -0xd5, -0xd3, -0xd0, -0xe7, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xc5, -0xc0, -0xc4, -0xc2, -0xc1, -0xbc, -0xc5, -0xcb, -0xd5, -0xc3, -0xbf, -0xcb, -0xd7, -0xcb, -0xca, -0xc7, -0xbf, -0xbf, -0xbe, -0xe0, -0xfb, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xe3, -0xcf, -0xce, -0xd0, -0xcc, -0xc9, -0xc9, -0xd5, -0xda, -0xd9, -0xc2, -0xc2, -0xcd, -0xd8, -0xd0, -0xd2, -0xd7, -0xd2, -0xd3, -0xcf, -0xe9, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0xee, -0xee, -0xef, -0xeb, -0xe8, -0xe8, -0xef, -0xf2, -0xef, -0xe3, -0xe6, -0xe9, -0xeb, -0xe8, -0xec, -0xf4, -0xf4, -0xf3, -0xeb, -0xf6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfd, -0xfd, -0xfd, -0xfe, -0xfe, -0xfe, -0xfc, -0xfd, -0xfd, -0xfd, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xfd, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xfe, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xcb, -0xa8, -0xa7, -0xc6, -0xf3, -0xf8, -0xc0, -0xb4, -0xb4, -0xb5, -0xbb, -0xce, -0xec, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf0, -0x7f, -0x6a, -0x60, -0x5b, -0x9d, -0xe6, -0x70, -0x56, -0x5e, -0x62, -0x5f, -0x5e, -0x77, -0xc0, -0xfa, -0xff, -0xff, -0xff, -0xfc, -0xf9, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfb, -0xde, -0xe8, -0xc6, -0x61, -0x6b, -0xd6, -0x6e, -0x58, -0xae, -0xd6, -0xc9, -0x98, -0x5e, -0x64, -0xc6, -0xfe, -0xfd, -0xd4, -0x9f, -0x97, -0xcf, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xd2, -0x64, -0x7d, -0xdf, -0x6f, -0x5a, -0xcc, -0xff, -0xff, -0xf5, -0x9b, -0x57, -0x84, -0xf4, -0xe9, -0x77, -0x96, -0xd5, -0xd5, -0xda, -0xf7, -0xff, -0xf0, -0xd9, -0xf0, -0xf7, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xde, -0x6f, -0x62, -0xc7, -0xeb, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xcd, -0x5d, -0x6a, -0xdc, -0xbd, -0x64, -0xa1, -0xda, -0xc8, -0x7a, -0xad, -0xe6, -0x94, -0x93, -0xea, -0xf6, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xe1, -0x76, -0x59, -0x97, -0xe2, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xff, -0xd2, -0x5e, -0x67, -0xcc, -0x93, -0x5d, -0x7e, -0xab, -0xf3, -0xc8, -0x75, -0x7b, -0x90, -0xe9, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xe0, -0x70, -0x5e, -0xbf, -0x6e, -0x5a, -0xcc, -0xff, -0xff, -0xfc, -0xac, -0x58, -0x77, -0xee, -0xd9, -0x68, -0xba, -0xfb, -0xff, -0xe4, -0x7f, -0x66, -0xa2, -0xf5, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe7, -0xf9, -0xe5, -0x72, -0x5b, -0xb9, -0x6e, -0x59, -0xc0, -0xef, -0xe6, -0xba, -0x68, -0x5a, -0xac, -0xfc, -0xdd, -0x69, -0xbe, -0xfe, -0xdf, -0x89, -0x99, -0xc3, -0x79, -0xa4, -0xf3, -0xff, -0xff, -0xff, -0xff, -0xdc, -0x77, -0x85, -0x75, -0x56, -0x7c, -0xd9, -0x6e, -0x54, -0x6a, -0x73, -0x6b, -0x5d, -0x62, -0x9d, -0xf1, -0xff, -0xdd, -0x69, -0xbe, -0xfa, -0xc9, -0xb7, -0xf0, -0xfd, -0xd4, -0xb0, -0xe0, -0xff, -0xff, -0xff, -0xff, -0xf0, -0xa5, -0x82, -0x82, -0xa0, -0xe0, -0xf2, -0x9e, -0x8c, -0x8d, -0x8e, -0x97, -0xab, -0xd3, -0xf7, -0xff, -0xff, -0xdf, -0x72, -0xc2, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xfd, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xf8, -0xf7, -0xfc, -0xff, -0xff, -0xfb, -0xfa, -0xfa, -0xfa, -0xfb, -0xfd, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xdc, -0xf0, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf5, -0xe1, -0xdf, -0xe0, -0xe5, -0xe5, -0xe7, -0xdf, -0xe0, -0xe5, -0xea, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xee, -0xc9, -0xc9, -0xc4, -0xd0, -0xcd, -0xc6, -0xd3, -0xcf, -0xc9, -0xd6, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfd, -0xf6, -0xf5, -0xf3, -0xf7, -0xf3, -0xf2, -0xf3, -0xf7, -0xf9, -0xf7, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfe, -0xdc, -0xda, -0xfa, -0xdc, -0xd9, -0xe2, -0xfa, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfa, -0xac, -0x79, -0xb1, -0x63, -0x91, -0x88, -0x7e, -0xef, -0xf4, -0xcb, -0xf2, -0xff, -0xff, -0xff, -0xff, -0xff, -0xf6, -0x82, -0xc4, -0x64, -0xe6, -0xfd, -0x87, -0xb0, -0xa0, -0xba, -0xbc, -0xe2, -0xbc, -0xf2, -0xfe, -0xff, -0xf7, -0x88, -0xa6, -0x64, -0xe6, -0xfe, -0x8d, -0xa6, -0x8c, -0xb8, -0xe8, -0x75, -0xc4, -0xff, -0xff, -0xf4, -0xb7, -0x89, -0x9a, -0x62, -0xa3, -0x9a, -0x70, -0xe6, -0xa3, -0xdd, -0xba, -0xd2, -0xa8, -0xf4, -0xff, -0xfb, -0xc7, -0xc5, -0xf4, -0xc8, -0xc4, -0xcf, -0xf2, -0xff, -0xc9, -0xec, -0xfe, -0xff, -0xfe, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xe3, -0xd3, -0xda, -0xd8, -0xd7, -0xef, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xff, -0xfc, -0xfa, -0xfa, -0xf9, -0xfc, -0xfd, -0xff, -0xe0, -0xc0, -0xaa, -0xb9, -0xf8, -0xef, -0xff, -0xff, -0xfb, -0x9d, -0xa5, -0xc4, -0xa1, -0xc6, -0xb6, -0xfc, -0xdb, -0xb7, -0xa4, -0xb3, -0xd4, -0xe0, -0xde, -0xfc, -0xff, -0xff, -0xff, -0xff, -0xf7, -0xe8, -0xe9, -0xfb, -0xce, -0xb3, -0xd4, -0xec, -0xe4, -0xd5, -0xe5, -0xf0, -0xcf, -0xe5, -0xda, -0x0, -0x0, -0x0, -0x0, -0x0 -}; - -#undef RAW_NAME -#undef IMAGE_NAME diff --git a/glide2x/sst1/glide/src/sst96.c b/glide2x/sst1/glide/src/sst96.c deleted file mode 100644 index 7516cdc..0000000 --- a/glide2x/sst1/glide/src/sst96.c +++ /dev/null @@ -1,743 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 20 9/19/97 12:38p Peter - * asm rush trisetup vs alt fifo - * - * 19 9/12/97 12:56p Dow - * Protected JUJU code - * - * 18 9/11/97 2:22p Atai - * fixed muckage - * - * 17 9/10/97 10:15p Peter - * fifo logic from GaryT - * - * 16 8/19/97 8:55p Peter - * lots of stuff, hopefully no muckage - * - * 15 8/01/97 11:49a Dow - * Allowed for non4K fifo wraps - * - * 14 7/08/97 1:29p Jdt - * Fixed watcom muckage - * - * 13 7/04/97 12:08p Dow - * Modified GWP debugging - * - * 12 6/20/97 5:54p Dow - * Moved grDebugGroupWriteHeader in here. - * - * 11 6/18/97 5:54p Dow - * P6 adjustments - * - * 10 5/27/97 2:03p Dow - * added new assertion - * - * 9 5/04/97 12:49p Dow - * Moved texture downloads to level 195, like on SST1 - * - * 8 4/13/97 2:06p Pgj - * eliminate all anonymous unions (use hwDep) - * - * 7 3/16/97 12:39a Jdt - * initWrapFifo only neads fifodata... - * - * 6 3/04/97 9:12p Dow - * Neutered mutiplatform multiheaded monster. - * - * 5 2/18/97 9:53a Jdt - * Removed some unecessary declarations. - * - * 4 2/14/97 12:55p Dow - * moved vg96 fifo wrap into init code - * - * 3 2/11/97 6:59p Dow - * Changes to support vid tiles and ser status - * - * 2 1/14/97 10:49a Dow - * Changed all output to use GDBG_INFO - * Renabled some messages - * - * 1 12/23/96 1:39p Dow - * Changes for multiplatform -** -*/ -/* gsst96.c - transport stuff for SST 96 */ - -#include -#include -#include <3dfx.h> - -#include -#include - -#define FX_DLL_DEFINITION -#include -#include -#include "fxglide.h" - -#if (GLIDE_PLATFORM & GLIDE_HW_SST96) - -#define GEN_INDEX(a) ((((FxU32) a) - ((FxU32) gc->reg_ptr)) >> 2) - -char -*regNames[] = { - "status", /* 0x00 */ - "reserved001", /* 0x01 */ - "vAx", /* 0x02 */ - "vAy", /* 0x03 */ - "vBx", /* 0x04 */ - "vBy", /* 0x05 */ - "vCx", /* 0x06 */ - "vCy", /* 0x07 */ - "r", /* 0x08 */ - "drdx", /* 0x09 */ - "drdy", /* 0x0a */ - "g", /* 0x0b */ - "dgdx", /* 0x0c */ - "dgdy", /* 0x0d */ - "b", /* 0x0e */ - "dbdx", /* 0x0f */ - "dbdy", /* 0x10 */ - "z", /* 0x11 */ - "dzdx", /* 0x12 */ - "dzdy", /* 0x13 */ - "a", /* 0x14 */ - "dadx", /* 0x15 */ - "dady", /* 0x16 */ - "s", /* 0x17 */ - "dsdx", /* 0x18 */ - "dsdy", /* 0x19 */ - "t", /* 0x1a */ - "dtdx", /* 0x1b */ - "dtdy", /* 0x1c */ - "w", /* 0x1d */ - "dwdx", /* 0x1e */ - "dwdy", /* 0x1f */ - "triangleCMD", /* 0x20 */ - "reserved021", /* 0x21 */ - "FvAx", /* 0x22 */ - "FvAy", /* 0x23 */ - "FvBx", /* 0x24 */ - "FvBy", /* 0x25 */ - "FvCx", /* 0x26 */ - "FvCy", /* 0x27 */ - "Fr", /* 0x28 */ - "Fdrdx", /* 0x29 */ - "Fdrdy", /* 0x2a */ - "Fg", /* 0x2b */ - "Fdgdx", /* 0x2c */ - "Fdgdy", /* 0x2d */ - "Fb", /* 0x2e */ - "Fdbdx", /* 0x2f */ - "Fdbdy", /* 0x30 */ - "Fz", /* 0x31 */ - "Fdzdx", /* 0x32 */ - "Fdzdy", /* 0x33 */ - "Fa", /* 0x34 */ - "Fdadx", /* 0x35 */ - "Fdady", /* 0x36 */ - "Fs", /* 0x37 */ - "Fdsdx", /* 0x38 */ - "Fdsdy", /* 0x39 */ - "Ft", /* 0x3a */ - "Fdtdx", /* 0x3b */ - "Fdtdy", /* 0x3c */ - "Fw", /* 0x3d */ - "Fdwdx", /* 0x3e */ - "Fdwdy", /* 0x3f */ - "FtriangleCMD", /* 0x40 */ - "reserved041", /* 0x41 */ - "nopCMD", /* 0x42 */ - "reserved043", /* 0x43 */ - "fastfillCMD", /* 0x44 */ - "reserved045", /* 0x45 */ - "swapbufferCMD", /* 0x46 */ - "reserved047", /* 0x47 */ - "swappendCMD", /* 0x48 */ - "reserved049", /* 0x49 */ - "reserved04A", /* 0x4a */ - "reserved04B", /* 0x4b */ - "reserved04C", /* 0x4c */ - "reserved04D", /* 0x4d */ - "reserved04E", /* 0x4e */ - "reserved04F", /* 0x4f */ - "fbzColorPath", /* 0x50 */ - "fogMode", /* 0x51 */ - "alphaMode", /* 0x52 */ - "reserved053", /* 0x53 */ - "fbzMode", /* 0x54 */ - "stipple", /* 0x55 */ - "color0", /* 0x56 */ - "color1", /* 0x57 */ - "fogColor", /* 0x58 */ - "zaColor", /* 0x59 */ - "chromaKey", /* 0x5a */ - "chromaRange", /* 0x5b */ - "reserved05C", /* 0x5c */ - "reserved05D", /* 0x5d */ - "reserved05E", /* 0x5e */ - "reserved05F", /* 0x5f */ - "colBufferSetup", /* 0x60 */ - "auxBufferSetup", /* 0x61 */ - "clipLeftRight0", /* 0x62 */ - "clipTopBottom0", /* 0x63 */ - "clipLeftRight1", /* 0x64 */ - "clipTopBottom1", /* 0x65 */ - "reserved066", /* 0x66 */ - "reserved067", /* 0x67 */ - "reserved068", /* 0x68 */ - "reserved069", /* 0x69 */ - "reserved06A", /* 0x6a */ - "reserved06B", /* 0x6b */ - "reserved06C", /* 0x6c */ - "reserved06D", /* 0x6d */ - "reserved06E", /* 0x6e */ - "reserved06F", /* 0x6f */ - "fogTable0001", /* 0x70 */ - "fogTable0203", /* 0x71 */ - "fogTable0405", /* 0x72 */ - "fogTable0607", /* 0x73 */ - "fogTable0809", /* 0x74 */ - "fogTable0A0B", /* 0x75 */ - "fogTable0C0D", /* 0x76 */ - "fogTable0E0F", /* 0x77 */ - "fogTable1011", /* 0x78 */ - "fogTable1213", /* 0x79 */ - "fogTable1415", /* 0x7a */ - "fogTable1617", /* 0x7b */ - "fogTable1819", /* 0x7c */ - "fogTable1A1B", /* 0x7d */ - "fogTable1C1D", /* 0x7e */ - "fogTable1E1F", /* 0x7f */ - "fogTable2021", /* 0x80 */ - "fogTable2223", /* 0x81 */ - "fogTable2425", /* 0x82 */ - "fogTable2627", /* 0x83 */ - "fogTable2829", /* 0x84 */ - "fogTable2A2B", /* 0x85 */ - "fogTable2C2D", /* 0x86 */ - "fogTable2E2F", /* 0x87 */ - "fogTable3031", /* 0x88 */ - "fogTable3233", /* 0x89 */ - "fogTable3435", /* 0x8a */ - "fogTable3637", /* 0x8b */ - "fogTable3839", /* 0x8c */ - "fogTable3A3B", /* 0x8d */ - "fogTable3C3D", /* 0x8e */ - "fogTable3E3F", /* 0x8f */ - "fbijrInit0", /* 0x90 */ - "fbijrInit1", /* 0x91 */ - "fbijrInit2", /* 0x92 */ - "fbijrInit3", /* 0x93 */ - "fbijrInit4", /* 0x94 */ - "fbijrInit5", /* 0x95 */ - "reserved096", /* 0x96 */ - "reserved097", /* 0x97 */ - "reserved098", /* 0x98 */ - "reserved099", /* 0x99 */ - "reserved09A", /* 0x9a */ - "reserved09B", /* 0x9b */ - "reserved09C", /* 0x9c */ - "reserved09D", /* 0x9d */ - "reserved09E", /* 0x9e */ - "reserved09F", /* 0x9f */ - "fbijrVersion", /* 0xa0 */ - "fbiPixelsIn", /* 0xa1 */ - "fbiChromaFail", /* 0xa2 */ - "fbiZfuncFail", /* 0xa3 */ - "fbiAfuncFail", /* 0xa4 */ - "fbiPixelsOut", /* 0xa5 */ - "reserved0A6", /* 0xa6 */ - "reserved0A7", /* 0xa7 */ - "reserved0A8", /* 0xa8 */ - "reserved0A9", /* 0xa9 */ - "reserved0AA", /* 0xaa */ - "reserved0AB", /* 0xab */ - "reserved0AC", /* 0xac */ - "reserved0AD", /* 0xad */ - "reserved0AE", /* 0xae */ - "reserved0AF", /* 0xaf */ - "reserved0B0", /* 0xb0 */ - "reserved0B1", /* 0xb1 */ - "reserved0B2", /* 0xb2 */ - "reserved0B3", /* 0xb3 */ - "reserved0B4", /* 0xb4 */ - "reserved0B5", /* 0xb5 */ - "reserved0B6", /* 0xb6 */ - "reserved0B7", /* 0xb7 */ - "reserved0B8", /* 0xb8 */ - "reserved0B9", /* 0xb9 */ - "reserved0BA", /* 0xba */ - "reserved0BB", /* 0xbb */ - "reserved0BC", /* 0xbc */ - "reserved0BD", /* 0xbd */ - "reserved0BE", /* 0xbe */ - "texChipSel", /* 0xbf */ - "textureMode", /* 0xc0 */ - "tLOD", /* 0xc1 */ - "tDetail", /* 0xc2 */ - "texBaseAddr", /* 0xc3 */ - "texBaseAddr1", /* 0xc4 */ - "texBaseAddr2", /* 0xc5 */ - "texBaseAddr38", /* 0xc6 */ - "trexInit0", /* 0xc7 */ - "trexInit1", /* 0xc8 */ - "nccTable0_0", /* 0xc9 */ - "nccTable0_1", /* 0xca */ - "nccTable0_2", /* 0xcb */ - "nccTable0_3", /* 0xcc */ - "nccTable0_4", /* 0xcd */ - "nccTable0_5", /* 0xce */ - "nccTable0_6", /* 0xcf */ - "nccTable0_7", /* 0xd0 */ - "nccTable0_8", /* 0xd1 */ - "nccTable0_9", /* 0xd2 */ - "nccTable0_A", /* 0xd3 */ - "nccTable0_B", /* 0xd4 */ - "nccTable1_0", /* 0xd5 */ - "nccTable1_1", /* 0xd6 */ - "nccTable1_2", /* 0xd7 */ - "nccTable1_3", /* 0xd8 */ - "nccTable1_4", /* 0xd9 */ - "nccTable1_5", /* 0xda */ - "nccTable1_6", /* 0xdb */ - "nccTable1_7", /* 0xdc */ - "nccTable1_8", /* 0xdd */ - "nccTable1_9", /* 0xde */ - "nccTable1_A", /* 0xdf */ - "nccTable1_B", /* 0xe0 */ - "reserved0E1", /* 0xe1 */ - "reserved0E2", /* 0xe2 */ - "reserved0E3", /* 0xe3 */ - "reserved0E4", /* 0xe4 */ - "reserved0E5", /* 0xe5 */ - "reserved0E6", /* 0xe6 */ - "reserved0E7", /* 0xe7 */ - "reserved0E8", /* 0xe8 */ - "reserved0E9", /* 0xe9 */ - "reserved0EA", /* 0xea */ - "reserved0EB", /* 0xeb */ - "reserved0EC", /* 0xec */ - "reserved0ED", /* 0xed */ - "reserved0EE", /* 0xee */ - "reserved0EF", /* 0xef */ - "reserved0F0", /* 0xf0 */ - "reserved0F1", /* 0xf1 */ - "reserved0F2", /* 0xf2 */ - "reserved0F3", /* 0xf3 */ - "reserved0F4", /* 0xf4 */ - "reserved0F5", /* 0xf5 */ - "reserved0F6", /* 0xf6 */ - "reserved0F7", /* 0xf7 */ - "reserved0F8", /* 0xf8 */ - "reserved0F9", /* 0xf9 */ - "reserved0FA", /* 0xfa */ - "reserved0FB", /* 0xfb */ - "reserved0FC", /* 0xfc */ - "reserved0FD", /* 0xfd */ - "reserved0FE", /* 0xfe */ - "reserved0FF" /* 0xff */ -}; - -/*--------------------------------------------------------------------------- -** _grDebugGroupWriteHeader -*/ -#if defined(GDBG_INFO_ON) && (GLIDE_PLATFORM & GLIDE_HW_SST96) -void -_grDebugGroupWriteHeader(FxU32 header, FxU32 address) -{ -#define FN_NAME "_grDebugGroupWriteHeader" - GR_DCL_GC; - FxU32 - offset, - /* laddress, - * chipField, */ - lheader = header; - int - index, - nBits = 0; - - GR_ASSERT(address & GWH_ENABLE_BIT); - - GDBG_INFO((128, "New Group Write Packet ======================\n")); - GDBG_INFO((128, "Address: 0x%x\n", address)); - GDBG_INFO((128, "Header: 0x%x\n", header)); - GDBG_INFO((128, "PCI Address: 0x%x\n", (address & 0xfffff) << 2)); - GDBG_INFO((128, "Chip Field: 0x%x\n", (address >> 14) & 0xf)); - - offset = (address & ~(0xf << 14)) & 0xfffff; - index = offset; - - if (offset < 0x100 ) { /* It's state or triangle */ - - GDBG_INFO((128, "Start: 0x%s (0x%x)\n", regNames[index], index)); - GDBG_INFO((128, "Mask: 0x%x\n", header)); - - while (lheader) { - if (lheader & 0x1) { - nBits++; - GDBG_INFO((128, "Includes:\t%s (0x%x)\n", - regNames[index], index)); - } - lheader >>= 1; - index++; - } - } else if (offset >= 0x10000) { /* It's texture */ - GDBG_INFO((128, "Mask: 0x%x\n", header)); - GDBG_INFO((128, "TEXTURE\n")); - do { - if (lheader & 0x1) - nBits++; - } while (lheader >>=1 ); - } else { /* WTF? */ - GDBG_INFO((128, "Group Write Header:\t????\n")); - nBits = 1; - } - - GDBG_INFO((128, "%s: %d bits of mask 0x%x were set\n", FN_NAME, - nBits, header)); - - GR_ASSERT(nBits); - -#undef FN_NAME -} /* _grDebugGroupWriteHeader */ -#endif /* (GDBG_INFO_ON & (GLIDE_PLATFORM & GLIDE_HW_SST96)) */ - -void -_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 - index = GEN_INDEX(addr); - char - *regName; - - regName = (index <= 0xff) ? regNames[index] : "TRAM"; - - if (index <= 0xff) { - GDBG_INFO((120, "Storing to FIFO:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: 0x%x\n", val)); - GDBG_INFO((120, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tSince Fence: 0x%x\n", gc->hwDep.sst96Dep.writesSinceFence)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } -} /* _grFifoWriteDebug */ - -void -_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr) -{ - GR_DCL_GC; - FxU32 - index = GEN_INDEX(addr); - char - *regName; - - if (index <= 0xff) { - - regName = regNames[index]; - - GDBG_INFO((120, "Storing to FIFO:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: %4.2f\n", val)); - GDBG_INFO((120, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } else { - GDBG_INFO((195, "Storing to FIFO:\n")); - GDBG_INFO((195, "\tTEX Addr: 0x%x\n", index)); - GDBG_INFO((195, "\tTexel: %4.2f\n", val)); - GDBG_INFO((195, "\tFIFO Ptr: 0x%x\n", fifoPtr)); - GDBG_INFO((120, "\tFIFO Test: 0x%x\n", gc->fifoData.hwDep.vg96FIFOData.fifoSize)); - } -} /* _grFifoFWriteDebug */ - - -/*-------------------------------------------------------------------------- -** _grSst96PCIFifoEmpty -*/ -FxBool -_grSst96PCIFifoEmpty() { - GR_DCL_GC; - GR_DCL_HW; - - int - count = 0; - -#define COUNT_PATIENCE_VALUE 100000000 -#define SST96_PCI_FIFO_EMPTY(a) ((((a->status) & 0x3f00) >> 8) == 0x3f) - for (;;) { - if (SST96_PCI_FIFO_EMPTY(hw)) - return FXTRUE; - - if (!(++count % COUNT_PATIENCE_VALUE)) { - GDBG_INFO((120, "Losing Patients after %d tries\n", COUNT_PATIENCE_VALUE)); - break; - } - } - return FXFALSE; -} /* _grSst96PCIFifoEmpty */ - - -FxU32 -*sstGlobal(void); - -void GR_CDECL -_grSst96FifoMakeRoom(void) -{ - GR_DCL_GC; -#ifdef SST96_ALT_FIFO_WRAP - /* NB: W/ the alternate fifo wrapping stuff on only the asm - * tri-setup uses this routine. - */ - gc->fifoData.hwDep.vg96FIFOData.blockSize = _GlideRoot.curTriSize; -#endif - - /* Wrap Fifo now if triangle is going to incur a wrap */ - initWrapFIFO(&gc->fifoData); -} /* _grSst96FifoMakeRoom */ - -/*-------------------------------------------------------------------------- -** _grSst96Load32 -*/ -FxU32 -_grSst96Load32(FxU32 *s) { - GR_DCL_GC; - FxU32 - index, /* index into reg name list */ - regVal; - char - *regName; - - regVal = *s; - - index = GEN_INDEX(s); - - if (index <= 0xff) { - regName = regNames[index]; - GDBG_INFO((120, "Direct Register Read:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tReg Val: 0x%x\n", regVal)); - } - - return regVal; - -} /* _grSst96Load32 */ - - -/*--------------------------------------------------------------------------- -** _gr96SstStore32 -*/ -void -_grSst96Store32(FxU32 *d, FxU32 s) { - GR_DCL_GC; - -#ifdef SST96_FIFO - GLIDE_FIFO_CHECK(); - { - FxI32 fifoSize = gc->fifoData.hwDep.vg96FIFOData.fifoSize - 8; - if (fifoSize < 0) { -#if SST96_ALT_FIFO_WRAP - gc->fifoData.hwDep.vg96FIFOData.blockSize = (sizeof(FxU32) << 1); - initWrapFIFO(&gc->fifoData); -#else - _grSst96FifoMakeRoom(); -#endif - } - } - - SST96_STORE_FIFO( d, s ); - GLIDE_FIFO_CHECK(); -#else /* !SST96_FIFO */ - FxU32 - index; /* Index into reg name list */ - char - *regName; - - index = GEN_INDEX(d); - - if (index <= 0xff) { - regName = (index <= 0xff) ? regNames[index] : "TRAM"; - GDBG_INFO((120, "Direct Rester Write:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: 0x%x\n", s)); - } - - if (_grSst96PCIFifoEmpty() == FXFALSE) { - GDBG_INFO((120, "ERROR: Fifo didn't empty\n")); - } - - *d = s; -#endif /* !SST96_FIFO */ -} /* _gr96SstStore32 */ - -/*--------------------------------------------------------------------------- -** _grSst96Store32F -*/ -void -_grSst96Store32F(float *d, float s) { -#ifdef SST96_FIFO - GLIDE_FIFO_CHECK(); -#else - FxU32 - index; /* Offset into reg name array */ - char - *regName; /* Name of register */ - - index = GEN_INDEX(d); - - if (index <= 0xff) { - regName = regNames[index]; - GDBG_INFO((120, "Direct Register Write:\n")); - GDBG_INFO((120, "\tReg Name: %s\n", regName)); - GDBG_INFO((120, "\tReg Num: 0x%x\n", index)); - GDBG_INFO((120, "\tValue: %4.4f\n", s)); - } - *d = s; - - if (_grSst96PCIFifoEmpty() == FXFALSE) { - GDBG_INFO((120, "ERROR: Fifo didn't empty\n")); - } -#endif -} /* _grSst96Store32F */ - -/*--------------------------------------------------------------------------- -** _grSst96Store16 -*/ -void -_grSst96Store16(FxU16 *d, FxU16 s) { - FxU32 dummy; - - dummy = (FxU32) s; - _grSst96Store32((FxU32 *) d, dummy); -} /* _grSst96Store16 */ - -#undef GETINDEX -#undef GETREADADDR -#undef GR_GET -#define GR_GET(s) *(GETREADADDR(s)) -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) hw) + 0x400000)) >> 2) -#define GETREADADDR(s) ((FxU32 *) (((FxU32) hw) + (GETINDEX(s) <<12))) - -#define STATUS_MEMFIFOERR FXBIT(15) -#define STATUS_CMDFIFOERR FXBIT(14) - -#define FIFO_TOP_BYTES(a) ((((a) >> 11) & 0x3ff) << 12) -#define FIFO_BOT_BYTES(a) ((((a) >> 1) & 0x3ff) << 12) -#define FIFO_RD_BYTES(a) (((a) << 3) & 0x7ffff) - -/*--------------------------------------------------------------------------- -** _grSst96CheckFifoData -*/ -void -_grSst96CheckFifoData() -{ -#define FN_NAME "_grSst96CheckFifoData" - GR_DCL_GC; - GR_DCL_HW; - - FxU32 - /* Data for error checking */ - fifoStartGC, /* GC's idea of FIFO bottom */ - fifoStartHW, /* Jr's idea of FIFO bbottom */ - fifoWrPtrGC, /* GC's idea of write pointer */ - fifoRdPtrHW, /* Jr's idea of read pointer */ - fifoTopHW, /* Jr's idea of top of FIFO */ - /* Register contents */ - status, - fbiJrInit3, - fbiJrInit4, - fbiJrInit5; - - FxBool - error = FXFALSE; - - if (!gc->open) return; - - /* - ** Get the relavent data from the GC and from Jr. - */ - - /* Jr. */ - status = GR_GET(hw->status); - fbiJrInit3 = GR_GET(hw->fbijrInit3); - fbiJrInit4 = GR_GET(hw->fbijrInit4); - fbiJrInit5 = GR_GET(hw->fbijrInit5); - - /* GC */ - fifoStartGC = (FxU32) gc->fifoData.hwDep.vg96FIFOData.fifoVirt - (FxU32) gc->base_ptr; - fifoWrPtrGC = (FxU32) gc->fifoData.hwDep.vg96FIFOData.fifoPtr - (FxU32) gc->base_ptr; - - /* Deduce relevant data from registers */ - fifoStartHW = FIFO_BOT_BYTES(fbiJrInit3); - fifoTopHW = FIFO_TOP_BYTES(fbiJrInit3) + 0x1000; - fifoRdPtrHW = FIFO_RD_BYTES(fbiJrInit5); - - /* - ** Perform Error Checking - */ - - /* Check for errors indicated in status bits */ - if (status & STATUS_MEMFIFOERR) { - GDBG_PRINTF(("FIFO ERROR: Status 0x%x indicates MEMFIFO error!\n", status)); - error = FXTRUE; - } - - if (status & STATUS_CMDFIFOERR) { - GDBG_PRINTF(("FIFO ERROR: Status 0x%x indicates CMDFIFO error\n")); - error = FXTRUE; - } - - /* Check for proper concept of FIFO bottom */ - if (fifoStartGC != fifoStartHW) { - GDBG_PRINTF(("FIFO_ERROR: fbijrInit3 0x%x: FIFO Bottom 0x%x != 0x%x\n", - fbiJrInit3, fifoStartGC, fifoStartHW)); - error = FXTRUE; - } - - /* Check for write past end of FIFO */ - if (fifoWrPtrGC > fifoTopHW) { - GDBG_PRINTF(("FIFO ERROR: Top of FIFO: 0x%x, Write Ptr: 0x%x\n", - fifoTopHW, fifoWrPtrGC)); - error = FXTRUE; - } - - if ((fbiJrInit4 > (FxU32)gc->fifoData.hwDep.vg96FIFOData.fifoMax) || - (fbiJrInit4 >= 0x10000UL)) { - GDBG_PRINTF(("FIFO Error: Entry count overflow: 0x%X 0x%X\n", - fbiJrInit4, gc->fifoData.hwDep.vg96FIFOData.fifoMax)); - error = FXTRUE; - } - - if (error) { - GrErrorCallback("FATAL FIFO ERROR (See above)\n", FXTRUE); - } - -#undef FN_NAME -} /* _grSst96CheckFifoData */ - -#endif /* (GLIDE_PLATFORM & GLIDE_HW_SST96) */ diff --git a/glide2x/sst1/glide/src/xdraw.S b/glide2x/sst1/glide/src/xdraw.S deleted file mode 100644 index 8b87294..0000000 --- a/glide2x/sst1/glide/src/xdraw.S +++ /dev/null @@ -1,695 +0,0 @@ -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Header$ -# $Log$ -# Revision 1.2 1999/12/11 00:41:48 joseph -# Changed \(.data) to .section .data to fix build errors with binutils 2.9.5. -# -# Revision 1.1.1.1 1999/12/07 21:48:55 joseph -# Initial checkin into SourceForge. -# -# -# 15 3/04/97 9:10p Dow -# Neutered mutiplatform multiheaded monster. -# -# 14 2/26/97 11:58a Jdt -# Fixed stack bug -# -# 13 2/19/97 4:42p Dow -# Fixed debug build for Watcom -# -# 12 1/18/97 11:50p Dow -# Added support for GMT's register debugging -# -# 11 12/23/96 1:37p Dow -# chagnes for multiplatform glide -# -# 10 11/15/96 5:11p Jdt -# SST-96 exclusion -# -# - -# This used to be xdraw.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -# This is a GASP input file - -.file "xdraw.s" -# OPTION OLDSTRUCTS -# .586P - -# EXTRN _GlideRoot:DWORD -# EXTRN _grSpinFifo:NEAR - -# some useful floating load and store macros -# flds TEXTEQU -# fsubs TEXTEQU -# fmuls TEXTEQU - - .align 4 -.section .data -One .DATA 0x03f800000 -Area .DATA 0 -dxAB .DATA 0 -dxBC .DATA 0 -dyAB .DATA 0 -dyBC .DATA 0 -culltest .DATA 0 -P6FenceVar .DATA 0 -DBG .DATA 0 - -zArea .EQU One+04 -zdxAB .EQU One+8 -zdxBC .EQU One+12 -zdyAB .EQU One+16 -zdyBC .EQU One+20 -zculltest .EQU One+24 - -## Some useful SST-1 offsets -.INCLUDE "fxgasm.h" - -# enables/disables trisProcessed and trisDrawn counters -STATS .ASSIGNA 1 - -#-------------------------------------------------------------------------- -## Macro for P6 Fencing operation -## Note that this destroys eax, but if you do 2 fences eax will be -## restored -.AIF \&GLIDE_DEBUG EQ 1 -# EXTRN _grFence:NEAR - -.MACRO P6Fence - push %eax - push %ecx - push %edx - call _grFence - pop %edx - pop %ecx - pop %eax - xchgl %eax, P6FenceVar -.ENDM -.AELSE -.MACRO P6Fence - xchg %eax, P6FenceVar -.ENDM -.AENDI # GLIDE_DEBUG - -.AIF \&GLIDE_HARDWARE EQ 1 -.AIF \&GLIDE_DEBUG EQ 1 - -#EXTRN _GR_SET:NEAR -#EXTRN _GR_SETF:NEAR - -.AENDI # GLIDE_DEBUG - -.MACRO GR_SET hw offset value -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - push \value - lea \offset (\hw),%eax - push %eax - call _GR_SET - add $8, %esp - - pop %edx - pop %ecx - pop %eax -.AENDI # GLIDE_DEBUG - movl \value, \offset (\hw) -.ENDM - -.MACRO GR_SETF_P hw offset -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - fstl -4(%esp) - sub $4, %esp - lea \offset (\hw),%eax - push %eax - call _GR_SETF - add $8, %esp - - pop %edx - pop %ecx - pop %eax -.AENDI # GLIDE_DEBUG - fstps \offset (\hw) -.ENDM - -.AENDI # GLIDE_HARDWARE - -#-------------------------------------------------------------------------- -# Arguments (STKOFF = 16 from 4 pushes) -.AIF \&GLIDE_DEBUG EQ 1 -STKOFF .EQU 16 -.AELSE -STKOFF .EQU 16 -.AENDI -_va$ .EQU 4 + STKOFF -_vb$ .EQU 8 + STKOFF -_vc$ .EQU 12 + STKOFF - -X .EQU 0 -Y .EQU 4 - -fa .REG (%eax) # vtx a from caller -fb .REG (%ebx) # vtx b from caller -fc .REG (%ecx) # vtx c from caller - # edx is used as index, loading from *src -gc .REG (%esi) # points to graphics context -dlp .REG (%esi) # points to dataList structure -hw .REG (%edi) # points to the hardware - -tmpx .REG (%edx) # temp X storage -i .REG (%edx) # i = dlp->i -tmpy .REG (%ebp) # temp Y storage - -#-------------------------------------------------------------------------- -.text - .align 16 - -.AIF \&GLIDE_DEBUG EQ 0 -.globl grDrawTriangle - .type grDrawTriangle, @function -grDrawTriangle: -.AENDI -.globl grDrawTriangle_asm - .type grDrawTriangle_asm, @function -grDrawTriangle_asm: - -# FALL THRU to _trisetup - -#-------------------------------------------------------------------------- -# -# _trisetup_asm - do triangle setup & send down draw command -# -# USAGE: -# -# -.globl _trisetup_asm - .type _trisetup_asm, @function -_trisetup_asm: -# .code -# 28 - # save ebx, esi, edi, ebp - push %ebx - push %esi - - push %edi - push %ebp - -#vertex sorting is done as follows: -# 1. First, load the y values of vtx a, b, c into integer registers -# -# This is done in the segment vertex_load below. -# -# Note that this trashes the pointers, we will reload them later -# -# If any of the y values is negative, convert to a pseudo-2s complement -# form by xor'ing with 7fffffff. This lets us use 2's complement integer -# comparisons for floating point comparisons. -# -# 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -# a.y <= b.y <= c.y. -# -# Note that fa, fb, fc registers point once more to vertex structs, -# though not necessarily in the order that the application passes it to -# this routine. -# -# This is done in the segment vertex_y_sort below, with many many -# compare/branches. -# -# All the compare/branches converge to sst_load_xy_regs. -# -# 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -# and Fc. Done in the segment sst_load_xy_regs. -# -# 4. Restore fa, fb, fc to the user's order. Also save the vertex -# with lowest y value on the stack, this will be used later for -# loading parameter values into the SST regs. -# -####### - - -#-------------------------------------------------------------------------- - mov _va$(%esp), fa # 1 - mov _vb$(%esp), fb - mov _vc$(%esp), fc - movl (_GlideRoot+trisProcessed), tmpy # _GlideRoot.stats.trisProcessed++# -# 36-3 -vertex_y_load: - mov Y(fa), fa # 2 - mov Y(fb), fb - cmp $0, fa # 3 - jge a_positive - xor $0x7fffffff, fa -.align 4 -a_positive: - cmp $0, fb # 4 - jge b_positive - xor $0x7fffffff, fb -.align 4 -b_positive: - mov Y(fc), fc # 5 - movl (_GlideRoot+curGC), gc - cmp $0, fc # 6 - jge c_positive - xor $0x7fffffff, fc -c_positive: -# 42-3 -# 24-30 with direct fall-thru -# jmp ret_pop0f -#-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fb, fa # if (ay < by) { - jge AgtB - cmp fc, fb # if (by > cy) { - jle abc - cmp fc, fa # if (ay < cy) { - jge cab - -acb: # acb - mov _va$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vc$(%esp), fb - mov _vb$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -cab: # cab - mov _vc$(%esp), fa # fa = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb # fb = &va->x - mov _vb$(%esp), fc # fc = &vb->x - # HOLE - jmp Area_Computation - -.align 4 -abc: # abc - mov _va$(%esp), fa # fa = &va->x - mov _vb$(%esp), fb # fb = &vb->x - mov _vc$(%esp), fc # fc = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - # HOLE - jmp Area_Computation - -.align 4 -AgtB: # } else { - cmp fc, fb # if (by < cy) - jge cba - cmp fc, fa # if (ay < cy) - jge bca -bac: # bac - mov _vb$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb - mov _vc$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -cba: # cba - mov _vc$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vb$(%esp), fb - mov _va$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp Area_Computation - -.align 4 -bca: # bca - mov _vb$(%esp), fa - mov _vc$(%esp), fb - mov _va$(%esp), fc - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode -#-------------------------------------------------------------------------- -.align 4 -Area_Computation: -# 47-3 -# jmp ret_pop0f - flds X(fa) # xa - fsubs X(fb) # dxAB - flds X(fb) # | xb - fsubs X(fc) # | dxBC - flds Y(fb) # | | yb - fsubs Y(fc) # | | dyBC - flds Y(fa) # | | | ya - fsubs Y(fb) # | | | dyAB - fld %st(3) # | | | | dxAB - fmul %st(2), %st # | | | | t0 t0=dxAB*dyBC - fld %st(3) # | | | | | dxBC - fmul %st(2), %st # | | | | | t1 t1=dxBC*dyAB - mov fifoFree(gc), hw # load gc->state.fifoFree -.AIF \&STATS EQ 1 - inc tmpy # _GlideRoot.stats.trisProcessed++# - mov tmpy, (_GlideRoot+trisProcessed) -.AENDI - mov (_GlideRoot+curTriSize), tmpy # load _GlideRoot.curTriSize -# 69-12 - # dxAB dxBC dyBC dyAB t0 t1 - fsubrp %st, %st(1) # | | | | area - - sub tmpy, hw # fifoFree = gc->fifoFree - gc->curTriSize# - jge nostall # if (fifoFree < 0) - push %eax - push %ecx - push %edx - push tmpy - call _grSpinFifo # fifoFree = grSpinFifo(gc->curTriSize)# - add $4, %esp - mov %eax, hw # fifoFree = ... - pop %edx - pop %ecx - pop %eax -nostall: -# 52 with direct fall thru -# jmp ret_pop5f #==============<<<<<<<================== - mov hw, fifoFree(gc) # gc->fifoFree = fifoFree# - fsts zArea # 2 clocks for fst - mov reg_ptr(gc), hw # hw = gc->reg_ptr - mov zArea, tmpy # j = *(long *)&area - add $0x00200000, hw # hw = SST_WRAP(hw,128) - and $0x7fffffff, tmpy # if ((j & 0x7FFFFFFF) == 0) - jz zero_area -# 76-13 zero area (gbench -tZ) -# 57 with directy fall thru - -#-------------------------------------------------------------------------- - fdivrs One # ooa = 1.0f / area# takes 20-38 clks -Cull_by_area_sign: - sal $31, tmpx # culltest<<31 - mov cull_mode(gc), tmpy # load gc->state.cull_mode - test tmpy, tmpy # if (gc->state.cull_mode #= GR_CULL_DISABLE) - je nocull1 - # culling ENABLED - mov zArea, tmpy # reload area - xor tmpx, tmpy # if (j ^ (culltest<<31)) - jge backfaced - -.align 4 -nocull1: # culling DISABLED - mov X(fa), tmpx # load fa[X] - mov Y(fa), tmpy # load fa[Y] - GR_SET hw,FVAX, tmpx - # GR_SETF( hw->FvA.x, fa[X] ) - GR_SET hw,FVAY, tmpy - # GR_SETF( hw->FvA.y, fa[Y] ) - mov X(fb), tmpx # load fb[X] - mov Y(fb), tmpy # load fb[Y] - GR_SET hw,FVBX,tmpx - # GR_SETF( hw->FvB.x, fb[X] ) - GR_SET hw,FVBY,tmpy - # GR_SETF( hw->FvB.y, fb[Y] ) - mov X(fc), tmpx # load fc[X] - mov Y(fc), tmpy # load fc[Y] - GR_SET hw,FVCX,tmpx - # GR_SETF( hw->FvC.x, fc[X] ) - GR_SET hw,FVCY,tmpy - # GR_SETF( hw->FvC.y, fc[Y] ) - - mov dataList(gc), i # i = gc->datalist[0]->i - add $ dataList, dlp # dlp = gc->dataList -# 96-13 - test i, i # while (i) early out test - je no_interpolation -# 99-13 flat shaded (gbench -t) -# jmp ret_pop5f #==============<<<<<<<================== - -# dxBC *= ooa# -# dyAB *= ooa# -# dxAB *= ooa# -# dyBC *= ooa# -merge1: # Stack looks like - # dxAB dxBC dyBC dyAB ooa - fmul %st, %st(4) # DXAB | | | | - fmul %st, %st(3) # | DXBC | | | - fmul %st, %st(2) # | | DYBC | | - fmulp %st, %st(1) # | | | DYAB - fxch %st(3) # DYAB | | DXAB -# 105-12 - fstps zdxAB # | | DYBC - fstps zdyBC # | DXBC - fstps zdxBC # DYAB - fstps zdyAB # -# 112-3 -# jmp ret_pop0f - -# NOTE: we know i>0 since we checked for that up above -# so we fall right into the parameter gradient compute loop -################################### -# -# dpdx = dpAB * dyBC - dpBC * dyAB -# dpdy = dpBC * dxAB - dpAB * dxBC -# -# dpAB.dyBC = p0x -# dpBC.dyAB = p1x -# dpBC.dxAB = p0y -# dpAB.dxBC = p1y -# -# This piece uses eax, ebx, ecx, edx, edi, esi, ebp, -# -.align 4 -next_parm: - mov dl_addr(dlp), hw # fp = dlp->addr - mov (fa, i), tmpy # tmpy = fa[i] -# IF 1 - test $1, i # if (i & 1) { - je no_packer_fix - test $2, i # if (i & 2) - je no_p6_1 - P6Fence - # if (i & 2) P6FENCE - -no_p6_1: - GR_SET hw,0,$0 - # GR_SETF( *fp, 0.0f )# - je no_p6_2 - P6Fence - # if (i & 2) P6FENCE -no_p6_2: - add $ SIZEOF_dataList, dlp # dlp++# - mov dl_i(dlp, SIZEOF_dataList), i # i = dlp[1]->i - test i,i # while (i) - jne next_parm - mov dl_i(dlp, SIZEOF_dataList), tmpy # tmpy = dlp[1]->i # preload next i - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ - jmp dotri -# ENDIF -.align 4 -no_packer_fix: # dpAB dpBC - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - GR_SET hw,0,tmpy - # | | | | - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st, %st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st, %st(1) # | dpdy - fxch %st(1) # dpdy dpdx - add $ SIZEOF_dataList, dlp # dlp++ - mov dl_i(dlp, SIZEOF_dataList), i # i = dlp[1]->i - GR_SETF_P hw,FDPDX_OFFSET - # | - GR_SETF_P hw,FDPDY_OFFSET - - # empty - test i,i # while (i) - jne next_parm # - - mov dl_i(dlp, SIZEOF_dataList), tmpy # tmpy = dlp[1]->i - for the sake of a fall-thru - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ -.align 4 -# -# fell through - this means we're done with differentials -# note: i is preloaded with next token -# write area, pop fp stack, pop stack, return -dotri: - add $ SIZEOF_dataList, dlp # dlp++ - mov dl_addr(dlp), hw # fp = dlp->addr -# mov dl_addr(dlp, SIZEOF_dataList), hw # fp = dlp[1]->addr -.AIF \&STATS EQ 1 - inc fa # _GlideRoot.stats.trisDrawn++ - movl fa, (_GlideRoot+trisDrawn) -.AENDI - mov zArea, tmpx - - - test $2, tmpy # if (i & 2) - je no_p6_3 - P6Fence - # if (i & 2) P6FENCE - -no_p6_3: - GR_SET hw,0,tmpx - # GR_SET( hw->FtriangleCMD, area )# - je no_p6_4 - P6Fence - # if (i & 2) P6FENCE -no_p6_4: - - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - -#----------------------------------------------------------------------------- -# We get here if there is no interpolation to be done. Just set area to -# draw the triangle. Unload fp stack, stack, return. -.align 4 -no_interpolation: - mov zArea, tmpx # reload area - mov dl_i(dlp, SIZEOF_dataList), tmpy # load up the CPU Type - and $2, tmpy # Check for P6 - je nofence1 - P6Fence - # Fence off the triangleCmd - nop -.align 4 -nofence1: - GR_SET hw,FTRIANGLECMD,tmpx - # hit the triangleCmd - je nofence2 - P6Fence - # Fence off the triangleCmd - nop -.align 4 -nofence2: - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) -.AIF \&STATS EQ 1 - movl (_GlideRoot+trisDrawn), fa # _GlideRoot.stats.trisDrawn++ -.AENDI - pop %ebp -.AIF \&STATS EQ 1 - inc fa # _GlideRoot.stats.trisDrawn++ - movl fa, (_GlideRoot+trisDrawn) -.AENDI - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangles drawn) - ret - -# These labels should only be jumped to when we are trying to rigorously -# measure times. Screwing up the floating point stack costs many clocks, -# so we want to jump to the place where only the correct number of FSTPs are -# executed. - -.align 4 -backfaced: - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - fstp %st(0) - mov $0x0ffffffff, %eax # return -1 (backface culled) - pop %ebp - pop %edi - pop %esi - pop %ebx - ret - -ret_pop6f: - fstp %st(0) - -.align 4 -zero_area: -# If triangle area is zero, nothing to do... -# but unload fp stack and then pop the stack, and return. - -ret_pop5f: # dyBC dyAB dxBC dxAB area - fstp %st(0) -ret_pop4f: - fstp %st(0) -ret_pop3f: - fstp %st(0) -ret_pop2f: - fstp %st(0) -ret_pop1f: - fstp %st(0) -ret_pop0f: - mov $0, %eax # return 0 (triangles drawn) - pop %ebp - pop %edi - pop %esi - pop %ebx - ret -.L_end_tri_setup_asm: -.AIF \&GLIDE_DEBUG EQ 0 -.size grDrawTriangle,.L_end_tri_setup_asm-grDrawTriangle -.AENDI -.size grDrawTriangle_asm,.L_end_tri_setup_asm-grDrawTriangle_asm -.size _trisetup_asm,.L_end_tri_setup_asm-_trisetup_asm - -# [++++ from above] -# This comment was moved here to make the code in the loop more readable -# STALL HERE due to PCI write buffer being full on last instruction: -# The write to the packerHackAddress takes 3 bus clocks, during which -# we may not write to the PCI buffer without stalling. This causes -# the amount of clocks the workaround adds to the loop to vary in the -# following way++: -# -# CPU Bus/CPU Clock Total Bus Total Penalty -# Ratio* Clocks Since (add to later clocks) -#====================================================================== -# P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -# P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -# P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -# P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -# -# * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -# P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -# P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -# -#++ These calculations also assume that we NEVER get to continue a burst -# from having the next parameter be consecutive from the current one. -# If we did get that, then we have to add two more bus clocks to the -# penalty for the next write (labeled loop clock 10), so that looks like -# CPU Total Penalty -# ============================================ -# P55c-200/P5-180:(2 * 6) + 17 = 29 clocks## -# P5-166/P5-150: (2 * 5) + 12 = 22 clocks# -# P5-120: (2 * 4) + 9 = 17 clocks# -# P5-100/P5-90 (2 * 3) + 6 = 12 clocks -# - -#_TEXT ENDS -.END diff --git a/glide2x/sst1/glide/src/xdraw.asm b/glide2x/sst1/glide/src/xdraw.asm deleted file mode 100644 index 4e8f654..0000000 --- a/glide2x/sst1/glide/src/xdraw.asm +++ /dev/null @@ -1,656 +0,0 @@ -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Log$ -; -; 15 3/04/97 9:10p Dow -; Neutered mutiplatform multiheaded monster. -; -; 14 2/26/97 11:58a Jdt -; Fixed stack bug -; -; 13 2/19/97 4:42p Dow -; Fixed debug build for Watcom -; -; 12 1/18/97 11:50p Dow -; Added support for GMT's register debugging -; -; 11 12/23/96 1:37p Dow -; chagnes for multiplatform glide -; -; 10 11/15/96 5:11p Jdt -; SST-96 exclusion -;; -;; - -TITLE xdraw.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -EXTRN _GlideRoot:DWORD -EXTRN _grSpinFifo:NEAR - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - P6FenceVar DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Some useful SST-1 offsets -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -;;; Macro for P6 Fencing operation -;;; Note that this destroys eax, but if you do 2 fences eax will be restored -IFDEF GLIDE_DEBUG -EXTRN _grFence:NEAR - -P6Fence MACRO - pushd eax - push ecx - push edx - call _grFence - pop edx - pop ecx - pop eax - xchg eax, P6FenceVar -ENDM -ELSE -P6Fence MACRO - xchg eax, P6FenceVar -ENDM -ENDIF - -IFDEF GLIDE_HARDWARE -IFDEF GLIDE_DEBUG - -EXTRN _GR_SET:NEAR -EXTRN _GR_SETF:NEAR - -ENDIF - -GR_SET MACRO hw,offset,value -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - push value - lea eax,[hw + offset] - push eax - call _GR_SET - add esp,8 - - pop edx - pop ecx - pop eax -ENDIF - mov DWORD PTR [hw + offset], value -ENDM - -GR_SETF_P MACRO hw,foffset -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - fst DWORD PTR [esp-4] - sub esp,4 - lea eax,[hw + foffset] - push eax - call _GR_SETF - add esp,8 - - pop edx - pop ecx - pop eax -ENDIF - fstp DWORD PTR [hw + foffset] -ENDM - -ENDIF - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context -dlp TEXTEQU ; points to dataList structure -hw TEXTEQU ; points to the hardware - -tmpx TEXTEQU ; temp X storage -i TEXTEQU ; i = dlp->i -tmpy TEXTEQU ; temp Y storage - -_TEXT SEGMENT - -;-------------------------------------------------------------------------- - align 4 - PUBLIC grDrawTriangle_asm -grDrawTriangle_asm PROC NEAR - .code - -grDrawTriangle_asm ENDP - -; FALL THRU to _trisetup - -;-------------------------------------------------------------------------- -;; -;; _trisetup_asm - do triangle setup & send down draw command -;; -;; USAGE: -;; -;; - align 4 - PUBLIC _trisetup_asm@12 -_trisetup_asm@12 PROC NEAR - .code -; 28 - ; save ebx, esi, edi, ebp - push ebx - push esi - - push edi - push ebp - -;vertex sorting is done as follows: -; 1. First, load the y values of vtx a, b, c into integer registers -; -; This is done in the segment vertex_load below. -; -; Note that this trashes the pointers, we will reload them later -; -; If any of the y values is negative, convert to a pseudo-2's complement -; form by xor'ing with 7fffffff. This lets us use 2's complement integer -; comparisons for floating point comparisons. -; -; 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -; a.y <= b.y <= c.y. -; -; Note that fa, fb, fc registers point once more to vertex structs, -; though not necessarily in the order that the application passes it to -; this routine. -; -; This is done in the segment vertex_y_sort below, with many many -; compare/branches. -; -; All the compare/branches converge to sst_load_xy_regs. -; -; 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -; and Fc. Done in the segment sst_load_xy_regs. -; -; 4. Restore fa, fb, fc to the user's order. Also save the vertex -; with lowest y value on the stack, this will be used later for -; loading parameter values into the SST regs. -; -;;;;;;;;;;;;;; - - -;-------------------------------------------------------------------------- - mov fa, [esp + _va$] ; 1 - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - mov tmpy, [_GlideRoot + trisProcessed] ; _GlideRoot.stats.trisProcessed++; -; 36-3 -vertex_y_load: - mov fa, [fa + Y] ; 2 - mov fb, [fb + Y] - cmp fa, 0 ; 3 - jge a_positive - xor fa, 7fffffffh - align 4 -a_positive: - cmp fb, 0 ; 4 - jge b_positive - xor fb, 7fffffffh - align 4 -b_positive: - mov fc, [fc + Y] ; 5 - mov gc, [_GlideRoot + curGC] - cmp fc, 0 ; 6 - jge c_positive - xor fc, 7fffffffh -c_positive: -; 42-3 -; 24-30 with direct fall-thru -; jmp ret_pop0f -;-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fa, fb ; if (ay < by) { - jge AgtB - cmp fb, fc ; if (by > cy) { - jle abc - cmp fa, fc ; if (ay < cy) { - jge cab - - acb: ; acb - mov fa, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vc$] - mov fc, [esp + _vb$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cab: ; cab - mov fa, [esp + _vc$] ; fa = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] ; fb = &va->x - mov fc, [esp + _vb$] ; fc = &vb->x - ; HOLE - jmp Area_Computation - - align 4 - abc: ; abc - mov fa, [esp + _va$] ; fa = &va->x - mov fb, [esp + _vb$] ; fb = &vb->x - mov fc, [esp + _vc$] ; fc = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - ; HOLE - jmp Area_Computation - - align 4 - AgtB: ; } else { - cmp fb, fc ; if (by < cy) - jge cba - cmp fa, fc ; if (ay < cy) - jge bca - bac: ; bac - mov fa, [esp + _vb$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] - mov fc, [esp + _vc$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cba: ; cba - mov fa, [esp + _vc$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vb$] - mov fc, [esp + _va$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - bca: ; bca - mov fa, [esp + _vb$] - mov fb, [esp + _vc$] - mov fc, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode -;-------------------------------------------------------------------------- - align 4 -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - mov hw, [gc + fifoFree] ; load gc->state.fifoFree -IFDEF STATS - inc tmpy ; _GlideRoot.stats.trisProcessed++; - mov [_GlideRoot + trisProcessed], tmpy -ENDIF - mov tmpy, [_GlideRoot + curTriSize] ; load _GlideRoot.curTriSize -; 69-12 - ; dxAB dxBC dyBC dyAB t0 t1 - fsubp st(1),st ; | | | | area - sub hw,tmpy ; fifoFree = gc->fifoFree - gc->curTriSize; - jge nostall ; if (fifoFree < 0) - push eax - push ecx - push edx - push tmpy - call _grSpinFifo ; fifoFree = grSpinFifo(gc->curTriSize); - add esp,4 - mov hw, eax ; fifoFree = ... - pop edx - pop ecx - pop eax -nostall: -; 52 with direct fall thru -; jmp ret_pop5f ;==============<<<<<<<================== - mov [gc + fifoFree],hw ; gc->fifoFree = fifoFree; - fst zArea ; 2 clocks for fst - mov hw, [gc + reg_ptr ] ; hw = gc->reg_ptr - mov tmpy, zArea ; j = *(long *)&area - add hw, 00200000H ; hw = SST_WRAP(hw,128) - and tmpy, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz zero_area -; 76-13 zero area (gbench -tZ) -; 57 with directy fall thru - -;-------------------------------------------------------------------------- - fdivr One ; ooa = 1.0f / area; takes 20-38 clks -Cull_by_area_sign: - sal tmpx, 31 ; culltest<<31 - mov tmpy, [gc + cull_mode] ; load gc->state.cull_mode - test tmpy, tmpy ; if (gc->state.cull_mode != GR_CULL_DISABLE) - je nocull1 - ; culling ENABLED - mov tmpy, zArea ; reload area - xor tmpy,tmpx ; if (j ^ (culltest<<31)) - jge backfaced - - align 4 -nocull1: ; culling DISABLED - mov tmpx, [fa + X] ; load fa[X] - mov tmpy, [fa + Y] ; load fa[Y] - GR_SET hw,FVAX,tmpx ; GR_SETF( hw->FvA.x, fa[X] ) - GR_SET hw,FVAY,tmpy ; GR_SETF( hw->FvA.y, fa[Y] ) - mov tmpx, [fb + X] ; load fb[X] - mov tmpy, [fb + Y] ; load fb[Y] - GR_SET hw,FVBX,tmpx ; GR_SETF( hw->FvB.x, fb[X] ) - GR_SET hw,FVBY,tmpy ; GR_SETF( hw->FvB.y, fb[Y] ) - mov tmpx, [fc + X] ; load fc[X] - mov tmpy, [fc + Y] ; load fc[Y] - GR_SET hw,FVCX,tmpx ; GR_SETF( hw->FvC.x, fc[X] ) - GR_SET hw,FVCY,tmpy ; GR_SETF( hw->FvC.y, fc[Y] ) - - mov i, [gc+dataList] ; i = gc->datalist[0]->i - add dlp, dataList ; dlp = gc->dataList -; 96-13 - test i, i ; while (i) early out test - je no_interpolation -; 99-13 flat shaded (gbench -t) -; jmp ret_pop5f ;==============<<<<<<<================== - -; dxBC *= ooa; -; dyAB *= ooa; -; dxAB *= ooa; -; dyBC *= ooa; -merge1: ; Stack looks like - ; dxAB dxBC dyBC dyAB ooa - fmul st(4), st ; DXAB | | | | - fmul st(3), st ; | DXBC | | | - fmul st(2), st ; | | DYBC | | - fmulp st(1), st ; | | | DYAB - fxch st(3) ; DYAB | | DXAB -; 105-12 - fstp zdxAB ; | | DYBC - fstp zdyBC ; | DXBC - fstp zdxBC ; DYAB - fstp zdyAB ; -; 112-3 -; jmp ret_pop0f - -; NOTE: we know i>0 since we checked for that up above -; so we fall right into the parameter gradient compute loop -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; dpdx = dpAB * dyBC - dpBC * dyAB -; dpdy = dpBC * dxAB - dpAB * dxBC -; -; dpAB.dyBC = p0x -; dpBC.dyAB = p1x -; dpBC.dxAB = p0y -; dpAB.dxBC = p1y -;; -;; This piece uses eax, ebx, ecx, edx, edi, esi, ebp, -; - align 4 -next_parm: - mov hw, [dlp + dl_addr] ; fp = dlp->addr - mov tmpy, [fa + i] ; tmpy = fa[i] -IF 1 - test i,1 ; if (i & 1) { - je no_packer_fix - test i,2 ; if (i & 2) - je no_p6_1 - P6Fence ; if (i & 2) P6FENCE - - no_p6_1: - GR_SET hw,0,0 ; GR_SETF( *fp, 0.0f ); - je no_p6_2 - P6Fence ; if (i & 2) P6FENCE - no_p6_2: - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - test i,i ; while (i) - jne next_parm - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; tmpy = dlp[1]->i ; preload next i - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ - jmp dotri - - align 4 -no_packer_fix: ; dpAB dpBC -ENDIF - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - GR_SET hw,0,tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - GR_SETF_P hw,FDPDX_OFFSET ; | - GR_SETF_P hw,FDPDY_OFFSET ; empty - test i,i ; while (i) - jne next_parm ; - - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; tmpy = dlp[1]->i - for the sake of a fall-thru - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ - align 4 -; -; fell through - this means we're done with differentials -; note: i is preloaded with next token -; write area, pop fp stack, pop stack, return -dotri: - mov hw, [dlp + SIZEOF_dataList + dl_addr] ; fp = dlp[1]->addr -IFDEF STATS - inc fa ; _GlideRoot.stats.trisDrawn++ - mov [_GlideRoot + trisDrawn], fa -ENDIF - mov tmpx, zArea - - test tmpy,2 ; if (i & 2) - je no_p6_3 - P6Fence ; if (i & 2) P6FENCE - - no_p6_3: - GR_SET hw,0,tmpx ; GR_SET( hw->FtriangleCMD, area ); - je no_p6_4 - P6Fence ; if (i & 2) P6FENCE - no_p6_4: - - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - -;----------------------------------------------------------------------------- -;; We get here if there is no interpolation to be done. Just set area to -;; draw the triangle. Unload fp stack, stack, return. - align 4 -no_interpolation: - mov tmpx, zArea ; reload area - mov tmpy, [dlp + SIZEOF_dataList + dl_i] ; load up the CPU Type - and tmpy, 2 ; Check for P6 - je nofence1 - P6Fence ; Fence off the triangleCmd - nop - align 4 -nofence1: - GR_SET hw,FTRIANGLECMD,tmpx ; hit the triangleCmd - je nofence2 - P6Fence ; Fence off the triangleCmd - nop - align 4 -nofence2: - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) -IFDEF STATS - mov fa, [_GlideRoot + trisDrawn]; _GlideRoot.stats.trisDrawn++ -ENDIF - pop ebp -IFDEF STATS - inc fa ; _GlideRoot.stats.trisDrawn++ - mov [_GlideRoot + trisDrawn], fa -ENDIF - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangles drawn) - ret 12 - -; These labels should only be jumped to when we are trying to rigorously -; measure times. Screwing up the floating point stack costs many clocks, -; so we want to jump to the place where only the correct number of FSTPs are -; executed. - - align 4 -backfaced: - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - fstp st(0) - mov eax, 0ffffffffh ; return -1 (backface culled) - pop ebp - pop edi - pop esi - pop ebx - ret 12 - -ret_pop6f: - fstp st(0) - - align 4 -zero_area: -; If triangle area is zero, nothing to do... -; but unload fp stack and then pop the stack, and return. - -ret_pop5f: ; dyBC dyAB dxBC dxAB area - fstp st(0) -ret_pop4f: - fstp st(0) -ret_pop3f: - fstp st(0) -ret_pop2f: - fstp st(0) -ret_pop1f: - fstp st(0) -ret_pop0f: - mov eax, 0h ; return 0 (triangles drawn) - pop ebp - pop edi - pop esi - pop ebx - ret 12 - -_trisetup_asm@12 ENDP - -; [++++ from above] -; This comment was moved here to make the code in the loop more readable -; STALL HERE due to PCI write buffer being full on last instruction: -; The write to the packerHackAddress takes 3 bus clocks, during which -; we may not write to the PCI buffer without stalling. This causes -; the amount of clocks the workaround adds to the loop to vary in the -; following way++: -; -; CPU Bus/CPU Clock Total Bus Total Penalty -; Ratio* Clocks Since (add to later clocks) -;====================================================================== -; P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -; P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -; P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -; P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -; -; * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -; P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -; P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -; -;++ These calculations also assume that we NEVER get to continue a burst -; from having the next parameter be consecutive from the current one. -; If we did get that, then we have to add two more bus clocks to the -; penalty for the next write (labeled loop clock 10), so that looks like -; CPU Total Penalty -; ============================================ -; P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -; P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -; P5-120: (2 * 4) + 9 = 17 clocks! -; P5-100/P5-90 (2 * 3) + 6 = 12 clocks -; - -_TEXT ENDS -END diff --git a/glide2x/sst1/glide/src/xdraw96.S b/glide2x/sst1/glide/src/xdraw96.S deleted file mode 100644 index 42aa3f3..0000000 --- a/glide2x/sst1/glide/src/xdraw96.S +++ /dev/null @@ -1,713 +0,0 @@ -## THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -## PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -## TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -## INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -## DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -## THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -## EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -## FULL TEXT OF THE NON-WARRANTY PROVISIONS. -## -## USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -## RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -## TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -## AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -## SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -## THE UNITED STATES. -## -## COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -## -## $Header$ -## $Revision$ -## $Log$ -## Revision 1.1.1.1 1999/12/07 21:48:55 joseph -## Initial checkin into SourceForge. -## -# -# 2 7/07/97 2:14p Jdt -# assembly now on par with C code. -# -# 1 7/07/97 8:37a Jdt -# B4 Chip field fix. -## - -# This used to be xdraw96.s but I renamed it as a quick way to make it work -# with the shared 3dfx.mak - -.file "xdraw96.s" -#OPTION OLDSTRUCTS -#.586P - - - -#EXTRN _GlideRoot:DWORD -#EXTRN _grSpinFifo:NEAR -#EXTRN _grSst96FifoMakeRoom:NEAR - - -# some useful floating load and store macros -#flds TEXTEQU -#fsubs TEXTEQU -#fmuls TEXTEQU - -.align 4 -.section .data -One .DATA 0x03f800000 -Area .DATA 0 -dxAB .DATA 0 -dxBC .DATA 0 -dyAB .DATA 0 -dyBC .DATA 0 -culltest .DATA 0 -P6FenceVar .DATA 0 - -# Ugly, but seems to workaround the problem with locally defined -# data segment globals not getting relocated properly when using -# djgpp. - -zArea .EQU One+4 -zdxAB .EQU One+8 -zdxBC .EQU One+12 -zdyAB .EQU One+16 -zdyBC .EQU One+20 -zculltest .EQU One+24 - -### Some useful SST-1 offsets -.INCLUDE "fxgasm.h" - -## enables/disables trisProcessed and trisDrawn counters -STATS .ASSIGNA 1 - -#-------------------------------------------------------------------------- -### Macro for P6 Fencing operation -### Note that this destroys eax, but if you do 2 fences eax will be restored -#.AIF \&GLIDE_DEBUG EQ 1 -#EXTRN _GR_SET_GW_CMD:NEAR -#EXTRN _GR_SET_GW_HEADER:NEAR -#EXTRN _GR_SET_GW_ENTRY:NEAR -#.AENDI - -.MACRO GR_SET_GW_CMD addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_CMD - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_SET_GW_HEADER addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_HEADER - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_SET_GW_ENTRY addr offset data -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - push \data - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_ENTRY - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - mov \data, \offset (\addr) -.AENDI -.ENDM - -.MACRO GR_FSET_GW_ENTRY addr offset -.AIF \&GLIDE_DEBUG EQ 1 - push %eax - push %ecx - push %edx - sub $4, %esp - fstps (%esp) - lea \offset (\addr), %eax - push %eax - call _GR_SET_GW_ENTRY - add $8, %esp - pop %edx - pop %ecx - pop %eax -.AELSE - fstps \offset (\addr) -.AENDI -.ENDM - -#-------------------------------------------------------------------------- -# Arguments (STKOFF = 16 from 4 pushes) -.AIF \&GLIDE_DEBUG EQ 1 -STKOFF .EQU 16 -.AELSE -STKOFF .EQU 16 -.AENDI -_va$ .EQU 4 + STKOFF -_vb$ .EQU 8 + STKOFF -_vc$ .EQU 12 + STKOFF - -X .EQU 0 -Y .EQU 4 - -fa .REG (%eax) # vtx a from caller -fb .REG (%ebx) # vtx b from caller -fc .REG (%ecx) # vtx c from caller - # edx is used as index, loading from *src -gc .REG (%esi) # points to graphics context -dlp .REG (%esi) # points to dataList structure -hw .REG (%edi) # points to the hardware -fifo .REG (%edi) # points to next entry in fifo - -tmpx .REG (%edx) # temp X storage -i .REG (%edx) # i = dlp->i -tmpy .REG (%ebp) # temp Y storage - -.text -.align 4 - -#-------------------------------------------------------------------------- - -.AIF \&GLIDE_DEBUG EQ 0 -.globl grDrawTriangle -.type grDrawTriangle, @function -grDrawTriangle: -.AENDI -.globl grDrawTriangle_asm -.type grDrawTriangle_asm, @function -grDrawTriangle_asm: -# FALL THRU to _trisetup - - - - -#-------------------------------------------------------------------------- -## -## _trisetup_asm - do triangle setup & send down draw command -## -## USAGE: -## -## -.globl _trisetup_asm -.type _trisetup_asm, @function -_trisetup_asm: -# 28 - - - # save ebx, esi, edi, ebp - push %ebx - push %esi - - push %edi - push %ebp - -#vertex sorting is done as follows: -# 1 First, load the y values of vtx a, b, c into integer registers -# -# This is done in the segment vertex_load below. -# -# Note that this trashes the pointers, we will reload them later -# -# If any of the y values is negative, convert to a pseudo-2s complement -# form by xor'ing with 7fffffff. This lets us use 2s complement integer -# comparisons for floating point comparisons. -# -# 2 Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -# a.y <= b.y <= c.y. -# -# Note that fa, fb, fc registers point once more to vertex structs, -# though not necessarily in the order that the application passes it to -# this routine. -# -# This is done in the segment vertex_y_sort below, with many many -# compare/branches. -# -# All the compare/branches converge to sst_load_xy_regs. -# -# 3 Load the (x,y) values into the floating point SST registers for Fa, Fb, -# and Fc. Done in the segment sst_load_xy_regs. -# -# 4 Restore fa, fb, fc to the user's order. Also save the vertex -# with lowest y value on the stack, this will be used later for -# loading parameter values into the SST regs. -# -############## - - -#-------------------------------------------------------------------------- - - mov _va$(%esp), fa # 1 - mov _vb$(%esp), fb - mov _vc$(%esp), fc - movl (_GlideRoot+trisProcessed), tmpy # _GlideRoot.stats.trisProcessed++# -# 36-3 -.Lvertex_y_load: - mov Y(fa), fa # 2 - mov Y(fb), fb - cmp $0, fa # 3 - jge .La_positive - xor $0x7fffffff, fa -.align 4 -.La_positive: - cmp $0, fb # 4 - jge .Lb_positive - xor $0x7fffffff, fb -.align 4 -.Lb_positive: - mov Y(fc), fc # 5 - movl (_GlideRoot+curGC), gc - cmp $0, fc # 6 - jge .Lc_positive - xor $0x7fffffff, fc -.Lc_positive: -# 42-3 -# 24-30 with direct fall-thru -# jmp ret_pop0f -#-------------------------------------------------------------------------- -.Lvertex_y_sort: - - cmp fb, fa # if (ay < by) { - jge .LAgtB - cmp fc, fb # if (by > cy) { - jle .Labc - cmp fc, fa # if (ay < cy) { - jge .Lcab - -.Lacb: # acb - mov _va$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vc$(%esp), fb - mov _vb$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lcab: # cab - mov _vc$(%esp), fa # fa = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb # fb = &va->x - mov _vb$(%esp), fc # fc = &vb->x - # HOLE - jmp .LArea_Computation - -.align 4 -.Labc: # abc - mov _va$(%esp), fa # fa = &va->x - mov _vb$(%esp), fb # fb = &vb->x - mov _vc$(%esp), fc # fc = &vc->x - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - # HOLE - jmp .LArea_Computation - -.align 4 -.LAgtB: # } else { - cmp fc, fb # if (by < cy) - jge .Lcba - cmp fc, fa # if (ay < cy) - jge .Lbca -.Lbac: # bac - mov _vb$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _va$(%esp), fb - mov _vc$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lcba: # cba - mov _vc$(%esp), fa - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode - mov _vb$(%esp), fb - mov _va$(%esp), fc - xor $1, tmpx # culltest ^= 1 - jmp .LArea_Computation - -.align 4 -.Lbca: # bca - mov _vb$(%esp), fa - mov _vc$(%esp), fb - mov _va$(%esp), fc - mov cull_mode(gc), tmpx # culltest = gc->state.cull_mode -#-------------------------------------------------------------------------- -.align 4 -.LArea_Computation: -# 47-3 -# jmp ret_pop0f - flds X(fa) # xa - fsubs X(fb) # dxAB - fsts dxAB - flds X(fb) # | xb - fsubs X(fc) # | dxBC - fsts dxBC - flds Y(fb) # | | yb - fsubs Y(fc) # | | dyBC - fsts dyBC - flds Y(fa) # | | | ya - fsubs Y(fb) # | | | dyAB - fsts dyAB - fld %st(3) # | | | | dxAB - fsts Area - fmul %st(2), %st # | | | | t0 t0=dxAB*dyBC - fsts Area - fld %st(3) # | | | | | dxBC - fsts Area - fmul %st(2), %st # | | | | | t1 t1=dxBC*dyAB - fsts Area - fsubrp %st,%st(1) # | | | | area - - fsts zArea # | | | | area - - # Zero Area Triangle Check - mov zArea, tmpy # j = *(long *)&area - and $0x7fffffff,tmpy # if ((j & 0x7FFFFFFF) == 0) - jz .Lzero_area - - # Cull Check - sal $31, tmpx # culltest<<31 - mov cull_mode (gc), tmpy # load gc->state.cull_mode - test tmpy, tmpy # if (gc->state.cull_mode != GR_CULL_DISABLE) - je .Lnocull1 - # culling ENABLED - mov zArea, tmpy # reload area - xor tmpx, tmpy # if (j ^ (culltest<<31)) - jge .Lbackfaced - -.Lnocull1: # culling disabled - # OOA Calculation - fdivrs One # | | | | ooa - - # Fetch Fifo Ptr - mov fifoPtr(gc), fifo - - # P6 Check - mov (_GlideRoot+CPUType), tmpx - cmp $6, tmpx - - je .Lfence - -.align 4 -.LfenceDone: - # Wrap Check - mov (_GlideRoot+curTriSize), tmpx - mov fifoSize(gc), tmpy - - sub tmpx, tmpy - jl .Lwrap - -.align 4 -.LwrapDone: - mov tmpy, fifoSize(gc) - # Adjust Fifo Ptr - mov fifo, tmpy - add tmpx, tmpy - mov tmpy, fifoPtr(gc) - - # Begin Tri Packet - mov gwCommand(gc), tmpx - mov gwHeaders(gc), tmpy - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - # Download X, Y * 3 - mov X(fa), tmpx - mov Y(fa), tmpy - - GR_SET_GW_ENTRY fifo, 8, tmpx - GR_SET_GW_ENTRY fifo, 12, tmpy - - mov X(fb), tmpx - mov Y(fb), tmpy - - GR_SET_GW_ENTRY fifo, 16, tmpx - GR_SET_GW_ENTRY fifo, 20, tmpy - - mov X(fc), tmpx - mov Y(fc), tmpy - - GR_SET_GW_ENTRY fifo, 24, tmpx - GR_SET_GW_ENTRY fifo, 28, tmpy - - add $32, fifo - - mov dataList(gc), i # i = gc->datalist[0]->i - add $ dataList, dlp # dlp = gc->dataList - - # Early out for no interp - test i, i - je .Lno_interpolation - - # Setup for Parameter Calculator - # dxAB dxBC dyBC dyAB ooa - fmul %st, %st(4) # DXAB | | | | - fmul %st, %st(3) # | DXBC | | | - fmul %st, %st(2) # | | DYBC | | - fmulp %st, %st(1) # | | | DYAB - fxch %st(3) # DYAB | | DXAB - fstps zdxAB # | | DYBC - fstps zdyBC # | DXBC - fstps zdxBC # DYAB - fstps zdyAB # - - # Parameter Calculator -.align 4 -.Lnext_parm: - test $1, i - jnz .Lsecondary_packet - - mov (fa, i), tmpy # tmpy = fa[i] - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - # | | | | - GR_SET_GW_ENTRY fifo, 0, tmpy - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st, %st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st, %st(1) # | dpdy - fxch %st(1) # dpdy dpdx - mov dl_i + SIZEOF_dataList(dlp), i # i = dlp[1]->i - add $ SIZEOF_dataList, dlp # dlp++ - # | - GR_FSET_GW_ENTRY fifo, 4 - # empty - GR_FSET_GW_ENTRY fifo, 8 - add $12, fifo - test i,i # while (i) - jne .Lnext_parm # - -.align 4 -.Ltriangle_command: - # Write Triangle Command - mov zArea, tmpx - GR_SET_GW_ENTRY fifo, 0, tmpx - test $7, fifo - jnz .Lno_padding0 - GR_SET_GW_ENTRY fifo, 4, tmpx -.Lno_padding0: - # Cleanup - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - - -.align 4 -.Lzero_area: -.Lbackfaced: - fstp %st(0) # 4 - fstp %st(0) # 3 - fstp %st(0) # 2 - fstp %st(0) # 1 - fstp %st(0) # 0 - pop %ebp - pop %edi - pop %esi - pop %ebx - xor %eax, %eax # return 0 (triangle drawn) - ret - -.align 4 -.Lwrap: - push %eax - push %ebx - push %ecx - push %edx - call _grSst96FifoMakeRoom - pop %edx - pop %ecx - pop %ebx - pop %eax - mov fifoPtr(gc), fifo - mov fifoSize(gc), tmpy - sub tmpx, tmpy - jmp .LwrapDone - -.align 4 -.Lfence: - mov writesSinceFence(gc), tmpx - mov (_GlideRoot+curTriSize), tmpy - - shr $2, tmpy - sub tmpy, tmpx - jl .Ldofence - - mov tmpx, writesSinceFence(gc) - jmp .LfenceDone - -.align 4 -.Ldofence: - push %eax - xchg %eax, P6FenceVar - pop %eax - jmp .LfenceDone - -.align 4 -.Lsecondary_packet: - test $7, fifo - jz .Lno_padding1 - GR_SET_GW_ENTRY fifo, 0, tmpx - add $4, fifo -.align 4 -.Lno_padding1: - push tmpx - push gc - - mov dl_addr(dlp), tmpx - mov (_GlideRoot+curGC), gc - - GR_SET_GW_CMD fifo, 0, tmpx - mov gwHeaders(gc, 4), tmpy - - GR_SET_GW_HEADER fifo, 4, tmpy - pop gc - - pop tmpx - add $8, fifo - - mov dl_i + SIZEOF_dataList(dlp), i - add $ SIZEOF_dataList, dlp -.align 4 -.Lnext_parm_1: - mov (fa, i), tmpx # tmpy = fa[i] - flds (fa, i) # pa - fsubs (fb, i) # dpAB - flds (fb, i) # | pb - fsubs (fc, i) # dpAB dpBC - - fld %st(1) # | | dpAB - fmuls zdyBC # | | p0x - fld %st(1) # | | | dpBC - fmuls zdyAB # | | | p1x - fxch %st(3) # p1x | | dpAB - # | | | | - GR_SET_GW_ENTRY fifo, 0, tmpy - fmuls zdxBC # | | | p1y - fxch %st(2) # | p1y | dpBC - fmuls zdxAB # | | | p0y - fxch %st(3) # p0y | | p1x - fsubrp %st,%st(1) # | | dpdx - fxch %st(2) # dpdx | p0y - fsubp %st,%st(1) # | dpdy - fxch %st(1) # dpdy dpdx - mov dl_i + SIZEOF_dataList(dlp), i # i = dlp[1]->i - add $ SIZEOF_dataList, dlp # dlp++ - # | - GR_FSET_GW_ENTRY fifo, 4 - # empty - GR_FSET_GW_ENTRY fifo, 8 - add $12, fifo - test i,i # while (i) - jne .Lnext_parm_1 - - test $7, fifo - jz .Ltriangle_command_packet - GR_SET_GW_ENTRY fifo, 0, tmpx - add $4, fifo -.align 4 -.Ltriangle_command_packet: - mov (_GlideRoot+curGC), gc - mov $0x40000000, tmpy - - mov gwCommand(gc), tmpx - mov zArea, fa - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - GR_SET_GW_ENTRY fifo, 8, fa - GR_SET_GW_ENTRY fifo, 12, fa - - pop %ebp - pop %edi - pop %esi - pop %ebx - mov $1, %eax # return 1 (triangle drawn) - ret - -.align 4 -.Lno_interpolation: - fstp %st(0) # 4 - fstp %st(0) # 3 - fstp %st(0) # 2 - fstp %st(0) # 1 - fstp %st(0) # 0 - jmp .Ltriangle_command - -.L_end_tri_setup_asm: -.AIF \&GLIDE_DEBUG EQ 0 -.size grDrawTriangle,.L_end_tri_setup_asm-grDrawTriangle -.AENDI -.size grDrawTriangle_asm,.L_end_tri_setup_asm-grDrawTriangle_asm -.size _trisetup_asm,.L_end_tri_setup_asm-_trisetup_asm - -# [++++ from above] -# This comment was moved here to make the code in the loop more readable -# STALL HERE due to PCI write buffer being full on last instruction: -# The write to the packerHackAddress takes 3 bus clocks, during which -# we may not write to the PCI buffer without stalling. This causes -# the amount of clocks the workaround adds to the loop to vary in the -# following way++: -# -# CPU Bus/CPU Clock Total Bus Total Penalty -# Ratio* Clocks Since (add to later clocks) -#====================================================================== -# P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -# P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -# P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -# P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -# -# * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -# P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -# P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -# -#++ These calculations also assume that we NEVER get to continue a burst -# from having the next parameter be consecutive from the current one. -# If we did get that, then we have to add two more bus clocks to the -# penalty for the next write (labeled loop clock 10), so that looks like -# CPU Total Penalty -# ============================================ -# P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -# P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -# P5-120: (2 * 4) + 9 = 17 clocks! -# P5-100/P5-90 (2 * 3) + 6 = 12 clocks -# - -#_TEXT ENDS -.END diff --git a/glide2x/sst1/glide/src/xdraw96.asm b/glide2x/sst1/glide/src/xdraw96.asm deleted file mode 100644 index 2cb5889..0000000 --- a/glide2x/sst1/glide/src/xdraw96.asm +++ /dev/null @@ -1,686 +0,0 @@ -;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -;; FULL TEXT OF THE NON-WARRANTY PROVISIONS. -;; -;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -;; THE UNITED STATES. -;; -;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -;; -;; $Header$ -;; $Revision$ -;; $Log$ -; -; 2 7/07/97 2:14p Jdt -; assembly now on par with C code. -; -; 1 7/07/97 8:37a Jdt -; B4 Chip field fix. -;; - -TITLE xdraw.asm -OPTION OLDSTRUCTS -.586P - -.model FLAT,C ; Flat memory, mangle publics with leading '_' - -EXTRN _GlideRoot:DWORD -EXTRN _grSpinFifo:NEAR -EXTRN _grSst96FifoMakeRoom:NEAR - - -; some useful floating load and store macros -flds TEXTEQU -fsubs TEXTEQU -fmuls TEXTEQU - -_DATA SEGMENT - One DD 03f800000r - Area DD 0 - dxAB DD 0 - dxBC DD 0 - dyAB DD 0 - dyBC DD 0 - culltest DD 0 - P6FenceVar DD 0 -_DATA ENDS - -; Ugly, but seems to workaround the problem with locally defined -; data segment globals not getting relocated properly when using -; djgpp. - -zArea TEXTEQU -zdxAB TEXTEQU -zdxBC TEXTEQU -zdyAB TEXTEQU -zdyBC TEXTEQU -zculltest TEXTEQU - -;;; Some useful SST-1 offsets -INCLUDE fxgasm.h - -;; enables/disables trisProcessed and trisDrawn counters -STATS = 1 - -;-------------------------------------------------------------------------- -;;; Macro for P6 Fencing operation -;;; Note that this destroys eax, but if you do 2 fences eax will be restored -IFDEF GLIDE_DEBUG -EXTRN _GR_SET_GW_CMD:NEAR -EXTRN _GR_SET_GW_HEADER:NEAR -EXTRN _GR_SET_GW_ENTRY:NEAR -ENDIF - -GR_SET_GW_CMD MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_CMD - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_SET_GW_HEADER MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_HEADER - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_SET_GW_ENTRY MACRO addr, offset, data -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - push data - lea eax, [addr+offset] - push eax - call _GR_SET_GW_ENTRY - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - mov [addr+offset], data -ENDIF -ENDM - -GR_FSET_GW_ENTRY MACRO addr, offset -IFDEF GLIDE_DEBUG - push eax - push ecx - push edx - sub esp, 4 - fstp DWORD PTR [esp] - lea eax, [addr+offset] - push eax - call _GR_SET_GW_ENTRY - add esp, 8 - pop edx - pop ecx - pop eax -ELSE - fstp DWORD PTR [addr+offset] -ENDIF -ENDM - -;-------------------------------------------------------------------------- -; Arguments (STKOFF = 16 from 4 pushes) -STKOFF = 16 - - - - -_va$ = 4 + STKOFF -_vb$ = 8 + STKOFF -_vc$ = 12 + STKOFF - -X = 0 -Y = 4 - -fa TEXTEQU ; vtx a from caller -fb TEXTEQU ; vtx b from caller -fc TEXTEQU ; vtx c from caller - ; edx is used as index, loading from *src -gc TEXTEQU ; points to graphics context -dlp TEXTEQU ; points to dataList structure -hw TEXTEQU ; points to the hardware -fifo TEXTEQU ; points to next entry in fifo - -tmpx TEXTEQU ; temp X storage -i TEXTEQU ; i = dlp->i -tmpy TEXTEQU ; temp Y storage - -_TEXT SEGMENT - -;-------------------------------------------------------------------------- - align 4 - PUBLIC grDrawTriangle_asm -grDrawTriangle_asm PROC NEAR - .code - -grDrawTriangle_asm ENDP - -; FALL THRU to _trisetup - -;-------------------------------------------------------------------------- -;; -;; _trisetup_asm - do triangle setup & send down draw command -;; -;; USAGE: -;; -;; - align 4 - PUBLIC _trisetup_asm@12 -_trisetup_asm@12 PROC NEAR - .code -; 28 - ; save ebx, esi, edi, ebp - push ebx - push esi - - push edi - push ebp - -;vertex sorting is done as follows: -; 1. First, load the y values of vtx a, b, c into integer registers -; -; This is done in the segment vertex_load below. -; -; Note that this trashes the pointers, we will reload them later -; -; If any of the y values is negative, convert to a pseudo-2's complement -; form by xor'ing with 7fffffff. This lets us use 2's complement integer -; comparisons for floating point comparisons. -; -; 2. Compare a.y, b.y, c.y, and setup pointers fa, fb, fc so that -; a.y <= b.y <= c.y. -; -; Note that fa, fb, fc registers point once more to vertex structs, -; though not necessarily in the order that the application passes it to -; this routine. -; -; This is done in the segment vertex_y_sort below, with many many -; compare/branches. -; -; All the compare/branches converge to sst_load_xy_regs. -; -; 3. Load the (x,y) values into the floating point SST registers for Fa, Fb, -; and Fc. Done in the segment sst_load_xy_regs. -; -; 4. Restore fa, fb, fc to the user's order. Also save the vertex -; with lowest y value on the stack, this will be used later for -; loading parameter values into the SST regs. -; -;;;;;;;;;;;;;; - - -;-------------------------------------------------------------------------- - - - mov fa, [esp + _va$] ; 1 - mov fb, [esp + _vb$] - mov fc, [esp + _vc$] - mov tmpy, [_GlideRoot + trisProcessed] ; _GlideRoot.stats.trisProcessed++; -; 36-3 -vertex_y_load: - mov fa, [fa + Y] ; 2 - mov fb, [fb + Y] - cmp fa, 0 ; 3 - jge a_positive - xor fa, 7fffffffh - align 4 -a_positive: - cmp fb, 0 ; 4 - jge b_positive - xor fb, 7fffffffh - align 4 -b_positive: - mov fc, [fc + Y] ; 5 - mov gc, [_GlideRoot + curGC] - cmp fc, 0 ; 6 - jge c_positive - xor fc, 7fffffffh -c_positive: -; 42-3 -; 24-30 with direct fall-thru -; jmp ret_pop0f -;-------------------------------------------------------------------------- -vertex_y_sort: - - cmp fa, fb ; if (ay < by) { - jge AgtB - cmp fb, fc ; if (by > cy) { - jle abc - cmp fa, fc ; if (ay < cy) { - jge cab - - acb: ; acb - mov fa, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vc$] - mov fc, [esp + _vb$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cab: ; cab - mov fa, [esp + _vc$] ; fa = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] ; fb = &va->x - mov fc, [esp + _vb$] ; fc = &vb->x - ; HOLE - jmp Area_Computation - - align 4 - abc: ; abc - mov fa, [esp + _va$] ; fa = &va->x - mov fb, [esp + _vb$] ; fb = &vb->x - mov fc, [esp + _vc$] ; fc = &vc->x - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - ; HOLE - jmp Area_Computation - - align 4 - AgtB: ; } else { - cmp fb, fc ; if (by < cy) - jge cba - cmp fa, fc ; if (ay < cy) - jge bca - bac: ; bac - mov fa, [esp + _vb$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _va$] - mov fc, [esp + _vc$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - cba: ; cba - mov fa, [esp + _vc$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode - mov fb, [esp + _vb$] - mov fc, [esp + _va$] - xor tmpx, 1 ; culltest ^= 1 - jmp Area_Computation - - align 4 - bca: ; bca - mov fa, [esp + _vb$] - mov fb, [esp + _vc$] - mov fc, [esp + _va$] - mov tmpx, [gc + cull_mode] ; culltest = gc->state.cull_mode -;-------------------------------------------------------------------------- - align 4 -Area_Computation: -; 47-3 -; jmp ret_pop0f - flds [fa + X] ; xa - fsubs [fb + X] ; dxAB - flds [fb + X] ; | xb - fsubs [fc + X] ; | dxBC - flds [fb + Y] ; | | yb - fsubs [fc + Y] ; | | dyBC - flds [fa + Y] ; | | | ya - fsubs [fb + Y] ; | | | dyAB - fld st(3) ; | | | | dxAB - fmul st, st(2) ; | | | | t0 t0=dxAB*dyBC - fld st(3) ; | | | | | dxBC - fmul st, st(2) ; | | | | | t1 t1=dxBC*dyAB - fsubp st(1),st ; | | | | area - - fst zArea ; | | | | area - - ; Zero Area Triangle Check - mov tmpy, zArea ; j = *(long *)&area - and tmpy, 7fffffffh ; if ((j & 0x7FFFFFFF) == 0) - jz zero_area - - ; Cull Check - sal tmpx, 31 ; culltest<<31 - mov tmpy, [gc + cull_mode] ; load gc->state.cull_mode - test tmpy, tmpy ; if (gc->state.cull_mode != GR_CULL_DISABLE) - je nocull1 - ; culling ENABLED - mov tmpy, zArea ; reload area - xor tmpy,tmpx ; if (j ^ (culltest<<31)) - jge backfaced - -nocull1: ; culling disabled - ; OOA Calculation - fdivr One ; | | | | ooa - - ; Fetch Fifo Ptr - mov fifo, [gc + fifoPtr]; - - ; P6 Check - mov tmpx, [_GlideRoot + CPUType] - cmp tmpx, 6h - - je fence - - align 4 -fenceDone: - ; Wrap Check - mov tmpx, [_GlideRoot + curTriSize] - mov tmpy, [gc + fifoSize] - - sub tmpy, tmpx - jl wrap - - align 4 -wrapDone: - mov [gc + fifoSize], tmpy - ; Adjust Fifo Ptr - mov tmpy, fifo - add tmpy, tmpx - mov [gc + fifoPtr], tmpy - - ; Begin Tri Packet - mov tmpx, [gc + gwCommand] - mov tmpy, [gc + gwHeaders] - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - ; Download X, Y * 3 - mov tmpx, [fa + X] - mov tmpy, [fa + Y] - - GR_SET_GW_ENTRY fifo, 8, tmpx - GR_SET_GW_ENTRY fifo, 12, tmpy - - mov tmpx, [fb + X] - mov tmpy, [fb + Y] - - GR_SET_GW_ENTRY fifo, 16, tmpx - GR_SET_GW_ENTRY fifo, 20, tmpy - - mov tmpx, [fc + X] - mov tmpy, [fc + Y] - - GR_SET_GW_ENTRY fifo, 24, tmpx - GR_SET_GW_ENTRY fifo, 28, tmpy - - add fifo, 32 - - mov i, [gc+dataList] ; i = gc->datalist[0]->i - add dlp, dataList ; dlp = gc->dataList - - ; Early out for no interp - test i, i - je no_interpolation - - ; Setup for Parameter Calculator - ; dxAB dxBC dyBC dyAB ooa - fmul st(4), st ; DXAB | | | | - fmul st(3), st ; | DXBC | | | - fmul st(2), st ; | | DYBC | | - fmulp st(1), st ; | | | DYAB - fxch st(3) ; DYAB | | DXAB - fstp zdxAB ; | | DYBC - fstp zdyBC ; | DXBC - fstp zdxBC ; DYAB - fstp zdyAB ; - - ; Parameter Calculator - align 4 -next_parm: - test i,1 - jnz secondary_packet - - mov tmpy, [fa + i] ; tmpy = fa[i] - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - - GR_SET_GW_ENTRY fifo, 0, tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - - GR_FSET_GW_ENTRY fifo, 4 ; | - - GR_FSET_GW_ENTRY fifo, 8 ; empty - add fifo, 12 - test i,i ; while (i) - jne next_parm ; - - align 4 -triangle_command: - ; Write Triangle Command - mov tmpx, zArea - GR_SET_GW_ENTRY fifo, 0, tmpx - test fifo, 7h - jnz no_padding0 - GR_SET_GW_ENTRY fifo, 4, tmpx -no_padding0: - ; Cleanup - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - - - align 4 -zero_area: -backfaced: - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - pop ebp - pop edi - pop esi - pop ebx - xor eax, eax ; return 0 (triangle drawn) - ret 12 - - align 4 -wrap: - push eax - push ecx - push edx - call _grSst96FifoMakeRoom - pop edx - pop ecx - pop eax - mov fifo, [gc + fifoPtr] - mov tmpy, [gc + fifoSize] - sub tmpy, tmpx - jmp wrapDone - - align 4 -fence: - mov tmpx, [gc + writesSinceFence]; - mov tmpy, [_GlideRoot + curTriSize] - - shr tmpy, 2 - sub tmpx, tmpy - jl dofence - - mov [gc + writesSinceFence], tmpx - jmp fenceDone - - align 4 -dofence: - push eax - xchg eax, P6FenceVar - pop eax - jmp fenceDone - - align 4 -secondary_packet: - test fifo, 7h - jz no_padding1 - GR_SET_GW_ENTRY fifo, 0, tmpx - add fifo, 4 - align 4 -no_padding1: - push tmpx - push gc - - mov tmpx, [dlp + dl_addr] - mov gc, [_GlideRoot + curGC] - - GR_SET_GW_CMD fifo, 0, tmpx - mov tmpy, [gc + gwHeaders + 4] - - GR_SET_GW_HEADER fifo, 4, tmpy - pop gc - - pop tmpx - add fifo, 8 - - mov i, [dlp + SIZEOF_dataList + dl_i] - add dlp, SIZEOF_dataList - align 4 -next_parm_1: - mov tmpy, [fa + i] ; tmpy = fa[i] - flds [fa + i] ; pa - fsubs [fb + i] ; dpAB - flds [fb + i] ; | pb - fsubs [fc + i] ; dpAB dpBC - - fld st(1) ; | | dpAB - fmuls zdyBC ; | | p0x - fld st(1) ; | | | dpBC - fmuls zdyAB ; | | | p1x - fxch st(3) ; p1x | | dpAB - - GR_SET_GW_ENTRY fifo, 0, tmpy ; | | | | - fmuls zdxBC ; | | | p1y - fxch st(2) ; | p1y | dpBC - fmuls zdxAB ; | | | p0y - fxch st(3) ; p0y | | p1x - fsubp st(1),st ; | | dpdx - fxch st(2) ; dpdx | p0y - fsubrp st(1),st ; | dpdy - fxch st(1) ; dpdy dpdx - mov i, [dlp + SIZEOF_dataList + dl_i] ; i = dlp[1]->i - add dlp, SIZEOF_dataList ; dlp++; - - GR_FSET_GW_ENTRY fifo, 4 ; | - - GR_FSET_GW_ENTRY fifo, 8 ; empty - add fifo, 12 - test i,i ; while (i) - jne next_parm_1; - - test fifo, 7h - jz triangle_command_packet - GR_SET_GW_ENTRY fifo, 0, tmpx - add fifo, 4 - align 4 -triangle_command_packet: - mov gc, [_GlideRoot + curGC] - mov tmpy, 40000000h - - mov tmpx, [gc + gwCommand] - mov fa, zArea - - GR_SET_GW_CMD fifo, 0, tmpx - GR_SET_GW_HEADER fifo, 4, tmpy - - GR_SET_GW_ENTRY fifo, 8, fa - GR_SET_GW_ENTRY fifo, 12, fa - - pop ebp - pop edi - pop esi - pop ebx - mov eax, 1h ; return 1 (triangle drawn) - ret 12 - - align 4 -no_interpolation: - fstp st(0) ; 4 - fstp st(0) ; 3 - fstp st(0) ; 2 - fstp st(0) ; 1 - fstp st(0) ; 0 - jmp triangle_command - -_trisetup_asm@12 ENDP - -; [++++ from above] -; This comment was moved here to make the code in the loop more readable -; STALL HERE due to PCI write buffer being full on last instruction: -; The write to the packerHackAddress takes 3 bus clocks, during which -; we may not write to the PCI buffer without stalling. This causes -; the amount of clocks the workaround adds to the loop to vary in the -; following way++: -; -; CPU Bus/CPU Clock Total Bus Total Penalty -; Ratio* Clocks Since (add to later clocks) -;====================================================================== -; P55c-200/P5-180: 6/1 1.3 (3 - 1.3) * 6 + 6 = 17 -; P5-166/P5-150: 5/1 1.8 (3 - 1.8) * 5 + 6 = 12 -; P5-120: 4/1 2.25 (3 - 2.25) * 4 + 6 = 9 -; P5-100/P5-90: 3/1 3 (3 - 3) * 3 + 6 = 6 -; -; * P5-200 haa a 33MHz bus, P5-166 has a 33MHz bus, -; P5-150 has a 30MHz bus, P5-120 has a 30MHz bus, -; P5-100 has a 33MHz bus, P5-90 has a 30MHz bus -; -;++ These calculations also assume that we NEVER get to continue a burst -; from having the next parameter be consecutive from the current one. -; If we did get that, then we have to add two more bus clocks to the -; penalty for the next write (labeled loop clock 10), so that looks like -; CPU Total Penalty -; ============================================ -; P55c-200/P5-180:(2 * 6) + 17 = 29 clocks!!! -; P5-166/P5-150: (2 * 5) + 12 = 22 clocks!! -; P5-120: (2 * 4) + 9 = 17 clocks! -; P5-100/P5-90 (2 * 3) + 6 = 12 clocks -; - -_TEXT ENDS -END diff --git a/glide2x/sst1/glide/tests/alpha.3df b/glide2x/sst1/glide/tests/alpha.3df deleted file mode 100644 index e67fc8a9ee75ce97391cec7bac11305d047b3acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87428 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 L61sFi+%Ekew>Xrd diff --git a/glide2x/sst1/glide/tests/ap88.3df b/glide2x/sst1/glide/tests/ap88.3df deleted file mode 100644 index f465e2df4deec381148203ac5d9ff3f2370606da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173903 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 diff --git a/glide2x/sst1/glide/tests/argb8888.3df b/glide2x/sst1/glide/tests/argb8888.3df deleted file mode 100644 index a6a47df633f2e90395be95f86eb0f6f0670a4bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349577 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%0A5(baphZ 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%0A=HIet5DnK{@e?*Z2PH#*4Aem^}i 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 diff --git a/glide2x/sst1/glide/tests/ayiq.3df b/glide2x/sst1/glide/tests/ayiq.3df deleted file mode 100644 index a6aac0d1402b10d51d74ba63f7ea7aa4b1160957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174705 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 QXs@qLeEaF!!yVt< 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 ZrJMHKeXyJB+SRu@`QP!pdo}ao{{eY~5NZGb diff --git a/glide2x/sst1/glide/tests/cmp.bat b/glide2x/sst1/glide/tests/cmp.bat deleted file mode 100644 index 7b481d9..0000000 --- a/glide2x/sst1/glide/tests/cmp.bat +++ /dev/null @@ -1,65 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_SRCIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM if FX_GLIDE_TEST_DIFFIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DIFFIMG%]==[] goto Default1 - -goto Output1 - -:Default1 -set FX_GLIDE_TEST_DIFFIMG=%BUILD_ROOT_SST1%\glide\images - -:Output1 -set ddir=%FX_GLIDE_TEST_DIFFIMG% - -if [%FX_GLIDE_TEST_SRCIMG%]==[] goto Default2 - -goto Output2 - -:Default2 -set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images - -:Output2 -set sdir=%FX_GLIDE_TEST_SRCIMG% - -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default3 - -goto Output3 - -:Default3 -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output3 -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -isub -v %sdir%\test00.vgm %tdir%\test00.tst %ddir%\test00.tga -isub -v %sdir%\test01.vgm %tdir%\test01.tst %ddir%\test01.tga -isub -v %sdir%\test02.vgm %tdir%\test02.tst %ddir%\test02.tga -isub -v %sdir%\test03.vgm %tdir%\test03.tst %ddir%\test03.tga -isub -v %sdir%\test04.vgm %tdir%\test04.tst %ddir%\test04.tga -isub -v %sdir%\test05.vgm %tdir%\test05.tst %ddir%\test05.tga -isub -v %sdir%\test06.vgm %tdir%\test06.tst %ddir%\test06.tga -isub -v %sdir%\test07.vgm %tdir%\test07.tst %ddir%\test07.tga -isub -v %sdir%\test08.vgm %tdir%\test08.tst %ddir%\test08.tga -isub -v %sdir%\test09_0.vgm %tdir%\test09_0.tst %ddir%\test09_0.tga -isub -v %sdir%\test09_1.vgm %tdir%\test09_1.tst %ddir%\test09_1.tga -isub -v %sdir%\test10_0.vgm %tdir%\test10_0.tst %ddir%\test10_0.tga -isub -v %sdir%\test10_1.vgm %tdir%\test10_1.tst %ddir%\test10_1.tga -isub -v %sdir%\test13.vgm %tdir%\test13.tst %ddir%\test13.tga -isub -v %sdir%\test16.vgm %tdir%\test16.tst %ddir%\test16.tga -isub -v %sdir%\test17_0.vgm %tdir%\test17_0.tst %ddir%\test17_0.tga -isub -v %sdir%\test17_1.vgm %tdir%\test17_1.tst %ddir%\test17_1.tga -isub -v %sdir%\test17_2.vgm %tdir%\test17_2.tst %ddir%\test17_2.tga -isub -v %sdir%\test17_3.vgm %tdir%\test17_3.tst %ddir%\test17_3.tga -isub -v %sdir%\test17_4.vgm %tdir%\test17_4.tst %ddir%\test17_4.tga -isub -v %sdir%\test18.vgm %tdir%\test18.tst %ddir%\test18.tga -isub -v %sdir%\test19_0.vgm %tdir%\test19_0.tst %ddir%\test19_0.tga -isub -v %sdir%\test19_1.vgm %tdir%\test19_1.tst %ddir%\test19_1.tga -isub -v %sdir%\test19_2.vgm %tdir%\test19_2.tst %ddir%\test19_2.tga -isub -v %sdir%\test19_3.vgm %tdir%\test19_3.tst %ddir%\test19_3.tga diff --git a/glide2x/sst1/glide/tests/decal1.3df b/glide2x/sst1/glide/tests/decal1.3df deleted file mode 100644 index f999d3f881cb05e7ebb992c1567a7db09069e12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 zcmeHw4U`qp6?;Rz8Rv}B9Sq| z3I;`pnd2#v!;>Y<69_w!XF^Uud~YS5V@@lsfdnI1Nwc%_ z(f6guZc|9`*wu9^O=KmL~QdrN%TJVo(=22x#rKn@6Z0^e(bk&7J@@|ju~qKjK9Nx84JIx z;_onErZRxw?=WCyGC;%MVZcme0FA%HfSJbt7Jr8Ut;c{Ki7(bP(c|whz?$6}9x5RV zgpYoYBnl7y)M3QmVE|mCg)RBHaE5nSR^p*^yC&4#MiRpAwpTz8T$ zV+loKW3llVxRmoaxW{939?kKeZU*EZ6yZ+%Go7?Hsyn7@2V!Ys7(g%|nK0HBkqKT{ zSso2}iZ#F1-%o|szzBdJzSh2lAB%*K{&gqEA|j#lRu2E^WdOAON{ye{noZ@?AkYug z_XhF?bgkj9T0vh|^hmrqAXO~;xW%Wf*En}!BgmaRx#1LFMnfW@b6p<)>14pv%)_7j zWT8)~3vqo2a!c}-(*vh(Dars`sn;W3kuz3>k+ILx2>V@K1z*zq6;xEhk zegIno42Gs3|NK#r5ajjep@c{(!GAg!fO~)09dvGqoAe8CJ;1gOY6!MGmn;9WtZxGz z`iP{2&zqW{{O4cN$FpQaa!rRFbo>01E0%@E-~1hYU?j33KVQI5&RRR!&?L_K5K znZH6LfiryBHy{!^QM>pz0RuLZ@n7x%S`*rBAAkLv!OmhSO@%heWadZf1rk?j?Jpyr zE}@TEa7<>`6Y}7rvg4F&7_ZVf7rAp20(oQYS-$L%MM9@xAOC4(z~WoTA~`G9I}lBGK<^ zA=ldjBB7J29REf#K)>e0aNsfH907|Zt*_Y4K128aE#nVWhOQO(Nd8FiIW11t+MS$7 zlWZzCCz~P?N^Ls_lG>(h_u6(Y1nv-gZ}EzRPO%#N8^?frx}fx@3)$R+HufhhFpdIQ zENOj3ZvC1Oy)VoL{<2KkdeR2q^C`iMfG9H@|LhTwDClDb=wuVjTk?gDzB>FH#{fFd zhTgzq^j++>k3T#9n|F+k(H8!)toHRa{Pkl&I%>=A?0%i>P_B1mckKL_FB@Vap%bkZ z|LI|XHvg;E0fisYI#q%{yAR-w59s)8;-A-z1*&ZM)tqGS6UpvR__84)5?VKl_Dn*RrU`A@*8~gcYm@jL`h&> zK)J%_0G*x~RqBpM8UHpF17IHz(xh+)ty3lCpI-lAYk%?hk4=-gN-_OFbsWG1uzQi6 zEt1FtU)BtWgif16S>#mFhuN-Xssq@af%4t7PWJI);6c15VlHel*;k?_$!aA8$UB*cdJTq@^0hY|e-G60YBd3(Fm+|y&g!aQ0dS!Ty_ zJ!RHg6Ir_Lr|11hthVsa!)PCu_Y{oz*)@Tx+JLD)Dalu-7&&y2FDpV=R#D$8BH$BQ z5g~fvGY|HnA0PdOF+l0zapv~a+-oz!#?o&G|5W~lQ(Dhozw=W~%hvwCvkLmBlqdD= zfXS~*)Re^EQ;S5R{jP;|tq6#OPDO~n82tt@KrP`@kJGs&ZfyrhW~;G{(Bn_f<&hZF zb0S+FeRlufLN6PG?rK6oUz_n^=Yoz^J`af3KWWJ%GpDC|;5&I3e(j1sAd~p}@Z@3T zynH|;be;wHo1@X^f_a9^* zfVR>{*8a$BV8t`RnZqK%c=M!R7748z7yt6;H-G`!E`M0%rFPR4Hj;e+yt0pV)8o(n zy7x#XmJX%Z`JQV}@HwJdiv7j6_WLi|j^Nh%ee@0edcY~z1EL#W(7{FS%yS|+lHp5# zLL_t=9Q>`J-v9<^^E>c6fUVgbc*TogFWMO{%LgvdqdBc@7rCxI5lW@Fh@?V8@IN0L zBJA#uh2BlzI|RQ7EZH$HUw~bo>JBfh?kBg|aX^J*!OS;Ba&(F>OCus78N+7-{?^g2 zI|DSVX(nKIb~arj(E9Lx*DFGP-m$f3dB64}@zMQ$mIL^T`Xvy(>Z_YOg1Fc=;1sM7 za@j^w<)1UZClWsTN2eBtL_(*a!`~kIb!Pyq_CC(8{ZIA6zAvgZpmo7+{3{szdv8|O zo~3^sgYQQs#Jxfi=V%E3!_OKh?|Rt~S?=8sA>p9rKMUi%6wLB5>qgXlJQ6$x_l^64 zOM%QCna?ZInK4Kr%a_H0#es!^#RH2676uj$z*X_HaDYyU!QVdmb!Pz1EB+k_7Bk#w zotn^{uXg@#^0-KnIle6PiiEZgg})0eFxGOGe41)yh}N$8-T5zD%j4v$MR^v^&rbdg ze2S9FtCGy8a>R{YeX>aC6e;`>ayty5ZBu`D_CDN~v62q7f&wXFUgQC}_QXU&r^n#$ zFn~5q-Q5^{wKrQnsmXhEa`R+S(gnVFA|jzv)8X$hfHqED-2{DW44CwZM3l+i07yvr z#x6?eCk*(v3L^2hc4D5W*U7f3{Yzd-nS@sXh0V?4sW|23W#>+8JO4{puND4So9z z$X|i+v@h0HhV0Dt7{gk`e_9z}75(ZMU>$w?4467&AAS5p{TW~x|7l}@9rP<_fIalv zhXFS5pB4t#MZYoz*hjxz7+?$khBF`?SvY_ZwJUaef`Ky_Py1qTR=62k0h{I1 zBN&j(U3bzx`uK@fXMk<|r-K2u%RjC!dILiVV}DoVGgBE*0samHpxo2a%5^|R_&W?> z@NeZ-phEl|2DAwSD#qVoKwB`N3j7@gv;hOE!rx&)%QK)#{2d0gI0LH2e;OFjC)=G5 zEY1gr2LBxYnKBxRG1q)(^c@DYCj&IJ^)5a74g=be0eaNQH4lA<0qw^Cf;W2>q3yWU3pK?-v0^Kdrr`Ze>wD9fB}h$=L2RO1N8V?LEmA3T0^u$9l+vm6@7;R z?ZN;We>>1 zq3IqCYWO=0VAqg)10w@!4R7VURmTD}{_V!k0ipJ10E@rF09_r>_6*SD?=WCy zF~Eqw!+@E@03QAh17;2b`1m^vm?;bp;qNe@tr>718PkgKcNoyN40x=t(F*?U%K%S| z#n#%DC(;)40TlYOY*zm9z4n|H9)ouyTf>|U)dmb;&@Yd_!+^G8fDU~t_&W?}8wMEA zw}!vNfVN-&2YsvfI}B)f25`~0j=#fzmS%teeLMI&3}{&f2+_BPe;YF(!eVRf$`ct4 zk$IHz=V{v^VuHS1{2d0c%xD1yn4)hVe}p=vcHAcjGeYfH2b4j-68s$ov`igP7X8Zb zcNowL49MQ6t@4O_C*|hb@OHETInGI#BX%0^Q5elujA4=X5}g=td;L@FH(wi*M>u(fv2VL&U_0oE`! z59KhRbs1oetkt^?16q{s(3!2$r)e;Q+r_?2DDNgP#)XW<%8%#I1FeV2I!zO zTs{H+ANGvFx15K=fL39EIg%KCEDi(Io?83$1I+Lz=sOJ1`swY)05SeF`VIryl>s9B z_2@ecXio<4@#mrMFhFC#$Uuej0kN@|7E3u-BW8qn_>0hY7@#56E(|c@Z-&0ZfOcbm z9{+OaI}B(q2C(>BLEm9OJ28O9-zxeJ1KNiH8vb_BcNowv3?TU1Mc-jSdoV!7e|2%5 zAERnVoOJ<}1tSB!A$rBfs=H5~?)d;x{-d^V*Er%ZptTu5@JGmDK&jMTqFF`n(rSIZ zt2OHYT0e&YGmil@{!SfG!rzN#NFBi9?=WDdF+h*M!+@E^03-em17;Efc=$UEr~v~4 zR2*Kb?ml@up&wU>uPfaju*LeiRJ^u=v&3#VL;Uk@K)Rkl*L^Oz+-?J`quGx z7|@ywFh}1G{tg3Lj{)V-w}-#OfYxF_dGzh#?=YZs7+?i``}jKyXblFW3tF$x%q3d? zGxK+5gi0K!Y-Ok+V*xYNwR>hbi|;uMm@Wn+y&874aEUQCzvD2VItC2MmCgs$mI3A{ zo85I7&<+eRL%7^MhXJk6fN~g{-**_$>I^W)xBOj)0jV>9B?A(b%?B*>RyQAD4P7gt90rsa&?B~&c+PHUS{NYC zsr@?+0~7|#LoPGhH5UWSa%%sc!vItUeQeWaVt{>&&7YXz46uNHb1}di%}VYzKLa{^ zw)AqN1*MkV{Fl5I(Z{JbOC4a#5*7nDHv`;3i)v`WtTDg_`Z((5V1TA%EnUsa0C%t= zJ z7~l?8rI(li6{3%GV?>1bG=>3HS)|Ov&BXwBuuOK#-{v!*3iNT31aITH5ez7=bTuKG zhXL+jHF}huH8P+|^l{8aJP$P=IXGN2Lz*nMVt8Q>1u&2QQ8Dg$bWK2DL~Z9LbL0cCZq zNr35NfICn=2>rGgnHby>sm9Qfl3vVs*C|~)Z6&1 zPGgE1;(AwY8896x+GoH_Lm#7}$6dRwB?G1df4l!7G855n6axtUJ|vPp)JFob=T2lM zY*@pU^*UgtqK{3cm3h6ZvO2&M84a;95nz16fBAij1ks;6P39vy^?{Ao))+98(Z@Dp z(W0*oM(oZA8PV7N|EbRme}2{QYbN-+jd&Y<$}?c5qhCt~@X)96KZp48IzmC@2T{K@ zR}ft-6ifJ*>jyMB`m@kyplR$wmm8T~TOYdAvu^8k03UrC|I>&sfPYvZpF<+Ch`$*F zni~CCOx-8wAk~fqEb8=?H3o>#w}Ss`_$3g05uyJ%WEp=E1N7+k0R`hFhQ5YgK+AaM zmE2)>n0EvFbwu%9T3nJStf~K827Pb+Yk=zd0b=xN{3XPfxKD6HLRSgJ2L3z-u;{Oc z3`}z5w1ETeaF0}h1iMj3)D&_0=6oIc4Z**12AH8w}zHi{OU( zPF-F94Al9a;_t$)GGw4`9xUqg6`uj+(6@sBi#}J7FACZ!=K62j_!9=O=p(egEdHlC z*4DQJ?l311>hyKTbv%)JBw8 z;2-7-nlF?J@W%|$qmRIc)b*#q9fv%gEBTN+#u~sH{um>uD}s6s2pI6WQoB!s>qZ^) zW&PbO>hu-M04wOz_+#txS>t<4K|2mfXh&GbfETn|MVEE_ z@dJihAc`dH&m4Uv^si?8r{RLeoONpqu!cU3|I0`(aqx+wsNW^=g@Zd`LWTGnjfqQp z+~Cc&3dZ{gv1OWH|7+3e>ws?Umg?##q3?w`k7++x)afgg0anr1@b?(dCv1rNJA8bB z|GE%K&FVy4$J1q>n4WG0;>43W+ruA8Z1^5YR|Cv$F8s|#gM%SYOux!QGlX>$lX=jK z0(r*YArSOgq0|U}T+ZJjS!B*yzhDw(hKvV`XSwnZZ2)4Q=n67%&TBUO%@~l5uo#hAI`yMpX9Or2o~|5Z^rE=yQa!9Gc!#)hzZ4}a_LRemi-*4iDCvIj=reEELRjraoC z&lO0W@h7EU;`R-(PAry0OS7|n%-AWFLSJ5*`BCS8v~@2plmX@FlSYt+uPmjbdIk_~ zV0M&Zu7SfE&Z1Bx10M8*K*B+{k1qo3F(>MX|1wwwRA+vS<9?z|CHTWk5F^DgU=NJ< zm|s-su9Vroen~@@uwXo{&aH_&*$U2i^YShjF7%3#I1x zFM}Q*JNx&7pl7IR#A2!XmHTF&QSjfUL)*v%B~rR>C-}?K79UBG+#d}RpW2?SAk7a$ z^5H?>7YN`V<_n0BH#;*(w5g>0>z`5Z|9xm+=E7RfXDA+A4cA1d zp+`UT{WR=Vm)hg&E7lHdjiBYV7A`)z<$X!o9>Er$Fj^mUNBJVa9&@7R_`fBK~Wgmb2 z_>YOv2L65VbX3oP4Php>I$nry7WtE`^rCwO0{92{GF|xNJnI>-j3`n(+s9uw{}W^) zw1GcDFb^crQqO)LlS}17gf!ouJTJz7b+|L!8HJB_j>0wgK6+c}Cw0ATz(@etpk;r1`!iC%q^rkd@)iI9~w!*#fCM z{z%sks2=~GIE_D4F!W&)e}s}gx(2B2j31pbzMGFV&zC&ki&hI{WwcY`%k<*^3{wN> z$AC1JJrdDUd}dq!?zk?bZT$5k!NH&|#yVf}u;%%ZZ1ln?nlHCTyL^0svVW;S8c_b( zJwQYca<+>@NZQjZzc*-va!_HGp~-hcNyEfGy8G5;8ry;}lz>x}Klb`V`u=#GkF5F; z9yDeah*p-a>v?Vx7URFHC@d2I|F}*h^&0T+6-Z6+k1P1cNfw!NpK=eQ&zt|(<8Nrs zskkhlkB6Ju`0r}!VS|&j{A9+5Z3)s*!vl5q;GwShX~`4x_2(sV@~bKR8OnW+Kx%?N zY2o#?JI=E<{}a|!D7p0byLo{iG=z(mE&DiD8h z#A_v1oHP9XTTKjBa(q;&mK1j!MtDS2ANo7k5k;b77OZn=wLf-U1>=EPZ16s5PpQ{W z>V7o@S^Xz906w!J*qG{bWi0uskCvJMedLRGhxvkfP?tcoXsdG3`0L%gRskp0jSSdJ zCO+}*ph@q5?)R}Az*lo|diYou)X+87@cK3Yj|`N@8v4a&fR+Ux;!9t=JE{md<157t z_~WHv%mMlvU)AVXN!9ck{*uY45FtZp4=Uw8&Tt?OzXy+ZnU#7~gUgB~U)%9XT==)Z zeQF@U-!I2g!Bi0U_IUgI$ZTLbIvC{LC-Kzx%wvF-BKhf_;Vg9v1d5t)Yk(GS^{$nG zcU%#?2cR{NRnZYx7o6_A8yTSGh~3JAS>RDV9!b>62mJXP!v*~#EiK12T^7(YK+6Y< zKXoPb`1u0$euqG`XdPFRS%77LmO0T>POntzH>)ja=^K4PfPT$)e`&dNT-95EW`Kp* zBp4^t5++yZ^N9b)P&JwTv5+$-NQD;A7+@g+33f(s1@L!{7PSCjK>6&8ia7Rnj@Gq+ z%7E6*zmxN7Er1zNZ5+bE;7mLtG_x&$`P0r8h^0d* zA~6or)$-Gf7D#vpBZHxF`-O5`R%KWQ2_4bay+TLQ2}NS*SURCbOzMx?S)lNC?u~3J zcYFRR`6e}ubm8dKkxU{>TRCAc^Ic z(}6P&eH2O^x|lA|3Z)YV6aBKf^0f+zDkh=g=`_a^M3DfBB2M8ULvWG8kwel zEi8~*GI_JMPCJRF78RDsa=LJMGL*XRBxd4uC-47|l*hGauRVeNZa5X0Nal!gDPVm+ z=)XzclvokiUd$)CYvKI$!Yi8WyzSZ(L_)WZ#fT&WYD~2L)mtE&%6v0>UpAFZO?`Fp z99s)$pwTRa#&?=gIDevIj?DHCO<4>SR-DI;s3aAL;eScVcPP z0ymsGbP-=C1M33FyU<%fxyO&gQOM@gn*1cCmNoqS=){mrgw(5g{j0LT-uz32d1@|X zIh&&Km*r53r@t(3JBR&yq>y5%k-&;-^?xP*v?k9Txb1x+kN*5%VN--`WpZF^J>kY-Wif{&8OmzYis4%w49R9$)xqp$`f!+ zuGGk>@4}DrU)JQgop*ddL-j^qp=O*M6@@W(O@65fS z$^P5co+a|=gL`Bmq+a3cUyTLwX{i6cnECwVW1#<2z=+}@(m!2L?+hdl9X%LZ7g!uJ z=zm(#|2;rG4|<@={;L)^DSs@VG1ngSpO;&rh$ja!lnQq* zAfws+ScZ;lJ4a;m(M<^=LkaaU4*qygL-DAhSG*wm2TEVam-DD8iS&=9Z#k{i{{sDG zs0B_crQobw>M7|IFJ9(ff*wdo{%PmVkBMx4d0hk~gympN4Nf#IoqOP4eP-9f0{N#h zTQLK&#U6l2|J|R=I|e@a>z~ZA{X(JsxZaZ#IbCcAw4@kU z{%cb|)#R7AJ%66a<~#375E%@p4>9_y+IuUt0Mz?ONNtDfp{ZWz0sOS^3QmcXa<=_T z7a|jQ3^0(46)iUgIVA1BnnUG#N~!lgRLa16@<(Q6Ab-WwS2cNa&Y_D$Hs81+L}cH9 z8at)GrhSDLfZqS%{8%y9U|9L-vnq)%D{P<88MbZf+IJPNow+|R7@FbmFJBi1m*PR?lu00z{MJBZIU@ElNyDHKTJ>Y(51vkN11&%yu`T?+? z)GQak7RTZGf>8e-W_~yGc_Jrv9-Shx&_fBw)#m5B!~;QILa^Rcux=2t_eBE#On5E-EjhLk>P9`L^?PnF`r z{o#qy^-W}ssdQh4a(5i$RaMU3mdquyAh~32%jSjN`5+5H$h?Are>eQUBYC%z-Uc=; zpyi|fE|_WaTHg^1m(?NCwC(i}%>28kJsxG~EKux!Ln*|f)j=}UCy#iED0K@YQPRK07Es6WP|sMl z0M=gL8j5T{Y0t5M=qa8*rGE`AplXlnQ>zvr+T%8o?ho+ttkb?K3o!cE$O4-7RxLnl zU(Ny??W?eWPX8KMfYsiL1@zjRTHvOf2Wma6v0ilb0FOCFKZE{NTEM7%IScT#H?hD? z(93+*pu1{|3M|0UzX}VC3@i^|eT^cn2h>^*YpfT3Jy3WhdtdD=z}3HE3ych`i1Z3A zuqTlU7#S$mUsMy;(gFhgtFb`Ho(0l{0~gda5Iz3*y51ZR>OVs)V50wwuz;!lRarp) zHd<0A;x&D;`mEIk(^U$}=->7hD64;)Tfl<;ZEXRA{!w@lnDMA^bPW9g!&|AFs~%ug zb@|+Jx8(A%zRFb{EU+{({WT%2sms^tgWr1lI)g4B?O$}ar3ExSi`q-j>zY9pAo^3< zH{1eyz0=npQ1#boKZ7iQ_2+0mV=MsbN8NF#^{~czX=pt#J*5C){h`J)=&stL?JWTM zBbUE3I8!Zv^`FTWQ1zd=79jf1I13!ly@6*RH2oWHfq-a+WND=CZGjJV=FijX-&hL_ zdzVj_1xnhp_+u_KvMrb<3sBk{^>2F%FxvCdaov1Pibl z>#v%|069>ubDjZwnapHTpD>1p>8c4Yg8W)RyPdz7}A$T?TJK zUdDPAuiDiDw6e?4%dn5?wYfnlEUH{YW7Ox4p^#Jd;)wIs6 zyOk}_pBUs=fM8CaS)JLdnP34{WBpb8TR^X|{<_^Qpx4)U-6R&cRD0bB`>$MPeZunf zfKgwgPZL<+b7+pHzy6=uss|+FGDH z?)G!_=l#}769#|@H$V?!E!*LJ$|?r77%5E=U*EOl+hk1tXaTB zdmONO3*cC+AJtpHg7!E&ss+kuj{{a~0UU>&qdE&%)E;N38|u7I>uWt;POGy3FGh2} z$}M0+dz=OQUTI55H5RaxfG$vF7H~(Q&X4P&s?nw10yhe0O7%UW$}(VPffvvcexzYR zi^mUb)3;I!*i5DrTx5aM@UCis{-tN@?0)HiUZ*BKY`%FGm_F@s z-Yi>SU{iw3lVbh9kIt3kVT61onFId{sL32wf8#7!&9(1BmqI&WTK zXw?z#jJqWwo#C!vR}@Rp*XQyf_Q0+GRmwjl%(bU~nNpzBUe$j+dc7p~hFv})=m%hb zO)g`zNUkski1vL@`)Mo3lVF3O63hjlz{425BwkLe6YYA z_%~)lsiVRPoI(y5v?uz%hKK~?z|Eqd{|C9yWVRqV*gtb`vCdx!@x*}v4}%@vQY;ZI zl>+#cts-uT#Nz^JyP`c|?B5kHSwQXks<^`slSybhXRZY}+N=8C3kVWfExAg9&VcAJ=>2xED&rB*aU41AP4v>hN{@um!ror93-F zDfbodUU|Co#adw4%hO)Pe>K!pL~i$YL_5N&xK_Y_q7u0R%_>DLbSx=pi=a%L1_p#n zVMY2QAN=cxgc(pQ83z45(N)n+(sEysAE;m21kx{+q82z<3uu_rE{y+5;3|=?20J7o zu0Mr3NRvwh$#A`wDXl=1+Dj|cA5nK)=n~~0=)FqKHwW5(cfYhNJQ|jz5g%9pj-}zj zU^;v-T3&yBTR`hg+*toxp$A0d=BV3G#Pzo@0@cK#{yr#A4}%t@GVA!hm z_-S(s;1GVOwTRq^I!n^gOZEQeKyEA@cn|%&Fm4@yg2Ji0rE@{iDB|2|(j zE`t@4euV|P7|butEP$WH?KhDx`8tC{I5I>i>i5iEfcOXN%b&S+8M9p3`oXP3mL{s=gL%K@1W5b7^= z#&P}M<#+iZGYB|`XD(>w>EON&h-OL}&ZpTL4G12wDIl*F<4# zQk0H;(B@xKlFo8T-b>YXI4st`T=_5d|KczL@E7Cf;=kNC;v0e%05iaT4WP!%vjD#1 z1KfyQDRsq(bew?3QIoRzr_TRN51l!2(wM zKge+CIe-Ir05c+U{oP?A?%x63NoCMg%#9&N+GD*k=6MT7L9c`U4{O?^j$pUHCrSxu z-s9`?yQPjOn2a21{|C=GeGXvpK>7%@m(tNa@jeL$!c4&J;6A^V{vU~!KC>3UcX}Zy zB9{ic<3!wRKzldpgbx-M4r_iafqsNKlenJJ9X|sz0P$kKDqfriiMxHJGEbsaXB;nw zb{ETKSbym4$2Y|_ZE^2^oxhScfFwd&K=soKxjPL11XUFGv!FYE8<;8<^d~7a`&qMq zKBw?sXkjAm{|%bEN}>$y`AF?q_xF*E_72$Ido1SQs=~6u+wyR_kjf`>_=Ddjp3G@`T2rBeiNQ#6 zK%m7qejECcmmm7&EvFwEJ^c5|OVJX_{Fj9sz&mxm2=A2pMgD8)M~-B+oqOn`-Je7z zc7KB3EO~em=OG!`2X8Lk5E}^y(#LP*UU2yOJO0*t{I;JSSPk#t4&XH?%$2e>7|%^i zoyqvq#E^a$Fki6pq$N~I6#v1Rg*swR@6{N4c6?)|7Yyb3y zQ+Is(xtB)+V=?@%t14H^c9n@4t}e%_xQGRiQirm zSP>ctq!aK~vW)Vkwj8{pi+V#_L3u0j=$9V)FSotF_79)#KNuMq!0$#PWyLfH@IL#( zJNYk9{USF<{<;irQigZM7T*Gj-yXd7m-}y85$I2BkBkk&d(zIpdtx*2)->h~aRueA zxNrV&+huFd-oNAruk4Wz#xPe%`sGjn23(qXZt6^7wVFP8OA~&3#oAxK^a#ASEwL*$ zHV*G*JR_f!&&r=b9;ickE34<-IZvnHJ*=Pn#eyvZ`@Hy7$;I?txTj@i19+?TOW7|@ z9?w0%rXQKO?!>lK^3iqhX2aq;eJADj;SIsc+cdQdsBZ=R)sFoy?)-S`n}7CK@NTNe zSfZG|3r4wDKyOQs19*@8JNUhhxi>Ofb5COY$y+IsIs9I`Ll@z#-CFt?cuV04uz>c? zHpqthR?6ca4nO()`KNb(`>MMVTfActC4HRwd>HXxDat`UoqGV@ti3unC%dDt5x+6> zx|7?^sr(O|fp^EhI~rLP>z5BE(&KU#-WGTca&Qv9sW+vnZ$&(_ZgfK|{gaJ%?_KU) z7s2*|7G6yq&p8NkP{`u9+T|wla{>MFqf^_?;Wzi~{CM{#yFWQ}5ni#C7=ab#4Y7l< z)T4m^dC+_k-ck86qz`otC=W;OhxmL-vU*17<8$ie&J-pD_#zJVFu z3I}h5`{dS-KAXzF^tly}dSWX=ctrsC*9CLD>RO{&4&+p5UtkZU0kP{2{2u!Q7qmKE zy$$ba8qIW0^}-vF_X7Uu+??E;^Ai^#&*O!?S8ws|)%b5A2Pt@K#NyDxf$af(4wAXu zpImqHx|5L!ItMs)cnct!^pPCsGF`kZmcKGNP*Vqnc=b6@Q^(_4CI`b%Ryy(QSGgP% z(=USp{6iSVMiHEYq?c$zzdeV_!EpZRsUCO>UfCR!(l^b)Xk^WRCqm^QL~?L=GH__HF;eA7M z0O|WX{9WF9rZzk#2ECj<~EDyTl1LIGQ3VFbwusE=*d=Av44e8g)26l2lbSLLV+W@DFcOcvf z-|ErW9N^SfE4#l|PfHHe)Nw!UHONQfZGd<06?=)(l7mICW`y@isZt9Y+)dSqBxcixcUz$YME<54g$EkBkcl7U8{c^nS+Nuf*GrL%Px!)4va$q)g5>a)4m5Sv~0S!qu>T z3@i0kb3oG7&K7eJ?u@&9rKd;^u7-Vkv!Fu>hqWA(VxSxrauDtc!{WG)dPvPdDRq3u zN)D(PD5rT2x}%2F@v~hpe|L$hJBg}%4oFD-*(?XJKaWb%&ONyX4-|38}J&ypzW*DR+bJU^mVS-nH{tNF5>HLf=9-^#&IQ`y_Cb4lM^mFqcZ|-$h{AXVCiS zH9lbV7tnstVlL>SJ9@zeez5;Dzyc7g-wK9^4*W8eZYw5M3N( zqaisUY2&jGzzd_GbWPkH?f5_FEMVy2VTga%5(feM)A}RW!NjD$IJhf17TxFH;#(E% z)upf1NLmj1z@qn}+tC7lXVCpSu31orD7!w`oZ~%8cwgyTkc(a>eY|^K**S=RD}wD0 zdqwx6RCrgoFRqURU+Zn)0lTh5{rv5+e^2Ofxf8Co2i?eB_rE_Zzk)ayl^B&>S&frVB>I9vv?{b9xi za}LDq?+SJXU4G;O)aK(I`kwHr_=YH85Z)8l<45>k48oU zT8#xOfqM_{-uW-FXVQ^$!t<;yhVjD2oae&a*n@a&?D_MNiI@IruXm`B+6=3~d03Z{ z<;{gx_Ww&@-Hr?6P!9rQ*%-#<1-S=u55%t6{mId(!;{-yzwdin2FCtDz5pwlQ_AyK z<)0op7n-wm-mo|61x33&FRc4cNsD3mru^L8?ZZFA|Mqowa_7H1`0$p%*buD8o`tnx ztl!(YAHI3{)Bn2p#(e{03E<3JbcN@qr5H9BHs&A9KNY)T=f{UG9=LF5Y~MfZN{r{> z*>jKwyb`@Jd*6xQc)7hXB}%=p)j{;yd2@Z^z9@>j#} zy!7?tH(*sRQy9yCt*{!NPo4ka*pIgl?~08^l#;W6jv+a)J+cn=GT^nobRm|$|HGXh zE8~T$a!WGboH~;qE3CfwN^0}iFkZn2{c+i&V!;0f(;HY3z%e9qq12rBu05f|upqkw z)&L(<*0Ax?vvMdzVPY8k^9_-{1jGP&NDe)JejwQ+DKWfLSUq({9|Js(OQ9}?b;THl z%EsUdclz9MDDV}=;12irpasTNMkO%}!`ef%Ct6ty*&~G?E9(ap#gG}v{jBgd*w1e% z53(K$n8UoOIDV`ohT;g+19dw5LapK$f&jkqE2j!$SPxb1X)7^=JPId=C_C)_B$@L; z%T!qmYNb@Uov;T1 za_9p#;;}{$&5ygo9UyL>>vy4F)7!heHwf*yk7%)F07h^FvK&NrqEBDrnhkybVy~$W zdMXd2g_2u>9)ce>@Vwbd9g`X6U&WHS7i5@oz~M#ycTGtN}`*%X)vWKfX!2 zOVWD8q}7AIj|BDKF=8KV1Er@UVMtt2Fer5QdVi-+S{hb+Hgp~aAA~i7U`N~)B))de zi@$l-nGO5L-Ub>$t9I)8BQM8}?*H-Vp7cA=Qr|Ru;lRAHMBhJe_&W$OTv+|?MC^M9 z-h8@$IH~f6h+w0(M_lNHarM8_Le>!_#_KO$$QjaDBuA9;OIK--5t6o_V+LGJ0 z>bCc{edpb!Q-7KLLE%U8IP^0A(WS(}2{D=D~=)ZXP-+%AR&;91Rx96X_GT5=NJ2MRC{iPjxK(wN(cm`E2id9#>!7^+)p` z>y!EqZ`i-)XHV@OzW&`e7ryqNmTozJ@ZT0*Gk@EP)VDYI{<`nIrLV0zux7`WC%@FY JBDH46{|8XK8>9dL diff --git a/glide2x/sst1/glide/tests/display.c b/glide2x/sst1/glide/tests/display.c deleted file mode 100644 index 89a08e3..0000000 --- a/glide2x/sst1/glide/tests/display.c +++ /dev/null @@ -1,446 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -typedef struct { - FxU32 signature; - FxU16 width; - FxU16 height; - FxU8 depth; - FxU8 type; - void *data; -} LFB_Img; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "display"; -static const char purpose[] = "display a 16 bit frame buffer (565 format) dump out"; -static const char usage[] = "-n -r -s srcimage -t testimage"; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - char srcfname[80], dstfname[80]; - FILE *fp; - void *mem; - FxU32 filesize; - LFB_Img src, dst, diff; - FxBool txtdisplay = FXTRUE; - - void *image; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - srcfname[0] = 0; - dstfname[0] = 0; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrst", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 's': - strcpy(srcfname, remArgs[0]); - break; - case 't': - strcpy(dstfname, remArgs[0]); - break; - } - } - - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load src image from disk */ - - if (srcfname[0]) { - fp = fopen(srcfname, "rb"); - if (fp == NULL) - srcfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&src.signature, 4, 1, fp); - if (src.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n"); - return; - } - fread(&src.width, 2, 1, fp); - fread(&src.height, 2, 1, fp); - fread(&src.depth, 1, 1, fp); - fread(&src.type, 1, 1, fp); - - mem = malloc(filesize-6); - src.data = malloc(src.width*src.height*(src.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - /* Simple16BitDecode(src.width,src.height,mem,src.data); */ - SimpleRleDecode(src.width,src.height,2,mem,src.data); - - free(mem); - fclose(fp); - } - } - - /* Load dst image from disk */ - - if (dstfname[0]) { - fp = fopen(dstfname, "rb"); - if (fp == NULL) - dstfname[0] = 0; - else { - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - rewind(fp); - - /* readng the LFB file header */ - fread(&dst.signature, 4, 1, fp); - if (dst.signature != IMAGE_SRLE) { - printf("%s file type incorrect\n"); - return; - } - fread(&dst.width, 2, 1, fp); - fread(&dst.height, 2, 1, fp); - fread(&dst.depth, 1, 1, fp); - fread(&dst.type, 1, 1, fp); - - mem = malloc(filesize-6); - dst.data = malloc(dst.width*dst.height*(dst.depth/8)); - /* reading the LFB data */ - fread(mem, filesize-6, 1, fp); - SimpleRleDecode(dst.width,dst.height,2,mem,dst.data); - - free(mem); - fclose(fp); - } - } - - diff.width = 0; - diff.height = 0; - - if (srcfname[0] && dstfname[0]) { - FxU32 count; - FxU16 *srcptr, *dstptr, *difptr; - - if ((src.width == dst.width) && (src.height == dst.height)) { - diff.width = src.width; - diff.height = src.height; - diff.depth = src.depth; - diff.data = malloc(diff.width*diff.height*(diff.depth/8)); - count = diff.width * diff.height; - srcptr = src.data; - dstptr = dst.data; - difptr = diff.data; - while (count) { - if (*srcptr == *dstptr) - *difptr = 0; - else - *difptr = *srcptr ^ *dstptr; - srcptr++; dstptr++; difptr++; - count--; - } - } - } - - - - sourceFormat = GR_LFB_SRC_FMT_565; - - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, src.data, sourceFormat, &bpp ); - } - else if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) - return; - - while( frames-- ) { - - grBufferClear( 0x00303030, 0, 0 ); - - - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - 0, 0, sourceFormat, - imageWidth, imageHeight, imageWidth*bpp, image ); - tlConClear(); - if (txtdisplay) { - tlConOutput("1 - lfb source format (%s)\n", - sourceFormatString[sourceFormat] ); - if (srcfname[0]) - tlConOutput("s - display source image\n"); - else - tlConOutput("no source image\n"); - if (dstfname[0]) - tlConOutput("t - display test image\n"); - else - tlConOutput("no test image\n"); - if (srcfname[0] && dstfname[0]) { - if (diff.width > 0) - tlConOutput("d - display differences\n"); - else - tlConOutput("source and test image size are not the same\n"); - } - - tlConOutput("space - turn on/off text display\n"); - - tlConOutput("any other key to quit\n\n"); - } - - /* - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "s - display source image\n" - "t - display test image\n" - "d - display differences\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - */ - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - break; - case '+': - break; - case '-': - break; - case 's': - if (srcfname[0]) { - imageWidth = src.width; - imageHeight = src.height; - imageConvert( image, src.data, sourceFormat, &bpp ); - } - break; - case 't': - if (dstfname[0]) { - imageWidth = dst.width; - imageHeight = dst.height; - imageConvert( image, dst.data, sourceFormat, &bpp ); - } - break; - case 'd': - if (diff.width > 0) - imageConvert( image, diff.data, sourceFormat, &bpp ); - break; - case ' ': - txtdisplay = !txtdisplay; - break; - default: - frames = 0; - break; - } - } - } - - - grGlideShutdown(); - if (srcfname[0]) - free(src.data); - if (dstfname[0]) - free(dst.data); - if (srcfname[0] && dstfname[0]) - free(diff.data); - free(image); - return; -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 640; - FxU32 shortStride = 640; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 480; y++ ) { - for( x = 0; x < 640; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = - srcData[y*640+x]; - break; - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*640+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*640+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*640+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*640+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - } - } - return; -} - - - diff --git a/glide2x/sst1/glide/tests/h3dtst01.c b/glide2x/sst1/glide/tests/h3dtst01.c deleted file mode 100644 index 50b2435..0000000 --- a/glide2x/sst1/glide/tests/h3dtst01.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef __linux__ -#include -#endif - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include - -#include -#include "tlib.h" - -#define H3D_RED 0x000000ff -#define H3D_GREEN 0x0000ff00 -#define H3D_YELLOW 0x0000ffff -#define H3D_BLACK 0x00000000 - -GrHwConfiguration hwconfig; -static char version[80]; -static int scrWidth, scrHeight, boxwidth, boxheight, origin; - -void init(void) { - GrState state; - - grGlideGetState(&state); - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE ); - - grColorMask(FXTRUE,0); // make sure color buf is on - grDepthBufferFunction( GR_CMP_ALWAYS ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - grGlideSetState(&state); -} - -void drawBoxes(int w, int h, unsigned long c1, unsigned long c2) { - GrVertex p1,p2,p3,p4; - - p1.x = 1.f; - p1.y = 1.f; - p2.x = (float)w; - p2.y = 1.f; - p3.x = 1.f; - p3.y = (float)h; - p4.x = (float)w; - p4.y = (float)h; - grConstantColorValue( c1 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); - - p1.y += origin; - p2.y += origin; - p3.y += origin; - p4.y += origin; - grConstantColorValue( c2 ); - grDrawLine(&p1,&p2); - grDrawLine(&p1,&p3); - grDrawLine(&p3,&p4); - grDrawLine(&p2,&p4); - grDrawLine(&p1,&p4); - grDrawLine(&p2,&p3); -} - -void main( int argc, char **argv) { - int keepworking = 1; - GrScreenResolution_t resolution; - int frames = -1; - int redraw = 1; - int redrawPattern = 0; - int patternon = 1; - -#ifdef H3D - resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; -#else - resolution = GR_RESOLUTION_640x480; -#endif - - /* Initialize Glide */ - grGlideInit(); - grGlideGetVersion( version ); - grSstQueryHardware( &hwconfig ); - grSstSelect( 0 ); - if ( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2,1 ) ) { - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - } else { - keepworking = 0; - } - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - scrWidth = grSstScreenWidth(); - scrHeight = grSstScreenHeight(); - origin = (int)scrHeight-240; // top of right eye buffer - boxheight = (int)240; - boxwidth = (int)scrWidth; - - while( keepworking) { - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '=' : - case '+' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - redraw = 1; - } - break; - case '_': - case '-' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - redraw = 1; - } - break; - case '.' : - // move origin of 2nd page causes both box heights to resize - if (origin < (scrHeight-1.f)) - { - origin++; - boxheight--; - } - break; - case ',' : - if (origin > ((scrHeight/2)-1.f)) - { - origin--; - boxheight++; - } - break; - case 'p': - patternon ^= 1; - redrawPattern = 1; - break; - case 'q': - keepworking = 0; - break; - case ' ': - redraw = 1; - default: - break; - } - } - - if (redraw) { - grColorMask(FXTRUE,0); - grBufferClear( 0, 0, 0 ); - drawBoxes(boxwidth,boxheight,H3D_RED,H3D_YELLOW); - redraw = 0; - grBufferSwap( 1 ); - } else if (redrawPattern) { -#ifdef H3D - grHints(GR_HINT_H3DENABLE,patternon); // set the pattern on or off -#endif - redrawPattern = 0; - } - } - grGlideShutdown(); - return; -} - diff --git a/glide2x/sst1/glide/tests/h3dtst02.c b/glide2x/sst1/glide/tests/h3dtst02.c deleted file mode 100644 index 6bc84e7..0000000 --- a/glide2x/sst1/glide/tests/h3dtst02.c +++ /dev/null @@ -1,292 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - -#ifdef H3D - GrScreenResolution_t resolution = GR_RESOLUTION_640x240_AUTOFLIPPED; - float scrWidth = 640.0f; - float scrHeight = 240.0f; -#else - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#endif - int frames = -1; - - Mode mode; - - int i; -#ifdef H3D - int eye,offset; -#endif - static TlVertex3D srcVerts[100]; - float angle; - -// GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - -// if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); -#ifdef H3D - grClipWindow(0, 0, grSstScreenWidth(), grSstScreenHeight()); -#else - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); -#endif -// } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - -#ifdef H3D - for( eye = 0; eye < 2; eye++) { - offset = (int)(eye * (grSstScreenHeight() - scrHeight)); // y offset for right eye - grClipWindow(0, offset, (FxU32) scrWidth, (FxU32) scrHeight + offset); - - for( i = 0; i < 100; i+=2 ) { - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.x = (tlScaleX( prjVerts[i].x ) + (((eye*2)-1)*(vtxA.oow-.5f)*16)); - vtxA.x += SNAP_BIAS; - vtxA.y = tlScaleY( prjVerts[i].y ) + offset; - vtxA.y += SNAP_BIAS; - vtxA.a = 255.0f; - - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.x = SNAP_BIAS + (tlScaleX( prjVerts[i+1].x ) + (((eye*2)-1)*(vtxB.oow-.5f)*16)); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ) + offset; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - } -#else - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } -#endif - - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/sst1/glide/tests/lava.3df b/glide2x/sst1/glide/tests/lava.3df deleted file mode 100644 index f6aef2e7cc5c29c2be89a677527e474449cf7a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88450 zcmeF4J!qY2nx-WLq7VzJHOO)!B=lnr7^9VHEp2a=MN3FJLXz!8R-mA;WklEPdYNH+ zdhOb6C|DS%aKZs6lTO&-gcEk!VTB!5T49B?*L6Sd`<>&OnsBrIy6v*9bH4ArpP&2r zd4IkqU;Wqh|Ml5__-x^C|MSA%{O+su|9SU6{@Y)DvHscmf87613wQ7S_OE{Xo_~A) z-+$-7eYP<3&!2oU^V7ReXa4kO{`;p-X1@Q7|6cxT=BFR{@85qi^TW6N`tp;RACEts z`Qh@DnZNw__cK5K{iicO{R5x*?XPA&xqLLUv9U4p=M8?wub(dY**Blge8-=E{9$9} zPrvfMk7j=Qt>CBIO_lF<8$T)ubmY*}OA3pnZ z=3lsn_xW@C?@#~iclh}=_xh4w{P%}z$Hyz16 zYUX=B_dTEco_l})Mg8|LeEtXi{G-_ak$e0DfB*4v=BMv?)?fJbJ^1+icYf{%{{4^Q zyX4m+etpKz`HuhP@8AE(bAI4HzvbWlnqQ3VFF(F(pZ$XGU(fvLn148)`4i*%=?BK} z<2O9V|NiyNU%v2J{CeciklUAx%U^%}$;>}COk(>de*N^1e9rIwneYDaTgKsidH#3a z>$m*!xyL+@?|+XT{_?At?~voCJoCrzJ_F;IeE(ZyF6K|b2QJ3_<2S$JdH(m)nZHNZ zKcb5t{~1i*@$1k0`V+tW`yY9p&*6LDGw#^WzwqyW;aT4^_P_A!yA3`AW_0@fG4{m$ zzeC?YIi7#y-pKmL??0RQ-Z6fM{{PJ9!TbNO|K}3;^xyxVxz*9i;_lAr>Fw#(-qGQ+ zBD3G{R^(oA3b<{ z@BZ`W_wPM^;Pv?4b3V%Fb{7{{W=G?-x%0dCH}7xmuIJCs*VpGZ=FZR8mUgzbb{1E5 z_l}+&9_^hRJv+X~b^rdi_qo&Yv%`}or~G(!X|#VfUR_<==Gt6aTOE(b{AFW{}#q;B1V4UnRhTX*#hOj^0oIAf+{^shNx7X`yXR|B2JAhxv zV~?LZ+O4g6oCVLK?MHF!R(SUT-{#3bQpK*n`cW=e+T^h-o0Z#982K)41KuvxcK+yk3sg} z@pJ5?w2$!={zn=BKMQtkp;^PRBHdZpU!A+Yx$;s1;s^fr#`^l|%Ffp5?#jyIDVjS{ zaaa%VdHgZIj!qU%(cD3_zqYn9$F;H1)W3=_HdH^lUs{@-UFrC_lh)iY>}}odu6To7 zzn2G>zm`z0qSS`F&FHG=PIvfe6LAPTSD<#&=UoKq91*(1AwWlKlq>Bk7GpX zUwkq1YcB<${*U%<7e}jecgt5VU%mwYH^F}a{_V}V^|jG1l3eT~ci0{NGYnAKHTYQj z#@zaP+-6hjZ|1M{WBLaxT)Tt)W3+r<<)2{tD@*%)8n4lAR`tT`%eAu+0`nWqTd+Ev zSFx4h1U7m{1bcf6_yr#f17HC0>K%Ls@gW!fS(67d$ba{{-vxi*pPUZpqkb*m{Y})r zwmr9TwgPe zBUBG~FZBQD0X(s_xTNJnILrLHy3zuc--BU&V{>(5V|8}t^cH&Di5gTIX2{d^JcNF_ zD{BG&Or>4iL7kB2#rlRGe{#N5n^dmljY(D+(F+Ojkm+QF+7B~Er+Z^7m^>| z+u`fGQZFI^zm@~Z5gP#h1pWKp6RA!Qczy^gtN(DPoTUK10RG?n&EEhY(^J)OSgcjgj_yG(e3ZX_dG`V8fIIm1#@cv)ACuk; z_wO$O1W9%Ls;e%Ecj=5TV>jyHCC|QChe5X2N@xju%3S5=;t$dffhYJ?jVSk?C<|;o zu?`A6{*4CUPaJvfApSCbbPq>9**Q4F?k+CQFD~xhzYY9X;Qw%U3Hcey#w)kjRc>7H z8)>yiiyrFRU)`R&xPH4F>rnz1b89djRE|sI{KBsoEC2NihsCp2mUJBKoe_kAmfy$s zR*U9dB=cL>B_VL7<+WU#w+;A6II23 z5AWjvj~+mQc<$-xf)3=sn-O6^&&dyV7H8osug#71bJ-vCZ{C0({jG1Hx7D??Mee$= z;E=tC7x!rayYTm?YGQGmljWnUDN6(f9njW01zv=N6V}XCO|$h-Fx)l zeovOomNRlwE(NFKBx6-YWPN%b@L#-m^9J?bRs0&Sj&`3&(G5PD_d@&H9dMxjC9<^& zToTy(x9}giBkYL+3m80bu&Zv!6CexhS$|Ube4U&*DPLuZa|jX-xVj38&w{d*wJ%6fFwY1U;y%;7nw^^s3B{?1CV;x{)-nc zRR27qAEOjP{|Q9L)v~pQzQ~X9C+sETgTT%&=C7$8?yilU+K>3n`Za&S4WE{&kO#eCV;N~;70%pdJ)<6?BeMOs#!oUJ6nh4 z0Y!l@Lfs>>L;r`raWu#`#YWdY>VJXyv3{f1=qpoUpK;%yjry?8Ghzhf z1%ps0UDQ=|lSxl55?>PNJuP#0<>0^+2$C|T2z{D28z*4k%Xw;!i)6kj`@}yU?Hm^T z%G^QF!e7-6MFA>ef3&i*fS>CSn8NYB&*K5O-RTnuF~yGf??11CZCCEWc&YcA?+gFc z)!X+3FWe8uT--a9>BD^!`20h-pM+h%4SR8$^ZEIU3sq?PpQt~snor9t{8R~K!Hbw= zF8v4i(j+BcDCCaNw@&f|_wU>qp3Y`ZAv28s^QQg|-|=KjnmiuBaG{Dl^n*Pt?w%eA z+5Bz+?SK2A7dtS2uUO2uQQH8&)UWlgLB31-`?IHLUHn$OJ}%lH;6tCSU{Q+LJ|(ji zBjui1JmEtDpnkAWzM}tz9}B=oLmv-W_OB@(Lj{&4?_X58wAK%ABw0(ST0w3+8ez|`G_;}@LckdWuInnxw zok|<&4)6~cc&=z~o&az+4}1%MuqUMP+gXal=-=?K zh#v~zA{Q`uH2o8P@XP&k`-`_*$v7P53hrO{qkS!Xllm%b3?+xQ>-e?jWRSTJ_$AKJ zUP7OuDE!zza=R_UkN*9(SKwoW37wW-H*>UG_%vzPtqImv+`k1sgVz9G$E1b=zR?VO zP6!}WnG?b?P@pn{F#XMMrgxGw1iDDX!EF)zmH0`0URrwu{>swQ$`;?JJMgS!pAb*( zaFRkx0%Q20P$F09->4tXV<>Qg1Q7g{^lNsiT=VCv8bO0!Wuxv70n8C~%@&d&5XlOE zA(?^?`jov`CrX9$q$45?$!?eiqoWdh9Kwj#6#Qatt924CVzz#(1AzV^#)k%14ZSN% z2Rm^*Y^H}!g_xX^M_X!$hV&4>4{6h;jK?+Vxu5ix)(K)u$`jym00o%ziLyC8 zM+lJ0q3}D-&}7$Q(;+AZ8e$AvIFwty}HJ4V(hjwY5?RA$?Y2F8?l!#doos1ja}-d zYE<$qQhqfT_Oj+O=hFVq&+iPo%h>;`sypa8QFh5YN6Db#Jp^BSg;tG@K*o)Yk)BfD zZE8p05BmWa)qBB!;$K=K=OO>CR)sd&;tI2= zTRkIqF7;2uQ~!o5G-El<=rC{vfCbn&vT5j0m~)_UaJmWU z^XKTF^jY|^T@Ydb`oEn^)Gz!fHCe!bU!^2aMFI%HW~CCac|!eZ_6Yn-n~qF*P|N!x z^k1308bpO1zSgf7lYzli)RW$@TF7C5giq#binwC{4Sx06%l1h*KHzb8m*S^sL(y%^ ziH4)hyNCK`3U~Xx{GWs{@l^(mh9NNV+qfld#@uH^E-eQP|5X4Gzex*?Psf{PO`ItB zWdM_Zx^8FKaM!<%h!@{42DARM`dUDC!XG8MG`kYNMGy=Cf(S(XU@z_KH!9y!F~!!U z?FynT&!p*M$MZZb7alG5o~r)L5DYSq3!wia(#sUwy0}gr{51Ws9@T#kn@;W*`%mAW zdISe(0?-k-kb-w|7EyWwz{~ErQAbY%yW~ zDfeSHjk5iSrhlGZYx=zW`2&AgzMdoP#pH6U+r8rlkC-8FilkiyALa9$lDL>2~ z?Z*Pi)g?+9!yVe0^jEWvP7l@Q-Lext7eqe4nbgbviSr~= z0x%bNPCLQiA;BlcIRaYT2!MXI>NmUR1Hm5(2!4|h6P0#p2N6KSpVD9aP5*KjQpS)O z@aSOY$q`*g&`0@XUSUqOFZU2}NLUoGbjm+kZrWjp09t*dr1hAkvvFFTtyPQBL)zf4 zv{T=Alzeut%zsJ%fltRcX{OlmJ>($%n(?fWsO-Ye-xUBUS;`$NAm9rTLX5YTFuoa061?~xqjyOqW@L} ziyu0TItu-i6@cHVpU{5-fc!`OK>$RX(*II(=qGqjW{U>=#<1<0C&2;?vR)LV{7Gvt zH%=94Q`}(La?Jrg_}`yzU=Qiso}Uq;9N@EOCv;56ecL4IuM-C7B_8kHVqbyolbQz_ z1SC7${Y*CYM?R@{K)|m#wlrOWjezd2p$-xy#@VOOT{ z7sCev?Enk_{qN3Z{w@XcPdf(#5gmGFZCOJguRF#6?LPxyQ;0VwDpJT>wm!9xni&=-632sYKyN z0;a*^F^`Y_3%?Oiub`kP{D(H3(H*^C*+4cVnh^f%9HWB|6u%L`_E`J~;ItM+sNWD= z6xvK$u1EZ%UcUYkWFY(0^I6SavxO9S;fM zkO_poOakAB`Rrn1wRYUhCJ5aGLa*Sj6&?}(NBFS|OA^s02$fle55zD1v&4h~5DrfH zKYu>ADt_FyN<_eQoodz2XBDB*OB*z=A$l2lUnFugJYh=WK#NncjbVLpCsUH)S!EZ`_xv@{kFl;5EL7hq! z8uOCYLhCjuz)#4-!ZmOys7XNdj!6YyYL?>uRPRg{_X$_hosnLZ2gP57URF{7 zTXX?T@JwR}%WsR75P%)Pthq64VcI@K32>Dliq`oXSN<7#PZAOVXa>NiE!S`deDK!< zrF}M9)eKnKv&4;(8~U5zck!G8pzfg7$JqE26{zZu^Cy&%49fqb7@xA10DArpe(u{Q zf*6&O8R$4lG(9npJ92Wc`C9q`FI`=|Umw!}A^|X+C;ajVJF!g7uxB3~A_ zrmn&Jr=s{q4fRA-&@bseO*yBcnT@nWGs>jjb#0xY`Y}Bhs;)85f089e7iy<;h_ByO3G~R;10MpAP#6hAh^!-l-rKK=3NA{Iy1I;)S=gG1 z3O=?O>RN*So#V3CE$2P9%TtMJn#dY|EJY!cN0Uothy#efjEx~Vo-}u>plmJr zYBJhmv&xG3hoAV<0dpm;49PMh1(10^>kVm<=6Sm$0O9)+13>hH*fpv6tHIEKw&yOFU%L1R`~PsaLC#pdfuL+iSIUE6v7U%;atnx6 zfk*$%00@1KD2qwuAhbh@jqg{BNj?ZwR@i2kO!cB?xP1_St-d5X74tO>r%+1$kRlnF zRfzqh_!cWa$Xmx~gV8W_suMA*WVNmP%T*12OcX24D9T~C*RQWI0L`BSU`){@SZ+Z1 zT(vLq2598x&FdZ}oj=FVZN(pz2tQQF6k9deLx*K34L{>#NU9srtpAA2@dMZwJifPvX9@cb;ro;#!HgAhOsvfA1`mtN)k+0>3wL zU0d3_L?WgSOD2`vaf?a!EBcQyBT``*{B-lOerzGix5KFRo1Y{*H#kwE8~+V%kwEfb z8pqCc)jzS-0a=*$!hDt=3{T!cAK@=tiYQv%4}J!kFb5Zg@QnV=`BN5j&N07_VrGX*bs zXf654YD+3{7=WG}OHb(lk^sOXh%)dyetp7ZA9JaYL$}oOY8t<8AtzyyiSF?QVgdf| z`Xod)fp5}oEULAG!GB_nPt1$)^V~uI;l5~JT!~yEHaISnTnwk)DDSF5(_i)B;sm~> z^-A{Z^ORxMd%5Vs)Ad~4zF_SmYhO1u?Eq^--pP3r^7avYh!I5Q!JGZH2j(dMhkk_$sSc&RKFp%orqcL1Ac_j$j?FGgh3^(8^e&F zH{j}79ep=)dn3dS>qE4WK>!1O+i)zp=ouf4$hEVxwe`2Iz(7NoKg};G7V2jN4L_59 zHZtRHl6rQUAglwVVipON1{A+V0ERiNTu~AK$o`G}+k^TckOBX};w=wKT2I=?%!yZ0 zozlOtkiV*fvcV!@+^7qnQaUO-qcwXD(j#iT=9 z;V=bS{uW2+lbpE7EBdeXBjRrqBB;JzWke|}vl~tte#@^2py);kOyN)JAN<%aQC3IO z{r47Fs|RQ+y{7-zf`7>pmbjn|2L!1sO8^~yj32FGMF`9JwjTS91UL$=>-?MgcfnyK z@bWFQ{`=#(8@IeU0fycUGPiB%df`vl!PLQzvdgI5X@j^z0Ewru0VH7kZ9<$#(Sl9e zT~qE)fojGMX_tvI`O)w*_{xR~{~(K+L<$23K4M0^2_Wd$U=R7}`}TM7TD&Fe5*1MO z+>88Siq zK=hKIi>_!x(uF4D&8pL@3pV?lZQQ+|XGUV5h0LNAe(s|owydN0kNfD<2mn$)-_QUu zj~dD^n`dmL{y_lJ1@@oHCu%S}p#Mru(45^}dej|%^M4o+{?+q|XBwY@)7-=On@1S= zz#o=Z`x-zj$i1o*@rVnWOv;+NtTkaN^|@-%{nh#E(gFBm{Uf-Di^fAXZa5B}U)JB9 zui~HUW>~PfZMwih!lCAl0f=8sJ6`jFj-Qa}SnwcH0r0ch%PWyq{B-{vz5H*Td%|y6 zg>w=3Z`m)QCvCF?7&3^mey1qN*5s{Irfj_fO%hk7)WtYZ{-qO8>fTb9D@zZr*3S-B z&Nke2LhQF)&M+7U8Yv#)uTBY80T??{{>~gRX=1~ea&a`)>B}kQz%qXYkQj)$R7rr= z%MUHto%CkdgxZ#9QQ8r5D*(D=fqYW~U1Ol2C8gl^4_*pB?qWNP3{cKW???QEevDR~)!YvF5qs%BSqFU(B01=}QP69@ zY!Kp7fZ`v>PwiLMUKIMw-G$nW<7vZ%_Z#uM)!_ZxE2^HmwWUQC`)irZ_mhd_$$FmK zT!*-8^-JItkr%g&0Nz)_$ZE8H5^2|G3O>eS|2O*+YHy2!O6QMCn+ZL}J;C4f&x2(H zC9e_Zan-56GEKvrSnLh{Y3m2RDG%{G%msdCxE!f`kqur6d#_)A{W@DMkR^H06&+7| zSc#Qc@1X#C8rHWf;D2(z=9EjYn`}ILTODJPLu#=Ir+=b8R_UPrpDK_Vz)|~U2+-Ln zL$$1h-{a}nKV#SKVs@B@f<;)?6wV)0r@sQfxd#cB>bJCS*6)m^8-CohN(?wdzP_;Wy?nW82xo$ktomT*g?`-=wRNuFXa5M+-7>dG+GO z!>j8HnoEf#4L9fetE^Mag0^co~FWbGZYL2cQd)Fu9}{nsMd zn{P~dRR7c0FCOYdTyt%g|E(Jy4%l>Y&uM5{t}b1ZLj(UK0J}Cf|Nd@nKihPN z^gs~-zfJz|5OQUj|C#;G_CA=KXd(U;H_Z^<%l>r*1mPu@5%IBol%D|V^zqfh7f)Zm zxuThLj`{2T1AM;#PvQ`1TbQ~X(InOwr7Fzdq!;|Jzt;VkfKLn|^+A4y3^y*+vhyrk zwFOb|Q}qnWhjRCEg?71p`ELDeF_G5+k2HXf3?I+0W`j%p=`d;m&ihpSgKvL^e~Syh zPrgHAg-`P71lzZStJmOPX0g_~Uq}62`+O$`n4UD@)al|A&Q%C0C-k%SAo_jZ9GddR8~@T-psRXpCDmkaU>f0FH*elWev$G6BFTzXTxz3ONN?rG}Lqh8k8 zEcNyS_+3DAcfNWcenz0uEV9gx7&NM{#U)Jp_LQ4FZh9X0U9ijo%R>U4_OIJhXOk>)Osm=OEa@pS7l`c*}_7Jw#4VC6N$AV4vEU5OBUW>qhM)GDgzGD+xR3Z8PO) zgA#tW`J@<#{^|X?i*$lN=p$jJ?&z7J%nAk5)xv*?`8V%Z`(zK4Y;hXC4U^kXfx1t# zfJglJ4+|~LcsbdHI=`A;z>nUDK_+@9EIniyQtQ8B`_V&-dL$7BZjHYZ0hyLRfuAjV zwNV|@wJi_lXt9a-Y;Oqmlv^)wJvO=!c%2z_yGnZh;s-#}|A4CYZ3je9%`e8aW)xnh^i7Sunp`RSQ}B1wn|TM;%gS848SH}4?vFz@n& z1x8`DwX|!xeZn_WZY33xkQ71M`+do5Rt+Km`2WSSedMNowT0 zDvfc6gYXEJk32uzNG5-%cxZP#6a!Z~rezXw$ z%6=-6=(wakz|ZLj)a)-w|5HLpMEGJ~;OEHmU4$3+7k_vfHuiCNd=T9Yl#sQSxF?5@$Gz{8+awTDGOR+0pU7iObdX=wyU;w_ckM>ukwZehp*nDes=lI z!46K?j&Of@y724&u{}3fWCGe|z3nPjC!|wF?1WBlnCsLL)hzug)ySv|e-^0k5LE7W z{9%8R+ z4fC?DtqlHOhD)>M<^vf|n2(wR^?&u0yo<=2T8?!;Y#6lfUsYfDPZgFEvz>tFC-B1| z!hdbndd*x4YsbRsEM1&iBZHuIW}hswGYC*j9EpDc``3U;p~w|VV5*ZIg!9_we9^by z+Z7?!TxS9gi}q|5x-bm-hy&q6Q}{i!j7_^v193$Hg+C#e;1~L%=y><8S--b&5ZUg8 z`>TH!d(i2r%{fKlu1#w9K!|})(Ry|17H=Gf#LL8E&ef_^Ol3PIJ;{Xigz`V}FAl4! zl9?Nq*(d7^Hyn{^hUh+i-^|aNo1`zUhwUkRr^cNcl{_&YhM@ho@XshT<(7FaW_~KR zgX{8rZqTc)=KS0P0c7gLl@IVg=!Xjh+H6z(mG=$mr);5Bi5`8J9cSk1+^v+A_K`r} z+*J5ETFU_7$19e^o{2o0tnk44Ynln|hxQyqR_jZ=JUkUgJsZn=LBEW%35cBO@`>N{ zCtA30)*yqj5|y}lY|^&ua{JKr$LSuX{>so*fBV>=af&>B`qF@R=qOLCzs#RuT%C^_ z>%00R{gbr(xj_>^*-++?Jd1%u!U{>3B$bFi6L?${jEPJZ6%O2)pzlYwHT?#kg3*T2 zauYzze+obQcFmOshS+pCyv>|HF1|J!C$i~hS8kOm=O-TR&w2fkw`4oqw zYxjm;m5V%#duVp#?gp+@&)o;KVmVE_;!b{me1c5KJlHlMr)t?DV}WJc)h7#7?!e&9 z_d}VDcx7)=7X)D9s`C;>wg04l=pX(!AIaZqITSKCX|9=e!kDd0M<)+jZ7fpD9k8jn$6L?z7z%AP1Hv|}g;{V(BHJ#Y@AG9@w*Ry8X zCWRYz^hyVk`YrvviAu=IRt-Ss1AQpmfk50z+7({w*JpJep>O|y`!hx~K&Pwlb0_nM zL_zU8muf&jt45RROqsZvy)nTDLAtTI8$d}){H@R4@N54~02qNDK-JvT-|=Sy0cPC| zK(6!@|KtgL1H+(YB#U?qhI^@AVt--WVlvFiafS`-HS%ywA!xHG-2 z7&iiYv{Oz9=;{}Ku7Xc2 zFy&74MgOlj8_W1R!5@~60IX)hfL;9-T^ws>%ggXh>~nEJ@=2#|INU3f>*7ZMrMKi> zl|RJ%vq?J3RNC$g5B755BBtzSbGkkj3*dLMF2}@ZOI-p{ziP!PSqBv5aJImcI*-yt zMlyirXXU`>^el)gerw)Yz9)XOFXESLMH2nX|7S55b5wE);(0<~)+B{PSXPVXty#1n z)lbLP0~as=@U!X@bA^0DL1np7L&9&8_G%hu%{)g_ z1cNJ;LA6}6m6J9LY;_{3G&za^@)Zj{+@zX4!B4;5BLx|~##>Y6(SNDG;pYn;pJ+b| z2Y?W54#~B+#dQ`{dY0c110mt8`fT{+V1rP~|H>W`s;g~G%ObVA!PAy8 zFibSM#8#PHF&Bm#&NUypX_P z|0(}U-53l|6+k%vd1fNW#(60p&hjp-EMt`oX*=-}6jmVO*Y?|G5>|5!)LrHu@I>n$ zX7ykl2yD`f+0!n{B8N6|w{*Eq+(mfO8DE^@7lQLq%IFe^l+OaD9z#ntY zgu%aE$;9yfaDTjq>2w6Zx7*q|rabW*%)gGaD-*}c9l7{(+=M;r!`~1{3;#p_2@{m( z`5*@~)M*OJtGU08=VFSY0F1hyO31SCS1|(hwaRL?-{L(# zyU58B6byt5Pzj$Xyl4tq7fZh#NVVHTLFqa~0QOMlSv%HfgVjk}R_y#gFDSIpMZq3THKBQ#b2ePrSo6`Ya46|F!-hGQa!wE+H?h@{NDtCy9ZM| zz!@0>7t6`B#mzHJZH1@g)L*O@G=AW_vl;PWWzL_s(^2D~C@NL`i zHK;!2ssf1X-m>BWO0#P%0SvN9I;DYVAzOF@bF0GlXcg=~6J1bGg3p8l;=kML<^0LI z=$z`qIx(%M;I9~{2M_{_E~F<{rZ6MsJ|a8RJ>%p%ri%x&%(BP$NyO~Gl_tpnpe_!0 zV!oxFL|vIGl9K}XUxSZ;#owEC6a2$|F>WHKlKodsfdx?1agkplfb6s5M3siW93UUB z6u=OO`(e@Zp?*P|chu|+?yT`Dfm;6y2!A!W&$OEYT1%ABm2UiR$Ua`^j}+sAvJDNmqNf21dRZA zjK%=>c^;c5t3>~m0kXW9&w7k};A6qIi-9hBj$>uVPW3W9A5Z+TO$~XR9)Q_s`n}oT zlO0toru6x6HaI z0pbw%b^4QdnYE-o*pj~*SAk#tPaSo9k3*t>B_>X6YKGkf0D4KT9+UHg$^bIe6Xxl& z{IYjU*tsIy_(P5&Cm33ZdNiveNg0h=2uB#UXhM62D+**AJ7iMouz@8lvQJI1f`Cn5 zOFH&oP2CCQ6}@1uZiYh^jje$?#A^Ls4v@xW(VVHvDQ%P-7!&~nl(W~J+JjzE#QN(z zB_}!SgMFU2FYawUM>&tH+I}3wZy`thq5ccMzU~aBNuPLB79%A;r{5C%N`{~E^IDvl zb0tV#t3vc=_Ae5Y(M$_pP6iW*O<5yDm~f1g5wn>&4{+AXwURCV1^*L|Tg-_$;wpA; z0!T2lGUO|qImTp zJR&Cet3P7bBl_=Ec(U@IN5;x62igJ+rs#>mrWlbA$Y!;EH=So(g=E*4uY3H{SVi<#eCEA(MXStEcxJ(&dh z>ai7Yd(Z0Ba1RHUsfb&CR>R`r29gI8i!wnD8twRP+}X`(_>sU&J2S;tm>8IJ0RyP5 zHTXx@KQ_V%vyOlPRoXPbFgTPMRUO~sq;|r=iLG^ zfo2C-Kyv`KZ!}DWlr5%G1j(Y_R*lb(@F(dCe)lkD!Di}K8LzU}_=D=-$A`tiRn1G4 z7X3nA20eSvYQNy4)nIDyowl@sxrG4g)Oa?(w#Z$cU9z&xgI%>Qt^`oCQ{v48!4Blz`z+OmSh5fxM9Bo8sI^=}m8XCQ>Z zE4?7UU?}3>F_9?zfnOw#lq}d?PnLhR2g|5f{o<=LTzKS|D{z^*w4xjfu-f->i6PmP z9jq8YXk7zP|5LBl_;ubd;$aFn02lDHh1do`c9$Uo*)iTx22hRf@L%wAo;1t*^>H~) zVyrU82*(ge5{&-#BGQK_Z`5n6j7$R4lAbnrGo3g#8D8*L^H+B#MU}ylm!Xz&fx=(* zj|8|&=0rVXEXQneFH{>jA;`y%2K@c~A_%kat9dsO@tXojs$EvrzaQHg_+S0gdC6jl ztWw!eU`*G(YPXmJy@*O+hjKLdF@VIa#P?)9xVJEBH&xa6_=VM9#wFpCnRfg=b7|AC zjR2Kc3sT_Esgqd0c`y&<^ppqx3V&X(68)FuyN$4ZA>i6jn5Ym2(69SJ6g5PZ!?5$1pPe5i=x`5#?NeP~5 zC9GQe+ihf$ill`<>sCtp0TBQH7{46o3wF3s=r5ih2~4)r=S4aL{+|Ef*r?yOgX)L= zC3$i=vrn@RQ&Ec~O7YoUX5O{Iu&V-a&}cWGh9xa=<-RNm<9n9wAY-8|_!UO*CrX$3 zSN@)Qti2;(l1L_#;?|=I|Ixk=)_#wY|3vX!`~MdH5Fy`-D@^IX;Wx7pe(-Dm4Sy3r z!59B3$99|+dTwQS34G`7+U#GJCmS9NU2eo-;)(fA3}C0>Cm_cF5Zx61Qon&D)}KUL zGO>sfKjv@Xlh$n;ik~w=%>SDJDggeX{&9ga08g7}?Q)G4rKQ@)tea)rfZrf*mq!C2 z_rUlWh?(Me$;Atffve%qplx8e=)&r_DqNtjC=PpA;W$we&f7(DU-+-#m!#5^L;V)8 z7=%?2@b!N2TmGbhBK|ahH0xr|B0%MrmkUi&0PWvf$3UkXfWb222wwenqxDJE`Vl_( zjef~-#UBC0rS(O6UVuph+Z!p!Vyv=$qzH}D9&m;-xeqg%^_9ctbh$V!7yct^r)6!+ zF8a50Yw%eSTkt!6MI3g<&_Rg`m08 z{qR6A@n2Q|G|LJ8Xh9w#sl&ouy2ovEBkwcCeJxpv>)7MstRX0Gg!LToHW~0k0NL_e z_-R>ZMrH~=+9zN-qyaxlptj@?K>OyR7rv&V{?kAhj*OeK|KR7d+Da1u66k+yYLjWP zH6Cb%Mg1H9pTAE2Qv{G{oh66B#Ro}k@WP_6>2xKxsA7To00VH2lETQ-Iv@b?)8oM1 zTykzXo~|F^uTD!g`vp)nV`{>#*}wYd!Ly^0OUB?Yj95TMO7PP{^T4eBZoNoguzx+E zq}4^x{~G}uov^{I@Vn>+{U`pD|I+xYc@0ihVqVYlAnG!#v3_RAq|iP=)Pn)5drG$? z#d0#l7yw&SCitI_4<-HK1~&b)UmIWrr_BQ3_E_7Xf15={7TyY@GWB6m_&yb$U3W-r zTW=S%5`M&Nfd2o>_>S9_*Y8*z8H%Y>P*-%h#dB#07A!&jCD5i2jmX(@E88fV^?6m zE$8|4V#i;}g9bn?mCk-YI8^$7obX=)Xs((s@f(Jx0QB6LTMS?YlCt9pej2_ua_Mnc z00ch*3VaAa7jy>Q370rOAw=zm`jH^(7WlG@)QJE@K&oOFG(nk%-vU@!vG}swAN6l- zX~3OAvXROO0HRIiQ^l|P-3`Q9QI#|aUj&T+1_4atuk`1a@CQC${|J8$vf|_<3ZVJ- zY4>K;qb(;}T%u2%yabGtQK4&Yfd$qw0|N*h1lLX=K9Bhd0r(O-w<3ri&VF`c%Q7=| zjKEDMPT&ot6CVV;iwt>i^%k`Rmzy!E`#E{<(9GVyMMDJ?fT2TWi25=gow}EH@rTlOH zp9**aK5w9{8aT=`{SW-)xOo9?7H)Dhf~S@_|%%$Y(6dPPxKj-l-Ej}U4 z1%JU8LkI{0W*KZdIJy^7-TtwHqCepm^lAL5v>dvm>yf-!bmyXnhgWyo_@LU)OA*Wh zq2SZw-b3d3@qg<+8($G4C|o~hgRtR$BLBPcig`*uul~uN00R3Lb#QB~FXeYTFez`t z5xpZ|hbdVz`}4}`dmCp^A|v3P6LoO5+E@J({4HAmf5Csm6$2>mi34bVo`>rpm8{rw z$;+FU^DJ#{ed<&;j0F@m*^+8)5I;#?TR@->D1Zrm3k>mF{}g@*FY8t4zvfLt@(TEk zKBV3Zf%w633>csA9Rc_cd>;`Qu-mTwfB>gmG@EGk-T)0VrcwSsWIyd&p)UKMeehLl z8U5JJFz+_ghwL*I{{=@QV0#dBQhUgc${q91x#ZpcAt2&*Z+(%ZWCocsvgv;-_(wGE zv*;N8%m3(KF0f?AZp@sLIM+tu56d@9HbbAnw_AdF(L!Q-s_3WT#{v??nFhO06&T-d z_=^B0`2FWXpRr32lf>QJ&&>a3ISaPM&(R1zJP};?w+LO_dd~6WK81U95f=VCyYl;XIwDrs`ntI_A{=4Oo2GFzLsc#ni-m##e7wY9G*tT84 z1;1D8`?_9D???dF?F9e9$MoQW?~Pg*BZxXfXaa))Q|XF7Zy$B#DWH$&>}d+JlNyjZ zl%2^BKFAo@Gs(FMZd0kUL;R$;e5K$w8*YXUe&0Bce=xR&zr3^K?*h@N4@mg#mv$K!qRS zd5m@Np8(b^swAc`C*Kynxu3J>MxYNYJ-9jF+#lfQ9yA-7!Xxbgfm3+Fp_VCSEGl?s z!3hM&zjFn@88FR-q`&q(7;s#t;Pdc+3h`v(FT3>Jwe-d#G9JE+`Vl>3>4r-`1a6Y8IAGDSFinR#w1Ry*K1qk_9KX%zH;C;K=SFuYxS^O15PH;o+>{??;~Z z{f?g08d-&bp;$$1c2Ve+PBY-bQ0s@YJYo!gH~fA%^ZdcDALYh;Gi`&|P1ZU<9qSj& zy92*U4*AzbA{~C_Z;ij@=M@kkz#J2QbdMiL0Dd4doD5w7RMTXFU+zttt+vM4_qOZD zS|@gjKg9bVmiGr9-Byw|B22y5lhTTHRyw|h? zzi-h$GbD}E?eVwF({DP%;P=@c#X?U~ZlorB^&jU)duTRS;5YPw;q@>pyH7NLe(B~8 zvgQh^2psI+uMFmI)=kFhV$;ic_{UQ=Ufzr$|Lm+rfG!Yoe>gA1NXii~{18syiJk!d{b#APUhy-#PUtCAy zMY-au1x(m6c9{M<1OSJ4fJGOO27+TqF$n_4HXLA&LrVY}!X1Cy~mA0HMa(Bf> z^;cJOOmCh#soS>K0<<;`1U|gYMonoMIIL>~G}!}-V3|Tr1ElaHLgSytQ~2)}e%r`) zmA#1ZMVqzQ$(fV1O}PE7D`B{Z7da6=>@9k!zrd#%h%xE_Y--I377{>sK2!V=K+NZ( zx$kcMm31}rG`;5EzkI<~!#mVZzzS+Z6_E-%uPbIr z2J_3~uIMXMBJ>mw{nG+-L9`NZn)qe6DXVZ*6ER^SrRC8wJB7Q@j)ltV^9Y;WjuA`UT z`K1sJT|Eo0rm{+$18c{x^^{Ba-Ew|LVZXOdXi3Y?H}YNFy>zSBw#zKIGlt_bbseAt z5aNdwJeh2k{l82UWv>t=iwA3fKV*>hf2-XLp?0};v*v+X*DE=H@fXoU})v>j(eFUYoYW&fD z%`ob}nUYJJVtSX&_2v2H6`}v_I%i=)nW-H}9eJ8@B$7S?J$duWXceO+YO+bs9XeIC zxCLn$ceB)elclAGH{Y=>y+sLOi{%X0KeYoA4U6PwN+%rK0spSkfOaD->=+R$? zuNk_k&e|XXzylCKJWkM=Q(^4>se6B10{FOol0F5m>kENbK%KvTuIUdeMx@h-rf4Y*7SIq2FSedfc#I z?Y3_Gp3b&@z6|{LbECFFy!s7onu%ycM79x{T`w9fGX)-Kv4Jq=*{sRJ|1)+d8`v{> zLc3E(@1EbfMf5P;Lp9AzK;3k=`(sJ2FFmwri_KhZwwFf= zmSPg10bl|pYXtxUs79QDh=B13-wFBZwqnAW>%oM9PtWq269L~}aH5r=ijpZ34C8w) z1vYGtQ_4z><1|?)4=ZNVz*~%W-!nZ^w(`3TgN}bk%Sv&ywylJ;u$lv`k!K zn3gjRUvmY)&kET-+f2Tv?+ZUE2=T#Gkpww>pZL@OS>Fq{?u*w(E1t`KT;xN@zWju zllry-P+<|HiKpnX6f&T=lP!ZdPUhH{EAIMFy8vxC@dx_s*pBi=pF*JokQf;FJlPt% zShCVzzH1M3!}`>H!FL!1-)RC16@00QE)fB zKZ@n4m9whk6gmtIj#7Hqr30S8Uri2R^Di^c%F>{r)udOB|68O~yCj*exn6OR&e+g< z*E+5lV%GqeH?Dq@bd$--=KD&tZ81)mPRz;4P;T^?o4aw7^BTwU={k*V`3_Zj`WwQx zP^tGiT(j3B`f`QXc#|!290$vZ9PZ22D_`Ma=7bItc}MD) zJNz+JsX*iu9Dry&Lcx8 zdOLm=^@3Ra6OMh|R)$>gHFpA}bEEYS9ly!1_^lZ$plNvsD9NyKL-3&wK(9w)8aeXsCw{f=P z(iZc@#+MAC)F1r%t$D+g@?EAPes;p={gHvoZ_cYq03;*ghY^6^S{~}2e{LKW{KS;X z8gbm(7YP31KP6B$@0O5JiYE+Dq8u&_00BsEI$H9d2Hpm#f{CLUyybn56U9gRe|N@i^#8Kdc9avn8r(vvMdZ0`3g zWF|Vkeu4T6{@SHW7DlIPpDt3er9@y&m&e!iwtc!RPSNr4{HzHp{16!Lj|IO$Ud$*v z1dzWM{vCjXt8nEQbkzDWe)l+Xna~D~&sO-Id|9Porx5aiD`EkvfFhx?E1p{?BGj}8 z`4US`V)v-dtlcS=g3pn39H;8mT`X_T{e5FrH()h3(X{`>OW}9*r*F|$Lh6M+xEC_p z%-Gtx`8ob(5itvXMmM+ii}VCeMvng3USm_F;iu|o_`B%|!1GhM$eW8S#hyzFOsauV zss2{ETI}0#Fx^U@)7`8xU(V#?I8hh5@!ZvObGfB07Pnyizl7gi9V0Il&t#ZyfaJ*- zV0954QfRGOwuAmLOwD17!A0xR^pUD9w~!Ji_|1NI@niVk#jXd$M8Ep#>sR=^8T|g)obi0twM}Zj z=J;xh6lQ9i=HBgBB91aB{kJZT2eQ|43CKDefd7|TQUg(=SGUTJ74T92fM4s>vNIHx zczcFJ<_cSGW{Ckwcsv3kdtBnVP$l~ec1WzVvUdR$1X8QH8R29N_PdI z{tJJqKUj_Umu7pG2bnSq4q&qc{G14pwV4$!+ndhPOpZNj2izj&77ucg1^cP(ongOM zZ(hIq>JRT;-FccMRy0~g`}?z}$4&jNq6z`p_(2(58NG^&0A#)7Atry6Ka{fZ$C$eg z!2i`hbx7rahV*_RQc^;%;7|T%R^k3S@GsgjC4R9%uNp^TSVONLQvdU=PKLH?3v!l; z%FGc#ILV;PO}H4XbIVjHl-qn;_Gf|5o7bF3`TA-dtyzREr5ah>b021{BX*jB2D+^u z*HG96weWV*s{{bHSRLs|d4Jt0`Y#9I!FdSX;?yNZVnBr z0%`?y41n%YmQSVkl0MjgpCN(WsVkXDK30;2UjrafCui`A1muwN49z3rQ2&~D#gAl_ zj)xQi?NzVT{1^2HzPVR309v-be@FZboIqRz*VBS}phg()Y2sEN-Y#P_6iHX?$7KJE-VA&+`)c0fEmd&g&Gxk zN>zpf{LC`3F!9nU?yoWbm+OH~v|w(V$I$gc*&%=uKx>-YHn-7uoQ>jX;c?tO zu}k}(!mqI-dqqE7T7ohF|3FRQ(JB1sQ-f^#C82N2D3{0SWy)FnNdUB!Tw0jV$;3m& z&RjsoF+A||{4#*@lggVBK*Cd)*#Ln|>>sHA>ZnK}^^r8&jeZ5+WlDUC^sgN` z7y?2DkpTC|x}yprwR)xzXDqe)-AeCH{9j+qRk}v96m4v6Rn1iCZ*8O(zICuP81^T0 z8MZQiqA})7N8wN5@9>*#%aPb_XJ=HCMKMy!=KBT52g05*|B#mUi&H)W}Eo=ETf<|QYozqxaTRVK_>3PN}`=F;{I1$?xMAS-98 z?;iRKe!AdFI|9h5mUaY~xlnc800sdBf4o%}ur-AkllNq!2U0k50bn!o=i>^t;w9SNocU>8>72#v^#{3w=ZgIf2|PZ_cJU%yzM+fS-MtDiZ6YOqz8 z9S%$d)M{YrNN6y1bcO%Iueb56vH%T$+$F?Q0%*T8$mYDlKXafgEC7Gm5aTj{#d*D( zi^dX=#a{%X`2@c_TdPdY_AN6aT_a-&U|%cAM2h#p1bCcctH<(ZEI|7q2L}I(mzS%) zyY66xJr(y4IUB3$C5vVQUZ~Fm__#L_V*r)@82^^q$!|Oh3gEU0fG8IOs4He*@>2Gz z{hOmXyG0Fb2$8cB!Ghm4B-K`GRuud#@&^eB@_Bx)bd*4)2C)Esi%uj*C6M#pTZAkZ z^yDJ&^R`=7_igj$G7`fTR*l^|Tu8527f;vVL1I4TKT9qj6a8$XVE}{x9Dwl0s;$fb zGGWG(IM)*i3<&@NPzHf71Uazmun7RpHH5YmsJ5l-ASt0#5$P7T)L;9piyv2w zQTU41$ItedVM6mxu4JK{b1jBD z4yH)-9~>a~c{Ca0W&)9QSRDzL=0)B@J-`R0L9hhSFp!?`WdGf=IrgaloB=VT#Y%J$ z`LBIj3jkj(GkoFa2I?OJ@W=k#-_zWqKC(h$Vp5_=cv1e%{%L$KUwz|io3f{7h4uUo zSU%-^sjV_4K<6Qzo^vT`#YJrxNv=qM(Tt=e06aVqkUl*# z)pKK5D0_;I9zS~U{Dk0_)%BS!jhQpA&W@6rHKmPM6VHmpxh!(BoI#$24vedG8|_%{ z0bljiHCO=nD^ZrcEguJZ2A3<)5vRme7Bb+6;+FV%uHaX~mEQT^)CLp$I6xM%x&e=N zl=%fNESy;syNbcv%qj%nN%9I~+w~%}aShr^P7~|$L<0I8M1IyDL7<#d`xBD)Qy1?J70-04FFC*f7*t`|SRn~9aVw#K5 z8UQN*xQZkxg27Af^CA60=0iUP_#fkMFk?kxPJ#Y2{I~`^RyK985YdHR=sa^|9K_U* zVyt*K)O}6!E@U94C8q(5%%TX|ALMk&FV?U6(>jd+>~utCGQj+YY%+TH?ti~~&FiOe zc#;RT<$A(uX|-27H1?ao_i0Fcz%TsdKT$x&5t>UkLX+3}%}lsRjp(q-08Y~dKl4I_ z0TLfHo~b^1E?N1JX+x~vy0@vm)*B`CC;Vx3rMUdgZ%k?@Z^`jwg2()u{?qBP5J-h$ z|LFz&XBzOYAHL;W{0ukvWBz%GWmSJBKk8rI7sifX_YZva-+w5~R5?k?{0pM}2)_d0 z@FEVdV0o=G11xeszK^9F+E4J?<8L+o5dMJQu3zGK^3C>C!FW7nzxbn>t(`5WFFJJ1 zANW~6!$?ts=gVpVG~oa6j``QDoF^qf|CTM|L_ZRUm|5W;03rjd3^yzP&rp&d*Cz@; z%}8JJ<;8#UCx>eI6Fwe?e~I5E)4qnJGGF*g{QhMMzqA+lHJoSzpG@07_s?_qlQztK z!Cy^o|5N`5ekHQ-q-IDA$UZv+z)O)_e!;>i@$*g_Q=?eXH2&sdc@iEV%}n7>^cnDj zx02+!#{f2T*O-AGDcxi5L?h+;{xwkZS2C)wKEgoL@f%ON`5BEfAj1nfY7Y=UmlS9 zKo`+LR7p-x2s1UG$q!oi_Zbve@LqPcaSxU|QS|BO69ee>@4uGzc~-)l4?xrMe#4(p zdH3x)6wSmfmnA^TfS68$KbeB}b%tN@E?!=ez?)qtUNW?VFT5^{9KM%!|apgR_ zs?3649nNq>696#}W0WXlhFl1y@Z)0Y-`%Jr01JqiVjS8J&#~S{1{@5a38m&Bn!e%F zTD95m$GwU7mf&X%((>FG*I->q;Dz${%|@XW>NlQwe_H!%_Kn?V#{~yfcl*Xk>28%W47F zd6K#i0qW}T?Nk(T5uh#kWofLdA+v&(@wy03(>pb#6>8m z--8Bt5iw7Q_5=Tfp>_Aq*v)FuU0)+_JXZq<13=Z} zC5-loyzguaFW}Y}2KX$0XtU?Bp1j1IrGmDp3V+UL7QY84_25;#nK(f{LKKQ z00bND3*W#|kq;5F*qGJU*O$C0fIcMWtS`IQn@@z-b$)Y)WQ_S@vzvOK?#-}P8y@4~ zHUn*Aj=aE+Hzwf$U}ivK0>N)HxhloC8@$=3Lzl5Uz$TMZv9;WkSFwZN z01){21Mr8vlS!w^*x&=*`(9ZYXAzM&Ld~JfPHLr5#2-n zrU?;1LZGgJipu?nIvO1Q+pCpY+0*pzS;VHmDSD>h>w7F4qH5sT^4PS90Kkv(aU8aZ*+RB$ zLPCKB;X1dAEMVi(RO`p`v6uhq5{3NC1j_u)1jvc!;8*?4{<97sE8S=fD1D@7x#lLZ zEE)Fwqf>Y?1~bu59H=ntn5%Gq)tenU`51@pMB<6A{5V2#Z`I4y|Rq|9LS)A%d@Ie~v% z=;t0~Xw6t^x$dE0oQcMo(Y$}1O`g2X2my@1TQqDE%@fXri_ZX5qFa2oXAQ4+QonP4noDwgMW94y~t61c4M1g@jsp2 zjh*z{b^F@p;WFjuE%+00&_DPUJXg#wD`piyqL%7+&7i9$eE+&5j{v$CBoOq3OZ_MO zr3eG)H3)~&^hr;=CX+cJpur_~&|kz==`bN(_|Kg-n!gR(>R5sv>N}-akL+QMb>4j;|M2>G{9pVY z>^W6*p`(zAEg8q$@h7*i!1VRAW{4cEA&IfUlzA?C1s((AgL$S~G)X#xAK%A)QaDt{ zMKy%$;>5-fUd)32$vd{o{vkj&U||_|#jxP^N%j6h-`~e^eh5C9kJ`_Tt6L>}jK0H< z^PzqXJ2BI|zuv>jh7rQQ>?wYWi*BPSC#urnpGm7YxuW3P_a%x$|3q=$jK(lLCjhmP zxMq=?`%_!X0Ri~@3jgt(_?H0&DtDb($`JBLVo=$C{67I;1N;_O{iU%MSG>CNYhJ(p zjsv~2(}{Oe>8A`I@1hCfAr6JV)+S^B*_|sg9Xvt^pD-2-;`C7-we$_(E3On5-+eJn|Lu=T~gl zK$_6x>*VWXw+VdQUi5_@_}Sc>JC*Y%3I%==I{b*OYnTujJnrdIFrzqb#(D&qiXZys zLM@;6;vazj@BZ%hUy9%9Ci;vii_J+i|3Uo?ed?~N*QK>4fGT}0yYl4VM|(``VcWP9 z1Bf9xY%X@|DU8&>#r}v9?n(#2w;1#2U3aU6^$I=s8v){g+y}R@EWikj!nyEV9m#hy zcKkN_Ggr(iQ5U4hjZweG-{Aip`q%zB)9cmS^`b6_nq`+|{*+tMy}Z-lSL}`J#Rc3g z$eDD>J&hpN8~|qiSonr9D`*EUaVv~05_JY6dws)Rm43rqYy0#p>^T*Db?-IB|KQIE zr=1`3-zOnB8}oum@Do3bi?o4Eq1|oDi4+?~*rxv1U*q~;{vPX(`qe-9X*6m4xjWG> z#{Wz3ZAT0~P?0-nYkGg=t-4OMFN?&JO&ipley>$&0O?@k{a%$x&3m*Ly;o+Re-7W- z))xMM0lpO-mgWmrc{$|=jOfgqD)=!b9e@>Sa)WQJo~Zx#T+(0RznMF0Q>UodRv0{moODpDV z=ylF_Si(Y*a1rve&Mw*)KI9)6PDMVx#{Z3dsVxbmYv=Emd7tiToRfdH;h+JK0KMWKatCv+?SAq`6sR)eG%2&w8B*q;5j+ch@g8xhf76}Ke6Zo z_Y{7dANVA%WKOwy2LmTghM*rS0sB~Myg8%fH4T5t`mrmAr`+QEu^eXZ+#FBZ21vJQ zQ^H72%m>(VP6VI^oU7N?mioaD{dqCX#(Adj{~hNuz|f1q?-WqkzU|hK4*yO9M||)@ ziojv;92*DVr|NQIk?cQfUT~2ldme0P&nOnq=%hMWkXUu#x&%-c2Mfhq{tftTtwh0> z_dHPwyRls4yr`x9hF_loe+<9~a2o>1duvsH^e_E$eaS4-L)Tnfo%7n7j-RC;OaXE= z^a)<3ucA*brwHsn>j0c|;+gLDozLuW*qmbVtRM9>d&79lH+O7YpgBd3cHxba@b^Bu zJAqHJH)Z_B{ucSC;TL+_Hcpt>C1s;h;irRv|5NiP0?2?_k}5a4xAPx_kN)SYcYwHqU*#s;Tf8QGQ$zNv^7smY#T7(7 zKEEYZn(rs*<+rZ=z&A97E)p~;dvZ{NwF`lBffjknBgLNlfrxot#G7D-pM$2l*)@cj(!EQ1;L1E>zu4ap?bC z%~Q;FJ)Niu80QUI7X!&ks?v%R#}@eJA<(K3-}U zXNguw^U<*<^OFr(06Xn$3S=&B36Kxx`1*Q#b>3Q>s=?w%!dAtInZWJDclA1B0O}I# zL~zf&6#rz|qEml4Bt!bwQgR_lz5@N#y1BM&Bvvr-tf(LOZnGg!q|(>!>lAjhFK=jr zog4EpB%*+eKI{>2eLT5L-NDeF@Uar&RwI(;dn{#lMRB*H!jOa9_ocS ztbzEx`$Op%*$IY8oI>#{BsPv&pCrj40>Iq&`@Tk$-V#EVhD`92064p?_A3Wd_2fvc z(<%FZJLGW+AsRIqD956gLV%{fn>G*3mk(!YwI9wVR|fBTYDy$Bc$-$sPH)kv(-(B! ztJLn;Klm@fNBz4Ges&G8Xo%&EaEnXQu^pSdnHs>1Yyf9_f`6{n@WN+lsScn3PF(LZ z7_8AdlqmjWgYcgT09K~&lljGik{bqpdKexrHg%N%(#gwGVW*loP7aG;PxAzRHkEKf zr&H|Ywc<>J@YO>+*B)8nw{^sVG1mxjCMnzQC;)Gq!q5P6a25q6r7Q{1k|}`^(YC+I zru}a-cIr=?zLl=&Nw^E2w7JY38hpsl+&H-}E)?rW zpB@?FHQ9!=6IC> zn`c>oneZC>NDPC20Y=lH1HS~o-7qNBpOw;PNiMNtGk4%eLIZpcu1B;mbM^f+Y7_vpyfmT* z!l|?ZhzwZgtr;-%I3jHzujX|UPUCbA1pO1W;?!B0=pCB? z$dDsNbr<+HygiUDvEANHKU=aSApRq!e*_6k4c&;0O?CLC|B3Z9_->TNrc3*2<0@n> z4yHfGxRUV~Q55xiY`wEgTDWNrw4V+W$tufSq;JVf{JfaM!{rR$o<5khMnz|^rn(V- ztuj|L+|uMR>%~xhO6P*_#sse?5=ueGg>q z$vcOqIWjy3*ZNU$>$ICo06>=tu_1`73iT7}y^=vZV8p*m0rHYV7d{_=OHe&`w+mu6 zK1^`n`z4zAzpo^T@n@rSwhGrh8iOLnyxp3#AcslD`Rg}#9GLIq3SGIzq-L!++`#wm zI?HLjZTP;#<2PYE@zY1>bY6Q;bmMHP)!-Pf-3BXXy*8IQ8+Pb1@+SNxfuaC|6C~ER zc*OVp3D^k`>4I@L)1IV`@rrT_>|w{v1NeTy2fsMOeKwLIS@J`ri*410l0g8#_pMlv z6;}wx$XzP~Ni{j%BC~ul08mI@SSyi`UnwGF9F;aQM#}V@<8S8LY7C=F!(1^yU1T7J z>Y8n;l0O@;O#@p4%h+cJ$Jiixu-Cox{*YfPhge2_itE&i%Y|PjrfBDt`4~XKk6w7Y zE%>JkKBNKhqbXtt9<2$R=hEe9XHnev=SD^jQ|D- z$OFEux0;kzXMn^6vdBoJ1_h!*GCvF>LNqyQ=<9KLo~1(^qX~yM61jOQNA9;1bD%ly zuk}~y*VPYxc%olnzD2uivP?>zhTjP+)!%3N8-56Y{EH6QzQ|NZ*`sQwiQ%x*ZmiLj z1pF9+l3FW3)FQW#lM-;A)59h7Xj9^3|FPL(w@5{}8k6JEU?+piNt zJaNClM~>)!hZb}87ZDaZctqjr3b+xEr4UPeu{o;#;{Ys;bJBiF|M}tEe^Cojtc#b- zM5w1z!xr7d;M({wfw%y{0@1Bax^Bty&`>5kVLAs{GT?5h>x=ff{$rXJ5yc@4+r-HW z{JajO@N--Q4p46#Fz?rna_byJm|U;nHxioiDsT<9!fVt7egweLK8)Bu8v!c-szidJ zW}k~_)^a(P?$U42rhO!B87<17-SDR%pmmnE8=v(YpO~nQ5VB(=D#J_b4)ekL(jOqb z4dr82JexrHiBOEaPu{qa<5Jpd2OIw4*TPS4~FEP1mw~1GNjg zmU6hr2h5mpHm+AThyW(=RezSNVb2o*V4|HT>>hF(H#}vQ8`RaG$#N6xZtPwG819ro zqMm=rg&-pU(g+AQ$*&Ge*i-?Y7ZmQt{CV}T{O=nldPCI~T6UEZArL?n2;$fL5@nn3 z9<^*2Jg6+a?s`LTx3 zN-Z~^n1J<2O}5q~5cn8?awz-?Ae%anMZu5r!+mxXJgB}=intr3$qWDrdmhU1C*hNMVuC3NuF>CHG{-~cL@^i4f!Oz!khX9iKdQXPJ z_6MVXOr%R7p%4n7@L`Y*Kln5OOBPgLmmH7!+wJ`~{_~Ie8&+ z8&@4nu|SHPg|4PR;^%7?B^qKvemp>K&&B->3i3&8i6qnYg8ZBKAqGZ}mra06{Jwph zBa?K1(4X<|Bm7uNi2zUFxgJ$++<`GPOy*NR6ZgB=$A@*p2pTH5B~jHKI$XL;K}T>WM1_l=$ldIWH+*E&r7OhyZr8 zxH^99Kd)s?n2ZR(5AV?H>?|#=jFerDtCB?S66{3ZI_f-RN*!~nv8 zTGRwT{Ga&H1>mW2&$9JU0Ypj0v^|@RnT8 zl0cZQ_c?L7Q}JIb)jEC+k~u1#Q34P=m(yTK1^Uw=a1r@oNbN9zj}72w_>GZf2VS^9 z)bBCWuno5jCLW4`}Lj zq`d}EfsjO?nqE+#_CLuQVq^+HI(Y$4gC6CkCaA-n)WcWnWn%;Y$X?eCFGPpZZF0F^3u>!zX$Rb z{^nPhomrL<{^$6U{}uKOOksha*U-|r9pDcw$7TSjgwhA`j?DqGP)z+xf#Amj%KuaE zN5{h@XaefGJtFzfC14z=-oI70nj~y z0Gt1p0kpiKn}0b>GL33>O7v~HSn%6qmJ{u21X-WUkOGne{QB1%CPN$!eDgo>bEtwx zs+RkEkYMuvWN9Ebl}i^(D+Pb(Pr_;m(2(?xQ^%tfzvFyDso$U){H^WOY!CT@Kc!p4 z@7dh7G$%_GBoE&vkwlbFx0JEiGVSs+Oicl}B0&AS%AoQ~Qv)))%zDGVJiZG6{Et0N zY=R#*5ay?DESW^W4i@_>>?P*x!v+uo z=%wCxKZ8He5|lRobp3bdFAe2mAqS>vM{3y(%|?0&wkhYN-z3aJ27rg5 zWYH2EP=p>IHh>+#2+GT`{y`V(SFE30!+&1?-T7lkge{7Hi>Vs;;|dtN0>}avE;?4V zbt0K(hZKRE;{o^U_*lO|N(B`^L4daR9otls=0X69^%tkF^&4^mhwd^xcM+qQ2DY6B z6E;Au$#$FxTE!;I+L^WDeItgV5CKWS&dcjAA)?z4Kc|aq|9|<{p0fdkF#%DTc1{IU~&mJfCNAp~TC#slz<5jK&_C5rV^DB1%u79U-A zr)-4YM!bUyMZjd?;;ukNX-9}4D5*1|^gmF9PCAGV=emg_P zs4}{Gtjxb2f=z+F;@=`kVC$z^v#40n4eQu6LrcQT#zHCotQI|GSniIWeGq}jy1?~h z$_1niMF>XVM#S!$06ebk%l-Z5_22ow!u=z3#yY5Ik%?jjK|xA#D6dCtG`>#p?%n!> zoC-^%`Of?*-wcbRRH6(oAJbz%hn=J}N~WdoDaCb>wtkBMasJG$IDUjimROT05PqTk z>UAR#Ly5WS1r!Le`C`~@`LyLDUii@+j4&L5<;9w?O7y=b_s<~qz9=&j`2QXLDH22? z9oWS}LyE0e`jfOa#j$~0J*zJqpw3^(E!ihro=g?TZ)Clx+=u1s4e*9dN*QSbuT+{0<;h5GtaS z_R(^4|GGs%hhgqtr&X+fC;p=U2oMECwDo%Uhr?G@gBjtS6EgW%y(lL{v<*;IgC?S@ zH2UuR`G1v45p^t9KHD8%>|~=OId{- zJSZ@o3?Es)59=>BPREb^Rfi&3NY;P*5p^ZpRcp#&#c~{~PW8j_^PqxHQszVoAfgL& z`;+zG#Xq)wW4|~o@dNw}+aLn8C}L{j=(AkYHpUv{qxGLY9~T$(k-QqfTd6;>uv|KS zEunDXJcqMq@mLQ0q_)7UnPDo+0P=@~%w1(YG;0%oD?Kr_*_j}#^JV$gHFaw*v%{F^ zHAYCk%@>IU1+;la@hNPe2(|xMKa2_nPQv}u_^%Lui5w4-+VCYR=(T8b1Naz1mbGwPwtW2}+1ED8hAKvorYlact=K_oW0y#QS<$`L5BSk7N49>O zsO)Qq0I1G)xBTj+DAbpQ2JZ76#fgUeSiY&aHjGci;2TszDYdV$KCyzn_4coeNT*dlvJlv38wqlmMvTZ+Uw%G@G&jNn>tkFC!|zNQ%hoCC|8~pQ zk_dBnZI0er$Q~ERztjH${v-bOJ^>bQ=F84bM^|u;TD{qUBK-yOM;p<8mA1Qj9j9Ig z#MFgb$foi?L%h4|SrC3>kbwFs_###&_A&2Y5D4VUc0z0qVX{&ki+-4^`2YnWsx)Es zv;Xy96X347+V~!TgJo*12=27@2!tcyZj=3Ztel6XHXlqyX@-sKjhb{3-e$<*w%Mk> zh&HHpGMtf&E7ThtQ~$PN_BBN&t&kXy-varI?0v+`twYTsl_6J-Vx{|A^@Iz}}+ z=JM$NFD(PbAEsL`*f4jw?&e|1k9f}^4~KsM=3_g|)?#Y)rVkpj*e1DmjjvmuWL)SW z!g~0v`5a@R;y}f>m6Km z8I*>1smG@tW^y^Nz4BZ+T`%F-p~P>w>sx!SCn!C|SzVHv#w#I=KxreJqD zs+gC&*QQ;zzqqbY#4A!4*R$q)Ui6ny(c|nyhg;%;8nB2bT1q0V7To5c5Ok>kfIp12JhpY5SM!!~@4!#Hl9mlG@ zrQ8@t=070}DIhXCD+%Up!E=hURmpsmBkL6HEqN$;DWRdLrvR7w^>dok4s(7yn(P3c z3>8+cLzg(01hhND2`3Qqx-X7Rx&+{gRQbi@X;G)iZ4_jgr{l8nUcEzsb$VH8yfW)X z@njC>fDX~C+gX%cK;2vqb+Xm-YKv-tB;Vq<#Vi!D)d}b0CC)NU_oDXx{n|+z`8QQm zyi4tIR?_fSygGYMp?b1cEvlu-1bwiJ|ViW)hn`+yGlDw;&oEq z-@QD!f4@Rrhl_KK%2wwIXRESncAxgPFy22=Qv?PE?_{NRJRW>sM0dDpVp*4xCB|2# zMJ_gEcyLFx@no;dhDKb=X@PAK*kOIrvI_|jQ#Rw4kxbBkL8a;P2X%hUcyskZbxe)B z_v8c^qSM(SJfxo;;%C%11USeU-*H(#H$XBzYKY}h^(DB!5n;VMk-Z3O7h3QKa+)y` zzy`!znU(TvJsqP#7EgxzBVB8GFgtA}ywg19_Dqp;Y>-Tc+EZ0SN(nVJEWk5tHIVYD zd2UvZ9@4+g_}q;%Z$xMV?5YZ@D5v4zg_Goh21_STT+ME2qGv%LOHfH1k)t{sxY)PH zZ31tKge!DA6$$+Tg+_Qo1~{evQG!l33usIKkNnhfPrWnr4(N)R`Pg@{+sMR3wvQng zUe?2H4+iaek~@ItvdW%p{V>^TJj8I!xy@&`vFYN13TELosbz@{R zjnADAl2V?=cJl_F60bm~#VV^a9YDu`{k5~VEv9h<>lcMN!pR*?hW*$ZTbjCFDD}p) zHT^KcM^6~qKHC4mQZ;r0H$Y0dCH1Z`CZKEv797i*#>Z5{IoOAfxRyqx0_>pcwXrSQ ze5ESzuIe!uc6td7JXl@~AIder@Nf+}J5P1?7|W__h0DvhQowzdUzxD@P!cC#hvOlj z;$1^bK%vDwLsh~M@x8kL)A2itq+YhaP&+b({TOtWa225lp%`8eh!^!g4ki5(h>CztW;d{YWm7q|Wv9MmtyX9Ds{9&x+N=@#%rQl~0y8K4Da zXIeR*v_IH-=pRLnxULYu)xiMMs@2)U-z*~(Oz>D_EOa!_Lt$jHOz&C!v+BqX#`C#@ z%vAc_0U2j)KqYoa6Y>0_(hT2jC7d=s*^rKgmqTOE2Foy@{utI{+)AjWUt$jx`=bYH zE{C8OJk>`t;2(=OQ2W!*@oBTop`2%FNv`j~G%ok;04g$67*70O#CI_|#9+JivjYhl zrA?G4$Ajo?@?6Y*`@ET}yXdYuiW%S^7>&?Y!QC#lGl>eI>Qpg4yKQD!tJKW8sHN^Q zr!42uqe`3i`IzUxax;IH-PrBF$|8Mhn!xrj0=_azWFNpU)fK>r;aRD1)9g0#pn?cR zDw$>=WW7sM=?&nUi*W-B*lL9`3*4oRwLGcxhr_`XglSbaPcfVtAMMxq15()lHbaJ& zOzC96_5_n2*(U0+$*?MGrj@qW58yD(sJxyP(wxDH_y+?rjFqiEOLvT z2zrgrBcoKsMFNfNJkYEdUb#N`U-hQI<;jRS5-mj1epQk}DF-stjnO&Ri+&lXn3;^yttUdHotFg?vVR1YJ@Yk!dW|0W1Sg*!TA-` zrRr+B+o-S4TA;sC5XvRP+vB}2CFgICv1A29Ep?D_UK!)$(`;3Hd8f9)hZ>b>4JQ)uq zLqLMef+=D-RN1}9_zGGrT;%pb-D2dojzj`7zU}^Sc#n>Ulh|cih`hWv*ASlTF3wj; z*aW=-aF`-%I4;gk@~61?wHNhF1H`AXq0%UA0FMdqjvTC6a`xZeT#9=JYG5nobAX2q zNGCp|(xfvWB*Wkp0gqtw)$HQ-;Og4($Wj3Dks&O%!U| z^|wq8cuB}7<-^!Zz}fB5MX5f-k(suMXTtn)EWAr2U@LsyojFi+%K3vS5FBnKf&|dJ zhR#pbu8y|5STyhmq4lKy6ikEWRe2SY-KsPi2V5hvb?f->=?PIc!xxLkP6EI3#_5eG zgBUU+(?M0sUfj-T3?tfR{DHm0K{0w+2cN-yD4;#NJa{hLDb-sFjVZM6r%@t9GOr%c zDtdN4#)w){If{N=M7%MNP~Ds4M#O5Ejm9BZfInv9cv}XCDxEz$IG;l)aQ=7Wi;hw- zr{&R&diis%3}g8mK1`k>9mYS27n~#!5#Rp}Ptf-fAHY-R4N09Em|3XR%({3nTt(g- z=l4V_anAwNP|@eeom5wtEY3HHkawLwHd|#CIfBns`!mKDm4)9C-m|`!h*x}Z$eMg+{23nuxi;ggJ96jw%w~Vg|u9V_NI9=g1qhXL9P`zdEWcKwz0z)rrj&i*> zX~_lvRcLeOwGWPoi9uhAX|8CWCY)FP6!8rk<1xIEW>5sYrx!2Tf@d3Qlv@x++rH{P z^g+mhSctZke|FHq(GoWb&JZ|ho7w1-0r(y7hx12w+%}DoKt+TH^SE<~_Ima!-~c{P z#@F@jcy=&@OT%jF#v)BX0T2Ih$hy4; zH9@+(w!-;>j~4V2A^?i&y05c?3!nyI-Gktft!D!)VukOJ5T0SW?@ z^44ESHf_K3UVBSKZMVp1e70X$oeiLofQ?}I)+-v)A$-nPfHvKG4)jztnOr_WslCgr zU=!Ff0?loiD0_(g0ifg8Obo5RRtlvGQ5(O&YBHU4{LT&zIK3cFnW3c z5c|*ECHy7;T+Iv;pAnB-s0mXBzybYm0{jNey20mxN;!_Op+XT)3M^9nL|ml#W?p8) z@U)&pMei>}LVLoywkiNS2>>-h$RqYvEi?twqe*fCoU{;06;wK#&0F$zx^+PadUU#? z74W8kM+C4J(To@+VoLB7il3%sxTGEg{z97TIv44QKQNIc`m@Dg+>@Ub+NOa}2H6VQezNg%|9 z_9JEVAJQ}gzoNIL?Yzzup?f=T@GMZ z>h*gmAt$FS;*kxobcGo=U{tuUD`#+zC#>H-bSm(cFD-tbE)ezX;r<}uYa8jhI{2nzvI-ODphnsa!ea zx4B71L*yTw!M&+ckMl|QA1PfV0r<)I+`CGKPUG(>-murOsrQU)Rlt!vf*{d}#ir|L z2p~|AQb1KoyY1$=t5`~nfDbAYds`&Smm9N`x?;@G1@2%Pg)KP%lfT{gyIXT41NLk- z4Q#{q!&HyC;gS7A&h$?k$6@Jeh&j>Cr-X?h)+k~8=^&yJjg7>ZNR*T+;(L0%AgAPn zTU--Es4j=(ov1<9&n6)Ndg|_@Oo1?oxjE=;hz(Q@_sE>U%d%OlUJ?ql;{F8`VkkbE zG}U0q53mBBuN@+dsO%CDSfq{T04}sbG9?NPiwU6ajF0vgA4({Z9*i&ID*eL%>V`W} zr&uy4wM>-QZiVAmql=4iK)}HGN%U(>KB=e&74omRGQX+U`bR0#i(|jD*IQ0&-;vwjcku3pg#0HzTUKX7gAMt5{aB zkYpLPw@e6=ia*f!-6#yV6Ao4YP5~q4Teuzb$@!2hipV7VTH|X7TVnS_E`Z&rY>|KLKT{K731z8GM6(Im zPiF_0+!p(d5rBY6H?C3Ct>q&>A_Ost{221zM$ypxX&?O)tkvcy?gJUm8(2P;uj*fo zpe?5dc2c(75P!e{$p4@jI)2I4J%-2A^LEbJ6@f>lh%iN_hHoATv;Y|7`&hlbY(#h7 zw3&`L?lh`X*}*;H2#fH1X|rj;p<0JnQGKTKGl&_JS7f=&hc*RGV5%Mh8HeLNQNY+< zaO3&q!8gitrD)u+4`#zUTAm8hNW@q3bbJIHV0=8_WIuHkTt^G6WiEoK5g3I>z+)Xk zs!x!_VFI9i>M=zV`h#6zgI%4&_`x<=+7#uG*Y1gB^RgM0#0svAu2WP=vaFnvE z(CN=lpI@C__u9BCbcCPSudog6cntxecbANUMrn@u0S*a5xBL5j@}f9ouIAwljz%>p zM;7nlpGjgD+Qkkki98u}>SPv8!lQy>Zu=3L->sB%96uj<)3Y*OENRNWaQ!?g^7 zp1MBvmK3UD#zgr`1OU;W#L)sLp{r0ti>z>5Vt7DiBoQU+3hsdX$5hYov$|>@p=8l= z2aHe0!jkl#Zcnxh(6fV$e3sRXC|E)395f!MFrR;3T{W z;}Z?TLPe>hYghAU1rabjs-qx-spKlEfoj?C;C0pBvHaCRHE0(#LZnyWVj;eXXHE&l z+4mXZ*Zg4`=Ga-glOi_4d>Kcx0;(~n5wd)A|mL{ql&&o z;`Ec`Cs{t0kjfGML$xa;Yo3->#I+!c2S)=2neb@NQ&K7Og2^ZsInFV-( zlge_idoWm^iU37N30kn4+^>grP51khwCHRho1n7J7#;x*9E^gEuk9C%R=$-?AXtpK zDiNd-Oio68t|&Lc5(G@+YkpK%JYjtF4=*;8DQVByPPo+W1Tvnb5(62$4pI$a0*Hll=Q9PN3G;09_rr4|LU{L6%wAevIRi|@MOCq&?)EKJWAy$%FNqQJS@tlgf5|BK|R6&7?`Nh)-D`Ht@S1&$0*Om0} zbZr810J3~8MnG0VKgmjPZlWxSyhu+8YG^IeDQ>x-Ae!;T9l&@{BLeK8U`gMSPsg&6 zC{rYZk1MJW_?AH#=@v$F+P#o7J<=4gfTJT10WDfwik) z0~FRGTal+)aR@~x44K4-uVO`*fR@YmwJZluEF+{y5d*Bs z2~CjA=lRmUVrwx33DyjK5aZ5Y!b@|cOrR>bS&u+D3Ka{yS~;0wpcI$r{1d)KH~yg# zIl2Xb=d%Oa0AgX>y(s4_59I(jB8jLDNc%(f$jDdbE7m9hJgd5w6g*Z1>p&i9G&_Gy zq_nO~K@-MFO#dYvSb19!%y%N(zmjO68`Ma4RK1AmieUsgJ0eVvods^3gd8S9-rp=A zL7+|8#6yWBq6ZcF5FsgA(fY^LR|(jATdR~~0i_d+Csc}n1HbJbV@SaVqQF?tT^3Ua z%k)b^sb~)$#1FItfUMUZ?JLe)Tn$r}c*5F=M1z_P5(3oR#Itm|X}O^9cC9vO_YG;o zO9`)Pcq?+Ec9i4gS5A=SaCtnA1<*xb!8J@-D1ha& zI&Cq_r!{hAx+}HZq|K0K>aoRFQhg&GtPpyiTOb9CL_(79U zL=m6`qfdw|=)Jl`4)Oj!7l;sm~VdBJ>KD&JJuV=R^@baz5OeHkf2Q8j? z7g-aH&u`HPoG8CqVio(-GLD+~CjzZeE+{Uc7+>+8PK^b~k4lyBKQ3Ur+{NGmzxZpp zurU+(?8U*wriFAP*sj$KN&GeAyf}Zn9~0692vBrZ`XA#n>xBGQnQEm8Q7~1t1{zK9 z%!5IH=V2%+3~R0O1i5|ng6>JD%3~Jdd#u7s&9$cKk5j%X-IT0vVnxFM&f<$);)+ z!qgiuH~(PLg{ff%ri7U2!sue6kY=_+w?ap=L!TBJcXa=@H&W&(#GpDGVDY))pH@+sR+aEMOHQCfp zabybdQdJ$0ea8x_LV$QmIaIMJmV~9sOSfS0#y5g1o#y* z{!LpY-Wx{6v&sQBk(`prGw=`T!DXpt&jL!^g zd~*CRX*l3s|2Dxj60AHX%n+spqOLl-B|WZ^??%gC3?1+ZaFDFGKB!*N<&StJ&`Gv_ zB2KCkJdO#;;uWcv+jF`jpMrchOuCse;T3+*G-Rdnb#-_=k+|lEqi$!a0?8C@ehFIhWF7(?iiY z*j}M&Dy(sh08@>Bes%TgFp>Wd-ovk8@+<&RT`1uYbkS^nnDuB7lG(s%ifPCD$swDO z<%I#aW1sbB3(5=w-7u`wDR1BY^2-;z(5S@lSSD495=r1!$|AX#d&~BAHiJ;0RRL>& zm5?(+!xVU78&!3QePDlz;SDih!WrJ6iDb+O&5@rsf^4z3toxR?=2c>!{o;4O`^5`N zZ%9y!Cf>8*Qw1H^6{)6TVqO=dw6|o7E#l4z!Ww8bAQ@4wFfqH^%t?c=df=M8HqkcF zQ!9{+=Oq7E)e(;NQ%YU|awV!fNo~LQ*Drs^Yk@8=XHa!SR%}13zZ>3+6TW2i`DTQ+ zCJVL`m`j$Mr>nI>r*Ha;l#;){8(szLD%;u(FGuHj{t6AUh7$_i-G&Et zvK2B$9MAw3Eu986KMMCa{a;)ng|B!z#=3J{ES^Y<(WKn?7LBipWT9;k+&!cDmA*A% zM)n_ri|-`8q0Rp=ybh0Gg*+C7bFvK2c-l;K5w0Fs`QzN$z+OO1uz23}_MWh=ri(10k~(ZX@)t zu~3;)z!F>)G#aJ;;*m~ot%#VHOylaBn~PFXN9FLKa6_ex(q@I=xII$pR)s8Qia8-x z0Do$42|rW@Rw#hDTtzP$pB$I^-Jokt$Jrq0MN8n?@ckt&$L@-sRgqd1M$*al{3z*B z+CE}@FAE^m%{9QN*}Vu@2lZ8;&iE2&8yzpu2lr=iIRv{JU1952U~I_?O9dc(QB2lH ztJjgFUq}^I?#NqxX>tOF`*?>r%~T<%5!A+h!c1ArfN7E^XLUuLug<#{QjxEO00HMv z_Q%3&g|ci#4~lDInR0jubX=9OQ2)%#$wL>Z$pU7W^0< zS0x&HRX|ah3xZNJnA|qU%)@23T_I!O9JsmVSxF8LBxTQv6jpE1L9XD_@_E0Dz?RGm z(xH3wEOX2792gCHWF~CyDIL&rad^fiu=j!$te+vMPT>?aJa$4e$8kusF^Gg=$ri{d zffMlNnJj{Ttu`8;h!6G=5Ji6uyo|cWLY)v2m;U%-a(r2tgA z1KSxMpE;l+nzJQnF>I{4q7YqtzNMm|TNUW(L)E`dONLC`0ps%kn%*9fKL7af16QNEM!+(K&2O=%955 zIU;*k8oN#ElxEBO`@8YgXQNaO{g_0rhBr*GZ34QkR>7BcAJL>VTTzATUSwNsX?O@> zGC5xUQptVwqruVf1zmN*Tv)k_qX+Tnu0<3;8=xRn`=6?uMX4k*!0Ij)LMFB<%IQCh zpXEq$h>w!2%5n=~XafYqVRHq0RiB`ub=EJ65X^#KGs0JF7n_1+sIVVqkPV>0LgQ2O z!OeD@0NQsC2aS*t4iO*}>qq_se$a7ng2UHkC}doKsR%2^O5hNer18n}?1&Dlp7IId zRb#^XaoK|UG?VB7n!v|u@Su8Z@0fA|ZU2LPs6J#GN=^K$s`ZH~#lz(62TSRhWs#_g zP7~8&2b-1!ijL*OXVz|E2c#i9-V{)<6xK_C?maq7#y$3#2 zET>+1m4z}sy3q$wE1*>lwo1%_&N)KmFqw)>O-2v``l<^1!;#qf5h_kpT1|s9h~XNn zjc$*hmk2nycNak|ycDZv^o}-4tcm;|7TEkfoC^=p@|B39?(KF&JvOMA9yBr=qWLAH zm70 zIEpWu`rotVtJGhugt#V}kYmcma2gr_D?!NuI!NYrH@-ZAa0h?Kqgg$8R}8NR&heN= zGO~jMvYZUhM^~Opyyf>eDD}ZxaTt%b@masoX+%A;IH1Di{}5ApsDb zHkWdrO-2AOFwCl^N`+4we6XXaaewzZ67L~G_M#4FgkL34iB3k9%J1X%wnG@ zlc-eEPWYOF|Jm#0?cn%-;0knP)LOwt(pT&1o*gf{p5Fwn+m*4BUyi-rVBM`DKGVTE zX{nvzCUI2Jq)cirDber@@S(^HD;c@T^~LPlZC4pY$puuQn_%xb0#4t_)NirM>w2DU zEP#(FJ#P{G!zsxvb$b5zVpCdj@O**FHUw}&^4o#&@IXV@|$yvc-s& zMliW*=A$zlY?Xl68z|T!wT|^Hck!O^T4ZCm9pQX)Qw`j>j1j?#EHKPI9spaw_f?&q zmUrKes4ijJq3kd@Gi>mai2HQtV+Nc$^FH_?eaoIpK6_R0W z^JW#<&Tg+grLQ=ARJlpYn_e?PS#e0r=PA}kf=SX|xilQ~l1F;Dx)N2(S3e{-{+3sI zqyTDc+$M-*aJUB!T`jvytjely~t31S~QGpM_wT>h2sZm~GE8fyc4gPX&VGaN1yvqKhb zn!%H_opJ*KF*Oz1KQKHuGPI+?ahNr)Vf7c-GDw}m2xizMK$FRyN(O2cL;?;#nR+0`wHB2}xU1EdtzZu6S1 z*ri~(7&ic9Po;V)AkWxaUW3H<6ADk@evf9io0oxK^1I-){tzput};LB4h9reS4c-d z`E-U#-4vBPdSBQ%$K{84Y4rN$8%Zu^f;!Irn@SnMrh=}OwTXP%DVb*EiLMavJU$XX zl3&w|*t}@sNBLGG$n63&+@X5M`Xq@2G;p&|uo&$L0Mv?^`naQ7?ak21OBc^qjRvfB z3u>wje&Om4HVXfSF)x#4QnDd(^H34d)RN67L?EiepT;6?$ETw#=Qtam;$?tk4q_H9 z(~cXnecb-RCh-8zQ-#((ko4pG#NoOWO#Vl^Gj8S~&MotR9{sqUXT7~e7{{cT_9r;8 z{u1Nh^e~ds!4ypW__5-6Dsia>fw@(}-iKSMdtJdYH|H{&Whd|UT>@@`&dG9tv2eUD z4luQDd&U>MmzBo{(DioX17CVL9YTXJnA5wrP2!Vnzmk??T&9n0avk9UtN~#J<)HR` zP*7CQTAQm^G@*KqoPb?S0WB&Xq0qkKTaat6k&KsrI`hI+}_If0OS3x+W z%RpT#RwJ<!HDNbRllnAt2~{BRIk2=P*nz zjeM%z9zKzG;&sd(Ir9>3NQ8Uo)miRRcgSWa+T2g~9P)jK>dfqL^+v{BXdcj+0ymBV z=t0g#EFsWhq$`E+cHg;+3U|*;VG4nt91QS;<``m3I#09GYrdT)3>OJ3la~c4L2}Vr z#@C6NR^f78izg3=)<{0f@DM97?KTD)Juc0zemKG~!6S+jQDp%L07FQq3C{tgw;rxp zw!#fnbi(3*kFuQBT$~2f@6EFpS2sW|rzlNQh-FN9K^2f&UB+&IpL?Y+JMA8A#W~O{ zX!X?f7{Q#5E)FiwGe2BXG{$mOu_L}9gCh+QhY@*fUP^%b-k+?21J#jSsFtg*C#{uK z<697eYJK&x?9C161=4`K(beB|drcc?nYB(QYhE+@?5YH(0CArv6zKuYHed*cD|omG z#vc(R-GYfC!Y!yK?ZW&97*6G7d9sE&ri`<}w8SOo{2aak8`>rkm<)gityh~7JvNOm zFqiYy>ecFI1s&tT)8HY=tl&a_pwy8&k03g!_ri(-?3W4yguDexN+d2DU-X*K=|ueM z1(^)5w@^h^+<`hCRc|R(Tq1L^dRtvx)RNc@9aOdfT#3E>&5;k9J_OXi`0~r2KLZI8 zE2B0j6>6`%k62kkD3xlFZD|_;j>Q6a2c;z0aJQn<$w5A!eaUNvJ(pYn_O?!=wByg` ztsZnb(jcUY4|I$BIp~)__768zKio7>#!mR^;OwijZ#Lg@bq`PuFWJFL`y(NTx~w!| zI}P(o@z0nE!hr8rfqy;o!_`sP_%!lf-&|jp8oDVGC^rR;sC_tBqP)kIC{{}tyUQu1 z#`h~*;dtnAKY;naZlX1vCm;iY;S9*XbhtVR*@XroBMPBWhxMdc0B69TVyVF(Q7gm>fQGU`KHB_jeJGj)W zBI2NgH--qrK6c5q-r`Gh^ycUArP>fyc+Qs&L7|i$4c1x zC~YsxG$GU`oFaCPnhn(o`k}W~u?iPHQ=b*I7HY4Ul!*xfGRAd}oFVm0DyBsFyT$ie zoAi__nGgif1vANm4IH2Z$jAhCVyy*{E(JWk*L@w$$;OUam|)EQ^D2S;x~ zz~1%dC||qexL^5Or+yt~MQ3J4gwT#|S-mvuA)Be}r&cA<` zK7RBo{7RT{Z`xonFHumx1Ri?zMY5V5{cV5pIPG@Bte0hMiL-k3gi!fkdABFHQL})p^n}Z*- z*S-^V*V*f5=YC8$g14ay`_=3^kK?U(^zvmAx$AXf_RL?$mHa!Px!(ylSC`k}@t~8v zeD;SN@BEfXt=sQ!Z_mDOBqh&#ef~|W+aJ8Uo_+82q#kbaW2NuCNjiB;cK=^0gW6-IHh*vzzq;R# zvR3pqJz3_fz!_HPuR+mqy-WXP+^zK=CPAY;>~7y>L5~}?YWrQT{i{4U&c^3Vxm&*3 z_{nyteazzJzTJ8~J*iES)%<&wn6<*AC%7FF%MGW$j30s>qE9N5_kXTlzrP=EiFSO> z7(labI1}Qr!0COFcC%NPK?c(_jl;%&r(A=o1g8a@y4r}g0% z7zwrl=Fh_+mR=|RjdzTPIEmllmbYoSetq^Ge-8#wt%g#yuQSvZD0BT}*zdn>&HjwJ?{(bPZRuT{x`&(1QRrVE1+T9|ut4&9_Fd$yqoMQq z+x4`Px|x672y?1P&$yuvTthbQ8m=c>+qWY)cihMC)PrZN`B=(NJbvd|xWjdTZ=C_TY znP7+}R8Tg;!TvJY{C&UMKdzL~%lFse^6R5CU9YF_Z{IW5Y|(A}%mFj_ul_cj##tDy z|MaIAqkI&2{q!%%y7%2b%74i+=lhp$+kg7sUoZdikH4np-}%|M!SVX$XAdXszn_G! zgRkHA*70=luK$?rYy4?F4a0|g`*>R8_ka8`eIGd7r@17YnpXa{nF7P2Oq7f1QPXa`gMjWdB3V0*WSHuWe*=_50Bk^nO5T3+o18bvd-S7jr8I1ACCRE*&;jo@slw8 z(;xD0AO73J-#_&K`tFl=mCE~1l6Ck{Ka)8B%uamr&p&?s_lE!9y1h4(Jp1JRU*G=I cyPy5->%ac^?)UHBzx!+X_wV1md;j(S19zWrSpWb4 diff --git a/glide2x/sst1/glide/tests/light.3df b/glide2x/sst1/glide/tests/light.3df deleted file mode 100644 index aef8c8b..0000000 --- a/glide2x/sst1/glide/tests/light.3df +++ /dev/null @@ -1,5 +0,0 @@ -3df v1.1 -rgb565 -lod range: 1 64 -aspect ratio: 1 1 -9çAèB(B(JIJiJiJiJiZËZËRªRŠJIB(B9çBBB9Ç9Ç1¦1¦9ÇB9ç9Ç9çJIRŠRªZËZËZËRªJIBB(B9Ç1¦9Ç9ç9ç9Ç9ç9Ç9çBJIJiRŠRªZËRªRªZËc [ ZËRªJiJiAèB(B(JIJIJiJiRjJiRªRŠRªRªRŠRŠRŠJiJiJIB(J)9ç9Ç9ÇBB(BB(JiZëk-kmkmc,ZëZËRŠJiJIB9Ç1Æ9§9Ç9Ç9Ç:Aè9çB(JIJiJiRjRŠRŠRŠRŠRŠRŠRŠRŠJiJiBB(B(B(B(B(JIJIJIJiJiRjJiRŠJiRŠRŠJIBBBB9ç9çAèB(JIJiZËc,kms®s®kMc c ZËRŠJIB9Ç1¦1¦1†1†1¦9§1¦AèBBBBB(B(J)B(B(BB(JIB(J)JIBB9çB9Ç9Ç9çBB(B(J)BBJIJIJIB(Aè1Æ9§9ç1¦9Ç9Ç9çJIJiZËc kMkm{Ï{ïsŽkmkMc,ZËJiB9Ç1¦1f)…1f)E)e)e1†9Ç1¦1†1¦Aè9çAè9Ç1¦1†9Ç9çAè:B1¦9Ç9Ç9Ç1¦1†1¦1¦9çBB9Ç1¦AèB9ç9§)e)E)e1f)e)e1†9çJiZ«Zëc c,km{Ï{ïsŽsŽsŽkMZëRªB(9§)e1f!$!$!!$)%)E)E!$!)%1¦9ç9§1†!$)%)E1¦9Ç1¦1¦1†1†1†1†1†)e)E)E1†9Ç9Ç1†)…1†1†)e)E!$!$)%)E!$)E1†BRŠZËZëc c,sŽ„„s®sŽsŽkMZëRŠB(9§)e!$!$!!!!$!$!!!!)e1¦1†)E!!!$1†1†1†)e1†)E)E)E)E)E!$!)E)e1f)e1f)E!D!$!!$)%)E)E!$)e1†B(RŠZëk-kmkm„œÓ”’{ïsŽs®s®c,RŠJI9Ç)e!!!$!!$)%!$!!!!)E)e)E!!!!$1f)e1f)e!$!$!!$!!ã!!!!$)%!$!$!!ã!!$)E)e)E)E1†BRªc,sns®{ÏŒq¥4¥4Œq{ï„0„0s®ZëJI9ç)e!$!!!!!$)%!!!!!!$!ã ä!)E)e)E)e)E!ã!!ã äãã äã äã äãã äãã!!$)E)E!$1†JIZëkmsŽkm{Ï”’¥¥4”’„0ŒQ”’ŒQs®ZËB)e!$ äã ä!!$! ä äã äã äãã ä!$)%)E)E!$ã äãã äãã äãã äãã äãã äãã!!!!1¦Jic kmsŽsŽ{­u­U”ÒŒ1„0Œq”²ŒqkmJI1†!ãã äã!ã äãã äãã äãã äã!!$!$!ã äãã äãã äãã äãã äãã äãã äãã!9§ZËkmsŽs®„”²µ–ƾ­uŒq„„0œÓœÓ{ÏJi1f!ãã äã äãã äãã äãã äãã äã!!!ã äãã äãã äãã äãã äãã äãã äãã!9Çc,ƒð{Ï„0¥µÖÆ8ÎYÎy½×œÓ„0„0”²”’sŽJI1†!ãã äã äã äãã äãã äãã äãã!ã äã äãã äãã äãã äãã äãã äãã äãã!$J)sŽ„0ŒQ¥½÷Æ8Æ8ÎyÎYÆ8µv”²ŒQŒqŒQs®Ji1†)Eã äã!!ã äãã äãã äãã äã äã äãã äãã äãã äãã äãã äãã äãã äãã)EJIc s®ŒQ­uÆÆ8½÷½÷Æ8ÎyÎYµ–”²Œq”’{ïRª9§)Eã ä!!$!ãã äãã äãã äãã äã!ã äã äãã äãã äãã äãã äãã äãã äãã)%9ÇJic „0­uÆÆµ¶­u½×ÎYÎyÆ”²œ³„0ZË9Ç!$!!!!$!ãã äã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9ÇJIc „¥4½÷ƾ½·µÖÆÎY¾­U¥4­UŒ‘c 9Ç)E!ã ä!!ã äã!!!ã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã!9çZË{ÏŒq­U¾ÎYÎyÖšÆXƽ÷½×µ¶½×µÖœÓc,B)eã äãã äã äãã äã!$!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã!BkM”’¥T½÷Æ8ÎYÖšÖÚÖºÆ8µ¶µ¶½×½÷½×œósŽJI1†ãã äãã äãã äãã!!ã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã)%BkM”’µ–ÆÆXÎYΙֺֺÆ8µ¶µ–µ–µ¶­UŒ‘s®RŠ1†ãã äãã äã äãã ä!! äãã äã äã äãã äãã äãã äãã äãã äãã äãã!$9ÇZëŒ1¥T½÷ÆÎYΙֺÎy½÷½×µ¶­uœó”²„0kmRŠ)e!!!!!!$!)%!$!$!$!$!$!$!!$!$!!$!$)%ã äãã äãã äãã äãã äãã äãã äãã!1¦RŠ„¥µ–µÖ½÷ÎYÎyÎY½÷½÷Æ­•”²ŒQ|s®bì9Ç)E)E)e1¦1†1†1†1¦1¦1†1¦9§1†)…1†1¦1†1†1†)e1f ä!!!!!)E!$!!!!$)%!$)E)E)e)%!!$)E1†1†1¦ZëŒQ­U­•­uµ¶Æ8֚ΙÎYÎYÆXµ¶œó”’”’”²„0ZëB9çB(J)BBBJiRŠRªZËZËRªJIB(BB(B9ç9ç9Ç!$)E)e)E1†9ÇB(B(Aè9Ç1¦J)B(JIJiRªRŠB9Ç9çJIRŠRªc s®œó½×µ¶¥4­uÎyÖºÞÛÖºÖšÆX½÷½×µ–µ–­u¥4„0c c kmkmZëZËZËc,s®ŒQ”’ŒQ„s®sŽkMc RªRªZ«ZË9çBB(JIRŠZëc,kMkMc c s®„s®kms®{Ï{ïs®s®{¯„ŒQ„0œÓµ–½÷µ¶­U½×ΙÞÛÞûÞÛÖºÆ8Æ8ÎYÎyÆ8µ¶¥ŒQ{ïŒqœó”’{ïsŽs®„0¥­uµ¶­Uœó”²œÓ”²Œq„0s®{Ï{ÏRŠZëc,kMs®{Ï{Ï{Ï„|ŒQœÓœÓŒQ{Ï„0œÓ¥4¥4œÓ”’œÓœó¥4µ¶Æ½÷µ¶½×Æ8ÖºÞÛÞÛÖÚÖºÎyÎyÖšÖºÎyµ¶”²Œq¥µ¶½×¥4”’ŒqŒq¥µ¶Æ½÷½×¥T¥¥4­u­u¥4”²ŒQŒQc,sŽ{ï„0ŒQŒqŒQ„0”’”Ò¥¥4¥4œóœÓœÓ¥4µ–µ–¥4”’”’¥µ¶ÆÆ8½÷½÷ÎYÖšÖÚÞÛÞÛÖÚÖºÞÛÖºÖºÖšÎy½÷­U­uÆ8ÎyÆ­u¥4­U¥4­u½÷½÷½÷½÷µ–¥4­U­•½×µ–¥T”²”’sŽ„„0ŒQ”²œÓœÓœó¥4­u­u­uµ–µ¶µ¶µ¶µ¶µ–­u¥”²œóµ–ÆÆ8½÷½×ÎYÖÚÞÛÞÛÞÛÖÚÞÛÞÛÞûÞÛÖºÎyÎyÖšÎYÎYΙ֚ÆX½×½÷ƽ÷½×ƽ÷ÆÆ8Æ8½÷µ¶µ¶µ¶µ–­•¥4œÓ{ï”r”’”’”²¥4­uµ¶½×µÖ½×½÷Æ8½÷½×½÷ƽ÷­Uœóœóµ–ÆXÎyÆ8½×½÷ÎyÞÛÞÛÞÛÞÛÖÚÞÛÞûÞÛÞÛΙÎYÖšÖÚÖºÖzΙֺÎyÎYÎyÖšÎyÎYÎYÆ8Æ8ÖºÖºÖzÆ8Ƶ¶µ–µ–­•­UŒQ”²œÓœÓœóµ–½÷Æ8Æ8ÆÎYÎyÎY½÷µ–½÷ÎYÎY½÷¥T­UÆΙ֚Æ8½÷Æ8ÎyÖºÞÛÞÛÖÚÞÛÞÛÞÛÞÛÖÚ֚Ιֺֺ֚Îyֺֺֺֺ֚֚֚ΙÎYÆÆ8ÖºÞÛÖºÎyÎyÆ8µ¶µ–µ–­•œóœó¥4­uµ¶ÆÎyÎyÎyÖšÖºÖºÖš½÷­uµ¶ÎYÖºÖšÆ8½÷ÎYÖšÖºÖšÖšÖºÖºÖšÞÛÞûÞÛÞûÞÛÞÛÖÚÞÛÖÚÞ»ÖÚÖºÎyÆ8ÎyÞÛֺֺ֚ΙÎyÎyÎyÎYÆ8ÖšÖÚÞÛÖºÖºÖš½÷µ–­•½×­U­Uµ–½÷Æ8֚֚Ιֺ֚֚ÞÛÖºÎYµ¶½×ÎyÞÛÖÚÖºÖºÖºÞÛÞÛÖÚÞÛÞûÞÛÖºÞÛÞûÞûÞûÞûÞÛÖºÞÛÞûÞÛÞÛÖÚÖºÎyÎyÞÛÞÛÖºÎYÆ8Æ8ÖšÖºÖºÎYÆXÖšÖºÞÛÞÛÖº¾µ–µ¶½÷¥4­u½×¾ÎY֚ΙÎyÎyÎYÖºÞÛÖÚÎy½×½×ÎyÖºÞÛÞÛÞÛÖÚÞÛÞÛÞÛÞûÞûÞÛÖºÞÛÞûÞûÞûÞÛÞÛÖÚÞ»ÞûÞûÞûÞÛÞÛÖšÎyÞÛÖÚÖºÎyÆ8Î9ΙÞÛÖºÎY½÷ÆÎyÖºÖºÖš½×­•½×Æœó­u½×µÖ½÷ÎYÎyÎY¾Æ8ÖšÖÚ޻Ι½÷½×Æ8ÎyÖšÖºÖºÖºÖºÖºÞ»ÞÛÞûÞÛÖÚÖºÞÛÞÛÞûÞÛÞûÞÛÖÚÞÛÞûÞûÞûÞÛÎyÎyֺֺ֚ΙÎyֺ֚֚ΙÎyƵ–µÖÎYÎyÎYµÖ­Uµ¶½÷œÓ­uµ¶µ¶­u½×ÆXÆ½×Æ8Îy֚ΙÎY½÷µ¶½×ÆÆ¾Æ8Æ8Æ8Æ8ÎyÖºÞÛÞûÞÛÖºÖºÞÛÞÛÞÛÞÛÖÚÞÛÖÚÞûÞûÞÛÖšÆÆ8ÎyÎYÆXÎyÖšÖºÖšÎYÎYÆXÆ­u­U½÷ÎyÎY½×¥T­U­u”’¥­U­U­Uµ¶½×½×Æ8Æ8Æ8Æ8Æ8½×µ–µ¶½×½×½÷Æ8½×µ¶½÷ÎYÖšÖÚÞÛÞÛÖºÖšÖºÖÚÞ»ÖÚÞÛÖÚÖºÞÛÞÛÖºÆX½×½÷Æ8½÷½÷Æ8ÎYÎYÆXÆ8½÷½÷½÷­Uœóµ–Æ8ÎY½÷­u¥”²„0”²œóœóœó¥­Uµ¶½÷ƽ÷½×¾ÆµÖµ¶½÷½×½×¾Æµ¶­U­•Æ8Özֺֺֺ֚Ιֺֺֺֺֺֺ֚֚֚ÆX½×µ–½÷¾µ¶­uµ–µ¶µ¶½÷½÷µ¶­u­u¥4”²œóµ¶ÆµÖ¥4œÓŒq{Ï„P”’œÓ¥4­uµ¶½÷µ¶µ–½×¾½÷½×µ¶½÷½×½÷½÷µ¶¥”²¥4ÆΙ֚ÎyÆXÎyÖºÞÛÖÚÖšÎyÖšÖºÖºÖºÎy½÷­U¥µ–½÷µ–œó”²¥¥4­uµ¶µ–¥4œó”²ŒQ”’¥¥T¥”²”²ŒqkMkm{ÏŒQœÓ¥¥4­u­U¥4µ¶½×µÖµ¶µ–µ–µ–µÖ­uœÓ„PŒQ¥4ÆΙ֚Æ8ÆΙÞÛÞûÞÛÖºÎyÎyÖºÞÛÖºÎyµ¶œÓŒqœó­u­U”²ŒQŒ‘Œq”’¥¥TœóŒQ{Ï{Ï„0”²ŒQs®{Ï„0„RªZËc kM„”’”²”’„„Œq¥¥œó¥œÓ”’”²œÓ”’|{ï„”²­uÆÆ8½×½÷ÖšÞÛÞûÞÛÖšÆ8ÆXÖzΙÎy½÷­u”’s®{ÏŒq”’„s®sŽc,c sŽ„0ŒQkmZëc sŽ{Ïc,RŠZËZëc BB(JIRŠc s®„s®c,c,s®„{ÏksŽkmkMc c c cL{¯s®sŽŒQ¥4­U­Uµ¶ÎyÞÛÞÛÖÚÎy½÷½÷½÷½÷µ–¥œÓ„c JiZëkMc RªJIB9Ç:RjRŠJIB(JIRŠRŠB9Ç9Ç9Ç9ç1†1¦9Ç9Ç9çJiZëZ«BBJIRŠRŠJIBB9çAè9ç9çJIRªRªJic „”’œÓ­uÆXÖºÞÛÖšÆXÆ8ƽ׭UœóŒq{ïkmB(1†9Ç9ç9ç1†)e)E)E)E)e)e)e)e9§1¦1†)e)E)e)e)e!$!$)E)E)E)E)e)e)%!$!$)E)e)%!$!$)E1†)e)E)E1†)e1†B(kmŒ1”²­uÆ8ÖšÖºÎyÎYÎyÎyÆ¥4”²„0{Ïc 9ç!$!!$)E!$!!!!!!!!$!$!$!!$!!$!$!ã äãã äãã äãã äãã äãã ä!!$!!!!)eJIkMŒQ”Òµ¶ÎYΙֺ֚֚֚Ι½÷µ–¥T”²„0kmB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)eRŠ{Ï”’œÓµ¶ÎyÖšÖºÖºÖºÖšÎy½÷½÷½×­U”²sŽB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERŠŒQœóœó­uÆ8ÖºÞ»ÖÚÖºÎyÆ8½÷ƽ÷µ–œós®B(!ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJi„0œó¤ô¥TÆ8ÖšÞÛÖºÖšÆ8½÷½×µÖµ¶­U”²s®B(!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)EJI{œó­uÆ8ÖšÖºÖšÎyÎyÆ8µ¶­u¥”²Œq{ÏRŠ)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)EJiƒðœÓœÓ¥4½×ÎY֚ΙÎyÖšÎyƵ–œÓ„0{Ïs®ZË)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)ERŠ{œÓœó­UÆÎYÎyÎYÆXÎyÎyÆ¥4{ïkMZëB!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª„0”²¥­•µ¶½÷ÎYÎY½÷µ¶½÷ÎYÆX½×Œ‘kmJi1†!$ äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã äãã ä)EZË„0œÓ­uÆÆ8ÎYΙ֚Æ­u­u½÷Æ8½÷¥4sŽJI1†!$ã äãã äãã äãã äãã äãã äãã äã äãã äãã äãã äãã äãã äãã äãã ä)ERª{­u½÷Æ8ÎYÖšÎy¾µ–µ–µ¶½×µ¶œÓkmJI1†)Eãã äãã äãã äãã äãã äãã äããã äãã äãã äãã äãã äãã äãã äãã ä)eJIc,{ïŒq¥4µ¶½÷½÷½×µ–­•µ–­Uœó”²{ïc B(1†!$ã äãã äãã äãã äãã äãã äã!ãã äãã äãã äãã äãã äãã äãã äãã ä!1ÆRjZës®”’¥¥”Ҝӥ¥T­U”²„0{ÏkMJ‰9Ç)E!ãã äãã äãã äãã äãã äãã!!$!$ äã äãã äãã äãã äãã äãã äãã äãã!1†JIc {ÏŒq”’ŒqŒ1Œqœóµ–­u”²„kbìJI1¦)E!ãã äãã äãã äãã äãã äã!!$)E!$!ã äãã äãã äãã äãã äãã äãã äãã!1†JIkM{ï”r”’”’Œ‘”’¥µ–­•”²„kmZËB(1¦)E!ãã äãã äãã äãã äãã ä!)E)E)E!$ã äãã äãã äãã äãã äãã äãã äãã ä!1†JIc sŽ{Ï„0”’œÓœóœÓœóœÓ„0{ÏsŽZëJI9ç1f!ãã äãã äãã äãã äãã ä!!$)E!$)% äã äãã äãã äãã äãã äã äãã äãã ä!)e9çJIRŠZëkM„œÓœóŒq„0„s®sŽkmRªJ)9ç)e äãã ä!$!ã äãã äã!ã!ã!!$)%)E!$ã!ã!ã äãã! äãã äã!!!ãã äã!ã ä!$1†9Ç9ÇBRªsŽ„0ŒQs®snkmc ZËRªJ)9ç1†!$ ä!!!$)e1f)E!$ äã!!!!!$!$!$)%)E)E)E!!!$!!!!$!$!!ãã äã!!!$!!ã!!!ã!$)E1†1¦9ÇJIZëkMc,RªZ«RªRŠB(B(B9Ç1†!$!$!!$)E1†1†1†)E!$)E!$)%)E)e)e)e1f)e)e1f)e!!!$!!$!!$!$)%!$!!!!!!$!$)E!$)%!$!!$!!!$1†1†9ÇBJiRŠJiJ)JIB(B(BB9ç9§)e)e)E)E!$)e1†1¦1†)e)e1†)e)e)E)e1†1†1†)e1†1†1†ã!!!!$!$!$)%!$)E!$)%!$!$)%!D)%!$)%!D)%!$!!!!$)E1f1¦AèBJIJIJIB(BB9ç9ç9Ç1†1†1†1†1†1†1†1¦9Ç1¦1¦1†1¦1¦1†1†1†1¦1†1†1†1†1†1† ä!!!!$!$!$!$!$)%!$!$!!$)%!$!$)%!$)%)E!$)%!$!!$)%)E)e1¦9çBJ)B(B(B9Ç9Ç1¦1†1†1†1†1¦1†1¦1¦1¦1¦1¦1†1¦1¦9§1¦1¦1¦9§1¦9§1¦1¦1¦1¦ãã äã!!!$!$!$!$)%ã äã!!!$!$)%!!!!! äã ä!!$1†1¦9Ç9Ç9Ç1¦1†)e)E)e)E)E)E)e1†)e1f)e1f)e1†1†1¦1¦1¦1†1¦9§1Æ9§9Ç9Ç9Ç9ÇBB(JiJiRŠRªRŠJIB(B(Aè1¦B9çJibìc ZËJIB(9Ç9Ç9Ç9çBJIRŠRªRªZËRªJiBB9çB(JIJIJIJiJI9ç9ç9ÇBRŠc sŽs®c,ZËB(9Ç1†1†1†9Ç9ç9çBAè9çBB(1¦1¦1†1f9Ç9Ç1¦9§)e)E)E)eJIZËc,s®{ÏsŽc,Ji1†!$!$!$)%!)E1¦)E!$1¦1†)E!$!$!)%)E)E!$!)E)E)eJIc,sŽ”²”’{Ïs®RŠ1¦!!!$!$!!$)Eã!$1f)eã äã äã äãã ä!!$)eZ«km{¯œóœóŒQŒqsŽ9Ç!ã! äã äã äã)%!$ã äãã äãã äãã ä)ekM{Ïœóƽ÷ŒQŒq„09ç!ã äã äãã äã äã äãã äãã äãã ä9Çs®œÓÆÆÆXµ–Œq„0B!$ ä!ã äãã äã äãã äãã äãã äãã ä)eZ«œÓ¾µ¶ÆÆ8¥”²Ji!$!!ã äã äã äããã äãã äãã äãã ä1†sŽ­UÆ8ÖšÎYµÖ½×­URÊ)%ãã äã ä!ã äããã äãã äãã äãã ä1†{ϵ¶ÎYÖšÎYµ¶­u”²c )Eã!!!!!!!!! äã!!!!!!!$!!$1fk­Uµ¶ÎyÎYÆ8¥4ŒQ{ÏB1¦9ç9ÇBB(B(9ç9ç9Ç1¦1†9ÇB(Z«RŠRªc c c ZËc,sŽœÓµÖ­uÖšÞÛÎyƽ÷­u{ï{ïs®k-|¤ô”²„0{ïkMkMc s®„„ŒQœÓœÓŒq¥4¥4”²¥4½÷½÷Æ8ÞÛÞÛֺ֚Ι­u­U¾¥œÓµ–½÷µ¶¥4µ–¥4Œq„ŒqœÓ¥4µ–µ¶½×½×½×¥4¥ÆÆÆ8ÞÛÞÛÖÚÞûÖºÎy֚ΙÖzÆ8Æ8Æ8Æ8Îyƽ׭•¥4”²¥µ–ÆXÎYΙÆ8µ¶Îy½÷½÷ÖšÎYÎyÞÛÞÛÞÛÖÚÖºÖºÖºÎyÖºÖºÖšÎyÆ8ÖºÖºÎyµ¶µ–­U½×ÎyÖšÎyÞÛΙ½×ÖšÖÚÞÛÖÚÞÛÞûÖºÞûÞûÞÛÞÛÞûÖÚÖzÖÚÖšÆ8ÖºÖzÆ8ÖºÖº½×½÷¥4µ¶½÷ÎY¾֚Ι½×Æ8ÎYÎyÎyÖºÞûÞ»ÖÚÞûÞÛÞÛÞûÖÚÎYΙÎy֚ΙÎy½×µÖÎyµ–µ–”’¥4¥µ¶Æ½÷Æ8µ¶½×½÷½÷µ–ÎyÞ»ÖºÖšÖºÖºÖºÖºÎYµÖ½÷½×¾ÆµÖ­u¥Æµ–”Òs®ŒQ¥­u­uµ–½÷µ¶µ¶½×œóœÓÎYÎyÎYÞÛÖºÎyÖºÖš­u¥µ–”’œÓ¥4¥4Œq„0œÓŒQŒQJiZË{ÏŒQsŽŒQŒQ„0{ï{Ïs®„­Uµ¶Æ8ÞÛÖºÆÆ8½×”²kM{ÏkmZËRªkmRªZëZëJIJi)e1†9§B(1¦9Ç9ç1†1¦1¦AèBc,”’½×ÖºÎyÎYµ–Œ‘sŽ1¦1†)e)E!$)%!D1f)E)E)Eã äãã äãã äã!ã)%c ”’ÆΙֺ֚½×¥T{ï1†ã äãã äãã äããã äãã äãã äãã ä!kmœó½×ÖºÖºÆ8½÷µ¶ŒQ1¦ãã äãã äãã äãã äãã äãã äãã ä!c,œÓµ¶ÖšÎ™ÎYµ¶”²{ïAèãã äãã äãã äãã äãã äãã äãã ä!kMœÓ­UÆ8ÎY¾ÎYœÓ[ 1†ãã äãã äãã äãã äãã äãã äãã ä!km¥Æ8ÎyÎY­u½÷­uZë)eã äãã äãã äããã äãã äãã äãã ä!Ji{¯¥4­u­U­uœÓ{ïJi!$ äãã äãã äã ä! äãã äãã äãã äã ä9çsŽ”’Œq”²µ–Œqc,9ç)%ãã äãã äã ä!$)Eã äãã äãã äãã ä!9ÇZËsŽ”’œÓŒq{Ïc,B!$ äã!ãã äã!!$)E!!!!!ã ä!!ã!ã)E9ÇB(sŽkmc RªJI1¦!$!)E1†!$!!$)E)E)E)e!!!$!$)%!$!!$)%!$!$!!$1f9çJIJIB(B9ç1†1f)e1†1¦1†1†)e1†1†1†1†ã!!!$!$!!!$!$!$)%!!!)E9ÇB9ç1¦1†)e1f1†1†1†1†1¦1¦9§1¦9Ç1¦BB(RjJiB(9ÇB(c c,Ji1¦9ÇBJIJIJI)e)E1†)e)E)eRª{Ï{ïZë)e!$!)e!$1†ã äãã ä!$kMœóœó„0)e äã äã!ã äãã ä)E{ïÅø¾”’1¦!ã äã äã äãã ä!$”’ÎyÆ¥TBã ä!ã!)E9§9ÇBBJIœÓÆÎy­u{ÏZËZËsŽZëRŠ{Ï”’¥¥4­U­U¾ÖºÞÛÖš½÷½÷µ¶Æµ¶¥¥4Æ8Öš¾ÎyÖšÖºÞÛÞÛÖÚÖšÖºÎyÎyÖº½·¥4µ¶Æ8ƾÆÖºÖºÞÛÖÚÎYÆ8ÎY½×½×­ukM”²”²¥œÓŒq½÷ÖšÎyÎY”’ŒQ{Ï{ï{¯kM!$)e)E)E)E1†{ÏÎYÎy­URª!$!!!$!ã äãã ä!„Æ8Îy­uZëã äãã äã äãã ä!„0ƾµ–B(ã äãã ä äãã äã äZëœó­U„1¦ã äã ä!$ã!ã ä ä9çsn{ïbì1†!!$!!$)E!!$!$!)%!$!$9ÇB9Ç)e1†1†1†1¦1¦9Ç9ç9§Zëc 1†1¦9Çãã!”’œó)Eã ä)%)e1¦µvµÖJiB9ǜ󵶽÷ÖšÖÚÎYÆ8½×”²µ–­UÎyÖš­Uœó”’!!$)%¥½÷9ç!!ã äã”’­U)eã ä!!!BRª)e)E)e)eRŠRª)EkMœó­U{ïc,”’œóZëãJ)Rª!$c kMRªbìc \ No newline at end of file diff --git a/glide2x/sst1/glide/tests/makefile b/glide2x/sst1/glide/tests/makefile deleted file mode 100644 index c2297a3..0000000 --- a/glide2x/sst1/glide/tests/makefile +++ /dev/null @@ -1,145 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= *.exe *.map *.sys *.obj *.lib - -!ifdef FX_NO_GLIDE_SWDIAGS -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak -!else -!if "$(FX_GLIDE_DSP_TARGET)"=="SIM" -LCDEFS = $(LCDEFS) -DGLIDE_SIMULATOR -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SWLIBS)\lib\wing32.lib -!endif - -LCINCS = $(LCINCS) -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_COMPILER)"=="WATCOM" -LIBOBJS = tlib.lib plib.lib -!else -LIBOBJS = tlib.obj plib.obj -!endif - -!if "$(FX_TARGET)"=="WIN32" -FX_TARGET_MINOR=WIN95 -!endif - -LLDLIBS = $(LLDLIBS) $(BUILD_ROOT_SST1)\lib\glide2x.lib $(LIBOBJS) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=.exe) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -$(PROGRAMS): $(LLDLIBS) - -!if "$(FX_COMPILER)"=="WATCOM" -!if "$(FX_TARGET)"=="DOS" -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!else -tlib.lib: tlib.obj - wlib -b -c -n -q -p=512 tlib tlib.obj -plib.lib: plib.obj - wlib -b -c -n -q -p=512 plib plib.obj -!endif -!endif - -test00: test00.exe -test01: test01.exe -test02: test02.exe -test03: test03.exe -test04: test04.exe -test05: test05.exe -test06: test06.exe -test07: test07.exe -test08: test08.exe -test09: test09.exe -test10: test10.exe -test11: test11.exe -test12: test12.exe -test13: test13.exe -test14: test14.exe -test15: test15.exe -test16: test16.exe -test17: test17.exe -test18: test18.exe -test19: test19.exe -test20: test20.exe -test21: test21.exe -test22: test22.exe -test23: test23.exe -test24: test24.exe -test25: test25.exe -test26: test26.exe -test27: test27.exe -test28: test28.exe -test29: test29.exe -test30: test30.exe -test31: test31.exe -qatest00: qatest00.exe -qatest01: qatest01.exe -h3dtst01: h3dtst01.exe -h3dtst02: h3dtst02.exe - -foo: foo.exe -display:display.exe - -!endif diff --git a/glide2x/sst1/glide/tests/makefile.distrib b/glide2x/sst1/glide/tests/makefile.distrib deleted file mode 100644 index 2358223..0000000 --- a/glide2x/sst1/glide/tests/makefile.distrib +++ /dev/null @@ -1,15 +0,0 @@ - -CFLAGS = -I. -I/usr/include/glide - -SRCS = $(wildcard test*.c) -OBJS = $(SRCS:.c=.o) -EXECS = $(basename $(SRCS)) -LIB_OBJS = tlib.o - -all: $(EXECS) - -clean: - rm $(EXECS) *.o - -$(EXECS): $(OBJS) $(LIB_OBJS) - $(CC) -o $@ $@.o $(LIB_OBJS) -lglide -lm diff --git a/glide2x/sst1/glide/tests/makefile.linux b/glide2x/sst1/glide/tests/makefile.linux deleted file mode 100644 index 7ae7cfe..0000000 --- a/glide2x/sst1/glide/tests/makefile.linux +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= $(PROGRAMS) - -GLIDE_ROOT = $(BUILD_ROOT)/$(FX_GLIDE_HW) - -LIBOBJS = tlib.o plib.o - -GLIDELIB = -L$(GLIDE_ROOT)/lib -lglide - -LLDLIBS = $(LIBOBJS) $(GLIDELIB) - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - -$(PROGRAMS): $(LIBOBJS) diff --git a/glide2x/sst1/glide/tests/makefile.unix b/glide2x/sst1/glide/tests/makefile.unix deleted file mode 100644 index df8d684..0000000 --- a/glide2x/sst1/glide/tests/makefile.unix +++ /dev/null @@ -1,71 +0,0 @@ -# -# Copyright (c) 1995, 3Dfx Interactive, Inc. -# All Rights Reserved. -# -# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.; -# the contents of this file may not be disclosed to third parties, copied or -# duplicated in any form, in whole or in part, without the prior written -# permission of 3Dfx Interactive, Inc. -# -# RESTRICTED RIGHTS LEGEND: -# Use, duplication or disclosure by the Government is subject to restrictions -# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -# and Computer Software clause at DFARS 252.227-7013, and/or in similar or -# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -# rights reserved under the Copyright Laws of the United States. -# - - -LDIRT= $(PROGRAMS) - -LIBOBJS = tlib.o plib.o - -LLDLIBS = $(LIBOBJS) -lglide2x - -PRIVATE_HEADERS = tlib.h tlib.c plib.h plib.c tldata.inc - -CFILES = display.c \ - test00.c \ - test01.c \ - test02.c \ - test03.c \ - test04.c \ - test05.c \ - test06.c \ - test07.c \ - test08.c \ - test09.c \ - test10.c \ - test11.c \ - test12.c \ - test13.c \ - test14.c \ - test15.c \ - test16.c \ - test17.c \ - test18.c \ - test19.c \ - test20.c \ - test21.c \ - test22.c \ - test23.c \ - test24.c \ - test25.c \ - test26.c \ - test27.c \ - test28.c \ - test29.c \ - qatest00.c \ - qatest01.c \ - h3dtst01.c \ - h3dtst02.c - -PROGRAMS = $(CFILES:.c=) - -DATAFILES = alpha.3df decal1.3df lava.3df light.3df matt1.3df miro.3df \ - argb1555.3df argb4444.3df argb8332.3df argb8888.3df \ - ayiq.3df yiq.3df p8.3df ap88.3df rgb332.3df rgb565.3df - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - - diff --git a/glide2x/sst1/glide/tests/matt1.3df b/glide2x/sst1/glide/tests/matt1.3df deleted file mode 100644 index c02118d70b7a09cd4e8c812890313d3ca7e66bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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%0A@@9x?#-118Xy2(9)_v$Ki zUZ9yI)cg);B0LeTh!v4dBwe$tX~9e_Cy*yKT4pP&y?as1o)37Nch$D_IeyV2SA78A zMz-mk=IpOut#!a_nhQX&{|ZkoT&%^9Q9@%>1vR zCgiXAHsmg2;Gm))j{T?vl$(JlbRhD=x#B8zLlpx0+XP1zGjmsw-K!_Az4i(v@N`qB zu6-kX5DFKwPsxaxW8hdstJl@ici##mmxAwe{lYxFu{UtJ=yU)V7q}l^HO$#hI-|^C zo%&bzNu?J)L<;g&aY_=0{kvM{yV$(Pxf;9StEg91;QJ-N=fL?2c^Ts6fqclEr4%j- zp(BMFT+sPKQqwse$?ZS~<4J0giy1g6k`&v}K0((UZ_*#^6f8H3oXn@8K{| zK5#~eqMySL`idsenby?mwNT7-8Dt8M+m-bWT10||g5pt{u; zaBzs{9}0~eyv*P@w}tE<>rZnH_LbHsdIF9$(NdXzk4hIv=3*|!bA%;bOE-8fA!7v3 zP`bu>f+?pi^Ha`zxKUl>9<%qYQSkK*VBd9xdJd&<99uGA9x&5K5mRM&!hMOJ5Ge9) zdf|Px6&^?0b~s1J@>A2h7qj(TANO{H^3R zu0fk)r|fZbEn+TB_=c;HD&U|4&m#MinXus4+bwUG_jF1-5gGSM-+0&f(P7uu;~o|7 zdI(6de>NdBhe>tZAt=8r-0sM2YiNh#C+L;9nX>{0|L> zsKYVniRMM!WKIwzzTI}&lmtqn;!86BD_TwR)_a_MthN1*fZ2U z0#1Hg&nTZLKmVac9%mndex63$RCjjLw$*mgm}R@^Oj#%dzmJg-r?!xY4Vo0)bn8C~ zr!%{&SY0p+(LwQSWR^~i;C(iHo4aDEOT0kT1Gb~)cib(0yB6DozV~vH+x2tDn}GT> z_hi;Zp`vS3pZ@cTg$S?_+X;=O<$=K2(oSpW=xDoyx7ba*!;K3OE`uvuid2lERtYNS z)hvyyFKw*1ih(|zdk5a7e)h8XjN73^%0|51v8LbJujHUExV|&w*;b}s+$N+5iuA#s zHoIP1Z3jni_l&R-90}JJ))jVVzq^y2WKN(W-e`@-`f(Ee!28%5bo%oCb@cD8+(%QL zbOgLg5V?6g-RP+H0$GAm>1DI$myWI~qt^2?HhJC0q$^zfUK;xV!#gW~3yIAJ+LP4kaHN!KofE`%VeM10*7`YN=k_{}K0 z1=?ZkO2{mty2b5?n{wPcn3L2@TlnYgm40c3T-q+fakTN5Bsa}>3B5`q99{dRMz_fw zX$g96z%wyT?d4KEsZU4JWkK<-LB2IPdzY>5>99S;HZA4Rzey%0m5b%Jt1G0Ho?iKx zvW2<mDI7!A^szg~zES|y%+|arar<~b)y)TG LO^IZu`0oD&YPtbf diff --git a/glide2x/sst1/glide/tests/miro.3df b/glide2x/sst1/glide/tests/miro.3df deleted file mode 100644 index 313b6748691df72d531253612e431081598eba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174813 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

m7cIAS4V0eG5 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 CG9h*V diff --git a/glide2x/sst1/glide/tests/p8.3df b/glide2x/sst1/glide/tests/p8.3df deleted file mode 100644 index 391f60b980b30a1b82c595f812e38f9aa34e610d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86520 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%0ANqU_0^sOTJ2K~;|W!-tA(zeB_;G4IJP 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 diff --git a/glide2x/sst1/glide/tests/plib.c b/glide2x/sst1/glide/tests/plib.c deleted file mode 100644 index 481f15e..0000000 --- a/glide2x/sst1/glide/tests/plib.c +++ /dev/null @@ -1,1384 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include -#include -#include -#include - -#include -#include "tlib.h" -#include "plib.h" - -#define MAX_HANDLES 32 - -//the following may need to go onto the heap... currently need 10K, not bad -static tlTxMnTexture_t tlTxMnMngr[MAX_HANDLES]; -static hTexId_t hFstOpnTexId = H_FSTTEXID; //0 is the NULL handle -static GrChipID_t currTMU = GR_TMU0; -static FxBool bMultiRevOrder; -static FxBool bMultiOffsetFix; - - - -/*------------------------------------------------------------------- - Function: plTxMnLoadTxMngr - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -hTexId_t -plTxMnLoadTxMngr( TlTexture* lpTexture ) -{ - /* assumptions */ - assert( lpTexture ); - - /* code */ - tlTxMnMngr[ hFstOpnTexId ].lpTlTextureInfo = lpTexture; - tlTxMnMngr[ hFstOpnTexId ].origLargeLod = lpTexture->info.largeLod; - tlTxMnMngr[ hFstOpnTexId ].origSmallLod = lpTexture->info.smallLod; - SET_DOWNLOADABLE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_MULTIBASE( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_TRILINEAR( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_BEENPOPD( tlTxMnMngr[hFstOpnTexId], FXFALSE); - SET_DIRTY( tlTxMnMngr[hFstOpnTexId], FXFALSE); - - return (hFstOpnTexId++); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -static void -prTxMnSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ) -{ - SET_BEENPOPD( tlTxMnMngr[deTexId], bBeenPopd ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetDownload - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetDownload( hTexId_t deTexId, FxBool bDownLoad ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_DOWNLOADABLE( tlTxMnMngr[deTexId], bDownLoad ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], bMultibase ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultibase - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultibase( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_MULTIBASE(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiRevOrder which is used by plTxMnDownloadAll - to determine the order of the multibase segments in tmu mem - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiRevOrder( FxBool bOrder ) -{ - bMultiRevOrder = bOrder; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiRevOrder - Date: 7/6/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiRevOrder static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiRevOrder( ) -{ - return ( bMultiRevOrder ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Sets the global bMultiOffsetFix which is used by plTxMnTextureSource - to determine to use the Multibase offset fix - Arguments: - FxBool bOrder - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnSetMultiOffsetFix( FxBool bOffsetFix ) -{ - bMultiOffsetFix = bOffsetFix; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetMultiOffsetFix - Date: 7/16/97 - Implementor(s): psw - Library: - Description: - Returns the current status of the bMultiOffsetFix static global - Arguments: - none - Return: - FxBool - -------------------------------------------------------------------*/ -FxBool -plTxMnGetMultiOffsetFix( ) -{ - return ( bMultiOffsetFix ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnSetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -void -plTxMnSetTrilinear( hTexId_t deTexId, FxBool bTrilinear ) -{ - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* trilinear && <2-lods are mutex */ - if ( (tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.smallLod - - tlTxMnMngr[ deTexId ].lpTlTextureInfo->info.largeLod) >= 1) - { - SET_TRILINEAR( tlTxMnMngr[deTexId], bTrilinear ); - SET_DIRTY( tlTxMnMngr[deTexId], FXTRUE ); /* just for messing with it */ - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetTrilinear - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Arguments: - Return: - -------------------------------------------------------------------*/ -FxBool -plTxMnGetTrilinear( hTexId_t deTexId ) -{ - assert( deTexId < hFstOpnTexId ); - return (IS_TRILINEAR(tlTxMnMngr[deTexId]) ); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnReset - Date: 6/26/97 - Implementor(s): psw - Library: - Description: - Resets the respective texture back to its base state - Arguments: - hTexId_t deTexId - the id of the tlTxMnMngr texture to reset - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnReset( hTexId_t deTexId ) -{ - /* initializations */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - SET_MULTIBASE( tlTxMnMngr[deTexId], FXFALSE ); - SET_TRILINEAR( tlTxMnMngr[deTexId], FXFALSE ); - bMultiRevOrder = FXFALSE; - /* SET_DIRTY( tlTxMnMngr[deTexId], FXFALSE ); */ - - while ( lpThisTexInfo->largeLod > lpThisTxMnTexture->origLargeLod ) - prPushLod( lpThisTexInfo, topOfMipMap );/* reset d'm data ptrs */ - - while ( lpThisTexInfo->smallLod < lpThisTxMnTexture->origSmallLod ) - prPushLod (lpThisTexInfo, btmOfMipMap );/* reset d'm data ptrs */ -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDownloadAll - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - Downloads all the textures be held by tlTexManMngr[] - Will determine if the textures are to be downloaded - in (linear || multibase) && (BOTH || EVEN/ODD) mode based upon - their flags and do the right thang - Arguments: - None - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDownloadAll( ) -{ - /* definitions */ - hTexId_t hCurrTexId; - FxU32 currTexMemReq; - FxU32 currStartAdd; - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo *lpThisTexInfo; - TlTexture *lpThisTlTex; - - /* assumptions */ - assert(hFstOpnTexId != 0); - - /* initializations */ - currStartAdd = grTexMinAddress(currTMU); - - /* code */ - for ( hCurrTexId = H_FSTTEXID; hCurrTexId < hFstOpnTexId; ++hCurrTexId ) - { /* here we go */ - if (IS_DOWNLOADABLE(tlTxMnMngr[hCurrTexId])) - { /* download it */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &lpThisTlTex->info; - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* not trilinear mip'd */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_BOTH, lpThisTexInfo ); - lpThisTxMnTexture->u0.bothAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* if !IS_TRILINEAR && !IS_MULTIBASE */ - else - { /* else it is being rendered as trilinear mip'd */ - /* first do the even segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_EVEN, lpThisTexInfo ); - lpThisTxMnTexture->u0.evenAdd = currStartAdd; - currStartAdd += currTexMemReq; - /* next do the odd segment */ - currTexMemReq = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo); - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - grTexDownloadMipMap( currTMU, currStartAdd, - GR_MIPMAPLEVELMASK_ODD, lpThisTexInfo ); - lpThisTxMnTexture->u1.oddAdd = currStartAdd; - currStartAdd += currTexMemReq; - } /* else !IS_MULTIBASE && IS_TRILINEAR */ - } /* if !IS_MULTIBASE */ - else /* else it is multibased */ - { - /* stack frame definitions */ - FxU32 *lpxAdd; - GrTexBaseRange_t tTxBse; - - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* non trilinear mip'd multibase texture - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - - for ( tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u3.multiR3Add : - &lpThisTxMnTexture->u0.multiR0Add; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0Add : - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses - the multibase - ** segments will be in reverse order, but in the same linear block */ - currTexMemReq = prTexMultiMemRequired( GR_MIPMAPLEVELMASK_BOTH, - tTxBse, lpThisTexInfo); - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq; /* bump the current TMU address */ - } - } /* for */ - for ( tTxBse = GR_TEXBASE_256, lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - lpxAdd <= &lpThisTxMnTexture->u3.multiR3Add; - ++tTxBse, ++lpxAdd ) - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data for downloading */ - *lpTmpInfo = *lpThisTexInfo; - if ((lpThisTexInfo->largeLod <= (FxI32) tTxBse ) && - (lpThisTexInfo->smallLod >= (FxI32) tTxBse )) - { /* if the TexBase exists in the lod range */ - while ( lpTmpInfo->largeLod < (FxI32) tTxBse ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( tTxBse != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd data */ - GR_MIPMAPLEVELMASK_BOTH, lpTmpInfo ); - } /* if */ - } /* for */ - } /* if !IS_TRILINEAR && IS_MULTIBASE */ - else - { /* else it is a multibased trilinear mipmap, aka motherfucker - ** if bMultiRevOrder is True, get the addresses for the Multibase segs - ** in reverse order, 32_TO_1 to 256, else get them in 256 to 32_TO_1 */ - for (tTxBse = bMultiRevOrder ? GR_TEXBASE_32_TO_1+1 : GR_TEXBASE_256, - lpxAdd = bMultiRevOrder ? &lpThisTxMnTexture->u4.multiR3EvenAdd : - &lpThisTxMnTexture->u0.multiR0EvenAdd; - bMultiRevOrder ? lpxAdd >= &lpThisTxMnTexture->u0.multiR0EvenAdd : - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - (bMultiRevOrder ? --tTxBse : ++tTxBse), - (bMultiRevOrder ? --lpxAdd : ++lpxAdd) ) - { /* this loop just gets the texture addresses */ - if ( tTxBse % 2 ) /* is it odd? */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_ODD, - tTxBse, lpThisTexInfo); /* 1,3 */ - else /* even */ - currTexMemReq = prTexMultiMemRequired(GR_MIPMAPLEVELMASK_EVEN, - (tTxBse>3?3:tTxBse), - lpThisTexInfo);/* 0,2,3 */ - /* prTexMulti.. only knows about 0-3 */ - if (currTexMemReq != 0) /* if the LOD(s) !missing, ie. pop'd */ - { - assert( currStartAdd + currTexMemReq < grTexMaxAddress(currTMU) ); - *lpxAdd = currStartAdd; - currStartAdd += currTexMemReq;/* bump the current TMU address */ - } - } /* for */ - for (tTxBse = GR_TEXBASE_256, - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd; - lpxAdd <= &lpThisTxMnTexture->u4.multiR3EvenAdd; - ++tTxBse, ++lpxAdd ) /* tTxBse will actually overrun... - ** overrun = GR_TEXBASE_32_TO_1 + 1 - ** (tTxBse>3?3:tTxBse) will fix this - ** required for 32to1_ODD and 32to1_EVEN */ - /* actually (tTxBse>GR_TEXBASE_32_TO_1:GR_TEXBASE_32_TO_1?tTxBse) */ - { /* this loop actually does the downloading - in the proper order... - ** GR_TEXBASE_256 to GR_TEXBASE_32_TO_1 */ - - /* stack frame definitions */ - GrTexInfo tmpInfo; - GrTexInfo *lpTmpInfo = &tmpInfo; - - /* initializations */ - /* multibase requires that I munge the data, hence the data copies */ - *lpTmpInfo = *lpThisTexInfo; - - if ((lpThisTexInfo->largeLod <= (FxI32) (tTxBse>3?3:tTxBse)) && - (lpThisTexInfo->smallLod >= (FxI32) (tTxBse>3?3:tTxBse))) - { /* if an lod actually exits in the range */ - while ( lpTmpInfo->largeLod < (FxI32)(tTxBse>3?3:tTxBse) ) - prPopLod( lpTmpInfo, topOfMipMap ); /* munge the top */ - - if ( (tTxBse>3?3:tTxBse) != GR_TEXBASE_32_TO_1 ) - lpTmpInfo->smallLod = lpTmpInfo->largeLod; /* munge the btm */ - - if ( tTxBse % 2 ) /* is it odd? */ - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd odd data */ - GR_MIPMAPLEVELMASK_ODD, lpTmpInfo ); - else - grTexDownloadMipMap(currTMU, *lpxAdd, /* download mung'd even data */ - GR_MIPMAPLEVELMASK_EVEN, lpTmpInfo ); - } /* if */ - } /* for */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ - if ( lpThisTlTex->tableType != NO_TABLE ) - grTexDownloadTable(currTMU, lpThisTlTex->tableType, - &lpThisTlTex->tableData ); - } /* if IS_DOWNLOADABLE */ - } /* for ( i = 0; i < fstOpnTexId; ++i ) */ -} /* plTxMnDownloadAll */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnTexSource - Date: 6/28/97 - Implementor(s): psw - Library: - Description: - Renders the texture associated with hTexId. Will setup the rendering - modes based upon the tlTxMnMngr[deTexId].flags fields, i.e., - (linear || multibase) && (BOTH || EVEN/ODD) modes. Also uses - the addresses saved by previous call to tlTxMnDownloadAll - Arguments: - hTexId_t deTexId - handle to the texture - FxU32 deMipMask - mipmap mask - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTexture; - GrTexInfo thisTexInfo, - *lpThisTexInfo; - TlTexture *lpThisTlTex; - FxU32 *lpxAdd, - xAdd; - GrTexBaseRange_t tTexBase; - - /* assumptions */ - assert( deTexId < hFstOpnTexId ); - assert((deMipMask >= GR_TEXBASE_256) && - (deMipMask <= GR_TEXBASE_32_TO_1)); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[deTexId]; - lpThisTlTex = lpThisTxMnTexture->lpTlTextureInfo; - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = lpThisTxMnTexture->lpTlTextureInfo->info; - -/* - if ((lpThisTlTex->tableType == GR_NCCTABLE_NCC0) || - (lpThisTlTex->tableType == GR_NCCTABLE_NCC1)) - grTexNCCTable( currTMU, lpThisTlTex->tableType ); -*/ - if (!IS_MULTIBASE(*lpThisTxMnTexture)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - grTexSource( currTMU, lpThisTxMnTexture->u0.bothAdd, deMipMask, lpThisTexInfo ); - else /* IS_TRILINEAR */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* first do the even segment */ - grTexSource( currTMU, lpThisTxMnTexture->u0.evenAdd, deMipMask, lpThisTexInfo ); - else /* next do the odd segment */ - grTexSource( currTMU, lpThisTxMnTexture->u1.oddAdd, deMipMask, lpThisTexInfo ); - }/* if !IS_MULTIBASE */ - else - { /* else it is multibased */ - grTexMultibase(currTMU, FXTRUE); /* turn on multibase */ - if (!IS_TRILINEAR(*lpThisTxMnTexture)) - { /* really dependant on the unions being in the proper order */ - lpxAdd = &lpThisTxMnTexture->u0.multiR0Add; - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - ++tTexBase, ++lpxAdd) - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* if !IS_TRILINEAR */ - else - { /* else it is a multibased trilinear mipmap */ - if ( deMipMask == GR_MIPMAPLEVELMASK_EVEN ) /* do the even segments */ - { - lpxAdd = &lpThisTxMnTexture->u0.multiR0EvenAdd;/* set lpxAdd to 1st add */ - for (tTexBase = GR_TEXBASE_256; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase = ( tTexBase + 2 == GR_TEXBASE_32_TO_1 + 1 ) ? /* 32t1 is both even & odd */ - GR_TEXBASE_32_TO_1 : tTexBase + 2, lpxAdd += 2 ) /* even segs r at even indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress(currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo); - } - } /* if - even */ - else /* else do the odd segments */ - { - lpxAdd = &lpThisTxMnTexture->u1.multiR1OddAdd; - for (tTexBase = GR_TEXBASE_128; tTexBase <= GR_TEXBASE_32_TO_1; - tTexBase+=2, lpxAdd+=2 ) /* odd segs r at odd indices */ - /* next i check that the current TexBase is in the lod range */ - if ((lpThisTexInfo->largeLod <= (FxI32) tTexBase) && - (lpThisTexInfo->smallLod >= (FxI32) tTexBase)) - { - xAdd = *lpxAdd; - if (bMultiOffsetFix) - xAdd -= prGetMultiMemBump(lpThisTexInfo, tTexBase, deMipMask); - grTexMultibaseAddress( currTMU, tTexBase, xAdd, deMipMask, - lpThisTexInfo ); - } - } /* else - odd */ - } /* else IS_TRILINEAR && IS_MULTIBASE */ - grTexMultibase(currTMU, FXFALSE); /* turn off multibase */ - } /* else IS_MULTIBASE */ -} /* plTxMnRender */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnGetInfo - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - simply fills in GrTexInfo struct with info about Texture - Arguments: - hTexId_t deTexHndl - the texture that you want to know about - GrTexInfo *deGrTexInfo - the info struct you want filled - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ) -{ - - /* assumptions */ - assert (deGrTexInfo); - assert ( deTexHndl < hFstOpnTexId ); - - *deGrTexInfo = tlTxMnMngr[deTexHndl].lpTlTextureInfo->info; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPopLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPopLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPopLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo; - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ( lpThisTexInfo->smallLod == lpThisTexInfo->largeLod ) - return; /* no reason to go on, nothing to do */ - - if ((IS_TRILINEAR(*lpThisTxMnTexture)) && - ((lpThisTexInfo->smallLod - lpThisTexInfo->largeLod) == 2 ) ) - return; /* trilinear && <2-lods are mutex */ - - prPopLod( lpThisTexInfo, deMipMapEnd ); -} /* plPopLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plPushLod - Date: 6/17/97 - Implementor(s): psw - Library: - Description: - Basically a wrapper for prPushLod - Arguments: - hTexId_t thisTexId - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -void -plPushLod( hTexId_t hCurrTexture, mipMapEnd_t deMipMapEnd ) -{ - /* definitions */ - GrTexInfo *lpThisTexInfo;/* info struct associated with curr tlTxMnMnger obj */ - tlTxMnTexture_t *lpThisTxMnTexture; - - /* assumptions */ - assert( hCurrTexture < hFstOpnTexId ); - - /* initializations */ - lpThisTxMnTexture = &tlTxMnMngr[hCurrTexture]; - lpThisTexInfo = &lpThisTxMnTexture->lpTlTextureInfo->info; - - /* code */ - if ((deMipMapEnd == topOfMipMap) && - (lpThisTexInfo->largeLod == lpThisTxMnTexture->origLargeLod)) - return; /* already at the top of the stack */ - - if ((deMipMapEnd == btmOfMipMap) && - (lpThisTexInfo->smallLod == lpThisTxMnTexture->origSmallLod)) - return; /* already at the bottom of the stack */ - - prPushLod( lpThisTexInfo, deMipMapEnd); -} /* plPushLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plCreateTlTexture - Date: 6/20/97 - Implementor(s): psw - Library: - Description: - creates a TlTexture - Arguments: - GrTexInfo* - FxU16 [] - Return: - void - -------------------------------------------------------------------*/ -void -plCreateTlTexture( TlTexture *deTlTexture, FxU16 daColors[] ) -{ - /* definitions */ - GrLOD_t tCurrLod; /* the current LOD */ - int nBytePerPixel; /* number of bytes per pixel */ - FxU8 *spLilTex; /* 8bit LOD data ptr */ - FxU16 *mpBigTex; /* 16bit LOD data ptr */ - void *lpvCurrLod; /* curr LOD data ptr */ - FxU32 xLodNumBytes; /* number of bytes to write in curr LOD */ - GrTexInfo *lpThisTexInfo; /* ptr to GrTexInfo in TlTexture struct */ - - /* assumptions */ - assert( deTlTexture ); - assert( deTlTexture->info.data ); - assert( deTlTexture->info.smallLod > deTlTexture->info.largeLod ); - - /* no palettized */ - assert( (deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ); - - /* initializations */ - lpThisTexInfo = &deTlTexture->info; - - /* code */ - if ((lpThisTexInfo->format == GR_TEXFMT_RGB_332) || - (lpThisTexInfo->format == GR_TEXFMT_YIQ_422) || - (lpThisTexInfo->format == GR_TEXFMT_ALPHA_8) || - (lpThisTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (lpThisTexInfo->format == GR_TEXFMT_P_8)) - nBytePerPixel = 1; /* 8-bit formats */ - else - nBytePerPixel = 2; /* 16-bit formats */ - - lpvCurrLod = lpThisTexInfo->data; - - if ((deTlTexture->info.format != GR_TEXFMT_YIQ_422) || - (deTlTexture->info.format != GR_TEXFMT_P_8) || - (deTlTexture->info.format != GR_TEXFMT_AYIQ_8422) || - (deTlTexture->info.format != GR_TEXFMT_AP_88) ) - deTlTexture->tableType = NO_TABLE; /* fuck me */ - - for ( tCurrLod = lpThisTexInfo->largeLod; - tCurrLod <= (lpThisTexInfo->smallLod); ++tCurrLod ) - { - if ( nBytePerPixel == 1 ) - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (spLilTex = (FxU8*) lpvCurrLod; - spLilTex < (FxU8*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++spLilTex ) - *spLilTex = (FxU8) daColors[tCurrLod]; - - lpvCurrLod = (void*) spLilTex; - } - else - { - xLodNumBytes = prGetLodSize( lpThisTexInfo, tCurrLod ); - for (mpBigTex = (FxU16*) lpvCurrLod; - mpBigTex < (FxU16*) ((FxU32)lpvCurrLod + xLodNumBytes); - ++mpBigTex ) - *mpBigTex = daColors[tCurrLod]; - - lpvCurrLod = (void*) mpBigTex; - } - } -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - ***multibase not yet supported, not clearly defined - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) ) - return; /* nonfatal error, just return */ - - /* code */ - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevel( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData ); - free(lpvData); -} /* plTxMnDwnldMipMapLod */ -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: plTxMnDwnldMipMapLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - downloads a mipmap lod, deLod, from a src TxMnTexture to a dst - TxMnTexture. - Arguments: - hTexId_t dstTexId - destination TxMnTexture id - hTexId_t srcTexId - source TxMnTexture id - GrLOD_t deLod - the lod to download in srcTexId - Return: - void - -------------------------------------------------------------------*/ -void -plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ) -{ - /* definitions */ - GrTexInfo *lpDstTexInfo, - *lpSrcTexInfo; - tlTxMnTexture_t *lpDstTxMnTexture, - *lpSrcTxMnTexture; - void *lpvData; - FxU32 thisAdd; - GrLOD_t thisLgLod; - FxU32 thisMask; - - /* assumptions */ - assert( dstTexId < hFstOpnTexId ); - assert( srcTexId < hFstOpnTexId ); - assert( IS_DOWNLOADABLE(tlTxMnMngr[dstTexId]) ); - assert( nFstRow <= nLstRow ); - - /* initializations */ - lpDstTxMnTexture = &tlTxMnMngr[dstTexId]; - lpSrcTxMnTexture = &tlTxMnMngr[srcTexId]; - lpDstTexInfo = &lpDstTxMnTexture->lpTlTextureInfo->info; - lpSrcTexInfo = &lpSrcTxMnTexture->lpTlTextureInfo->info; - - /* code */ - /* just some error checking */ - if ( ((lpDstTexInfo->format) != (lpSrcTexInfo->format)) || - ((lpDstTexInfo->aspectRatio) != (lpSrcTexInfo->aspectRatio)) || - ((lpSrcTxMnTexture->origLargeLod) > deLod) || - ((lpSrcTxMnTexture->origSmallLod) < deLod) || - ((lpDstTxMnTexture->origLargeLod) > deLod) || - ((lpDstTxMnTexture->origSmallLod) < deLod) || - (nFstRow > prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) ) - return; /* nonfatal error, just return */ - - /* because i'm a nice guy */ -// if (nLstRow >= prGetLodHeight( deLod, lpDstTexInfo->aspectRatio)) -// nLstRow = (-1) + prGetLodHeight( deLod, lpDstTexInfo->aspectRatio); - /* not so nice */ - - /* get the data */ - lpvData = malloc(prGetLodSize(lpSrcTexInfo, deLod)); - assert(lpvData); - prGetLod(lpSrcTexInfo, deLod, lpvData); - /* now i have an lod to download */ - - /* get the address */ - thisAdd = prGetTxMnAdd( dstTexId, deLod ); - - /* get the mask */ - if (!IS_TRILINEAR(*lpDstTxMnTexture)) - thisMask = GR_MIPMAPLEVELMASK_BOTH; - else /* it is trilinear */ - thisMask = deLod%2 ? GR_MIPMAPLEVELMASK_ODD : GR_MIPMAPLEVELMASK_EVEN; - - /* get the largeLod, SPECIAL case for multibase */ - if (!IS_MULTIBASE(*lpDstTxMnTexture)) - thisLgLod = lpDstTexInfo->largeLod; - else /* is is multibase */ - thisLgLod = deLod < GR_LOD_32 ? deLod : - lpDstTexInfo->largeLod > GR_LOD_32 ? - lpDstTexInfo->largeLod : GR_LOD_32; - - grTexDownloadMipMapLevelPartial( currTMU, thisAdd, deLod, thisLgLod, - lpDstTexInfo->aspectRatio, lpDstTexInfo->format, - thisMask, lpvData, nFstRow, nLstRow ); - free(lpvData); -} -/*-------------------------------------------------------------------*/ - - - -/* static helpers */ - -/*------------------------------------------------------------------- - Function: prGetTxMnAdd - Date: 7/14/97 - Implementor(s): psw - Library: - Description: - returns the address of the texture seg in linear memory that contains - the LOD being sought based on TxMn id - Arguments: - hTexId_t deTexId - destination TxMnTexture id - GrLOD_t deLod - the lod to locate the seg in - Return: - FxU32 - address of the seg containing deLod - -------------------------------------------------------------------*/ -static FxU32 -prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ) -{ - /* definitions */ - tlTxMnTexture_t *lpThisTxMnTxtre; - FxU32 xAdd; - - /* initializations */ - lpThisTxMnTxtre = &tlTxMnMngr[deTexId]; - - /* code */ - if (!IS_MULTIBASE(*lpThisTxMnTxtre)) - { /* not multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - xAdd = lpThisTxMnTxtre->u0.bothAdd; - else /* IS_TRILINEAR */ - xAdd = (deLod%2) ? lpThisTxMnTxtre->u1.oddAdd : - lpThisTxMnTxtre->u0.evenAdd ; - } /* if !IS_MULTIBASE */ - else /* this is going to be fucking ugly! */ - { /* else it is multibased */ - if (!IS_TRILINEAR(*lpThisTxMnTxtre)) - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0Add; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1Add; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2Add; - break; - - default: - xAdd = (FxU32) &lpThisTxMnTxtre->u3.multiR3Add; - break; - } - } /* if !IS_TRILINEAR */ - else - { - switch ( deLod ) - { /* some things are better done with a switch... */ - case GR_LOD_256: - xAdd = (FxU32) &lpThisTxMnTxtre->u0.multiR0EvenAdd; - break; - - case GR_LOD_128: - xAdd = (FxU32) &lpThisTxMnTxtre->u1.multiR1OddAdd; - break; - - case GR_LOD_64: - xAdd = (FxU32) &lpThisTxMnTxtre->u2.multiR2EvenAdd; - break; - - default: /* deLod <= 32_TO_1, key is could be < */ - xAdd = (deLod % 2) ? (FxU32) &lpThisTxMnTxtre->u3.multiR3OddAdd : - (FxU32) &lpThisTxMnTxtre->u4.multiR3EvenAdd; - break; - } - } /* else IS_TRILINEAR */ - } /* else IS_MULTIBASE */ - - return (xAdd); -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - gets the lod specific data out of a GrTexInfo designated by - lpTexInfo, used primarily by plTxMnDwnldMipMapLod - Arguments: - GrTexInfo *lpTexInfo - destination TxMnTexture id - GrLOD_t deLod - the lod get in deTexId - void *lpvData - pointer to data to propagate - Return: - void - -------------------------------------------------------------------*/ -static void -prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *lpvData ) -{ - /* definitions */ - GrTexInfo thisTexInfo, - *lpThisTexInfo; - GrLOD_t lod; - FxU32 i, xNumBytes; - FxU8 *lpSrc, - *lpDst; - - /* initializations */ - lpThisTexInfo = &thisTexInfo; - *lpThisTexInfo = *lpTexInfo; /* munge a copy */ - - /* code */ - /* mod copy to get deLod at the top */ - for ( lod = lpThisTexInfo->largeLod; lod < deLod; ++lod ) - prPopLod( lpThisTexInfo, topOfMipMap ); - - /* get the size of top lod */ - xNumBytes = prGetLodSize( lpThisTexInfo, lpThisTexInfo->largeLod ); - - /* read the top lod data into *lpvData */ - lpSrc = (FxU8*) lpThisTexInfo->data; - lpDst = (FxU8*) lpvData; - - for ( i = 0; i < xNumBytes; ++i ) - *lpDst++ = *lpSrc++; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPushLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to push - data BACK on the top or bottom of the mipmap. pushes a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data - - prGetLodSize(lpDeTexInfo, --lpDeTexInfo->largeLod)); - else - ++lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prPopLod - Date: 7/7/97 - Implementor(s): psw - Library: - Description: - This routine actually modifies the GrTexInfo struct data to pop - data off the top or bottom of the mipmap. pops off a single lod - Arguments: - GrTexInfo *lpDeTexInfo - mipMapEnd_t deMipMapEnd - Return: - none - -------------------------------------------------------------------*/ -static void -prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ) -{ - if (deMipMapEnd == topOfMipMap) - lpDeTexInfo->data = (void*)( (FxU32) lpDeTexInfo->data + - prGetLodSize(lpDeTexInfo, lpDeTexInfo->largeLod++)); - else - --lpDeTexInfo->smallLod; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prGetLodSize - Date: 6/18/97 - Implementor(s): psw - Library: - Description: - returns the size, in number of bytes, of an LOD based upon format, - LOD level and aspect ratio. this routine is meant to be used on - the void* in the GrTexInfo struct. - Arguments: - GrTexInfo *const disTexInfo - pointer to the Texture Info - GrLOD_t disLOD - the lod to get the size of - Return: - FxU32 - -------------------------------------------------------------------*/ -static FxU32 -prGetLodSize( GrTexInfo *const deTexInfo, GrLOD_t deLod ) -{ - /* definitions */ - int nPxlFctr; - int yAspctDvdr[] = {3, 2, 1, 0, 1, 2, 3}; /* ie. GR_ASPECT_1x8 = 2^3 */ - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; /* ie. GR_LOD_256 = 2^8 */ - FxU32 xNumBytes; - GrAspectRatio_t thisAR; - GrLOD_t thisLod; - - /* code */ - if ((deTexInfo->format == GR_TEXFMT_RGB_332) || - (deTexInfo->format == GR_TEXFMT_YIQ_422) || - (deTexInfo->format == GR_TEXFMT_ALPHA_8) || - (deTexInfo->format == GR_TEXFMT_INTENSITY_8) || - (deTexInfo->format == GR_TEXFMT_P_8)) - nPxlFctr = 1; /* 8-bit formats */ - else - nPxlFctr = 2; /* all else are 16-bit formats */ - - thisAR = deTexInfo->aspectRatio; /* thisAspectRatio */ - thisLod = deLod; /* thisLod */ - - /* the general formula is xNumBytes=nBytesPerPixel*nPixels - ** nPixels=maxPixels/aspectRatio - ** maxPixels for GR_LOD_256=256*256 or 2^8*2^8, hence the following formula...*/ - if ( yAspctDvdr[thisAR] < yLodFctr[thisLod] ) - xNumBytes = nPxlFctr << yLodFctr[thisLod] << yLodFctr[thisLod] >> - yAspctDvdr[thisAR]; - else - xNumBytes = nPxlFctr << yLodFctr[thisLod]; - - return xNumBytes; -} -/*-------------------------------------------------------------------*/ - - - -/*------------------------------------------------------------------- - Function: prTexMultiMemRequired - Date: 6/27/97 - Implementor(s): psw - Library: - Description: - calculates and returns the amount of memory required for the - individual multibase texture segments in BOTH, EVEN or ODD modes - traps cases for missing LODs - Arguments: - FxU32 deMipMask (GR_MIPMAPLEVELMASK) - GrTexBaseRange_t deRange - GrAspectRatio_t deRatio - GrTextureFormat_t deFormat - Return: - FxU32 - memory required - -------------------------------------------------------------------*/ -static -FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deMultiSeg, - GrTexInfo* deTexInfo ) -{ - /* definitions */ - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; /* create a copy of the GrTexInfo */ - FxU32 thisSegMemReq = 0x0; - GrLOD_t lod; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; /* copy passed data, then prepare to munge */ - - /* code */ - if ((lpTmpTexInfo->largeLod > (FxI32) deMultiSeg) || - (lpTmpTexInfo->smallLod < (FxI32) deMultiSeg)) - return 0; /* the deMultiSeg !exist in the lod range of info */ - - /* else it does */ - for (lod = lpTmpTexInfo->largeLod; lod < (FxI32) deMultiSeg; ++lod) - prPopLod( lpTmpTexInfo, topOfMipMap ); /* munge the top */ - - if ( deMultiSeg != GR_TEXBASE_32_TO_1) - lpTmpTexInfo->smallLod = lpTmpTexInfo->largeLod; /* munge the btm */ - - thisSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - return thisSegMemReq; -} /* prTexMultiMemRequired */ -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static int -prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} -/*-------------------------------------------------------------------*/ - - - -/*-------------------------------------------------------------------*/ -static FxU32 -prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ) -{ /* this fixes some multibase fuckage */ - /* definitions */ - FxU32 xMemBump, - xAllMemReq, - xSegMemReq; - GrTexInfo tmpTexInfo, - *lpTmpTexInfo; - - /* initializations */ - lpTmpTexInfo = &tmpTexInfo; - *lpTmpTexInfo = *deTexInfo; - - /* code */ - lpTmpTexInfo->largeLod = GR_LOD_256; - xAllMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - lpTmpTexInfo->largeLod = deTexBase != GR_TEXBASE_32_TO_1 ? deTexBase : - lpTmpTexInfo->largeLod > (FxI32) deTexBase ? - lpTmpTexInfo->largeLod : GR_LOD_32; - xSegMemReq = grTexTextureMemRequired( deMipMask, lpTmpTexInfo ); - - xMemBump = xAllMemReq - xSegMemReq; - return (xMemBump); -} diff --git a/glide2x/sst1/glide/tests/plib.h b/glide2x/sst1/glide/tests/plib.h deleted file mode 100644 index 0a296a8..0000000 --- a/glide2x/sst1/glide/tests/plib.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _PLIB_H_ -#define _PLIB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { topOfMipMap, btmOfMipMap } mipMapEnd_t; - -typedef FxU8 hTexId_t; -#define H_NULL 0x0 -#define H_FSTTEXID 0x1 - -typedef struct { - unsigned int isDownloadable : 1; /* should tex be downloaded? */ - unsigned int isMultibase : 1; /* downloaded as multibase? */ - unsigned int isTrilinear : 1; /* downloaded as EVEN/ODD? */ - unsigned int isBeenPopd : 1; /* has it been pop'd? - not used */ - unsigned int isDirty : 1; /* has it been touched? - not used */ -} tlTxMnFlags_t; - -typedef struct { - TlTexture* lpTlTextureInfo; - GrLOD_t origLargeLod; /* for pop 'n' push */ - GrLOD_t origSmallLod; /* for pop 'n' push */ - /* I need a min of 5 start addresses worst case - Trilinear Multibase - ** The unions contain start addresses that are mutually exclusive - ** ps, if the order of these unions ever change, some shit will seriously - ** break, especially in plTxMnTexSource() */ - union u0_u { /* can you believe softice doesn't understand unnamed unions? */ - FxU32 bothAdd; /* BOTH linear start */ - FxU32 evenAdd; /* EVEN linear start */ - FxU32 multiR0Add; /* BOTH multi 1st range start */ - FxU32 multiR0EvenAdd; /* EVEN multi 1st range start */ - } u0; - union u1_u { - FxU32 oddAdd; /* ODD linear start */ - FxU32 multiR1Add; /* BOTH multi 2nd range start */ - FxU32 multiR1OddAdd; /* ODD multi 2nd range start */ - } u1; - union u2_u { - FxU32 multiR2Add; /* BOTH multi 3rd range start */ - FxU32 multiR2EvenAdd; /* EVEN multi 3rd range start */ - } u2; - union u3_u { - FxU32 multiR3Add; /* BOTH multi 4th range start */ - FxU32 multiR3OddAdd; /* EVEN multi 4th range start */ - } u3; - union u4_u { - FxU32 multiR3EvenAdd; /* ODD multi 4th range start */ - } u4; /* just for consistency */ - tlTxMnFlags_t flags; -} tlTxMnTexture_t; - -/* exposed function prototypes for TxMn */ -hTexId_t plTxMnLoadTxMngr( TlTexture* lpTexture ); -void plTxMnDownloadAll( ); -void plTxMnTexSource( hTexId_t deTexId, FxU32 deMipMask ); -void plTxMnReset( hTexId_t deTexId ); -void plTxMnSetDownload( hTexId_t theTexId, FxBool bDownLoad ); -FxBool plTxMnGetMultibase( hTexId_t deTexId ); -void plTxMnSetMultibase( hTexId_t deTexId, FxBool bMultibase ); -FxBool plTxMnGetTrilinear( hTexId_t deTexId ); -void plTxMnSetTrilinear( hTexId_t theTexId, FxBool bTrilinear ); -FxBool plTxMnGetMultiRevOrder( ); -void plTxMnSetMultiOffsetFix( FxBool bOffsetFix ); -FxBool plTxMnGetMultiOffsetFix( ); -void plTxMnSetMultiRevOrder( FxBool bOrder ); -void plTxMnGetInfo( hTexId_t deTexHndl, GrTexInfo *deGrTexInfo ); -void plTxMnDwnldMipMapLod( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod ); -void plTxMnDwnldMipMapLodPrtl( hTexId_t dstTexId, hTexId_t srcTexId, GrLOD_t deLod, - int nFstRow, int nLstRow ); - -/* public helper function prototypes */ -void plPopLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plPushLod( hTexId_t hCurrTexture, mipMapEnd_t mipMapEnd ); -void plCreateTlTexture( TlTexture *disTlTexture, FxU16 daColors[] ); - -/* static helper prototypes */ -static void prSetBeenPopd( hTexId_t deTexId, FxBool bBeenPopd ); -static FxU32 prGetLodSize( GrTexInfo *const disTexInfo, GrLOD_t disLOD ); -static FxU32 prTexMultiMemRequired( FxU32 deMipMask, GrTexBaseRange_t deRange, - GrTexInfo* deTexInfo ); -static void prGetLod( GrTexInfo *lpTexInfo, GrLOD_t deLod, void *data ); -static void prPopLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static void prPushLod( GrTexInfo *lpDeTexInfo, mipMapEnd_t deMipMapEnd ); -static FxU32 prGetTxMnAdd( hTexId_t deTexId, GrLOD_t deLod ); -static int prGetLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int prGetLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static FxU32 prGetMultiMemBump( const GrTexInfo *const deTexInfo, - GrTexBaseRange_t deTexBase, - FxU32 deMipMask ); - - - - -/* some macros to play with the bit fields */ -#define IS_DOWNLOADABLE( tex ) (tex).flags.isDownloadable ? FXTRUE : FXFALSE -#define IS_MULTIBASE( tex ) (tex).flags.isMultibase ? FXTRUE : FXFALSE -#define IS_BEENPOPD( tex ) (tex).flags.isBeenPopd ? FXTRUE : FXFALSE -#define IS_TRILINEAR( tex ) (tex).flags.isTrilinear ? FXTRUE : FXFALSE -#define IS_DIRTY( tex ) (tex).flags.isDirty ? FXTRUE : FXFALSE -#define SET_DOWNLOADABLE( tex, b ) (tex).flags.isDownloadable = b -#define SET_MULTIBASE( tex, b ) (tex).flags.isMultibase = b -#define SET_TRILINEAR( tex, b ) (tex).flags.isTrilinear = b -#define SET_BEENPOPD( tex, b ) (tex).flags.isBeenPopd = b -#define SET_DIRTY( tex, b ) (tex).flags.isDirty = b - - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/qatest00.c b/glide2x/sst1/glide/tests/qatest00.c deleted file mode 100644 index 57d9f44..0000000 --- a/glide2x/sst1/glide/tests/qatest00.c +++ /dev/null @@ -1,1240 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" -#include "plib.h" -#include "qatest00.h" - -/* 1BgFile+8FgFile+3Algo+8DwnlodAlgo=21*/ -#define NUMTEXTURES 21 -myTexture_t theTextures[NUMTEXTURES]; - -TexCoordFactors aspctToTxtreCrdFctrs[7] = { - { 256.0f, 256.0f / 8.0f }, /* GR_ASPECT_8x1 */ - { 256.0f, 256.0f / 4.0f }, /* GR_ASPECT_4x1 */ - { 256.0f, 256.0f / 2.0f }, /* GR_ASPECT_2x1 */ - { 256.0f, 256.0f }, /* GR_ASPECT_1x1 */ - { 256.0f / 2.0f, 256.0f }, /* GR_ASPECT_1x2 */ - { 256.0f / 4.0f, 256.0f }, /* GR_ASPECT_1x4 */ - { 256.0f / 8.0f, 256.0f } /* GR_ASPECT_1x8 */ -}; - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST00"; -static const char purpose[] = "Texture Download"; -static const char usage[] = "-n -r "; - -static float scrWidth = 640.0f; -static float scrHeight = 480.0f; - -/* some global shit for mipmap lod && partial lod downloads */ -static FxBool g_bDoLodDwnld = FXFALSE; -static FxI32 g_nLodToDwnld; -static FxBool g_bDoLodPrtlDwnld = FXFALSE; -static FxI32 g_nLodPrtlFstRow; -static FxI32 g_nLodPrtlLstRow; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - /* definitions */ - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - int frames = -1; - - /* some texture stuff */ - /* disk based textures */ - const char *lpzBgTxtrFile = "miro.3df"; - const int nNumFgTxtrFiles = 8; - const char *lpzFgTxtrFiles[] = { "rgb332.3df", "rgb565.3df", - "argb4444.3df", "argb1555.3df", - "p8.3df", "ap88.3df", - "yiq.3df", "ayiq.3df" }; - /* color stuff for algorithmic textures */ - const int nAlgFgTxtres = 4; - FxU16 yAlgFgClrs[][9] = - {{ RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }, - { RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565, GRN_565, RED_565 }}; - - /* templates for all algorithmic textures */ - GrTexInfo yAlgTxtreTmplts[][9] = - {{ GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }}; - - const int nDwnLodTxtres = 8; - FxU16 yDwnLodClrs[][9] = - {{ BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332, BLU_332 }, - { BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555, BLU_1555 }, - { BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444, BLU_4444 }, - { BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332, BLU_8332 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }, - { BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565, BLU_565 }}; - - GrTexInfo yDwnTxtreTmplts[][9] = - {{ GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_332, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_1555, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_ARGB_4444, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_1x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_8x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_4x1, GR_TEXFMT_RGB_565, NULL }, - { GR_LOD_1, GR_LOD_256, GR_ASPECT_2x1, GR_TEXFMT_RGB_565, NULL }}; - - /* texture handles */ - hTexId_t hCurrFgTxtre, /* current fg texture */ - hFstFgTxtre, /* first fg texture */ - hLstFgTxtre, /* last fg texture */ - hFstAlgFgTxtre, /* first algo texture */ - hLstAlgFgTxtre, /* last algo texture */ - hFstDwnlTxtre, /* first lod download texture */ - hLstDwnlTxtre, /* last lod download texture */ - hDwlnSrcTxtre, - hTmpTxtre; - hTexId_t hBgTxtre; /* bg texture */ - - GrVertex bgVerts[4]; - GrVertex fgVerts[4]; - - const float alpha = 192.0f; /* Alpha for ,blending tringle over background */ - FxU32 fxColorValue; - int i; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - bgVerts[0].x = 0.f, bgVerts[0].y = 0.f; - bgVerts[0].a = 255.f, bgVerts[0].oow = 1.f; - bgVerts[0].tmuvtx[0].sow = 0.f * bgVerts[0].oow; - bgVerts[0].tmuvtx[0].tow = 0.f * bgVerts[0].oow; - - bgVerts[1].x = scrWidth, bgVerts[1].y = 0.f; - bgVerts[1].a = 255.f,bgVerts[1].oow = 1.f; - bgVerts[1].tmuvtx[0].sow = 255.f * bgVerts[1].oow; - bgVerts[1].tmuvtx[0].tow = 0.f * bgVerts[1].oow; - - bgVerts[2].x = scrWidth, bgVerts[2].y = scrHeight; - bgVerts[2].a = 255.f, bgVerts[2].oow = 1.f; - bgVerts[2].tmuvtx[0].sow = 255.f * bgVerts[2].oow; - bgVerts[2].tmuvtx[0].tow = 255.f * bgVerts[2].oow; - - bgVerts[3].x = 0.f, bgVerts[3].y = scrHeight; - bgVerts[3].a = 255.f, bgVerts[3].oow = 1.f; - bgVerts[3].tmuvtx[0].sow = 0.f * bgVerts[3].oow; - bgVerts[3].tmuvtx[0].tow = 255.f * bgVerts[3].oow; - - fgVerts[0].x = 0.f, fgVerts[0].y = 0.f; - fgVerts[0].a = 255.f, fgVerts[0].oow = 1.f; - fgVerts[0].tmuvtx[0].sow = 0.f; - fgVerts[0].tmuvtx[0].tow = 0.f; - - fgVerts[1].x = 0.f, fgVerts[1].y = 0.f; - fgVerts[1].a = 255.f, fgVerts[1].oow = 1.f; - fgVerts[1].tmuvtx[0].sow = 0.f; - fgVerts[1].tmuvtx[0].tow = 0.f; - - fgVerts[2].x = 0.f, fgVerts[2].y = 0.f; - fgVerts[2].a = 255.f, fgVerts[2].oow = 1.f; - fgVerts[2].tmuvtx[0].sow = 0.f; - fgVerts[2].tmuvtx[0].tow = 0.f; - - fgVerts[3].x = 0.f, fgVerts[3].y = 0.f; - fgVerts[3].a = 255.f, fgVerts[3].oow = 1.f; - fgVerts[3].tmuvtx[0].sow = 0.f; - fgVerts[3].tmuvtx[0].tow = 0.f; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) - { - if ( rv == -1 ) - { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", tlGetResolutionList() ); - return; - } - - switch( match ) - { - case 'n': - frames = atoi( remArgs[0] ); - break; - - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], &scrWidth, &scrHeight ); - break; - } - } /* while */ - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - - if ( frames == -1 ) - { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, 60, 40, 0xffffff ); - /* done initialize Glide */ - - /* Texure stuff */ - /* do the disk based texture stuff */ - for ( i = 0; i < nNumFgTxtrFiles; ++i ) - if ( i==0 ) - hFstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - else - hLstFgTxtre = doLoadTexture( lpzFgTxtrFiles[i], NULL, NULL, FXTRUE ); - /* do the algorithmic fg texture stuff */ - for ( i = 0; i < nAlgFgTxtres; ++i ) - if ( i==0 ) - hFstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - else - hLstAlgFgTxtre = doLoadTexture( NULL, &yAlgTxtreTmplts[i][0], &yAlgFgClrs[i][0], FXTRUE ); - - hLstFgTxtre = hLstAlgFgTxtre; - /* do the algorithmic download lod texture stuff, these are not downloadable */ - for ( i = 0; i < nDwnLodTxtres; ++i ) - if ( i==0 ) - hFstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - else - hLstDwnlTxtre = doLoadTexture( NULL, &yDwnTxtreTmplts[i][0], &yDwnLodClrs[i][0], FXFALSE ); - - hCurrFgTxtre = hFstFgTxtre; /* init hCurrFgTxtre */ - hBgTxtre = doLoadTexture( lpzBgTxtrFile, NULL, NULL, FXTRUE ); - plTxMnDownloadAll(); /* make plTxMn download everything */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - /* done loading plTxMn */ - -// grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - - fxColorValue = (0x00FFFFFF | ( ((int) alpha) << 24 ) ); - grConstantColorValue(fxColorValue); - - /* Main processing loop */ - while( frames-- ) - { - /* definitions */ - static ScaleAmt_t tCurrScle = SCALE_1; - static MipMapMode_t mipMapMode = DISABLE; - static FilterMode_t filterMode = BOTH_BILNEAR; - static float fBiasLevel = 0.0f; - static float fBiasInc = 0.25f; - static FxBool bVerboseMode = FXTRUE; - static FxBool bBgImage = FXTRUE; - - float fXsize, fYsize, fULsow, fLRsow, fULtow, fLRtow; - GrTexInfo tmpTexInfo; - FxBool isTrilinear, isMultibase; - - /* code */ - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Output the diagnostic stuff */ - if (bVerboseMode) - { - tlConClear(); - plTxMnGetInfo( hCurrFgTxtre, &tmpTexInfo ); - isTrilinear = plTxMnGetTrilinear( hCurrFgTxtre ); - isMultibase = plTxMnGetMultibase( hCurrFgTxtre ); - tlConOutput("txt %d, fmt %#x, lgLod %#x, smLod %#x, aspct %#x, T:%d, M:%d\n", - hCurrFgTxtre, tmpTexInfo.format, tmpTexInfo.largeLod, - tmpTexInfo.smallLod, tmpTexInfo.aspectRatio, - isTrilinear, isMultibase ); - fXsize = fgVerts[1].x - fgVerts[0].x; - fYsize = fgVerts[3].y - fgVerts[0].y; - fULsow = fgVerts[0].tmuvtx[0].sow; - fULtow = fgVerts[0].tmuvtx[0].tow; - fLRsow = fgVerts[2].tmuvtx[0].sow; - fLRtow = fgVerts[2].tmuvtx[0].tow; - tlConOutput("Size %f by %f:\nUL s,t %f, %f: LR s,t %f, %f\n", - fXsize, fYsize, fULsow, fULtow, fLRsow, fLRtow ); - switch (tCurrScle) - { - case SCALE_1: - tlConOutput("Curr Scale is 1 LOD; "); - break; - - case SCALE_2: - tlConOutput("Curr Scale is 1/2 LOD; "); - break; - - case SCALE_4: - tlConOutput("Curr Scale is 1/4 LOD; "); - break; - - case SCALE_8: - tlConOutput("Curr Scale is 1/8 LOD; "); - break; - - case SCALE_16: - tlConOutput("Curr Scale is 1/16 LOD; "); - break; - - case SCALE_32: - tlConOutput("Curr Scale is 1/32 LOD; "); - break; - } - tlConOutput("LOD Bias is %f\n", fBiasLevel); - } /* done with the Con output stuff */ - - /* do the Bg texture */ - if (bBgImage) - { - /* Setup the system for the Bg Texture */ - grTexLodBiasValue( GR_TMU0, 0.0f ); - grHints(GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE); - grTexMipMapMode(GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE); - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* set bgTexture as source of next rendering operations */ - plTxMnTexSource( hBgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - - grDrawTriangle( &bgVerts[0], &bgVerts[1], &bgVerts[3] ); - grDrawTriangle( &bgVerts[1], &bgVerts[2], &bgVerts[3] ); - } /* done with Bg txtre */ - - /* Setup the system for the Fg Texture */ - switch( mipMapMode ) - { - case DISABLE: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_DISABLE, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: DISABLE " ); - break; - - case NEAREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAREST " ); - break; - - case TRILINEAR: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXFALSE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: TRILINEAR " ); - break; - - case DITHRD_NREST: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXFALSE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_DITHRD " ); - break; - - case DITHRD_TRILIN: - grHints (GR_HINT_ALLOW_MIPMAP_DITHER, FXTRUE ); - grTexMipMapMode( GR_TMU0, GR_MIPMAP_NEAREST_DITHER, FXTRUE ); - if (bVerboseMode) - tlConOutput( "MipMapMode: NEAR_TRILNR " ); - break; - } /* switch( mipMapMode ) */ - - - switch( filterMode ) - { - case BOTH_POINT: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: Point Samp\n" ); - break; - - case MIN_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_POINT_SAMPLED ); - if (bVerboseMode) - tlConOutput( "FltrMode: MinBilnr\n" ); - break; - - case MAG_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_POINT_SAMPLED, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: MagBilnr\n" ); - break; - - case BOTH_BILNEAR: - grTexFilterMode( GR_TMU0, GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR ); - if (bVerboseMode) - tlConOutput( "FltrMode: BothBilnr\n" ); - break; - } /* switch( filterMode ) */ - - - /* do the Fg texturing stuff */ - if ((mipMapMode != TRILINEAR) && (mipMapMode != DITHRD_TRILIN)) - { - /* setup the Fg texture states */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* set the Fg texture */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_BOTH ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* if */ - else - { - /* setup system for the Even MipMaps */ - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - - /* render with the Even MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_EVEN ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - - /* setup system for the Odd MipMaps */ - grTexCombine( GR_TMU0, GR_COMBINE_FUNCTION_BLEND_LOCAL, GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL,GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_BLEND_OTHER, GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_CONSTANT, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* render with the Odd MipMaps */ - plTxMnTexSource( hCurrFgTxtre, GR_MIPMAPLEVELMASK_ODD ); - grDrawTriangle( &fgVerts[0], &fgVerts[1], &fgVerts[3] ); - grDrawTriangle( &fgVerts[1], &fgVerts[2], &fgVerts[3] ); - } /* else */ - - /* do the swap */ - tlConRender(); - grBufferSwap( 1 ); - - /* dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - /* handle any keyboard input */ - while( tlKbHit() ) - { - switch( tlGetCH() ) - { - static int nCurrAlpha = -1; - GrTexInfo tFgTexInfo; - - case '+': - doScaleScreenSurf( hCurrFgTxtre, SCALE_OUT, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case '-': - doScaleScreenSurf( hCurrFgTxtre, SCALE_IN, tCurrScle ); - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'a': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 0) ? 0 : - (nCurrAlpha < 0) ? (int) alpha-1: --nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'A': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - nCurrAlpha = (nCurrAlpha == 255) ? 255 : - (nCurrAlpha < 0) ? (int) alpha+1: ++nCurrAlpha; - fxColorValue = ( 0x00FFFFFF | (nCurrAlpha << 24) ); - grConstantColorValue(fxColorValue); - tlConOutput("Current fxColorValue is %-#8x\n", fxColorValue); - break; - - case 'b': - mipMapMode++; - mipMapMode%=5; - /* set or unset the trilinear bit on all the fg textures */ - if ((mipMapMode == TRILINEAR) || (mipMapMode == DITHRD_TRILIN)) - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXTRUE ); - else - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - plTxMnSetTrilinear( hTmpTxtre, FXFALSE ); - - plTxMnDownloadAll(); /* remember to reset the TMU mem */ - break; - - case 'B': - filterMode++; - filterMode%=4; - break; - - case 'c': - case 'C': - tlConClear(); - break; - - case 'd': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiOffsetFix( plTxMnGetMultiOffsetFix() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiOffsetFix() ? "Multibase offset fix in\n" : - "Multibase offset fix NOT\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'D': - tlConClear(); - bVerboseMode = FXFALSE; - tlConOutput("Verbose mode Off\n"); - plTxMnSetMultiRevOrder( plTxMnGetMultiRevOrder() ? FXFALSE : FXTRUE ); - tlConOutput( plTxMnGetMultiRevOrder() ? "Multibase in rev order\n" : - "Multibase in linear order\n"); - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'e': - if (fBiasLevel > -8.00f) - fBiasLevel -= fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'E': - if (fBiasLevel < 7.750f) - fBiasLevel += fBiasInc; - - grTexLodBiasValue( GR_TMU0, fBiasLevel ); - break; - - case 'h': - case 'H': - doHelp(); - break; - - case 'l': - case 'L': - getLodToDwnld(); - if (g_bDoLodDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLod( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'm': - if ( plTxMnGetMultibase(hCurrFgTxtre) ) - plTxMnSetMultibase( hCurrFgTxtre, FXFALSE ); - else - plTxMnSetMultibase( hCurrFgTxtre, FXTRUE ); - - plTxMnDownloadAll(); /* reset the tmu mem */ - break; - - case 'M': - bBgImage = bBgImage ? FXFALSE : FXTRUE; - break; - - case 'o': - plPopLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'O': - plPopLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'p': - case 'P': - getLodPrtlToDwnld(); - if (g_bDoLodPrtlDwnld) - { - hDwlnSrcTxtre = H_NULL; - plTxMnGetInfo( hCurrFgTxtre, &tFgTexInfo ); - - for ( hTmpTxtre = hFstDwnlTxtre; hTmpTxtre <= hLstDwnlTxtre; ++hTmpTxtre) - { - plTxMnGetInfo( hTmpTxtre, &tmpTexInfo ); - if ((tFgTexInfo.format == tmpTexInfo.format) && - (tFgTexInfo.aspectRatio == tmpTexInfo.aspectRatio)) - { /* if they are compatible */ - hDwlnSrcTxtre = hTmpTxtre; - hTmpTxtre = hLstDwnlTxtre; /* get first occurence, short circut */ - } - } - - if (hDwlnSrcTxtre) - plTxMnDwnldMipMapLodPrtl( hCurrFgTxtre, hDwlnSrcTxtre, g_nLodToDwnld, - g_nLodPrtlFstRow, g_nLodPrtlLstRow ); - else /* else still H_NULL */ - tlConOutput("No cmptble txtre format avlable\n"); - } - break; - - case 'r': - case 'R': - for (hTmpTxtre = hFstFgTxtre; hTmpTxtre <= hLstFgTxtre; ++hTmpTxtre ) - { - plTxMnReset( hTmpTxtre ); - doResetFgVerts( hTmpTxtre ); - } /* reset d'em puppies */ - - mipMapMode = DISABLE; - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 't': - if (hCurrFgTxtre == hFstFgTxtre) - hCurrFgTxtre = hLstFgTxtre; - else - --hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'T': - if (hCurrFgTxtre == hLstFgTxtre) - hCurrFgTxtre = hFstFgTxtre; - else - ++hCurrFgTxtre; - - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'u': - plPushLod( hCurrFgTxtre, btmOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'U': - plPushLod( hCurrFgTxtre, topOfMipMap ); - plTxMnDownloadAll(); /* reset the tmu mem */ - getFgVerts( hCurrFgTxtre, &fgVerts[0] ); - break; - - case 'v': - case 'V': - bVerboseMode = bVerboseMode ? FXFALSE : FXTRUE; - break; - - case 'w': - if (tCurrScle != SCALE_1) - --tCurrScle; - break; - - case 'W': - if (tCurrScle != SCALE_32) - ++tCurrScle; - break; - - default: - frames = 0; - break; - } /* switch( tlGetCH() ) */ - } /* while( tlKbHit() ) */ - } /* while (frames--) */ - - /* get the funk out */ - doUnloadTextures(); - grGlideShutdown(); - - - return; -} /* main */ - - - -static void -doHelp( void ) -{ - grBufferClear( 0, 0, 0 ); - tlConClear(); - tlConOutput("Keymap: (case sensitive - second letter lower case)\n"); - tlConOutput(" b (lc): cycles mipmap modes\n"); - tlConOutput(" B (uc): cycles filter modes\n"); - tlConOutput(" T xor t: cycles through fg texture formats\n"); - tlConOutput(" m (lc): toggles multibase for fg texture\n"); - tlConOutput(" M (uc): toggles the bg image\n"); - tlConOutput(" d (lc): toggles the mltbse offset fix\n"); - tlConOutput(" D (uc): toggles the order of the mltbse segs\n"); - tlConOutput(" L or l: LOD download menu\n"); - tlConOutput(" P or p: partial LOD download menu\n"); - tlConOutput(" R or r: resets all fg textures states\n"); - tlConOutput(" O xor o: pop lod off TOP or btm of stack\n"); - tlConOutput(" U xor u: push lod back on TOP or btm of stack\n"); - tlConOutput(" V or v: toggle verbose mode\n"); - tlConOutput(" + xor -: change size of fg obj by LOD frac\n"); - tlConOutput(" W xor w: change LOD frac\n"); - tlConOutput(" E xor e: INC or dec LOD Bias\n"); - tlConOutput(" A xor a: INC or dec alpha const\n"); - tlConOutput(" C or c: clears console\n"); - tlConOutput(" H or h: Help\n"); - tlConOutput(" Q or q: Quit\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - - tlConClear(); -} - - - -static hTexId_t -doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ) -{ - /* definitions */ - static FxU8 lstTexIndx = 0; /* last available texture index */ - GrTexInfo *lpTmpTexInfo; - surfInfo_t *lpSurfInfo; - myTexture_t *lpTmpMyTxtre; /* for ease of read */ - double dNonFrac, ret; - - /* assumptions */ - assert( lpzFileName || tEtTexInfo ); - assert( lstTexIndx < NUMTEXTURES ); - - /* initializations */ - lpTmpMyTxtre = &theTextures[lstTexIndx]; - lpTmpMyTxtre->lpzTexFileName = lpzFileName; - - - /* code */ - lpTmpMyTxtre->lpTlTexture = (TlTexture*) malloc(sizeof(TlTexture)); - assert( lpTmpMyTxtre->lpTlTexture ); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if (lpzFileName != NULL) - { /* load from disk */ - assert(tlLoadTexture( lpTmpMyTxtre->lpzTexFileName, - &lpTmpMyTxtre->lpTlTexture->info, - &lpTmpMyTxtre->lpTlTexture->tableType, - &lpTmpMyTxtre->lpTlTexture->tableData)); - lpTmpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - } - else - { /* else create in RAM from template && lod color array */ - *lpTmpTexInfo = *tEtTexInfo; - lpTmpTexInfo->data = malloc(grTexCalcMemRequired(lpTmpTexInfo->smallLod, - lpTmpTexInfo->largeLod, - lpTmpTexInfo->aspectRatio, - lpTmpTexInfo->format)); - assert(lpTmpTexInfo->data); - plCreateTlTexture(lpTmpMyTxtre->lpTlTexture, yColors); - } - - /* save off the starting surface screen coords for this texture */ - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpSurfInfo->currLod = lpTmpTexInfo->largeLod; - - - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTmpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ - - /* give it to plTxMn */ - lpTmpMyTxtre->hTexture = plTxMnLoadTxMngr( lpTmpMyTxtre->lpTlTexture ); - plTxMnSetDownload( lpTmpMyTxtre->hTexture, isDwnldble ); - - ++lstTexIndx; - - return( lpTmpMyTxtre->hTexture ); -} - - - -static void -getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - int i; - GrTexInfo tTexInfo; - float fSmulti, fTmulti; - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - assert( deFgVerts ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; /* texture not found */ - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - tTexInfo = theTextures[i].lpTlTexture->info; - fSmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].sMult; - fTmulti = aspctToTxtreCrdFctrs[tTexInfo.aspectRatio].tMult; - - /*---- - 0-1 - |/| - 3-2 - -----*/ - - deFgVerts[0].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[0].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[0].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[0].oow; - deFgVerts[0].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[0].oow; - - deFgVerts[1].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[1].y = lpSurfInfo->rStartY+0.5f; - deFgVerts[1].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[1].oow; - deFgVerts[1].tmuvtx[0].tow = 0.f * (fTmulti) * deFgVerts[1].oow; - - deFgVerts[2].x = lpSurfInfo->rEndX+0.5f; - deFgVerts[2].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[2].tmuvtx[0].sow = 1.f * (fSmulti) * deFgVerts[2].oow; - deFgVerts[2].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[2].oow; - - deFgVerts[3].x = lpSurfInfo->rStartX+0.5f; - deFgVerts[3].y = lpSurfInfo->rEndY+0.5f; - deFgVerts[3].tmuvtx[0].sow = 0.f * (fSmulti) * deFgVerts[3].oow; - deFgVerts[3].tmuvtx[0].tow = 1.f * (fTmulti) * deFgVerts[3].oow; -} - - - -static void -doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deScleDir, ScaleAmt_t deScleAmt ) -{ - /* definitions */ - myTexture_t *lpTmpMyTxtre; - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - int nNumScles; - float fScleAmt; - GrLOD_t tLodToScle; - GrAspectRatio_t tCurrAspct; - double dNonFrac, ret; - const float fScleLCD = 32.f; //least common scale denominator - - /* assumptions */ - assert( deTexId < NUMTEXTURES ); - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpTmpMyTxtre = &theTextures[i]; - lpSurfInfo = &lpTmpMyTxtre->surfInfo; - lpTexInfo = &lpTmpMyTxtre->lpTlTexture->info; - - if ((lpSurfInfo->currLod == GR_LOD_1) && (deScleDir == SCALE_IN)) - return; - - if ((lpSurfInfo->currLod >= GR_LOD_32) && (deScleAmt > SCALE_8)) - deScleAmt = SCALE_8; - - /* do everything as multiples of (1/8)LOD jmps, (1)LOD jmp becomes 8*1/8 */ - nNumScles = ( (int) fScleLCD) >> deScleAmt; - - /* scale by a frac of the next LOD your are scaling to */ - tLodToScle = lpSurfInfo->currLod +1; - - tCurrAspct = lpTexInfo->aspectRatio; /* ease of read */ - fScleAmt = 0.0f; /* init then go */ - for ( i = 0; i < nNumScles; ++i) - { - /* check to see if i am in another LOD, scale change */ - if (deScleDir == SCALE_IN) - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(tLodToScle, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(tLodToScle, tCurrAspct)) ) - { - ++lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1; - } - } - else - { - if ( (lpSurfInfo->rEndX - lpSurfInfo->rStartX == - (float) getLodWidth(lpSurfInfo->currLod, tCurrAspct)) && - (lpSurfInfo->rEndY - lpSurfInfo->rStartY == - (float) getLodHeight(lpSurfInfo->currLod, tCurrAspct)) ) - { - if (lpSurfInfo->currLod != GR_LOD_256) - --lpSurfInfo->currLod; - tLodToScle = lpSurfInfo->currLod +1;// == GR_LOD_256 ? GR_LOD_128 : lpSurfInfo->currLod; - } - } - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodWidth(tLodToScle, tCurrAspct) == getLodWidth(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodWidth(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - lpSurfInfo->fStartX += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndX -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartX) == (lpSurfInfo->fEndX)) - lpSurfInfo->fEndX += 1.0f; - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - - - - if ( !((deScleDir == SCALE_OUT) && /* is there somtin' to do */ - (getLodHeight(tLodToScle, tCurrAspct) == getLodHeight(tLodToScle -1, tCurrAspct)))) - { - fScleAmt = ((float) getLodHeight(tLodToScle, tCurrAspct)) / fScleLCD / 2.f; - - lpSurfInfo->fStartY += deScleDir * fScleAmt; - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - - lpSurfInfo->fEndY -= deScleDir * fScleAmt; - if ((lpSurfInfo->fStartY) == (lpSurfInfo->fEndY)) - lpSurfInfo->fEndY += 1.0f; - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac + - (ret > 0.5f ? 1.0f : ret == 0.0f ? 0.0f : 0.5f); - } - } -} /* doScaleScreenSurf */ - - - -static int -getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctWdvdr[] = {0, 0, 0, 0, 1, 2, 3}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctWdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctWdvdr[aspect] : 1; - - return( val ); -} - - - -static int -getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ) -{ - int yAspctHdvdr[] = {3, 2, 1, 0, 0, 0, 0}; - int yLodFctr[] = {8, 7, 6, 5, 4, 3, 2, 1, 0}; - int val; - - val = yLodFctr[lod] > yAspctHdvdr[aspect] ? - 1 << yLodFctr[lod] >> yAspctHdvdr[aspect] : 1; - - return( val ); -} - - - -static void -doUnloadTextures( ) -{ - int i; - - for ( i = 0; i < NUMTEXTURES; ++i ) - { /* free the textures, if they love you they'll come back */ - free(theTextures[i].lpTlTexture->info.data); - free(theTextures[i].lpTlTexture); - } -} - - - -static void -getLodToDwnld( ) -{ - /* definitions */ - char ch; - - /* initializations */ - g_bDoLodDwnld = FXFALSE; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Download menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - g_bDoLodDwnld = FXTRUE; - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -getLodPrtlToDwnld( ) -{ - /* definitions */ - char ch; - int i; - - /* initializations */ - g_nLodToDwnld = 0x0; - g_bDoLodPrtlDwnld = FXFALSE; - g_nLodPrtlFstRow = 0x0; - g_nLodPrtlLstRow = 0x0; - - /* code */ - tlConClear(); - grBufferClear( 0, 0, 0 ); - grBufferSwap( 1 ); - grBufferClear( 0, 0, 0 ); - tlConOutput("LOD Prtl Dwnld menu\n"); - tlConOutput("Choose LOD 0-8 "); - tlConRender(); - grBufferSwap( 1 ); - ch = tlGetCH(); - g_nLodToDwnld = atoi(&ch); - - if ((g_nLodToDwnld >= GR_LOD_256) && (g_nLodToDwnld <= GR_LOD_1)) - { - tlConOutput("%d\n", g_nLodToDwnld); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Fst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlFstRow = (g_nLodPrtlFstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlFstRow); - tlConRender(); - grBufferSwap( 1 ); - - tlConOutput("Entr Lst Row 000-255 "); - tlConRender(); - grBufferSwap( 1 ); - for ( i = 0; i < 3; ++i ) - { - ch = tlGetCH(); - tlConOutput("%c", ch); - tlConRender(); - grBufferSwap( 1 ); - g_nLodPrtlLstRow = (g_nLodPrtlLstRow * 0xA) + atoi(&ch); - } - tlConOutput(" %d\n", g_nLodPrtlLstRow); - tlConRender(); - grBufferSwap( 1 ); - - if (((g_nLodPrtlFstRow >= 0x0) && (g_nLodPrtlFstRow < 0x100)) && - ((g_nLodPrtlLstRow >= 0x0) && (g_nLodPrtlLstRow < 0x100))) - g_bDoLodPrtlDwnld = FXTRUE; - else - tlConOutput("invalid Row(s)\n"); - } - else - tlConOutput("invalid LOD\n"); - - tlConRender(); - grBufferSwap( 1 ); -} - - - -static void -doResetFgVerts( hTexId_t deTexId ) -{ - /* definitions */ - surfInfo_t *lpSurfInfo; - GrTexInfo *lpTexInfo; - int i; - double ret, dNonFrac; - - /* code */ - - /* parse the texture array for the right one */ - for ( i = 0; (i < NUMTEXTURES) && (theTextures[i].hTexture != deTexId) ; ++i ); - if (i == NUMTEXTURES) - return; - - /* initializations */ - lpSurfInfo = &theTextures[i].surfInfo; - lpSurfInfo->currLod = theTextures[i].lpTlTexture->info.largeLod; - lpTexInfo = &theTextures[i].lpTlTexture->info; - - /* reset the surf info */ - lpSurfInfo->fStartX = - ((scrWidth - (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartX, &dNonFrac); - lpSurfInfo->rStartX = (float) dNonFrac; - - lpSurfInfo->fEndX = - (lpSurfInfo->fStartX + (float) getLodWidth(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndX, &dNonFrac); - lpSurfInfo->rEndX = (float) dNonFrac; - - lpSurfInfo->fStartY = - ((scrHeight - (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio) )/2.f); - ret = modf((double) lpSurfInfo->fStartY, &dNonFrac); - lpSurfInfo->rStartY = (float) dNonFrac; - - lpSurfInfo->fEndY = - (lpSurfInfo->fStartY + (float) getLodHeight(lpSurfInfo->currLod, - lpTexInfo->aspectRatio)); - ret = modf((double) lpSurfInfo->fEndY, &dNonFrac); - lpSurfInfo->rEndY = (float) dNonFrac; - /* done with surface coords */ -} - diff --git a/glide2x/sst1/glide/tests/qatest00.h b/glide2x/sst1/glide/tests/qatest00.h deleted file mode 100644 index 45822c8..0000000 --- a/glide2x/sst1/glide/tests/qatest00.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#ifndef _QATEST00_H_ -#define _QATEST00_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define RED_1555 0x7C00 -#define GRN_1555 0x03E0 -#define BLU_1555 0x001F -#define RED_4444 0x0F00 -#define GRN_4444 0x00F0 -#define BLU_4444 0x000F -#define RED_332 0x00E0 -#define GRN_332 0x001C -#define BLU_332 0x0003 -#define RED_8332 0x00E0 -#define GRN_8332 0x001C -#define BLU_8332 0x0003 - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -typedef enum { DISABLE, NEAREST, TRILINEAR, DITHRD_NREST, DITHRD_TRILIN } MipMapMode_t; -typedef enum { SCALE_IN=1, SCALE_OUT=-1 } ScaleDir_t; //sign -typedef enum { SCALE_1=0, SCALE_2, SCALE_4, SCALE_8, SCALE_16, SCALE_32 } ScaleAmt_t;//bitwise shift factor -typedef enum { BOTH_POINT, MIN_BILNEAR, MAG_BILNEAR, BOTH_BILNEAR } FilterMode_t; - -typedef struct { - float fStartX, fEndX; - float rStartX, rEndX; - float fStartY, fEndY; - float rStartY, rEndY; - GrLOD_t currLod; -} surfInfo_t; - -typedef struct { - const char *lpzTexFileName; - TlTexture *lpTlTexture; - hTexId_t hTexture; - surfInfo_t surfInfo; -} myTexture_t; - -typedef struct -{ - float sMult; - float tMult; -} TexCoordFactors; - - -static void doHelp( void ); -static hTexId_t doLoadTexture( const char *lpzFileName, GrTexInfo *tEtTexInfo, - FxU16 *yColors, FxBool isDwnldble ); -static void doUnloadTextures( ); -static void doScaleScreenSurf( hTexId_t deTexId, ScaleDir_t deDir, ScaleAmt_t deAmt ); -static void getFgVerts( hTexId_t deTexId, GrVertex *deFgVerts ); -static int getLodWidth( GrLOD_t lod, GrAspectRatio_t aspect ); -static int getLodHeight( GrLOD_t lod, GrAspectRatio_t aspect ); -static void getLodToDwnld( ); -static void getLodPrtlToDwnld( ); -static void doResetFgVerts( hTexId_t deTexId ); - -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/qatest01.c b/glide2x/sst1/glide/tests/qatest01.c deleted file mode 100644 index 7bb7848..0000000 --- a/glide2x/sst1/glide/tests/qatest01.c +++ /dev/null @@ -1,172 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -#define RED_565 0xF800 -#define GRN_565 0x07E0 -#define BLU_565 0x001F -#define INVBLU_565 0xFFE0 -#define INVGRN_565 0xF81F -#define INVRED_565 0x07FF -#define WHT_565 0xFFFF -#define BLK_565 0x0000 - -#define NUM_X_BLCKS 7 -#define NUM_Y_BLCKS 7 - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "QATEST01"; -static const char purpose[] = "Buffer Swap Alliance bug"; -static const char usage[] = "-n -r -d "; - - -void -main( int argc, char **argv) -{ - /* Definitions */ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - GrLfbInfo_t myLfbInfo; - int nBlckWdth; - int nBlckHght; - - FxU16 yBlckClrs[NUM_Y_BLCKS][NUM_X_BLCKS] = - {{RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {RED_565, GRN_565, BLU_565, INVRED_565, INVGRN_565, INVBLU_565, WHT_565}, - {BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565, BLK_565}}; - - - /* Initializations */ - nBlckWdth = ((int) scrWidth / NUM_X_BLCKS); - nBlckHght = ((int) scrHeight / NUM_Y_BLCKS); - - /* Code */ - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, 2, 1 ) ); - - myLfbInfo.size = sizeof(GrLfbInfo_t); - if ( !grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &myLfbInfo)) - frames=0; - - while ( frames-- ) - { - int i, j, k, l; - FxU16 *lpPxl; - FxU32 stride = myLfbInfo.strideInBytes; - void *tmpLfb; - - tmpLfb = (void*) ((FxU16*)myLfbInfo.lfbPtr + 1 + 2*stride/2); - grBufferClear( 0xffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - for (i=0; i < NUM_Y_BLCKS; ++i) { - for (j=0; j < NUM_X_BLCKS; ++j) { - lpPxl = ((FxU16 *) tmpLfb + j*nBlckWdth) + - (i*nBlckHght*stride/2); - for(k=0; k < nBlckHght; ++k) { - for (l=0; l < nBlckWdth; ++l) { - *lpPxl = yBlckClrs[i][j]; - ++lpPxl; - } - lpPxl += (stride/2 - nBlckWdth); /* inc in pixel space */ - } - } - } - - grBufferSwap( 1 ); - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( tlKbHit() ) frames = 0; - } - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/rgb332.3df b/glide2x/sst1/glide/tests/rgb332.3df deleted file mode 100644 index f06219ae82ac55624b8fa021bacc569e2afc0956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87432 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 -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test00"; -static const char purpose[] = "Clear screen to blue"; -static const char usage[] = "-n -r -d "; - -void -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - grBufferClear( 0xff0000, 0, GR_WDEPTHVALUE_FARTHEST ); - tlConRender(); - grBufferSwap( 1 ); - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - diff --git a/glide2x/sst1/glide/tests/test01.c b/glide2x/sst1/glide/tests/test01.c deleted file mode 100644 index 1ec144b..0000000 --- a/glide2x/sst1/glide/tests/test01.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test01"; -static const char purpose[] = "draws a diagonal line of points from top-left to bottom-right"; -static const char usage[] = "-n -r -d "; - -void -main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtx; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x0, 0, GR_WDEPTHVALUE_FARTHEST ); - - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtx.x = tlScaleX( pos ), vtx.y = tlScaleY( pos ); - grDrawPoint( &vtx ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test02.c b/glide2x/sst1/glide/tests/test02.c deleted file mode 100644 index b877afe..0000000 --- a/glide2x/sst1/glide/tests/test02.c +++ /dev/null @@ -1,159 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test02"; -static const char purpose[] = "draws a parabolic envelope of lines"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xff0000 ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grConstantColorValue( 0xFFFFFF ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - int i; - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - for( i = 0; i < 100; i++ ) { - float pos = ((float)i)/100.0f; - - vtxA.x = tlScaleX( pos ), vtxA.y = tlScaleY( 0.0f ); - vtxB.x = tlScaleX( 1.0f), vtxB.y = tlScaleY( pos ); - - grDrawLine( &vtxA, &vtxB ); - } - - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test03.c b/glide2x/sst1/glide/tests/test03.c deleted file mode 100644 index fde691d..0000000 --- a/glide2x/sst1/glide/tests/test03.c +++ /dev/null @@ -1,154 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test03"; -static const char purpose[] = "draws gouraud shaded lines"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen(0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender() ) { - GrVertex vtxA, vtxB; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 1.0f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - grDrawLine( &vtxA, &vtxB ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test04.c b/glide2x/sst1/glide/tests/test04.c deleted file mode 100644 index 1295b12..0000000 --- a/glide2x/sst1/glide/tests/test04.c +++ /dev/null @@ -1,157 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test04"; -static const char purpose[] = "draws gouraud shaded triangle"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.3f ), vtxA.y = tlScaleY( 0.3f ); - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f; - - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.4f ); - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f; - - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.8f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f; - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test05.c b/glide2x/sst1/glide/tests/test05.c deleted file mode 100644 index 739bc4a..0000000 --- a/glide2x/sst1/glide/tests/test05.c +++ /dev/null @@ -1,191 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test05"; -static const char purpose[] = "renders two interpenetrating triangles with z-buffering"; -static const char usage[] = "-n -r -d "; - -void -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + Z-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled from 0 to 65535.0. - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - Depth values should be scaled from reciprocated Depth Value - then scaled to ( 0, 65535 ) - - ooz = ( 1.0f / Z ) * 65535.0f = 65535.0f / Z - -----------------------------------------------------------*/ - - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test06.c b/glide2x/sst1/glide/tests/test06.c deleted file mode 100644 index 23761e9..0000000 --- a/glide2x/sst1/glide/tests/test06.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test06"; -static const char purpose[] = "renders two interpenetrating triangles with w-buffering"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + w-buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, GR_WDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 10.0f; - vtxA.oow = vtxB.oow = vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x00808080 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - /*----------------------------------------------------------- - OOW Values are in the range (1,1/65535) - - This can be the exact same computed 1/W that you use - for texture mapping. This saves on host computation and - vertex data transferred across the PCI bus. - -----------------------------------------------------------*/ - wDist = 12.5f; - vtxA.oow = vtxB.oow = ( 1.0f / wDist ); - wDist = 7.5f; - vtxC.oow = ( 1.0f / wDist ); - - grConstantColorValue( 0x0000FF00 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test07.c b/glide2x/sst1/glide/tests/test07.c deleted file mode 100644 index dd912b6..0000000 --- a/glide2x/sst1/glide/tests/test07.c +++ /dev/null @@ -1,171 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test07"; -static const char purpose[] = "alpha blending test"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - flat shading + alpha blend on constant alpha */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - - grConstantColorValue( 0xFF0000FF ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - - grConstantColorValue( 0x80FF0000 ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test08.c b/glide2x/sst1/glide/tests/test08.c deleted file mode 100644 index 63f3130..0000000 --- a/glide2x/sst1/glide/tests/test08.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test08"; -static const char purpose[] = "fogging"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + fog */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0xff00ff00 ); - guFogGenerateExp( fogtable, .01f ); - grFogTable( fogtable ); - - tlConOutput( "Press a key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float wDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.0f ), vtxA.y = tlScaleY( 0.0f ); - vtxA.r = 0.0f, vtxA.g = 0.0f, vtxA.b = 64.0f; - wDist = 20.0f; - vtxA.oow = ( 1.0f / wDist ); - - vtxB.x = tlScaleX( 0.016f ), vtxB.y = tlScaleY( 1.0f ); - vtxB.r = 0.0f, vtxB.g = 0.0f, vtxB.b = 128.0f; - wDist = 2000.0f; - vtxB.oow = ( 1.0f / wDist ); - - vtxC.x = tlScaleX( 1.0f ), vtxC.y = tlScaleY( 0.0208f ); - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 64.0f; - wDist = 20.0f; - vtxC.oow = ( 1.0f / wDist ); - - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - if ( tlKbHit() ) frames = 0; - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test09.c b/glide2x/sst1/glide/tests/test09.c deleted file mode 100644 index 065e648..0000000 --- a/glide2x/sst1/glide/tests/test09.c +++ /dev/null @@ -1,212 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test09"; -static const char purpose[] = "chromakey - render a red and blue" - " triangle but chromakey one out"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - unsigned long chromaColor; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading + enable chromakey on blue */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grChromakeyMode( GR_CHROMAKEY_ENABLE ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - chromaColor = BLUE; - grChromakeyValue( chromaColor ); - - tlConOutput( "Press to toggle chomakey color\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( chromaColor ) { - case RED: - tlConOutput( "Chromakey RED \r" ); - break; - case BLUE: - tlConOutput( "Chromakey BLUE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - - subframe++; - /* scrgrab = FXFALSE; */ - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( chromaColor == RED ) - chromaColor = BLUE; - else - chromaColor = RED; - grChromakeyValue( chromaColor ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test10.c b/glide2x/sst1/glide/tests/test10.c deleted file mode 100644 index cf6b927..0000000 --- a/glide2x/sst1/glide/tests/test10.c +++ /dev/null @@ -1,207 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test10"; -static const char purpose[] = "culling test - render a red and blue" - " triangle but cull one out - red positive" - ", blue negative"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - GrCullMode_t cullMode; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 2; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - tlConOutput( "Press to toggle cull orientation\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - switch( cullMode ) { - case GR_CULL_POSITIVE: - tlConOutput( "CULL POSITIVE\r" ); - break; - case GR_CULL_NEGATIVE: - tlConOutput( "CULL NEGATIVE\r" ); - break; - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - - grConstantColorValue( 0x000000ff ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - grConstantColorValue( 0x00ff0000 ); - grDrawTriangle( &vtxA, &vtxC, &vtxB ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case ' ': - if ( cullMode == GR_CULL_POSITIVE ) - cullMode = GR_CULL_NEGATIVE; - else - cullMode = GR_CULL_POSITIVE; - grCullMode( cullMode ); - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - - - diff --git a/glide2x/sst1/glide/tests/test11.c b/glide2x/sst1/glide/tests/test11.c deleted file mode 100644 index b44b8c5..0000000 --- a/glide2x/sst1/glide/tests/test11.c +++ /dev/null @@ -1,260 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test11"; -static const char purpose[] = "simple lfb read/write test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - static unsigned short colorBuf[64][64]; - static unsigned short grabBuf[64][64]; - - int x,y; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - disable dithering*/ - grDitherMode( GR_DITHER_DISABLE ); - - - /* Create Source Bitmap to be copied to framebuffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU8 red = x << 2; - FxU8 grn = y << 2; - FxU8 blu = ( x + y )<<1; - colorBuf[y][x] = (red & 0xF8) << 8; - colorBuf[y][x] |= (grn & 0xFC) << 3; - colorBuf[y][x] |= (blu & 0xF8) >> 3; - } - } - - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrLfbInfo_t info; - int startX, startY; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - /* prepare info structure */ - info.size = sizeof( GrLfbInfo_t ); - - /* lock back buffer */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take write lock\n" ); - break; - } - - if ( tlScaleX(1.0f) < 64.0 || - tlScaleY(1.0f) < 64.0 ) - return; - - /* generate random start position */ - startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); - startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); - - /* render image to back buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - *pixel = colorBuf[y][x]; - } - } - /* unlock the backbuffer */ - grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); - - /* swap to front buffer */ - grBufferSwap( 1 ); - grBufferClear( 0,0,0 ); - - tlSleep( 1 ); - - /* lock the front buffer */ - if ( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_FRONTBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info )==FXFALSE) { - tlConOutput( "Error, failed to take read lock\n" ); - break; - } - - /* grab the source image out of the front buffer */ - for( y = 0; y < 64; y++ ) { - for( x = 0; x < 64; x++ ) { - FxU16 *pixel = - (FxU16*)(((char*)info.lfbPtr) + - (y+startY)*info.strideInBytes+ - (x+startX)*2); - grabBuf[y][x] = *pixel; - } - } - /* unlock the front buffer */ - grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); - - tlConClear(); - - /* compare the source image to the readback image */ - if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { - tlConOutput( "Failed readback test\n" ); - } else { - tlConOutput( "Passed readback test\n" ); - } - - grBufferSwap( 1 ); - tlConOutput( "Press any key to quit\n" ); - tlConRender(); - grBufferSwap( 1 ); - - tlSleep( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/sst1/glide/tests/test12.c b/glide2x/sst1/glide/tests/test12.c deleted file mode 100644 index c7fbd45..0000000 --- a/glide2x/sst1/glide/tests/test12.c +++ /dev/null @@ -1,345 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test12"; -static const char purpose[] = "lfb write modes, render buffer, pixpipe, yorigin test"; -static const char usage[] = "-n -r "; - - -static const char *originString[] = { - "GR_ORIGIN_UPPER_LEFT ", - "GR_ORIGIN_LOWER_RIGHT" -}; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *writeModeString[] = { - "GR_LFBWRITEMODE_565 ", - "GR_LFBWRITEMODE_555 ", - "GR_LFBWRITEMODE_1555 ", - "GR_LFBWRITEMODE_RESERVED1 ", - "GR_LFBWRITEMODE_888 ", - "GR_LFBWRITEMODE_8888 ", - "GR_LFBWRITEMODE_RESERVED2 ", - "GR_LFBWRITEMODE_RESERVED3 ", - "GR_LFBWRITEMODE_RESERVED4 ", - "GR_LFBWRITEMODE_RESERVED5 ", - "GR_LFBWRITEMODE_RESERVED6 ", - "GR_LFBWRITEMODE_RESERVED7 ", - "GR_LFBWRITEMODE_565_DEPTH ", - "GR_LFBWRITEMODE_555_DEPTH ", - "GR_LFBWRITEMODE_1555_DEPTH", - "GR_LFBWRITEMODE_ZA16 " -}; - -static const char *pixPipeString[] = { - "PIXELPIPE DISABLED", - "PIXELPIPE ENABLED " -}; - -void -main( int argc, char **argv) -{ - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - - GrOriginLocation_t lfbOrigin; - GrOriginLocation_t sstOrigin; - GrLfbWriteMode_t writeMode; - GrBuffer_t lfbBuffer; - GrBuffer_t sstBuffer; - GrBuffer_t curBuffer; - GrLfbInfo_t info; - FxBool pixPipe; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - if ( resolution == GR_RESOLUTION_NONE ) { - tlErrorMessage( "Error!: Frontbuffer rendering not supported in a window\n" ); - return; - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - - /* Load source bitmap from a .3df file */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - lfbOrigin = GR_ORIGIN_UPPER_LEFT; - sstOrigin = GR_ORIGIN_UPPER_LEFT; - lfbBuffer = GR_BUFFER_BACKBUFFER; - sstBuffer = GR_BUFFER_BACKBUFFER; - curBuffer = GR_BUFFER_BACKBUFFER; - pixPipe = FXFALSE; - writeMode = GR_LFBWRITEMODE_565; - - info.size = sizeof( info ); - - while( frames-- && tlOkToRender()) { - - static const char *console = { - "Current Buffer: %s\n" - "1 - lock yOrigin (%s)\n" - "2 - glide yOrigin (%s)\n" - "3 - lfb render buffer (%s)\n" - "4 - glide render buffer (%s)\n" - "5 - pixpipe enable (%s)\n" - "6 - lfb write mode (%s)\n" - "Press any other key to quit\n" - }; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_FRONTBUFFER ); - grBufferClear( 0, 0, 0 ); - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - - /* set Glide State */ - grRenderBuffer( sstBuffer ); - grSstOrigin( sstOrigin ); - - /* Attempt Lock */ - if ( grLfbLock( GR_LFB_WRITE_ONLY, - lfbBuffer, - writeMode, - lfbOrigin, - pixPipe, - &info ) ) { - int x, y; - FxU32 *longData = info.lfbPtr; - FxU16 *shortData = info.lfbPtr; - FxU16 *srcData = texture.info.data; - FxU32 longStride = info.strideInBytes >> 2; - FxU32 shortStride = info.strideInBytes >> 1; - FxU32 longColor; - FxU16 shortColor; - for( y = 0; y < 256; y++ ) - for( x = 0; x < 256; x++ ) { - switch( writeMode ) { - case GR_LFBWRITEMODE_565: - shortData[y*shortStride+x] = - srcData[y*256+x]; - break; - case GR_LFBWRITEMODE_555: - case GR_LFBWRITEMODE_1555: - shortColor = srcData[y*256+x]; - shortColor = - (0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f); - shortData[y*shortStride+x] = - shortColor; - break; - case GR_LFBWRITEMODE_888: - case GR_LFBWRITEMODE_8888: - longColor = srcData[y*256+x]; - longColor = - (0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8); - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - case GR_LFBWRITEMODE_1555_DEPTH: - case GR_LFBWRITEMODE_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = - (0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f); - longData[y*longStride+x] = longColor; - default: - break; - } - - } - - grLfbUnlock( GR_LFB_WRITE_ONLY, - lfbBuffer ); - - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - - tlConClear(); - curBuffer = GR_BUFFER_BACKBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - tlConClear(); - curBuffer = GR_BUFFER_FRONTBUFFER; - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } else { - grRenderBuffer( GR_BUFFER_BACKBUFFER ); - tlConClear(); - tlConOutput( console, - renderBufferString[curBuffer], - originString[lfbOrigin], - originString[sstOrigin], - renderBufferString[lfbBuffer], - renderBufferString[sstBuffer], - pixPipeString[pixPipe], - writeModeString[writeMode] ); - tlConOutput( "\nLock Failed....no output\n" ); - tlConRender(); - grBufferSwap( 1 ); - tlSleep( 1 ); - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - lfbOrigin = !lfbOrigin; - break; - case '2': - sstOrigin = !sstOrigin; - break; - case '3': - lfbBuffer = !lfbBuffer; - break; - case '4': - sstBuffer = !sstBuffer; - break; - case '5': - pixPipe = !pixPipe; - break; - case '6': - writeMode++; - if ( writeMode > GR_LFBWRITEMODE_ZA16 ) - writeMode = GR_LFBWRITEMODE_565; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} /* main */ - - - diff --git a/glide2x/sst1/glide/tests/test13.c b/glide2x/sst1/glide/tests/test13.c deleted file mode 100644 index 5dbf098..0000000 --- a/glide2x/sst1/glide/tests/test13.c +++ /dev/null @@ -1,174 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test13"; -static const char purpose[] = "iterated alpha test - blue triangle fades towards one vertex\n"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + constant color */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00, 0, 0 ); - - vtxA.x = tlScaleX( 0.5f ), vtxA.y = tlScaleY( 0.1f ); - vtxB.x = tlScaleX( 0.8f ), vtxB.y = tlScaleY( 0.9f ); - vtxC.x = tlScaleX( 0.2f ), vtxC.y = tlScaleY( 0.9f ); - vtxA.a = vtxB.a = vtxC.a = 255.0f; - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_LOWER_LEFT ); - - vtxA.a = 0.0f; - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - - tlConRender(); - grBufferSwap( 1 ); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test14.c b/glide2x/sst1/glide/tests/test14.c deleted file mode 100644 index 1fb0a50..0000000 --- a/glide2x/sst1/glide/tests/test14.c +++ /dev/null @@ -1,184 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test14"; -static const char purpose[] = "depth bias test: vary depth bias \n" - "over time with two interpenetrating triangles"; -static const char usage[] = "-n -r "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - short zBias; - short zDelta; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grDepthBufferMode( GR_DEPTHBUFFER_ZBUFFER ); - grDepthBufferFunction( GR_CMP_GREATER ); - grDepthMask( FXTRUE ); - - zBias = 0; - zDelta = 10; - -#define RED 0x000000ff -#define GREEN 0x0000ff00 -#define BLUE 0x00ff0000 -#define GRAY 0x00808080 - -#define MAX_ZBIAS 500 -#define MIN_ZBIAS -500 - - tlConOutput( "Press any key to quit\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC; - float zDist; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - if ( ( zBias > MAX_ZBIAS ) || - ( zBias < MIN_ZBIAS ) ) { - zDelta = -zDelta; - } - zBias += zDelta; - - tlConOutput( "DepthBiasLevel: %+.03d \r", zBias ); - - grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST ); - - vtxA.x = tlScaleX( 0.25f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.75f ), vtxB.y = tlScaleY( 0.21f ); - vtxC.x = tlScaleX( 0.5f ), vtxC.y = tlScaleY( 0.79f ); - zDist = 10.0f; - vtxA.ooz = vtxB.ooz = vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GRAY ); - - grDepthBiasLevel( zBias ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - vtxA.x = tlScaleX( 0.86f ), vtxA.y = tlScaleY( 0.21f ); - vtxB.x = tlScaleX( 0.86f ), vtxB.y = tlScaleY( 0.79f ); - vtxC.x = tlScaleX( 0.14f ), vtxC.y = tlScaleY( 0.5f ); - zDist = 12.5f; - vtxA.ooz = vtxB.ooz = ( 65535.0f / zDist ); - zDist = 7.5f; - vtxC.ooz = ( 65535.0f / zDist ); - - grConstantColorValue( GREEN ); - - grDepthBiasLevel( 0 ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test15.c b/glide2x/sst1/glide/tests/test15.c deleted file mode 100644 index 429d3b0..0000000 --- a/glide2x/sst1/glide/tests/test15.c +++ /dev/null @@ -1,217 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test15"; -static const char purpose[] = "clip rectangle testing - clip rectangle travels around screen"; -static const char usage[] = "-n -r "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float clipX, clipY, clipSize, clipSizeDelta, clipPosDelta; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - iterated alpha + z buffering */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - clipX = 0.2f; - clipY = 0.5f; - clipSize = 0.3f; - - clipSizeDelta = 0.005f; - clipPosDelta = 0.01f; - -#define CLIPSIZE_MIN 0.05f -#define CLIPSIZE_MAX 0.6f - -#define GRAY 0x00808080 -#define BLACK 0x00000000 - - tlConOutput( "+/- - grow/shrink clip rectangle\n" ); - tlConOutput( "a/d - clip window left/right \n" ); - tlConOutput( "w/s - clip window up/down \n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC; - int minx, miny, maxx, maxy; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Set Clipping Rectangle */ - minx = (int)tlScaleX(clipX); - miny = (int)tlScaleY(clipY); - if ( (clipX+clipSize)>1.0f ) - maxx = (int)tlScaleX( 1.0f ); - else - maxx = (int)tlScaleX( clipX + clipSize ); - if ( (clipY+clipSize)>1.0f ) - maxy = (int)tlScaleY( 1.0f ); - else - maxy = (int)tlScaleY( clipY + clipSize ); - grClipWindow( minx, miny, maxx, maxy ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A - |\ - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( GRAY ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '+': - if ( clipSize < CLIPSIZE_MAX ) - clipSize += clipSizeDelta; - break; - case '-': - if ( clipSize > CLIPSIZE_MIN ) - clipSize -= clipSizeDelta; - break; - case 'a': - case 'A': - if ( clipX > 0.0f ) - clipX -= clipPosDelta; - if ( clipX < 0.0f ) clipX = 0.0f; - break; - case 'd': - case 'D': - if ( clipX < 1.0f ) - clipX += clipPosDelta; - break; - case 'w': - case 'W': - if ( clipY > 0.0f ) - clipY -= clipPosDelta; - if ( clipY < 0.0f ) clipY = 0.0f; - break; - case 's': - case 'S': - if ( clipY < 1.0f ) - clipY += clipPosDelta; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test16.c b/glide2x/sst1/glide/tests/test16.c deleted file mode 100644 index bc000b6..0000000 --- a/glide2x/sst1/glide/tests/test16.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test16"; -static const char purpose[] = "test grShamelessPlug and grSplash"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -#define BLUE 0x00ff0000 -#define RED 0x000000ff -#define BLACK 0x00000000 - - tlConOutput( "p - toggle shameless plug on/off\n" ); - tlConOutput( "s - run the splash screen\n" ); - tlConOutput( "r - render splash continuously\n" ); - tlConOutput( "Press any other key to quit\n" ); - while( frames-- && tlOkToRender()) { - int x, y; - GrVertex vtxA, vtxB, vtxC, vtxD; - static int plug; - static int render; - static int frame = 1; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( BLACK, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - - if ( render ) { - grSplash( tlScaleX( 0.0f ), tlScaleY( 0.79f ), - tlScaleX( 0.2f ), tlScaleY( 0.2f ), - frame ); - frame++; - } - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'p': - case 'P': - plug = !plug; - grGlideShamelessPlug( plug ); - break; - case 's': - case 'S': - grSplash( 0.0f, 0.0f, scrWidth, scrHeight, 0 ); - break; - case 'r': - case 'R': - render = !render; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test17.c b/glide2x/sst1/glide/tests/test17.c deleted file mode 100644 index 5c3ace6..0000000 --- a/glide2x/sst1/glide/tests/test17.c +++ /dev/null @@ -1,292 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test17"; -static const char purpose[] = "texturing example, decal, rgb lit, white lit, flat lit"; -static const char usage[] = "-n -r -d "; - -typedef enum { DECAL, FLATLIT, RGBLIT, WHITELIT, SPECALPHA } TextureMode; -const char *textureModeNames[] = { - "DECAL TEXTURE ", - "FLAT SHADING * TEXTURE ", - "ITERATED RGB * TEXTURE ", - "INTENSITY LIGHTING * TEXTURE ", - "(ITRGB * TEXTURE)+WHITE SPECULAR" -}; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 5; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - color combine set in render loop */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_NONE, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "m - change lighting mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - static TextureMode textureMode; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - tlConOutput( "Current Texture Mode: %s\r", - textureModeNames[textureMode] ); - - switch( textureMode ) { - case DECAL: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case FLATLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case RGBLIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case WHITELIT: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL_ALPHA, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - case SPECALPHA: - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - break; - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - vtxA.r = 255.0f, vtxA.g = 0.0f, vtxA.b = 0.0f, vtxA.a = 255.0f; - vtxB.r = 0.0f, vtxB.g = 255.0f, vtxB.b = 0.0f, vtxB.a = 128.0f; - vtxC.r = 0.0f, vtxC.g = 0.0f, vtxC.b = 255.0f, vtxC.a = 128.0f; - vtxD.r = 0.0f, vtxD.g = 0.0f, vtxD.b = 0.0f, vtxD.a = 0.0f; - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - grConstantColorValue( 0x00ff0000 ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - /* cycle through all mode */ - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - - subframe++; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - textureMode++; - if ( textureMode > SPECALPHA ) textureMode = DECAL; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test18.c b/glide2x/sst1/glide/tests/test18.c deleted file mode 100644 index 2baa300..0000000 --- a/glide2x/sst1/glide/tests/test18.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test18"; -static const char purpose[] = "alpha texture test"; -static const char usage[] = "-n -r -d "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - - TlTexture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 1; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - alpha blend */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "alpha.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Enable Bilinear Filtering + Mipmapping */ - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - - tlConOutput( "Press any key to quit\n\n" ); - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - int x,y; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* Draw 10x10 grid of triangles */ - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, - GR_BLEND_ZERO, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - for( y = 0; y < 10; y++ ) { - for( x = 0; x < 10; x++ ) { - /* - A-D - |\| - B-C - */ - vtxA.x = vtxB.x = tlScaleX( ((float)x)/10.0f ); - vtxA.y = vtxD.y = tlScaleY( ((float)y)/10.0f ); - vtxB.y = vtxC.y = tlScaleY( (((float)y)/10.0f) + 0.1f ); - vtxC.x = vtxD.x = tlScaleX( (((float)x)/10.0f) + 0.1f ); - - grConstantColorValue( RED ); - grDrawTriangle( &vtxA, &vtxB, &vtxC ); - grConstantColorValue( BLUE ); - grDrawTriangle( &vtxA, &vtxC, &vtxD ); - } - } - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - vtxA.x = vtxC.x = tlScaleX( 0.2f ); - vtxB.x = vtxD.x = tlScaleX( 0.8f ); - vtxA.y = vtxB.y = tlScaleY( 0.2f ); - vtxC.y = vtxD.y = tlScaleY( 0.8f ); - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, - GR_BLEND_ZERO ); - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - if (!tlScreenDump(filename, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - scrgrab = FXFALSE; - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} diff --git a/glide2x/sst1/glide/tests/test19.c b/glide2x/sst1/glide/tests/test19.c deleted file mode 100644 index 9d8e512..0000000 --- a/glide2x/sst1/glide/tests/test19.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test19"; -static const char purpose[] = "texture filter modes test"; -static const char usage[] = "-n -r -d "; - -typedef FxU32 Palette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} NCCTable; - -typedef union { - Palette palette; - NCCTable nccTable; -} TextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TextureTable tableData; -} Texture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - FxBool scrgrab = FXFALSE; - char filename[256]; - FxU8 subframe = 0; - - Texture texture; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrd", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'd': - scrgrab = FXTRUE; - frames = 4; - strcpy(filename, remArgs[0]); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - DISABLE mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - - /* Load texture data into system ram */ - assert( loadTexture( "miro.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - - tlConOutput( "m - toggle magnify/minify texture\n" ); - tlConOutput( "f - toggle pointSample/Bilinear\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - - static int minify; - static int bilerp; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - if ( minify ) { - vtxA.x = vtxC.x = tlScaleX( 0.0f ); - vtxB.x = vtxD.x = tlScaleX( 1.0f ); - vtxA.y = vtxB.y = tlScaleY( 0.0f ); - vtxC.y = vtxD.y = tlScaleY( 1.0f ); - } else { /* magnify */ - vtxA.x = vtxC.x = tlScaleX( 0.45f ); - vtxB.x = vtxD.x = tlScaleX( 0.55f ); - vtxA.y = vtxB.y = tlScaleY( 0.45f ); - vtxC.y = vtxD.y = tlScaleY( 0.55f ); - } - - vtxA.tmuvtx[0].sow = vtxC.tmuvtx[0].sow = 0.0f; - vtxB.tmuvtx[0].sow = vtxD.tmuvtx[0].sow = 255.0f; - vtxA.tmuvtx[0].tow = vtxB.tmuvtx[0].tow = 0.0f; - vtxC.tmuvtx[0].tow = vtxD.tmuvtx[0].tow = 255.0f; - - if ( bilerp ) { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - tlConOutput( "GR_TEXTUREFILTER_BILINEAR \r" ); - } else { - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - tlConOutput( "GR_TEXTUREFILTER_POINT_SAMPLED\r" ); - } - - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - /* grab the frame buffer */ - if (scrgrab) { - char fname[256], tmp[32]; - FxU16 cnt; - - cnt = strcspn(filename, "."); - strncpy(fname, filename, cnt); - fname[cnt] = 0; - sprintf(tmp,"_%d\0", subframe); - strcat(fname, tmp); - strcat(fname, filename+cnt); - if (!tlScreenDump(fname, (FxU16)scrWidth, (FxU16)scrHeight)) - printf( "Cannot open %s\n", filename); - - subframe++; - - /* cycle through all mode */ - switch (subframe) - { - case 0: - minify = 0; - bilerp = 0; - break; - case 1: - minify = 0; - bilerp = 1; - break; - case 2: - minify = 1; - bilerp = 0; - break; - case 3: - minify = 1; - bilerp = 1; - break; - } - } - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - minify = !minify; - break; - case 'f': - case 'F': - bilerp = !bilerp; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - -/*------------------------------------------------------ - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - ------------------------------------------------------*/ -static int loadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} diff --git a/glide2x/sst1/glide/tests/test20.c b/glide2x/sst1/glide/tests/test20.c deleted file mode 100644 index 21c0e94..0000000 --- a/glide2x/sst1/glide/tests/test20.c +++ /dev/null @@ -1,320 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test20"; -static const char purpose[] = "mipmap modes"; -static const char usage[] = "-n -r "; - -typedef enum { DISABLE, NEAREST, TRILINEAR } MipMapMode; - - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - MipMapMode mipMapMode; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mipMapMode = DISABLE; - - tlConOutput( "m - change mipmapping mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - switch( mipMapMode ) { - case DISABLE: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_DISABLE \r" ); - break; - case NEAREST: - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - tlConOutput( "GR_MIPMAP_NEAREST \r" ); - break; - case TRILINEAR: - tlConOutput( "GR_MIPMAP_TRILINEAR\r" ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXTRUE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_LOD_FRACTION, - FXFALSE, - FXFALSE ); - break; - } - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - if ( mipMapMode == TRILINEAR ) { - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, - FXFALSE ); - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mipMapMode++; - mipMapMode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test21.c b/glide2x/sst1/glide/tests/test21.c deleted file mode 100644 index 78e23e3..0000000 --- a/glide2x/sst1/glide/tests/test21.c +++ /dev/null @@ -1,374 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test21"; -static const char purpose[] = "texture compositing"; -static const char usage[] = "-n -r "; - -typedef enum { LIGHTMAP, SPECULAR, DETAIL } Mode; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - TlTexture detailTexture; - unsigned long detailTextureAddr; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - Mode mode; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - assert( tlLoadTexture( "lava.3df", - &detailTexture.info, - &detailTexture.tableType, - &detailTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - detailTextureAddr = - lightTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - grTexDownloadMipMap( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - if ( detailTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - detailTexture.tableType, - &detailTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - mode = LIGHTMAP; - - tlConOutput( "m - change texture compositing mode\n" ); - tlConOutput( "Press any other key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - switch( mode ) { - case LIGHTMAP: - case SPECULAR: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grTexDetailControl( GR_TMU0, 2, 7, 1.0f ); - break; - } - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - switch( mode ) { - case LIGHTMAP: - grAlphaBlendFunction( GR_BLEND_DST_COLOR, GR_BLEND_ZERO, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "LIGHTMAP - TEXTURE MODULATE \r" ); - break; - case DETAIL: - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_LOCAL, - GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - detailTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &detailTexture.info ); - tlConOutput( "DETAIL - BLEND ON LOD \r" ); - break; - case SPECULAR: - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ONE, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - tlConOutput( "SPECULAR - TEXTURE ACCUMULATE\r" ); - break; - } - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'm': - case 'M': - mode++; - mode%=3; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test22.c b/glide2x/sst1/glide/tests/test22.c deleted file mode 100644 index 64e1ae8..0000000 --- a/glide2x/sst1/glide/tests/test22.c +++ /dev/null @@ -1,306 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test22"; -static const char purpose[] = "fog with multi-pass texturing"; -static const char usage[] = "-n -r "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture baseTexture; - unsigned long baseTextureAddr; - TlTexture lightTexture; - unsigned long lightTextureAddr; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - decal - bilinear - nearest mipmapping - fogging */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grFogColorValue( 0x404040 ); - guFogGenerateExp( fogtable, .2f ); - grFogTable( fogtable ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &baseTexture.info, - &baseTexture.tableType, - &baseTexture.tableData ) ); - assert( tlLoadTexture( "light.3df", - &lightTexture.info, - &lightTexture.tableType, - &lightTexture.tableData ) ); - - /* Download texture data to TMU */ - baseTextureAddr = grTexMinAddress( GR_TMU0 ); - grTexDownloadMipMap( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - if ( baseTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - baseTexture.tableType, - &baseTexture.tableData ); - } - - lightTextureAddr = - baseTextureAddr + - grTexTextureMemRequired( GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - grTexDownloadMipMap( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - if ( lightTexture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - lightTexture.tableType, - &lightTexture.tableData ); - } - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 10.0f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.05f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00404040, 0, GR_ZDEPTHVALUE_FARTHEST ); - - - /* 3D Transformations */ - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -90.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow; - - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow; - - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow; - - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow; - - /* Render First Pass */ - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - baseTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &baseTexture.info ); - - grFogMode( GR_FOG_ADD2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - /* Render Second Pass */ - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_PREFOG_COLOR, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - grTexSource( GR_TMU0, - lightTextureAddr, - GR_MIPMAPLEVELMASK_BOTH, - &lightTexture.info ); - - grFogMode( GR_FOG_MULT2 | GR_FOG_WITH_TABLE ); - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/test23.c b/glide2x/sst1/glide/tests/test23.c deleted file mode 100644 index 986c4c2..0000000 --- a/glide2x/sst1/glide/tests/test23.c +++ /dev/null @@ -1,260 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test23"; -static const char purpose[] = "anti-aliased points test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - int speed; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .8f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - speed = 0; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "s - toggles speed of rotation\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - if ( speed ) { - angle += 1.0f; - } else { - angle += 0.05f; - } - if ( angle >= 360.0f ) angle -= 360.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.5f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL POINTS \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED POINTS \r" ); - break; - } - - for( i = 0; i < 100; i++ ) { - vtxA.x = tlScaleX( prjVerts[i].x ); - vtxA.y = tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawPoint( &vtxA ); - break; - case ANTIALIASED: - grAADrawPoint( &vtxA ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - case 's': - case 'S': - speed = !speed; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/sst1/glide/tests/test24.c b/glide2x/sst1/glide/tests/test24.c deleted file mode 100644 index 69d7ae1..0000000 --- a/glide2x/sst1/glide/tests/test24.c +++ /dev/null @@ -1,255 +0,0 @@ - /* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test24"; -static const char purpose[] = "anti-aliased lines test"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -typedef enum { NORMAL, ANTIALIASED } Mode; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - Mode mode; - - int i; - static TlVertex3D srcVerts[100]; - float angle; - - GrFog_t fogtable[GR_FOG_TABLE_SIZE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - flat shading - alpha blending */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - grFogMode( GR_FOG_WITH_TABLE ); - grFogColorValue( 0x0 ); - guFogGenerateExp( fogtable, .9f ); - grFogTable( fogtable ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ZERO, GR_BLEND_ZERO ); - - /* Initialize Source 3D data - One Hundred Random Points within - a 1x1 box */ - for( i = 0; i < 100; i++ ) { - srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f; - srcVerts[i].w = 1.0f; - } - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - - angle = 0.0f; - mode = ANTIALIASED; - - tlConOutput( "a - toggles anti-aliasing\n" ); - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB; - static TlVertex3D xfVerts[100]; - static TlVertex3D prjVerts[100]; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST ); - - /* 3D Transformations */ - angle += 1.0f; - if ( angle > 359.0f ) angle = 0.0f; - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlYRotation( angle ) ); - tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) ); - - tlTransformVertices( xfVerts, srcVerts, 100 ); - tlProjectVertices( prjVerts, xfVerts, 100 ); - - grConstantColorValue( 0xffffffff ); - - switch( mode ) { - case NORMAL: - tlConOutput( "NORMAL LINES \r" ); - break; - case ANTIALIASED: - tlConOutput( "ANTIALIASED LINES \r" ); - break; - } - -#define SNAP_BIAS ((float)(3<<18)) - - for( i = 0; i < 100; i+=2 ) { - vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x ); - vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y ); - vtxA.oow = 1.0f / prjVerts[i].w; - vtxA.a = 255.0f; - vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x ); - vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ); - vtxB.oow = 1.0f / prjVerts[i+1].w; - vtxB.a = 255.0f; - switch( mode ) { - case NORMAL: - grDrawLine( &vtxA, &vtxB ); - break; - case ANTIALIASED: - grAADrawLine( &vtxA, &vtxB ); - break; - } - } - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - case 'a': - case 'A': - mode++; - mode%=2; - break; - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - - diff --git a/glide2x/sst1/glide/tests/test25.c b/glide2x/sst1/glide/tests/test25.c deleted file mode 100644 index eb61186..0000000 --- a/glide2x/sst1/glide/tests/test25.c +++ /dev/null @@ -1,897 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** - */ - -#include -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -#define SNAP_COORD(v) ( ( v ) = (( float )( ( long )( ( v ) * 16 ) )) / 16.0f ) - -#define WREFWIDTH 640.f -#define WREFHEIGHT 480.f - -#define WINSCALEX(x) ((x/WREFWIDTH) * wWidth) -#define WINSCALEY(y) ((y/WREFHEIGHT) * wHeight) - -#ifndef M_PI -#define M_PI 3.14159265358979323846f -#endif -#define DEG2RAD( x ) ( (x) * M_PI / 180.0f ) - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test25"; -static const char purpose[] = "anti-aliased triangle test"; -static const char usage[] = "-n -r -b -t -aalphavalue"; - - -static void doHelp( void ) { - grBufferClear( 0, 0, 0 ); - tlConOutput("Keymap:\n"); - tlConOutput(" A or a: toggle Antialiasing\n"); - tlConOutput(" C or c: toggle Compositing\n"); - tlConOutput(" B or b: toggle Bilinear\n"); - tlConOutput(" F or f: toggle Front buffer \n"); - tlConOutput(" H, h, or ?: Help\n"); - tlConOutput(" I or i: toggle background Image\n"); - tlConOutput(" L or l: Draw lines\n"); - tlConOutput(" N or n: print performance Numbers\n"); - tlConOutput(" P or p: Pause rendering\n"); - tlConOutput(" R or r: Print screen Resolution\n"); - tlConOutput(" Q or q or esc: Quit\n"); - tlConOutput(" S or s: toggle hidden Surface removal (backface culling)\n"); - tlConOutput(" T or t: toggle Texturing\n"); - tlConOutput(" U or u: toggle shameless Plug\n"); - tlConOutput(" V or v: toggle VGA/Voodoo\n"); - tlConOutput("Press a key to continue...\n"); - tlConRender(); - grBufferSwap( 1 ); - tlGetCH(); - tlConClear(); -} - -typedef float Matrix[4][4]; -typedef float Point[3]; - -void MatMakeXRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c; m[1][2] = s; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = -s; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeYRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeZRot( Matrix m, float radians ) -{ - float c = (float)cos( radians ); - float s = (float)sin( radians ); - - m[0][0] = c; m[0][1] = s; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = -s; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; -} - -void MatMakeIdent( Matrix m ) -{ - int i, j; - - for( i = 0; i < 4; i++ ) - { - for( j = 0; j < 4; j++ ) - { - if( i == j ) - m[i][j] = 1.0f; - else - m[i][j] = 0.0f; - } - } -} - -void PointMatMult( GrVertex *result, GrVertex *v, Matrix m ) -{ - float w; - GrVertex ptmp; - - ptmp = *v; - ptmp.x = ( v->x * m[0][0] ) + ( v->y * m[1][0] ) + - ( v->z * m[2][0] ) + m[3][0]; - ptmp.y = ( v->x * m[0][1] ) + ( v->y * m[1][1] ) + - ( v->z * m[2][1] ) + m[3][1]; - ptmp.z = ( v->x * m[0][2] ) + ( v->y * m[1][2] ) + - ( v->z * m[2][2] ) + m[3][2]; - w = ( v->x * m[0][3] ) + ( v->y * m[1][3] ) + - ( v->z * m[2][3] ) + m[3][3]; - if( w != 0.0f ) { ptmp.x /= w; ptmp.y /= w; ptmp.z /= w; } - *result = ptmp; -} - -static int screenFulls[] = { - 320*200, - 320*240, - 400*256, - 512*384, - 640*200, - 640*350, - 640*400, - 640*480, - 800*600, - 960*720, - 856*480 -}; - -#define NTRIS 1 -#define NFRAMES 20 -#define NVERTS 3 - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - float - minColor = 10.f, /* Vertex min color */ - maxColor = 245.f; /* Vertex max color */ - - GrVertex - localVerts[3], /* Vertices in world coordinates */ - texVerts[4]; /* Texture vertices for background */ - - float - alpha = 192.0f, /* Alpha for blending tringle over background */ - y_angle = 0.0f; /* rotation amount */ - - int - firstTime; /* Used for performance calculations */ - - GrPassthruMode_t - passthruMode = GR_PASSTHRU_SHOW_SST1; /* For toggling passthru */ - - FxBool - plugging = FXFALSE, /* Show shameless plug */ - printPerf = FXFALSE, /* Print performance numbers */ - lines = FXFALSE, /* Draw lines instead of triangles */ - blend = FXFALSE, /* Blend the triangle over the background */ - texturing = FXFALSE, /* Texture the tiangle */ - antialias = FXTRUE, /* Antialias the triangle? */ - bilinear = FXTRUE, /* Perform bilinear filtering on the texture? */ - render = FXTRUE, /* Draw? */ - backbuffer = FXTRUE, /* Draw to backbuffer? */ - background = FXTRUE; /* Draw background? */ - - GrOriginLocation_t - origin = GR_ORIGIN_LOWER_LEFT; /* Origin */ - - FxU32 - swapDelay = 1, /* Arg to grBufferSwap */ - trisDrawn, /* # triangles drawn */ - trisProcessed, /* # triangles through pipeline */ - lastFrame, /* Number of last frame we did perf stats */ - frameNum = 0L; /* id of each frame drawn */ - - GrCullMode_t - cullMode = GR_CULL_DISABLE; /* backface culling */ - - - GrMipMapId_t - triDecal, /* Triangle decal texture */ - bgDecal; /* Background decal texture */ - - Gu3dfInfo - bgInfo, /* Info on background texture */ - triInfo; /* Info on triangle texture */ - - GrColorCombineFnc_t - ccFnc = GR_COLORCOMBINE_ITRGB; /* Start of w/ Gouraud shading */ - - char - *bgFileName = NULL, /* Name of background texture file */ - *triFileName = NULL; /* Name of triangle texture file */ - - int - frameCount = 0; - - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nrbtea", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'b': - bgFileName = strdup( remArgs[0] ); - break; - case 't': - triFileName = strdup( remArgs[0] ); - break; - case 'a': - alpha = (float)atof( remArgs[0] ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - origin, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 80, 40, 0xffffff ); - - if(frames == -1) { - doHelp(); - } - - localVerts[0].x = 0.f; - localVerts[0].y = 0.75f; - localVerts[0].z = 0.0f; - localVerts[0].tmuvtx[0].sow = 255.f; - localVerts[0].tmuvtx[0].tow = 255.f; - localVerts[0].oow = 1.f; - localVerts[0].r = maxColor; - localVerts[0].g = minColor; - localVerts[0].b = minColor; - localVerts[0].a = 255.f; - - localVerts[1].x = -0.75f; - localVerts[1].y = -0.75f; - localVerts[1].z = 0.0f; - localVerts[1].tmuvtx[0].sow = 0.f; - localVerts[1].tmuvtx[0].tow = 255.f; - localVerts[1].oow = 1.f; - localVerts[1].r = minColor; - localVerts[1].g = maxColor; - localVerts[1].b = minColor; - localVerts[1].a = 255.f; - - localVerts[2].x = 0.75f; - localVerts[2].y = -0.75f; - localVerts[2].z = 0.0f; - localVerts[2].tmuvtx[0].sow = 255.f; - localVerts[2].tmuvtx[0].tow = 0.f; - localVerts[2].oow = 1.f; - localVerts[2].r = minColor; - localVerts[2].g = minColor; - localVerts[2].b = maxColor; - localVerts[2].a = 255.f; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - texVerts[0].a = 255.f; - texVerts[0].oow = 1.f; - texVerts[0].tmuvtx[0].sow = 0.f * texVerts[0].oow; - texVerts[0].tmuvtx[0].tow = 255.f * texVerts[0].oow; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - texVerts[1].a = 255.f; - texVerts[1].oow = 1.f; - texVerts[1].tmuvtx[0].sow = 255.f * texVerts[1].oow; - texVerts[1].tmuvtx[0].tow = 255.f * texVerts[1].oow; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - texVerts[2].a = 255.f; - texVerts[2].oow = 1.f; - texVerts[2].tmuvtx[0].sow = 255.f * texVerts[2].oow; - texVerts[2].tmuvtx[0].tow = 0.f * texVerts[2].oow; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - texVerts[3].a = 255.f; - texVerts[3].oow = 1.f; - texVerts[3].tmuvtx[0].sow = 0.f * texVerts[3].oow; - texVerts[3].tmuvtx[0].tow = 0.f * texVerts[3].oow; - - if (bgFileName == NULL) - bgFileName = "miro.3df"; - if (triFileName == NULL) - triFileName = "matt1.3df"; - - /* Read in background texture file */ - if ( gu3dfGetInfo( bgFileName, &bgInfo ) ) { - bgInfo.data = malloc( bgInfo.mem_required ); - - if ( bgInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( bgFileName, &bgInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - bgDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - bgInfo.header.width, bgInfo.header.height, - bgInfo.header.format, - GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( bgDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for texture file %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( bgDecal, bgInfo.data, &bgInfo.table.nccTable ); - free( bgInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", bgFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( gu3dfGetInfo( triFileName, &triInfo ) ) { - triInfo.data = malloc( triInfo.mem_required ); - - if ( triInfo.data == 0 ) { - fprintf( stderr, "out of memory for texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - if ( !gu3dfLoad( triFileName, &triInfo ) ) { - fprintf( stderr, "could not load texture file %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - triDecal = guTexAllocateMemory( 0, GR_MIPMAPLEVELMASK_BOTH, - triInfo.header.width, - triInfo.header.height, - triInfo.header.format, - GR_MIPMAP_NEAREST, - triInfo.header.small_lod, - triInfo.header.large_lod, - triInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, - GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR, - 0.0F, - FXFALSE ); - if ( triDecal == GR_NULL_MIPMAP_HANDLE ) { - fprintf( stderr, "could not allocate memory for %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - guTexDownloadMipMap( triDecal, triInfo.data, &triInfo.table.nccTable ); - free( triInfo.data ); - } else { - fprintf( stderr, "could not get info on %s\n", triFileName ); - grGlideShutdown(); - exit( -1 ); - } - - grTexCombineFunction(GR_TMU0, GR_TEXTURECOMBINE_DECAL); - grRenderBuffer(backbuffer == FXTRUE ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER); - - /* Set up alpha blending for AA and compositing... */ - guAlphaSource( GR_ALPHASOURCE_ITERATED_ALPHA ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, - GR_BLEND_ONE_MINUS_SRC_ALPHA, GR_BLEND_ONE, - GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - - - while ( 1 ) { - Matrix rotm; - GrVertex xformedVerts[4]; - int i; - - - MatMakeYRot( rotm, DEG2RAD( y_angle ) ); - - if (resolution == GR_RESOLUTION_NONE) - tlGetResolutionConstant("0", - &scrWidth, - &scrHeight ); - - - for( i = 0; i < 4; i++ ) { - PointMatMult( &xformedVerts[i], &localVerts[i], rotm ); - xformedVerts[i].x = xformedVerts[i].x / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].y = xformedVerts[i].y / ( xformedVerts[i].z + 2.0f ); - xformedVerts[i].x *= scrWidth / 2.0f; - xformedVerts[i].y *= scrHeight / 2.0f; - xformedVerts[i].x += scrWidth / 2.0f; - xformedVerts[i].y += scrHeight / 2.0f; - xformedVerts[i].oow = 1.f / ((xformedVerts[i].z + 2) * scrHeight); - xformedVerts[i].tmuvtx[0].sow *= xformedVerts[i].oow; - xformedVerts[i].tmuvtx[0].tow *= xformedVerts[i].oow; - SNAP_COORD( xformedVerts[i].x ); - SNAP_COORD( xformedVerts[i].y ); - } - - guColorCombineFunction( ccFnc ); - - /* grLfbBypassMode(GR_LFBBYPASS_ENABLE); */ - - if (render == FXTRUE) { - ++frameNum; - if ((frameNum % NFRAMES) == 0) { - if (printPerf) { - if (!firstTime) { - GrSstPerfStats_t - pStats; - FxU32 - lfbWritePixels, - nFrames = frameNum - lastFrame, - fillPixels = nFrames * screenFulls[resolution], - totFail; - - lastFrame = frameNum; - - grSstPerfStats(&pStats); - grTriStats(&trisProcessed, &trisDrawn); - - totFail = pStats.chromaFail + pStats.zFuncFail + - pStats.aFuncFail; - - lfbWritePixels = pStats.pixelsOut - pStats.pixelsIn - fillPixels; - - tlConOutput("In the last %d frames:\n", nFrames); - tlConOutput(" Pixels Processed: %d\n", - pStats.pixelsIn); - tlConOutput(" Chroma Failures: %d\n", - pStats.chromaFail); - tlConOutput(" Z Compare Failures: %d\n", - pStats.zFuncFail); - tlConOutput(" Alpha Compare Failures: %d\n", - pStats.aFuncFail); - tlConOutput(" Fast Fill Pixels: %d\n", - fillPixels); - tlConOutput(" LFB Write Pixels: %d\n", - lfbWritePixels); - tlConOutput(" Total Pixels Drawn: %d\n", - pStats.pixelsOut); - tlConOutput(" Triangles Processed %d\n", - trisProcessed); - tlConOutput(" Triangles Drawn %d\n", - trisDrawn); - - if ( - (pStats.pixelsOut - lfbWritePixels - fillPixels - pStats.pixelsIn) != totFail) - tlConOutput("Error: %d != %d\n", - pStats.pixelsOut - lfbWritePixels - fillPixels, - totFail); - - grSstResetPerfStats(); - } else { - lastFrame = frameNum; - grSstResetPerfStats(); - firstTime = 0; - } - } - } - grBufferClear( 0xffffffff, 0, GR_WDEPTHVALUE_FARTHEST ); - - if (background == FXTRUE) { - GrState - oldState; - - texVerts[0].x = 0.f; - texVerts[0].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[1].x = scrWidth; - texVerts[1].y = 0.f; - - texVerts[2].x = scrWidth; - texVerts[2].y = scrHeight; - - texVerts[3].x = 0.f; - texVerts[3].y = scrHeight; - - grGlideGetState(&oldState); - - grAlphaBlendFunction( - GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - - grColorCombine( - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, FXFALSE - ); - - guTexSource(bgDecal); - - for (i = 0; i < NTRIS; i++) { - grDrawTriangle(&texVerts[0], &texVerts[1], &texVerts[2]); - grDrawTriangle(&texVerts[2], &texVerts[3], &texVerts[0]); - } - grGlideSetState(&oldState); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - } - - if (texturing == FXTRUE) - guTexSource(bgDecal); - - if (texturing) - guTexSource(triDecal); - - if (antialias == FXTRUE) { - if (lines == FXTRUE) { - grAADrawLine(&xformedVerts[0], &xformedVerts[1]); - grAADrawLine(&xformedVerts[1], &xformedVerts[2]); - grAADrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grAADrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2], FXTRUE, FXTRUE, FXTRUE - ); - } - } else { - if (lines == FXTRUE) { - grDrawLine(&xformedVerts[0], &xformedVerts[1]); - grDrawLine(&xformedVerts[1], &xformedVerts[2]); - grDrawLine(&xformedVerts[2], &xformedVerts[0]); - } else { - grDrawTriangle( - &xformedVerts[0], &xformedVerts[1], - &xformedVerts[2] - ); - } - } - - if (plugging) - grSplash(0.f, 0.f, scrWidth / 5.f, scrHeight / 5.f, frameNum); - - if (backbuffer) { - tlConRender(); - grBufferSwap( swapDelay ); - } - } - - if (tlKbHit()) { - char c = (char) tlGetCH(); - - switch (c) { - case 'a': - case 'A': - if (antialias == FXFALSE) { - tlConOutput("Turning ON Antialiasing\n"); - antialias = FXTRUE; - } else { - tlConOutput("Turning OFF Antialiasing\n"); - antialias = FXFALSE; - } - break; - case 'B': - case 'b': - if (bilinear == FXFALSE) { - bilinear = FXTRUE; - tlConOutput("Turning ON BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR); - } else { - bilinear = FXFALSE; - tlConOutput("Turning OFF BiLinear blending\n"); - guTexChangeAttributes( - triDecal, bgInfo.header.width, - bgInfo.header.height, - bgInfo.header.format, GR_MIPMAP_NEAREST, - bgInfo.header.small_lod, - bgInfo.header.large_lod, - bgInfo.header.aspect_ratio, - GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED); - } - break; - - case 'c': - case 'C': - if (blend == FXTRUE) { - blend = FXFALSE; - localVerts[0].a = 255.0f; - localVerts[1].a = 255.0f; - localVerts[2].a = 255.0f; - localVerts[3].a = 255.0f; - } else { - blend = FXTRUE; - localVerts[0].a = alpha; - localVerts[1].a = alpha; - localVerts[2].a = alpha; - localVerts[3].a = alpha; - } - break; - - case 'd': - case 'D': - tlConOutput("vtxa = (%.2f, %.2f), vtxb = (%.2f, %.2f), vtxc = (%.2f, %.2f)\n", - xformedVerts[0].x, xformedVerts[0].y, - xformedVerts[1].x, xformedVerts[1].y, - xformedVerts[2].x, xformedVerts[2].y - ); - break; - - case 'f': - case 'F': - if (backbuffer == FXTRUE) { - backbuffer = FXFALSE; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } else { - backbuffer = FXTRUE; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - break; - - case 'g': - case 'G': -#if 0 - grLfbBegin(); - - grLfbWriteMode(GR_LFBWRITEMODE_565); - grLfbOrigin(GR_ORIGIN_UPPER_LEFT); - grLfbGetReadPtr(GR_BUFFER_FRONTBUFFER); - tlConOutput("Press a key to get front buffer\n"); - while (!tlKbHit()); - c = (char) tlGetCH(); - guFbReadRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - tlConOutput("Press a key to put image in back buffer and swap\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbGetWritePtr(GR_BUFFER_BACKBUFFER); - guFbWriteRegion(0,0,(int)wWidth,(int)scrHeight,scrnImage,(int)wWidth * sizeof(FxU16)); - grBufferSwap(swapDelay); - - tlConOutput("Press a key to continue...\n"); - while (!tlKbHit()); - tlGetCH(); - - grLfbEnd(); -#endif - break; - - case 'h': - case 'H': - case '?': - doHelp(); - break; - - case 'i': - case 'I': - if (background == FXTRUE) { - background = FXFALSE; - tlConOutput("Turning off background\n"); - } else { - tlConOutput("Turning on background\n"); - background = FXTRUE; - } - break; - - case 'l': - case 'L': - if (lines == FXTRUE) { - lines = FXFALSE; - tlConOutput("Turning OFF lines\n"); - } else { - lines = FXTRUE; - tlConOutput("Turning ON lines\n"); - } - break; - case 'm': - case 'M': - ccFnc = GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB; - break; - - case 'n': - case 'N': - if (printPerf == FXFALSE) { - printPerf = FXTRUE; - firstTime = 1; - grSstResetPerfStats(); - grResetTriStats(); - } else { - printPerf= FXFALSE; - } - break; - - case 'o': - case 'O': - if (origin == GR_ORIGIN_LOWER_LEFT) - origin = GR_ORIGIN_UPPER_LEFT; - else - origin = GR_ORIGIN_LOWER_LEFT; - - grSstOrigin(origin); - break; - - case 'p': - case 'P': - if (render == FXTRUE) - render = FXFALSE; - else - render = FXTRUE; - break; - - case 'q': - case 'Q': - case 27: - grGlideShutdown(); - exit(0); - break; - - case 'r': - case 'R': - tlConOutput("Screen Resolution is %s\n", tlGetResolutionString( resolution ) ); - break; - - case 'S': - case 's': - if (cullMode == GR_CULL_DISABLE) { - cullMode = GR_CULL_NEGATIVE; - tlConOutput("Turning ON backface culling (hidden Surface removal)\n"); - } else { - cullMode = GR_CULL_DISABLE; - tlConOutput("Turning OFF backface culling (hidden Surface removal)\n"); - } - grCullMode(cullMode); - break; - case 'T': - case 't': - if (texturing == FXFALSE) { - tlConOutput("Turning ON texturing\n"); - ccFnc = GR_COLORCOMBINE_DECAL_TEXTURE; - texturing = FXTRUE; - } else { - tlConOutput("Turning OFF texturing\n"); - ccFnc = GR_COLORCOMBINE_ITRGB; - texturing = FXFALSE; - } - break; - case 'u': - case 'U': - if (plugging == FXTRUE) - plugging = FXFALSE; - else - plugging = FXTRUE; - - grGlideShamelessPlug(plugging); - break; - - case 'v': - case 'V': - if (passthruMode == GR_PASSTHRU_SHOW_VGA) { - passthruMode = GR_PASSTHRU_SHOW_SST1; - tlConOutput("Changing Passthru to show Voodoo\n"); - } - else { - passthruMode = GR_PASSTHRU_SHOW_VGA; - tlConOutput("Changing Passthru to show VGA\n"); - } - /* grSstPassthruMode(passthruMode); */ - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - { - char str[256]; - swapDelay = (int) c - 0x30; - sprintf(str, "Swapdelay = %d\n", swapDelay); - tlConOutput(str); - } - break; - } - } - - if (render) { - y_angle += 2.f; - if( y_angle > 360.0f ) - y_angle -= 360.0f; - } - frameCount++; - if(frameCount < 0) - frameCount = 0; - if(frames == frameCount) - break; - } - grGlideShutdown(); -} diff --git a/glide2x/sst1/glide/tests/test26.c b/glide2x/sst1/glide/tests/test26.c deleted file mode 100644 index c96fbef..0000000 --- a/glide2x/sst1/glide/tests/test26.c +++ /dev/null @@ -1,375 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test26"; -static const char purpose[] = "tests grLfbWriteRegion, and grLfbReadRegion"; -static const char usage[] = "-b <# color buffers> -d <# aux buffers> -n -r "; - -static const char *renderBufferString[] = { - "GR_BUFFER_FRONTBUFFER", - "GR_BUFFER_BACKBUFFER " -}; - -static const char *sourceFormatString[] = { - "GR_LFB_SRC_FMT_565 ", - "GR_LFB_SRC_FMT_555 ", - "GR_LFB_SRC_FMT_1555 ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_888 ", - "GR_LFB_SRC_FMT_8888 ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "INVALID FORMAT ", - "GR_LFB_SRC_FMT_565_DEPTH ", - "GR_LFB_SRC_FMT_555_DEPTH ", - "GR_LFB_SRC_FMT_1555_DEPTH", - "GR_LFB_SRC_FMT_ZA16 " -}; - - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int bufCount = 2; - int auxBuf = 1; - - TlTexture texture; - void *image; - void *readImage; - FxU32 bpp; - - GrLfbSrcFmt_t sourceFormat; - - static FxU32 imageWidth; - static FxU32 imageHeight; - - static void imageConvert( void *dst, - void *src, - GrLfbSrcFmt_t format, - FxU32 *bpp ); - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "bdnr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'b': - bufCount = atoi(remArgs[0]); - if (bufCount < 2) bufCount = 2; - if (bufCount > 3) bufCount = 3; - break; - - case 'd': - auxBuf = atoi(remArgs[0]); - if (auxBuf > 1) auxBuf = 1; - if (auxBuf < 0) auxBuf = 0; - break; - - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - bufCount, auxBuf ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - disable dithering */ - grDitherMode( GR_DITHER_DISABLE ); - - /* Load image from disk */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - - imageWidth = 256; - imageHeight = 256; - image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - readImage = calloc( imageWidth * imageHeight, sizeof( FxU32 ) ); - - if ( ( imageWidth > (FxU32)scrWidth ) || - ( imageHeight > (FxU32)scrHeight ) ) { - char errMsg[1024]; - sprintf(errMsg, - "imgWidth: %d, imgHeight: %d\nscrWidth: %d, scrHeight: %d\n", - (int) imageWidth, (int) imageHeight, - (int) scrWidth, (int) scrHeight); - - tlErrorMessage(errMsg); - return; - } - - sourceFormat = GR_LFB_SRC_FMT_565; - - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - - while( frames-- ) { - static int x = 0, y = 0; - - if (!tlOkToRender()) - continue; - - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - grBufferClear( 0x00303030, 0, 0 ); - - - if ( ( imageWidth < (FxU32)tlScaleX(1.0f) ) && - ( imageHeight < (FxU32)tlScaleY(1.0f) ) && - grLfbWriteRegion( GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, 256*bpp, image ) ) { - tlConClear(); - tlConOutput( "Width - %d\n", imageWidth); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - " any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - - if ( sourceFormat == GR_LFB_SRC_FMT_565 ) { - memcpy(readImage, image, 256 * 256 * sizeof(FxU16)); - grLfbReadRegion( GR_BUFFER_BACKBUFFER, - x, y, imageWidth, imageHeight, - 256 * 2, readImage ); - if ( memcmp( image, readImage, 256*256*2 ) ) { - FILE* bufFile = fopen("fuckme.txt", "w"); - - if (bufFile != NULL) { - int i, j; - const FxU16* imagePtr = (const FxU16*)image; - const FxU16* readPtr = (const FxU16*)readImage; - - for(i = 0; i < 256; i++) { - for(j = 0; j < 256; j++) { - if (imagePtr[i * 256 + j] != readPtr[i * 256 + j]) { - fprintf(bufFile, "(0x%X 0x%X) : 0x%hX : 0x%hX\n", - j, i, imagePtr[i * 256 + j], readPtr[i * 256 + j]); - } - } - } - fclose(bufFile); - } - - grBufferSwap(1); - grBufferSwap(1); - - tlConOutput( "Failed Readback Test\n" ); - - grBufferClear(0x00303030, 0, 0); - grLfbWriteRegion(GR_BUFFER_BACKBUFFER, - x, y, sourceFormat, - imageWidth, imageHeight, - 256 * bpp, readImage); - - grBufferSwap(1); - grBufferSwap(1); - } else { - tlConOutput( "Passed Readback Test\n" ); - } - } - } else { - tlConClear(); - tlConOutput( "1 - lfb source format (%s)\n" - "+/- - change width of source image copied\n" - "any other key to quit\n\n", - sourceFormatString[sourceFormat] ); - tlConOutput( "grLfbWriteRegion Failed\n" ); - } - - x++; - if ( x + 256 >= (int)tlScaleX(1.0f) ) { - x = 0; y++; - } - if ( y + 256 >= (int)tlScaleY(1.0f) ) { - y = 0; - } - - tlConRender(); - grBufferSwap( 1 ); - while( tlKbHit() ) { - switch( tlGetCH() ) { - case '1': - sourceFormat++; - if ( sourceFormat > GR_LFB_SRC_FMT_ZA16 ) - sourceFormat = GR_LFB_SRC_FMT_565; - imageConvert( image, texture.info.data, sourceFormat, &bpp ); - break; - case '+': - if ( imageWidth < 256 ) imageWidth++; - break; - case '-': - if ( imageWidth > 0 ) imageWidth--; - break; - default: - frames = 0; - break; - } - - imageHeight = imageWidth; - } - } - - grGlideShutdown(); - return; -} - - -static void imageConvert( void *dst, void *src, - GrLfbSrcFmt_t format, FxU32 *bpp ) { - FxU32 x, y; - FxU32 *longData = dst; - FxU16 *shortData = dst; - FxU16 *srcData = src; - FxU32 longStride = 256; - FxU32 shortStride = 256; - FxU32 longColor; - FxU16 shortColor; - - switch( format ) { - case GR_LFB_SRC_FMT_565: - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - *bpp = 2; - break; - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - case GR_LFB_SRC_FMT_565_DEPTH: - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - *bpp = 4; - break; - } - - for( y = 0; y < 256; y++ ) { - for( x = 0; x < 256; x++ ) { - switch( format ) { - case GR_LFB_SRC_FMT_565: - shortData[y*shortStride+x] = srcData[y*256+x]; - break; - - case GR_LFB_SRC_FMT_555: - case GR_LFB_SRC_FMT_1555: - shortColor = srcData[y*256+x]; - shortColor = ((0x8000) | // Alpha == 1 - ((shortColor >> 1) & 0x7C00) | - ((shortColor >> 1) & 0x03E0) | - ((shortColor) & 0x1f)); - shortData[y*shortStride+x] = shortColor; - break; - - case GR_LFB_SRC_FMT_888: - case GR_LFB_SRC_FMT_8888: - longColor = srcData[y*256+x]; - longColor = ((0xFF000000) | - ((longColor<<8)&0x00F80000) | - ((longColor<<5)&0x0000FC00) | - ((longColor<<3)&0x000000F8)); - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_565_DEPTH: - longColor = srcData[y*256+x]; - longData[y*longStride+x] = longColor; - break; - - case GR_LFB_SRC_FMT_1555_DEPTH: - case GR_LFB_SRC_FMT_555_DEPTH: - longColor = srcData[y*256+x]; - longColor = ((0x00008000) | - ((longColor>>1) & 0x00007C00) | - ((longColor>>1) & 0x000003E0) | - ((longColor ) & 0x0000001f)); - longData[y*longStride+x] = longColor; - break; - - default: - break; - } - } - } -} - - - diff --git a/glide2x/sst1/glide/tests/test27.c b/glide2x/sst1/glide/tests/test27.c deleted file mode 100644 index 7267962..0000000 --- a/glide2x/sst1/glide/tests/test27.c +++ /dev/null @@ -1,203 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test27"; -static const char purpose[] = "Cycle the 3D hardware on and off"; -static const char usage[] = "-n -r "; - -static int rRandom(int s, int e); -static unsigned int iRandom (unsigned int maxr); - -#define SNAP_BIAS ((float)(3<<18)) - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - int doNothing = 0; - - int cycles; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "Nnr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - case 'N': - doNothing = 1; - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - - - cycles = 0; - while( frames-- && tlOkToRender()) { - GrVertex a, b, c; - char inchar; - - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, - 1 ) ); - - /* - * Don't like gotos? In the immortal words of Schwarzenegger - * (Total Recall): "...so sue me d**khead" - */ - if (doNothing) goto doNothing; - - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - - /* deal with dynamic resizing */ - if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) { - tlGetDimsByConst(resolution, &scrWidth, &scrHeight); - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - } - - tlConOutput( "Press to cycle hardware\n" ); - tlConOutput( "Any other key to quit\n" ); - - grBufferClear( 0x000000, 0, GR_WDEPTHVALUE_FARTHEST ); - - a.r = a.g = a.b = 0.0f; - b = c = a; - - a.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - a.r = 255.0f; - - b.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - b.g = 255.0f; - - c.x = tlScaleX(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.y = tlScaleY(((float)rRandom( 0, 100 ))/100.0f) + SNAP_BIAS; - c.b = 255.0f; - - grDrawTriangle( &a, &b, &c ); - - tlConOutput( "Cycle: %d\r", cycles ); - tlConRender(); - grBufferSwap( 1 ); - -doNothing: - inchar = tlGetCH(); - if ( inchar != ' ' ) frames = 0; - - grSstWinClose(); - cycles++; - } - - grGlideShutdown(); - return; -} - -static unsigned long randx = 1; - -static unsigned int iRandom (unsigned int maxr) -{ - unsigned int n,retval; - - if (maxr > 0xFFFFFFF) { - do { - retval = iRandom(0xFFFFFFF); - retval |= iRandom(maxr>>28)<<28; - } while (retval > maxr); - return retval; - } - for (n=1; n<32; n++) - if (((unsigned)1 << n) > maxr) break; - do { - randx = randx*1103515245 + 12345; - retval = (randx & 0x7fffffff) >> (31-n); - } while (retval > maxr); - return retval; -} - -static int rRandom(int s, int e) -{ - return s + iRandom(e-s); -} - - - diff --git a/glide2x/sst1/glide/tests/test28.c b/glide2x/sst1/glide/tests/test28.c deleted file mode 100644 index 7abc0cb..0000000 --- a/glide2x/sst1/glide/tests/test28.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -*/ - -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - -#include -#include - -#define PI 3.141592653589793 -#define RAD_TO_DEG(t) ((t) * 180.0 / PI) -#define DEG_TO_RAD(t) ((t) * PI / 180.0) - -typedef struct _RGB { - float r, g, b; -} RGB, *RGBPtr; - - -#define FUDGE(x) ((x) * 255.0f) -#define PHASE(x, y, m) (((x) + (y)) % (m)) - -static float -value(float n1, float n2, float hue) -{ - float retval; - - if (hue > 360.0f) hue -= 360.0f; - if (hue < 0.0f) hue += 360.0f; - - if (hue < 60.0f) { - retval = n1 + (n2 - n1) * hue / 60.0f; - } else if (hue < 180.0f) { - retval = n2; - } else if (hue < 240.0f) { - retval = n1 + (n2 - 1.0f) * (240.0f - hue) / 60.0f; - } else { - retval = n1; - } -// assert((retval >= 0.0f) && (retval <= 1.0f)); - if (retval < 0.0f) retval = 0.0f; - if (retval > 1.0f) retval = 1.0f; - return FUDGE(retval); -} - -static void -hlsToRGB(float h, float l, float s, RGBPtr color) -{ - float p1, p2; - - p2 = (l <= 0.5f) ? l * (1.0f + s) : l + s - l * s; - p1 = 2 * l - p2; - - if (s == 0.0f) { - color->r = color->g = color->b = l; - } else { - color->r = value(p1, p2, h+120.0f); - color->g = value(p1, p2, h); - color->b = value(p1, p2, h-120.0f); - } - -} /* end hlsToRGB() */ - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test28"; -static const char purpose[] = "planar polygon test"; -static const char usage[] = "-n -r "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; -#define NVERT 5 - GrVertex vtx[NVERT]; - int index[NVERT]; - int frames = -1; - int i, idx; -#define NHUE 360 - RGB hues[NHUE]; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_UPPER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 1.0f, - 60, 30, 0xffffff ); - - /* Set up Render State - gouraud shading */ - grColorCombine( GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_LOCAL_ITERATED, - GR_COMBINE_OTHER_NONE, - FXFALSE ); - -// grRenderBuffer(GR_BUFFER_FRONTBUFFER); /* debug only */ - - tlConOutput( "Press a key to quit\n" ); - - /* init a table of hues */ - for (i=0; i -#include -#include -#ifndef __linux__ -#include -#endif -#include - -#include -#include "tlib.h" - - -GrHwConfiguration hwconfig; -static char version[80]; - -static const char name[] = "test29"; -static const char purpose[] = "oow diff hint"; -static const char usage[] = "-n -r "; - -void main( int argc, char **argv) { - char match; - char **remArgs; - int rv; - - GrScreenResolution_t resolution = GR_RESOLUTION_640x480; - float scrWidth = 640.0f; - float scrHeight = 480.0f; - int frames = -1; - - TlTexture texture; - TlVertex3D srcVerts[4]; - float distance, dDelta; - - /* Process Command Line Arguments */ - while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { - if ( rv == -1 ) { - printf( "Unrecognized command line argument\n" ); - printf( "%s %s\n", name, usage ); - printf( "Available resolutions:\n%s\n", - tlGetResolutionList() ); - return; - } - switch( match ) { - case 'n': - frames = atoi( remArgs[0] ); - break; - case 'r': - resolution = tlGetResolutionConstant( remArgs[0], - &scrWidth, - &scrHeight ); - break; - } - } - - tlSetScreen( scrWidth, scrHeight ); - - grGlideGetVersion( version ); - - printf( "%s:\n%s\n", name, purpose ); - printf( "%s\n", version ); - printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); - if ( frames == -1 ) { - printf( "Press A Key To Begin Test.\n" ); - tlGetCH(); - } - - /* Initialize Glide */ - grGlideInit(); - assert( grSstQueryHardware( &hwconfig ) ); - grSstSelect( 0 ); - assert( grSstWinOpen( 0, - resolution, - GR_REFRESH_60Hz, - GR_COLORFORMAT_ABGR, - GR_ORIGIN_LOWER_LEFT, - 2, 1 ) ); - - tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, - 60, 15, 0xffffff ); - - /* Set up Render State - Decal Texture - bilinear */ - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - - /* Load texture data into system ram */ - assert( tlLoadTexture( "decal1.3df", - &texture.info, - &texture.tableType, - &texture.tableData ) ); - /* Download texture data to TMU */ - grTexDownloadMipMap( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - if ( texture.tableType != NO_TABLE ) { - grTexDownloadTable( GR_TMU0, - texture.tableType, - &texture.tableData ); - } - - /* Select Texture As Source of all texturing operations */ - grTexSource( GR_TMU0, - grTexMinAddress( GR_TMU0 ), - GR_MIPMAPLEVELMASK_BOTH, - &texture.info ); - - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_NEAREST, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, FXFALSE ); - - /* enable oow depth buffering */ - grDepthBufferMode( GR_DEPTHBUFFER_WBUFFER ); - grDepthBufferFunction( GR_CMP_LESS ); - grDepthMask( FXTRUE ); - - /* Set hint to separate w for depth and tex */ - grHints( GR_HINT_STWHINT, GR_STWHINT_W_DIFF_TMU0 ); - /* oow for the texture coords will be set to one - in effect disabling perspective correction */ - - /* Initialize Source 3D data - Rectangle on X/Z Plane - Centered about Y Axis - - 0--1 Z+ - | | | - 2--3 - X+ - - */ - srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z = 0.5f, srcVerts[0].w = 1.0f; - srcVerts[1].x = 0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z = 0.5f, srcVerts[1].w = 1.0f; - srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f; - srcVerts[3].x = 0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f; - - srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f; - srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f; - srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f; - srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f; - -#define RED 0x000000ff -#define BLUE 0x00ff0000 - -#define MAX_DIST 2.5f -#define MIN_DIST 1.0f - - distance = 1.0f; - dDelta = 0.01f; - - tlConOutput( "Press any key to quit\n\n" ); - while( frames-- && tlOkToRender()) { - GrVertex vtxA, vtxB, vtxC, vtxD; - TlVertex3D xfVerts[4]; - TlVertex3D prjVerts[4]; - - tlGetDimsByConst(resolution, - &scrWidth, - &scrHeight ); - - grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); - - grBufferClear( 0x00404040, 0, GR_WDEPTHVALUE_FARTHEST ); - - - /*---- - A-B - |\| - C-D - -----*/ - vtxA.oow = 1.0f; - vtxB = vtxC = vtxD = vtxA; - - distance += dDelta; - if ( distance > MAX_DIST || - distance < MIN_DIST ) { - dDelta *= -1.0f; - distance += dDelta; - } - - tlSetMatrix( tlIdentity() ); - tlMultMatrix( tlXRotation( -20.0f ) ); - tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) ); - - tlTransformVertices( xfVerts, srcVerts, 4 ); - tlProjectVertices( prjVerts, xfVerts, 4 ); - - vtxA.x = tlScaleX( prjVerts[0].x ); - vtxA.y = tlScaleY( prjVerts[0].y ); - vtxA.oow = 1.0f / prjVerts[0].w; - - vtxB.x = tlScaleX( prjVerts[1].x ); - vtxB.y = tlScaleY( prjVerts[1].y ); - vtxB.oow = 1.0f / prjVerts[1].w; - - vtxC.x = tlScaleX( prjVerts[2].x ); - vtxC.y = tlScaleY( prjVerts[2].y ); - vtxC.oow = 1.0f / prjVerts[2].w; - - vtxD.x = tlScaleX( prjVerts[3].x ); - vtxD.y = tlScaleY( prjVerts[3].y ); - vtxD.oow = 1.0f / prjVerts[3].w; - - vtxA.tmuvtx[0].oow = 1.0f; - vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.tmuvtx[0].oow; - vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.tmuvtx[0].oow; - - vtxB.tmuvtx[0].oow = 1.0f; - vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.tmuvtx[0].oow; - vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.tmuvtx[0].oow; - - vtxC.tmuvtx[0].oow = 1.0f; - vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.tmuvtx[0].oow; - vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.tmuvtx[0].oow; - - vtxD.tmuvtx[0].oow = 1.0f; - vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.tmuvtx[0].oow; - vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.tmuvtx[0].oow; - - grDrawTriangle( &vtxA, &vtxB, &vtxD ); - grDrawTriangle( &vtxA, &vtxD, &vtxC ); - - tlConRender(); - grBufferSwap( 1 ); - grSstIdle(); - - while( tlKbHit() ) { - switch( tlGetCH() ) { - default: - frames = 0; - break; - } - } - } - - grGlideShutdown(); - return; -} - - - diff --git a/glide2x/sst1/glide/tests/testdesc.txt b/glide2x/sst1/glide/tests/testdesc.txt deleted file mode 100644 index 2bd5594..0000000 --- a/glide2x/sst1/glide/tests/testdesc.txt +++ /dev/null @@ -1,46 +0,0 @@ -************************************************* -TEST NAMES - -test00 - buffer clear -test01 - draw points -test02 - draw lines -test03 - gouraud lines -test04 - gouraud triangle -test05 - z buffer -test06 - w buffer -test07 - alpha blend -test08 - fog -test09 - chromakey -test10 - backface culling -test11 - lfb -test12 - lfb + renderbuffer + yorigin -test13 - iterated alpha -test14 - depth bias -test15 - clip rectangle -test16 - shameless plug and splash screen -test17 - decal texture - rgb lit texture - white lit texture -test18 - texture alpha -test19 - texture filters -test20 - mipmap modes ( nomip, mip, trilinear ) -test21 - texture compositing ( lightmap, detail, specular ) -test22 - multi-pass fog -test23 - anti-aliased points -test24 - anti-aliased lines -test25 - anti-aliased triangles -test26 - grLfbWriteRegion -test27 - cycle 3d hardware on and off, excersie open/close -test28 - planar polygon test -test29 - simple palette texture test -test30 - hints - separate texture, polygon oow -test32 - Mindlessly simple multiple board test - -qatest00 - Texture download, multibase, LOD downloads, Partial LODs -qatest01 - Alliance Buffer Swap bug - -Tests that should be done -* - anti-aliased polygons -* - clipped polygons -* - gratuitous c++ test -* - alpha test -* - alpha selects lighting -* - cockpit bit diff --git a/glide2x/sst1/glide/tests/testimg.bat b/glide2x/sst1/glide/tests/testimg.bat deleted file mode 100644 index 04431eb..0000000 --- a/glide2x/sst1/glide/tests/testimg.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -REM -REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is -REM \3dfx\devel\sst1\glide\images -REM -if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default - -goto Output - -:Default -set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images - -:Output -set tdir=%FX_GLIDE_TEST_DSTIMG% - -@echo on -test00 -d %tdir%\test00.tst -sleep 1 -test01 -d %tdir%\test01.tst -sleep 1 -test02 -d %tdir%\test02.tst -sleep 1 -test03 -d %tdir%\test03.tst -sleep 1 -test04 -d %tdir%\test04.tst -sleep 1 -test05 -d %tdir%\test05.tst -sleep 1 -test06 -d %tdir%\test06.tst -sleep 1 -test07 -d %tdir%\test07.tst -sleep 1 -test08 -d %tdir%\test08.tst -sleep 1 -test09 -d %tdir%\test09.tst -sleep 1 -test10 -d %tdir%\test10.tst -sleep 1 -test13 -d %tdir%\test13.tst -sleep 1 -test16 -d %tdir%\test16.tst -sleep 1 -test17 -d %tdir%\test17.tst -sleep 1 -test18 -d %tdir%\test18.tst -sleep 1 -test19 -d %tdir%\test19.tst -sleep 1 diff --git a/glide2x/sst1/glide/tests/tldata.inc b/glide2x/sst1/glide/tests/tldata.inc deleted file mode 100644 index c8682db..0000000 --- a/glide2x/sst1/glide/tests/tldata.inc +++ /dev/null @@ -1,69 +0,0 @@ - - -static unsigned char fontData[] = { -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - diff --git a/glide2x/sst1/glide/tests/tlib.c b/glide2x/sst1/glide/tests/tlib.c deleted file mode 100644 index 825e08c..0000000 --- a/glide2x/sst1/glide/tests/tlib.c +++ /dev/null @@ -1,1863 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#include -#include -#ifndef __linux__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -#include - -#if (GLIDE_PLATFORM & GLIDE_HW_CVG) -#include -#else -#endif - -#ifdef __DJGPP__ -#include -int crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK; -#endif - -#include "tlib.h" - -static FxBool okToRender = FXTRUE; -static FxBool fullScreen = FXTRUE; - - -FxBool -tlOkToRender() -{ - return okToRender; -} /* tlOkToRender */ - -/*------------------------------------------------------------------- - Function:tlGetOpt - Date: 2/26 - Implementor(s): jdt - Library: Test Library - Description: - Incrementally search an argument list for matches. - Arguments: - argc - first argument to main - argv - second argument to main - tags - string of non-whitespace characters to be search for in the - argument string - match - pointer to storage for matched character - remArgs - pointer to storage for remaining arglist after any match - Return: - 1 if matched - 0 if no more arguments - -1 if unrecognized - -------------------------------------------------------------------*/ -int tlGetOpt( int argc, char *argv[], - const char *tags, char *match, - char **remArgs[] ){ - static int firstCall; - static int lastArg; - - int rv = 0; - - if ( !firstCall ) { - lastArg = 1; - firstCall = 1; - } - - while( (lastArg|[]{}! "; - -static const int fontWidth = 9*2; -static const int fontHeight = 12*2; -static const int charsPerLine = 14; - -static int fontInitialized; - -static void grabTex( FxU32 addr, void *storage ); -static void putTex( FxU32 addr, void *storage ); -static void consoleScroll( void ); -static void drawChar( char character, float x, float y, float w, float h ); - -#include "tldata.inc" - -/*------------------------------------------------------------------- - Function: tlSetConsole - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Initialize Console for printing. The console will scroll text - 60 column text in the window described by minx, miny, maxx, maxy. - Arguments: - minX, minY - upper left corner of console - maxX, maxY - lower right corner of console - rows - rows of text to display - columns - columns to display before scroll - Return: - none - -------------------------------------------------------------------*/ -static char *consoleGrid; -static int consoleRows; -static int consoleColumns; -static int consoleX; -static int consoleY; -static int consoleColor; -static float consoleOriginX; -static float consoleOriginY; -static float consoleCharWidth; -static float consoleCharHeight; - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ) { - int entry; - char xCoord; - char yCoord; - - fontInfo.smallLod = GR_LOD_128; - fontInfo.largeLod = GR_LOD_128; - fontInfo.aspectRatio = GR_ASPECT_2x1; - fontInfo.format = GR_TEXFMT_ALPHA_8; - fontInfo.data = &fontData[0]; - - if ( getenv( "FX_GLIDE_NO_FONT" ) ) { - fontInitialized = 0; - return; - } - - for( entry = 1; entry < 128; entry++ ) { - char *hit = strchr( fontString, entry ); - if ( hit ) { - int offset = hit - fontString; - - xCoord = ( offset % charsPerLine ) * fontWidth; - yCoord = ( offset / charsPerLine ) * fontHeight; - - fontTable[entry][0] = xCoord; - fontTable[entry][1] = yCoord; - } - } - - if ( consoleGrid ) free( consoleGrid ); - - consoleGrid = calloc( sizeof( char ), rows * columns ); - memset( consoleGrid, 32, rows*columns ); - consoleRows = rows; - consoleColumns = columns; - consoleX = consoleY = 0; - - consoleColor = color; - consoleOriginX = minX; - consoleOriginY = minY; - consoleCharWidth = ( (maxX - minX)/(float)columns ); - consoleCharHeight = ( (maxY - minY)/(float)rows ); - - fontAddress = grTexMaxAddress( 0 ) - - grTexCalcMemRequired( fontInfo.smallLod, fontInfo.largeLod, - fontInfo.aspectRatio, fontInfo.format ); - - fontInitialized = 1; - - return; -}; - -#ifdef __linux__ -static void strupr(char *str) { - while (*str) { - if (islower(*str)) *str=toupper(*str); - str++; - } -} -#endif - -/*------------------------------------------------------------------- - Function: tlConOutput - Date: 2/28 - Implementor(s): jdt - Library: Test Library - Description: - Output a printf style string to the console - Arguments: - fmt - format string - ... - other args - Return: - int - number of chars printed - -------------------------------------------------------------------*/ -int tlConOutput( const char *fmt, ... ) { - static short tmpTex[256*256]; - int rv = 0; - va_list argptr; - - if( fontInitialized ) { - static char buffer[1024]; - const char *c; - - va_start( argptr, fmt ); - rv = vsprintf( buffer, fmt, argptr ); - va_end( argptr ); - - strupr( buffer ); - - c = buffer; - - /* update console grid */ - - while( *c ) { - switch( *c ) { - case '\n': - consoleY++; - case '\r': - consoleX = 0; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - break; - default: - if ( consoleX >= consoleColumns ) { - consoleX = 0; - consoleY++; - if ( consoleY >= consoleRows ) { - consoleY = consoleRows - 1; - consoleScroll(); - } - } - consoleGrid[(consoleY*consoleColumns)+consoleX]=*c; - consoleX++; - break; - } - c++; - } - } - - return rv; -} - -/*------------------------------------------------------------------- - Function: tlConClear - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Clear the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConClear() { - memset( consoleGrid, 32, consoleRows*consoleColumns ); - consoleX = consoleY = 0; - return; -} - - -/*------------------------------------------------------------------- - Function: tlConRender - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Render the console - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void tlConRender( void ) { - static short tmpTex[256*256]; - - if( fontInitialized ) { - int x, y; - - grGlideGetState( &state ); - - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_LOCAL_CONSTANT, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexCombine( GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA, - GR_BLEND_ONE, GR_BLEND_ZERO ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grTexFilterMode( GR_TMU0, - GR_TEXTUREFILTER_BILINEAR, - GR_TEXTUREFILTER_BILINEAR ); - grTexMipMapMode( GR_TMU0, - GR_MIPMAP_DISABLE, - FXFALSE ); - grDepthBufferFunction( GR_CMP_ALWAYS ); - grAlphaTestReferenceValue( 0x1 ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - grTexDownloadMipMap( 0, fontAddress, GR_MIPMAPLEVELMASK_BOTH, - &fontInfo ); - grTexSource( 0, fontAddress, - GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); - grClipWindow( (int)tlScaleX(0.0f),(int)tlScaleY(0.0f), - (int)tlScaleX(1.0f),(int)tlScaleY(1.0f) ); - - for( y = 0; y < consoleRows; y++ ) { - float charX = consoleOriginX; - float charY = consoleOriginY+(consoleCharHeight*y); - for( x = 0; x < consoleColumns; x++ ) { - drawChar( consoleGrid[(y*consoleColumns)+x], - charX, charY, - consoleCharWidth, - consoleCharHeight ); - charX += consoleCharWidth; - } - } - - grGlideSetState(&state); - } - - return; -} - -/*------------------------------------------------------------------- - Function: tlSleep - Date: 3/1 - Implementor(s): jdt - Library: Test Library - Description: - Block for a number of seconds - Arguments: - seconds - number of seconds before function returns - Return: - none - -------------------------------------------------------------------*/ -void tlSleep( int seconds ) { - time_t time0 = time( 0 ); - while( (time(0)-time0) < seconds ); -} - -/*------------------------------------------------------------------- - Function: tlIdentity - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Return an identity matrix - Arguments: - none - Return: - const pointer to identity matrix - -------------------------------------------------------------------*/ -static TlMatrix currentMatrix; - -#define DEGREE (.01745328f) - -const float *tlIdentity( void ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlXRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the x axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlXRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = c, m[1][2] = s, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = -s, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlYRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a rotation about the y axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlYRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = 0.0f, m[0][2] = -s, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = s, m[2][1] = 0.0f, m[2][2] = c, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - - -/*------------------------------------------------------------------- - Function: tlZRotation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate about the z axis - Arguments: - degrees - number of degrees to rotate - Return: - const point to rotation matrix - -------------------------------------------------------------------*/ -const float *tlZRotation( float degrees ) { - static TlMatrix m; - float c = (float)cos( degrees * DEGREE ); - float s = (float)sin( degrees * DEGREE ); - m[0][0] = c, m[0][1] = s, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = -s, m[1][1] = c, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlTranslation - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Generate a translation matrix - Arguments: - x, y, z - offsets to translate origin - Return: - const point to translation matrix - -------------------------------------------------------------------*/ -const float *tlTranslation( float x, float y, float z ) { - static TlMatrix m; - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 0.0f; - m[3][0] = x, m[3][1] = y, m[3][2] = z, m[3][3] = 1.0f; - return &m[0][0]; -} - -/*------------------------------------------------------------------- - Function: tlSetMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Set the current matrix. This matrix translates the object into - View space from local coordiantes during calls to transformVertices - All spaces are considered to by -1.0->1.0 normalized. - Arguments: - m - pointer to matrix - Return: - none - -------------------------------------------------------------------*/ -void tlSetMatrix( const float *m ) { - memcpy( currentMatrix, m, sizeof( TlMatrix ) ); - return; -} - -/*------------------------------------------------------------------- - Function: tlMultMatrix - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Multiply the current matrix by the provided matrix - Arguments: - matrix to post-cat to the current matrix - Return: - none - -------------------------------------------------------------------*/ -void tlMultMatrix( const float *m ) { - TlMatrix result; - TlMatrix mat; - int i, j; - - memcpy( mat, m, sizeof( TlMatrix ) ); - - for( j = 0; j < 4; j++ ) { - for( i = 0; i < 4; i++ ) { - result[j][i] = - currentMatrix[j][0] * mat[0][i] + - currentMatrix[j][1] * mat[1][i] + - currentMatrix[j][2] * mat[2][i] + - currentMatrix[j][3] * mat[3][i]; - } - } - memcpy( currentMatrix, result, sizeof( TlMatrix ) ); - -} - -/*------------------------------------------------------------------- - Function: tlTransformVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - Transform a list of vertices from model space into view space - Arguments: - dstVerts - memory to store transformed vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -void tlTransformVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - memcpy( m, currentMatrix, sizeof( TlMatrix ) ); - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - dstVerts[i] = tmp; - } - return; -} - -/*------------------------------------------------------------------- - Function: tlProjectVertices - Date: 3/3 - Implementor(s): jdt - Library: Test Library - Description: - perspective project a set of vertices into normalized 2D space (0,1) - Arguments: - dstVerts - memory to store projected vertices - srcVerts - array of vertices to be transformed - length - number of vertices to transform - Return: - none - -------------------------------------------------------------------*/ -#define VP_OFFSET 1.0f -#define VP_SCALE 0.5f - -void tlProjectVertices( TlVertex3D *dstVerts, TlVertex3D *srcVerts, unsigned length ) { - TlVertex3D tmp, v; - TlMatrix m; - unsigned i; - - /* simplified perspective proj matrix assume unit clip volume */ - m[0][0] = 1.0f, m[0][1] = 0.0f, m[0][2] = 0.0f, m[0][3] = 0.0f; - m[1][0] = 0.0f, m[1][1] = 1.0f, m[1][2] = 0.0f, m[1][3] = 0.0f; - m[2][0] = 0.0f, m[2][1] = 0.0f, m[2][2] = 1.0f, m[2][3] = 1.0f; - m[3][0] = 0.0f, m[3][1] = 0.0f, m[3][2] = 0.0f, m[3][3] = 0.0f; - - for( i = 0; i < length; i++ ) { - v = srcVerts[i]; - tmp = v; - tmp.x = v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]; - tmp.y = v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]; - tmp.z = v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]; - tmp.w = v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]; - tmp.x /= tmp.w, tmp.y /= tmp.w, tmp.z /= tmp.w; - tmp.x += VP_OFFSET, tmp.x *= VP_SCALE; - tmp.y += VP_OFFSET, tmp.y *= VP_SCALE; - dstVerts[i] = tmp; - } -} - - -/*------------------------------------------------------------------- - Function: tlLoadTexture - Date: 3/3 - Implementor(s): jdt - Library: Test Libarary - Description: - Load Texture - - This example loads textures from a .3df file. 3DF files - containe pre-computed mipmaps data along with any - necessary supplementary information, for example - palettes, ncc-tables, level-of-detail description, - aspect ratio or format - - The gu3dfGetInfo and gu3dfLoad APIs load A 3DF file - into Gu3DfInfo structure from a file on disk. Data - can then be extracted from the gu3DfInfo structure - to initialize a GrTexInfo structure used in the - glide texturing routines. Also note that texture table - ( either NCC or Palette ) management is left up to the - application programmer. - Arguments: - filename - name of .3df file on disk - info - Pointer to GrTexInfo - tableType - pointer to tabletype - table - pointer to table data - Return: - 0 - fail - 1 - pass - -------------------------------------------------------------------*/ -static GrTexTable_t texTableType( GrTextureFormat_t format ); - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ) { - Gu3dfInfo tdfInfo; - int rv = 0; - - assert( filename ); - assert( info ); - assert( tableType ); - assert( table ); - if ( gu3dfGetInfo( filename, &tdfInfo ) ) { - tdfInfo.data = malloc( tdfInfo.mem_required ); - assert( tdfInfo.data ); - if ( gu3dfLoad( filename, &tdfInfo ) ) { - info->smallLod = tdfInfo.header.small_lod; - info->largeLod = tdfInfo.header.large_lod; - info->aspectRatio = tdfInfo.header.aspect_ratio; - info->format = tdfInfo.header.format; - info->data = tdfInfo.data; - *tableType = texTableType( info->format ); - switch( *tableType ) { - case GR_TEXTABLE_NCC0: - case GR_TEXTABLE_NCC1: - case GR_TEXTABLE_PALETTE: - memcpy( table, &(tdfInfo.table), sizeof( TlTextureTable ) ); - break; - default: - break; - } - rv = 1; - } - } - return rv; -} - - - -/*-------------------------------------------------------------------- - Static Helpers - --------------------------------------------------------------------*/ - -static void consoleScroll( void ) { - memmove( consoleGrid, - consoleGrid + consoleColumns, - (consoleRows-1)*consoleColumns ); - memset( consoleGrid+(consoleRows-1)*consoleColumns, - 32, - consoleColumns ); -} - -static void drawChar( char character, float x, float y, float w, float h ) { - GrVertex a, b, c, d; - /* a---b - |\ | - | \ | - | \| - c---d */ - - if ( character == 32 ) return; - - a.oow = b.oow = c.oow = d.oow = 1.0f; - - a.x = c.x = tlScaleX(x); - a.y = b.y = tlScaleY(y); - d.x = b.x = tlScaleX(x+w); - d.y = c.y = tlScaleY(y+h); - - grConstantColorValue( consoleColor ); - - a.tmuvtx[0].sow = c.tmuvtx[0].sow = - (float)fontTable[character][0]; - a.tmuvtx[0].tow = b.tmuvtx[0].tow = - (float)fontTable[character][1]; - d.tmuvtx[0].sow = b.tmuvtx[0].sow = - a.tmuvtx[0].sow + (float)fontWidth; - d.tmuvtx[0].tow = c.tmuvtx[0].tow = - a.tmuvtx[0].tow + (float)fontHeight; - - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - return; -} - - - - -static void readRegion( void *data, - int x, int y, - int w, int h ); -static void writeRegion( void *data, - int x, int y, - int w, int h ); - - -static void putTex( FxU32 addr, void *storage ) { - GrTexInfo texInfo; - - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = storage; - - grTexDownloadMipMap( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &fontInfo ); -} - - -static void grabTex( FxU32 addr, void *storage ) { - static FxU16 tmpSpace[256][256]; - GrTexInfo texInfo; - GrVertex a, b, c, d; - - grGlideGetState( &state ); - grDitherMode( GR_DITHER_DISABLE ); - grColorMask( FXTRUE, FXFALSE ); - grSstOrigin( GR_ORIGIN_UPPER_LEFT ); - grCullMode( GR_CULL_DISABLE ); - - /* Grab Upper Left 256*256 of frame buffer */ - readRegion( tmpSpace, 0, 0, 256, 256 ); - - /* Grab First 256x256 MM in Texture Ram */ - texInfo.smallLod = GR_LOD_256; - texInfo.largeLod = GR_LOD_256; - texInfo.aspectRatio = GR_ASPECT_1x1; - texInfo.format = GR_TEXFMT_RGB_565; - texInfo.data = 0; - grTexMipMapMode( 0, GR_MIPMAP_DISABLE, FXFALSE ); - grTexFilterMode( 0, - GR_TEXTUREFILTER_POINT_SAMPLED, - GR_TEXTUREFILTER_POINT_SAMPLED ); - grTexCombine( 0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - FXFALSE, - FXFALSE ); - grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_LOCAL_NONE, - GR_COMBINE_OTHER_TEXTURE, - FXFALSE ); - grTexSource( 0, addr, GR_MIPMAPLEVELMASK_BOTH, &texInfo ); - grAlphaBlendFunction( GR_BLEND_ONE, GR_BLEND_ZERO, - GR_BLEND_ONE, GR_BLEND_ZERO); - grDepthBufferFunction( GR_DEPTHBUFFER_DISABLE ); - grAlphaTestFunction( GR_CMP_ALWAYS ); - grFogMode( GR_FOG_DISABLE ); - grCullMode( GR_CULL_DISABLE ); - grChromakeyMode( GR_CHROMAKEY_DISABLE ); - /*------------------- - A---B - | \ | - C---D - -------------------*/ - a.oow = a.tmuvtx[0].oow = 1.0f; - b = c = d = a; - a.x = c.x = a.y = b.y = 0.5f; - b.x = d.x = c.y = d.y = 255.6f; - a.tmuvtx[0].sow = c.tmuvtx[0].sow = a.tmuvtx[0].tow = b.tmuvtx[0].tow = - 0.5f; - b.tmuvtx[0].sow = d.tmuvtx[0].sow = c.tmuvtx[0].tow = d.tmuvtx[0].tow = - 0.5f; - grDrawTriangle( &a, &d, &c ); - grDrawTriangle( &a, &b, &d ); - readRegion( storage, 0, 0, 256, 256 ); - - /* Restore The Upper Left Hand of Frame Buffer */ - writeRegion( tmpSpace, 0, 0, 256, 256 ); - grGlideSetState( &state ); - return; -} - -static void readRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_READ_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *dst = ((unsigned short *)data+ - (w*y)); - unsigned short *src = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - - assert( grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} -static void writeRegion( void *data, - int sx, int sy, - int w, int h ) { - int x; int y; - GrLfbInfo_t info; - - info.size = sizeof( info ); - - assert( grLfbLock( GR_LFB_WRITE_ONLY, - GR_BUFFER_BACKBUFFER, - GR_LFBWRITEMODE_ANY, - GR_ORIGIN_UPPER_LEFT, - FXFALSE, - &info ) ); - - for( y = 0; y < h; y++ ) { - unsigned short *src = ((unsigned short *)data+ - (w*y)); - unsigned short *dst = (unsigned short*)(((char*)info.lfbPtr) - +(info.strideInBytes*(sy+y)) - +(sx<<1)); - for( x = 0; x < w; x++ ) { - *dst++ = *src++; - } - } - - assert( grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ) ); - return; -} - - -static GrTexTable_t texTableType( GrTextureFormat_t format ) { - GrTexTable_t rv = (GrTexTable_t)NO_TABLE; - switch( format ) { - case GR_TEXFMT_YIQ_422: - case GR_TEXFMT_AYIQ_8422: - rv = GR_TEXTABLE_NCC0; - break; - case GR_TEXFMT_P_8: - case GR_TEXFMT_AP_88: - rv = GR_TEXTABLE_PALETTE; - break; - } - return rv; -} - -/* - * SimpleRleDecode - * simple rle decoder - * Arguments: - * width : width of the image - * height : height of the image - * pixelsize : 1-4 - * *mem : compressed data - * *buff : uncompressed data - * Return: - * TRUE if decode sucessful. otherwise FALSE - * The simple rle file file format - * width: 2 bytes - * height: 2 bytes - * compression type: 1 byte (0: literal data, 1: rle) - * depth: 1 byte (16 for sst1) - * image data - * 1st byte: control byte. msb = 1 indicate a run, msb = 0 indicate a literal string - * bit 7-0 is counter. it is zero based. - * next depth/8 bytes: pixel data - */ -FxBool -SimpleRleDecode -( - FxU16 width, - FxU16 height, - FxU8 pixelsize, - FxU8 *mem, - FxU8 *buff -) -{ - FxU32 count = width * height; - FxU8 run, lit; - - while (count) { - if (*mem & 0x80) { - run = *mem & 0x7f; - run++; - mem++; - count -= run; - while (run) { - memcpy(buff, mem, pixelsize); - run--; - buff+=pixelsize; - } - mem+=pixelsize; - } - else { - lit = *mem; - lit++; - mem++; - count -= lit; - while (lit) { - memcpy(buff, mem, pixelsize); - lit--; - buff+=pixelsize; - mem+=pixelsize; - } - } - if (count < 0) - return FXFALSE; - } - return FXTRUE; -} - -/* - * WritePixel - * write rle run/literal strings - * Arguments: - * flag: TRUE if it is a run. otherwise it is a string - * count: number of run/literal (0 based) - * *buff: output area - * *tmp: source area - * pixelsize: pixel size (1-4) - * Return: - * none - */ -static void -WritePixel -( - FxBool flag, - FxU8 count, - FxU8 *buff, - FxU8 *tmp, - FxU8 pixelsize -) -{ - FxU8 val; - FxU32 i; - - if (flag) { - val = 0x80 | count; - count = 0; - } - else - val = count; - - *buff = val; - buff++; - for (i = 0; i <= count; i++) { - memcpy(buff, tmp, pixelsize); - buff+=pixelsize; - tmp+=4; - } -} - -/* - * SimpleRleEncode - * simple rle encoder - * Arguments: - * pixelcount : number of pixels - * pixelsize : 1-4 - * *mem : source image - * *buff : compressed data - * Return: - * none - */ -static FxU32 -SimpleRleEncode -( - FxU32 pixelcount, /* number of pixels */ - FxU8 pixelsize, /* size of pixel (in bytes) 1-4 */ - FxU8 *mem, /* src image */ - FxU8 *buff /* compressed data */ -) -{ - FxU8 *src = buff; - FxU8 run = 0, lit = 0; - FxU32 tmp[130]; - FxU32 pval = 0, cval = 0; - FxU32 i; - FxU32 tt; - FxBool flag = FXFALSE; - - /* determine run or literal */ - mem+=pixelsize; - - for (i = 1; i < pixelcount; i++) { - if (i > 300000) - tt = 1; - memcpy(&pval, mem-pixelsize, pixelsize); - memcpy(&cval, mem, pixelsize); - if (cval == pval) { - flag = FXFALSE; - if (lit) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit = 0; - } - run++; - if (run == 128) { - WritePixel(FXTRUE, (FxU8)(run - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run -= 128; - } - memcpy(&tmp[0], mem, pixelsize); - } - else { - flag = FXTRUE; - if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - else { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - lit++; - } - } - mem+=pixelsize; - } - /* last pixel */ - if (flag) { - if (lit == 128) { - WritePixel(FXFALSE, (FxU8)(lit - 1), buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize * lit); - lit -= 128; - } - memcpy(&tmp[lit], mem-pixelsize, pixelsize); - WritePixel(FXFALSE, (FxU8)lit, buff, (FxU8 *)&tmp[0], pixelsize); - lit++; - buff += (1 + pixelsize * lit); - lit = 0; - } - else if (run) { - WritePixel(FXTRUE, run, buff, (FxU8 *)&tmp[0], pixelsize); - buff += (1 + pixelsize); - run = 0; - } - - return( (FxU32) (buff - src)); -} - -/*------------------------------------------------------------------- - Function: tlScreenDump - Date: 6/6/97 - Implementor(s): - Library: test library - Description: - dump the lfb data - Arguments: - filename - filename - width - width for frame buffer - height - height for frame buffer - Return: - none - -------------------------------------------------------------------*/ -FxBool -tlScreenDump -( - const char *filename, - FxU16 width, - FxU16 height -) -{ - FILE *fp; - FxU16 *pixel, *region; - FxU8 *buff; - FxU32 count, signature; - FxU8 type, depth; - - fp = fopen(filename, "wb"); - if (fp == NULL) - return(FXFALSE); - - region = malloc(width * height * sizeof(FxU16)); - buff = malloc(width * height * sizeof(FxU16) * 2); - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, 0, width, height, - width*2, region ); - - pixel = (FxU16 *)region; - - count = SimpleRleEncode( (FxU32)width * (FxU32)height, 2, (FxU8 *)region, (FxU8 *)buff); - - /* header of the file */ - type = LFB_DATA_RLE; - depth = 16; - signature = IMAGE_SRLE; - fwrite(&signature, sizeof(FxU32), 1, fp); - fwrite(&width, sizeof(FxU16), 1, fp); - fwrite(&height, sizeof(FxU16), 1, fp); - fwrite(&depth, sizeof(FxU8), 1, fp); - fwrite(&type, sizeof(FxU8), 1, fp); - - /* LFB data */ - fwrite(buff, count, 1, fp); - - free(buff); - free(region); - fclose(fp); - - return FXTRUE; -} - -#ifdef __linux__ -#include - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return lin_kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return lin_getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else -#ifdef __DOS32__ -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int tlKbHit( void ) { - return kbhit(); -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char tlGetCH( void ) { - return getch(); -} - -FxBool -tlErrorMessage( char *err) { - fprintf(stderr, err); -} /* tlErrorMessage */ - -#else /* __WIN32__ */ - - -/* This segment simulates main() for Windows, creates a window, etc. */ -#define WIN32_LEAN_AND_MEAN -#include - -/* Forward declarations */ -HWND hWndMain; -char ** commandLineToArgv(LPSTR lpCmdLine, int *pArgc); - -/* - * MainWndproc - * - * Callback for all Windows messages - */ -static int qhead = 0; -static int qtail = 0; -static int queue[256] = {0}; - -long FAR PASCAL -MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PAINTSTRUCT ps; - HDC hdc; - - extern GrHwConfiguration hwconfig; - - switch( message ) - { - case WM_SETCURSOR: - if (Res != GR_RESOLUTION_NONE) { - SetCursor(NULL); - return 0; - } - break; - - case WM_CREATE: - break; - - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 1; - - case WM_CLOSE: - queue[qhead++] = 'q'; qhead &= 255; - break; - - case WM_DESTROY: - break; - - case WM_MOVE: - if (!grSstControl(GR_CONTROL_MOVE)) { - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - return 0; - } - break; - - case WM_ACTIVATE: - if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO) { - if (wParam & WA_INACTIVE) - grSstControl(GR_CONTROL_DEACTIVATE); - else { - grSstControl(GR_CONTROL_ACTIVATE); -#if 0 - grHints(GR_HINT_H3DENABLE,1); -#endif - } - } else - return 0; - break; - - case WM_DISPLAYCHANGE: - case WM_SIZE: - { - extern void getWindowSize(float *width, float *height); - float width, height; - - getWindowSize(&width, &height); -#ifndef H3D - tlSetScreen( width, height); -#endif - } - if (!grSstControl(GR_CONTROL_RESIZE)) { - MessageBox( hWnd, "Resize failed due to lack of sufficient buffer memory.\n", "Allocation Failure", MB_OK | MB_APPLMODAL ); - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); - okToRender = FXFALSE; - return 0; - } else { - okToRender = FXTRUE; - } - break; - - case WM_CHAR: - if (!isascii(wParam)) break; -#if 0 - printf("Posting keystroke %.02x\n", wParam); - fflush(stdout); -#endif - /* queue[qhead++] = tolower(wParam); */ - queue[qhead++] = wParam; - qhead &= 255; - break; - - default: - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); - -} /* MainWndproc */ - -/* - * initApplication - * - * Do that Windows initialization stuff... - */ -static FxBool -initApplication( HANDLE hInstance, int nCmdShow ) -{ - WNDCLASS wc; - FxBool rc; - - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = MainWndproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon( NULL, IDI_APPLICATION); /* generic icon */ - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = GetStockObject( BLACK_BRUSH ); - wc.lpszMenuName = NULL; - wc.lpszClassName = "WinGlideClass"; - rc = RegisterClass( &wc ); - if( !rc ) { - return FALSE; - } - - hWndMain = - CreateWindowEx( -#if 0 - WS_EX_APPWINDOW gives you regular borders? - WS_EX_TOPMOST Works as advertised. -#endif - WS_EX_APPWINDOW, - "WinGlideClass", - "Glide Test", - WS_OVERLAPPED | - WS_CAPTION | - WS_THICKFRAME | - WS_MAXIMIZEBOX | - WS_MINIMIZEBOX | - WS_VISIBLE | /* so we don't have to call ShowWindow */ - WS_POPUP | /* non-app window */ - WS_SYSMENU, /* so we get an icon in the tray */ - CW_USEDEFAULT, - CW_USEDEFAULT, - 0x110, /* GetSystemMetrics(SM_CXSCREEN), */ - 0x120, /* GetSystemMetrics(SM_CYSCREEN), */ - NULL, - NULL, - hInstance, - NULL - ); - - if( !hWndMain ) { - return FALSE; - } - - SetCursor(NULL); - - ShowWindow( hWndMain, SW_NORMAL); - UpdateWindow( hWndMain ); - - return TRUE; - -} /* initApplication */ - -/* - * WinMain - */ -int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow ) -{ - if( !initApplication(hInstance, nCmdShow) ) - return FALSE; - - { - /* - * Since printfs go into the bit bucket on Win32, - * put up a message in the window. - */ - HDC hDC = GetDC(hWndMain); - char *message = "Press any Key to continue!"; - RECT rect; - - GetClientRect(hWndMain, &rect); - SetTextColor(hDC, RGB(0, 255, 255)); - SetBkColor(hDC, RGB(0, 0, 0)); - SetTextAlign(hDC, TA_CENTER); - ExtTextOut(hDC, rect.right/2, rect.bottom/2, ETO_OPAQUE, &rect, - message, strlen(message), NULL); - ReleaseDC(hWndMain, hDC); - GdiFlush(); - } - - { - int argc; - char **argv; - extern int main(int argc, char **argv); - - argv = commandLineToArgv(lpCmdLine, &argc); - main(argc, argv); - } - - printf("Exiting winMain()\n"); - fflush(stdout); - - DestroyWindow(hWndMain); - return 0; - -} /* WinMain */ - -FxBool -tlErrorMessage( char *err) -{ - /* make the cursor visible */ - SetCursor(LoadCursor( NULL, IDC_ARROW )); - - /* - ** warn user if there is one - */ - printf("Error %s..\n", err); - fflush(stdout); - - MessageBox( hWndMain, err, "ERROR", MB_OK ); - return FALSE; -} /* tlErrorMessage */ - -/* - * Converts lpCmdLine to WinMain into argc, argv - */ -static char *fakeName = "WinTest"; -static char *argvbuf[32]; -static char cmdLineBuffer[1024]; -char ** -commandLineToArgv(LPSTR lpCmdLine, int *pArgc) -{ - char *p, *pEnd; - int argc = 0; - - argvbuf[argc++] = fakeName; - - if (lpCmdLine == NULL) { - *pArgc = argc; - return argvbuf; - } - - strcpy(cmdLineBuffer, lpCmdLine); - p = cmdLineBuffer; - pEnd = p + strlen(cmdLineBuffer); - if (pEnd >= &cmdLineBuffer[1022]) pEnd = &cmdLineBuffer[1022]; - - fflush(stdout); - - while (1) { - /* skip over white space */ - fflush(stdout); - - while (*p == ' ') p++; - if (p >= pEnd) break; - - argvbuf[argc++] = p; - if (argc >= 32) break; - - /* skip till there's a 0 or a white space */ - while (*p && (*p != ' ')) p++; - - if (*p == ' ') *p++ = 0; - } - - *pArgc = argc; - return argvbuf; -} - -/*------------------------------------------------------------------- - Function: tlKbHit - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns true if there are pending characters in the input queue - Arguments: - none - Return: - nonzero if keys in queue - -------------------------------------------------------------------*/ -int -tlKbHit( void ) -{ - MSG msg; - - if (qhead != qtail) { - return 1; - } - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); /* this might change qhead */ - if (qhead != qtail) { - return 1; - } - } - return 0; -} - -/*------------------------------------------------------------------- - Function: tlGetCH - Date: 2/28 - Implementor(s): jdt - Library: test library - Description: - Returns character from top of input fifo, blocks if fifo is empty - Arguments: - none - Return: - character - -------------------------------------------------------------------*/ -char -tlGetCH( void ) -{ - MSG msg; - char rv; - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - - while (GetMessage( &msg, NULL, 0, 0 )) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (qtail != qhead) { - rv = queue[qtail++]; - qtail &= 255; - return rv; - } - } - - /* Should never get here!! */ - /* printf("Bad exit..\n"); */ - /* fflush(stdout); */ -} - -void -tlExit() -{ - PostMessage( hWndMain, WM_CLOSE, 0, 0 ); -} - - -void -getWindowSize(float *width, float *height) -{ - RECT rect; - - if (fullScreen) { - GetWindowRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } - else { - GetClientRect(hWndMain, &rect); - *width = (float) (rect.right-rect.left); - *height = (float) (rect.bottom-rect.top); - } -} - - -#endif /* __DOS32__ */ -#endif /* __linux__ */ diff --git a/glide2x/sst1/glide/tests/tlib.h b/glide2x/sst1/glide/tests/tlib.h deleted file mode 100644 index 4467d1a..0000000 --- a/glide2x/sst1/glide/tests/tlib.h +++ /dev/null @@ -1,144 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _TLIB_H_ -#define _TLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - - -/* If not debugging, change the meaning of the ANSI assert - * so that it is a harmless wrapper rather than ((void)0) as in - */ -#ifndef DEBUG -#ifdef assert -#undef assert -#endif -#define assert(exp) (exp) -#endif - -int tlGetOpt( int argc, char *argv[], const char *tags, char *match, char **remArgs[] ); - -int tlGetResolutionConstant( const char *identifier, float *width, float *height ); -void tlGetDimsByConst(const int res, float *w, float *h); -const char *tlGetResolutionString( int res ); -const char *tlGetResolutionList( void ); - -void tlSetScreen( float width, float height ); -float tlScaleX( float coord ); -float tlScaleY( float coord ); - -void tlConSet( float minX, float minY, - float maxX, float maxY, - int columns, int rows, - int color ); -int tlConOutput( const char *fmt, ... ); -void tlConClear(); -void tlConRender(); - -int tlKbHit( void ); -char tlGetCH( void ); - -void tlSleep( int seconds ); - -#define LFB_DATA_LITERAL 0 -#define LFB_DATA_RLE 1 -#define IMAGE_SRLE (((FxU32)'S' << 24) | ((FxU32)'R' << 16) | ((FxU32)'L' << 8) | ((FxU32)'E')) - -FxBool SimpleRleDecode(FxU16 width,FxU16 height,FxU8 pixelsize, FxU8 *mem,FxU8 *buff); -void tlGrabRect(void *memory, FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy); -FxBool tlScreenDump(const char *filename, FxU16 width, FxU16 height); - -typedef struct { - float x; - float y; - float z; - float w; - float s; - float t; - float r; - float g; - float b; - float a; -} TlVertex3D; - -typedef float TlMatrix[4][4]; - -const float *tlIdentity( void ); -const float *tlZRotation( float degrees ); -const float *tlYRotation( float degrees ); -const float *tlXRotation( float degrees ); -const float *tlTranslation( float x, float y, float z ); -void tlSetMatrix( const float *m ); -void tlMultMatrix( const float *m ); -void tlTransformVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); -void tlProjectVertices( TlVertex3D *dstList, - TlVertex3D *srcList, - unsigned length ); - -FxBool tlOkToRender(void); - -FxBool -tlErrorMessage(char *err); - -typedef FxU32 TlPalette[256]; -typedef struct { - FxU8 yRGB[16]; - FxI16 iRGB[4][3]; - FxI16 qRGB[4][3]; - FxU32 packed_data[12]; -} TlNCCTable; - -typedef union { - TlPalette palette; - TlNCCTable nccTable; -} TlTextureTable; - -typedef struct { - GrTexInfo info; - GrTexTable_t tableType; - TlTextureTable tableData; -} TlTexture; - -#define NO_TABLE ((GrTexTable_t)(~0)) - -int tlLoadTexture( const char *filename, - GrTexInfo *info, - GrTexTable_t *tableType, - void *table ); - -/* We are making function calls from within assert() */ -#ifdef NDEBUG -#undef NDEBUG -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/glide/tests/yiq.3df b/glide2x/sst1/glide/tests/yiq.3df deleted file mode 100644 index 40b79d5d95988c8b3e6585f30064d68b6ed2fe5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87319 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 Gmia$yEDt#V diff --git a/glide2x/sst1/include/makefile.linux b/glide2x/sst1/include/makefile.linux deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/sst1/include/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/include/makefile.unix b/glide2x/sst1/include/makefile.unix deleted file mode 100644 index 11ef236..0000000 --- a/glide2x/sst1/include/makefile.unix +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.h) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/makefile.linux b/glide2x/sst1/incsrc/makefile.linux deleted file mode 100644 index 731472a..0000000 --- a/glide2x/sst1/incsrc/makefile.linux +++ /dev/null @@ -1,25 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -HEADERS = $(wildcard *.h) - -INSTALL_DESTINATION = $(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/makefile.sun b/glide2x/sst1/incsrc/makefile.sun deleted file mode 100644 index c74e707..0000000 --- a/glide2x/sst1/incsrc/makefile.sun +++ /dev/null @@ -1,29 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -HEADERS=*.h - -INSTALL_DESTINATION=$(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/incsrc/makefile.unix b/glide2x/sst1/incsrc/makefile.unix deleted file mode 100644 index 8fe9b89..0000000 --- a/glide2x/sst1/incsrc/makefile.unix +++ /dev/null @@ -1,25 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -HEADERS = $(wildcard *.h) - -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/incsrc/ncc.h b/glide2x/sst1/incsrc/ncc.h deleted file mode 100644 index 677dacc..0000000 --- a/glide2x/sst1/incsrc/ncc.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -*/ - - -#ifndef __NCC_H__ -#define __NCC_H__ - -/* -** $Revision$ -** $Date$ -*/ - -// translation tables for decompressing NCC format -typedef struct { - unsigned char yRGB[16]; - int iRGB[4][3]; - int qRGB[4][3]; -} NccTable; - -extern void yiq2rgb(NccTable *ncc, unsigned char *c888, unsigned char yiq); -extern void nccYIQtoRGB(unsigned int *array, long length); -extern unsigned char *nccRGBtoYIQ(const int xSize, const int ySize, - const unsigned int *from, float percent); -#endif /* !__NCC_H__ */ diff --git a/glide2x/sst1/incsrc/sst.h b/glide2x/sst1/incsrc/sst.h deleted file mode 100644 index 6b56d61..0000000 --- a/glide2x/sst1/incsrc/sst.h +++ /dev/null @@ -1,1107 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#ifndef __SST_H__ -#define __SST_H__ - -/* -** $Revision$ -** $Date$ -*/ - -#include -#include "fx64.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// this crazy macro fixes the binary point within a floating point -// number so that it has 'fracbits' to the right of the binary point -// it also adds a '1' bit to the MSB so that slightly negative numbers -// end up looking like twos complement numbers (they carry out from the '1') -#define FLOAT_FIX(f,fracbits) ((f)+(float)(3<<(22-(fracbits)))) - -#define SST_FLOAT(f,scale,shift) (unsigned long)((f)*((scale)*(float)(1<= 0; -1 if < 0) -#define ISIGN(x) (((x) | 0x40000000) >> 30) -#define FSIGN(f) ISIGN(*(long *)&f) - -typedef struct vertex_Rec { - unsigned long x; // 12.4 format - unsigned long y; // 12.4 -} vtxRec; - -// 256 color palette tables -typedef struct { - unsigned long argb[256]; -} Pal256; - -#define BIT(n) (1<<(n)) -#define SST_MASK(n) (0xFFFFFFFF >> (32-(n))) -#define SST_MASK64(n) FX_MASK64(n) - -//----------------- SST binary point locations --------------- -#define SST_LOD_SIZE 6 -#define SST_LOD_FRACBITS 2 -#define SST_XY_SIZE 16 -#define SST_XY_INTBITS 12 -#define SST_XY_FRACBITS 4 -#define SST_RGBA_SIZE 24 -#define SST_RGBA_INTBITS 8 -#define SST_RGBA_FRACBITS 12 -#define SST_Z_SIZE 32 -#define SST_Z_INTBITS 16 -#define SST_Z_FRACBITS 12 -// NOTE: below are ONLY for the fixed point registers -#define SST_ST_SIZE 32 -#define SST_ST_INTBITS 14 -#define SST_ST_FRACBITS 18 -#define SST_W_SIZE 32 -#define SST_W_INTBITS 2 -#define SST_W_FRACBITS 30 - -//----------------- SST lfbMode bits ----------------------- -#define SST_LFB_FORMAT_SHIFT 0 -#define SST_LFB_FORMAT (0xF< -#include "init.h" -#include - -/*---------------------------------------------------------------------------- - DATA DEFINITIONS - ----------------------------------------------------------------------------*/ -/*------------------------------------------------------------------- - Structure: InitContext - Date: 10/9 - Implementor(s): jdt, murali - Library: Init - Description: - Contains all device dependant functions for a given 3Dfx device - Members: - setVideo - initilize video - restoreVideo - undo setVideo - enableTransport - enable the command transport - disableTransport - disable the command transport - swapBuffers - function which executes a buffer swap - status - function which returns the status word from the 3D subsystem - busy - returns true if hardware busy - idle - returns when 3D subsystem is idle - getBufferPtr - get a pointer to a frame buffer - renderBuffer - set the current buffer for rendering - origin - set the y origin - ioCtl - CYA function - control - OS response functions - - gamma - initializes gamma table - sliPciOwner - sets ownership of PCI bus in SLI configuration - - info - hardware description - writeMethod - function for doing command transport writes to hardware - devNumber - enumerated order of device on bus - devPrivate - Private data for the device type - -------------------------------------------------------------------*/ -typedef struct { - FxBool (*setVideo) ( - FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings); - void (*restoreVideo)( void ); - FxBool (*enableTransport)( InitFIFOData *info ); - void (*disableTransport)( void ); - - void (*swapBuffers)( FxU32 code ); - FxU32 (*status)( void ); - FxBool (*busy)(void); - void (*idle)( void ); - void *(*getBufferPtr)( InitBuffer_t buffer, int *strideBytes ); - void (*renderBuffer)( InitBuffer_t buffer ); - void (*origin)( InitOriginLocation_t origin ); - void (*ioCtl)( FxU32 token, void *argument ); - FxBool (*control) ( FxU32 code ); - FxBool (*wrapFIFO) (InitFIFOData *fD); - - void (*gamma)( double gamma ); - void (*sliPciOwner)( FxU32 *regbase, FxU32 owner ); - - /* - ** added interface for Glide 3 - */ - FxBool (*gammaRGB)( double r, double g, double b ); - FxBool (*initGammaTable)(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b); - sst1VideoTimingStruct * (*findVidTimingStruct) ( - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh); - - InitDeviceInfo info; - InitWriteCallback *writeMethod; - void *devPrivate; -} InitContext; - -/* Global current context */ -extern InitContext *context; - -void vgDriverInit( InitContext *context ); -void vg96DriverInit( InitContext *context ); -void h3DriverInit( InitContext *context ); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/init/h3drvr.c b/glide2x/sst1/init/h3drvr.c deleted file mode 100644 index afaa943..0000000 --- a/glide2x/sst1/init/h3drvr.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include <3dfx.h> -#include -#include "init.h" -#include "fxinit.h" - -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - return FXFALSE; -} - -static void restoreVideo( void ) { -} - -static FxBool enableTransport( InitFIFOData *info ) { - FxBool rv = FXFALSE; - return rv; -} - -static void disableTransport( void ) { -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - return 0; -} - -static FxU32 status( void ) { - return 0; -} - -static FxBool busy(void) { - return 0; -} - -static void idle( void ) { -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return 0; -} - -static void renderBuffer( InitBuffer_t buffer ) { - return; -} - -static void origin( InitOriginLocation_t origin ) { - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - return FXFALSE; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return FXTRUE; -} - -static void gamma( double gamma ) { -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { -} - -void h3DriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; -} diff --git a/glide2x/sst1/init/init.c b/glide2x/sst1/init/init.c deleted file mode 100644 index a397afe..0000000 --- a/glide2x/sst1/init/init.c +++ /dev/null @@ -1,827 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#include "init.h" -#include "fxinit.h" - -#include -#include - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif -#if defined(__linux__) - -#define _inp(port) pioInByte(port) -#define _outp(port, data) pioOutByte(port, data) -#define _outpw(port, data) pioOutWord(port, data); - -#endif - -#include -#include - -#ifdef _WIN32 -#define _WIN32_LEAN_AND_MEAN_ -#include -#endif - -#include -#include - -static const PciRegister PCI_VENDOR_ID = { 0x0, 2, READ_ONLY }; -static const PciRegister PCI_DEVICE_ID = { 0x2, 2, READ_ONLY }; - - -/*------------------------------------------------------------------- - Module Constants - -------------------------------------------------------------------*/ - - -static InitContext - contexts[NUM_3DFX_PRODUCTS]; /* pool of device contexts */ -InitContext - *context; /* Current device context */ -static InitDeviceInfo - hwInfo[INIT_MAX_DEVICES]; /* Info for all supported devices */ -static FxU32 - numDevicesInSystem, /* Number of supported devices. */ - numSst1s; /* # SST1s in system */ -static FxBool - libInitialized; /* Well, has it been? */ - -/*------------------------------------------------------------------- - Function: initEnumHardware - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Calls a user supplied function on an initialized InitDeviceInfo - structure for each device in the system. Calls a user supplied - callback repeatedly for each device in the system. The callback - can stop the enumeration cycle by return a value of FXTRUE. - Arguments: - cb - callback function of type INitHWEnumCallback which is called on - an initialzied InitDeviceInfo structure - Return: - none - -------------------------------------------------------------------*/ -void -initEnumHardware( InitHWEnumCallback *cb ) -{ - FxU32 busLocation; - FxU32 device; - if ( !libInitialized ) { - - /* When initializing the Library snoop out all 3Dfx devices - and fill a static data structure with pertinant data. */ - - numDevicesInSystem = 0; - numSst1s = 0; - if ( !pciOpen() ) return; - for( busLocation = 0; busLocation < MAX_PCI_DEVICES; busLocation++ ) { - if ( pciDeviceExists( busLocation ) ) { - FxU32 vId, dId; - pciGetConfigData( PCI_VENDOR_ID, busLocation, &vId ); - pciGetConfigData( PCI_DEVICE_ID, busLocation, &dId ); - - GDBG_INFO((80, "initEnumHardware: Vendor: 0x%x Device: 0x%x\n", vId, dId)); - -#if defined( SST1 ) - if ( (vId == TDFXVID) && - (dId == SST1DID) ) { /* Detect SST1 */ - FxU32 *base; - sst1DeviceInfoStruct info; - - /* Scanline interleave must be two boards back to back - if there is a second board in the system, - and the previous board was SLI, then this is the slave */ - if ( numDevicesInSystem > 0 ) { - if ( hwInfo[numDevicesInSystem-1].hwClass==INIT_VOODOO && - hwInfo[numDevicesInSystem-1].hwDep.vgInfo.sliDetect ) { - - hwInfo[numDevicesInSystem-1].hwDep.vgInfo.slaveBaseAddr = - (FxU32)sst1InitMapBoard( numSst1s ); - hwInfo[numDevicesInSystem-1].regs.hwDep.VGRegDesc.slavePtr = - (FxU32*)hwInfo[numDevicesInSystem-1].hwDep.vgInfo.slaveBaseAddr; - numSst1s++; - continue; - - } - } - - hwInfo[numDevicesInSystem].vendorID = (FxU16) vId; - hwInfo[numDevicesInSystem].deviceID = (FxU16) dId; - hwInfo[numDevicesInSystem].devNumber = numDevicesInSystem; - hwInfo[numDevicesInSystem].hwClass = INIT_VOODOO; - - /* On SST-1 We Have to Initialize the Registers - to Discover the configuration of the board */ -#if 0 - base = sst1InitMapBoard( numSst1s ); - sst1InitRegisters( base ); -#else - base = (FxU32*)initMapBoard(numSst1s); -#endif - sst1InitGetDeviceInfo( base, &info ); - - hwInfo[numDevicesInSystem].hwDep.vgInfo.vgBaseAddr = (FxU32) base; - hwInfo[numDevicesInSystem].hwDep.vgInfo.pfxRev = info.fbiRevision; - hwInfo[numDevicesInSystem].hwDep.vgInfo.pfxRam = info.fbiMemSize; - hwInfo[numDevicesInSystem].hwDep.vgInfo.nTFX = info.numberTmus; - hwInfo[numDevicesInSystem].hwDep.vgInfo.tfxRev = info.tmuRevision; - hwInfo[numDevicesInSystem].hwDep.vgInfo.tfxRam = info.tmuMemSize[0]; - hwInfo[numDevicesInSystem].hwDep.vgInfo.sliDetect = info.sstSliDetect; - hwInfo[numDevicesInSystem].hwDep.vgInfo.slaveBaseAddr = 0; - hwInfo[numDevicesInSystem].regs.hwDep.VGRegDesc.baseAddress = base; - hwInfo[numDevicesInSystem].regs.hwDep.VGRegDesc.slavePtr = 0; - - numSst1s++; - numDevicesInSystem++; - } -#elif defined(SST96) -#define IS_CHIP(name) (vId == name##VID && dId == name##DID) - - if (IS_CHIP(AT3D) || - IS_CHIP(MCRX)) { - - if (IS_CHIP(MCRX)) { - /* In the case of Macronix, look for 3d4/3f[2] == 1, as - they set that bit when we're attached. */ - FxU8 regVal; - _outp(0x3d4, 0x3f); - regVal = _inp(0x3d5); - - if (!(regVal & (1 << 2))) /* we're not there */ - continue; - } - - hwInfo[numDevicesInSystem].vendorID = (FxU16) vId; - hwInfo[numDevicesInSystem].deviceID = (FxU16) dId; - hwInfo[numDevicesInSystem].devNumber = numDevicesInSystem; - hwInfo[numDevicesInSystem].hwClass = INIT_VG96; - - /* SST-96 initialization also retrieves board configuration info */ -#if 0 - init96MapBoard(&hwInfo[numDevicesInSystem].regs, - &hwInfo[numDevicesInSystem].hwDep.vg96Info, - (FxU16) vId, (FxU16) dId); -#else - initMapBoard(numDevicesInSystem); -#endif - - hwInfo[numDevicesInSystem].hwDep.vg96Info.vgaBaseAddr = - (FxU32)hwInfo[numDevicesInSystem].regs.hwDep.VG96RegDesc.partnerRegPtr; - hwInfo[numDevicesInSystem].hwDep.vg96Info.vg96BaseAddr = - (FxU32)hwInfo[numDevicesInSystem].regs.hwDep.VG96RegDesc.baseAddress; - - numDevicesInSystem++; - } -#else -# error "Do hardware enumeration for this chip!" -#endif - } - } - - - /* Sanity Check for SLI detection */ - for( device = 0; device < numDevicesInSystem; device++ ) { - if ( hwInfo[device].hwClass == INIT_VOODOO && - hwInfo[device].hwDep.vgInfo.sliDetect && - hwInfo[device].hwDep.vgInfo.slaveBaseAddr == 0 ) { - hwInfo[device].hwDep.vgInfo.sliDetect = FXFALSE; - } - } - - /* Initialize all drivers */ - vgDriverInit( &contexts[INIT_VOODOO] ); - vg96DriverInit( &contexts[INIT_VG96] ); - h3DriverInit( &contexts[INIT_H3] ); - - - /* Mark the library as initialized */ - libInitialized = FXTRUE; - } - - if ( cb ) { - for( device = 0; device < numDevicesInSystem; device++ ) { - cb( &hwInfo[device] ); - } - } - return; -} /* initEnumHardware */ - -volatile FxU32* -initMapBoard(const FxU32 boardNum) -{ - volatile FxU32* retVal = NULL; - FxBool okP = (boardNum < INIT_MAX_DEVICES); - - if (okP) { - InitDeviceInfo* infoP = (hwInfo + boardNum); - const FxU32 vId = infoP->vendorID; - const FxU32 dId = infoP->deviceID; - -#if defined(SST1) - okP = ((vId == TDFXVID) && - (dId == SST1DID)); - - if (okP) { - retVal = sst1InitMapBoard(boardNum); - sst1InitRegisters((FxU32*)retVal); - } -#elif defined(SST96) - okP = (IS_CHIP(AT3D) || - IS_CHIP(MCRX)); - - if (okP) { - init96MapBoard(&infoP->regs, &infoP->hwDep.vg96Info, - (FxU16)vId, (FxU16)dId); - retVal = infoP->regs.hwDep.VG96RegDesc.baseAddress; - } -#else -#error "Need to define initMapBoard for this chip!" -#endif /* HW Check */ - } - - return retVal; -} - - -/*------------------------------------------------------------------- - Function: initClose - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Unmap all hardware and set library to unitialized state - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initClose( void ) { - if ( libInitialized ) { - unsigned i; - for ( i = 0; i < numDevicesInSystem; i++ ) { - /* Insert unmap code here */ /* FIXME!!!! */ - } - pciClose(); - libInitialized = FXFALSE; - } -} /* initClose */ - -/*------------------------------------------------------------------- - Function: initGetDeviceInfo - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Fills a user supplied area of memory with information describing - the a 3Dfx device. The device is identified on the bus by the unique - devNumber assigned by the library and revealed to the user through - initEnumHardware. - Arguments: - devNumber - number identifying device in system - info - pointer to user memory to be filled with dev info - Return: - FXTRUE - succeed - FXFALSE - one or both parameters invalid - -------------------------------------------------------------------*/ -FxBool -initGetDeviceInfo( FxU32 devNumber, InitDeviceInfo *info ) -{ - FxBool rv; - - if ( devNumber < numDevicesInSystem ) { - *info = hwInfo[devNumber]; - rv = FXTRUE; - } else { - rv = FXFALSE; - } - return rv; -} /* initGetDeviceInfo */ - - -/*------------------------------------------------------------------- - Function: initDeviceSelect - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Selects a 3Dfx device ( potentially from among many in the system ) and - initializes the internal init driver functions with behavior appropriate - to the type of the selected device. - Arguments: - devNumber - unique number assigned to each device by initEnumHardware - Return: - FXTRUE - success - FXFALSE - invalide device number - -------------------------------------------------------------------*/ - -FxBool -initDeviceSelect( FxU32 devNumber ) -{ - FxBool rv = FXFALSE; - - if ( devNumber < numDevicesInSystem ) { - context = &contexts[hwInfo[devNumber].hwClass]; - context->info = hwInfo[devNumber]; - rv = FXTRUE; - } - - return rv; - -}/* initDeviceSelect */ - -/*------------------------------------------------------------------- - Function: initSetWriteMethod - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Sets up a register write method that respects the fifo conventions - of the hardware. - Arguments: - wcb - callback to be used to do direct writes from init code - Return: - none - -------------------------------------------------------------------*/ -void initSetWriteMethod( InitWriteCallback *wcb ) { - if ( context ) - context->writeMethod = wcb; - return; -} /* initSetWriteMethod */ - - - -/*------------------------------------------------------------------- - Function: initSetVideo - Date: 10/9 - Implementor(s): jdt, murali - Library: init - Description: - This will initialize the video, and allocate color and aux buffers - prior to rendering. - Arguments: - hwnd - pointer to a window handle or null. If NULL, then - the application window handle will be inferred though - the GetActiveWindow() api. - resolution - either one of the pre-defined glide resolutions, - or GR_RESOLUTION_NONE, in which case the window - size is inferred from the size application window - refresh - requested fullscreen refresh rate, ignored in a window - format - requested ccolor format for glide packed color values - origin - location of coordinate origin either upper left or - lower right - nColBuffers - number of color buffers to attempt to allocate - 0 - meaningless - 1 - allocate a front buffer only - 2 - allocate a front and back buffer - 3 - allocate a front, back, aux buffer for tripple buffering - nAuxBuffers - number of aux buffers to attempt to allocate - 0 - no alpha or z buffers - 1 - allocate one aux buffer for alpha/depth buffering - 2 - allocate on depth and one alpha buffer ( unsup ) - xres - x resolution return val ( for user windows ) - yres - y resolution return val ( for user windows ) - fbStride - stride in pixels of frame buffer - Return: - FXTRUE - all resources requested where allocated - FXFALSE - some or all resources were not available. By comparing - desc before and after call, the user can determine which - resources were denied. - -------------------------------------------------------------------*/ -FxBool initSetVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - FxBool rv; - if ( context ) { - rv = context->setVideo( hWnd, sRes, vRefresh, cFormat, - yOrigin, nColBuffers, nAuxBuffers, - xres, yres, fbStride, vidTimings); - } else { - rv = FXFALSE; - } - return rv; -} /* initSetVideo */ - - -/*------------------------------------------------------------------- - Function: initRestoreVideo - Date: 10/16 - Implementor(s): jdt - Library: init - Description: - Restore video to its state prior to initSetVideo - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initRestoreVideo( void ) { - if ( context ) - context->restoreVideo(); -} /* initRestoreVideo */ - -/*------------------------------------------------------------------- - Function: initEnableTransport - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Enable the command transport mechanism for the underlying - hardware and return information about accessing the transport - to the caller - Arguments: - info - data structure describing state of transport - Return: - FXTRUE - successfully enabled the command transport - FXFALSE - failed ot enable the command transport - -------------------------------------------------------------------*/ -FxBool initEnableTransport( InitFIFOData *info ) { - FxBool rv; - if ( context ) { - rv = context->enableTransport( info ); - } else { - rv = FXFALSE; - } - return rv; -} /* initEnableTransport */ - -/*------------------------------------------------------------------- - Function: initDisableTransport - Date: 10/17 - Implementor(s): jdt - Library: init - Description: - Return transport control to reset state - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initDisableTransport( void ) { - if ( context ) - context->disableTransport(); -} /* initDisableTransport */ - -/*------------------------------------------------------------------- - Function: initSwapBuffers - Date: 10/9 - Implementor(s): jdt, murali - Library: init - Description: - Initiate a buffer swap. - Arguments: - code - code describing type of swap, wether to sync to vretrace, how - many vretraces to wait, etc. - -------------------------------------------------------------------*/ -void initSwapBuffers( FxU32 code ) { - if ( context ) - context->swapBuffers( code ); -} /* initSwapBuffers */ - -/*------------------------------------------------------------------- - Function: initStatus - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Returns the status word from the hardware - Arguments: - none - Return: - 32-bit status word ( chip specific ) - -------------------------------------------------------------------*/ -FxU32 initStatus( void ) { - FxU32 rv; - if ( context ) { - rv = context->status(); - } else { - rv = 0; - } - return rv; -} /* initStatus */ - -/*------------------------------------------------------------------- - Function: initBusy - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - return true if hardware is busy rendering - Arguments: - none - Return: - FXTRUE - if busy - FXFALSE - if idle - -------------------------------------------------------------------*/ -FxBool initBusy( void ) { - FxBool rv; - if ( context ) { - rv = context->busy(); - } else { - rv = FXTRUE; - } - return rv; -} /* initBusy */ - -/*------------------------------------------------------------------- - Function: initIdle - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Returns only when graphics pipeline is completely idle. - May hang software if hardware is permanently busy. - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -void initIdle( void ) { - if ( context ) - context->idle(); -} /* initIdle */ - -/*------------------------------------------------------------------- - Function: initGetBufferPtr - Date: 2/25 - Implementor(s): jdt - Library: Init - Description: - Get the current pointer to a particular buffer - Arguments: - buffer - which buffer to get pointer to - Return: - integer pointer - -------------------------------------------------------------------*/ -void *initGetBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - if ( context ) - return context->getBufferPtr( buffer, strideBytes ); - else - return 0; -} /* initGetBufferPtr */ - -/*------------------------------------------------------------------- - Function: initRenderBuffer - Date: 2/25 - Implementor(s): jdt - Library: init - Description: - Sets the current render buffer - Arguments: - buffer - which buffer to render to ( front or back ) - Return: - none - -------------------------------------------------------------------*/ -void initRenderBuffer( InitBuffer_t buffer ) { - if ( context ) context->renderBuffer( buffer ); - return; -} /* initRenderBuffer */ - -/*------------------------------------------------------------------- - Function: initOrigin - Date: 2/25 - Implementor(s): jdt - Library: init - Description: - Set the yorigin - Arguments: - origin - origin designation - Return: - none - -------------------------------------------------------------------*/ -void initOrigin( InitOriginLocation_t origin ) { - if ( context ) context->origin( origin ); - return; -} /* initOrigin */ - -/*------------------------------------------------------------------- - Function:initIOCtl - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - CYA function so that emergency functionality may be added w/o - corrupting dll interface - Arguments: - token - describes IOCTL function - argument - pointer to arguments - Return: - none - -------------------------------------------------------------------*/ -void initIOCtl( FxU32 token, void *argument ) { - if ( context ) - context->ioCtl( token, argument ); -} /* initIOCtl */ - -/*------------------------------------------------------------------- - Function: initControl - Date: 10/9 - Implementor(s): murali - Library: init - Description: - This will re-attach new buffers for the rendering context, used - typically only in a windowing system where buffers need to move - and resize. Also, implicitly detach old associated buffers. - Arguments: - XXX - Return: - FXTRUE - all resources requested where allocated - FXFALSE - some or all resources were not available. By comparing - desc before and after call, the user can determine which - resources were denied. - -------------------------------------------------------------------*/ -FxBool initControl( FxU32 code) -{ - - FxBool rv; - - GDBG_INFO((80, "initControl: code = %d, context=%.08x\n", code, context)); - if ( context ) { - rv = context->control( code ); - } else { - rv = FXFALSE; - } - return rv; -} /* initControl */ - -/*------------------------------------------------------------------- - Function: initWrapFIFO - Date: 13-Feb-97 - Implementor(s): dow - Library: init - Description: - Reset the command transport when the fifo is full - Arguments: - pointer to fifo data - Return: - none - -------------------------------------------------------------------*/ -FxBool initWrapFIFO(InitFIFOData *fifoData) { - if ( context ) - return context->wrapFIFO(fifoData); - else - return FXFALSE; -} /* initWrapFIFO */ - -/*------------------------------------------------------------------- - Function: initGamma - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - SST-1 holdover function which initializes the gamma table in some - video hardware to normalize monitor brightness - Arguments: - gamma - floating point gamma correction factor - Return: - none - -------------------------------------------------------------------*/ -void initGamma( double gamma ) { - if ( context ) - context->gamma( gamma ); -} /* initGamma */ - -/*------------------------------------------------------------------- - Function: initSliPciOwner - Date: 10/9 - Implementor(s): jdt - Library: init - Description: - Do some voodoo(tm) to change the owner of the PCI bus in an SLI - configuration - Arguments: - regbase - ask scott sellers - owner - ask scott sellers - Return: - none - -------------------------------------------------------------------*/ -void initSliPciOwner( FxU32 *regbase, FxU32 owner ) { - if ( context ) - context->sliPciOwner( regbase, owner ); -} /* initSliPciOwner */ - - -/*------------------------------------------------------------------- - Function: initNumBoardsInSystem - Date: 19970813 - Implementor(s): pgj - Library: init - Description: - Computes the number of boards compatible with the hardware the init - library is compiled for, i.e. this will count either the number - of VG xor Rush cards present. - Return: - number of boards found - -------------------------------------------------------------------*/ -FxU32 initNumBoardsInSystem(void) -{ - FxU32 numBoards, j, n; - - if(getenv(("SST_BOARDS"))) { - numBoards = atoi(getenv(("SST_BOARDS"))); - } else { - numBoards = 0; -#if defined(SST1) - for(j=0; jgammaRGB( r, g, b ); - return FXFALSE; -} /* initGammaRGB */ - -/*------------------------------------------------------------------- - Function: initGammaTable - Date: Mar-2-98 - Implementor(s): atai - Library: init - Description: - initialize Gamma table givin RGB table - Arguments: - Return: - none - -------------------------------------------------------------------*/ -FxBool initGammaTable(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b) { - if ( context ) - return context->initGammaTable( nentries, r, g, b ); - return FXFALSE; -} /* initGammaTable */ - -/*------------------------------------------------------------------- - Function: initFindVideoTimingStruct - Date: Mar-2-98 - Implementor(s): atai - Library: init - Description: - find video timing structure - Arguments: - Return: - none - -------------------------------------------------------------------*/ -sst1VideoTimingStruct *initFindVideoTimingStruct(GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - if ( context ) - return context->findVidTimingStruct( sRes, vRefresh ); - return NULL; -} /* initGamma */ - diff --git a/glide2x/sst1/init/init.h b/glide2x/sst1/init/init.h deleted file mode 100644 index f170f59..0000000 --- a/glide2x/sst1/init/init.h +++ /dev/null @@ -1,403 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#ifndef _TINI_H_ -#define _TINI_H_ - -#include <3dfx.h> -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*------------------------------------------------------- - Constants - -------------------------------------------------------*/ -/* - More slots than you will ever see in a consumer system - */ -#define INIT_MAX_DEVICES 8 - -/*--IOCTLs-----------------------------------------------*/ - /* An IOCTL value is appliacable on all systems where the the - associated value is ORed into the low eight bits. The reason for - this is so that code that calls the init code can do IOCTLs - without worrying about conditional compilation for device - dependance. So, the form of an IOCTL is: - - #define INIT_FOO_IOCTL \ - ((hw1 | hw2 | ... | hwn) | (number << INIT_OCTL_VALUE_SHIFT)) - - Remember, this isn't really an I/O control, but rather a back - door for whatever we've forgotten, or whatever may only apply to - a small-enough subset of 3Dfx hardware that it doesn't justify - modifying the init API. - */ -#define INIT_IOCTL_SST1 0x01 -#define INIT_IOCTL_SST96 0x02 -#define INIT_IOCTL_SST97 0x04 - - -#define INIT_IOCTL_VALUE_SHIFT 0x8 - -#define INIT_VIDTIMINGS_IOCTL \ - (INIT_IOCTL_SST1 | (0x1 << INIT_IOCTL_VALUE_SHIFT)) - - /* - Vendor IDs and Device IDs - */ -/* 3Dfx Voodoo Graphics */ -#define TDFXVID 0x121A -#define SST1DID 0x01 - -/* Alliance AT3D */ -#define AT3DVID 0x1142 -#define AT3DDID 0x643d - -/* Trident T96851 */ -#define T968VID 0x1023 -#define T968DID 0x9660 - -/* MRTI M510 */ -#define MRTIVID 0x1293 -#define MRTIDID 0x0510 - -/* Macronix MX86251 Fixme!!! these are bogus !!! XXX ??? */ -#define MCRXVID 0x10d9 -#define MCRXDID 0x8626 - -/* - * (* Murali's comments *) - * - * Note that *EVERY* one of the following 3 definitions have an exact - * counterpart in glide.h. - * - * We could have used the glide definitions, but that would affect layering - * glide/src/ * on top of this sst1/init/ * library. So, we use these - * redundant defintions, and let glide/src/ * translate from glide.h to - * init.h defintions. (Note that translation is simply a typecast). - * - * The only exception that proves this rule is sst1vid.h, where something - * used in the init library (GrScreenResolution_t, GrScreenRefresh_t) - * is exposed to the glide application from sst1vid.h, WHICH LIVES IN - * THIS DIRECTORY, so we can use these typedefs here directly. - * - * Here are the relevant counterparts in init.h and glide.h: - * - * initBuffer_t GrBuffer_t - * initOriginLocation_t GrOriginLocation_t - * initColorFormat_t GrColorFormat_t - * initBufDesc_t ??? (GrBufDesc_t) - * - * - * PLEASE PLEASE PLEASE - * Make sure that the correspondence is exact. - */ -typedef FxU32 InitBuffer_t; -#define INIT_BUFFER_FRONTBUFFER 0x0 -#define INIT_BUFFER_BACKBUFFER 0x1 -#define INIT_BUFFER_AUXBUFFER 0x2 -#define INIT_BUFFER_DEPTHBUFFER 0x3 -#define INIT_BUFFER_ALPHABUFFER 0x4 -#define INIT_BUFFER_TRIPLEBUFFER 0x5 - -#define INIT_BUFFER_FIFOBUFFER 0x6 -#define INIT_BUFFER_SCREENBUFFER 0x7 -#define INIT_BUFFER_TEXTUREBUFFER 0x8 -#define INIT_BUFFER_NONE 0xff - -typedef FxU32 InitOriginLocation_t; -#define INIT_ORIGIN_UPPER_LEFT 0x0 -#define INIT_ORIGIN_LOWER_LEFT 0x1 - -typedef FxI32 InitColorFormat_t; -#define INIT_COLORFORMAT_ARGB 0x0 -#define INIT_COLORFORMAT_ABGR 0x1 -#define INIT_COLORFORMAT_RGBA 0x2 -#define INIT_COLORFORMAT_BGRA 0x3 - -typedef FxI32 InitSmoothingMode_t; -#define INIT_SMOOTHING_DISABLE 0x0 -#define INIT_SMOOTHING_ENABLE 0x1 - -typedef FxU32 InitControl_t; -#define INIT_CONTROL_ACTIVATE 0x1 -#define INIT_CONTROL_DEACTIVATE 0x2 -#define INIT_CONTROL_RESIZE 0x3 -#define INIT_CONTROL_MOVE 0x4 - -typedef struct _InitBufDesc_t { - FxU32 bufMagic; - InitBuffer_t bufType; - FxU32 bufOffset; - FxI32 bufStride; - FxU32 bufBPP; /* bits per pixel */ -} InitBufDesc_t; - -/*------------------------------------------------------- - Data Structures - -------------------------------------------------------*/ - - -/*------------------------------------------------------------------- - Structure: VGInfo - Date: 10/4/96 - Implementor(s): jdt - Library: Init - Description: - Drescribes the capabilities of a standard Voodoo Graphics chip. - Members: - pfxRev - pixelFx chip rev - pfxRam - frame buffer ram - nTFX - number of texelFx chips - tfxRev - texelFx revision - tfxRam = texelFx ram - sliDetect - scan line interleave configuration detected - -------------------------------------------------------------------*/ -typedef struct _VGInfo { - FxU32 vgBaseAddr; - FxU32 pfxRev; - FxU32 pfxRam; - FxU32 nTFX; - FxU32 tfxRev; - FxU32 tfxRam; - FxBool sliDetect; - FxU32 slaveBaseAddr; -} VGInfo; - -/*------------------------------------------------------------------- - Structure: VG96Info - Date: 10/4/96 - Implementor(s): jdt - Library: Init - Description: - Describes the capabilities of VG 96 accelerated VGA board - Members: - vgaChip - code describing partner VGA part - 0 - undefined - 1 - Alliance AT3D - 2 - Trident T9685 - 3 - MRTI MR510 - 4 - Macronics MX 86251 - vg96Rev - revision of VG96 chip - vg96Ram - frame buffer ram - nTFX - number of texelFx chips - tfxRev - texelFx revision - tfxRam - texelFx ram - -------------------------------------------------------------------*/ -typedef struct _VG96Info { - FxU32 vgaBaseAddr; - FxU32 vg96BaseAddr; - FxU32 vgaChip; - FxU32 vg96Rev; - FxU32 vg96Ram; - FxU32 nTFX; - FxU32 tfxRev; - FxU32 tfxRam; -} VG96Info; - -/*------------------------------------------------------------------- - Structure: H3Info - Date: 10/4 - Implementor(s): jdt - Library: Init - Description: - Capabilities of H3 - Members: - h3Rev - revision of H3 - fbRam - frame buffer ram - texRam - texture ram - -------------------------------------------------------------------*/ -typedef struct _H3Info { - FxU32 h3Rev; - FxU32 fbRam; - FxU32 texRam; -} H3Info; - -typedef enum { INIT_VOODOO, - INIT_VG96, - INIT_H3, - NUM_3DFX_PRODUCTS -} TDFXHwClass; - -typedef struct _InitRegisterDesc { - union { - struct { - FxU32 - *baseAddress, /* Base address */ - *slavePtr; /* Scanline interleaved slave */ - } VGRegDesc; - struct { - volatile FxU32 - *baseAddress, /* Base address */ - *partnerRegPtr, /* Partners' registers */ - *serialStatus, /* Serial Status register */ - *fifoApertureBase; /* Ptr to base of FIFO apurture */ - - FxU8 mclockHi; - FxU8 mclockLo; - } VG96RegDesc; - struct { - FxU32 - *baseAddress; /* Base address */ - } BansheeRegDesc; - } hwDep; -} InitRegisterDesc; - -/*------------------------------------------------------------------- - Structure: InitDeviceInfo - Date: 10/4 - Implementor(s): jdt - Library: Init - Description: - Describes a 3Dfx enabled hardware device in a system. Includes - the device number which will uniquely identify this device in the - current system configuration - Members: - devNumber - unique device number - class - - -------------------------------------------------------------------*/ -typedef struct _InitDeviceInfo { - FxU32 devNumber; - TDFXHwClass hwClass; - FxU16 - vendorID, deviceID; - union { - VGInfo vgInfo; - VG96Info vg96Info; - H3Info h3Info; - } hwDep; - InitRegisterDesc regs; -} InitDeviceInfo; - - -typedef FxU32 InitSwapType_t; -#define INIT_SWAP_FLIP 0x0 -#define INIT_SWAP_BLT 0x1 - -typedef struct _InitFIFOData { - FxU32 - cpuType; /* 5 for Pentium, 6 for Pentium Pro */ - union { - struct { - FxU32 fifoFree; - FxU32 memFifoStatusLwm; - } vgFIFOData; - struct { - volatile FxU32 - *fifoVirt, /* linear address of FIFO Start */ - fifoMax, /* Max linear address in FIFO */ - fifoPhys, /* Physical location of FIFO */ - fifoCur, /* Current Wrap */ - *fifoPtr, /* Pointer to current FIFO entry */ - fifoSize; /* Size of FIFO in bytes */ - -#if SST96_ALT_FIFO_WRAP - /* dpc - 10 sep 1997 FixMe! - - * I need to pass the init code the block size that I want to - * write, but I don't want to change the interface out from - * everyone else. If we re-visit the init code interface then - * fix me then. - */ - FxI32 blockSize; - - FxU32 fifoRead; /* Last known hw read ptr */ - FxI32 roomToReadPtr; /* # of bytes to fifoRead */ - FxI32 roomToEnd; /* # of bytes to fifoEnd */ - - InitRegisterDesc* regDesc; -#endif /* SST96_ALT_FIFO_WRAP */ - - FxBool - fifoLfb; /* LFB FIFO or alternate? */ - } vg96FIFOData; - } hwDep; -} InitFIFOData; - -/*------------------------------------------------------- - Hardware Independant Setup Calls - -------------------------------------------------------*/ -typedef FxBool InitHWEnumCallback( const InitDeviceInfo *info ); -typedef void InitWriteCallback( FxU32 *linaddr, FxU32 val ); - -void initEnumHardware( InitHWEnumCallback *cb ); -volatile FxU32* initMapBoard(const FxU32 boardNum); -void initClose (void); -FxBool initGetDeviceInfo( FxU32 devNumber, InitDeviceInfo *info ); -FxBool initDeviceSelect( FxU32 devNumber ); - -/*------------------------------------------------------- - Driver Calls - -------------------------------------------------------*/ -void initSetWriteMethod( InitWriteCallback *wcb ); -FxBool initSetVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings); -void initRestoreVideo( void ); - -FxBool initEnableTransport( InitFIFOData *info ); -void initDisableTransport( void ); - -void initSwapBuffers( FxU32 code ); -FxU32 initStatus( void ); -FxBool initBusy( void ); -void initIdle( void ); -void *initGetBufferPtr( InitBuffer_t buffer, int *strideBytes ); -void initRenderBuffer( InitBuffer_t buffer ); -void initOrigin( InitOriginLocation_t origin ); -void initIOCtl( FxU32 token, void *argument ); -FxBool initControl (FxU32 code); -FxBool initWrapFIFO(InitFIFOData *fifoData); - -/* SST-1 Flotsam */ -void initGamma( double gamma ); -void initSliPciOwner( FxU32 *regbase, FxU32 owner ); -FxU32 initNumBoardsInSystem( void ); - -const char* -myGetenv(const char*); - -/* -** Glide 3 init functions -*/ -FxBool initGammaRGB( double r, double g, double b ); -FxBool initGammaTable(FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b); -sst1VideoTimingStruct *initFindVideoTimingStruct(GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) ; - -#ifdef __cplusplus -} -#endif - -#endif /* _TINI_H_ */ diff --git a/glide2x/sst1/init/init96/atvga.h b/glide2x/sst1/init/init96/atvga.h deleted file mode 100644 index accc8ba..0000000 --- a/glide2x/sst1/init/init96/atvga.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - - -#ifndef __ATVGA_H__ -#define __ATVGA_H__ - -/* -** $Revision$ -** $Date$ -** -*/ - -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VR_IS1_DISPLAY_INACTIVE (1 << 0) -#define VR_IS1_DISPLAY_VRETRACE (1 << 3) - -#define VGA_REGISTER_SEQUENCER 0x3C4 -#define AR_SEQ_REMAP_CONTROL 0x1B /* 6 */ -#define AR_SEQ_FLAT_MODEL_CONTROL 0x1C /* 6 */ -#define AR_SEQ_ALTERNATE_ACCESS_POINTER 0x1D /* 8 */ -#define AR_SEQ_ALTERNATE_ACCESS_DECODE_LO_INDEX 0x1E /* 8 */ -#define AR_SEQ_ALTERNATE_ACCESS_DECODE_HI_INDEX 0x1F /* 8 */ - - -#define MMEXT_REGISTER_WINDOW0_CONTROL 0x082 -#define MMEXT_REGISTER_WINDOW0_BASE_ADDRESS 0x084 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_HORIZONTAL_1 0x086 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_HORIZONTAL_2 0x088 -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_VERTICAL_1 0x08A -#define MMEXT_REGISTER_WINDOW0_STRETCH_FACTOR_VERTICAL_2 0x08C -#define MMEXT_REGISTER_WINDOW_SEQUENCE_CONTROL 0x08E - -#define MMEXT_REGISTER_DISPLAY_MEMORY_CONFIGURATION 0x0C4 /* 12 */ - -#define MMEXT_REGISTER_PIXEL_FIFO_REQUEST_POINT 0xD4 /* 24 */ -#define MMEXT_REGISTER_ENABLE_EXTENDED_REGISTERS 0x0DB /* 4 */ -#define AR_ENABLE_DOS_SPACE 0x01 -#define AR_ENABLE_LINEAR_SPACE 0x02 -#define AR_ENABLE_COPROCESSOR_APERTURE 0x04 -#define AR_ENABLE_SECOND_LINEAR_APERTURE 0x08 - -#define MMEXT_REGISTER_MCLK_CONTROL 0x0E8 /* 8 */ -#define MMEXT_REGISTER_MCLK_DENOMINATOR 0x0E9 /* 8 */ -#define MMEXT_REGISTER_MCLK_NUMERATOR 0x0EA /* 8 */ - -#define MMEXT_REGISTER_SERIAL_INPUT 0x1F4 /* 16 */ - -#define MMEXT_REGISTER_TILE 0x200 -#define TILE_REGISTER_CONTROL 0x00 -#define TILE_REGISTER_DISPLAY_POSITION_LEFT 0x02 -#define TILE_REGISTER_DISPLAY_POSITION_RIGHT 0x04 -#define TILE_REGISTER_DISPLAY_POSITION_BOTTOM 0x06 -#define TILE_REGISTER_DATA_WIDTH 0x08 -#define TILE_REGISTER_DATA_BASE_LOCATION_LO 0x0A -#define TILE_REGISTER_DATA_BASE_LOCATION_HI 0x0C - -#define VGA_CRTC_INDEX 0x3D4 -#define VGA_CRTC_DATA 0x3D5 -#define VCRTC_SERIAL_START_ADDRESS_HI 0x0C -#define VCRTC_SERIAL_START_ADDRESS_LO 0x0D -#define ATCRTC_SERIAL_OVERFLOW 0x1C -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#endif - diff --git a/glide2x/sst1/init/init96/dxdrvr.c b/glide2x/sst1/init/init96/dxdrvr.c deleted file mode 100644 index b0cfd26..0000000 --- a/glide2x/sst1/init/init96/dxdrvr.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Log$ - * - * 34 1/12/98 10:22p Dow - * H3D Stereo Support - * - * 33 11/06/97 9:51a Jdt - * Fixes window resize events to not crash/hang - * - * 32 10/01/97 3:21p Atai - * fix 819, DOS tests flicker on glide - * - * 31 9/08/97 12:05p Atai - * fixed resize problem in dxControl() - * - * 30 8/28/97 10:24a Odo - * moved debugging varaible - * - * 29 8/27/97 10:32a Dow - * added more debugging info - * - * 28 8/21/97 4:24p Dow - * Fixed @#$%! C++ Comments, Added Debugging info -** -** $Revision$ -** $Date$ -** -*/ - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#ifdef __DOS32__ -#include -#endif - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#define VG96_BUF_MAGIC 0x666 - -FxBool tripleBuffering = 0; - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "INIT_BUFFER_FRONTBUFFER", - "INIT_BUFFER_BACKBUFFER", - "INIT_BUFFER_AUXBUFFER", - "INIT_BUFFER_DEPTHBUFFER", - "INIT_BUFFER_ALPHABUFFER", - "INIT_BUFFER_TRIPLEBUFFER", - "INIT_BUFFER_FIFOBUFFER", - "INIT_BUFFER_SCREENBUFFER", - "INIT_BUFFER_TEXTUREBUFFER" -}; -#endif - -#if defined( __WIN32__) && defined(INIT_ACCESS_DDRAW) -#define WIN32_LEAN_AND_MEAN -#include -#include - -#define NUM_BUFS 6 - -static HWND hWndApp = 0; -static FxU32 FifoOffset = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static InitBufDesc_t BufDesc[NUM_BUFS] = {0}; -#ifdef H3D -static int pageFlip = 0; -#endif - -/* Direct Draw stuff */ -static LPDIRECTDRAWCLIPPER lpClipper = NULL; -static LPDIRECTDRAWSURFACE lpFront = NULL; -static LPDIRECTDRAWSURFACE lpBack = NULL; -static LPDIRECTDRAWSURFACE lpAux = NULL; -static LPDIRECTDRAWSURFACE lpTriple = NULL; -static LPDIRECTDRAW2 lpDD = NULL; -static LPDIRECTDRAW lpDD1 = NULL; - - - -FxBool -ErrorMessage(HWND hWnd, char *err) -{ - GDBG_INFO((0, "Error %s \n", err)); -// MessageBox( hWnd, err, "ERROR", MB_OK ); - return FALSE; -} /* ErrorMessage */ - - - -/* - * Takes a DirectDraw Surface object (LPDIRECTDRAWSURFACE), looks up its - * description (DDSURFACEDESC), and returns a pointer to the surface and its - * stride value in pDesc. - */ -FxBool -_dxSurfaceToBufDesc(LPDIRECTDRAWSURFACE lpSurf, InitBufDesc_t *pDesc) -{ - DDSURFACEDESC ddsd; - - ddsd.dwSize = sizeof(ddsd); - if (IDirectDrawSurface2_Lock(lpSurf, NULL, &ddsd, DDLOCK_WAIT, NULL) - !=DD_OK) { - return ErrorMessage(hWndApp, "_dxSurfaceToBufDesc: DdrawSurface Lock failed\n"); - } - - /* pDesc->bufType should be filled in by caller */ - pDesc->bufOffset = (FxU32) (ddsd.lpSurface); /* virtual address. */ - pDesc->bufStride = (FxI32) (ddsd.lPitch); /* in bytes */ - pDesc->bufBPP = (FxI32) 16; - - IDirectDrawSurface2_Unlock(lpSurf, NULL); - return FXTRUE; -} /* _dxSurfaceToBufDesc */ - - - -/* - * Convert front, back and aux surfaces from DDraw to Glide bufDescriptors. - */ -FxBool -_dxDDrawToGlideDesc(InitBufDesc_t *pDesc) -{ - InitBufDesc_t *dFront = &pDesc[0]; - InitBufDesc_t *dBack = &pDesc[1]; - InitBufDesc_t *dAux = &pDesc[2]; - InitBufDesc_t *dFifo = &pDesc[3]; - InitBufDesc_t *dScreen = &pDesc[4]; - InitBufDesc_t *dTriple = &pDesc[5]; - - GDBG_INFO((80, "_dxDDrawToGlide entry\n")); - - /* Initialize all descriptors. */ - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - /* Get info about screen (primary display) */ - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - if (!_dxSurfaceToBufDesc( lpFront, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - *dFront = *dBack = *dAux = *dFifo = - *dTriple = - *dScreen; - - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - - /* Get info about back buffer */ - dBack->bufType = INIT_BUFFER_BACKBUFFER; - if (!_dxSurfaceToBufDesc( lpBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - - /* Get info about aux buffer */ - dAux->bufType = INIT_BUFFER_AUXBUFFER; - if (!_dxSurfaceToBufDesc( lpAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - - /* Get info about triple buffer */ - if (tripleBuffering) { - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - if (!_dxSurfaceToBufDesc( lpTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - } - - /* Get info about cmdFifo */ - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = FifoOffset; - dFifo->bufStride = 65536 << 1; /* Fixme!!! what's this? */ - - /* Now convert buf addresses for draw buffers into video memory offsets */ - dFront->bufOffset -= dScreen->bufOffset; - dBack ->bufOffset -= dScreen->bufOffset; - dAux ->bufOffset -= dScreen->bufOffset; - if (tripleBuffering) - dTriple->bufOffset -= dScreen->bufOffset; - - GDBG_INFO((80, "_dxDDrawToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset)); - GDBG_INFO((80, "_dxDDrawToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset)); - if (tripleBuffering) - GDBG_INFO((80, "_dxDDrawToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset)); - - GDBG_INFO((80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - return TRUE; -} /* _dxDDrawToGlideDesc */ - - - -/* - * Allocate (or re-allocate for WM_SIZE) buffers from DDraw. - */ -FxBool -#ifdef H3D -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc, int pageFlip) -#else -_dxAllocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc) -#endif -{ - DDSURFACEDESC ddsd; - -#ifdef H3D - GDBG_INFO((80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d, pageFlip=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh, pageFlip)); -#else - GDBG_INFO((80, "_dxAS: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh)); -#endif - - if (lpDD1 == NULL) { - if (DirectDrawCreate( NULL, &lpDD1, NULL ) != DD_OK) { - return ErrorMessage(hWndApp, "DirectDrawCreate Failed!"); - } else { - GDBG_INFO((80, "_dxAS: DDraw Obj created!\n")); - } - } else { - GDBG_INFO((80, "_dxAS: DDraw Obj already existed!\n")); - } - - if (IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, - (LPVOID*)&lpDD) !=DD_OK) { - - IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - lpDD = NULL; - return ErrorMessage(hWndApp, "DDraw2 interface object failed!"); - } else { - GDBG_INFO((80, "_dxAS: DDraw2 Obj created!\n")); - } - - /* - * Make sure this is done after creating direct draw object!!! - * First time, only one time, get ourselves a command fifo. - * Fix me - XXX - */ - if (FifoOffset == 0) { - FifoOffset = init96GetFBVram() - 65536*3; /* fixme!!! why 3? */ - } - - /* - * If there are any previously allocated surfaces, free them now - * before asking for more. - */ - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - if ( !IsFullScreen ) { /* In a window */ - - GDBG_INFO((80, "_dxAS: Allocating buffers for a windowed mode\n")); - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - if (IDirectDraw2_GetDisplayMode( lpDD, &ddsd ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get display mode!"); - - if (ddsd.ddpfPixelFormat.dwRGBBitCount / 8 != 2) - return ErrorMessage(hWndApp, "Display is not in 16bpp format!"); - - if (IDirectDraw2_SetCooperativeLevel(lpDD,hWndApp, DDSCL_NORMAL ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - GDBG_INFO((80, "_dxAS: Screen: xRes = %d, yRes = %d, stride = %d\n", - xRes, yRes, ddsd.lPitch)); - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Create Clipper failed!\n"); - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) - return ErrorMessage(hWndApp, "Clipper SethWnd failed!\n"); - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) - return ErrorMessage(hWndApp, "Set Clipper failed!\n"); - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate secondary surface!" ); - - GDBG_INFO((80, "_dxAS: Back buffer allocated!\n")); - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO((80, "_dxAS: Aux Buffer allocated!\n")); - - } else { - - /* Full screen - Set Exclusive Mode, change resolution, */ - GDBG_INFO((80, "_dxAS: Setting Full screen exclusive mode!\n")); - - if (IDirectDraw2_SetCooperativeLevel(lpDD, hWndApp, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set cooperative level!"); - - if (IDirectDraw2_SetDisplayMode( lpDD, xRes, yRes, 16, 0,0) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't set display mode!"); - - /* Allocate Front/Back Buffer Surfaces, skip triple buffer XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | - DDSCAPS_FLIP | - DDSCAPS_COMPLEX | - DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate primary surface!"); - - /* Get back buffer information */ - ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; - if (IDirectDrawSurface2_GetAttachedSurface( lpFront, &ddsd.ddsCaps, - &lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't get back buffer info!\n"); - - GDBG_INFO((80, "_dxAS: Full Screen: front/back buffer allocated!\n")); - - /* Allocate Aux Buffer Surface - XXX */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate aux surface" ); - - GDBG_INFO((80, "_dxAS: Full Screen: aux buffer allocated!\n")); - -/* - * Triple buffer hack: full-screen only for now. Allocate as Aux DD surf, - * after everything else N.B. Allocation order may be important!!! - * god knows how DD would implement dwBackBufferCount == 2 - */ - if (tripleBuffering) { - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpTriple, 0 ) != DD_OK) - return ErrorMessage(hWndApp, "Couldn't allocate triple buffer" ); - - GDBG_INFO((80, "_dxAS: Triple buffer allocated!\n")); - } - } - - /* Convert direct draw surfaces to Glide's idea of buffer descriptors */ - return _dxDDrawToGlideDesc(pDesc); -} /* _dxAllocSurfaces */ - -FxBool -_dxReallocSurfaces(int xRes, int yRes, int vRefresh, InitBufDesc_t *pDesc) - -{ - DDSURFACEDESC ddsd; - const char *errorMessage = "no error"; - - /* for now this is a goddamn baseball bat - it can be trimmed down */ - if ( !IsFullScreen ) { /* this *REALLY* should be called for fullscreen */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - - /* Verify screen pixel format is 16bpp, and set cooperative level */ - ddsd.dwSize = sizeof( ddsd ); - - /* Allocate Front Buffer Surface */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpFront, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate primary surface!"; - goto FUBAR; - } - - /* From jdt */ - if (IDirectDraw2_CreateClipper( lpDD, 0, &lpClipper, 0 ) != DD_OK) { - errorMessage = "Create Clipper failed!\n"; - goto FUBAR; - } - - if (IDirectDrawClipper_SetHWnd( lpClipper, 0, hWndApp ) != DD_OK) { - errorMessage = "Clipper SethWnd failed!\n"; - goto FUBAR; - } - - if (IDirectDrawSurface2_SetClipper( lpFront, lpClipper ) != DD_OK) { - errorMessage = "Set Clipper failed!\n"; - goto FUBAR; - } - - /* Always allocate back buffer. - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = - DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpBack, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate secondary surface!"; - goto FUBAR; - } - - /* - * Always allocate Aux Buffer Surface - * XXX - (use nAuxBuffers, and deal with 8bpp for alpha) - */ - ddsd.dwSize = sizeof( ddsd ); - ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsd.dwWidth = xRes; - ddsd.dwHeight = yRes; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY - | DDSCAPS_3DDEVICE; - - if (IDirectDraw2_CreateSurface( lpDD, &ddsd, &lpAux, 0 ) != DD_OK) { - errorMessage = "Couldn't allocate aux surface"; - goto FUBAR; - } - } - return _dxDDrawToGlideDesc(pDesc); -FUBAR: - /* if you don't free these you can't make another attempt */ - if( lpClipper) IDirectDrawClipper_Release( lpClipper); - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - if( lpTriple ) IDirectDrawSurface2_Release( lpTriple ); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - return ErrorMessage( hWndApp, (char*)errorMessage ); -} /* _dxReallocSurfaces */ - -/* - * Restore lost surfaces, or move the window. - * Note: Resizing is done by deleting and re-allocation, and is done in - * _dxAllocSurfaces(); - */ -static FxBool -_dxRestoreSurfaces(InitBufDesc_t *pDesc) -{ - if (lpDD == NULL) return TRUE; - - if (IDirectDrawSurface2_IsLost(lpFront) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpFront) != DD_OK) - return ErrorMessage(hWndApp, "Front Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpBack) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpBack) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - if (IDirectDrawSurface2_IsLost(lpAux) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpAux) != DD_OK) - return ErrorMessage(hWndApp, "Aux Buffer restore failure\n"); - } - - if (!IsFullScreen) { - if (IDirectDrawSurface2_IsLost(lpTriple) == DDERR_SURFACELOST) { - if (IDirectDrawSurface2_Restore(lpTriple) != DD_OK) - return ErrorMessage(hWndApp, "Back Buffer restore failure\n"); - } - } - - GDBG_INFO((80, "_dxRS: restore surfaces OK\n")); - return _dxDDrawToGlideDesc(pDesc); -} /* _dxRestoreSurfaces */ - -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - int i; - -#ifdef H3D - pageFlip = GR_RESOLUTION_IS_AUTOFLIPPED(sRes); - GDBG_INFO((80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d, pageFlip=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers, pageFlip )); -#else - GDBG_INFO((80, "dxOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers)); -#endif - - /* - * Get ourselves a valid window handle - */ - hWndApp = (hWindow == 0) ? GetActiveWindow() : (HWND) hWindow; - - if (hWndApp == NULL) { - return ErrorMessage(hWndApp, "VRush needs a valid window handle!\n"); - } - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - RECT rect; - - /* Find out how big the window is */ - GetClientRect(hWndApp, &rect); - IsFullScreen = FXFALSE; - Width = rect.right; - Height = rect.bottom; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; -#ifdef H3D - static int _w1[] = {640,800}; - static int _h1[] = {480,600}; -#endif - -#ifdef H3D - if ((sRes < GR_RESOLUTION_MIN) || - (sRes > GR_RESOLUTION_MAX) && - (!GR_RESOLUTION_IS_AUTOFLIPPED(sRes)) ) -#else - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_512x256)) -#endif - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; -#ifdef H3D - if (GR_RESOLUTION_IS_AUTOFLIPPED(sRes)) { - Width = _w1[sRes-GR_RESOLUTION_AUTOFLIPPED_MIN]; - Height = _h1[sRes-GR_RESOLUTION_AUTOFLIPPED_MIN]; - } else { - Width = _w[sRes]; - Height = _h[sRes]; - } -#else - Width = _w[sRes]; - Height = _h[sRes]; -#endif - } - - GDBG_INFO((80, "dxOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh)); - -#ifdef H3D - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc, pageFlip)) - return ErrorMessage(hWndApp, "failed dxOpen"); -#else - if (!_dxAllocSurfaces(Width, Height, vRefresh, BufDesc)) - return ErrorMessage(hWndApp, "failed dxOpen"); -#endif - - - GDBG_INFO((80, "_dxAllocSurfaces OK!!!\n")); - - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO((80, "dxOpen: pBufDesc[%d]: \n", i)); - GDBG_INFO((80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic)); - GDBG_INFO((80, "\tbufType = 0x%x\n", pBufDesc[i].bufType)); - GDBG_INFO((80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset)); - GDBG_INFO((80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride)); - GDBG_INFO((80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP)); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? INIT_SWAP_FLIP : INIT_SWAP_BLT; - - if ( curHALData->initSetVideo ) { - curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - } - - GDBG_INFO((80, "dxOpen: Returning TRUE\n")); - - return FXTRUE; - -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - RECT rect; - int i; - - GDBG_INFO((80, "dxControl: code = %d\n", code)); - - /* dx is not initizized */ - if ( lpDD== NULL ) { - return TRUE; - } - - /* Why was I called? */ - switch(code) { - case INIT_CONTROL_RESIZE: /* recreate surfaces */ - GetClientRect(hWndApp, &rect); - if ((Width != (FxU32) rect.right) || (Height != (FxU32) rect.bottom)) { - Width = rect.right; - Height = rect.bottom; - GDBG_INFO((120, "W and H changed to %d %d\n", - Width, Height)); - - if (!_dxReallocSurfaces(Width, Height, 0, BufDesc)) { - /* - Let's find some other way to do this! - ErrorMessage(hWndApp, "dxControl: Resize failed\n"); */ - return FXFALSE; - } - } - break; - - case INIT_CONTROL_MOVE: - break; - - case INIT_CONTROL_ACTIVATE: - GDBG_INFO((120, "dxControl: Activate\n")); - break; - - case INIT_CONTROL_DEACTIVATE: - GDBG_INFO((120, "dxControl: DeActivate\n")); - break; - - default: - GDBG_INFO((120, "dxControl: Strange control %d\n", code)); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO((80, "dxControl: code = %d, w = %d, h = %d\n", code, - Width, Height)); - - return FXTRUE; -} /* dxControl */ - -FxBool -dxClose() -{ - GDBG_INFO((80, "dxClose:\n")); -/* - * fixme! nulling out this code fixes bug 541... why is unclear??? XXX - * A little more information... the problem is releasing lpDD1, and - * only in fullscreen mode. Temporary refined hack is to not release - * lpDD1 in fullscreen mode. Also rearrange code in dxAllocSurfaces - * to only create lpDD1 once per application execution. /PGJ - */ -#if 1 - // Release any allocated buffers - if( lpClipper) IDirectDrawSurface2_Release( lpClipper); - if( lpFront ) IDirectDrawSurface2_Release( lpFront ); - if(!IsFullScreen) { - if( lpBack ) IDirectDrawSurface2_Release( lpBack ); - } - if( lpAux ) IDirectDrawSurface2_Release( lpAux ); - if( lpDD ) IDirectDraw2_Release( lpDD ); - if (1 /* !IsFullScreen */) { - if( lpDD1 ) IDirectDraw_Release( lpDD1 ); - lpDD1 = NULL; - } - - lpClipper = NULL; - lpFront = NULL; - lpBack = NULL; - lpTriple = NULL; - lpAux = NULL; - lpDD = NULL; - -#endif /* 0 */ - GDBG_INFO((80, "dxClose: Returning TRUE\n")); - return FXTRUE; -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ - static RECT dest, src; - static POINT point; - static HRESULT hr; - - GDBG_INFO((80, "dxSwap:\n")); - if ( !IsFullScreen ) { - GDBG_INFO((120, "Swap: using BLTs\n")); - - src.left = 0; - src.right = Width-1; - src.top = 0; - src.bottom = Height-1; - - dest = src; - point.x = 0; - point.y = 0; - ClientToScreen( hWndApp, &point ); - dest.left += point.x; - dest.right += point.x; - dest.top += point.y; - dest.bottom += point.y; - - hr = IDirectDrawSurface_Blt( lpFront, - &dest, - lpBack, - &src, - DDBLT_WAIT, - NULL ); - - while( IDirectDrawSurface_GetBltStatus( lpFront, DDGBS_ISBLTDONE ) != - DD_OK ); - - if ( hr != DD_OK ) { - ErrorMessage(hWndApp, "Couldn't blit!\n"); - } - } - return; - -} /* dxSwap */ -#else /* it's either DOS or the Hoopti Lab Setup */ -FxBool -dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ -#define FN_NAME "dxOpen" - InitBufDesc_t *dFront = &pBufDesc[0]; - InitBufDesc_t *dBack = &pBufDesc[1]; - InitBufDesc_t *dAux = &pBufDesc[2]; - InitBufDesc_t *dFifo = &pBufDesc[3]; - InitBufDesc_t *dScreen = &pBufDesc[4]; - InitBufDesc_t *dTriple = &pBufDesc[5]; - FxBool rv = FXTRUE; - FxU32 endAddr; - - /* !!! FIXME - this is a hack to get murali's bufferdesc into the code - * this whole file needs to be subsumed into init96.c. - * Still a hack, but I put some rouge on it /PGJ - */ - - GDBG_INFO((80, "%s: Resolution == 0x%x\n", FN_NAME, sRes)); - - switch (sRes) { - case GR_RESOLUTION_640x480: - *width = 640; - *height = 480; - break; - case GR_RESOLUTION_800x600: - *width = 800; - *height = 600; - break; - case GR_RESOLUTION_320x200: - *width = 320; - *height = 200; - break; - case GR_RESOLUTION_320x240: - *width = 320; - *height = 240; - break; - case GR_RESOLUTION_512x384: - *width = 512; - *height = 384; - break; - case GR_RESOLUTION_400x256: - case GR_RESOLUTION_640x200: - case GR_RESOLUTION_640x350: - case GR_RESOLUTION_640x400: - case GR_RESOLUTION_960x720: - case GR_RESOLUTION_856x480: - case GR_RESOLUTION_512x256: - case GR_RESOLUTION_NONE: - default: - GDBG_INFO((80, "%s: Unimplemented resolution\n", FN_NAME)); - break; - } - - -#define WAITLOOP {\ - volatile int waitfoo;\ - int waitcount;\ - for (waitcount = 0; waitcount < 500000; waitcount++){waitfoo = waitcount;}\ -} - -/* AT3D buffers need to be 4K (Intel) page-aligned */ -#define BUMP(x, y) (((x) + ((y)-1)) & ~((y)-1)) -#define BUMP_PAGE(x) (BUMP(x, 1<<12)) - - if ( curHALData->initSetVideo ) { - rv = curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - if ( !rv ) goto BAIL; - } - - /* Initialize all descriptors. */ - dFront->bufMagic = VG96_BUF_MAGIC; - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - dFront->bufOffset = 0; - dFront->bufStride = (*width)*2; - dFront->bufBPP = 16; - endAddr = BUMP_PAGE((*width)*(*height)*2); - - dBack->bufMagic = VG96_BUF_MAGIC; - dBack->bufType = INIT_BUFFER_BACKBUFFER; - dBack->bufOffset = endAddr; - dBack->bufStride = (*width)*2; - dBack->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - tripleBuffering = (nColBuffers == 3); - if (tripleBuffering) { - dTriple->bufMagic = VG96_BUF_MAGIC; - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - dTriple->bufOffset = endAddr; - dTriple->bufStride = (*width)*2; - dTriple->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - } - - dAux->bufMagic = VG96_BUF_MAGIC; - dAux->bufType = INIT_BUFFER_AUXBUFFER; - dAux->bufOffset = endAddr; - dAux->bufStride = (*width)*2; - dAux->bufBPP = 16; - endAddr = BUMP_PAGE(endAddr + (*width)*(*height)*2); - - dFifo->bufMagic = VG96_BUF_MAGIC; - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = endAddr; - dFifo->bufStride = 65536; - dFifo->bufBPP = 16; - - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - GDBG_INFO((80, "%s: dFront = 0x%x, dBack = 0x%x, dAux = 0x%x\n", - FN_NAME, dFront, dBack, dAux, dFifo)); - GDBG_INFO((80, "dxOpen: F:%.06x %5d B:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - -#ifdef GDBG_INFO_ON - { - int i; - - for (i = 0; i < 5; i++) { - GDBG_INFO((80, "%s: pBufDesc[%d] = 0x%x:\n", - FN_NAME, i, &pBufDesc[i])); - GDBG_INFO((80, "%s: pBufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[pBufDesc[i].bufType])); - GDBG_INFO((80, "%s: pBufDesc.bufOffset = 0x%x\n", - FN_NAME, pBufDesc[i].bufOffset )); - GDBG_INFO((80, "%s: pBufDesc.bufStride = 0x%x\n", - FN_NAME, pBufDesc[i].bufStride)); - GDBG_INFO((80, "%s: pBufDesc.bufBPP = 0x%x\n", - FN_NAME, pBufDesc[i].bufBPP)); - } - } -#endif - - *swapType = INIT_SWAP_FLIP; - -BAIL: - return rv; -#undef FN_NAME -} /* dxOpen */ - -FxBool -dxControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - return FXTRUE; -} /* dxControl */ -FxBool -dxClose() -{ -#define FN_NAME "dxClose" - GDBG_INFO((80, "%s: Setting up VESA mode 640*480*\n", FN_NAME)); -#ifdef __DOS32__ - { - union REGS r; - - memset(&r, 0, sizeof(r)); - - r.w.ax = 0x4f02; - r.w.bx = 0x3; - int386( 0x10, &r, &r ); - } -#endif - return FXTRUE; -#undef FN_NAME -} /* dxClose */ - -void -dxSwap(FxU32 code) -{ -} /* dxSwap */ -#endif /* __DOS32__ || (defined(__WIN32__) && !defined(INIT_ACCESS_DDRAW) */ - - diff --git a/glide2x/sst1/init/init96/fxinit96.h b/glide2x/sst1/init/init96/fxinit96.h deleted file mode 100644 index 60da89a..0000000 --- a/glide2x/sst1/init/init96/fxinit96.h +++ /dev/null @@ -1,136 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - - -#ifndef _FXINIT96_H_ -#define _FXINIT96_H_ - -#include <3dfx.h> -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __linux__ -FxBool dxOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nCol, - int nAux, - InitBufDesc_t *pBufDesc, - int *width, - int *height, - InitSwapType_t *swapType -); -FxBool dxControl(FxU32 control, InitBufDesc_t *pDesc, int *w, int *h); -FxBool dxClose(); -void dxSwap(FxU32 code); - -#else - -FxBool linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nCol, - int nAux, - InitBufDesc_t *pBufDesc, - int *width, - int *height, - InitSwapType_t *swapType -); -FxBool linControl(FxU32 control, InitBufDesc_t *pDesc, int *w, int *h); -FxBool linClose(); -void linSwap(FxU32 code); -void linFlip(FxU32 buffer); - -#endif - -typedef struct { - FxU32 memSize; - FxBool (FX_CSTYLE *initAperture) (InitRegisterDesc *rd); - FxBool (FX_CSTYLE *initSetVideo)( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr ); - FxBool (FX_CSTYLE *initEnableRegs)(InitRegisterDesc*rd); - FxBool (FX_CSTYLE *initDisableRegs)(InitRegisterDesc*rd); - FxBool (FX_CSTYLE *wrapFIFO) (InitRegisterDesc *rd, InitFIFOData *fifoData ); -#ifdef H3D - int (FX_CSTYLE *initUseTiles) (InitRegisterDesc *rd, FxU32 *buffers, FxU32 nBuffers, FxU32 stride, FxU32 Width, FxU32 Height, FxU32 AutoFlipped); -#else - int (FX_CSTYLE *initUseTiles) (InitRegisterDesc *rd, FxU32 *buffers, FxU32 nBuffers, FxU32 stride, FxU32 Width, FxU32 Height); -#endif - FxBool (FX_CSTYLE *initGetInfo)(VG96Info *info); - FxBool (FX_CSTYLE *initSwapTiles) (InitRegisterDesc *rd); - void *devPriv; /* Just in case */ -} Init96HALData; - -extern Init96HALData *curHALData; - -extern char *iRegNames[]; - -extern volatile FxU32 *sstHW; -extern volatile Sstregs *sstPtr; - -/*----------------- SST96 access macros----------------------*/ - -/* NOTE: - - This code is HIGHLY important to debugging. Delete it at your - extreme peril. - */ -#define GETINDEX(a) ((((FxU32) &a) - (((FxU32) sstHW) + 0x400000)) >> 2) -/* This is the ONE TRUE WAY to read FBI Jr. registers. Don't mess - with it!!! */ -#define GETREADADDR(s) ((FxU32 *) (((FxU32) sstHW) + 0x400000 + (GETINDEX(s) << 12))) -#define GETINDEXFROMADDR(a) ((((FxU32) a) - (((FxU32) sstHW + 0x400000))) >> 2) -#define GETREADADDR2(s) ((FxU32 *) (((FxU32) sstHW) + 0x400000 + (GETINDEXFROMADDR(s) << 12))) - -#undef SET -#undef GET -#undef SETF -#undef GETF - -#ifdef GDBG_INFO_ON -#define SET(d,s)\ -GDBG_INFO((80, "SET: Register: %s (0x%x) = 0x%x\n",\ - iRegNames[GETINDEX(d)], GETINDEX(d), s));\ -(d) = (s); -#define GET(s) get96(&s) - -#else -#define SET(d,s) (d) = (s) -#define GET(s) *(GETREADADDR(s)) -#endif - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/glide2x/sst1/init/init96/init96.c b/glide2x/sst1/init/init96/init96.c deleted file mode 100644 index 7024d40..0000000 --- a/glide2x/sst1/init/init96/init96.c +++ /dev/null @@ -1,2241 +0,0 @@ -/* - ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - ** FULL TEXT OF THE NON-WARRANTY PROVISIONS. - ** - ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - ** THE UNITED STATES. - ** - ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - ** $Revision$ - ** $Date$ - ** - */ -static char revString[] = "@#%$Workfile: INIT96.C $ $Revision$"; - -/* ANSI Headers */ -#include -#include -#include - -#if defined(__DOS32__) || defined(INIT96VGASWAP) -#include -#endif - -#ifdef __DOS32__ -#include -#endif - -#ifdef __WIN32__ -#include -#endif - -#ifdef INIT96VGASWAP -#include "initvga.h" -#endif - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#endif - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#include "initat3d.h" -#if 0 -#include "init9685.h" -#include "initmrti.h" -#endif -#include "initmcrx.h" - -#ifdef GDBG_INFO_ON -static char *bufTypeNames[] = { - "INIT_BUFFER_FRONTBUFFER", - "INIT_BUFFER_BACKBUFFER", - "INIT_BUFFER_AUXBUFFER", - "INIT_BUFFER_DEPTHBUFFER", - "INIT_BUFFER_ALPHABUFFER", - "INIT_BUFFER_TRIPLEBUFFER", - "INIT_BUFFER_FIFOBUFFER", - "INIT_BUFFER_SCREENBUFFER", - "INIT_BUFFER_TEXTUREBUFFER" -}; -#endif - - -/*==================== Local Constants ====================*/ -#define NUM_BUFS 6 - -#define SST96_MEMMAP_TEXTURE_MEMORY_OFFSET (0x6 << 20) /* +5 MB */ - -#define SST96_COMMAND_REGS(X) ( ((char*)(X))+(4<<20) ) - -#define MAXTRIES 10000 - -#define FIFOLAG 128 - -/*------------------------------------------------------------------- - Module Data - -------------------------------------------------------------------*/ -volatile FxU32 *sstHW; -volatile Sstregs *sstPtr; - -typedef struct _BufInfo { - /* DISPLAY Stuff */ - FxI32 dfb; /* Was fbN */ - FxI32 dfbBase; /* Base of Buffers */ - FxI32 dfbTop; /* Tops of Buffers */ - FxI32 dfbStride; /* Strides */ - /* RENDER stuff */ - FxI32 rfb; /* was rfbN */ -} BufInfo, *BufInfoPtr; - - -#define RFB 0 -#define DFB 1 - - -extern FxBool tripleBuffering; - -#define ADVANCE_BUFFERS(kind)\ -{\ - kind##FrontIdx = (kind##FrontIdx < maxBufIdx) ? kind##FrontIdx + 1 : 0;\ - kind##BackIdx = (kind##BackIdx < maxBufIdx) ? kind##BackIdx + 1 : 0;\ - kind##RenderIdx = (kind##RenderIdx < maxBufIdx) ? kind##RenderIdx + 1 : 0;\ -} - -#define rfbTripleIdx ((rfbBackIdx + 1) % maxBuffer) -#define MAX_BUF 3 - -BufInfo bI[MAX_BUF]; - -static FxI32 - maxBuffer = 2, - maxBufIdx, - /* DISPLAY Stuff */ - /* The following two are indices into the above */ - dfbFrontIdx = 0, - dfbBackIdx = 1, - dfbRenderIdx = 1, - /* RENDER stuff */ - rfbFrontIdx = 0, - rfbBackIdx = 1, - rfbRenderIdx = 1; - -static FxI32 -ab0, ab0Top, ab0Base, ab0Stride; - -static InitOriginLocation_t cachedYOrigin; -static InitSwapType_t cachedSwapType; - -static FxU32 fifoStart, fifoEnd; -volatile FxU32 *fifovirt; /* start virtual address */ -volatile FxU32 fifophys; /* start physical address */ -volatile FxU32 fifomax; /* in bytes */ -volatile FxU32 fifocur; /* how much used up so far */ -volatile FxU32 *fifoptr; /* current pointer */ -volatile FxU32 fifosize; /* how much of 4kbytes used up */ -volatile FxU32 fifolfb; /* use LFB, use hostblt if 0. */ - -#if SST96_ALT_FIFO_WRAP && GDBG_INFO_ON -/* Statistics about how many times we wrapped/waited for - * the fifo. - */ -static FxU32 numWraps; -static FxU32 numJuJuStalls; -static FxU32 numStalls; -#endif /* GDBG_INFO_ON && SST96_ALT_FIFO_WRAP */ - -Init96HALData *curHALData; - -static FxU16 -oldVidMode; - -static FxU32 -devNum, -physAddr, -fifoMTRRNum = 0xffffffff; - -/*-----------Debuging Info Data------------------------------*/ -#ifdef GDBG_INFO_ON -/* NOTE: - - This array is HIGHLY important to debugging. Delete it at your - extreme peril. - */ -char *iRegNames[] = { - "status", /* 0x00 */ - "reserved001", /* 0x01 */ - "vAx", /* 0x02 */ - "vAy", /* 0x03 */ - "vBx", /* 0x04 */ - "vBy", /* 0x05 */ - "vCx", /* 0x06 */ - "vCy", /* 0x07 */ - "r", /* 0x08 */ - "drdx", /* 0x09 */ - "drdy", /* 0x0a */ - "g", /* 0x0b */ - "dgdx", /* 0x0c */ - "dgdy", /* 0x0d */ - "b", /* 0x0e */ - "dbdx", /* 0x0f */ - "dbdy", /* 0x10 */ - "z", /* 0x11 */ - "dzdx", /* 0x12 */ - "dzdy", /* 0x13 */ - "a", /* 0x14 */ - "dadx", /* 0x15 */ - "dady", /* 0x16 */ - "s", /* 0x17 */ - "dsdx", /* 0x18 */ - "dsdy", /* 0x19 */ - "t", /* 0x1a */ - "dtdx", /* 0x1b */ - "dtdy", /* 0x1c */ - "w", /* 0x1d */ - "dwdx", /* 0x1e */ - "dwdy", /* 0x1f */ - "triangleCMD", /* 0x20 */ - "reserved021", /* 0x21 */ - "FvAx", /* 0x22 */ - "FvAy", /* 0x23 */ - "FvBx", /* 0x24 */ - "FvBy", /* 0x25 */ - "FvCx", /* 0x26 */ - "FvCy", /* 0x27 */ - "Fr", /* 0x28 */ - "Fdrdx", /* 0x29 */ - "Fdrdy", /* 0x2a */ - "Fg", /* 0x2b */ - "Fdgdx", /* 0x2c */ - "Fdgdy", /* 0x2d */ - "Fb", /* 0x2e */ - "Fdbdx", /* 0x2f */ - "Fdbdy", /* 0x30 */ - "Fz", /* 0x31 */ - "Fdzdx", /* 0x32 */ - "Fdzdy", /* 0x33 */ - "Fa", /* 0x34 */ - "Fdadx", /* 0x35 */ - "Fdady", /* 0x36 */ - "Fs", /* 0x37 */ - "Fdsdx", /* 0x38 */ - "Fdsdy", /* 0x39 */ - "Ft", /* 0x3a */ - "Fdtdx", /* 0x3b */ - "Fdtdy", /* 0x3c */ - "Fw", /* 0x3d */ - "Fdwdx", /* 0x3e */ - "Fdwdy", /* 0x3f */ - "FtriangleCMD", /* 0x40 */ - "reserved041", /* 0x41 */ - "nopCMD", /* 0x42 */ - "reserved043", /* 0x43 */ - "fastfillCMD", /* 0x44 */ - "reserved045", /* 0x45 */ - "swapbufferCMD", /* 0x46 */ - "reserved047", /* 0x47 */ - "swappendCMD", /* 0x48 */ - "reserved049", /* 0x49 */ - "reserved04A", /* 0x4a */ - "reserved04B", /* 0x4b */ - "reserved04C", /* 0x4c */ - "reserved04D", /* 0x4d */ - "reserved04E", /* 0x4e */ - "reserved04F", /* 0x4f */ - "fbzColorPath", /* 0x50 */ - "fogMode", /* 0x51 */ - "alphaMode", /* 0x52 */ - "reserved053", /* 0x53 */ - "fbzMode", /* 0x54 */ - "stipple", /* 0x55 */ - "color0", /* 0x56 */ - "color1", /* 0x57 */ - "fogColor", /* 0x58 */ - "zaColor", /* 0x59 */ - "chromaKey", /* 0x5a */ - "chromaRange", /* 0x5b */ - "reserved05C", /* 0x5c */ - "reserved05D", /* 0x5d */ - "reserved05E", /* 0x5e */ - "reserved05F", /* 0x5f */ - "colBufferSetup", /* 0x60 */ - "auxBufferSetup", /* 0x61 */ - "clipLeftRight0", /* 0x62 */ - "clipTopBottom0", /* 0x63 */ - "clipLeftRight1", /* 0x64 */ - "clipTopBottom1", /* 0x65 */ - "reserved066", /* 0x66 */ - "reserved067", /* 0x67 */ - "reserved068", /* 0x68 */ - "reserved069", /* 0x69 */ - "reserved06A", /* 0x6a */ - "reserved06B", /* 0x6b */ - "reserved06C", /* 0x6c */ - "reserved06D", /* 0x6d */ - "reserved06E", /* 0x6e */ - "reserved06F", /* 0x6f */ - "fogTable0001", /* 0x70 */ - "fogTable0203", /* 0x71 */ - "fogTable0405", /* 0x72 */ - "fogTable0607", /* 0x73 */ - "fogTable0809", /* 0x74 */ - "fogTable0A0B", /* 0x75 */ - "fogTable0C0D", /* 0x76 */ - "fogTable0E0F", /* 0x77 */ - "fogTable1011", /* 0x78 */ - "fogTable1213", /* 0x79 */ - "fogTable1415", /* 0x7a */ - "fogTable1617", /* 0x7b */ - "fogTable1819", /* 0x7c */ - "fogTable1A1B", /* 0x7d */ - "fogTable1C1D", /* 0x7e */ - "fogTable1E1F", /* 0x7f */ - "fogTable2021", /* 0x80 */ - "fogTable2223", /* 0x81 */ - "fogTable2425", /* 0x82 */ - "fogTable2627", /* 0x83 */ - "fogTable2829", /* 0x84 */ - "fogTable2A2B", /* 0x85 */ - "fogTable2C2D", /* 0x86 */ - "fogTable2E2F", /* 0x87 */ - "fogTable3031", /* 0x88 */ - "fogTable3233", /* 0x89 */ - "fogTable3435", /* 0x8a */ - "fogTable3637", /* 0x8b */ - "fogTable3839", /* 0x8c */ - "fogTable3A3B", /* 0x8d */ - "fogTable3C3D", /* 0x8e */ - "fogTable3E3F", /* 0x8f */ - "fbijrInit0", /* 0x90 */ - "fbijrInit1", /* 0x91 */ - "fbijrInit2", /* 0x92 */ - "fbijrInit3", /* 0x93 */ - "fbijrInit4", /* 0x94 */ - "fbijrInit5", /* 0x95 */ - "reserved096", /* 0x96 */ - "reserved097", /* 0x97 */ - "reserved098", /* 0x98 */ - "reserved099", /* 0x99 */ - "reserved09A", /* 0x9a */ - "reserved09B", /* 0x9b */ - "reserved09C", /* 0x9c */ - "reserved09D", /* 0x9d */ - "reserved09E", /* 0x9e */ - "reserved09F", /* 0x9f */ - "fbijrVersion", /* 0xa0 */ - "fbiPixelsIn", /* 0xa1 */ - "fbiChromaFail", /* 0xa2 */ - "fbiZfuncFail", /* 0xa3 */ - "fbiAfuncFail", /* 0xa4 */ - "fbiPixelsOut", /* 0xa5 */ - "reserved0A6", /* 0xa6 */ - "reserved0A7", /* 0xa7 */ - "reserved0A8", /* 0xa8 */ - "reserved0A9", /* 0xa9 */ - "reserved0AA", /* 0xaa */ - "reserved0AB", /* 0xab */ - "reserved0AC", /* 0xac */ - "reserved0AD", /* 0xad */ - "reserved0AE", /* 0xae */ - "reserved0AF", /* 0xaf */ - "reserved0B0", /* 0xb0 */ - "reserved0B1", /* 0xb1 */ - "reserved0B2", /* 0xb2 */ - "reserved0B3", /* 0xb3 */ - "reserved0B4", /* 0xb4 */ - "reserved0B5", /* 0xb5 */ - "reserved0B6", /* 0xb6 */ - "reserved0B7", /* 0xb7 */ - "reserved0B8", /* 0xb8 */ - "reserved0B9", /* 0xb9 */ - "reserved0BA", /* 0xba */ - "reserved0BB", /* 0xbb */ - "reserved0BC", /* 0xbc */ - "reserved0BD", /* 0xbd */ - "reserved0BE", /* 0xbe */ - "texChipSel", /* 0xbf */ - "textureMode", /* 0xc0 */ - "tLOD", /* 0xc1 */ - "tDetail", /* 0xc2 */ - "texBaseAddr", /* 0xc3 */ - "texBaseAddr1", /* 0xc4 */ - "texBaseAddr2", /* 0xc5 */ - "texBaseAddr38", /* 0xc6 */ - "trexInit0", /* 0xc7 */ - "trexInit1", /* 0xc8 */ - "nccTable0_0", /* 0xc9 */ - "nccTable0_1", /* 0xca */ - "nccTable0_2", /* 0xcb */ - "nccTable0_3", /* 0xcc */ - "nccTable0_4", /* 0xcd */ - "nccTable0_5", /* 0xce */ - "nccTable0_6", /* 0xcf */ - "nccTable0_7", /* 0xd0 */ - "nccTable0_8", /* 0xd1 */ - "nccTable0_9", /* 0xd2 */ - "nccTable0_A", /* 0xd3 */ - "nccTable0_B", /* 0xd4 */ - "nccTable1_0", /* 0xd5 */ - "nccTable1_1", /* 0xd6 */ - "nccTable1_2", /* 0xd7 */ - "nccTable1_3", /* 0xd8 */ - "nccTable1_4", /* 0xd9 */ - "nccTable1_5", /* 0xda */ - "nccTable1_6", /* 0xdb */ - "nccTable1_7", /* 0xdc */ - "nccTable1_8", /* 0xdd */ - "nccTable1_9", /* 0xde */ - "nccTable1_A", /* 0xdf */ - "nccTable1_B", /* 0xe0 */ - "reserved0E1", /* 0xe1 */ - "reserved0E2", /* 0xe2 */ - "reserved0E3", /* 0xe3 */ - "reserved0E4", /* 0xe4 */ - "reserved0E5", /* 0xe5 */ - "reserved0E6", /* 0xe6 */ - "reserved0E7", /* 0xe7 */ - "reserved0E8", /* 0xe8 */ - "reserved0E9", /* 0xe9 */ - "reserved0EA", /* 0xea */ - "reserved0EB", /* 0xeb */ - "reserved0EC", /* 0xec */ - "reserved0ED", /* 0xed */ - "reserved0EE", /* 0xee */ - "reserved0EF", /* 0xef */ - "reserved0F0", /* 0xf0 */ - "reserved0F1", /* 0xf1 */ - "reserved0F2", /* 0xf2 */ - "reserved0F3", /* 0xf3 */ - "reserved0F4", /* 0xf4 */ - "reserved0F5", /* 0xf5 */ - "reserved0F6", /* 0xf6 */ - "reserved0F7", /* 0xf7 */ - "reserved0F8", /* 0xf8 */ - "reserved0F9", /* 0xf9 */ - "reserved0FA", /* 0xfa */ - "reserved0FB", /* 0xfb */ - "reserved0FC", /* 0xfc */ - "reserved0FD", /* 0xfd */ - "reserved0FE", /* 0xfe */ - "reserved0FF" /* 0xff */ -}; -#endif - -#define VG96STRIDE(stride) (((stride >> 3) & 0x1ff )<< 22) - -#ifdef GDBG_INFO_ON -FxU32 -get96(FxU32 *addr) -{ - FxU32 - index, - ret; - char *regName; - - ret = *GETREADADDR2(addr); - - index = GETINDEXFROMADDR(addr); - - regName = iRegNames[index]; - - GDBG_INFO((120, "GET: Register: %s (0x%x) Address: 0x%x Value: 0x%x\n", - regName, GETINDEXFROMADDR(addr), addr, ret)); - - return ret; -} /* get96 */ -#endif - -/* structure offset */ -#define SETO(base,offset,value) (*(((FxU32 *)(base))+((offset) >> 2)) = (value)) -#define GETO(base,offset) (*(((FxU32 *)(base))+((offset) << 8))) - -/* register indices */ -#define SETI(base,index,value) (*(((FxU32 *)(base))+(index)) = (value)) -#define GETI(base,index) (*(((FxU32 *)(base))+((index) << 10))) - -/* structure field names */ -#define SETF(base2,field,value) (((Sstregs*)(base2))->field = (value)) -#define GETF(base,field) (GETO(base,offsetof(Sstregs,field))) - - -#define GETREGVALFROMENV(val, envStr, constant)\ -{\ - const char *envVal;\ - val = constant;\ - if ((envVal = myGetenv(envStr)) != NULL) {\ - sscanf(envVal, "%x", &val);\ - GDBG_INFO((80,\ - "%s: The environment variable %s == 0x%x overloaded a register value\n", \ - FN_NAME, envStr, val));\ - }\ -} - -static FxBool -init96LoadBufRegs(int nBuffers, - InitBufDesc_t *pBufDesc, - int xRes, int yRes, - InitRegisterDesc *rd); - -#define XY_ONE (1<vA.x, x); - SET(sstPtr->vA.y, y); - SET(sstPtr->vB.x, x+XY_ONE*tSize); - SET(sstPtr->vB.y, y); - SET(sstPtr->vC.x, x); - SET(sstPtr->vC.y, y+XY_ONE*tSize/2); - - SET(sstPtr->s, 0); - SET(sstPtr->t, 0); - SET(sstPtr->w, 1); - SET(sstPtr->dsdx, 255); - SET(sstPtr->dtdx, 0); - SET(sstPtr->dwdx, 0); - SET(sstPtr->dsdy, 255); - SET(sstPtr->dtdy, 0); - SET(sstPtr->dwdy, 0); - SET(sstPtr->triangleCMD, 1); -} - -#define SENSE0 0xbaaf -#define SENSE1 0xabcd - -#define VG96_TEXTURE_OFFSET 0x600000 -#define SST96_TEX_PTR(a) \ - ((FxU32 *) (((FxU32) a) + VG96_TEXTURE_OFFSET)) - -static FxBool sense(FxU32 *sstbase, VG96Info *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 *texAddr = (FxU32 *)SST96_TEX_PTR(sstbase); - FxBool same = FXFALSE; - FxU16 fmem, orgmem; - - - /* set the Init0 register to enable ? MBytes of memory */ -#define WAITLOOP {\ -int nWaits;\ - FxU32 waitRes;\ - for (nWaits = 0; nWaits < 50000; nWaits++) {\ - waitRes = sstHW[0x100000];\ - if (waitRes & 0x80000000) break;\ - }\ -} - - orgmem = *(FxU16 *)sstbase; - - WAITLOOP; - - /* base address for lod0 */ - mem = mem - ((FXBIT(14) + FXBIT(12) + FXBIT(10) + FXBIT(8) + FXBIT(6) + FXBIT(4) + FXBIT(2) + 1)*8); /* 8X */ - - SET(sstPtr->texBaseAddr, mem>>3); - - *(texAddr + (8 << 15)) = init; - /* - write to 2 consequtive locations in lod0 to alter the data - on the memory signals - */ - WAITLOOP; - *(texAddr + (0)) = 0xffffffff; - WAITLOOP; - *(texAddr + (1)) = 0xffffffff; - - WAITLOOP; - - drawTriangle(sst,0,0,2); /* draw a 4x4 right triangle */ - WAITLOOP; - - fmem = *(FxU16 *)sstbase; - - WAITLOOP; - - if (fmem == init) - same = FXTRUE; - - *(FxU16 *)sstbase = orgmem; - - return same; -} - -FX_EXPORT FxBool FX_CSTYLE -Init96GetTmuMemory(FxU32 *sstbase, VG96Info *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 data; - - if(myGetenv(("SST96_TMUMEM_SIZE"))) { - *TmuMemorySize = atoi(myGetenv(("SST96_TMUMEM_SIZE"))); - return(FXTRUE); - } - SET(sstPtr->trexInit0, 0x05441); - - SET(sstPtr->colBufferSetup, 0x28000000); /* color buffer */ - SET(sstPtr->fbzMode, SST_RGBWRMASK); - SET(sstPtr->fbzColorPath, SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - SET(sstPtr->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - /* set lod8 */ - SET(sstPtr->tLOD, ((8 << 2) | (8 << 7))); - - /* - first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x200000, SENSE1); - if (data) { - *TmuMemorySize = 4; - return(FXTRUE); - } - } - - data = sense(sstbase,info,tmu,0x100000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x100000, SENSE1); - if (data) { - *TmuMemorySize = 2; - return(FXTRUE); - } - } - - data = sense(sstbase,info,tmu,0x000000, SENSE0); - if (data) { - data = sense(sstbase,info,tmu,0x000000, SENSE1); - if (data) { - *TmuMemorySize = 1; - return(FXTRUE); - } - } - -#undef WAITLOOP - - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst96InitGetTmuInfo(FxU32 *sstbase, VG96Info *info) -{ - sstPtr = - (volatile Sstregs *)(SST96_COMMAND_REGS(sstbase)); - - if(Init96GetTmuMemory(sstbase, info, 0, &info->tfxRam) == FXFALSE) - return(FXFALSE); - return(FXTRUE); -} - -/*------------------------------------------------------------------- - Function: init96MapBoard - Date: 10/17 - Implementor(s): jdt, dow - Library: init96 - Description: - Looks for an SST-96 enabled VGA board on the system and maps that - boards physical address into linear memory. - Arguments: - rd: Register descriptions - vID: Vendor ID - dID: Device ID - Return: - linear pointer to base of VGA board. 0 if fail - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96MapBoard, FxBool , (void *rd, void *info, FxU16 vID, FxU16 dID) ) -{ -#define FN_NAME "init96MapBoard" - - InitRegisterDesc - *regDesc = (InitRegisterDesc *) rd; - - VG96Info *vg96Info = (VG96Info *) info; - - FxU32 - vendorID = vID, - deviceID = dID; - - GDBG_INFO((80, "SST-96 Initialization code %s\n", revString)); - - /* Watcom warning suppression */ - revString[0] = revString[0]; - - /* !!! FIXME hack for vxd bug */ - putenv( "SST_DUALHEAD=1" ); - - switch (vID) { - case AT3DVID: -#if 0 - curHALData = initAT3DGetHALData(); -#endif - break; - case MCRXVID: - curHALData = initMCRXGetHALData(); - break; - } - - - GDBG_INFO((80, "init96MapBoard: Mapping card into linear memory\n")); - - regDesc->hwDep.VG96RegDesc.baseAddress = - pciMapCardMulti( vendorID, deviceID, curHALData->memSize, &devNum, 0 , 0); - - - if (regDesc->hwDep.VG96RegDesc.baseAddress == NULL) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); -#else - { -#ifdef __linux__ - fprintf(stderr, "Failed to map board: %s\n", pciGetErrorString()); - exit(1); -#else - /* Set Mode 3 before going */ - union REGS - inR, outR; - - inR.w.ax = 0x0003; - int386(0x10, &inR, &outR); - fprintf(stderr, "%s\n", pciGetErrorString()); -#endif - } -#endif /* __WIN32__ */ - exit(1); - return FXFALSE; - } - - /* need to initialize sstHW ASAP */ - sstHW = regDesc->hwDep.VG96RegDesc.baseAddress; - - GDBG_INFO((80, "%s: Mapped Voodoo Rush board at 0x%x\n", - FN_NAME, regDesc->hwDep.VG96RegDesc.baseAddress)); - - if (curHALData->initGetInfo) - (*curHALData->initGetInfo)(vg96Info); - - fifoptr = regDesc->hwDep.VG96RegDesc.fifoApertureBase; - - GDBG_INFO((88, "init96MapBoard sstHW = %x\n", sstHW)); - - /* CHD NOTE: The routine init96SetupRendering MUST Be called from this - routine or all hell brakes loose. - */ - - /* detect tmu memory size */ -#ifdef __linux__ - { - FxBool rv=FXTRUE; - GrScreenResolution_t res = GR_RESOLUTION_640x480; - static void init96SetupRendering(InitRegisterDesc *regDesc, - GrScreenResolution_t sRes); - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) - return FXFALSE; - - init96SetupRendering(regDesc, res); - - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - } -#else -#ifdef(__DOS32__) - { - /* In dos mode, we do it the way it is supposed to be. - In windows mode, calling initEnableRegs() will change the clock - rate and it makes the refresh looks bad. So we still use the - init96SetVideo() to set up the rendering mode etc. - */ - GrScreenResolution_t res = GR_RESOLUTION_640x480; - FxBool rv = FXTRUE; - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - - { - union REGS - inR, outR; - - inR.w.ax = 0x4f03; - int386(0x10, &inR, &outR); - - oldVidMode = outR.w.bx; - GDBG_INFO((80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode)); - } - - if ( !rv ) - return FXFALSE; - - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) - return FXFALSE; - - init96SetupRendering(regDesc, res); - - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - } -#else - { - int xres=1, yres=1, fbStride; - GrScreenResolution_t res = GR_RESOLUTION_NONE; - init96SetVideo(0, res, - 0, 2, 1, - 2, 1, regDesc, - &xres, &yres, &fbStride ); - sst96InitGetTmuInfo((FxU32 *)sstHW, vg96Info); - init96RestoreVideo(regDesc); - } -#endif -#endif - - GDBG_INFO((80, "init96MapBoard: returning FXTRUE\n")); - - return FXTRUE; - -#undef FN_NAME -} /* init96MapBoard */ - - -#ifndef GDBG_INFO_ON -#define WAITLOOP {\ -int nWaits;\ -volatile FxU32 waitRes;\ - for (nWaits = 0; nWaits < 100000; nWaits++) {\ - waitRes = GET(sstHW[0x90 + 0x100000]);\ - if (waitRes & 0x80000000) break;\ - }\ -} -#else -#define WAITLOOP {\ -int nWaits;\ - volatile FxU32 waitRes;\ - for (nWaits = 0; nWaits < 50000; nWaits++) {\ - waitRes = sstHW[0x100000];\ - if (waitRes & 0x80000000) break;\ - }\ -} -#endif - -#define SWAPPENDING(status) ((status & 0x70) >> 4) - -/*------------------------------------------------------------------- - Function: init96SetupRendering - Date: 03-Sep-97 - Implementor(s): dow - Library: Init Code for 96 - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -static void -init96SetupRendering(InitRegisterDesc *regDesc, GrScreenResolution_t sRes) -{ -#define FN_NAME "init96SetupRendering" - FxU32 regVal; - - sstHW = regDesc->hwDep.VG96RegDesc.baseAddress; - sstPtr = - (volatile Sstregs *)(SST96_COMMAND_REGS(regDesc->hwDep.VG96RegDesc.baseAddress)); - - /*------------------------------------------------------------ - Initialize Jr and TMU - ------------------------------------------------------------*/ - GDBG_INFO((80, "%s: Software reset\n", FN_NAME)); - SET(sstHW[0x90 + 0x100000], 0xf601); /* (0xf601) init0, sw reset. */ - - WAITLOOP; - - GDBG_INFO((80, "%s: Zero Out CMD FIFO registers\n", FN_NAME)); - SET(sstHW[0x100000 + 0x95], 0); - SET(sstHW[0x100000 + 0x94], 0); - SET(sstHW[0x100000 + 0x93], 0); - - GDBG_INFO((80, "%s: Setting up Mem FIFO\n", FN_NAME)); - - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT2", 0x70d20); - - SET(sstHW[0x92 + 0x100000], regVal); - - /* Off for Host Blt, On for LFB command traffic - Low Priority Request Aging - wait 64 cycles - before answering low priority requests from - AT3D on PUMA - 3F may not be optimal, should - be tweaked later, !!JDT - [24] - PUMA Texture Address Space Mode - 0x1 - 2MB - [23] - PUMA Texture Base Address Mode - 0x1 - 6MB - [12:7] - PUMA Low Priority Grant Limit Cnt - 0x0 - [6] - PUMA Low Prorirty Grant Limit Enable - 0x0 - [5:0] - PUMA Low Priority Request Delay Cnt - 0x1f - 32 ccls - Setting to 0x3f ( max ) seems to cripple windows/d3d - maybe blt operations suffer??? - */ - GDBG_INFO((80, "%s: Setting low priority request aging.\n", FN_NAME)); - /* - * If we're running at a high resolution, don't starve AT3D's - * video refresh. XXX FIXME for AT3d only - */ - if (sRes == GR_RESOLUTION_NONE) { - /* set the lpr delay to 0. It was 0x10 and the video refresh was not correct */ - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT1", 0x01800000); - SET(sstHW[0x91 + 0x100000], regVal); - } else { - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT1", 0x0180003f); - - if (myGetenv("SST96_MEMORYHINT")) { - regVal |= (0x1f << 13); - } - SET(sstHW[0x91 + 0x100000],regVal); - } - - /* Come out of Reset - [17] - Serial Status Xfer Mode - 0x0 - rising edge - [16:12] - TREX-To-FBI High Water Mark - 0xf - [11:8] - TREX-To-FBI Bus Clock Delay - 0x6 - */ - - GDBG_INFO((80, "%s: Coming out of FBI reset\n", FN_NAME)); - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT0", 0xf600); - SET(sstHW[0x90 + 0x100000], regVal); /* Bit 1 disables tmu */ - - WAITLOOP; - - GDBG_INFO((80, "%s: Setting TMU FT & TF delays\n", FN_NAME)); - { - FxU32 trexinit0, trexinit1; - - if(myGetenv(("SST_TREX0INIT0"))) { - sscanf(myGetenv(("SST_TREX0INIT0")), "%i", &trexinit0); - } else { - trexinit0 = 0x05441; /* TREXINIT0 */ - } - - if(myGetenv(("SST_TREX0INIT1"))) { - sscanf(myGetenv(("SST_TREX0INIT1")), "%i", &trexinit1); - } else { - trexinit1 = 0x3643c; /* TREXINIT1 */ - } - - SET(sstHW[0xc7 + 0x100000], trexinit0); /* TREXINIT0 */ - SET(sstHW[0xc8 + 0x100000], trexinit1); /* TREXINIT1 */ - } - - WAITLOOP; - -#undef FN_NAME -} /* init96SetupRendering */ - -/*------------------------------------------------------------------- - Function: initSet96Video - Date: 10/17 - Implementor(s): jdt, murali - Library: init96 - Description: - - 1 - Set video mode - 2 - Enable Direct Writes to Jr - 3 - Put Jr registers in Reset - 3 - Set up Color Buffer Registers - - Arguments - - Return: - FXFALSE - fail - FXTRUE - pass - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96SetVideo, FxBool , - ( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitRegisterDesc *regDesc, - int *xres, - int *yres, - int *fbStride) ) -{ -#define FN_NAME "init96SetVideo" - FxBool rv = FXTRUE; - InitSwapType_t swapType = 0; - InitBufDesc_t bufDesc[NUM_BUFS]; - FxU32 nTries = 0, status; - FxU32 regVal; - int i; - - for (i = 0; i < NUM_BUFS; i++) - bufDesc[i].bufType = INIT_BUFFER_NONE; - - if (myGetenv("SST96_FORCE_TRIPLE")) - nColBuffers = 3; - - GDBG_INFO((80, "%s: %d Color Buffers\n", FN_NAME, nColBuffers)); - - GDBG_INFO((80, "(%s) hWnd=%x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - FN_NAME, hWnd, sRes, yOrigin, nColBuffers, nAuxBuffers)); - - /* YO! Fix this comment - XXX this needs to be moved to post SetVideo code ??? */ - GDBG_INFO((80, "%s: Initializing Command Aperture\n", FN_NAME)); - - if (curHALData->initAperture) - (*curHALData->initAperture)(regDesc); - -#if defined( __DOS32__ ) - { - union REGS - inR, outR; - - inR.w.ax = 0x4f03; - int386(0x10, &inR, &outR); - - oldVidMode = outR.w.bx; - GDBG_INFO((80, "%s: Saving Current video mode (0x%x).\n", - FN_NAME, oldVidMode)); - } -#endif - - /*------------------------------------- - Set Video Mode - -------------------------------------*/ - /* this goes through the dxdrvr.c which is a misnomer - which will persist for the time being, in dos - this does not have anything to do with directX */ -#ifdef __linux__ - if (!linOpen(hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, bufDesc, - xres, yres, &swapType)) { -#else - if (!dxOpen(hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, bufDesc, - xres, yres, &swapType)) { -#endif - GDBG_INFO((80, "Failed dxOpen\n")); - rv = FXFALSE; - goto BAIL; - } - -#ifdef GDBG_INFO_ON - for (i = 0; i < nColBuffers; i++) { - GDBG_INFO((80, "%s: bufDesc[%d]:\n", FN_NAME, i)); - GDBG_INFO((80, "%s: bufDesc.bufType = %s\n", - FN_NAME, bufTypeNames[bufDesc[i].bufType])); - GDBG_INFO((80, "%s: bufDesc.bufOffset = 0x%x\n", - FN_NAME, bufDesc[i].bufOffset )); - GDBG_INFO((80, "%s: bufDesc.bufStride = 0x%x\n", - FN_NAME, bufDesc[i].bufStride)); - GDBG_INFO((80, "%s: bufDesc.bufBPP = 0x%x\n", - FN_NAME, bufDesc[i].bufBPP)); - } -#endif - - if ( !rv ) goto BAIL; - - /*------------------------------------- - Enable Direct Writes to JR - -------------------------------------*/ - if ( curHALData->initEnableRegs ) - rv = curHALData->initEnableRegs( regDesc ); - if ( !rv ) goto BAIL; - - - init96SetupRendering(regDesc, sRes); - - cachedYOrigin = yOrigin; /* Used later for init96Control */ - cachedSwapType = swapType; - - /* - ** Set Up Color Buffer Registers & triple buffering if necessary. - */ - maxBuffer = (nColBuffers < 2) ? 2 : nColBuffers; - maxBufIdx = maxBuffer - 1; - - GDBG_INFO((80, "%s: maxBuffer = %d, maxBufIdx = %d\n", - FN_NAME, maxBuffer, maxBufIdx)); - - /* Send as many swapbuffers as status says are necessary */ - { - FxU32 - pending = 7; /* # Swaps pending */ - - GDBG_INFO((80, - "%s: Sending %d swapbufferCMDs\n", - FN_NAME, - pending)); - while (pending) { - FxU32 - tries = 0; - - GDBG_INFO((80, "%s: %d swaps pending\n", FN_NAME, pending)) ; - - status = sstHW[0x100000]; - pending = SWAPPENDING(status); - - while (pending--) { - SET(sstPtr->swapbufferCMD, 1); - status = sstHW[0x100000]; /* bug #1152 */ - ADVANCE_BUFFERS(dfb); - WAITLOOP; - } - - do { - ++tries; - status = sstHW[0x100000]; - - GDBG_INFO((120, "%s: Serial status = 0x%x\n", FN_NAME, status)); - pending = SWAPPENDING(status); - if (tries > MAXTRIES) { - GDBG_INFO((80, "%s: Bailing out after %d tries to get swap buffer pending to decrement\n", FN_NAME, tries)); - rv = FXFALSE; - goto BAIL; - } - } while (pending); - } - - /* Clear counters with a NOP */ - SET(sstHW[0x42 + 0x100000], 1); /* NOP cmd */ - - /* Wait for idle */ - do { - if (nTries > MAXTRIES) { - GDBG_INFO((80, - "%s: Bailing out and returning false after %d checks for idle.\n", FN_NAME, nTries-1)); - return FXFALSE; - } - ++nTries; - status = sstHW[0x100000]; - - GDBG_INFO((80, - "%s: Serial status after soft reset: 0x%x\n", - FN_NAME, - status)); - } while (status & 0x1); - } /* end of swap buffer block */ - - - if (tripleBuffering) { - GETREGVALFROMENV(regVal, "SST96_FBIJRINIT0", 0xf600); - regVal |= (1 << 2); - GDBG_INFO((80, "%s: Enabling triple buffering.\n", FN_NAME)); - /* dram read to write fast timing enable. bit 7 */ - if (myGetenv("SST96_MEMORYHINT")) { - regVal |= (0x1 << 7); - } - SET(sstHW[0x90 + 0x100000], regVal); /* Bit 1 disables tmu */ - } - - /* Need to be converted to indices dfbFront.... rfbFront.... */ - - dfbFrontIdx = 0; - dfbBackIdx = 1; - dfbRenderIdx = dfbBackIdx; - - rfbFrontIdx = 0; - rfbBackIdx = 1; - rfbRenderIdx = rfbBackIdx; - - rv = init96LoadBufRegs(NUM_BUFS, bufDesc, *xres, *yres, regDesc); - if ( !rv ) { - GDBG_INFO((80, "Failed init96LoadBufRegs\n")); - goto BAIL; - } - - /*------------------------------------- - Set up Page Flipping - -------------------------------------*/ - WAITLOOP; -#if !defined( INIT96VGASWAP ) && !defined( __linux__ ) - { - FxU32 buf[MAX_BUF]; - int i; - - for (i=0; iinitSwapTiles = NULL; - - if (curHALData->initUseTiles && (swapType == INIT_SWAP_FLIP)) { -#ifdef H3D - (*curHALData->initUseTiles)(regDesc, - buf, - maxBuffer, - bI[0].dfbStride, - *xres, - *yres, - GR_RESOLUTION_IS_AUTOFLIPPED(sRes) ); -#else - (*curHALData->initUseTiles)(regDesc, - buf, - maxBuffer, - bI[0].dfbStride, - *xres, - *yres ); -#endif - } - } -#endif - - *fbStride = (bI[1].dfbStride>>1); - GDBG_INFO(( 200, "frame buffer stride: %d\n", *fbStride )); - - BAIL: - return rv; -#undef FN_NAME -} /* init96SetVideo */ - - -/*------------------------------------------------------------------- - Function: init96RestoreVideo - Date: 3/16 - Implementor(s): jdt - Library: init96 - Description: - - Disable Direct Hardware Access - Restore the video to it's initial state - - Arguments: - none - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96RestoreVideo, void, ( InitRegisterDesc *regDesc )) { -#define FN_NAME "init96RestoreVideo" - if ( curHALData->initDisableRegs ) - curHALData->initDisableRegs( regDesc ); - -#if defined( __WIN32__ ) && !defined( INIT_HOOPTI ) - dxClose(); -#elif defined( __DOS32__ ) - { - static union REGS - inR, outR; - - GDBG_INFO((80, "%s: Restoring VESA Mode 0x%x\n", FN_NAME, oldVidMode)); - inR.w.ax = 0x4f02; - inR.w.bx = oldVidMode; - - int386( 0x10, &inR, &outR ); - } -#elif defined( __linux__ ) - linClose(); -#endif -#undef FN_NAME -} /* init96RestoreVideo */ - - -/*------------------------------------------------------------------- - Function: init96EnableTransport - Date: 3/17 - Implementor(s): jdt - Library: init96 - Description: - - Enable the JR command transport and return pertinant fifo - information to the caller - - Arguments: - info - structure to fill with info about the FIFO - Return: - FXTRUE - succeed - FXFALSE - fail - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96EnableTransport, FxBool, ( InitFIFOData *info, InitRegisterDesc* regDesc)) -{ -#define FN_NAME "init96EnableTransport" - FxBool rv = FXTRUE; - FxU32 lo, hi, sz, th; - FxU32 - fifoPhysBaseAddress, - fifoPhysSize; - FxBool - res; - PciMemType - fifoMemType; - - GDBG_INFO((80, "%s\n", FN_NAME)); - - /*------------------------------------------------------------ - Enable the Off Chip Fifo - ------------------------------------------------------------*/ - - /* These are defined in sst.c for now */ - lo = (fifoStart >> 12); /* physaddr of 1st 4k page */ - hi = (fifoEnd >> 12); /* physaddr of last 4k page */ - sz = (hi - lo + 1) << 12; /* bytes */ - th = (hi - lo) - 3; /* threshold, in 4k pages. */ - - /* Generate virtual addresses for the pointers. */ - fifovirt = (FxU32 *)&sstHW[lo << 10]; - fifophys = lo << 12; - fifomax = sz; - fifocur = 0; - - fifoptr = fifovirt; - fifosize = 4096; /* initially, set to 4k */ - - fifolfb = 1; - - /* First disable the off-chip fifo */ - GDBG_INFO((80, "%s: Disabling off-chip FIFO\n", FN_NAME)); - SET(sstHW[0x100000 + 0x93], 0); - - /* FbijrInit4 - 0x94 - entry count */ - SET(sstHW[0x100000 + 0x94], 0); - - /* FbijrInit5 - 0x95 - read pointer */ - SET(sstHW[0x100000 + 0x95], lo << 9); - - /* Default size to page checking mode. - * - * NB: This will get overwritten later if we're using - * the other wrapping code. - */ - info->hwDep.vg96FIFOData.fifoSize = fifosize; - - /* Store fifo data to info */ - info->hwDep.vg96FIFOData.fifoVirt = (FxU32*)fifovirt; - info->hwDep.vg96FIFOData.fifoMax = fifomax; - info->hwDep.vg96FIFOData.fifoPhys = fifophys; - info->hwDep.vg96FIFOData.fifoCur = fifocur; - info->hwDep.vg96FIFOData.fifoLfb = fifolfb; - - /* Set up alternate wrapping values. - * - * NB: This *MUST* come before the processor dependent - * fifo ptr advancing that we do below. - */ -#if SST96_ALT_FIFO_WRAP - /* Assume hw is still at the start of the fifo */ - info->hwDep.vg96FIFOData.fifoRead = (FxU32)fifovirt; - - info->hwDep.vg96FIFOData.roomToEnd = fifomax; - - info->hwDep.vg96FIFOData.fifoSize = - info->hwDep.vg96FIFOData.roomToReadPtr = fifomax - sizeof(FxU32); - - info->hwDep.vg96FIFOData.regDesc = regDesc; -#endif /* SST96_ALT_FIFO_WRAP */ - - if (info->cpuType == 6) { - /* - ** Now, write 128 DWORDS of NULL to the FIFO, so the FIFO read - ** pointer trails the FIFO write pointer by 128 DWORDS. The state - ** setting code fences every 128 DWORDS. - */ - GDBG_INFO((125, "%s: Advancing write pointer 128 DWORDS beyond read.\n", - FN_NAME)); - do { - *fifoptr++ = 0L; - info->hwDep.vg96FIFOData.fifoSize -= 4; - } while (((FxU32) fifoptr) & 0xff); - } else { - GDBG_INFO((125, "%s: No need for write pointer advance.\n", - FN_NAME)); - } - - /* - ** NOTE TO ALL FOOLS WHO TREAD HERE - ** - ** It is VITALLY important to enable the FIFO AFTER the - ** P6 Lag Of Love(tm), instead of before, otherwise the FIFO will - ** become horribly corrupted. - */ - - /* FbiJrInit3 - 0x93 - Load up offchip fifo register */ - GDBG_INFO((80, "%s: Loading up of offchip fifo register\n", FN_NAME)); - SET(sstHW[0x100000 + 0x93], 1 | (lo << 1) | (hi << 11) | (th << 21)); - - /* Set the fifo ptr now that we really know where its going to start - * for the client code. - */ - info->hwDep.vg96FIFOData.fifoPtr = (FxU32*)fifoptr; - - /* Turn on Write combining for the FIFO */ - pciGetConfigData(PCI_BASE_ADDRESS_0, devNum, &physAddr); - - fifoPhysBaseAddress = physAddr + fifoStart; - fifoPhysSize = fifoEnd - fifoStart; - fifoMemType = PciMemTypeWriteCombining; - - res = pciFindMTRRMatch(fifoPhysBaseAddress, fifoPhysSize, - fifoMemType, &fifoMTRRNum); - - if (!res) { - res = pciFindFreeMTRR(&fifoMTRRNum); - } - - if (res) - pciSetMTRR(fifoMTRRNum, fifoPhysBaseAddress, fifoPhysSize, fifoMemType); - else - GDBG_INFO((80, "%s: Couldn't get free or used MTRR!\n")); - - - return rv; - -#undef FN_NAME -} /* init96EnableTransport */ - -/*------------------------------------------------------------------- - Function: init96DisableTransport - Date: 3/16 - Implementor(s): jdt - Library: init96 - Description: - Put the command transport in a safe state - Arguments: - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96DisableTransport, void, ( void )) -{ -#define FN_NAME "init96DisableTransport" - while (*(volatile FxU32 *)sstPtr & 1); - - SET(sstHW[0x100000 + 0x90], 0xf601); /* (0xf601) init0, sw reset. */ - SET(sstHW[0x100000 + 0x95], 0); - SET(sstHW[0x100000 + 0x94], 0); - SET(sstHW[0x100000 + 0x93], 0); - -#if SST96_ALT_FIFO_WRAP - GDBG_INFO((80, "%s: Fifo Statistics - Wrapped:%ld Stalled:%ld\n", - numWraps, numStalls)); -#endif /* SST96_ALT_FIFO_WRAP */ - - /* Clear the MTRR */ - pciSetMTRR(fifoMTRRNum, 0, 0, 0); -#undef FN_NAME -} /* init96DisableTransport */ - -/*------------------------------------------------------------------- - Function: init96Swap - Date: 13-Feb-97 - Implementor(s): jdt, dow, murali - Library: Init Code for VG96 - Description: - Performs VG96 buffer swap - Arguments: - code: usually vsync wait option - wcb: method for writing to hardware - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Swap, void , - (FxU32 code, InitRegisterDesc *rd, Init96WriteMethod *wcb) ) -{ -#define FN_NAME "init96Swap" - FxU32 status; - - static FxBool gotEnv; - static FxBool overrideSwap; - static FxU32 overrideVal; - - GDBG_INFO((80, "init96Swap()\n")); - - /* - * For improved speed we take the following steps - * 1. remove the status checking - * 2. modify grBufferNumPending so it does not need to do P6 nudge code - * 3. add one p6 nudge code - * Here is step 1. Goto grBufferNumPending() in gglide.c to continue. - * - do { - GDBG_INFO((120, "%s: Serial status = 0x%x\n", FN_NAME, status)); - status = *rd->hwDep.VG96RegDesc.serialStatus; - } while (status & 0x1); - */ - - if (cachedSwapType == INIT_SWAP_FLIP) { -#ifdef __linux__ - - FxU32 - offset; - /* Wait for idle */ - do { - status = sstHW[0x100000]; - } while (status & 0x1); - - offset = bI[rfbRenderIdx].dfbBase; - linFlip(offset); - -#else -#ifndef INIT96VGASWAP - /* Direct Write to the Swap Pending register */ - GDBG_INFO((80, "init96Swap: Sending sapppendCMD\n")); - GDBG_INFO((80, " Direct Write of register 0x%x with value 0x%x\n", ((((FxU32) (&sstPtr->swappendCMD)) - (((FxU32) sstPtr) + 0x100000)) >> 2), 1)); - - sstPtr->swappendCMD = 0x1; - - - if (gotEnv == FXFALSE) { - const char *envVal; - if ((envVal = myGetenv("SST96_INITSWAPCOUNT")) != NULL) { - sscanf(envVal, "%x", &overrideVal); - GDBG_INFO((80, "%s: environment SST96_INITSWAPCOUNT (0x%x) overrode code\n", - FN_NAME, overrideVal)); - overrideSwap = FXTRUE; - - } - gotEnv = FXTRUE; - } - - if (overrideSwap == FXTRUE) - code = overrideVal; - - GDBG_INFO((80, "%s: Sending swapbufferCMD (0x%x) via FIFO callback\n", - FN_NAME, code)); - - wcb( (FxU32*)&(sstPtr->swapbufferCMD), 1 ); - status = sstHW[0x100000]; /* bug #1152 */ - - /* Use arrays & rotate for triple buffering */ - -#else /* Swapping With VGA */ - /* - * This is for swapping by changing the VGA serial start register. - * a.k.a "Page flipping" - */ - FxU32 - offset; - FxU8 - tmp, - serialOverflow; - - GDBG_INFO((210, "%s: Swapping With VGA\n", FN_NAME)); - - /* Wait for idle */ - do { - status = sstPtr->status & 0x1; - } while (status & 0x1); - - offset = bI[rfbRenderIdx].dfb; - - GDBG_INFO((80, "%s: Swapping to offset 0x%x\n", FN_NAME, offset)); - /* Fetch serial overflow and clear low nibble for serial start */ - CRTC_GET(AR_CRTC_SERIAL_OVERFLOW_INDEX, serialOverflow); - serialOverflow &= 0xF0; - - /* Make sure scanout within active display */ - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (tmp & VIS1C_PIXEL_DISPLAY_INACTIVE); - - /* Set serial address */ - /* For some reason unknown to me, this is set to the byte offset / 4, - or perhaps the offset in dwords */ - - /* Top nibble */ - tmp = (FxU8) ((offset >> (2+16)) & 0x0F); - CRTC_SET(AR_CRTC_SERIAL_OVERFLOW_INDEX, serialOverflow | tmp); - - /* Middle byte */ - tmp = (FxU8) ((offset >> (2+8)) & 0xFF); - CRTC_SET(VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX, tmp); - - /* Low byte */ - tmp = (FxU8) ((offset >> 2) & 0xFF); - CRTC_SET(VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX, tmp); - - /* Save away */ - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (tmp & VIS1C_VERTICAL_RETRACE_ACTIVE); - - do { - INP(VGA_INPUT_STATUS_1C, tmp); - } while (!(tmp & VIS1C_VERTICAL_RETRACE_ACTIVE)); -#endif -#endif - - /* dpc - 26 jan 1998 - * Some hw, macronix, requires that we diddle w/ even more bits - * when we do the swap. - */ - if(curHALData->initSwapTiles != NULL) (*curHALData->initSwapTiles)(rd); - - ADVANCE_BUFFERS(rfb); - - GDBG_INFO((80, "%s: Setting colBufferSetup (0x%x, 0%x) via FIFO callback\n", - FN_NAME, bI[rfbRenderIdx].rfb, - bI[rfbRenderIdx].rfb)); - wcb( (FxU32*)&(sstPtr->colBufferSetup), bI[rfbRenderIdx].rfb ); - - - } else { - while ((*rd->hwDep.VG96RegDesc.serialStatus) & 0x1); -#ifdef __linux__ - do { - status = sstHW[0x100000]; - } while (status & 0x1); - linSwap(code); -#else - dxSwap(code); -#endif - } - GDBG_INFO((80, "%s: returning\n", FN_NAME)); - return; -#undef FN_NAME -} /* init96Swap */ - - - -/*------------------------------------------------------------------- - Function: init96Idle - Date: 13-Feb-97 - Implementor(s): dow, jdt, murali - Library: Init Code for VG96 - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Idle, void , (Init96WriteMethod *wcb) ) -{ -#define FN_NAME "init96Idle" - - volatile FxU32 *statReg = (volatile FxU32 *) &sstPtr->status; - - wcb((FxU32*)&sstPtr->nopCMD, 0); - - while ( (*statReg) & 0x1 ) { }; - -#undef FN_NAME -} /* init96Idle */ - -/*------------------------------------------------------------------- - Function: init96GetBufferPtr - Date: 2/25 - Implementor(s): jdt - Library: init code for vg96 - Description: - Get a pointer to a specified buffer ( changes at swaps ) - Arguments: - buffer - constant defining buffer - Return: - void opinter to buffer - -------------------------------------------------------------------*/ -#define LFB_OFFSET( X ) ( X & 0x3fffff ) - -INITVG96ENTRY(init96GetBufferPtr, void*, (InitBuffer_t buffer, int *strideBytes)) -{ -#define FN_NAME "init96GetBufferPtr" - void *rv = 0; - - GDBG_INFO((80,"%s\n", FN_NAME)); - - switch( buffer ) { - case INIT_BUFFER_FRONTBUFFER: - GDBG_INFO((80, " get front buffer pointer" )); - rv = (void*)(((char*)sstHW)+bI[rfbFrontIdx].dfbBase); - *strideBytes = bI[rfbFrontIdx].dfbStride; - break; - case INIT_BUFFER_TRIPLEBUFFER: - rv = (void*)(((char*)sstHW)+bI[rfbTripleIdx].dfbBase); - *strideBytes = bI[rfbTripleIdx].dfbStride; - GDBG_INFO((80, " get triple buffer pointer" )); - break; - case INIT_BUFFER_BACKBUFFER: - rv = (void*)(((char*)sstHW)+bI[rfbBackIdx].dfbBase); - *strideBytes = bI[rfbBackIdx].dfbStride; - GDBG_INFO((80, " get back buffer pointer" )); - break; - - case INIT_BUFFER_AUXBUFFER: - rv = (void*)(((char*)sstHW) + LFB_OFFSET(ab0)); - *strideBytes = ab0Stride; - GDBG_INFO((80, " get aux buffer pointer" )); - break; - } - - GDBG_INFO((80, "%s: strideBytes %.05d\n", FN_NAME, *strideBytes )); - GDBG_INFO((80, "%s: returning 0x%x\n", FN_NAME, rv )); - - return rv; -#undef FN_NAME -} /* init96GetBufferPtr */ -#undef LFB_OFFSET - -/*------------------------------------------------------------------- - Function: init96RenderBuffer - Date: 2/25 - Implementor(s): jdt - Library: init96 - Description: - Set the current render buffer - Arguments: - buffer - which buffer to send render ops to - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96RenderBuffer, void, (InitBuffer_t buffer,Init96WriteMethod *wcb)) -{ -#define FN_NAME "init96RenderBuffer" - GDBG_INFO((80,"%s\n", FN_NAME)); - - /* Mess around with indeces here i.e. rfbRender = rfbBack ....*/ - switch( buffer ) { - case INIT_BUFFER_BACKBUFFER: - rfbRenderIdx = rfbBackIdx; - break; - case INIT_BUFFER_FRONTBUFFER: - rfbRenderIdx = rfbFrontIdx; - break; - } - wcb( (FxU32*)&(sstPtr->colBufferSetup), bI[rfbRenderIdx].rfb ); - -#undef FN_NAME -} /* init96RenderBuffer */ - -/*------------------------------------------------------------------- - Function: init96Origin - Date: 2/26 - Implementor(s): jdt - Library: init96 - Description: - Set the yOrigin - Arguments: - origin - Return: - none - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Origin, void, (InitOriginLocation_t origin,Init96WriteMethod *wcb)) -{ -#define FN_NAME "init96Origin" - int i; - GDBG_INFO((80,"%s\n", FN_NAME)); - - /* Once the bases and tops are set, this is pretty straight forward */ - switch ( origin ) { - case INIT_ORIGIN_UPPER_LEFT: - for (i=0; icolBufferSetup), bI[rfbRenderIdx].rfb); - wcb( (FxU32*)&(sstPtr->auxBufferSetup), ab0 ); -#undef FN_NAME -} /* init96Origin */ - -/*------------------------------------------------------------------- - Function: init96ResyncBuffers - Date: 07-Mar-97 - Implementor(s): murali - Library: Init Code for VG96 - Description: - Performs VG96 buffer resync buffers - Arguments: - Return: - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96Control, FxBool , ( FxU32 code, InitRegisterDesc *regDesc)) -{ -#define FN_NAME "init96Control" - int xRes, yRes; - InitBufDesc_t bufDesc[5]; - - GDBG_INFO((80, "(%s)\n", FN_NAME)); - - if ( !sstHW ) return FXFALSE; - -#ifdef __linux__ - if (!linControl(code, bufDesc, &xRes, &yRes)) { -#else - if (!dxControl(code, bufDesc, &xRes, &yRes)) { -#endif - GDBG_INFO((80, "dxControl failed!\n")); - return FXFALSE; - } - - if (!init96LoadBufRegs(NUM_BUFS, bufDesc, xRes, yRes, regDesc)) { - GDBG_INFO((80, "init96LoadBufRegs failed\n")); - } - - GDBG_INFO((80, "%s: Returning TRUE\n", FN_NAME)); - return (yRes << 16) | (xRes); -#undef FN_NAME -} /* init96Control */ - -#if SST96_ALT_FIFO_WRAP - -#define MIN(__x, __y) (((__x) < (__y)) ? (__x) : (__y)) -#define MAX(__x, __y) (((__x) < (__y)) ? (__y) : (__x)) - -/* Macro to get the hw's read ptr located somewhere in the frame - * buffer address space. - */ -#define SST96_HW_FIFO(__hwP, __regP) ((FxU32)(__hwP) + \ - (*((volatile FxU32*)(((FxU32)(__regP)) + (0x95 << 12))) << 3)) - -INITVG96ENTRY(init96WrapFIFO, - FxBool, - (InitRegisterDesc* rd, InitFIFOData* fifoP)) -{ -#define FN_NAME "init96WrapFIFO" - const FxI32 blockSize = fifoP->hwDep.vg96FIFOData.blockSize; - -#if GDBG_INFO_ON - /* no ASSERT macro. Just die if debugging is on. */ - if (blockSize == 0xDEADBEEF) *(FxU32*)NULL = 0x00; -#endif - - { - const FxI32 writes = (MIN(fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd) - - fifoP->hwDep.vg96FIFOData.fifoSize); - - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= writes; - fifoP->hwDep.vg96FIFOData.roomToEnd -= writes; - } - -again: - /* do we need to stall? */ - { - FxU32 lastHwRead = fifoP->hwDep.vg96FIFOData.fifoRead; - FxI32 roomToReadPtr = fifoP->hwDep.vg96FIFOData.roomToReadPtr; - - while (roomToReadPtr < blockSize) { - const FxU32 curReadPtr = SST96_HW_FIFO(sstHW, sstPtr); - const FxU32 curReadDist = curReadPtr - lastHwRead; - - roomToReadPtr += curReadDist; - if (lastHwRead > curReadPtr) roomToReadPtr += fifoP->hwDep.vg96FIFOData.fifoMax; - - lastHwRead = curReadPtr; - } - - GDBG_INFO((80, FN_NAME"_Wait : (0x%X : 0x%X) : (0x%X : 0x%X)\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd)); - - fifoP->hwDep.vg96FIFOData.fifoRead = lastHwRead; - fifoP->hwDep.vg96FIFOData.roomToReadPtr = roomToReadPtr; - } - - /* wrap to front */ - if (fifoP->hwDep.vg96FIFOData.roomToEnd <= blockSize) { - /* Pad out all of the fifo, save the last entry, w/ NUL ops. The - * last entry is written once we know that we are not going to - * overflow the entry count. Oh, for the cvg JMP packet type. - */ -#define kFifoPadDelay (sizeof(FxU32) << 1) -#if GDBG_INFO_ON -#define JU_JU_STALL numJuJuStalls++ -#else -#define JU_JU_STALL /* Do Nothing */ -#endif - { - volatile FxU32* fifoPtr = fifoP->hwDep.vg96FIFOData.fifoPtr; - const FxU32 wrapAddr = ((FxU32)fifoP->hwDep.vg96FIFOData.fifoVirt + - fifoP->hwDep.vg96FIFOData.fifoMax); - - /* Do the padding up to the last entry or so. */ - while((FxU32)fifoPtr < wrapAddr - kFifoPadDelay) *fifoPtr++ = 0x00UL; - - /* Bad ju-ju awaits the person who wraps the fifo when the hw - * ptr is at the start of the fifo. (I've seen it happen, and - * it is not pretty.) - */ - { - volatile FxU32* serialStatus = - fifoP->hwDep.vg96FIFOData.regDesc->hwDep.VG96RegDesc.serialStatus; - - if ((*serialStatus & 0x80) != 0x00) { - GDBG_INFO((85, FN_NAME": fifo close to full. Waiting(0x%X)...\n", numJuJuStalls)); - while((*serialStatus & 0x80) != 0x00) JU_JU_STALL; - GDBG_INFO((85, FN_NAME": fifo drained (0x%X)\n", numJuJuStalls)); - } - } - - /* Finish the padding of the rest of the fifo to the end */ - while((FxU32)fifoPtr < wrapAddr) *fifoPtr++ = 0x00UL; - } -#undef JU_JU_STALL -#undef kFifoPadDelay - - GDBG_INFO((80, FN_NAME"_Wrap : (0x%X : 0x%X) : (0x%X : 0x%X)\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd)); - - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= fifoP->hwDep.vg96FIFOData.roomToEnd; - fifoP->hwDep.vg96FIFOData.roomToEnd = fifoP->hwDep.vg96FIFOData.fifoMax; - - /* Reset fifo ptr to start */ - fifoP->hwDep.vg96FIFOData.fifoPtr = fifoP->hwDep.vg96FIFOData.fifoVirt; - goto again; - } - - /* compute room left */ - fifoP->hwDep.vg96FIFOData.roomToEnd -= blockSize; - fifoP->hwDep.vg96FIFOData.roomToReadPtr -= blockSize; - fifoP->hwDep.vg96FIFOData.fifoSize = MIN(fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd) + blockSize; - - GDBG_INFO((80, FN_NAME": (0x%X : 0x%X) : (0x%X : 0x%X) : 0x%X\n", - (FxU32)fifoP->hwDep.vg96FIFOData.fifoPtr, blockSize, - fifoP->hwDep.vg96FIFOData.roomToReadPtr, - fifoP->hwDep.vg96FIFOData.roomToEnd, - fifoP->hwDep.vg96FIFOData.fifoSize)); - -#if GDBG_INFO_ON - fifoP->hwDep.vg96FIFOData.blockSize = 0xDEADBEEF; -#endif - - return FXTRUE; -#undef FN_NAME -} -#else /* !SST96_ALT_FIFO_WRAP */ - -/*------------------------------------------------------------------- - Function: init96FIFOWait - Date: 12-Jun-97 - Implementor(s): dow - Library: Init Code for VG96 - Description: - Waits for 0x80 in status - Arguments: - rd: Description of registers. - Return: - Nothing - -------------------------------------------------------------------*/ -static void -init96FIFOWait(InitRegisterDesc *rd) -{ -#define FN_NAME "init96FIFOWait" - volatile FxU32 *pstatus; - - - /* Check for more room. */ - pstatus = (volatile FxU32 *) rd->hwDep.VG96RegDesc.serialStatus; - - if (*pstatus & 0x80) { /* 0x80 is the FIFO threshold */ - int timeout; - - again: - for (timeout = 0; timeout < 10000000; timeout++) { - if ((*pstatus & 0x80) == 0) break; - } - if (*pstatus & 0x80) { - GDBG_INFO((80, "Lost patience in %s. Status is 0x%x\n", - FN_NAME, *pstatus)); - goto again; - } - } -#undef FN_NAME -} /* init96FIFOWait */ - -/*------------------------------------------------------------------- - Function: init96WrapFIFO - Date: 13-Feb-97 - Implementor(s): dow - Library: Init Code for VG96 - Description: - Wraps the VG96 FIFO - Arguments: - rd: Description of registers. - Return: - FXTRUE if successful. - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96WrapFIFO, FxBool , (InitRegisterDesc *rd, InitFIFOData *fifoData) ) -{ -#define FN_NAME "init96WrapFIFO" - FxBool rVal; - - GDBG_INFO((80,"%s\n", FN_NAME)); - - while (fifoData->hwDep.vg96FIFOData.fifoSize > 0) { - *fifoData->hwDep.vg96FIFOData.fifoPtr++ = 0L; - fifoData->hwDep.vg96FIFOData.fifoSize -= 4; - } - - - fifoData->hwDep.vg96FIFOData.fifoCur += 4096; - - /* Wrap back to beginning? */ - if (fifoData->hwDep.vg96FIFOData.fifoCur >= fifoData->hwDep.vg96FIFOData.fifoMax ) { - static int fifowraps = 0; - - fifoData->hwDep.vg96FIFOData.fifoCur = 0; - if ((fifowraps = (fifowraps + 1) & 0xf) == 0) { - GDBG_INFO((80, "%s: Wrapping %s FIFO\n", - FN_NAME, - (fifoData->hwDep.vg96FIFOData.fifoLfb - ? "LFB" - : "Video Aperture"))); - } - - if (fifoData->hwDep.vg96FIFOData.fifoLfb) - fifoData->hwDep.vg96FIFOData.fifoPtr = fifoData->hwDep.vg96FIFOData.fifoVirt; - } - - /* */ - { - FxU32 - fbiJrInit5; - - GDBG_INFO((125, "%s: Write = 0x%x\n", FN_NAME, - (FxU32) fifoData->hwDep.vg96FIFOData.fifoPtr - - (FxU32) fifoData->hwDep.vg96FIFOData.fifoVirt)); - - fbiJrInit5 = *((volatile FxU32 *) (((FxU32) sstPtr) + (0x95 << 12))); - - GDBG_INFO((125, "%s: Read = 0x%x\n", FN_NAME, - (fbiJrInit5 << 3) - - ( - (FxU32) fifoData->hwDep.vg96FIFOData.fifoVirt - - (FxU32) rd->hwDep.VG96RegDesc.baseAddress - ) - )); - - } - - GDBG_INFO((80, "%s: Waiting for more room.\n", FN_NAME)); - init96FIFOWait(rd); - - /* - ** if we get here, then there's room in the FIFO - */ - - GDBG_INFO((80, "%s: Got more room.\n", FN_NAME)); - - /* At this point, we have atleast 1 more page of fifo. */ - fifoData->hwDep.vg96FIFOData.fifoSize = 4096; - - rVal = FXTRUE; - - GDBG_INFO((80, "%s: returning %s\n", FN_NAME, rVal ? "FXTRUE" : "FXFALSE")); - - return rVal; - -#undef FN_NAME -} /* init96WrapFIFO */ - -#endif /* !SST96_ALT_FIFO_WRAP */ - -/* - * This function is used only locally, so none of Chris's decorations - * Load colbufSetup and auxBufSetup registers, given a InitBufDesc_t - */ -static FxBool -init96LoadBufRegs(int nBuffers, InitBufDesc_t *pBufDesc, int xRes, - int yRes, InitRegisterDesc *rd) -{ -#define FN_NAME "init96LoadBufRegs" - InitBufDesc_t *pFront = NULL; - InitBufDesc_t *pBack = NULL; - InitBufDesc_t *pTriple = NULL; - InitBufDesc_t *pAux = NULL; - InitBufDesc_t *pFifo = NULL; - int i; - - GDBG_INFO((80, "(%s) w = %d, h = %d, n = %d\n", - FN_NAME, xRes, yRes, nBuffers)); - - if ( !sstHW ) return FXFALSE; - - /* Take pBufDesc apart */ - while (nBuffers-- > 0) { - switch (pBufDesc->bufType) { - case INIT_BUFFER_FRONTBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pFront = pBufDesc; - break; - case INIT_BUFFER_BACKBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pBack = pBufDesc; - break; - case INIT_BUFFER_AUXBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pAux = pBufDesc; - break; - case INIT_BUFFER_FIFOBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pFifo = pBufDesc; - break; - case INIT_BUFFER_TRIPLEBUFFER: - GDBG_INFO((80, "%s: %s: 0x%x\n", - FN_NAME, bufTypeNames[pBufDesc->bufType], pBufDesc)); - pTriple = pBufDesc; - break; - default: - break; - } - pBufDesc++; - } - if (pFront == NULL) return FXFALSE; - if (pBack == NULL) pBack = pFront; - if (pTriple == NULL) pTriple = pFront; - if (pAux == NULL) pAux = pFront; - - GDBG_INFO((80,"pFront = %.08x, pBack = %.08x, pTriple = %.08x, pAux = %.08x, pFifo = %.08x\n", - pFront, pBack, pTriple, pAux, pFifo)); - - if (myGetenv("SST96_FORCEALIGN")) { - FxU32 F, B, T, A; - - sscanf(myGetenv("SST96_FORCEALIGN"), "%x,%x,%x,%x", &F, &B, &T, &A); - GDBG_INFO((80, "!!!!!GROSS HACK... forcing values!!!!!\n")); - pFront->bufOffset = F; - pBack->bufOffset = B; - pTriple->bufOffset = T; - pAux->bufOffset = A; - } - - if (pFront) - GDBG_INFO((80,"F = %.08x, s= %6d\n", pFront->bufOffset, pFront->bufStride)); - if (pBack) - GDBG_INFO((80,"B = %.08x, s= %6d\n", pBack ->bufOffset, pBack ->bufStride)); - if (pTriple) - GDBG_INFO((80,"T = %.08x, s= %6d\n", pTriple ->bufOffset, pTriple ->bufStride)); - if (pAux) - GDBG_INFO((80,"A = %.08x, s= %6d\n", pAux ->bufOffset, pAux ->bufStride)); - if (pFifo) - GDBG_INFO((80,"C = %.08x, s= %6d\n", pFifo ->bufOffset, pFifo ->bufStride)); - - /* Fill the arrays here */ - bI[0].dfbBase = pFront->bufOffset; - bI[0].dfbStride = pFront->bufStride; - bI[0].dfbTop = pFront->bufOffset + (yRes-1) * pFront->bufStride; - - bI[1].dfbBase = pBack->bufOffset; - bI[1].dfbStride = pBack->bufStride; - bI[1].dfbTop = pBack->bufOffset + (yRes-1) * pBack->bufStride; - - if (pTriple) { - bI[2].dfbBase = pTriple->bufOffset; - bI[2].dfbStride = pTriple->bufStride; - bI[2].dfbTop = pTriple->bufOffset + (yRes-1) * pTriple->bufStride; - } - - ab0Base = pAux->bufOffset; - ab0Stride = pAux ->bufStride; - ab0Top = pAux->bufOffset + (yRes-1) * pAux->bufStride; - - for (i=0; ibufOffset; - fifoEnd = pFifo->bufOffset + pFifo->bufStride; - } - - GDBG_INFO((80, "%s: Returning TRUE\n", FN_NAME)); - return FXTRUE; -#undef FN_NAME -} /* init96LoadBufRegs */ - -/*------------------------------------------------------------------- - Function: init96GetFBVram - Date: 24-Apr-97 - Implementor(s): pgj - Library: Test for 2Mb or 4Mb board - Description: This routine returns the number of bytes of VRAM - on the board. Currently only 2 or 4 MB are returned on - success. Zero is returned of the board is not mapped. - XXX This should be refined in the future. XXX - - Arguments: none - - Return: n, where n == available VRAM in bytes on the board - -------------------------------------------------------------------*/ -INITVG96ENTRY(init96GetFBVram, FxU32 , (void) ) -{ -#define FN_NAME "init96GetFBVram" - VG96Info info; - - if (curHALData->initGetInfo) { - (*curHALData->initGetInfo)(&info); - GDBG_INFO((80, "%s: returning %d bytes\n", FN_NAME, info.vg96Ram)); - return info.vg96Ram; - } else { - GDBG_INFO((80, "%s: curHALData not valid!!!\n", FN_NAME)); - return 0; - } - -#undef FN_NAME -} /* init96GetFBVram */ diff --git a/glide2x/sst1/init/init96/init96.h b/glide2x/sst1/init/init96/init96.h deleted file mode 100644 index f9d1067..0000000 --- a/glide2x/sst1/init/init96/init96.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** -** SST-96 Initialization library -*/ - - -#ifndef __INIT96_H__ -#define __INIT96_H__ - -/* Partners' Chips */ -#define AT3D 1 /* Alliance Semiconductor AT3D*/ -#define T9685 2 /* Trident 9685 */ -#define MR510 3 /* MRTI MR510 */ -#define MX86251 4 /* Macronics MX 86251 */ - -#ifndef INIT96_LIB -#define INITVG96ENTRY(name, retType, args) FX_ENTRY retType FX_CALL name args -#else -#define INITVG96ENTRY(name, retType, args) FX_EXPORT retType FX_CSTYLE name args -#endif - -typedef void Init96WriteMethod( FxU32 *addr, FxU32 data ); - -INITVG96ENTRY(init96MapBoard, FxBool, - (void *rD, void *info, FxU16 vID, FxU16 dID) ); -INITVG96ENTRY(init96SetVideo, FxBool , - (FxU32 hWnd, GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin,int nColBuffers, - int nAuxBuffers, InitRegisterDesc *rd, int *xres, - int *yres, int *fbStride)); -INITVG96ENTRY(init96RestoreVideo, void, ( InitRegisterDesc *regDesc )); -INITVG96ENTRY(init96EnableTransport, FxBool, ( InitFIFOData *info, InitRegisterDesc* regDesc)); -INITVG96ENTRY(init96DisableTransport, void, ( void )); -INITVG96ENTRY(init96Swap, void , - (FxU32 code, InitRegisterDesc *regDesc, - Init96WriteMethod *wcb) ); -INITVG96ENTRY(init96Idle, void , (Init96WriteMethod *wcb) ); -INITVG96ENTRY(init96GetBufferPtr, void*, - (InitBuffer_t buffer, int *strideBytes )); -INITVG96ENTRY(init96RenderBuffer, void, - (InitBuffer_t buffer,Init96WriteMethod *wcb)); -INITVG96ENTRY(init96Origin, void, - (InitOriginLocation_t origin, Init96WriteMethod *wcb)); -INITVG96ENTRY(init96Control, FxBool , (FxU32 code, InitRegisterDesc *rd) ); -INITVG96ENTRY(init96WrapFIFO, FxBool , - (InitRegisterDesc *rd, InitFIFOData *fifoData) ); -INITVG96ENTRY(init96GetFBVram, FxU32 , (void) ); -#endif /* __INIT96_H__ */ diff --git a/glide2x/sst1/init/init96/initat3d.h b/glide2x/sst1/init/init96/initat3d.h deleted file mode 100644 index 7a65ddf..0000000 --- a/glide2x/sst1/init/init96/initat3d.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ -#ifndef __INITAT3D_H__ -#define __INITAT3D_H__ - -#define AT3D_IN_VSYNC (_inp(INPUT_STATUS_1) & VERTICAL_RETRACE_ACTIVE) - -#ifdef INIT_AT3D_LIB -#define INITAT3DENTRY(fun, type, args) FX_EXPORT type FX_CALL fun args -#else -#define INITAT3DENTRY(fun, type, args) FX_ENTRY type FX_CSTYLE fun args -#endif -INITAT3DENTRY(initAT3DGetHALData, Init96HALData *, (void) ); -INITAT3DENTRY(initAT3DAperture, FxBool, (InitRegisterDesc *rd) ); -INITAT3DENTRY(initAT3DSetVideo, FxBool, ( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )); -INITAT3DENTRY(initAT3DEnableRegs, FxBool,(InitRegisterDesc *rd)); -INITAT3DENTRY(initAT3DDisableRegs,FxBool,(InitRegisterDesc *rd)); -#ifdef H3D -INITAT3DENTRY(initAT3DUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height, FxU32 pageFlipping)); -#else -INITAT3DENTRY(initAT3DUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height)); -#endif -INITAT3DENTRY(initAT3DGetInfo, FxBool,(VG96Info *info)); -#endif /* __INITAT3D_H__ */ - diff --git a/glide2x/sst1/init/init96/initmcrx.c b/glide2x/sst1/init/init96/initmcrx.c deleted file mode 100644 index d8d454f..0000000 --- a/glide2x/sst1/init/init96/initmcrx.c +++ /dev/null @@ -1,612 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ -static char revString[] = "@#%$Workfile: initmcrx.c $ $Revision$"; - -#include <3dfx.h> - -#include -#include -#include -#ifndef __linux__ -#include -#else -#include -#define _inp(port) pioInByte(port); -#define _outp(port,data) pioOutByte(port, data); -#define _outpw(port,data) pioOutWord(port, data); -#endif -#ifdef __DOS32__ -#include -#endif - -#ifdef __WIN32__ -#include -#endif /* __WIN32__ */ - -#define INIT_MCRX_LIB -#define FX_DLL_DEFINITION -#include -#include -#include - - -#include -#include "fxinit96.h" -#include "initmcrx.h" - -#ifndef BIT -#define BIT(a) (1 << a) -#endif - -/* Global Data */ -static Init96HALData mcrxHALData = { - 0x2000000, - initMCRXAperture, - initMCRXSetVideo, - initMCRXEnableRegs, - initMCRXDisableRegs, - initMCRXWrapFIFO, - initMCRXUseTiles, - initMCRXGetInfo, - NULL /* initMCRXSwapTiles */ -}; - - -#if 0 /* ??? needed??? XXX */ -static FxBool tiling; -#endif - -/*------------------------------------------------------------------- - Function: intiMCRXGetHALData - Date: 09-May-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - - Arguments: - - Return: - address of mcrxHALData - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXGetHALData, Init96HALData *, (void) ) -{ -#define FN_NAME "intiMCRXGetHALData" - return &mcrxHALData; -#undef FN_NAME -} /* intiMCRXGetHALData */ - -/*------------------------------------------------------------------- - Function: initMCRXAperture - Date: 3-May-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - Initialize rd pointers to access apertures - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXAperture, FxBool , (InitRegisterDesc *rd) ) -{ -#define FN_NAME "initMCRXAperture" - FxBool - rVal = FXTRUE; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - rd->hwDep.VG96RegDesc.partnerRegPtr = (FxU32 *) - ((FxU32) rd->hwDep.VG96RegDesc.baseAddress + - 0x2000000 - 0x20000); - - GDBG_INFO((80, "%s: Setting partnerRegPtr to 0x%x\n", - FN_NAME, rd->hwDep.VG96RegDesc.partnerRegPtr)); - -#if 1 - rd->hwDep.VG96RegDesc.serialStatus = (FxU32 *) - ((FxU32) rd->hwDep.VG96RegDesc.partnerRegPtr + 0x700); -#else - GDBG_INFO((80, "%s: Working around invalid serial status\n", FN_NAME)); - rd->hwDep.VG96RegDesc.serialStatus = - &rd->hwDep.VG96RegDesc.baseAddress[0x100000]; -#endif - GDBG_INFO((80, "%s: Setting seial status to 0x%x\n", FN_NAME, rd->hwDep.VG96RegDesc.serialStatus)); - - /* BOGUS */ - rd->hwDep.VG96RegDesc.fifoApertureBase = - (FxU32 *) (((FxU32)rd->hwDep.VG96RegDesc.baseAddress) + 0x400000); - - GDBG_INFO((80, "%s: returning TRUE\n", FN_NAME)); - - return rVal; - -#undef FN_NAME -} /* initMCRXAperture */ - -/* FIXME !! jdt - need to add more resolutions to dos */ -INITMCRXENTRY(initMCRXSetVideo, FxBool, (GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )) -{ -#define FN_NAME "initMCRXSetVideo" - FxBool rv = FXTRUE; -#if defined(INIT_ACCESS_DIRECT) && defined( __DOS32__ ) - union REGS r0, r1; -#endif - - GDBG_INFO((80, "%s: \n", FN_NAME)); - -#if defined(INIT_ACCESS_DIRECT) && defined( __DOS32__ ) - switch( res ) { - case GR_RESOLUTION_320x200: - /* Set up VESA Mode 0x136 - 320x200x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0136; - *xr = 320; - *yr = 200; - rv = FXTRUE; - break; - case GR_RESOLUTION_320x240: - /* Set up VESA Mode 0x137 - 320x240x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0137; - *xr = 320; - *yr = 240; - rv = FXTRUE; - break; - case GR_RESOLUTION_512x384: - /* Set up VESA Mode 0x139 - 512x384x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0139; - *xr = 512; - *yr = 384; - rv = FXTRUE; - break; - case GR_RESOLUTION_640x480: - /* Set up VESA Mode 0x111 - 640x480x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0111; - *xr = 640; - *yr = 480; - rv = FXTRUE; - break; - case GR_RESOLUTION_800x600: - /* Set up VESA Mode 0x114 - 800x600x16 */ - r1.w.ax = 0x4f02; - r1.w.bx = 0x0114; - *xr = 800; - *yr = 600; - rv = FXTRUE; - break; - default: - rv = FXFALSE; - break; - } - - if (rv == FXTRUE) { - GDBG_INFO((80, "initMCRXSetVideo: Enabling VESA modes\n")); - r0.w.ax = 0x6483; - r0.w.bx = 0x0060; - int386( 0x10, &r0, &r0 ); - - GDBG_INFO((80, "initMCRXSetVideo: Setting video mode %dx%dx16\n", - *xr, *yr)); - int386( 0x10, &r1, &r1 ); - } - -#endif - GDBG_INFO((80, "%s: returning %s\n", FN_NAME, rv?"TRUE":"FALSE")); - return rv; -#undef FN_NAME -} /* initMCRXSetVideo */ - -/*------------------------------------------------------------------- - Function: initMCRXEnableRegs - Date: 07-Feb-97 - Implementor(s): dow - Library: Init Code for MCRX - Description: - - Do all setup necessary to enable direct writes to JR Space - - Arguments: - rd - pointer to register description - - Return: - True if success, False if Failure - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXEnableRegs, FxBool, (InitRegisterDesc *rd)) -{ -#define FN_NAME "initMCRXEnableRegs" - FxU32 - tmp; - FxU8 - crtcIndex; - FxU16 - protState; - - const char *envVal; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - GDBG_INFO((80, "%s: Unprotect\n", FN_NAME)); - - GDBG_INFO((80, "%s: Save CRTC Index\n", FN_NAME)); - INP(0x3c4, crtcIndex); - - GDBG_INFO((80, "%s: Save Extended Registers Protection State\n", - FN_NAME)); - - OUTP(0x3d4, 0x19); - INP(0x3d5, protState); - - protState <<= 8; - protState |= 0x19; - - GDBG_INFO((80, "%s: Enabling Access to Extended Registers\n", FN_NAME)); - OUTPW(0x3d4, 0x8819); - - /* Getting initial values of the mclock for later restore */ - GDBG_INFO((80, "%s: Getting macronix mclock registers\n", FN_NAME)); - OUTP(0x3C4, 0x1A); - INP(0x3C5, rd->hwDep.VG96RegDesc.mclockHi); - - OUTP(0x3C4, 0x1B); - INP(0x3C5, rd->hwDep.VG96RegDesc.mclockLo); - GDBG_INFO((80, "%s: mclock registers: (0x%X : 0x%X)\n", FN_NAME, - (FxU32)rd->hwDep.VG96RegDesc.mclockHi, (FxU32)rd->hwDep.VG96RegDesc.mclockHi)); - - GDBG_INFO((80, "%s: Enabling FBI Jr.\n", FN_NAME)); - OUTPW(0x3C4, 0x001F); - - GDBG_INFO((80, "%s: Setting clock to 50MHz\n", FN_NAME)); - OUTPW(0x3c4, 0x011a); - OUTPW(0x3c4, 0x061b); - - /* Macronix reset propogation */ - GDBG_INFO((80, "%s: Macronix reset\n", FN_NAME)); - OUTPW(0x3c4, 0x081c); - OUTPW(0x3c4, 0x001c); - - GDBG_INFO((80, "%s: Hard Reset of FBI Jr.\n", FN_NAME)); - OUTPW(0x3d4, 0x0029); - OUTPW(0x3d4, 0x0129); - - GDBG_INFO((80, "%s: Enabling PUMA\n", FN_NAME)); - CRTC_GET(0x28, tmp); - tmp |= 1; - if (envVal = myGetenv("MCRX_28")) sscanf(envVal, "%x", &tmp); - CRTC_SET(0x28, tmp); - - GDBG_INFO((80, "%s: Restoring Protection\n", FN_NAME)); - OUTP(0x3d4, protState); - - GDBG_INFO((80, "%s: Restoring Sequencer Index\n", FN_NAME)); - OUTP(0x3c4, crtcIndex); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXEnableRegs */ - - -/* FIXME!!! jdt - puma/ram timing fixes need to go here */ -INITMCRXENTRY(initMCRXDisableRegs,FxBool,(InitRegisterDesc *rd)) -{ -#define FN_NAME "initMCRXDisableRegs" - FxU8 - seqSave, crtcSave; - - FxU16 - protState; - - FxU32 - tmp; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - GDBG_INFO((80, "%s: Saving Sequencer Index\n", FN_NAME)); - INP(0x3c4, seqSave); - - GDBG_INFO((80, "%s: Saving CRTC Index\n", FN_NAME)); - INP(0x3d4, crtcSave); - - GDBG_INFO((80, "%s: Saving Protection State\n", FN_NAME)); - OUTP(0x3d4, 0x19); - INP(0x3d5, protState); - - protState <<= 9; - protState |= 0x19; - - GDBG_INFO((80, "%s: Enabling access to extended registers\n", FN_NAME)); - OUTPW(0x3d4, 0x8819); - - /* Reset 3Dfx chip via macronix */ - GDBG_INFO((80, "%s: Reset 3Dfx via macronix\n", FN_NAME)); - OUTPW(0x3d4, 0x0029); - OUTPW(0x3d4, 0x0129); - - GDBG_INFO((80, "%s: Disabling PUMA\n", FN_NAME)); - CRTC_GET(0x28, tmp); - GDBG_INFO((80, "%s: crtc 0x28: 0x%X\n", FN_NAME, tmp)); - tmp &= ~1; - CRTC_SET(0x28, tmp); - - GDBG_INFO((80, "%s: Turning off FBI Jr.\n", FN_NAME)); - OUTPW(0x3c4, 0x061f); - - /* Restore the mclock */ - { - FxU16 tempMclock; - - GDBG_INFO((80, "%s: Restoring mclock\n", FN_NAME)); - tempMclock = (0x1A | (rd->hwDep.VG96RegDesc.mclockHi << 8)); - OUTPW(0x3C4, tempMclock); - - tempMclock = (0x1B | (rd->hwDep.VG96RegDesc.mclockLo << 8)); - OUTPW(0x3C4, tempMclock); - - /* Macronix MCLK reset propogation */ - OUTPW(0x3C4, 0x081C); - OUTPW(0x3C4, 0x001C); - } - - GDBG_INFO((80, "%s: Restoring Protection\n", FN_NAME)); - OUTPW(0x3df, protState); - - GDBG_INFO((80, "%s: Restoring CRTC Index\n", FN_NAME)); - OUTP(0x3d4, crtcSave); - - GDBG_INFO((80, "%s: Restoring Sequencer Index\n", FN_NAME)); - OUTP(0x3c4, seqSave); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXDisableRegs */ - -/*------------------------------------------------------------------- - Function: initMCRXWrapFIFO - Date: 20-Feb-97 - Implementor(s): tarolli - Library: Init Code for MCRX - Description: - - Arguments: - - Return: - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXWrapFIFO, FxBool, (InitRegisterDesc *rd, InitFIFOData *fd) ) -{ -#define FN_NAME "initMCRXWrapFIFO" - return FXFALSE; -#undef FN_NAME -} /* initMCRXWrapFIFO */ - -#define MAX_BUF 3 - -static unsigned char magic[MAX_BUF][3] = { - { 0x0d, 0x0c, 0x21 }, - { 0x71, 0x72, 0x73 }, - /* chd - Fixme! - * Bogus numbers. Does triple buffering work on Macronix? - * - * dpc - 23 jan 1998 - - * Donny just told me this so hopefully this will work. - */ - { 0x74, 0x75, 0x76 } -}; - -INITMCRXENTRY(initMCRXSwapTiles, FxBool, (InitRegisterDesc* rd)) -{ -#define FN_NAME "initMCRXSwapTiles" - FxU8 crtcSwapStatus; - FxU8 crtcSwapControl; - - /* Get the # of buffers swapping */ - OUTP(0x3D4, 0x70); - INP(0x3D5, crtcSwapControl); - - /* Get the current active buffer setting */ - OUTP(0x3D4, 0x7A); - INP(0x3D5, crtcSwapStatus); - - /* Bits 0-1 indicate the current active buffer. Check to see if we - * need to wrap this and go to the next buffer. - */ - { - const FxU8 bufferBits = (crtcSwapStatus & 0x03); - const FxU8 maxBufferBits = (((crtcSwapControl & 0x08) == 0) ? 1 : 2); - - crtcSwapStatus = ((crtcSwapStatus & ~0x03) | - ((bufferBits == maxBufferBits) ? 0x00 : bufferBits + 1)); - CRTC_SET(0x7A, crtcSwapStatus); - } - - /* We have no way of knowing that this worked so of course we always - * return success. - */ - return FXTRUE; -#undef FN_NAME -} - -/*------------------------------------------------------------------- - Function: initMCRXUseTiles - Date: 07-Feb-97 (Moved into initMCRX from init96) - Implementor(s): pgj, dow - Library: Init Code for MCRX - Description: - - Arguments: - atmm: Pointer to base of MCRX - buffers: Pointer to array of offsets to buffers - nBuffers: Total number of buffers - backBuffer: FB offset of back buffer - strideInBytes: Tile width in bytes - - Return: - 1 if successful, 2 if renderbuffers need to be swapped. - -------------------------------------------------------------------*/ -#ifdef H3D -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, - FxU32 nBuffers, - FxU32 strideInBytes, - FxU32 Width, FxU32 Height, FxU32 PageFlipping)) -#else -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, - FxU32 nBuffers, - FxU32 strideInBytes, - FxU32 Width, FxU32 Height)) -#endif -{ -#define FN_NAME "initMCRXUseTiles" - - int ret = 1; - unsigned int i; - - FxU32 - dwordOffset; - - FxU8 - regVal; - - FxU32 - tmp; - - const char *envVal; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - regVal = _inp(VGA_MISC_OUTPUT_READ); - /* Mask off bit 7 */ - regVal |= (1<<7); - _outp(VGA_MISC_OUTPUT_WRITE, regVal); - - /*--------------------------------- - CONFIGURE TILES - ---------------------------------*/ - for (i=0; i < nBuffers; i++) { - FxU32 - buf = buffers[i]; - - GDBG_INFO((80, "%s: Setting up buffer %d\n", FN_NAME, i)); - - dwordOffset = buf >> 2; - - GDBG_INFO((80, "%s: Buffer[%d] = 0x%x, dwordOffset = 0x%x\n", - FN_NAME, i, buf, dwordOffset)); - - GDBG_INFO((80, "%s: Writing bits 0-7 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) (dwordOffset & 0xff); - - CRTC_SET(magic[i][0], tmp); - - GDBG_INFO((80, "%s: Writing bits 8-15 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) ((dwordOffset >> 8) & 0xff); - CRTC_SET(magic[i][1], tmp); - - GDBG_INFO((80, "%s: Writing bits 16-19 of buffer 0 offset\n", FN_NAME)); - tmp = (FxU8) ((dwordOffset >> 16) & 0xf); - CRTC_SET(magic[i][2], tmp); - } - - GDBG_INFO((80, "%s: Setting up Swap Control\n", FN_NAME)); - tmp = 0x01; - - /* dpc - 26 han 1998 - * If we are triple buffering we need to enable this on the actual - * macronix part as well. This is set by enabling bit 3 of the crtc - * register. - */ - if (nBuffers == 3) tmp |= 0x08; - mcrxHALData.initSwapTiles = initMCRXSwapTiles; - - if (envVal = myGetenv("MRCX_71")) - sscanf(envVal, "%x", &tmp); - CRTC_SET(0x70, tmp); - - /* Reset the current display buffer bits (0-1) */ - { - FxU8 crtcSwapBuffer; - - OUTP(0x3D4, 0x7A); - INP(0x3D5, crtcSwapBuffer); - - crtcSwapBuffer &= ~0x03; - CRTC_SET(0x7A, crtcSwapBuffer); - } - - return ret; - -#undef FN_NAME -} /* initMCRXUseTiles */ - - -/*------------------------------------------------------------------- - Function: initMCRXGetInfo - Date: 28-Apr-97 - Implementor(s): pgj, dow - Library: Init Code for MCRX - Description: - - get information about MCRX - - Arguments: - info - pointer to info struct - - Return: - True if success, False if Failure - -------------------------------------------------------------------*/ -INITMCRXENTRY(initMCRXGetInfo,FxBool,(VG96Info *info)) -{ -#define FN_NAME "initMCRXGetInfo" - FxU32 mBytesPow; - FxU8 res; - - GDBG_INFO((80, "%s:\n", FN_NAME)); - - CRTC_GET(0x1a, res); - - /* We care about bit 5 & 6 */ - mBytesPow = ((res >> 5) & 3); - - /* Watcom warning suppression */ - revString[0] = revString[0]; - - info->vgaChip = 0; - info->vg96Rev = 0; - info->nTFX = 1; - info->tfxRev = 1; - info->tfxRam = 2; - - info->vg96Ram = (0x100000 << mBytesPow); - - GDBG_INFO((80, "%s: frame buffer has 0x%x bytes\n", FN_NAME, info->vg96Ram)); - - return FXTRUE; - -#undef FN_NAME -} /* initMCRXGetInfo */ - - diff --git a/glide2x/sst1/init/init96/initmcrx.h b/glide2x/sst1/init/init96/initmcrx.h deleted file mode 100644 index 1a9589e..0000000 --- a/glide2x/sst1/init/init96/initmcrx.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ -#ifndef __INITMCRX_H__ -#define __INITMCRX_H__ -#define SETMCRX(d,s) d = s -#define GETMCRX(s) s - -#ifdef INIT_MCRX_LIB -#define INITMCRXENTRY(fun, type, args) FX_EXPORT type FX_CALL fun args -#else -#define INITMCRXENTRY(fun, type, args) FX_ENTRY type FX_CSTYLE fun args -#endif -INITMCRXENTRY(initMCRXGetHALData, Init96HALData *, (void) ); -INITMCRXENTRY(initMCRXAperture, FxBool, (InitRegisterDesc *rd) ); -INITMCRXENTRY(initMCRXSetVideo, FxBool, ( GrScreenResolution_t res, GrScreenRefresh_t refresh, FxU32 *xr, FxU32 *yr )); -INITMCRXENTRY(initMCRXEnableRegs, FxBool,(InitRegisterDesc *rd)); -INITMCRXENTRY(initMCRXDisableRegs,FxBool,(InitRegisterDesc *rd)); -INITMCRXENTRY(initMCRXWrapFIFO, FxBool , (InitRegisterDesc *rd, InitFIFOData *fd) ); -#ifdef H3D -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height, FxU32 PageFlipped)); -#else -INITMCRXENTRY(initMCRXUseTiles, int, (InitRegisterDesc *rd, - FxU32 *buffers, FxU32 nBuffers, - FxU32 strideInBytes, FxU32 width, FxU32 height)); -#endif -INITMCRXENTRY(initMCRXGetInfo, FxBool,(VG96Info *info)); -#endif /* __INITMCRX_H__ */ - diff --git a/glide2x/sst1/init/init96/initvga.h b/glide2x/sst1/init/init96/initvga.h deleted file mode 100644 index 4f33098..0000000 --- a/glide2x/sst1/init/init96/initvga.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#ifndef _INITPIO_H_ -#define _INITPIO_H_ - -#if defined(__WATCOMC__) -#define _inp inp -#define _outp outp -#define _outpw outpw -#endif - -/* -** Some Standard VGA Registers -*/ -/* Reading */ -#define VGA_MISC_OUTPUT_READ 0x3cc - -/* Writing */ -#define VGA_MISC_OUTPUT_WRITE 0x3c2 - -/* Read/Write */ -#define VGA_REGISTER_INPUT_STATUS_1_MONO 0x3BA -#define VGA_REGISTER_INPUT_STATUS_1_COLOR 0x3DA -#define VGA_INPUT_STATUS_1C 0x3DA -#define VIS1C_PIXEL_DISPLAY_INACTIVE BIT(0) -#define VIS1C_VERTICAL_RETRACE_ACTIVE BIT(3) - -#define VGA_REGISTER_CRTC 0x3D4 -#define VR_CRTC_SERIAL_START_ADDRESS_HI_INDEX 0x0C -#define VR_CRTC_SERIAL_START_ADDRESS_LO_INDEX 0x0D -#define AR_CRTC_SERIAL_OVERFLOW_INDEX 0x1C - -/* General Port I/O */ -#ifdef GDBG_INFO_ON - -#define OUTP(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outp(port, val) - -#define OUTPW(port,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to port 0x%x\n", FN_NAME, val, port));\ -_outpw(port, val) - - -#define INP(port, val)\ -val = _inp(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#define INPW(port, val)\ -val = _inpW(port);\ -GDBG_INFO((80, "%s: Read 0x%x from port 0x%x\n", FN_NAME, val, port)) - -#else - -#define OUTP(port, val) _outp(port, val) -#define INP(port, val) val = _inp(port) - -#define OUTPW(port, val) _outpw(port, val) -#define INPW(port, val) val = _inpw(port) - -#endif - -/* Macros for Sequencer registers */ -#define SEQU_INDEX 0x3c4 -#define SEQU_DATA 0x3c5 - -/* Macros for CRTC registers */ -#define CRTC_INDEX 0x3d4 -#define CRTC_DATA 0x3d5 - -#ifdef GDBG_INFO_ON - -#define SEQU_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to Sequencer Index 0x%x\n", FN_NAME, val, reg));\ -_outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val)\ -_outp(SEQU_INDEX, reg);val = _inp(SEQU_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from Sequencer Index 0x%x\n", val, reg)); - -#define CRTC_SET(reg,val)\ -GDBG_INFO((80, "%s: Writing 0x%x to CRTC Index 0x%x\n", FN_NAME, val, reg));\ -_outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,val)\ -_outp(CRTC_INDEX, reg); val = _inp(CRTC_DATA);\ -GDBG_INFO((80, "%s: Read 0x%x from CRTC Index 0x%x\n", FN_NAME, val, reg)) - -#else - -#define SEQU_SET(reg,val) _outp(SEQU_INDEX, reg); _outp(SEQU_DATA, val) -#define SEQU_GET(reg,val) _outp(SEQU_INDEX, reg); val = _inp(SEQU_DATA) - -#define CRTC_SET(reg,val) _outp(CRTC_INDEX, reg); _outp(CRTC_DATA, val) -#define CRTC_GET(reg,d) _outp(CRTC_INDEX, reg); d = _inp(CRTC_DATA) - -#endif - - -#endif /* _INITPIO_H_ */ diff --git a/glide2x/sst1/init/init96/lindrvr.c b/glide2x/sst1/init/init96/lindrvr.c deleted file mode 100644 index 14621a0..0000000 --- a/glide2x/sst1/init/init96/lindrvr.c +++ /dev/null @@ -1,575 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -*/ - -#include -#include -#include -#ifndef DUMMY -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -/* 3Dfx Headers */ -#include <3dfx.h> -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#include - -/* Local Headers */ -#include "init96.h" -#include "fxinit96.h" - -#define VG96_BUF_MAGIC 0x666 -#define FIFOSIZE (65536<<1) - -FxBool tripleBuffering = 0; - -#define NUM_BUFS 6 - -#ifndef DUMMY -static Display *dpy = 0; -static int screenNum = 0; -static int screenWidth = 0; -static void* screenPhys = 0; -static int screenMem = 0; -static GC xgc = 0; -static Window hWndApp = 0; -static FxU32 Width = 0; -static FxU32 Height = 0; -static FxBool IsFullScreen = 0; -static InitBufDesc_t BufDesc[NUM_BUFS] = {0}; -static XF86VidModeModeInfo **vidModes = 0; - -static Pixmap pixBack = 0; -static Pixmap pixAux = 0; -static Pixmap pixTriple = 0; -static Pixmap pixFifo = 0; -static void *addrFront = 0; -static void *addrBack = 0; -static void *addrAux = 0; -static void *addrTriple = 0; -static void *addrFifo = 0; -#endif - -#ifdef DUMMY -FxBool -linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - return FXFALSE; -} - -FxBool linClose() -{ - return FXFALSE; -} - -FxBool -linControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - return FXFALSE; -} - -void -linSwap(FxU32 code) -{} - -void -linFlip(FxU32 buffer) -{} - -#else - -static FxBool -ErrorMessage(Window win, char *err) -{ - fprintf(stderr, "Error %s \n", err); - return FXFALSE; -} /* ErrorMessage */ - -FxBool linSetup() { - int eventbase, errorbase; - int banksize; - - if (dpy!=0) return FXTRUE; - dpy=XOpenDisplay(""); - if (!dpy) - return ErrorMessage(hWndApp, "Linux VRush only runs under local X\n"); - if (XF86DGAQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86DGAQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - return ErrorMessage(hWndApp, "Linux VRush requires DGA version 1.0\n"); - } - } - if (XF86RushQueryExtension(dpy, &eventbase, &errorbase)) { - int major, minor; - XF86RushQueryVersion(dpy, &major, &minor); - if (major>1 && minor<0) { - XCloseDisplay(dpy); - return ErrorMessage(hWndApp, "Linux VRush requires Rush version 1.0\n"); - } - } - screenNum=XDefaultScreen(dpy); - XF86DGAGetVideoLL(dpy, screenNum, (int*)&screenPhys, &screenWidth, &banksize, - &screenMem); - screenMem*=1024; - return FXTRUE; -} - -static FxBool -cvtAddrToBufDesc(void *pixAddr, InitBufDesc_t *pDesc) { - pDesc->bufOffset = (FxU32)pixAddr; - pDesc->bufStride = (FxI32)(2*screenWidth); - pDesc->bufBPP = (FxI32)16; - return FXTRUE; -} - -static int -cvtXToGlideDesc(InitBufDesc_t *pDesc) { - InitBufDesc_t *dFront = &pDesc[0]; - InitBufDesc_t *dBack = &pDesc[1]; - InitBufDesc_t *dAux = &pDesc[2]; - InitBufDesc_t *dFifo = &pDesc[3]; - InitBufDesc_t *dScreen = &pDesc[4]; - InitBufDesc_t *dTriple = &pDesc[5]; - - dScreen->bufMagic = VG96_BUF_MAGIC; - dScreen->bufType = INIT_BUFFER_SCREENBUFFER; - dScreen->bufOffset = 0; - dScreen->bufStride = 0; - dScreen->bufBPP = 0; - - *dFront = *dBack = *dAux = *dFifo = *dTriple = *dScreen; - - /* Get info about screen (framebuffer) */ - if (!cvtAddrToBufDesc(screenPhys, dScreen)) - return ErrorMessage(hWndApp, "Couldn't get Screen Info"); - - /* Get info about the front buffer (window) */ - dFront->bufType = INIT_BUFFER_FRONTBUFFER; - if (!cvtAddrToBufDesc(addrFront, dFront)) - return ErrorMessage(hWndApp, "Couldn't get Frontbuffer Info"); - dFront->bufOffset -= dScreen->bufOffset; - - /* Get info about back buffer (pixmap) */ - dBack->bufType = INIT_BUFFER_BACKBUFFER; - if (!cvtAddrToBufDesc(addrBack, dBack)) - return ErrorMessage(hWndApp, "Couldn't get Backbuffer Info"); - dBack->bufOffset -= dScreen->bufOffset; - - /* Get info about aux buffer (pixmap) */ - dAux->bufType = INIT_BUFFER_AUXBUFFER; - if (!cvtAddrToBufDesc(addrAux, dAux)) - return ErrorMessage(hWndApp, "Couldn't get AuxBuffer Info"); - dAux->bufOffset -= dScreen->bufOffset; - - /* Get info about triple buffer (pixmap if used) */ - if (tripleBuffering) { - dTriple->bufType = INIT_BUFFER_TRIPLEBUFFER; - if (!cvtAddrToBufDesc(addrTriple, dTriple)) - return ErrorMessage(hWndApp, "Couldn't get triple buffer Info"); - dTriple->bufOffset -= dScreen->bufOffset; - } - - /* Get info about cmdFifo (pixmap) */ - dFifo->bufType = INIT_BUFFER_FIFOBUFFER; - dFifo->bufOffset = (int)addrFifo-dScreen->bufOffset; - dFifo->bufStride = FIFOSIZE; - - GDBG_INFO((80, "cvtXToGlideDesc: dFront->bufOffset = 0x%x\n", dFront->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dBack->bufOffset = 0x%x\n", dBack->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dAux->bufOffset = 0x%x\n", dAux->bufOffset)); - GDBG_INFO((80, "cvtXToGlideDesc: dFifo->bufOffset = 0x%x\n", dFifo->bufOffset)); - if (tripleBuffering) - GDBG_INFO((80, "cvtXToGlideDesc: dTriple->bufOffset = 0x%x\n", dTriple->bufOffset)); - - GDBG_INFO((80, - "F:%.06x %5d B:%.06x %5d B2:%.06x %5d A:%.06x %5d, C:%.06x %5d\n", - dFront->bufOffset, dFront->bufStride, - dBack ->bufOffset, dBack ->bufStride, - dTriple->bufOffset, dTriple->bufStride, - dAux ->bufOffset, dAux ->bufStride, - dFifo ->bufOffset, dFifo ->bufStride)); - return FXTRUE; -} - -static void -doReleasePixmaps() { - if (!dpy) return; - XF86RushUnlockAllPixmaps(dpy); - if (pixAux) XFreePixmap(dpy, pixAux); - if (pixBack) XFreePixmap(dpy, pixBack); - if (pixTriple) XFreePixmap(dpy, pixTriple); - if (pixFifo) XFreePixmap(dpy, pixFifo); - pixAux=pixBack=pixTriple=pixFifo=0; -} - -static void -findWindow(Display *dpy, Window hWndApp, void **addrFront) { - XWindowAttributes attr; - int x=0, y=0, num; - Window root=-1, parent, *children; - - do { - XQueryTree(dpy, hWndApp, &root, &parent, &children, &num); - /* Find out how big the window is */ - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) { - ErrorMessage(hWndApp, "Failed to get window attributes\n"); - return; - } - x+=attr.x; - y+=attr.y; - if (hWndApp!=root) hWndApp=parent; - } while (hWndApp!=root); - *addrFront=screenPhys+(y*screenWidth+x)*2; -} - -static int -doAllocPixmaps(int xRes, int yRes, int vRefresh, - InitBufDesc_t *pDesc) { - GDBG_INFO((80, "doAllocPixmaps: hWnd = %x, fs=%d, xRes=%d, yRes=%d, vRefresh=%d\n", - hWndApp, IsFullScreen, xRes, yRes, vRefresh)); - - doReleasePixmaps(); - - pixFifo=XCreatePixmap(dpy, hWndApp, screenWidth, - (FIFOSIZE/2+4096+screenWidth-1)/screenWidth, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixFifo, &addrFifo)==FXFALSE) - || !addrFifo) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock fifo pixmap\n"); - } - xRes = (xRes+3)&~3; - yRes = (yRes+3)&~3; - - findWindow(dpy, hWndApp, &addrFront); - pixBack=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixBack, - &addrBack)==FXFALSE) || !addrBack) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock back pixmap\n"); - } - pixAux=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixAux, - &addrAux)==FXFALSE) || !addrAux) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock aux pixmap\n"); - } - if (tripleBuffering) { - pixTriple=XCreatePixmap(dpy, hWndApp, xRes, yRes, 16); - if ((XF86RushLockPixmap(dpy, screenNum, pixTriple, - &addrTriple)==FXFALSE) || !addrTriple) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "Failed to lock triple pixmap\n"); - } - } - cvtXToGlideDesc(pDesc); - return FXTRUE; -} - -static FxBool -getWindowSize(int *width, int *height) { - XWindowAttributes attr; - - /* Find out how big the window is */ - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - - *width=attr.width; - *height=attr.height; - return FXTRUE; -} - -FxBool -linOpen( - FxU32 hWindow, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - InitBufDesc_t *pBufDesc, // return values - int *width, - int *height, - InitSwapType_t *swapType -) -{ - int i, flags, numModes; - XWindowAttributes attr; - - GDBG_INFO((80, "linOpen: hWnd = %x, sRes=%d, yOrg=%d, ncb=%d, nab=%d\n", - hWindow, sRes, yOrigin, nColBuffers, nAuxBuffers)); - - if (!linSetup()) return FXFALSE; - atexit(linClose); - - if (sRes == GR_RESOLUTION_NONE ) { /* In a window */ - - /* - * Get ourselves a valid window handle - */ - hWndApp = (Window)hWindow; - if (hWndApp == 0) - return ErrorMessage(hWndApp, "Linux VRush needs a valid window id!\n"); - xgc=XCreateGC(dpy, hWndApp, 0, 0); - XSetFunction(dpy, xgc, GXcopy); - XSetPlaneMask(dpy, xgc, AllPlanes); - - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - if (attr.depth!=16) - return ErrorMessage(hWndApp, "Screen depth must be 16\n"); - screenNum=XScreenNumberOfScreen(attr.screen); - Width=attr.width; - Height=attr.height; - IsFullScreen = FXFALSE; - } else { - /* Full screen mode - convert resolution to Width, Height */ - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; - - if ((sRes < GR_RESOLUTION_320x200) || - (sRes > GR_RESOLUTION_512x256)) - return ErrorMessage(hWndApp, "Bad Fullscreen resolution"); - - tripleBuffering = (nColBuffers == 3); - - IsFullScreen = FXTRUE; - Width = _w[sRes]; - Height = _h[sRes]; - - hWndApp=DefaultRootWindow(dpy); - if (!XGetWindowAttributes(dpy, hWndApp, &attr)) - return ErrorMessage(hWndApp, "Failed to get window attributes\n"); - if (attr.depth!=16) - return ErrorMessage(hWndApp, "Screen depth must be 16\n"); - if (XF86DGAQueryDirectVideo(dpy, DefaultScreen(dpy), &flags)==False || - !flags) { - GDBG_INFO((0, "Could query Direct Video")); - return ErrorMessage(hWndApp, "Direct video not supported\n"); - } - if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numModes, - &vidModes)==False) { - return ErrorMessage(hWndApp, "Couldn't query vidmode list\n"); - return 1; - } - for (i=0; ihdisplay==Width) && (vidModes[i]->vdisplay==Height)) - break; - if (i==numModes) { - return ErrorMessage(hWndApp, "Server doesn't support requested resolution\n"); - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - return 1; - } - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[i])==False) { - return ErrorMessage(hWndApp, "Failed to set required video mode\n"); - return 1; - } - } - - GDBG_INFO((80, "linOpen: W=%d, H=%d, FullScr=%d, vRefresh=%d\n", - Width, Height, IsFullScreen, vRefresh)); - - if (!doAllocPixmaps(Width, Height, vRefresh, BufDesc)) { - doReleasePixmaps(); - return ErrorMessage(hWndApp, "failed linOpen"); - } - GDBG_INFO((80, "doAllocPixmaps OK!\n")); - for (i=0; i< NUM_BUFS; i++) { - pBufDesc[i] = BufDesc[i]; - GDBG_INFO((80, "linOpen: pBufDesc[%d]: \n", i)); - GDBG_INFO((80, "\tbufMagic = 0x%x\n", pBufDesc[i].bufMagic)); - GDBG_INFO((80, "\tbufType = 0x%x\n", pBufDesc[i].bufType)); - GDBG_INFO((80, "\tbufOffset = 0x%x\n", pBufDesc[i].bufOffset)); - GDBG_INFO((80, "\tbufStride = 0x%x\n", pBufDesc[i].bufStride)); - GDBG_INFO((80, "\tbufBPP = 0x%x\n", pBufDesc[i].bufBPP)); - } - - *width = Width; - *height = Height; - *swapType = (IsFullScreen) ? INIT_SWAP_FLIP : INIT_SWAP_BLT; - - if (IsFullScreen) { - if (XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectGraphics)==False) { - GDBG_INFO((0, "Couldn't set direct graphics mode")); - return ErrorMessage(hWndApp, "Couldn't enable direct video\n"); - } - if (XF86DGASetViewPort(dpy, DefaultScreen(dpy), 0, 0)==False) { - GDBG_INFO((0, "Failed to set viewport\n")); - } - XSync(dpy, False); - GDBG_INFO((80, "Fullscreen mode switched\n")); - } - - if ( curHALData->initSetVideo ) { - curHALData->initSetVideo( sRes, vRefresh, - (FxU32*)width, (FxU32*)height ); - } - - GDBG_INFO((80, "linOpen: Returning TRUE\n")); - return FXTRUE; - -} /* linOpen */ - -FxBool -linControl(FxU32 code, InitBufDesc_t *pBufDesc, int *width, int *height) -{ - int i, w, h; - - GDBG_INFO((80, "linControl: code = %d\n", code)); - - if (IsFullScreen) return FXTRUE; - /* Why was I called? */ - switch(code) { - case INIT_CONTROL_RESIZE: /* recreate surfaces */ - getWindowSize(&w, &h); - if ((Width != w) || (Height != h)) { - GDBG_INFO((120, "W and H changed to %d %d\n", - Width, Height)); - - if (!doAllocPixmaps(w, h, 0, BufDesc)) { - w=Width; - h=Height; - if (!doAllocPixmaps(w, h, 0, BufDesc)) { - /* ErrorMessage(hWndApp, "linControl: Resize failed\n"); */ - return FXFALSE; - } - } - Width = w; - Height = h; - } - break; - - case INIT_CONTROL_MOVE: - findWindow(dpy, hWndApp, &addrFront); - cvtAddrToBufDesc(addrFront, &BufDesc[0]); - GDBG_INFO((120, "linControl: Move\n")); - break; - - case INIT_CONTROL_ACTIVATE: - GDBG_INFO((120, "linControl: Activate\n")); - break; - - case INIT_CONTROL_DEACTIVATE: - GDBG_INFO((120, "linControl: DeActivate\n")); - break; - - default: - GDBG_INFO((120, "linControl: Strange control %d\n", code)); - return FXFALSE; - break; - } - for (i=0; i<5; i++) pBufDesc[i] = BufDesc[i]; - *width = Width; - *height = Height; - GDBG_INFO((80, "linControl: code = %d, w = %d, h = %d\n", code, - Width, Height)); - - return FXTRUE; -} /* linControl */ - -FxBool -linClose() -{ - GDBG_INFO((80, "linClose:\n")); - if (!dpy) return FXTRUE; - if (IsFullScreen) { - if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), vidModes[0])==False) { - GDBG_INFO((80, "Failed to return to previous video mode\n")); - } - XF86DGADirectVideo(dpy, DefaultScreen(dpy), 0); - if (vidModes) { - XFree(vidModes); - vidModes=0; - } - } - doReleasePixmaps(); - if (xgc) XFreeGC(dpy, xgc); - xgc=0; - dpy=0; - GDBG_INFO((80, "linClose: Returning TRUE\n")); - return FXTRUE; -} /* linClose */ - -void -linSwap(FxU32 code) -{ - if (IsFullScreen) return; - XCopyArea(dpy, pixBack, hWndApp, xgc, 0, 0, Width, Height, 0, 0); - XSync(dpy, False); -} /* linSwap */ - -void -linFlip(FxU32 buffer) -{ - int x, y; - - y=buffer/(2*screenWidth); - x=(buffer-y*2*screenWidth)/2; - if (XF86DGASetViewPort(dpy, DefaultScreen(dpy), x, y)==False) { - GDBG_INFO((0, "Failed to set viewport\n")); - } - /* - We really are supposed to wait for the port changed call in a while - loop I guess, but at the moment, this is a no-op in the - server. Since this requires and extra round-trip to the X server it - really eats into performance. I'd argue DGA is broken. Setting the - viewport should enforce the switch before returning to avoid this. - */ -#if 0 - if (XF86DGAViewPortChanged(dpy, DefaultScreen(dpy), 2)==False) { - GDBG_INFO((0, "Failed to wait for viewport change\n")); - } -#endif -} /* linFlip */ - -#endif - - diff --git a/glide2x/sst1/init/init96/makefile.linux b/glide2x/sst1/init/init96/makefile.linux deleted file mode 100644 index db382ed..0000000 --- a/glide2x/sst1/init/init96/makefile.linux +++ /dev/null @@ -1,56 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes - -LCDEFS = -DSST96 -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -PARTNERCFILES = initmcrx.c -#init8625.c - -ifeq ($(DEBUG),1) -DBGOPTS = -DGDBG_INFO_ON -endif - -ifneq ($(FX_GLIDE_HW),SST96) -LCDEFS += -DDUMMY -endif - -LCOPTS += $(DBGOPTS) \ - -I$(BUILD_ROOT_SWLIBS)/include \ - -I$(BUILD_ROOT_HW)/include - -# sources -HEADERS = init96.h initvga.h -PRIVATE_HEADERS = atvga.h fxinit96.h initat3d.h initmcrx.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = $(PARTNERCFILES) init96.c lindrvr.c - -# targets -LIBRARIES = libinit96.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/init/init96/makefile.unix b/glide2x/sst1/init/init96/makefile.unix deleted file mode 100644 index c4ca502..0000000 --- a/glide2x/sst1/init/init96/makefile.unix +++ /dev/null @@ -1,56 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes - -LCDEFS = -DSST96 -ifeq ($(FX_SST96_ALT_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -PARTNERCFILES = initmcrx.c -#init8625.c - -ifeq ($(DEBUG),1) -DBGOPTS = -DGDBG_INFO_ON -endif - -ifneq ($(FX_GLIDE_HW),SST96) -LCDEFS += -DDUMMY -endif - -LCOPTS += $(DBGOPTS) \ - -I$(BUILD_ROOT_SWLIBS)/include \ - -I$(BUILD_ROOT_SST1)/include - -# sources -HEADERS = init96.h initvga.h -PRIVATE_HEADERS = atvga.h fxinit96.h initat3d.h initmcrx.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = $(PARTNERCFILES) init96.c lindrvr.c - -# targets -LIBRARIES = libinit96.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - diff --git a/glide2x/sst1/init/init96/readme.txt b/glide2x/sst1/init/init96/readme.txt deleted file mode 100644 index 0f941d1..0000000 --- a/glide2x/sst1/init/init96/readme.txt +++ /dev/null @@ -1,37 +0,0 @@ -Different Build Environments For VG96: - -Lab: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW= - - -Direct Draw Window: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW=1 -SST_VG_MODE=WIN -*demos* ARCADE_RES_OVERRIDE=1 - -Direct Draw Fullscreen: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -INIT_ACCESS_DDRAW=1 -SST_VG_MODE= -*demos* ARCADE_RES_OVERRIDE= - -This mode sucks because you can't get any input to your application -and it is slow because you have to do sucky synchronized swapping. - - -DOS Fullscreen: -FX_GLIDE_HW=SST96 -FX_GLIDE_CTRISETUP=1 -FX_GLIDE_NO_SPLASH=1 -*demos* ARCADE_RES_OVERRIDE= -INIT_ACCESS_DDRAW= -SST_VG_MODE= - diff --git a/glide2x/sst1/init/initvg/MAKEFILE.new b/glide2x/sst1/init/initvg/MAKEFILE.new deleted file mode 100644 index b42a4ae..0000000 --- a/glide2x/sst1/init/initvg/MAKEFILE.new +++ /dev/null @@ -1,53 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_DOS -LCOPTS = -WX -LCINCS = -I$(BUILD_ROOT_SWLIBS)\include -I$(BUILD_ROOT_SST1)\include - -!if "$(FX_SST96_PAGE_FIFO)" != "1" -LCDEFS = $(LCDEFS) -DSST96_ALT_FIFO_WRAP -!endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -!if "$(FX_DLL_BUILDSST1INIT)" == "1" -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)\lib\fxpci.lib -FX_DLL_LIBRARY = 1 -!else -SUBLIBRARIES = -!endif - -# targets -LIBRARIES = sst1init.lib -RCFILE = init.rc - -!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak - -init.res: rcver.h -sst1init.obj: rcver.h diff --git a/glide2x/sst1/init/initvg/dac.c b/glide2x/sst1/init/initvg/dac.c deleted file mode 100644 index 5b63744..0000000 --- a/glide2x/sst1/init/initvg/dac.c +++ /dev/null @@ -1,1211 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing supported SST-1 DACs -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitDacRd(): -** Read external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** fbiInit23 register remapping (PCI config. initEnable[2]=1) must be -** enabled before calling this routine -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitDacRd(FxU32 *sstbase, FxU32 addr) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 retVal; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, ((addr) << SST_DACDATA_ADDR_SHIFT) | SST_DACDATA_RD); - sst1InitIdleFBINoNOP(sstbase); - retVal = IGET(sst->fbiInit2) & SST_DACDATA_DATA; - if(helper) - INIT_PRINTF(("dacRd(0x%x,0x%x)\n", addr, retVal)); - - return(retVal); -} - -/* -** sst1InitDacWr(): -** Write to external DAC registers -** NOTE: The video unit of FBI must be in reset before calling this routine. -** The rendering engines of FBI and TREX must be idle before calling -** this routine. -** -** Valid addresses are 0 <= addr <= 3 -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitDacWr(FxU32 *sstbase, FxU32 addr, FxU32 data) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - static FxBool firstPass = FXTRUE; - static int helper; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - } - - ISET(sst->dacData, - (data & SST_DACDATA_DATA) | - ((addr) << SST_DACDATA_ADDR_SHIFT) | - SST_DACDATA_WR); - sst1InitIdleFBINoNOP(sstbase); - - if(helper) - INIT_PRINTF(("dacWr(0x%x,0x%x)\n", addr, data)); -} - -/* -** sst1InitExecuteDacRdWr(): -** Execute DAC read/write command sequence defined in "voodoo.ini" file -** -*/ -FxBool sst1InitExecuteDacRdWr(FxU32 *sstbase, sst1InitDacRdWrStruct - *dacRdWrBase) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - FxU32 data; - FxBool retVal = FXTRUE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - sst1InitDacWr(sstbase, dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - if(helper) - INIT_PRINTF(("dacRdWr(Read=0x%x)\n", data)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_WRMOD_POP) { - data = iniStack[--iniStackPtr]; - if(iniStackPtr < 0) { - retVal = FXFALSE; - break; - } - if(helper) - INIT_PRINTF(("dacWrModPop(Stack=0x%x,Mask=0x%x)\n", data, - dacRdWrPtr->mask)); - data &= dacRdWrPtr->mask; - sst1InitDacWr(sstbase, dacRdWrPtr->addr, (data | dacRdWrPtr->data)); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - sst1InitDacRd(sstbase, dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDPUSH) { - data = sst1InitDacRd(sstbase, dacRdWrPtr->addr); - iniStack[iniStackPtr++] = data; - if(iniStackPtr == DACRDWR_MAX_PUSH) { - retVal = FXFALSE; - break; - } - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - if(sst1InitDacRd(sstbase, dacRdWrPtr->addr) != dacRdWrPtr->data) { - retVal = FXFALSE; - break; - } - } else { - retVal = FXFALSE; - break; - } - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - return(retVal); -} - -/* -** sst1InitDacDetect(): -** Detect type of on-board DAC -** NOTE: sst1InitDacDetect() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacDetect(FxU32 * sstbase) -{ - FxU32 n; - FxU32 fbiInit1_save; - FxU32 fbiInit2_save; - volatile Sstregs *sst = (Sstregs *) sstbase; - FxBool retVal = FXFALSE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(!sst) - return(FXFALSE); - - if(helper) - INIT_PRINTF(("sst1InitDacDetect(): Entered...\n")); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitDacDetectINI(sstbase); - } else { - if((retVal = sst1InitDacDetectICS(sstbase)) == FXTRUE) - goto done; - if((retVal = sst1InitDacDetectATT(sstbase)) == FXTRUE) - goto done; - retVal = sst1InitDacDetectTI(sstbase); - } - -done: - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(retVal); -} - -/* -** sst1InitDacDetectINI(): -** Detect DAC based on rules supplied in "voodoo.ini" -** -*/ -FxBool sst1InitDacDetectINI(FxU32 * sstbase) -{ - sst1InitDacStruct *dacPtr; - FxU32 j; - FxBool retVal = FXFALSE; - - dacPtr = dacStructBase; - while(dacPtr) { - if(dacPtr->detect) { - /* Loop multiple times, as some DACs go into never-never land... */ - for(j=0; j<100; j++) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, dacPtr->detect)) - == FXTRUE) { - iniDac = dacPtr; - break; - } - } - if(retVal == FXTRUE) - break; - } - dacPtr = dacPtr->nextDac; - } - return(retVal); -} - -FxBool sst1InitDacDetectATT(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Entered...\n")); - - /* Detect ATT */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found ATT DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_ATT; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectATT(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectTI(FxU32 * sstbase) -{ - FxU32 n, j, dacmir, dacdir; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Entered...\n")); - - /* Detect TI */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) - break; - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* Returns contents of CR0 */ - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT) - j++; - else - continue; - - /* Check the device ID */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if(dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT) - j++; - else - continue; - if(j == 2) { - /* Found TI DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_TI; - sst1InitIdleFBINoNOP(sstbase); - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectTI(): Exiting...\n")); - return(FXFALSE); -} - -FxBool sst1InitDacDetectICS(FxU32 * sstbase) -{ - FxU32 n; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Entered...\n")); - - /* Detect ICS... */ - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - FxU32 gclk1, vclk1, vclk7; - - if(++n > 100) - break; - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_GCLK1); - gclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK1); - vclk1 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_VCLK7); - vclk7 = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - if((gclk1 == SST_DACREG_ICS_PLLADDR_GCLK1_DEFAULT) && - (vclk1 == SST_DACREG_ICS_PLLADDR_VCLK1_DEFAULT) && - (vclk7 == SST_DACREG_ICS_PLLADDR_VCLK7_DEFAULT)) { - /* found ICS DAC... */ - sst1CurrentBoard->fbiDacType = SST_FBI_DACTYPE_ICS; - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXTRUE); - } - } - if(helper) - INIT_PRINTF(("sst1InitDacDetectICS(): Exiting...\n")); - return(FXFALSE); -} - -/* -** sst1InitCalcGrxClk(): -** Determine graphics clock frequency -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCalcGrxClk(FxU32 *sstbase) -{ - FxU32 clkFreq; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_GRXCLK"))) { - INIT_PRINTF(("sst1InitCalcGrxClk(): Overriding default clk frequency with SST_GRXCLK\n")); - clkFreq = ATOI(GETENV(("SST_GRXCLK"))); - if(clkFreq < 16) - clkFreq = 16; - } else { - /* Setup memory clock frequency based on board strapping bits... */ - if(sst1CurrentBoard->fbiBoardID == 0x0) { - /* Obsidian GE Fab */ - clkFreq = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - } else { - /* Obsidian Pro Fab */ - clkFreq = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - /* Fix for legacy/existing boards */ - if(clkFreq == 54) - clkFreq = 50; - } - } - sst1CurrentBoard->grxClkFreq = clkFreq; - return(FXTRUE); -} - -/* -** sst1InitGrxClk(): -** Initialize FBI and TREX Memory clocks -** NOTE: sst1InitCalcGrxClk() must be called prior to sst1InitGrxClk() -** NOTE: sst1InitGrxClk() resets the PCI fifo and the graphics subsystem of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGrxClk(FxU32 *sstbase) -{ - sst1ClkTimingStruct sstGrxClk; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - if(sst1CurrentBoard->initGrxClkDone) - return(FXTRUE); - sst1CurrentBoard->initGrxClkDone = 1; - - INIT_PRINTF(("sst1InitGrxClk(): Setting up %d MHz Graphics Clock...\n", - sst1CurrentBoard->grxClkFreq)); - if(sst1InitComputeClkParams((float) sst1CurrentBoard->grxClkFreq, - &sstGrxClk) == FXFALSE) - return(FXFALSE); - - return(sst1InitSetGrxClk(sstbase, &sstGrxClk)); -} - -/* -** sst1InitComputeClkParams(): -** Compute PLL parameters for given clock frequency -** -*/ -FxBool sst1InitComputeClkParams(float freq, sst1ClkTimingStruct - *clkTiming) -{ - float vcoFreqDivide, freqMultRatio, clkError; - float clkErrorMin; - FxU32 p, n, m, nPlusTwo; - int mPlusTwo; - - /* Calculate P parameter */ - p = 4; - if(((freq * (float) 1.) >= (float) 120.) && - ((freq * (float) 1.) <= (float) 240.)) { - vcoFreqDivide = (float) 1.; - p = 0; - } - if(((freq * (float) 2.) >= (float) 120.) && - ((freq * (float) 2.) <= (float) 240.)) { - vcoFreqDivide = (float) 2.; - p = 1; - } - if(((freq * (float) 4.) >= (float) 120.) && - ((freq * (float) 4.) <= (float) 240.)) { - vcoFreqDivide = (float) 4.; - p = 2; - } - if(((freq * (float) 8.) >= (float) 120.) && - ((freq * (float) 8.) <= (float) 240.)) { - vcoFreqDivide = (float) 8.; - p = 3; - } - if(p > 3) - return(FXFALSE); - - /* Divide by 14.318 */ - freqMultRatio = (freq * vcoFreqDivide) * (float) 0.06984216; - - /* Calculate proper N and M parameters which yield the lowest error */ - clkErrorMin = (float) 9999.; n = 0; - for(nPlusTwo = 3; nPlusTwo < 32; nPlusTwo++) { -#ifdef DIRECTX - mPlusTwo = FTOL( (((float) nPlusTwo * freqMultRatio) + (float) 0.5) ); - clkError = ((float) mPlusTwo * ITOF_INV( nPlusTwo ) ) - freqMultRatio; -#else - mPlusTwo = (int) (((float) nPlusTwo * freqMultRatio) + (float) 0.5); - clkError = ((float) mPlusTwo / (float) nPlusTwo) - freqMultRatio; -#endif - if(clkError < (float) 0.0) - clkError = -clkError; - if((clkError < clkErrorMin) && ((mPlusTwo - 2) < 127)) { - clkErrorMin = clkError; - n = nPlusTwo - 2; - m = mPlusTwo - 2; - } - } - if(n == 0) - return(FXFALSE); - - clkTiming->freq = freq; - clkTiming->clkTiming_M = m; - clkTiming->clkTiming_P = p; - clkTiming->clkTiming_N = n; - if(freq < (float) 37.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else if(freq < (float) 45.) { - clkTiming->clkTiming_L = 0xc; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 58.) { - clkTiming->clkTiming_L = 0x8; - clkTiming->clkTiming_IB = 0x4; - } else if(freq < (float) 66.) { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x6; - } else { - clkTiming->clkTiming_L = 0xa; - clkTiming->clkTiming_IB = 0x8; - } -#if 0 - { - float calc; - - calc = ((float) 14.318 * (float) (m + 2)) / - ((float) (n + 2) * vcoFreqDivide); - printf("freq:%.3f calc:%.3f\n", freq, calc); - printf("m:%d p:%d n:%d\n", m, p, n); - fflush(stdout); - } -#endif - return(FXTRUE); -} - -/* -** sst1InitSetVidClkATT(): -** Set video clock for ATT Dacs -** -*/ -FxBool sst1InitSetVidClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD0); - DAC_INDEXWR((sstVidClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD1); - DAC_INDEXWR(((sstVidClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstVidClk->clkTiming_N) - << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_AD2); - DAC_INDEXWR(((sstVidClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstVidClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_ACLK_SEL_SHIFT) | - SST_DACREG_CC_ACLK_SELECT_AD)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkICS(): -** Set video clock for ICS Dacs -** -*/ -FxBool sst1InitSetVidClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstVidClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl; - volatile Sstregs *sst = (Sstregs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_VCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstVidClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstVidClk->clkTiming_P) << 5) | sstVidClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - ((pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK0FREQ) | - SST_DACREG_ICS_PLLCTRL_CLK0SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidClkINI(): -** Set video clock for DACs defined in "voodoo.ini" -** -*/ -FxBool sst1InitSetVidClkINI(FxU32 *sstbase, FxU32 width, - FxU32 height, FxU32 refresh, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetVideoStruct *setVideo; - volatile Sstregs *sst = (Sstregs *) sstbase; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - FxBool retVal = FXFALSE; - - if(helper) - INIT_PRINTF(("sst1InitSetVidClkINI(): Entered...\n")); - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideo = iniDac->setVideo; - while(setVideo) { - if((setVideo->width == width) && (setVideo->height == height) && - (setVideo->refresh == refresh) && - (setVideo->video16BPP == video16BPP)) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideo->setVideoRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideo = setVideo->nextSetVideo; - } - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetGrxClkATT(): -** Set graphics clock for ATT Dacs -** NOTE: sst1InitSetGrxClkATT() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkATT(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable DAC indexed addressing */ - /* sst1InitDacIndexedEnable resets the video module, turns off dram refresh */ - /* and disallows writes to the PCI fifo */ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD0); - DAC_INDEXWR((sstGrxClk->clkTiming_M) << SST_DACREG_CLKREG_MSHIFT); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD1); - DAC_INDEXWR(((sstGrxClk->clkTiming_P) << SST_DACREG_CLKREG_PSHIFT) | - ((sstGrxClk->clkTiming_N) << SST_DACREG_CLKREG_NSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_BD2); - DAC_INDEXWR(((sstGrxClk->clkTiming_L) << SST_DACREG_CLKREG_LSHIFT) | - ((sstGrxClk->clkTiming_IB) << SST_DACREG_CLKREG_IBSHIFT)); - DAC_INDEXWRADDR(SST_DACREG_INDEX_CC); - DAC_INDEXWR((DAC_INDEXRD() | (0x3 << SST_DACREG_CC_BCLK_SEL_SHIFT) | - SST_DACREG_CC_BCLK_SELECT_BD)); - sst1InitIdleFBINoNOP(sstbase); - - /* Turn off DAC indexed addressing */ - - /* Disabling dac indexed mode re-enables writes to pass through the */ - /* PCI fifo (and restores video refresh and dram refresh if previously */ - /* enabled) */ - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkICS(): -** Set graphics clock for ICS Dacs -** NOTE: sst1InitSetGrxClkICS() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkICS(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save, pllCtrl; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_RD, - SST_DACREG_ICS_PLLADDR_CTRL); - pllCtrl = sst1InitDacRd(sstbase, SST_DACREG_ICS_PLLADDR_DATA); - - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_GCLK0); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - sstGrxClk->clkTiming_M); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (((sstGrxClk->clkTiming_P) << 5) | sstGrxClk->clkTiming_N)); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_WR, - SST_DACREG_ICS_PLLADDR_CTRL); - sst1InitDacWr(sstbase, SST_DACREG_ICS_PLLADDR_DATA, - (pllCtrl & ~SST_DACREG_ICS_PLLCTRL_CLK1SEL)); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetGrxClkINI(): -** Set graphics clock for dac specified in "voodoo.ini" file -** NOTE: sst1InitSetGrxClkINI() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FxBool sst1InitSetGrxClkINI(FxU32 *sstbase, sst1ClkTimingStruct - *sstGrxClk) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetMemClkStruct *setMemClk; - FxBool retVal = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - /* Reset graphics unit before we change grx clk */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | - (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setMemClk = iniDac->setMemClk; - while(setMemClk) { -#ifdef DIRECTX - if(setMemClk->frequency == FTOL(sstGrxClk->freq) ) { -#else - if(setMemClk->frequency == (FxU32) sstGrxClk->freq) { -#endif - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setMemClk->setMemClkRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setMemClk = setMemClk->nextSetMemClk; - } - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - /* Wait for graphics clock to stabilize */ - if(retVal == FXTRUE) { - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - } - - /* Unreset PCI FIFO and graphic subsystem */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitSetVidModeATT(): -** Set video Mode for ATT dacs -** -*/ -FxBool sst1InitSetVidModeATT(FxU32 *sstbase, FxU32 video16BPP) -{ - if(sst1InitDacIndexedEnable(sstbase, 1) == FXFALSE) - return(FXFALSE); - - /* Set 16 or 24-bit pixel output */ - if(video16BPP) { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_16BPP | SST_DACREG_CR0_8BITDAC); - } else { - DAC_INDEXWRADDR(SST_DACREG_INDEX_CR0); - DAC_INDEXWR((DAC_INDEXRD() & ~SST_DACREG_CR0_COLOR_MODE) | - SST_DACREG_CR0_COLOR_MODE_24BPP | SST_DACREG_CR0_8BITDAC); - } - - if(sst1InitDacIndexedEnable(sstbase, 0) == FXFALSE) - return(FXFALSE); - - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeICS(): -** Set video Mode for ICS dacs -** -*/ -FxBool sst1InitSetVidModeICS(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - volatile Sstregs *sst = (Sstregs *) sstbase; - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - if(video16BPP) - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_16BPP); - else - sst1InitDacWr(sstbase, SST_DACREG_ICS_CMD, - SST_DACREG_ICS_COLORMODE_24BPP); - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitSetVidModeINI(): -** Set video Mode for DACs defined in "voodoo.ini" -** -*/ -FxBool sst1InitSetVidModeINI(FxU32 *sstbase, FxU32 video16BPP) -{ - FxU32 n, fbiInit1_save, fbiInit2_save; - sst1InitDacSetVideoModeStruct *setVideoMode; - FxBool retVal = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(iniDac == (sst1InitDacStruct *) NULL) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - setVideoMode = iniDac->setVideoMode; - while(setVideoMode) { - if(setVideoMode->video16BPP == video16BPP) { - if((retVal = sst1InitExecuteDacRdWr(sstbase, - setVideoMode->setVideoModeRdWr)) == FXTRUE) { - retVal = FXTRUE; - break; - } - } - setVideoMode = setVideoMode->nextSetVideoMode; - } - sst1InitIdleFBINoNOP(sstbase); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit1, fbiInit1_save); - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - - return(retVal); -} - -/* -** sst1InitDacIndexedEnable(): -** Initialize DAC for indexed-mode addressing -** NOTE: When DAC indexed-mode addressing is enabled, video timing and -** DRAM refresh are both reset (disabled) -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitDacIndexedEnable(FxU32 *sstbase, - FxU32 Enable) -{ - FxU32 n, j, dacmir, dacdir, cr0_save; - static FxU32 fbiInit1_save = 0; - static FxU32 fbiInit2_save = 0; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - sst1InitIdleFBINoNOP(sstbase); - if(!Enable) { - /* Disable indexed-mode addressing */ - sst1InitDacWr(sstbase, SST_DACREG_INDEXADDR, SST_DACREG_INDEX_CR0); - sst1InitDacWr(sstbase, SST_DACREG_INDEXDATA, - sst1InitDacRd(sstbase, SST_DACREG_INDEXDATA) & - ~SST_DACREG_CR0_INDEXED_ADDRESSING); - - /* Disable fbiinit23 address remapping */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_PCI_FIFOWR_EN); - - /* Restore init register states */ - sst1InitIdleFBINoNOP(sstbase); - if(fbiInit1_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit1, fbiInit1_save); - if(fbiInit2_save) /* Have we previously enabled indexed addressing? */ - ISET(sst->fbiInit2, fbiInit2_save); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Save init register states before overwriting them */ - fbiInit1_save = IGET(sst->fbiInit1); - fbiInit2_save = IGET(sst->fbiInit2); - - /* Reset video unit to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - /* Turn off dram refresh to guarantee no contentions on the memory bus */ - ISET(sst->fbiInit2, IGET(sst->fbiInit2) & ~SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable reads from the DAC (multiplexed on the fbiInit2 address) */ - /* Disallow writes to pass through the PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN | SST_FBIINIT23_REMAP); - sst1InitIdleFBINoNOP(sstbase); - - /* Sometimes the DACs seem to go into never-never land, so */ - /* try and initialize the DAC multiple times */ - n = 0; - while(1) { - if(++n > 100) { - INIT_PRINTF(("sst1InitDacIndexedEnable() ERROR: Could not Initialize DAC\n")); - return(FXFALSE); - } - - /* Must guarantee that no rendering is being performed */ - sst1InitIdleFBINoNOP(sstbase); - - /* Reset current state of DAC command register 0 (CR0) via the read */ - /* mask register (RMR) */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 5 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - cr0_save = sst1InitDacRd(sstbase, SST_DACREG_RMR); - - /* Enable indexed programming by setting CR0[0] = 1 */ - sst1InitDacWr(sstbase, SST_DACREG_WMA, 0x0); /* reset backdoor fsm */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); /* RMR must be read 4 times */ - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacRd(sstbase, SST_DACREG_RMR); - sst1InitDacWr(sstbase, SST_DACREG_RMR, ((cr0_save & 0xf0) | - SST_DACREG_CR0_INDEXED_ADDRESSING | SST_DACREG_CR0_8BITDAC)); - - /* NOW DAC IS IN INDEXED ADDRESS MODE... */ - - /* Check the manufacturing ID for sanity */ - j = 0; - DAC_INDEXWRADDR(SST_DACREG_INDEX_MIR); - dacmir = DAC_INDEXRD(); - - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT)) - j++; - else - continue; - - /* Check the device ID for sanity */ - DAC_INDEXWRADDR(SST_DACREG_INDEX_DIR); - dacdir = DAC_INDEXRD(); - if((dacmir == SST_DACREG_INDEX_MIR_ATT_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_ATT_DEFAULT) || - (dacmir == SST_DACREG_INDEX_MIR_TI_DEFAULT && - dacdir == SST_DACREG_INDEX_DIR_TI_DEFAULT)) - j++; - else - continue; - if(j == 2) - break; - } - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/gamma.c b/glide2x/sst1/init/initvg/gamma.c deleted file mode 100644 index b1c6c74..0000000 --- a/glide2x/sst1/init/initvg/gamma.c +++ /dev/null @@ -1,256 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for loading SST-1 gamma tables -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitGamma(): -** Load the video color-lookup tables with the specified gamma function -** -** Returns: -** FXTRUE if successfully initializes SST-1 gamma tables -** FXFALSE if cannot initialize SST-1 gamma tables -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGamma(FxU32 *sstbase, double gamma) -{ - static FxBool calledBefore = FXFALSE; - static FxBool overRideR = FXFALSE; - static FxBool overRideG = FXFALSE; - static FxBool overRideB = FXFALSE; - static double gammaR, gammaG, gammaB; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(overRideR == FXFALSE) - gammaR = gamma; - if(overRideG == FXFALSE) - gammaG = gamma; - if(overRideB == FXFALSE) - gammaB = gamma; - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - if(GETENV(("SST_RGAMMA"))) { - overRideR = FXTRUE; - gammaR = (double) ATOF(GETENV(("SST_RGAMMA"))); - } - if(GETENV(("SST_GGAMMA"))) { - overRideG = FXTRUE; - gammaG = (double) ATOF(GETENV(("SST_GGAMMA"))); - } - if(GETENV(("SST_BGAMMA"))) { - overRideB = FXTRUE; - gammaB = (double) ATOF(GETENV(("SST_BGAMMA"))); - } - if(GETENV(("SST_GAMMA"))) { - overRideR = FXTRUE; - overRideG = FXTRUE; - overRideB = FXTRUE; - gammaR = (double) ATOF(GETENV(("SST_GAMMA"))); - gammaG = gammaR; - gammaB = gammaR; - } - } - return(sst1InitGammaRGB(sstbase, gammaR, gammaG, gammaB)); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaRGB(FxU32 *sstbase, double gammaR, - double gammaG, double gammaB) -{ - FxU32 x, n; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - static FxBool calledBefore = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* Enable video clock */ - if(calledBefore == FXFALSE && !sst1InitSliEnabled) { - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitGammaRGB(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - INIT_PRINTF(("sst1InitGammaRGB(): Setting GammaRGB = (%.2f,%.2f,%.2f)\n", - gammaR, gammaG, gammaB)); - } - - /* Initialize the gamma table */ - for(x=0; x<256; x++) { - gammaTableR[x] = FTOL (POW(x/255.0F, 1.0F/gammaR) * 255.0F + 0.5F); - gammaTableG[x] = FTOL (POW(x/255.0F, 1.0F/gammaG) * 255.0F + 0.5F); - gammaTableB[x] = FTOL (POW(x/255.0F, 1.0F/gammaB) * 255.0F + 0.5F); - } - - /* SST-1 video reset must be inactive to load gamma tables */ - sst1InitIdleFBINoNOP(sstbase); - if(!sst1InitSliEnabled) { - if(IGET(sst->fbiInit1) & SST_VIDEO_RESET) - sstVideoIsReset = FXTRUE; - else - sstVideoIsReset = FXFALSE; - - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - /* wait for video reset to be deasserted */ - sst1InitIdleFBINoNOP(sstbase); - } - - /* SST-1 requires every eighth entry of the gamma table to be loaded, */ - /* so only 32 basic writes are required. A 33rd write is used to load */ - /* the top entry of the gamma table. The 33rd entry is necessary because */ - /* SST-1 performs linear interpolation between each gamma table entry to */ - /* generate 256 unique gamma-corrected values. */ - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - } - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - return(FXTRUE); -} - -FX_EXPORT FxBool FX_CSTYLE sst1InitGammaTable(FxU32 *sstbase, FxU32 nentries, -FxU32 *r, FxU32 *g, FxU32 *b) -{ - FxU32 x, n; - FxU32 gammaTableR[256]; - FxU32 gammaTableG[256]; - FxU32 gammaTableB[256]; - FxBool sstVideoIsReset; - static FxBool calledBefore = FXFALSE; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sstbase) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - /* Enable video clock */ - if(calledBefore == FXFALSE && !sst1InitSliEnabled) { - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitGammaRGB(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - } - - /* Initialize the gamma table */ - for(x=0; xfbiInit1) & SST_VIDEO_RESET) - sstVideoIsReset = FXTRUE; - else - sstVideoIsReset = FXFALSE; - - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - /* wait for video reset to be deasserted */ - sst1InitIdleFBINoNOP(sstbase); - } - - /* SST-1 requires every eighth entry of the gamma table to be loaded, */ - /* so only 32 basic writes are required. A 33rd write is used to load */ - /* the top entry of the gamma table. The 33rd entry is necessary because */ - /* SST-1 performs linear interpolation between each gamma table entry to */ - /* generate 256 unique gamma-corrected values. */ - for(x=0; x<32; x++) { - FxU32 gcR = gammaTableR[(x<<3)]; - FxU32 gcG = gammaTableG[(x<<3)]; - FxU32 gcB = gammaTableB[(x<<3)]; - ISET(sst->clutData, ((x<clutData, (32<fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - } - - if(calledBefore == FXFALSE) { - calledBefore = FXTRUE; - INIT_PRINTF(("sst1InitGammaRGB() exiting with status %d...\n", FXTRUE)); - } - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/gdebug.c b/glide2x/sst1/init/initvg/gdebug.c deleted file mode 100644 index b1903f0..0000000 --- a/glide2x/sst1/init/initvg/gdebug.c +++ /dev/null @@ -1,264 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -*/ - -#include -#include - -#include -#include - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#include -#endif - -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include "gdebug.h" - -#define GETENV getenv - -static char *gdbg_myname = "gd"; // default library name -static char gdbg_debuglevel[GDBG_MAX_LEVELS]; // array of debuglevel controls - -static long gdbg_errors = 0; - -static FxBool UseDebugString; - -static FILE *gdbg_msgfile = NULL; /*stdout;*/ // GDBG info/error file - -//---------------------------------------------------------------------- -// initialize gdbg_level from an environment variable -//---------------------------------------------------------------------- -static char *setRange(char *buf, int val) -{ - int r0,r1,pos; - - sscanf(buf,"%i%n",&r0,&pos); // parse the first integer - if (buf[pos]=='-' || buf[pos]==':') // if there's a second - sscanf(buf+pos+1,"%i%n",&r1,&pos); // then parse it - else - r1 = r0; - - if (r0 < 0) r0 = 0; // sanity checks - if (r1 >= GDBG_MAX_LEVELS) r1 = GDBG_MAX_LEVELS-1; - if (r1 < r0) r1 = r0; - - while (r0 <= r1) // now set the debuglevel levels - gdbg_debuglevel[r0++] = val; - - return buf + pos; // and return rest of string -} - -static void parse(char *env) -{ - int level, pos; - - do { - if (env[0] == ',') // advance past commas - env++; - if (env[0] == '+') // if + then enable a range - env = setRange(env+1,1); - else if (env[0] == '-') // if - then disable a range - env = setRange(env+1,0); - else { // else just a number - if (EOF == sscanf(env,"%i%n",&level,&pos)) return; - if (pos==0) return; // oops, guess not - if (level >= GDBG_MAX_LEVELS) level = GDBG_MAX_LEVELS-1; - while (level >= 0) // enable the range [0,#] - gdbg_debuglevel[level--] = 1; - env += pos; - } - } while (env[0] == ','); -} - -void FX_EXPORT FX_CSTYLE -gdbg_init(void) -{ - static int done=0; // only execute once - char *env; - - if (done) return; - - /* I can't init gdbg_msgfile to stdout since it isn't constant so - * I do it now */ - gdbg_msgfile = stdout; - - done = 1; - gdbg_debuglevel[0] = 1; // always enable level 0 - env = GETENV("GDBG_FILE"); - if (env != NULL) GDBG_SET_FILE(env); - env = GETENV("GDBG_LEVEL"); - if (env == NULL) env = "0"; - parse(env); - gdbg_info(1,"gdbg_init(): debug level = %s\n",env); -} - -void FX_EXPORT FX_CSTYLE -gdbg_shutdown(void) -{ - gdbg_info(1,"gdbg_shutdown()\n"); - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -} - -//---------------------------------------------------------------------- -// the MAIN message display suboutine - ALL messages come thru here -//---------------------------------------------------------------------- -void FX_EXPORT FX_CSTYLE -gdbg_vprintf (const char *format,va_list args) -{ - - if (gdbg_msgfile != NULL) { - if (!UseDebugString) { - - vfprintf(gdbg_msgfile,format,args); - - fflush(gdbg_msgfile); - } -#ifdef __WIN32__ - else { - char msgString[1024]; - - vsprintf(msgString, format, args); - OutputDebugString(msgString); - } -#endif - } -} - -void FX_EXPORT FX_CSTYLE -gdbg_printf (const char *format, ...) -{ - va_list args; - - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); -} - -//---------------------------------------------------------------------- -// INFO message subroutines -//---------------------------------------------------------------------- - -//---------------------------------------------------------------------- -// display an INFO message if level <= debug level and return whether -// debug level high enough to allow display -//---------------------------------------------------------------------- -int FX_EXPORT FX_CSTYLE -gdbg_info (const int level, const char *format, ...) -{ - va_list args; - char newformat[4095]; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); - va_start(args, format); - sprintf(newformat, "%s.%d:\t", gdbg_myname,level); - strcat(newformat,format); - gdbg_vprintf(newformat,args); - va_end(args); - return (1); -} - -//---------------------------------------------------------------------- -// same as gdbg_info but does not display INFO header -//---------------------------------------------------------------------- -int FX_EXPORT FX_CSTYLE -gdbg_info_more (const int level, const char *format, ...) -{ - va_list args; - - if (!gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]) - return(0); - va_start(args, format); - gdbg_vprintf(format,args); - va_end(args); - return (1); -} - -//---------------------------------------------------------------------- -// ALL errors must come thru here, this subroutine adds a preamble -// and then displays the message and increments the error counter -//---------------------------------------------------------------------- -void FX_EXPORT FX_CSTYLE -gdbg_error (const char *kind, const char *format, ...) -{ - va_list args; - - char newformat[1024]; - - va_start(args, format); - sprintf(newformat, "%s error (%s): ", gdbg_myname,kind); - strcat(newformat,format); // add a preamble to message - gdbg_vprintf(newformat,args); - gdbg_errors++; // increment the error counter - va_end(args); -} - -// return the error counter -int FX_EXPORT FX_CSTYLE -gdbg_get_errors(void) -{ - return gdbg_errors; -} - -// return a debuglevel level -int FX_EXPORT FX_CSTYLE -gdbg_get_debuglevel(const int level) -{ - return gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level]; -} - -// set a debuglevel level -void FX_EXPORT FX_CSTYLE -gdbg_set_debuglevel(const int level, const int value) -{ - gdbg_debuglevel[level>=GDBG_MAX_LEVELS ? GDBG_MAX_LEVELS-1 : level] = value; -} - -// open up a new output file -int FX_EXPORT FX_CSTYLE -gdbg_set_file(const char *name) -{ - FILE *outf; - - if (gdbg_msgfile != stdout) { // close any existing output file - fclose(gdbg_msgfile); - gdbg_msgfile = stdout; - } -#ifdef __WIN32__ - else if (!strcmp(name, "DEBUG")) { - gdbg_msgfile = (FILE *) 1; - UseDebugString = 1; - } -#endif - else { - outf = fopen(name,"w"); // open up a new one - if (outf) gdbg_msgfile = outf; - return outf != NULL; - } -} diff --git a/glide2x/sst1/init/initvg/gdebug.h b/glide2x/sst1/init/initvg/gdebug.h deleted file mode 100644 index bb61280..0000000 --- a/glide2x/sst1/init/initvg/gdebug.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#ifndef __GDEBUG_H__ -#define __GDEBUG_H__ - -/* -** $Revision$ -** $Date$ -*/ - -#include -#include <3dfx.h> - -#define GDBG_MAX_LEVELS 512 - -// if debug info turned on then GDBG_INFO does something -#ifdef GDBG_INFO_ON - -#define GDBG_INFO(a) gdbg_info a -#define GDBG_INFO_MORE(a) gdbg_info_more a -#define GDBG_PRINTF(a) gdbg_printf a - -// otherwise GDBG_INFO does nothing -#else - -#define GDBG_INFO(a) -#define GDBG_INFO_MORE(a) -#define GDBG_PRINTF(a) - -#endif - -#define GDBG_INIT gdbg_init -#define GDBG_ERROR gdbg_error -#define GDBG_GET_ERRORS gdbg_get_errors -#define GDBG_GET_DEBUGLEVEL gdbg_get_debuglevel -#define GDBG_SET_DEBUGLEVEL gdbg_set_debuglevel -#define GDBG_SET_FILE gdbg_set_file - -FX_ENTRY void FX_CALL gdbg_init(void); -FX_ENTRY void FX_CALL gdbg_vprintf(const char *format, va_list); -FX_ENTRY void FX_CALL gdbg_printf(const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info(const int level, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_info_more(const int level, const char *format, ...); -FX_ENTRY void FX_CALL gdbg_error(const char *name, const char *format, ...); -FX_ENTRY int FX_CALL gdbg_get_errors(void); -FX_ENTRY int FX_CALL gdbg_get_debuglevel(const int level); -FX_ENTRY void FX_CALL gdbg_set_debuglevel(const int level, const int value); -FX_ENTRY int FX_CALL gdbg_set_file(const char *name); - -#endif /* !__GDEBUG_H__ */ diff --git a/glide2x/sst1/init/initvg/info.c b/glide2x/sst1/init/initvg/info.c deleted file mode 100644 index 23c7426..0000000 --- a/glide2x/sst1/init/initvg/info.c +++ /dev/null @@ -1,589 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Routines to detect memory size, strapping pin, and other initialization -** configuration information. -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -#define XY_ONE (1<lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - sst1InitIdle(sstbase); - if (x & 1) { - INIT_PRINTF(("ERROR: readAndSum4x4 must have an even X (%d)\n", x)); - return(FXFALSE); - } - - /* get 16 pixels (4 x 4 array) from frame buffer and sum the colors */ - *r_sum = 0; - *g_sum = 0; - *b_sum = 0; - - for (rd_y = 0; rd_y < 4; rd_y++) { /* read 4 scanlines */ - for (rd_x = 0; rd_x < 4; rd_x ++) { - if ((rd_x & 1)==0) { /* read 2 pixels at a time */ - rd_col = - IGET(sstbase[(SST_LFB_ADDR + (y+rd_y)*2048 + (x+rd_x)*2) >> 2]); - } - else rd_col >>= 16; - rd_r = ((rd_col >> 11) & 0x1f) << 3; - rd_g = ((rd_col >> 5) & 0x3f) << 2; - rd_b = ((rd_col >> 0) & 0x1f) << 3; - *r_sum += rd_r; - *g_sum += rd_g; - *b_sum += rd_b; - INIT_INFO((4,"%d,%d = rd_col: 0x%04x rgb: %02x %02x %02x\n", - rd_x, rd_y, (rd_col & 0xffff), rd_r, rd_g, rd_b)); - } - } - INIT_INFO((3,"sums: r_sum=0x%03x g_sum=0x%03x b_sum=0x%03x\n", - *r_sum, *g_sum, *b_sum)); - return(FXTRUE); -} - -/* xxx - Give these guys some meaningful comments */ -static FxI32 rb_tbl[0xFFF+1]; -static FxI32 g_tbl[0xFFF+1]; - -/* draw a right angle triangle */ -static void -drawTriangle(volatile Sstregs *sst, int x, int y, int tSize) -{ - ISET(sst->vA.x,x); - ISET(sst->vA.y,y); - ISET(sst->vB.x,x+XY_ONE*tSize); - ISET(sst->vB.y,y); - ISET(sst->vC.x,x); - ISET(sst->vC.y,y+XY_ONE*tSize); - ISET(sst->s,0); - ISET(sst->t,0); - ISET(sst->w,0); - ISET(sst->dsdx,1<dtdx,0); - ISET(sst->dwdx,0); - ISET(sst->dsdy,0); - ISET(sst->dtdy,1<dwdy,0); - ISET(sst->triangleCMD,0); -} - -static FxBool -initSumTables(FxU32 *sstbase) -{ - int x=0,y=0; - FxU32 tst_color; - FxU32 r_sum, g_sum, b_sum; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* init sum array */ - for (r_sum = 0; r_sum <= 0xfff; r_sum++) { - rb_tbl[r_sum] = -1; - g_tbl[r_sum] = -1; - } - - ISET(sst->fbzColorPath, SST_RGBSEL_C1 | SST_CC_PASS); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK | SST_ENDITHER); - - /* fill sum array */ - for (tst_color = 0; tst_color <= 255; tst_color++) { - INIT_INFO((2,"tst_color=0x%02x\n", tst_color)); - ISET(sst->c1, (tst_color << 16) | (tst_color << 8) | tst_color); - - drawTriangle(sst, x,y,36); - if(readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum) == FXFALSE) - return(FXFALSE); - - /* check sums for uniqueness and then store away */ - if (r_sum != b_sum) { - INIT_PRINTF(("ERROR: b_sum=0x%03x r_sum=0x%03x\n", r_sum, b_sum)); - return(FXFALSE); - } - if (rb_tbl[r_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique r/b_sum=0x%03x\n", r_sum)); - return(FXFALSE); - } - rb_tbl[r_sum] = tst_color; - if (g_tbl[g_sum] != -1) { - INIT_PRINTF(("ERROR: non-unique g_sum=0x%03x\n", g_sum)); - return(FXFALSE); - } - g_tbl[g_sum] = tst_color; - } - return(FXTRUE); -} - -/* remove dither to derive actual 24-bit RGB value */ -static FxBool -unDither(FxU32 r_sum, FxU32 g_sum, FxU32 b_sum, FxU32 *result) -{ - if (rb_tbl[r_sum] == -1 || g_tbl[g_sum] == -1 || rb_tbl[b_sum] == -1) - { - INIT_PRINTF(("ERROR: unDither: invalid color sum\n")); - return(FXFALSE); - } - *result = (rb_tbl[r_sum] << 16) | (g_tbl[g_sum] << 8) | rb_tbl[b_sum]; - return(FXTRUE); -} - -static FxBool -getTmuConfigData(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - int x=0, y=0; - FxU32 r_sum, g_sum, b_sum; - volatile Sstregs *sst = (Sstregs *) sstbase; - - /* set trex's (all 3) to output configuration bits */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0] | (1 << 18)); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1] | (1 << 18)); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2] | (1 << 18)); - - /* render into the frame buffer */ - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->texBaseAddr, 0); - ISET(sst->textureMode, SST_AI88 | SST_TC_PASS | SST_TCA_PASS); - ISET(sst->tLOD, 0); - drawTriangle(sst,x,y,36); - - readAndSum4x4(sstbase, x,y, &r_sum,&g_sum,&b_sum); - if(unDither(r_sum,g_sum,b_sum,&info->tmuConfig) == FXFALSE) - return(FXFALSE); - if(GETENV(("SST_TMUCFG"))) - SSCANF(GETENV(("SST_TMUCFG")), "%i", &info->tmuConfig); - - /* reset trex's init registers */ - ISET(SST_TREX(sst,0)->trexInit1, info->tmuInit1[0]); - ISET(SST_TREX(sst,1)->trexInit1, info->tmuInit1[1]); - ISET(SST_TREX(sst,2)->trexInit1, info->tmuInit1[2]); - - return(FXTRUE); -} - -#define SENSE2 0x92F56EB0 -#define SENSE1 0xF2A916B5 -#define SENSE0 0xBADBEEF1 - -static FxU32 sense(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 mem, FxU32 init) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 *texAddr = (tmu<<(21-2)) + (FxU32 *)SST_TEX_ADDRESS(sst); - - /* set the Init0 register to enable ? MBytes of memory */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, init | (info->tmuInit0[tmu] & ~0x7000)); - sst1InitIdle(sstbase); - - ISET(sst->texBaseAddr, 0x200000>>3); /* set to 2 MB */ - texAddr[0] = SENSE2; /* write a random value */ - ISET(sst->texBaseAddr, 0x100000>>3); /* set to 1 MB */ - texAddr[0] = SENSE1; /* write a random value */ - ISET(sst->texBaseAddr, 0x000000>>3); /* set to 0 MB */ - texAddr[0] = SENSE0; /* write a random value */ - - ISET(sst->texBaseAddr, mem>>3); /* reset to 2 MB */ - drawTriangle(sst,0,0,4); /* draw a 4x4 right triangle */ - sst1InitIdle(sstbase); - - mem = IGET(sstbase[SST_LFB_ADDR>>2]); - INIT_INFO((2,"data=0x%08x\n", mem)); - - /* reset the Init0 register back to its previous value */ - sst1InitIdle(sstbase); - ISET(SST_TREX(sst,tmu)->trexInit0, info->tmuInit0[tmu]); - sst1InitIdle(sstbase); - return mem; -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuMemory(FxU32 *sstbase, sst1DeviceInfoStruct *info, FxU32 tmu, - FxU32 *TmuMemorySize) -{ - FxU32 i,data; - volatile Sstregs *sst = (Sstregs *) sstbase; - - INIT_INFO((1,"sst1InitGetTmuMemory(0x%x, , %d)\n", sstbase,tmu)); - - if(GETENV(("SST_TMUMEM_SIZE"))) { - *TmuMemorySize = ATOI(GETENV(("SST_TMUMEM_SIZE"))); - return(FXTRUE); - } - - ISET(sst->lfbMode, SST_LFB_RGBALANES_ARGB | SST_LFB_READFRONTBUFFER); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT | SST_RGBWRMASK); - ISET(sst->fbzColorPath, - SST_RGBSEL_TREXOUT | SST_CC_PASS | SST_ENTEXTUREMAP); - ISET(sst->textureMode, SST_RGB565 | SST_TC_REPLACE | SST_TCA_REPLACE); - ISET(sst->tLOD, 0); - - /* setup all downstream TMUs to be in pass-thru mode */ - for (i=0; itextureMode, SST_TC_PASS | SST_TCA_PASS); - - /* first see if we have 4 Mbytes by writing a texel at 2MB followed by - a texel at 1MB and 0MB and then rendering using the texel at 2MB - if we have less memory it should not render correctly since we trash - the memory locations it would wrap to - */ - - data = sense(sstbase,info,tmu,0x200000, 0x5000); - if (data == SENSE2) {*TmuMemorySize = 4; return(FXTRUE);} - - /* set the Init0 register to enable 2 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x100000, 0x2000); - if (data == SENSE1) {*TmuMemorySize = 2; return(FXTRUE);} - - /* set the Init0 register to enable 1 MBytes of memory and repeat test */ - data = sense(sstbase,info,tmu,0x000000, 0x2000); - if (data == SENSE0) {*TmuMemorySize = 1; return(FXTRUE);} - - INIT_PRINTF(("sst1InitGetTmuMemory() ERROR: Could not detect memory size.\n")); - return(FXFALSE); -} - -/*--------------------------------------------------------------------------- - NOTES: - assumes that board and registers are initialized - destroys part of the framebuffer - ---------------------------------------------------------------------------*/ -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetTmuInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - FxU32 trev; - - if(initSumTables(sstbase) == FXFALSE) - return(FXFALSE); - if(getTmuConfigData(sstbase,info) == FXFALSE) - return(FXFALSE); - - /* TMU memory speed */ - /* tmuClkFixed is no longer used... */ - info->tmuClkFixed = 0x0; - /* tmuMemSpeed is legacy, and is not used by either Obsidian GE or Pro Fab */ - info->tmuMemSpeed = 0; - - /* count the TMUs and verify that all TMUs are the same revision */ - info->tmuRevision = info->tmuConfig & 0x7; - info->numberTmus = 1; - if(sst1InitGetTmuMemory(sstbase, info, 0, &info->tmuMemSize[0]) == FXFALSE) - return(FXFALSE); - INIT_INFO((1,"TMU0 memory = %d MB\n", info->tmuMemSize[0])); - if (info->tmuConfig & FXBIT(6)) { /* if TMU 1 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>7) & 0x7; /* get its revision */ - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } - if(sst1InitGetTmuMemory(sstbase, info, 1, &info->tmuMemSize[1]) == FXFALSE) - return(FXFALSE); - } - if (info->tmuConfig & FXBIT(13)) { /* if TMU 2 exists */ - info->numberTmus++; /* increment TMU count */ - trev = (info->tmuConfig>>14) & 0x7; /* get its revision */ - if (info->tmuRevision != trev) { - INIT_PRINTF(("sst1InitGetDeviceInfo: ERROR, multiple different TMU revision IDs detected\n")); - return(FXFALSE); - } - if(sst1InitGetTmuMemory(sstbase, info, 2, &info->tmuMemSize[2]) == FXFALSE) - return(FXFALSE); - } - INIT_INFO((1,"numberTMus = %d\n", info->numberTmus)); - return(FXTRUE); -} - -/* -** fbiMemSize(): -** Returns size (in MBytes) of FBI frame buffer memory -** Returns 0 on error -** NOTE: fbiMemSize() destroys the contents in memory -** -*/ -#define LFB_PUTPIXEL(X, Y, DATA) \ - ISET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)], DATA) -#define LFB_GETPIXEL(X, Y) \ - IGET(lfbptr[((SST_LFB_ADDR+(X<<1)+(Y<<11))>>1)]) - -static int fbiMemSize(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - volatile unsigned short *lfbptr = (unsigned short *) sstbase; - FxU32 init0Save = IGET(sst->fbiInit0); - FxU32 init1Save = IGET(sst->fbiInit1); - FxU32 init2Save = IGET(sst->fbiInit2); - int retval = 0; - - if(GETENV(("SST_FBIMEM_SIZE"))) - return(ATOI(GETENV(("SST_FBIMEM_SIZE")))); - - /* Enable dram refresh, disable memory fifo, and setup memory */ - /* for rendering */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBI(sstbase); - - /* Setup Basic rendering datapath */ - ISET(sst->fbzColorPath, SST_CC_MONE); - ISET(sst->fogMode, 0x0); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK | SST_DRAWBUFFER_FRONT); - sst1InitIdleFBI(sstbase); - - if(sst1InitSliDetect(sstbase)) - /* SLI cannot support 4 MBytes... */ - goto check2MByte; - sst1InitSetResolution(sstbase, &SST_VREZ_800X600_60, 1); - sst1InitIdleFBI(sstbase); - - ISET(sst->lfbMode, SST_LFB_ZZ | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READDEPTHABUFFER); - sst1InitIdleFBI(sstbase); - - /* Check for 4 MBytes... */ - /* Write to Zbuffer in 800x600 resolution in upper 2 MBytes of memory */ - LFB_PUTPIXEL(128, 100, 0xdead); /* maps to row:0x216, col:0x80, bank:0x1 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(798, 599, 0xffff); - LFB_PUTPIXEL(200, 200, 0x55aa); /* maps to row:0x23d, col:0x104, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0xffff); - LFB_PUTPIXEL(400, 400, 0x0); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(128, 100) == 0xdead) && - (LFB_GETPIXEL(200, 200) == 0x55aa)) { - retval = 4; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - goto fbiMemSizeDone; - } - -check2MByte: - /* Check for 2 MBytes... */ - /* Write to color buffer in 640x480 resolution */ - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(50, 100, 0xdead); /* maps to row:0x1e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(0, 0, 0x0); - LFB_PUTPIXEL(638, 479, 0xffff); - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEBACKBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(178, 436, 0xaa55); /* maps to row:0x11e, col:0x99, bank:0x0 */ - LFB_PUTPIXEL(20, 20, 0x0); - LFB_PUTPIXEL(400, 400, 0xffff); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(50, 100) != 0xdead) - goto check1MByte; - ISET(sst->lfbMode, (SST_LFB_565 | SST_LFB_READBACKBUFFER)); - sst1InitIdleFBI(sstbase); - if(LFB_GETPIXEL(178, 436) == 0xaa55) { - retval = 2; - goto fbiMemSizeDone; - } - -check1MByte: - ISET(sst->lfbMode, SST_LFB_565 | SST_LFB_WRITEFRONTBUFFER | - SST_LFB_READFRONTBUFFER); - sst1InitIdleFBI(sstbase); - LFB_PUTPIXEL(10, 10, 0xdead); /* maps to row:0x0, col:0x145, bank:0x0 */ - LFB_PUTPIXEL(8, 8, 0x0); - LFB_PUTPIXEL(340, 340, 0xffff); - LFB_PUTPIXEL(100, 200, 0x5a5a); /* maps to row:0x3c, col:0x112, bank:0x1 */ - LFB_PUTPIXEL(66, 0, 0x0); - LFB_PUTPIXEL(360, 360, 0xffff); - sst1InitIdleFBI(sstbase); - if((LFB_GETPIXEL(10, 10) == 0xdead) && - (LFB_GETPIXEL(100, 200) == 0x5a5a)) - retval = 1; - -fbiMemSizeDone: - /* Restore init registers to original state */ - ISET(sst->fbiInit0, init0Save); - ISET(sst->fbiInit1, init1Save); - ISET(sst->fbiInit2, init2Save); - sst1InitIdleFBI(sstbase); - - return(retval); -} - -FX_EXPORT FxBool FX_CSTYLE -sst1InitGetFbiInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - info->fbiMemSize = fbiMemSize(sstbase); - - /* Detect board identification and memory speed */ - if(GETENV(("SST_FBICFG"))) - SSCANF(GETENV(("SST_FBICFG")), "%i", &info->fbiConfig); - else - info->fbiConfig = (IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - SST_FBI_MEM_TYPE_SHIFT; - - info->fbiBoardID = (info->fbiConfig >> 2) & 0x1; - /* fbiMemSpeed is legacy, and is not used by either Obsidian GE or Pro Fab */ - info->fbiMemSpeed = 0; - - /* Detect scanline interleaving */ - info->sstSliDetect = sst1InitSliDetect(sstbase); - - return FXTRUE; -} - -/* -** sst1InitGetDeviceInfo(): -** Read device specific information -** NOTE: info pointer must point to an Info structure which has already -** been allocated -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitGetDeviceInfo(FxU32 *sstbase, - sst1DeviceInfoStruct *info) -{ - FxBool retval; - - if((retval = sst1InitCheckBoard(sstbase)) == FXTRUE) - *info = *sst1CurrentBoard; - return(retval); -} - -/* -** sst1InitFillDeviceInfo(): -** Fill in device information -** NOTE: This routine destroys current contents in frame buffer memory -** -** -*/ -FxBool sst1InitFillDeviceInfo(FxU32 *sstbase, sst1DeviceInfoStruct *info) -{ - if(!sstbase) - return(FXFALSE); - - if(info->tmuRevision != 0xdead) - return FXTRUE; /* if already got it, return */ - - if(GETENV(("SST_NODEVICEINFO"))) { - /* fill device info struct with sane values... */ - INIT_PRINTF(("sst1DeviceInfo: Filling info Struct with default values...\n")); - - if(GETENV(("SST_FBICFG"))) - SSCANF(GETENV(("SST_FBICFG")), "%i", &info->fbiConfig); - else - info->fbiConfig = 0x0; - - if(GETENV(("SST_TMUCFG"))) - SSCANF(GETENV(("SST_TMUCFG")), "%i", &info->tmuConfig); - else - info->tmuConfig = 0x0; - - info->numberTmus = 1; - if (info->tmuConfig & FXBIT(6)) /* if TMU 1 exists */ - info->numberTmus++; - if (info->tmuConfig & FXBIT(13)) /* if TMU 2 exists */ - info->numberTmus++; - - info->tmuRevision = info->tmuConfig & 0x7; - - if(GETENV(("SST_FBIMEM_SIZE"))) - info->fbiMemSize = ATOI(GETENV(("SST_FBIMEM_SIZE"))); - else - info->fbiMemSize = 2; - - if(GETENV(("SST_TMUMEM_SIZE"))) - info->tmuMemSize[0] = ATOI(GETENV(("SST_TMUMEM_SIZE"))); - else - info->tmuMemSize[0] = 2; - info->tmuMemSize[1] = info->tmuMemSize[0]; - info->tmuMemSize[2] = info->tmuMemSize[0]; - } else { - int i; - - for(i=0; i<5; i++) { - if(i) - INIT_PRINTF(("sst1InitFillDeviceInfo(): Retry #%d for chip GetInfo()...\n", i)); - /* GetFbiInfo() must be called before GetTmuInfo() */ - if(sst1InitGetFbiInfo(sstbase, info) == FXFALSE) - continue; - /* get the revision ID of each TMU and verify that they are all the - same */ - if(sst1InitGetTmuInfo(sstbase, info) == FXFALSE) - continue; - break; - } - if(i == 5) - return(FXFALSE); - } - INIT_PRINTF(("sst1DeviceInfo: Board ID: Obsidian %s\n", - (info->fbiBoardID) ? "PRO" : "GE")); - INIT_PRINTF(("sst1DeviceInfo: FbiConfig:0x%x, TmuConfig:0x%x\n", - info->fbiConfig, info->tmuConfig)); - INIT_PRINTF(("sst1DeviceInfo: FBI Revision:%d, TMU Revison:%d, Num TMUs:%d\n", - info->fbiRevision, info->tmuRevision, info->numberTmus)); - INIT_PRINTF(("sst1DeviceInfo: FBI Memory:%d, TMU[0] Memory:%d", - info->fbiMemSize, info->tmuMemSize[0])); - if(info->numberTmus > 1) - INIT_PRINTF((", TMU[1] Memory:%d", info->tmuMemSize[1])); - if(info->numberTmus > 2) - INIT_PRINTF((", TMU[2] Memory:%d", info->tmuMemSize[2])); - INIT_PRINTF(("\n")); - if(sst1InitUseVoodooFile == FXTRUE) { - if(iniDac == (sst1InitDacStruct *) NULL) - INIT_PRINTF(("sst1DeviceInfo: Dac Type: Unknown")); - else - INIT_PRINTF(("sst1DeviceInfo: Dac Type: %s %s\n", - iniDac->dacManufacturer, iniDac->dacDevice)); - } else { - INIT_PRINTF(("sst1DeviceInfo: Dac Type: ")); - if(info->fbiDacType == SST_FBI_DACTYPE_ATT) - INIT_PRINTF(("AT&T ATT20C409\n")); - else if(info->fbiDacType == SST_FBI_DACTYPE_ICS) - INIT_PRINTF(("ICS ICS5342\n")); - else if(info->fbiDacType == SST_FBI_DACTYPE_TI) - INIT_PRINTF(("TI TVP3409\n")); - else - INIT_PRINTF(("Unknown\n")); - } - INIT_PRINTF(("sst1DeviceInfo: SliDetect:%d\n", info->sstSliDetect)); - - return(FXTRUE); -} -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/init.rc b/glide2x/sst1/init/initvg/init.rc deleted file mode 100644 index 5e37b40..0000000 --- a/glide2x/sst1/init/initvg/init.rc +++ /dev/null @@ -1,65 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ -*/ - -#define OFFICIAL 1 -#define FINAL 1 - -#include -#include "rcver.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// -#define VERSIONNAME "sst1init.dll\0" - -VS_VERSION_INFO VERSIONINFO - FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER - FILEFLAGSMASK 0x0030003FL - FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) - - FILEOS VOS_DOS_WINDOWS32 - FILETYPE VFT_DRV - FILESUBTYPE VFT2_DRV_INSTALLABLE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "3Dfx Interactive, Inc.\0" - VALUE "FileDescription", "3Dfx Interactive, Inc. InitCode DLL\0" - VALUE "FileVersion", VERSIONSTR - VALUE "InternalName", VERSIONNAME - VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1996\0" - VALUE "OriginalFilename", VERSIONNAME - VALUE "ProductName", "InitCode for Voodoo Graphics\251 and Windows\256 95\0" - VALUE "ProductVersion", VERSIONSTR - END - END - BLOCK "VarFileInfo" - BEGIN - /* the following line should be extended for localized versions */ - VALUE "Translation", 0x409, 1252 - END -END diff --git a/glide2x/sst1/init/initvg/makefile.linux b/glide2x/sst1/init/initvg/makefile.linux deleted file mode 100644 index 94902c9..0000000 --- a/glide2x/sst1/init/initvg/makefile.linux +++ /dev/null @@ -1,56 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_LINUX -LCOPTS = -LCINC = -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT_HW)/include - -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -ifeq ($(FX_DLL_BUILDSST1INIT),1) -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -else -SUBLIBRARIES = -endif - -# targets -LIBRARIES = libsst1.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -O -m486 -fomit-frame-pointer $(LCDEFS) $(LCOPTS) $(LCINC) -endif diff --git a/glide2x/sst1/init/initvg/makefile.unix b/glide2x/sst1/init/initvg/makefile.unix deleted file mode 100644 index 9f54f76..0000000 --- a/glide2x/sst1/init/initvg/makefile.unix +++ /dev/null @@ -1,56 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -# local defines, options, includes -LCDEFS = -DGDBG_INFO_ON -DINIT_LINUX -LCOPTS = -LCINC = -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT_SST1)/include - -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -# sources -HEADERS = sst1init.h gdebug.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = sst1init.c info.c print.c parse.c gamma.c util.c \ - sli.c video.c dac.c gdebug.c - -ifeq ($(FX_DLL_BUILDSST1INIT),1) -SUBLIBRARIES = $(BUILD_ROOT_SWLIBS)/lib/libfxpci.a -else -SUBLIBRARIES = -endif - -# targets -LIBRARIES = libsst1.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak - -# -# This library must be compiled without the big optimization options -# for some strange reason -# -ifndef DEBUG -CFLAGS = -O -m486 -fomit-frame-pointer $(LCDEFS) $(LCOPTS) $(LCINC) -endif diff --git a/glide2x/sst1/init/initvg/parse.c b/glide2x/sst1/init/initvg/parse.c deleted file mode 100644 index 5f8a5db..0000000 --- a/glide2x/sst1/init/initvg/parse.c +++ /dev/null @@ -1,920 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Parsing code for grabbing information from "voodoo.ini" initialization file -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#include <3dfx.h> -#define FX_DLL_DEFINITION -#include -#include -#include - -static int sst1InitFgets(char *, FILE *); -static int sst1InitFgetc(FILE *); -static int sst1InitParseFieldDac(char *); -static int sst1InitParseFieldCfg(char *); -static int sst1InitParseDacRdWrString(char *, sst1InitDacStruct *); -static int sst1InitParseDacRdWr(char *, sst1InitDacRdWrStruct *); -static int sst1InitParseSetVideoString(char *, sst1InitDacStruct *); -static int sst1InitParseSetMemClkString(char *, sst1InitDacStruct *); -static int sst1InitParseSetVideoModeString(char *, sst1InitDacStruct *); -static void sst1InitPrintDacRdWr(sst1InitDacRdWrStruct *, char *); -static void sst1InitToLower(char *string); -static void sst1InitFixFilename(char *dst, char *src); - -#ifndef INIT_LINUX -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo.ini" file is found and opened with no errors -** FXFALSE if cannot find file or error opening file -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() -{ -#ifndef __DOS32__ - return(FXFALSE); -#else - char filename[256], fixedFilename[512], *tmpPtr; - char path[512]; - FILE *file = (FILE *) NULL; - char buffer[1024]; - int inCfg, inDac; - int i; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(getenv("VOODOO_FILE")) { - /* Override voodoo.ini name */ - strcpy(filename, getenv("VOODOO_FILE")); - if(!(file = fopen(filename, "r"))) - return(FXFALSE); - } else { - /* Override path setting */ - if(getenv("VOODOO_PATH")) - strcpy(path, getenv("VOODOO_PATH")); - else if(getenv("PATH")) { - strcpy(path, ".;"); - strcat(path, getenv("PATH")); - } else - strcpy(path, ".;"); - - i = 0; - while(1) { - if(!i) { - if((tmpPtr = strtok(path, ";")) == NULL) - break; - } else { - if((tmpPtr = strtok(NULL, ";")) == NULL) - break; - } - strcpy(filename, tmpPtr); - sst1InitFixFilename(fixedFilename, filename); - if(fixedFilename[strlen(fixedFilename)-1] == '\\') - sprintf(filename, "%svoodoo.ini", filename); - else - sprintf(filename, "%s\\voodoo.ini", filename); - i++; - if((file = fopen(filename, "r"))) - break; - } - } - if(file == (FILE *) NULL) - return(FXFALSE); - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[CFG]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) { - if(helper) - INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [CFG] section of .ini file...\n")); - return(FXFALSE); - } - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) { - if(helper) - INIT_PRINTF(("sst1InitVoodooFile(): ERROR in [DAC] section of .ini file...\n")); - return(FXFALSE); - } - } - } - fclose(file); - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - - return(FXTRUE); -#endif -} - -#else - -/* -** sst1InitVoodooFile(): -** Find and setup "voodoo2.ini" file if possible -** -** Returns: -** FxTRUE if "voodoo2.ini" file is found, opened with no errors, and -** constains the dac programming data. -** FXFALSE if cannot find file, error opening file, or has no dac data in it. -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile() { - static FxBool retVal = FXFALSE; - int inCfg, inDac; - FILE *file = 0; - char buffer[1024], filename[256]; - char *tmpPtr; - char path[512]; - int i; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if (getenv("VOODOO_FILE")) { - /* Override voodoo.ini name */ - strcpy(filename, getenv("VOODOO_FILE")); - if (!(file = fopen(filename, "r"))) - goto __errExit; - } else { - /* Override path setting */ - if (getenv("VOODOO_PATH")) { - strcpy(path, getenv("VOODOO_PATH")); - } else { - strcpy(path, "/etc/conf.3dfx"); - } - - i = 0; - while(1) { - if (!i) { - if ((tmpPtr = strtok(path, ":")) == NULL) - break; - } else { - if ((tmpPtr = strtok(NULL, ":")) == NULL) - break; - } - strcpy(filename, tmpPtr); - if (filename[strlen(filename)-1] == '\\') - sprintf(filename, "%voodoo", filename); - else - sprintf(filename, "%s/voodoo", filename); - i++; - if ((file = fopen(filename, "r"))) - break; - } - } - if (!file) { - retVal = FXFALSE; - goto __errExit; - } - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = 0; - if (buffer[0]=='#') continue; - if (!sst1InitParseFieldCfg(buffer)) { - retVal = FXFALSE; - break; - } - } - INIT_PRINTF(("sst1Init Routines(): Using Initialization file '%s'\n", filename)); - -__errExit: - if (file) fclose(file); - - return retVal; -} -#endif - -#if defined(INIT_DOS) || defined(INIT_LINUX) - -#if __WIN32__ -#include -#endif /* __WIN32__ */ - -/* Get the definition of myGetenv for glide builds */ -#include - -/* void main(int argc, char **argv) */ -static void foo(int argc, char **argv) -{ - char buffer[2048]; /* buffer for command line inputs */ - int inCfg, inDac; - sst1InitEnvVarStruct *envVarsPtr; - sst1InitDacStruct *dacPtr; - sst1InitDacSetVideoStruct *setVideo; - sst1InitDacSetMemClkStruct *setMemClk; - FILE *file = fopen(argv[1], "r"); - - inCfg = inDac = 0; - while(sst1InitFgets(buffer, file)) { - buffer[strlen(buffer)-1] = (char) NULL; - if(!strcmp(buffer, "[CFG]")) { - inCfg = 1; inDac = 0; - continue; - } else if (!strcmp(buffer, "[DAC]")) { - inCfg = 0; inDac = 1; - continue; - } else if(buffer[0] == '[') { - inCfg = 0; inDac = 0; - continue; - } - if(inCfg) { - if(!sst1InitParseFieldCfg(buffer)) - /* Error processing .ini file */ - exit(1); - } else if(inDac) { - if(!sst1InitParseFieldDac(buffer)) - /* Error processing .ini file */ - exit(1); - } - } - - /* Dump CFG Data... */ - envVarsPtr = envVarsBase; - while(envVarsPtr) { - printf("ENV VAR:%s VALUE:%s\n", envVarsPtr->envVariable, - envVarsPtr->envValue); - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - - /* Dump Dac Data... */ - dacPtr = dacStructBase; - while(dacPtr) { - printf("DAC MANU:%s DEVICE:%s\n", dacPtr->dacManufacturer, - dacPtr->dacDevice); - if(dacPtr->detect) { - printf("\tDetect:\n"); - sst1InitPrintDacRdWr(dacPtr->detect, "\t\t"); - } - if(dacPtr->setVideo) { - setVideo = dacPtr->setVideo; - while(1) { - printf("\tsetVideo (%dx%d @ %d Hz)\n", - setVideo->width, setVideo->height, setVideo->refresh); - sst1InitPrintDacRdWr(setVideo->setVideoRdWr, "\t\t"); - if(!setVideo->nextSetVideo) - break; - else - setVideo = setVideo->nextSetVideo; - } - } - if(dacPtr->setMemClk) { - setMemClk = dacPtr->setMemClk; - while(1) { - printf("\tsetMemClk (%d MHz)\n", setMemClk->frequency); - sst1InitPrintDacRdWr(setMemClk->setMemClkRdWr, "\t\t"); - if(!setMemClk->nextSetMemClk) - break; - else - setMemClk = setMemClk->nextSetMemClk; - } - } - dacPtr = dacPtr->nextDac; - } - fclose(file); -} - -static void sst1InitFixFilename(char *dst, char *src) -{ - while(*src) { - *dst++ = *src; - if(*src == '\\') - *dst++ = *src; - src++; - } - *dst = (char) NULL; -} - - -static int sst1InitFgets(char *string, FILE *stream) -{ - int validChars = 0; - char *ptr = string; - int charRead; - - while((charRead = sst1InitFgetc(stream))) { - *ptr++ = (char) charRead; - validChars++; - if(charRead == '\n') { - *ptr++ = (char) NULL; - break; - } - } - return(validChars); -} - -static int sst1InitFgetc(FILE *stream) -{ - static int column = 0; - static int validChars = 0; - int charRead, charReadL; - int inComment; - - inComment = 0; - while(1) { - charRead = fgetc(stream); - if(inComment == 1) { - if(charRead <= 0) - return(0); - else if(charRead == '\n') - inComment = 0; - column = 0; - validChars = 0; - continue; - } else if(column == 0 && charRead == '#') { - /* Comment line */ - inComment = 1; - column = 0; - validChars = 0; - } else if(charRead <= 0) { - return(0); - } else { - if(charRead == '\n') { - if(validChars > 0) { - validChars = 0; - column = 0; - return(charRead); - } else - continue; - } else { - if(isspace(charRead)) - continue; - validChars++; - column++; - charReadL = (islower(charRead)) ? toupper(charRead) : charRead; - return(charReadL); - } - } - } -} - -static int sst1InitParseFieldCfg(char *string) -{ - char *envName, *envVal; - sst1InitEnvVarStruct *envVarsPtr; - - if((envName = strtok(string, "=")) == NULL) - return(0); - if((envVal = strtok((char *) NULL, "=")) == NULL) - /* Valid environment variable, NULL value */ - return(1); - sst1InitToLower(envVal); - - if(envVarsBase == (sst1InitEnvVarStruct *) NULL) { - if((envVarsPtr = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsBase = envVarsPtr; - } else { - envVarsPtr = envVarsBase; - while(1) { - if(envVarsPtr->nextVar == (sst1InitEnvVarStruct *) NULL) - break; - else - envVarsPtr = envVarsPtr->nextVar; - } - if((envVarsPtr->nextVar = malloc(sizeof(sst1InitEnvVarStruct))) == - (sst1InitEnvVarStruct *) NULL) - return(0); - envVarsPtr = envVarsPtr->nextVar; - } - envVarsPtr->nextVar = (sst1InitEnvVarStruct *) NULL; - strcpy(envVarsPtr->envVariable, envName); - strcpy(envVarsPtr->envValue, envVal); - - return(1); -} - -static int sst1InitParseFieldDac(char *string) -{ - char *dacFieldReference, *dacFieldValue; - static sst1InitDacStruct *dacPtr = (sst1InitDacStruct *) NULL; - - if((dacFieldReference = strtok(string, "=")) == NULL) - return(0); - if(!strcmp(dacFieldReference, "MANUFACTURER")) { - /* Add new dac device */ - if(dacStructBase == (sst1InitDacStruct *) NULL) { - if((dacPtr = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacStructBase = dacPtr; - } else { - dacPtr = dacStructBase; - while(1) { - if(dacPtr->nextDac == (sst1InitDacStruct *) NULL) - break; - else - dacPtr = dacPtr->nextDac; - } - if((dacPtr->nextDac = malloc(sizeof(sst1InitDacStruct))) == - (sst1InitDacStruct *) NULL) - return(0); - dacPtr = dacPtr->nextDac; - } - dacPtr->nextDac = (sst1InitDacStruct *) NULL; - dacPtr->dacManufacturer[0] = (char) NULL; - dacPtr->dacDevice[0] = (char) NULL; - dacPtr->detect = (sst1InitDacRdWrStruct *) NULL; - dacPtr->setVideo = (sst1InitDacSetVideoStruct *) NULL; - dacPtr->setMemClk = (sst1InitDacSetMemClkStruct *) NULL; - dacPtr->setVideoMode = (sst1InitDacSetVideoModeStruct *) NULL; - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacManufacturer, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DEVICE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - strcpy(dacPtr->dacDevice, dacFieldValue); - } else if(!strcmp(dacFieldReference, "DETECT")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseDacRdWrString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEO")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETMEMCLK")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetMemClkString(dacFieldValue, dacPtr)) - return(0); - } else if(!strcmp(dacFieldReference, "SETVIDEOMODE")) { - if((dacFieldValue = strtok((char *) NULL, "=")) == NULL) - return(0); - sst1InitToLower(dacFieldValue); - if(!sst1InitParseSetVideoModeString(dacFieldValue, dacPtr)) - return(0); - } else - return(0); - - return(1); -} - -static int sst1InitParseDacRdWrString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!(dacBase->detect = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacBase->detect; - } else { - for(i=0; i<(cntr-1); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseDacRdWr(char *string, sst1InitDacRdWrStruct *dacRdWrPtr) -{ - char *addr, *data, *mask, *addrDataCmd; - char stringCpy[2048]; - - strcpy(stringCpy, string); - - if(stringCpy[5] == '(') { - stringCpy[5] = (char) NULL; - addrDataCmd = &stringCpy[6]; - } else if(stringCpy[7] == '(') { - stringCpy[7] = (char) NULL; - addrDataCmd = &stringCpy[8]; - } else if(stringCpy[8] == '(') { - stringCpy[8] = (char) NULL; - addrDataCmd = &stringCpy[9]; - } else if(stringCpy[9] == '(') { - stringCpy[9] = (char) NULL; - addrDataCmd = &stringCpy[10]; - } else - return(0); - - if(!strcmp(stringCpy, "dacwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacwrpop")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_WRMOD_POP; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrdwr")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if((mask = strtok(NULL, ",")) == NULL) - return(0); - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - dacRdWrPtr->type = DACRDWR_TYPE_RDMODWR; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(mask, "%i", &dacRdWrPtr->mask); - SSCANF(data, "%i", &dacRdWrPtr->data); - } else if(!strcmp(stringCpy, "dacrd")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDNOCHECK; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else { - dacRdWrPtr->type = DACRDWR_TYPE_RDCHECK; - if((data = strtok(NULL, ",")) == NULL) - return(0); - if(data[strlen(data)-1] != ')') - return(0); - data[strlen(data)-1] = (char) NULL; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - SSCANF(data, "%i", &dacRdWrPtr->data); - } - } else if(!strcmp(stringCpy, "dacrdpush")) { - if((addr = strtok(addrDataCmd, ",")) == NULL) - return(0); - if(addr[strlen(addr)-1] == ')') { - dacRdWrPtr->type = DACRDWR_TYPE_RDPUSH; - SSCANF(addr, "%i", &dacRdWrPtr->addr); - } else - return(0); - } else { - return(0); - } - - return(1); -} - -static void sst1InitPrintDacRdWr(sst1InitDacRdWrStruct *dacRdWrBase, - char *prefix) -{ - sst1InitDacRdWrStruct *dacRdWrPtr = dacRdWrBase; - - while(dacRdWrPtr) { - if(dacRdWrPtr->type == DACRDWR_TYPE_WR) { - printf("%sDacWR", prefix); - printf("(0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDMODWR) { - printf("%sDacRD-MOD-WR", prefix); - printf("(0x%x,0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->mask, - dacRdWrPtr->data); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDNOCHECK) { - printf("%sDacRD-NOCHECK", prefix); - printf("(0x%x)\n", dacRdWrPtr->addr); - } else if(dacRdWrPtr->type == DACRDWR_TYPE_RDCHECK) { - printf("%sDacRD-CHECK", prefix); - printf("(0x%x,0x%x)\n", dacRdWrPtr->addr, dacRdWrPtr->data); - } else - printf("%sDAC???", prefix); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } -} - -static int sst1InitParseSetVideoString(char *string, sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoStruct *dacSetVideoPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideo) { - if(!(dacBase->setVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacBase->setVideo; - } else { - dacSetVideoPtr = dacBase->setVideo; - while(1) { - if(!dacSetVideoPtr->nextSetVideo) - break; - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - if(!(dacSetVideoPtr->nextSetVideo = - malloc(sizeof(sst1InitDacSetVideoStruct)))) - return(0); - dacSetVideoPtr = dacSetVideoPtr->nextSetVideo; - } - dacSetVideoPtr->nextSetVideo = (sst1InitDacSetVideoStruct *) NULL; - /* Width */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->width); - /* Height */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->height); - /* Refresh */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->refresh); - /* video16BPP */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - SSCANF(dacRdWrCmd, "%i", &dacSetVideoPtr->video16BPP); - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoPtr->setVideoRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoPtr->setVideoRdWr; - } else { - for(i=0; i<(cntr+3); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetMemClkString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetMemClkStruct *dacSetMemClkPtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setMemClk) { - if(!(dacBase->setMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacBase->setMemClk; - } else { - dacSetMemClkPtr = dacBase->setMemClk; - while(1) { - if(!dacSetMemClkPtr->nextSetMemClk) - break; - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - if(!(dacSetMemClkPtr->nextSetMemClk = - malloc(sizeof(sst1InitDacSetMemClkStruct)))) - return(0); - dacSetMemClkPtr = dacSetMemClkPtr->nextSetMemClk; - } - dacSetMemClkPtr->nextSetMemClk = (sst1InitDacSetMemClkStruct *) - NULL; - /* Frequency */ - SSCANF(dacRdWrCmd, "%i", &dacSetMemClkPtr->frequency); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetMemClkPtr->setMemClkRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetMemClkPtr->setMemClkRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static int sst1InitParseSetVideoModeString(char *string, - sst1InitDacStruct *dacBase) -{ - int cntr = 0; - int i; - sst1InitDacRdWrStruct *dacRdWrPtr; - sst1InitDacSetVideoModeStruct *dacSetVideoModePtr; - char *dacRdWrCmd; - char stringCpy[2048]; - - while(1) { - strcpy(stringCpy, string); - if((dacRdWrCmd = strtok(stringCpy, ";")) == NULL) - return(0); - if(cntr == 0) { - if(!dacBase->setVideoMode) { - if(!(dacBase->setVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacBase->setVideoMode; - } else { - dacSetVideoModePtr = dacBase->setVideoMode; - while(1) { - if(!dacSetVideoModePtr->nextSetVideoMode) - break; - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - if(!(dacSetVideoModePtr->nextSetVideoMode = - malloc(sizeof(sst1InitDacSetVideoModeStruct)))) - return(0); - dacSetVideoModePtr = dacSetVideoModePtr->nextSetVideoMode; - } - dacSetVideoModePtr->nextSetVideoMode = - (sst1InitDacSetVideoModeStruct *) NULL; - /* video16BPP */ - SSCANF(dacRdWrCmd, "%i", &dacSetVideoModePtr->video16BPP); - - /* First DacRdWr */ - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - if(!(dacSetVideoModePtr->setVideoModeRdWr = - malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacSetVideoModePtr->setVideoModeRdWr; - } else { - for(i=0; i<(cntr); i++) { - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) - return(0); - } - if((dacRdWrCmd = strtok(NULL, ";")) == NULL) { - break; - } - if(!(dacRdWrPtr->nextRdWr = malloc(sizeof(sst1InitDacRdWrStruct)))) - return(0); - dacRdWrPtr = dacRdWrPtr->nextRdWr; - } - dacRdWrPtr->nextRdWr = (sst1InitDacRdWrStruct *) NULL; - if(!sst1InitParseDacRdWr(dacRdWrCmd, dacRdWrPtr)) - return(0); - cntr++; - } - return(1); -} - -static void sst1InitToLower(char *string) -{ - char *ptr = string; - - while(*ptr) { - *ptr = (isupper(*ptr)) ? tolower(*ptr) : *ptr; - ptr++; - } -} - -/* -** sst1InitGetenv(): -** Getenv() for INIT routines. -** -** If the actual environment variable exists (determined by a call to -** the system getenv() routine), then that pointer is returned. Otherwise, -** if the variable is defined in the [CFG] section of "voodoo.ini", then -** a pointer to the value defined in "voodoo.ini" is returned. Otherwise, -** NULL is returned -** -*/ -FX_ENTRY char * FX_CALL sst1InitGetenv(char *string) -{ - sst1InitEnvVarStruct *envVarsPtr; - char *retVal = (char *) NULL; - - /* Does the real environment variable exist? */ - if(myGetenv(string)) - return((char*)myGetenv(string)); - - /* Does the requested environment variable exist in "voodoo.ini"? */ - /* Dump CFG Data... */ - envVarsPtr = envVarsBase; - while(envVarsPtr) { - if(!strcmp(string, envVarsPtr->envVariable)) { - retVal = envVarsPtr->envValue; - break; - } - envVarsPtr = (sst1InitEnvVarStruct *) envVarsPtr->nextVar; - } - return(retVal); -} -#endif - -const char* -myGetenv(const char* envKey) -{ - FxBool callRealGetenvP = FXTRUE; - -#if __WIN32__ - /* NB: If were being called from cya code in - * DllMain(DLL_PROCESS_DETACH) because the current app has called - * exit() or dropped off of the end of main the per dll environ - * string table has been freed by the c runtime but has not been set - * to NULL. Bad things happen if this memory has been unmapped by - * the system or if the string cannot be found. - */ - { - HANDLE curProcessHandle = GetCurrentProcess(); - DWORD exitCode = STILL_ACTIVE; - - callRealGetenvP = ((curProcessHandle != NULL) && - GetExitCodeProcess(curProcessHandle, &exitCode) && - (exitCode == STILL_ACTIVE)); - } -#endif /* __WIN32__ */ - - return (callRealGetenvP - ? getenv(envKey) - : NULL); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/print.c b/glide2x/sst1/init/initvg/print.c deleted file mode 100644 index c7d0aa2..0000000 --- a/glide2x/sst1/init/initvg/print.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Print functions for SST-1 Initialization routines -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include - -#ifdef INIT_OUTPUT - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *, va_list); - -FX_ENTRY void FX_CALL sst1InitPrintf(const char *format, ...) -{ - va_list args; - static FxBool firstPass = FXTRUE; - static FxBool printIt = FXFALSE; - - if(firstPass == FXTRUE) { - firstPass = FXFALSE; - if (sst1InitMsgFile == NULL) - { - /* I couldn't initialize to stdout because stdout is not constant */ - sst1InitMsgFile = stdout; - } - if(GETENV(("SST_INITDEBUG"))) - printIt = FXTRUE; - if(GETENV(("SST_INITDEBUG_FILE"))) { - if((sst1InitMsgFile = fopen(GETENV(("SST_INITDEBUG_FILE")), "w"))) - printIt = FXTRUE; - else { - fprintf(stderr, "sst1InitPrintf(): Could not open file '%s' for logging...\n", GETENV(("SST_INITDEBUG_FILE"))); - printIt = FXFALSE; - } - } - } - - if(printIt == FXFALSE) - return; - - va_start(args, format); - sst1InitVPrintf(format, args); - va_end(args); -} - -FX_ENTRY void FX_CALL sst1InitVPrintf(const char *format, va_list args) -{ - vfprintf(sst1InitMsgFile, format, args); - fflush(sst1InitMsgFile); -} - -#endif - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/rcver.h b/glide2x/sst1/init/initvg/rcver.h deleted file mode 100644 index 86e239a..0000000 --- a/glide2x/sst1/init/initvg/rcver.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY - * PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT - * TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX - * INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE - * DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). - * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A - * FULL TEXT OF THE NON-WARRANTY PROVISIONS. - * - * USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO - * RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN - * TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, - * AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR - * SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF - * THE UNITED STATES. - * - * COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED - */ - -#define MANVERSION 1 -#define MANREVISION 1 -#define BUILD_NUMBER 1 - -#define VERSIONSTR "InitCode " "$Revision$" "\0" diff --git a/glide2x/sst1/init/initvg/sli.c b/glide2x/sst1/init/initvg/sli.c deleted file mode 100644 index 0691f82..0000000 --- a/glide2x/sst1/init/initvg/sli.c +++ /dev/null @@ -1,544 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing scanline interleaving -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitSli(): -** Setup Multiple SST-1 subsystems for Scanline Interleaving -** sstbase0 defined to be the SLI Master -** sstbase1 defined to be the SLI Slave -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSli(FxU32 *sstbase0, FxU32 *sstbase1) -{ - FxU32 j, n, MasterPhysAddr, cntr; - volatile Sstregs *sstMaster = (Sstregs *) sstbase0; - volatile Sstregs *sstSlave = (Sstregs *) sstbase1; - FxU32 MasterInit1, SlaveInit1; - FxU32 memOffset; - FxU32 masterVInClkDel, masterVOutClkDel; - FxU32 slaveVInClkDel, slaveVOutClkDel; - FxU32 masterPVOutClkDel, slavePVOutClkDel; - FxU32 pciFifoLwm, memFifoLwm; - FxU32 clkFreqMaster; - - /* Check to make sure master and slave are installed properly */ - /* Master should have a clock frequency setting of 54 MHz */ - /* Slave should have a clock frequency setting of 50 MHz */ - /* sst1InitCalcGrxClk() will actually setup the master to run at 54 MHz, */ - /* even though the default strapping is 54 MHz. The 54 MHz strapping is */ - /* implemented to allow software detection of which SLI board is the */ - /* SLI Master */ - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - clkFreqMaster = 40 + (((sst1CurrentBoard->tmuConfig >> 3) & 0x7) << 2) + - (sst1CurrentBoard->fbiConfig & 0x3); - if(!(GETENV(("SST_IGNORE_SLI_CHECK")))) { - if(clkFreqMaster != 54) { - INIT_PRINTF(("sst1InitSli(): SLI Slave board installed as SLI Master.\n")); - INIT_PRINTF((" Please power-down, swap SLI boards and re-boot.\n")); - return(FXFALSE); - } - } else - INIT_PRINTF(("sst1InitSli(): WARNING: Bypassing check for proper SLI installation...\n")); - - INIT_PRINTF(("sst1InitSli(): Enabling Scanline Interleaving...\n")); - - /* Setup SLI Slave... */ - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j | SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV)); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_VIDEO_RESET | SST_EN_SCANLINE_INTERLEAVE)); - sst1InitIdleFBINoNOP(sstbase1); - PCICFG_WR(SST1_PCI_VCLK_DISABLE, 0x0); /* Disable video clock */ - ISET(SST_TREX(sstSlave,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - ISET(SST_TREX(sstSlave,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE | SST_TEX_SCANLINE_INTERLEAVE_SLAVE); - sst1InitIdle(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~(SST_EN_DRAM_BANKED | SST_SWAP_ALGORITHM)) | SST_SWAP_DACDATA0); - sst1InitIdleFBINoNOP(sstbase1); - /* Initialize Y-Origin */ - ISET(sstSlave->fbiInit3, (IGET(sstSlave->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight - 1) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - memOffset = ((IGET(sstSlave->fbiInit2) & SST_VIDEO_BUFFER_OFFSET) >> - SST_VIDEO_BUFFER_OFFSET_SHIFT) + 16; - if(memOffset & 0x1) { - if((memOffset + 1) & 0x3) /* not divisible by 4... */ - memOffset = (memOffset + 1) >> 1; - else - memOffset = (memOffset + 3) >> 1; - } else { - if(memOffset & 0x3) /* not divisible by 4... */ - memOffset = (memOffset + 2) >> 1; - else - memOffset = memOffset >> 1; - } - if(sst1CurrentBoard->fbiVideoWidth == 960) { - memOffset = 170; - ISET(sstSlave->fbiInit0, IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_EN); - INIT_PRINTF(("sst1InitSli(): Disabling memory fifo...\n")); - } - ISET(sstSlave->fbiInit2, (IGET(sstSlave->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | - (memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_MEM_FIFO_HWM) | (0x100 << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | - ((3*memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - //slaveVInClkDel = 0; - //slaveVOutClkDel = 1; - //slavePVOutClkDel = 1; - slaveVInClkDel = 2; - slaveVOutClkDel = 0; - slavePVOutClkDel = 3; - if(GETENV(("SST_SLIS_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_VOUT_CLKDEL")), "%i", &slaveVOutClkDel); - if(GETENV(("SST_SLIS_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_PVOUT_CLKDEL")), "%i", &slavePVOutClkDel); - if(GETENV(("SST_SLIS_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_SLIS_VIN_CLKDEL")), "%i", &slaveVInClkDel); - INIT_PRINTF(("sst1InitSli(): slaveVinClkdel=0x%x, slaveVOutClkDel=0x%x, slavePVOutClkDel=0x%x\n", - slaveVInClkDel, slaveVOutClkDel, slavePVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - /* 16-bit Video Output */ - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - /* SST_VIDEO_VID_CLK_SLAVE | */ - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - /* 24-bit Video Output */ - ISET(sstSlave->fbiInit1, (IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - /* SST_VIDEO_VID_CLK_SLAVE | */ - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (slaveVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (slaveVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (slavePVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~(SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN)); - sst1InitIdleFBINoNOP(sstbase1); - /* Initialize pci and memory fifos... */ - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SST_PCIFIFO_LWM"))) - ISET(sstSlave->fbiInit0, (IGET(sstSlave->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - if(!GETENV(("SST_MEMFIFO_LWM"))) - ISET(sstSlave->fbiInit4, (IGET(sstSlave->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase1); - INIT_PRINTF(("sst1InitSli(): Slave pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstSlave->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstSlave->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) | - (SST_EN_SCANLINE_INTERLEAVE | SST_VIDEO_RESET)); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase1); - sst1InitIdleFBINoNOP(sstbase1); - if(IGET(sstSlave->fbiInit1) & SST_VIDEO_RESET) { - INIT_PRINTF(("sst1InitSli(): Could not unReset Slave Video...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - if(!(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE)) { - INIT_PRINTF(("sst1InitSli(): Could not setup SLI Slave...\n")); - if(++cntr < 10) - continue; - else - return(FXFALSE); - } - SlaveInit1 = IGET(sstSlave->fbiInit1); - break; - } - - /* Setup SLI Master... */ - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) | SST_VIDEO_RESET); - ISET(SST_TREX(sstMaster,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,1)->trexInit1, sst1CurrentBoard->tmuInit1[1] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - ISET(SST_TREX(sstMaster,2)->trexInit1, sst1CurrentBoard->tmuInit1[2] | - SST_EN_TEX_SCANLINE_INTERLEAVE); - sst1InitIdle(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~(SST_EN_DRAM_BANKED | SST_SWAP_ALGORITHM)) | SST_SWAP_DACDATA0); - sst1InitIdleFBINoNOP(sstbase0); - /* Initialize Y-Origin */ - ISET(sstMaster->fbiInit3, (IGET(sstMaster->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sst1CurrentBoard->fbiVideoHeight) << SST_YORIGIN_TOP_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(sst1CurrentBoard->fbiVideoWidth == 960) - ISET(sstMaster->fbiInit0, IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_EN); - ISET(sstMaster->fbiInit2, (IGET(sstMaster->fbiInit2) & - ~SST_VIDEO_BUFFER_OFFSET) | (memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & ~SST_MEM_FIFO_HWM) | - (0x100 << SST_MEM_FIFO_HWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_ROW_BASE) | ((3*memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - //masterVInClkDel = 1; - //masterVOutClkDel = 1; - //masterPVOutClkDel = 1; - masterVInClkDel = 2; - masterVOutClkDel = 0; - masterPVOutClkDel = 3; - if(GETENV(("SST_SLIM_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_VOUT_CLKDEL")), "%i", &masterVOutClkDel); - if(GETENV(("SST_SLIM_PVOUT_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_PVOUT_CLKDEL")), "%i", &masterPVOutClkDel); - if(GETENV(("SST_SLIM_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_SLIM_VIN_CLKDEL")), "%i", &masterVInClkDel); - INIT_PRINTF(("sst1InitSli(): masterVinClkdel=0x%x, masterVOutClkDel=0x%x, masterPVOutClkDel=0x%x\n", - masterVInClkDel, masterVOutClkDel, masterPVOutClkDel)); - if(sst1CurrentBoard->fbiVideo16BPP) - /* 16-bit Video Output */ - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - SST_VIDEO_VID_CLK_2X | - /* SST_VIDEO_INVERT_VID_CLK_2X | */ - SST_PCI_WRWS_1 | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - else - /* 24-bit Video Output */ - ISET(sstMaster->fbiInit1, (IGET(sstMaster->fbiInit1) & - ~(SST_VIDEO_VCLK_2X_OUTPUT_DEL | SST_VIDEO_VCLK_DEL | - SST_VIDEO_VCLK_SEL | SST_VIDEO_VCLK_2X_INPUT_DEL)) | - SST_EN_SCANLINE_INTERLEAVE | - SST_VIDEO_VID_CLK_2X | - /*SST_VIDEO_INVERT_VID_CLK_2X | */ - (0x0 << SST_VIDEO_VCLK_SEL_SHIFT) | - SST_PCI_WRWS_1 | - (masterVInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (masterVOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - (masterPVOutClkDel << SST_VIDEO_VCLK_2X_INPUT_DEL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - /* Initialize pci and memory fifos... */ - pciFifoLwm = 16; - memFifoLwm = 26; - if(!GETENV(("SST_PCIFIFO_LWM"))) - ISET(sstMaster->fbiInit0, (IGET(sstMaster->fbiInit0) & - ~SST_PCI_FIFO_LWM) | (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - if(!GETENV(("SST_MEMFIFO_LWM"))) - ISET(sstMaster->fbiInit4, (IGET(sstMaster->fbiInit4) & - ~SST_MEM_FIFO_LWM) | (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase0); - INIT_PRINTF(("sst1InitSli(): Master pciFifoLwm:%d, memFifoLwm:%d\n", - ((IGET(sstMaster->fbiInit0) & SST_PCI_FIFO_LWM) >> - SST_PCI_FIFO_LWM_SHIFT), - ((IGET(sstMaster->fbiInit4) & SST_MEM_FIFO_LWM) >> - SST_MEM_FIFO_LWM_SHIFT))); - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - MasterInit1 = IGET(sstMaster->fbiInit1); - - /* Master */ - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - MasterPhysAddr = sst1CurrentBoard->physAddr; - sst1InitReturnStatus(sstbase0); /* flush pci packer with reads */ - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - /* Slave */ - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - ((j & ~(SST_SCANLINE_SLV_OWNPCI)) | SST_SCANLINE_SLI_SLV)); - /* Map both boards to same Master physical address */ - PCICFG_WR(PCI_BASE_ADDRESS_0, MasterPhysAddr); - sst1InitReturnStatus(sstbase0); /* flush pci packer with reads */ - sst1InitReturnStatus(sstbase0); - sst1InitReturnStatus(sstbase0); - - /* Reset Video units simultaneously */ - ISET(sstMaster->fbiInit1, MasterInit1 | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - sst1InitIdleFBINoNOP(sstbase0); - ISET(sstMaster->fbiInit1, MasterInit1); - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - PCICFG_WR(SST1_PCI_INIT_ENABLE, 0x0); /* Disable writes to init regs */ - sst1InitReturnStatus(sstbase0); - ISET(sstMaster->fbiInit1, SlaveInit1); - sst1InitIdleFBINoNOP(sstbase0); - /* Enable writes to init regs */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - sst1InitIdleFBINoNOP(sstbase0); - - if(sst1InitCheckBoard(sstbase1) == FXFALSE) - return(FXFALSE); - /* Disable writes to slave Init Registers */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, (j & ~SST_INITWR_EN)); - - if(sst1InitCheckBoard(sstbase0) == FXFALSE) - return(FXFALSE); - - /* Clear buffers as a result of new buffer offsets... */ - if(!GETENV(("SST_VIDEO_NOCLEAR"))) { - /* Clear Screen */ - FxU32 clearColor = 0x0; - - if(GETENV(("SST_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SST_VIDEO_CLEARCOLOR")), "%i", &clearColor); - ISET(sstMaster->c1, clearColor); - ISET(sstMaster->c0, clearColor); - ISET(sstMaster->zaColor, 0x0); - ISET(sstMaster->clipLeftRight, sst1CurrentBoard->fbiVideoWidth); - ISET(sstMaster->clipBottomTop, sst1CurrentBoard->fbiVideoHeight); - ISET(sstMaster->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sstMaster->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sstMaster->fbzMode, SST_RGBWRMASK | SST_DRAWBUFFER_BACK); - ISET(sstMaster->fastfillCMD, 0x0); - ISET(sstMaster->nopCMD, 0x1); - } - sst1InitSliEnabled = 1; - sst1InitSliSlaveVirtAddr = sstbase1; - - sst1InitIdle(sstbase0); - - /* Synchronize Boards */ - for(j=0; j<3; j++) { - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x0); - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - } - while(!(sst1InitReturnStatus(sstbase0) & SST_VRETRACE)) - ; - IGET(sstMaster->status); - ISET(sstMaster->swapbufferCMD, 0x1); - IGET(sstMaster->status); - sst1InitIdle(sstbase0); - - return(FXTRUE); -} - -/* -** sst1InitShutdownSli(): -** Shutdown SLI configuration -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdownSli(FxU32 *sstbase) -{ - volatile Sstregs *sstMaster = (Sstregs *) sstbase; - volatile Sstregs *sstSlave = (Sstregs *) sst1InitSliSlaveVirtAddr; - FxU32 n, j, cntr; - - if(sst1InitSliEnabled) { - INIT_PRINTF(("sst1InitShutdownSli(): Disabling Scanline Interleaving...\n")); - sst1InitSliEnabled = 0; - - cntr = 0; - while(1) { - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - /* Remap slave to original physical address */ - PCICFG_WR(PCI_BASE_ADDRESS_0, sst1CurrentBoard->physAddr); - /* Turn off scanline interleaving in slave */ - /* Enable writes to init registers in slave */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j | SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV | - SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); /* delay */ - ISET(sstSlave->fbiInit1, IGET(sstSlave->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, - (j & ~(SST_SCANLINE_SLV_OWNPCI | SST_SCANLINE_SLI_SLV))); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); /* delay */ - sst1InitIdle((FxU32 *) sstSlave); - - - if(IGET(sstSlave->fbiInit1) & SST_EN_SCANLINE_INTERLEAVE) { - if(++cntr < 10) - continue; - else { - INIT_PRINTF(("sst1InitShutdown(): Could not disable Slave SLI...\n")); - return(FXFALSE); - } - } - break; - } - ISET(sstMaster->fbiInit1, IGET(sstMaster->fbiInit1) & - ~SST_EN_SCANLINE_INTERLEAVE); - sst1InitIdle((FxU32 *) sstMaster); - } - return(FXTRUE); -} - -/* -** sst1InitSliPciOwner(): -** Specify which SLI card owns PCI bus control -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSliPciOwner(FxU32 *sstbase, FxU32 owner) -{ - FxU32 j, n; - static FxU32 masterIsOwner = 1; - - if(!sst1InitSliEnabled) - return(FXTRUE); - - /* Flush PCI packers... */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - if(masterIsOwner) { - if(owner == SST_SLI_SLAVE_OWNPCI) { - masterIsOwner = 0; - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_SLAVE_OWNPCI)); - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_SLAVE_OWNPCI)); - } else - return(FXTRUE); - } else { - if(owner == SST_SLI_MASTER_OWNPCI) { - masterIsOwner = 1; - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_MASTER_OWNPCI)); - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, ((j & ~SST_SLI_OWNPCI) | - SST_SLI_MASTER_OWNPCI)); - } else - return(FXTRUE); - } - return(FXTRUE); -} - -/* -** sst1InitSliDetect(): -** Determine if scanline interleave has been detected (either through -** power-up settings or through SST_SLIDETECT) -** -*/ -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *sstbase) -{ - static int firstTime = 1; - static FxU32 sliDetected = 0; - FxU32 fbiRev; - volatile Sstregs *sst; - - if(firstTime) { - firstTime = 0; - if(GETENV(("SST_SLIDETECT"))) - sliDetected = ATOI(GETENV(("SST_SLIDETECT"))); - else { - PCICFG_RD(PCI_REVISION_ID, fbiRev); - sst = (Sstregs *) sstbase; - if((IGET(sst->fbiInit1) & SST_SLI_DETECT) && (fbiRev > 1) && - (boardsInSystem) > 1 && - ((IGET(sst->fbiInit3) & SST_FBI_MEM_TYPE) >> - (SST_FBI_MEM_TYPE_SHIFT + 2))) - sliDetected = 1; - } - } - return(sliDetected); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/sst1init.c b/glide2x/sst1/init/initvg/sst1init.c deleted file mode 100644 index ed0dd38..0000000 --- a/glide2x/sst1/init/initvg/sst1init.c +++ /dev/null @@ -1,916 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Revision$ -** $Date$ -** -*/ - -/* -** Initialization code for SST-1 board. -** -** NOTE: This code must compiled with optimizations DISABLED!! -** -** The following environment variables can optionally be used to alter -** functionality (A value of X is a "don't care"): -** -** Variable Value Description -** -------- ----- ----------- -** SST_ARCADE X Allow special configs for arcade use -** SST_BACKPORCH hex Specify value of backPorch video register -** SST_BOARDS val Specify number of SST-1 boards in system -** SST_DEBUGDAC X Print out debug information for DAC -** reads and writes -** SST_DIMENSIONS hex Specify value of videoDimensions register -** SST_FASTMEM 1 Default. Enable fast memory timing -** SST_FASTMEM 0 Disable fast memory timing -** SST_FASTPCIRD X Enable fast PCI reads -** SST_FBICFG hex Specify FBI configuration strapping bits -** SST_FBIMEM_SIZE val Specify amount of frame buffer memory -** SST_FT_CLK_DEL hex Fbi-to-Trex clock delay value -** SST_GAMMA float Floating point value for gamma correction -** SST_GRXCLK val 16 <= Frequency < 80 (50 is default) -** SST_HSYNC hex Specify value of hSync video register -** SST_IGNORE_INIT_GAMMA X Bypass sst1InitGamma call and return -** SST_IGNORE_INIT_REGISTERS X Bypass sst1InitRegisters call and return -** SST_IGNORE_INIT_VIDEO X Bypass sst1InitVideo call and return -** SST_IGNORE_SLI_CHECK X Ignore checking for proper SLI install -** SST_INITDEBUG X Enable debug output -** SST_INITDEBUG_FILE file File to direct all debug output -** SST_MEMFIFO 0 Disable FBI Memory FIFO -** SST_MEMFIFO 1 Enable FBI Memory FIFO -** SST_MEMFIFO_ENTRIES hex Set number of entries in memory fifo -** SST_MEMFIFO_HWM hex Set memory fifo high water mark -** SST_MEMFIFO_LFB 0 or 1 Specify LFB writes through Memory FIFO -** SST_MEMFIFO_LWM hex Set memory fifo low water mark -** SST_MEMFIFO_TEX 0 or 1 Specify Texture writes through Mem FIFO -** SST_MEMOFFSET hex Specify value of memoffset video register -** SST_NOCHECKHANG X Do not Check for FBI Hangs for texturing -** SST_NODEVICEINFO X Ignore calls to sst1InitFillDeviceInfo() -** SST_NOSHUTDOWN X Do not turn off monitor refresh on call -** to sst1InitShutdown() -** SST_PCIFIFO_LWM hex Set pci fifo low water mark -** SST_PFT_CLK_DEL hex Preliminary Fbi-to-Trex clock delay value -** SST_PTF0_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #0) -** SST_PTF1_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #1) -** SST_PTF2_CLK_DEL hex Prelim TMU2Fbi clock delay value (TMU #2) -** SST_SLIDETECT 0 or 1 Specify Scanline Interleaving detection -** SST_SLIM_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Master) -** SST_SLIM_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Master) -** SST_SLIS_VIN_CLKDEL hex Specify FBI internal video clock delay -** (SLI Slave) -** SST_SLIS_VOUT_CLKDEL hex Specify FBI external video clock delay -** (SLI Slave) -** SST_SCREENREFRESH 60 Select 60Hz monitor refresh rate -** (overrides argument to sst1InitVideo) -** SST_SCREENREFRESH 75 Select 75Hz monitor refresh rate -** SST_SCREENREZ 512 Select 512x384 video resolution -** (overrides argument to sst1InitVideo) -** SST_SCREENREZ 640 Select 640x480 video resolution -** SST_SCREENREZ 800 Select 800x600 video resolution -** SST_SLOWPCIWR X Enable 1 wait-state PCI writes -** SST_TEXMAP_DISABLE X Disable texture mapping -** SST_TF0_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #0) -** SST_TF1_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #1) -** SST_TF2_CLK_DEL hex Trex-to-Fbi clock delay value (TMU #2) -** SST_TF_FIFO_THRESH hex Set TREX-to-FBI FIFO threshold -** SST_TILESINX hex Specify value of tilesInX video register -** SST_TMUCFG hex Specify TMU configuration strapping bits -** SST_TMUMEM X Enable accurate determination of TMU mem -** SST_TMUMEM_SIZE val Specify amount of texture memory -** SST_TREX0INIT0 hex Set trexInit0 register value - TMU #0 -** SST_TREX0INIT1 hex Set trexInit1 register value - TMU #0 -** SST_TREX1INIT0 hex Set trexInit0 register value - TMU #1 -** SST_TREX1INIT1 hex Set trexInit1 register value - TMU #1 -** SST_TREX2INIT0 hex Set trexInit0 register value - TMU #2 -** SST_TREX2INIT1 hex Set trexInit1 register value - TMU #2 -** SST_TRIPLE_BUFFER X Enable Triple Buffering -** SST_VIN_CLKDEL hex Specify FBI internal video clock delay -** SST_VOUT_CLKDEL hex Specify FBI external video clock delay -** SST_VGA_PASS 0,1 Force VGA_PASS output to {0,1} -** SST_VIDCLK2X val Video clock frequency (2x dot clock) -** SST_VIDEO_24BPP 0 Select 16-bit video output -** SST_VIDEO_24BPP 1 Select 24-bit video output -** SST_VIDEO_DISABLE X Turn off Video/Monitor refresh in FBI -** SST_VIDEO_FILTER_DISABLE X Disable video filtering -** SST_VIDEO_FILTER_THRESHOLD hex Set video filtering threshold -** SST_VIDEO_NOCLEAR X Do not clear buffers in sst1InitVideo() -** SST_VIDEO_CLEARCOLOR hex Clear screen color -** SST_VFIFO_THRESH 0-31 Select video fifo threshold -** SST_VSYNC hex Specify value of vSync video register -** -** VOODOO_FILE name Filename used in place of "voodoo.ini" -** VOODOO_PATH path Path used to locate "voodoo.ini" file -** -*/ - -#pragma optimize ("",off) -#include -#include -#include -#include -#include -#define SST1INIT_ALLOCATE /* Allocate variables in sst1init.h */ -#define FX_DLL_DEFINITION -#include -#include -#include -#include "rcver.h" - -#ifdef __WIN32__ -#include -#endif - -/* Allow SourceSafe to track Revision */ -static char codeIdent[] = "@#%" VERSIONSTR ; - -/* -** sst1InitMapBoard(): -** Find and map SST-1 board into virtual memory -** -** Returns: -** FxU32 pointer to base of SST-1 board if successful mapping occurs -** FXFALSE if cannot map or find SST-1 board -** -*/ -FX_EXPORT FxU32 * FX_CSTYLE sst1InitMapBoard(FxU32 BoardNumber) -{ - static FxU32 firstTime = 1; - FxU32 sizeOfCard = 0x1000000; /* 16 MBytes of addr space for SST-1 */ - FxU32 *sst; - volatile Sstregs *sstptr; - FxU32 n, j; - - if(firstTime) { - /* Make Watcom happy */ - codeIdent[0] = '@'; - headersIdent[0] = '@'; - - /* Find "voodoo.ini" file if it exists... */ - sst1InitUseVoodooFile = sst1InitVoodooFile(); - - if(!(boardsInSystem = sst1InitNumBoardsInSystem())) - return(NULL); - } - - if(BoardNumber == 0) { - INIT_PRINTF(("sst1Init Routines")); -#ifdef FX_DLL_ENABLE - INIT_PRINTF(("(DLL)")); -#endif - INIT_PRINTF((": %s\n", VERSIONSTR)); - INIT_PRINTF(("sst1InitMapBoard(): BoardsInSystem = %d\n", - boardsInSystem)); - - /* Clear board info structure */ - sst1InitClearBoardInfo(); - } - - if(firstTime) { - firstTime = 0; - sst1InitClearBoardInfo(); - - /* Map all boards in the system */ - /* Check that scanline interleaving is not enabled... */ - for(j=0; jfbiInit1) & SST_EN_SCANLINE_INTERLEAVE) && - sst1InitSliDetect(sst)) { - INIT_PRINTF(("sst1InitMapBoard(): Scanline Interleave detected at startup for board=%d\n", j)); - INIT_PRINTF((" System reboot required...\n")); - return(NULL); - } - } else { - FxU32 code = pciGetErrorCode(); - if (code == PCI_ERR_WRONGVXD) { -#ifdef __WIN32__ - MessageBox(NULL, pciGetErrorString(), NULL, MB_OK); -#endif /* __WIN32__ */ - exit(1); - } - sst1BoardInfo[j].virtAddr = (FxU32 *) NULL; - sst1BoardInfo[j].physAddr = (FxU32) NULL; - sst1BoardInfo[j].deviceNumber = 0xdead; - sst1BoardInfo[j].numBoardInsystem = 0xdead; - sst1BoardInfo[j].fbiRevision = 0xdead; - sst1BoardInfo[j].deviceID = 0xdead; - sst1BoardInfo[j].vendorID = 0xdead; - } - } - } - - /* Max number of supported boards in system */ - if(BoardNumber > SST1INIT_MAX_BOARDS) return(NULL); - - if(!(sst = sst1BoardInfo[BoardNumber].virtAddr)) - return (NULL); - - INIT_PRINTF(("sst1InitMapBoard(): vAddr:0x%x pAddr:0x%x Dev:0x%x Board:%d\n", - (FxU32) sst1BoardInfo[BoardNumber].virtAddr, - (FxU32) sst1BoardInfo[BoardNumber].physAddr, - (FxU32) sst1BoardInfo[BoardNumber].deviceNumber, BoardNumber)); - - sstptr = (Sstregs *) sst; - - /* Default settings */ - if((IGET(sstptr->fbiInit3) & SST_FBI_VGA_PASS_POWERON) && - (sst1BoardInfo[BoardNumber].fbiRevision > 0)) { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].fbiRegulatorPresent = 0x1; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - sst1BoardInfo[BoardNumber].fbiRegulatorPresent = 0x0; - } - sst1BoardInfo[BoardNumber].fbiVideo16BPP = 0; - - if(GETENV(("SST_VGA_PASS"))) { - INIT_PRINTF(("sst1InitMapBoard(): Using SST_VGA_PASS=%d\n", - ATOI(GETENV(("SST_VGA_PASS"))))); - if(ATOI(GETENV(("SST_VGA_PASS")))) { - sst1BoardInfo[BoardNumber].vgaPassthruEnable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruDisable = 0x0; - } else { - sst1BoardInfo[BoardNumber].vgaPassthruDisable = SST_EN_VGA_PASSTHRU; - sst1BoardInfo[BoardNumber].vgaPassthruEnable = 0x0; - } - } - return(sst); -} - -/* -** sst1InitRegisters(): -** Initialize registers and memory and return to power-on state -** -** Returns: -** FXTRUE if successfully initializes SST-1 -** FXFALSE if cannot initialize SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitRegisters(FxU32 *sstbase) -{ - FxU32 n, tf_fifo_thresh; - FxU32 ft_clk_del, tf0_clk_del, tf1_clk_del, tf2_clk_del; - sst1ClkTimingStruct sstGrxClk; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_IGNORE_INIT_REGISTERS"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitRegisters()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - /* Disable video clock */ - PCICFG_WR(SST1_PCI_VCLK_DISABLE, 0x0); - - /* Enable writes to the FBIINIT registers */ - /* Do not allow writes into the pci fifo until everything is reset */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, SST_INITWR_EN); - - /* Reset Snoop registers to default values */ -#if 0 - PCICFG_WR(SST1_PCI_BUS_SNOOP0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP1, SST_PCI_BUS_SNOOP_DEFAULT); -#else - PCICFG_WR(SST1_PCI_BUS_SNOOP_0, SST_PCI_BUS_SNOOP_DEFAULT); - PCICFG_WR(SST1_PCI_BUS_SNOOP_1, SST_PCI_BUS_SNOOP_DEFAULT); -#endif - sst1InitReturnStatus(sstbase); /* Stall - can't call IdleFbi because */ - /* FBI could be hung at this stage */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - /* Adjust Fbi-to-Trex clock delay value */ - /* Adjust Trex-to-Fbi FIFO */ - if(GETENV(("SST_TF_FIFO_THRESH"))) - SSCANF(GETENV(("SST_TF_FIFO_THRESH")), "%i", &tf_fifo_thresh); - else - tf_fifo_thresh = 0x8; - INIT_PRINTF(("sst1InitRegisters(): Setting TREX-to-FBI FIFO THRESHOLD to 0x%x...\n", - tf_fifo_thresh)); - /* Set ft_clk_del for 16 MHz bringup */ - if(sst1CurrentBoard->fbiRevision == 2) - /* .5 micron */ - ft_clk_del = 0x8; /* Okay for 16 MHz startup... */ - else - /* .6 micron */ - ft_clk_del = 0xa; /* Okay for 16 MHz startup... */ - if(GETENV(("SST_PFT_CLK_DEL"))) - SSCANF(GETENV(("SST_PFT_CLK_DEL")), "%i", &ft_clk_del); - INIT_PRINTF(("sst1InitRegisters(): Setting PRELIM FT-CLK delay to 0x%x...\n", ft_clk_del)); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - - /* Wait for Fbi-to-Trex clock delay value to propogate */ - sst1InitReturnStatus(sstbase); /* Stall - can't call IdleFbi because */ - /* FBI could be hung at this stage */ - - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - - /* Reset graphics and video units */ - /* Must reset video unit before graphics unit, otherwise video unit could */ - /* potentially hang waiting for the graphics unit to respond */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - /* don't wait for idle b/c grx could be hung */ - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - sst1InitReturnStatus(sstbase); - ISET(sst->fbiInit0, - IGET(sst->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - - sst1InitIdleFBINoNOP(sstbase); - - /* Unreset PCI FIFO... */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - /* Unreset graphics subsystem */ - /* THIS MUST BE PRESENT OTHERWISE THE PCI FIFO WILL NEVER DRAIN! */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP(sstbase); - - /* Reset all FBI and TREX Init registers */ - ISET(sst->fbiInit0, SST_FBIINIT0_DEFAULT); - ISET(sst->fbiInit1, SST_FBIINIT1_DEFAULT); - ISET(sst->fbiInit2, SST_FBIINIT2_DEFAULT); - ISET(sst->fbiInit3, - (SST_FBIINIT3_DEFAULT & ~(SST_FT_CLK_DEL_ADJ | SST_TF_FIFO_THRESH)) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT) | - (tf_fifo_thresh << SST_TF_FIFO_THRESH_SHIFT)); - ISET(sst->fbiInit4, SST_FBIINIT4_DEFAULT); - sst1InitIdleFBINoNOP(sstbase); /* Wait until init regs are reset */ - - /* Enable writes to the FBIINIT registers and allow pushes onto PCI FIFO */ - PCICFG_WR(SST1_PCI_INIT_ENABLE, (SST_INITWR_EN | SST_PCI_FIFOWR_EN)); - - /* Determine DAC Type */ - if(sst1InitDacDetect(sstbase) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): Could not detect DAC...\n")); - return(FXFALSE); - } - - /* set TREX0 init values */ - if(GETENV(("SST_TREX0INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX0INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[0]); - } else - sst1CurrentBoard->tmuInit0[0] = SST_TREX0INIT0_DEFAULT; - - INIT_PRINTF(("sst1InitRegisters(): Storing TREX0INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[0])); - if(GETENV(("SST_TREX0INIT1"))) { - - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX0INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX0INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[0]); - } else - sst1CurrentBoard->tmuInit1[0] = SST_TREX0INIT1_DEFAULT; - if(GETENV(("SST_PTF0_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF0_CLK_DEL")), "%i", &tf0_clk_del); - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf0_clk_del<tmuInit1[0])); - - ISET(SST_TREX(sst,0)->trexInit0, sst1CurrentBoard->tmuInit0[0]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - sst1InitIdleFBINoNOP(sstbase); - - /* set TREX1 init values */ - if(GETENV(("SST_TREX1INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX1INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[1]); - } else - sst1CurrentBoard->tmuInit0[1] = SST_TREX1INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX1INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[1])); - if(GETENV(("SST_TREX1INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX1INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX1INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[1]); - } else - sst1CurrentBoard->tmuInit1[1] = SST_TREX1INIT1_DEFAULT; - if(GETENV(("SST_PTF1_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF1_CLK_DEL")), "%i", &tf1_clk_del); - sst1CurrentBoard->tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf1_clk_del<tmuInit1[1])); - - ISET(SST_TREX(sst,1)->trexInit0, sst1CurrentBoard->tmuInit0[1]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - sst1InitIdleFBINoNOP(sstbase); - - /* set TREX2 init values */ - if(GETENV(("SST_TREX2INIT0"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT0 environment variable\n")); - SSCANF(GETENV(("SST_TREX2INIT0")), "%i", - &sst1CurrentBoard->tmuInit0[2]); - } else - sst1CurrentBoard->tmuInit0[2] = SST_TREX2INIT0_DEFAULT; - INIT_PRINTF(("sst1InitRegisters(): Storing TREX2INIT0=0x%x\n", - sst1CurrentBoard->tmuInit0[2])); - if(GETENV(("SST_TREX2INIT1"))) { - INIT_PRINTF(("sst1InitRegisters(): Using SST_TREX2INIT1 environment variable\n")); - SSCANF(GETENV(("SST_TREX2INIT1")), "%i", - &sst1CurrentBoard->tmuInit1[2]); - } else - sst1CurrentBoard->tmuInit1[2] = SST_TREX2INIT1_DEFAULT; - if(GETENV(("SST_PTF2_CLK_DEL"))) { - SSCANF(GETENV(("SST_PTF2_CLK_DEL")), "%i", &tf2_clk_del); - sst1CurrentBoard->tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | - (tf2_clk_del<tmuInit1[2])); - - ISET(SST_TREX(sst,2)->trexInit0, sst1CurrentBoard->tmuInit0[2]); - sst1InitIdleFBINoNOP(sstbase); - ISET(SST_TREX(sst,2)->trexInit1, sst1CurrentBoard->tmuInit1[2]); - sst1InitIdleFBINoNOP(sstbase); - - /* Set clock at 16 MHz to sense TREX configuration... */ - if(sst1InitComputeClkParams((float) 16.0, &sstGrxClk) == FXFALSE) - return(FXFALSE); - if(sst1InitSetGrxClk(sstbase, &sstGrxClk) == FXFALSE) - return(FXFALSE); - - /* Set PCI wait-states */ - if(GETENV(("SST_SLOWPCIWR"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up SLOW PCI Writes...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_PCI_WRWS_1); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_PCI_WRWS_1); - - if(GETENV(("SST_FASTPCIRD"))) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST PCI Reads...\n")); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & ~SST_PCI_RDWS_2); - } - sst1InitIdleFBINoNOP(sstbase); - - /* Enable Linear frame buffer reads */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_LFB_READ_EN); - - /* Swapbuffer algorithm is based on VSync initially */ - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_SWAP_ALGORITHM) | - SST_SWAP_VSYNC); - - /* Enable LFB read-aheads */ - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | SST_EN_LFB_RDAHEAD); - - /* Enable triangle alternate register mapping */ - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_ALT_REGMAPPING); - -#if 0 - /* Enable Endian Byte Swapping */ - /* Do not enable byte swapping due to potential bug in FBI... */ - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_ENDIAN_SWAPPING); -#endif - - /* Setup DRAM Refresh */ - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_DRAM_REFRESH_CNTR) | - SST_DRAM_REFRESH_16MS); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - sst1InitIdleFBINoNOP(sstbase); - - if(GETENV(("SST_FASTMEM"))) - n = ATOI(GETENV(("SST_FASTMEM"))); - else - n = 1; - - if(n) { - INIT_PRINTF(("sst1InitRegisters(): Setting up FAST DRAM Configuration\n")); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | (SST_EN_FAST_RAS_READ | - SST_EN_DRAM_RD_AHEAD_FIFO | SST_EN_FAST_RD_AHEAD_WR)); - } else - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_DISEN_RD_AHEAD_WR_RD); - - /* Return all other registers to their power-on state */ - sst1InitIdleFBINoNOP(sstbase); - sst1InitSetResolution(sstbase, &SST_VREZ_640X480_60, 0); - sst1InitIdleFBINoNOP(sstbase); - - /* Get DRAMs up and running (refresh is already enabled)... */ - ISET(sst->c1, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, 100); /* draw into 50x50 area */ - ISET(sst->clipBottomTop, 100); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sst->nopCMD, 0x1); /* Clear fbistat registers after clearing screen */ - sst1InitIdleFBINoNOP(sstbase); - - sst1InitRenderingRegisters(sstbase); - if(sst1InitFillDeviceInfo(sstbase, sst1CurrentBoard) == FXFALSE) { - INIT_PRINTF(("sst1InitRegisters(): ERROR filling DeviceInfo...\n")); - return(FXFALSE); - } - - sst1InitIdleFBINoNOP(sstbase); - sst1InitRenderingRegisters(sstbase); - sst1InitIdleFBINoNOP(sstbase); - - /* LFB writes stored in memory FIFO? */ - if(GETENV(("SST_MEMFIFO_LFB"))) - n = ATOI(GETENV(("SST_MEMFIFO_LFB"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): LFB Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_LFB_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - /* Texture memory writes stored in memory FIFO? */ - if(GETENV(("SST_MEMFIFO_TEX"))) - n = ATOI(GETENV(("SST_MEMFIFO_TEX"))); - else - n = 1; - if(n) { - INIT_PRINTF(("sst1InitRegisters(): TEXTURE Writes go through memory FIFO...\n")); - ISET(sst->fbiInit0, IGET(sst->fbiInit0) | SST_EN_TEX_MEMFIFO); - sst1InitIdleFBINoNOP(sstbase); - } - - ISET(sst->vRetrace, 0x0); - ISET(sst->backPorch, 0x0); - ISET(sst->videoDimensions, 0x0); - ISET(sst->hSync, 0x0); - ISET(sst->vSync, 0x0); - ISET(sst->videoFilterRgbThreshold, 0x0); - - sst1InitIdleFBINoNOP(sstbase); /* Wait until init regs are reset */ - - if(GETENV(("SST_TEXMAP_DISABLE"))) { - INIT_PRINTF(("sst1InitRegisters() WARNING: Disabling texture mapping\n")); - ISET(sst->fbiInit3, IGET(sst->fbiInit3) | SST_TEXMAP_DISABLE); - sst1InitIdleFBINoNOP(sstbase); - } - INIT_PRINTF(("sst1InitRegisters(): exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -FX_EXPORT void FX_CSTYLE sst1InitRenderingRegisters(FxU32 *sstbase) -{ - FxU32 i; - volatile Sstregs *sst = (Sstregs *) sstbase; - - ISET(sst->vA.x, 0x0); ISET(sst->vA.y, 0x0); - ISET(sst->vB.x, 0x0); ISET(sst->vB.y, 0x0); - ISET(sst->vC.x, 0x0); ISET(sst->vC.y, 0x0); - - ISET(sst->r, 0x0); ISET(sst->g, 0x0); - ISET(sst->b, 0x0); ISET(sst->z, 0x0); - ISET(sst->a, 0x0); ISET(sst->s, 0x0); - ISET(sst->t, 0x0); ISET(sst->w, 0x0); - - ISET(sst->drdx, 0x0); ISET(sst->dgdx, 0x0); - ISET(sst->dbdx, 0x0); ISET(sst->dzdx, 0x0); - ISET(sst->dadx, 0x0); ISET(sst->dsdx, 0x0); - ISET(sst->dtdx, 0x0); ISET(sst->dwdx, 0x0); - - ISET(sst->drdy, 0x0); ISET(sst->dgdy, 0x0); - ISET(sst->dbdy, 0x0); ISET(sst->dzdy, 0x0); - ISET(sst->dady, 0x0); ISET(sst->dsdy, 0x0); - ISET(sst->dtdy, 0x0); ISET(sst->dwdy, 0x0); - - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->clipLeftRight, 0x0); - ISET(sst->clipBottomTop, 0x0); - - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - ISET(sst->nopCMD, 0x1); /* Clear fbistat registers */ - - for(i=0; i<32; i++) - ISET(sst->fogTable[i], 0x0); - - /* clear TMU registers */ - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - for(i=0; i<12; i++) { - ISET(sst->nccTable0[i], 0x0); - ISET(sst->nccTable1[i], 0x0); - } - sst1InitIdle(sstbase); -} - -/* -** sst1InitShutdown(): -** Shutdown SST-1 -** Resets state of VGA_PASS to return monitor control back to the VGA -** Powers-down the DAC -** Resets the graphics clock in FBI to conserve power -** -** Returns: -** FXTRUE if successfully shuts down SST-1 -** FXFALSE if cannot shut down the SST-1 -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitShutdown(FxU32 *sstbase) -{ - volatile Sstregs *sstMaster = (Sstregs *) sstbase; - volatile Sstregs *sstSlave = (Sstregs *) sst1InitSliSlaveVirtAddr; - volatile Sstregs *sstPtr; - FxU32 n; - FxU32 SliEnable = sst1InitSliEnabled; - sst1ClkTimingStruct sstGrxClk; - - if(!sstbase) - return(FXFALSE); - - /* Wait for the SST-1 to finish rendering... */ - sst1InitIdle(sstbase); - - if(sst1InitSliEnabled) { - if(sst1InitShutdownSli(sstbase) == FXFALSE) - return(FXFALSE); - } -#ifdef __DOS32__ - /* - * HACK alert. -MS - * - * There's a pciClose(), but nobody calls it. This is needed by the - * DOS DPMI services to close fxmemmap.vxd. - * - * We need to move this to the "appropriate" place, wherever that may be. - */ - pciClose(); -#endif - - if(GETENV(("SST_NOSHUTDOWN"))) - INIT_PRINTF(("sst1InitShutdown(): Bypassing shutdown with SST_NOSHUTDOWN\n", n)); - - n = 0; - while(!GETENV(("SST_NOSHUTDOWN"))) { - if(!n) - sstPtr = sstMaster; - else - sstPtr = sstSlave; - - if(sst1InitCheckBoard((FxU32 *) sstPtr) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitShutdown(): Shutting down SST-1 #%d...\n", n)); - - /* Reset video unit to guarantee no contentions on the memory bus */ - /* Blank DAC so VGA Passthru works properly */ - ISET(sstPtr->fbiInit1, - IGET(sstPtr->fbiInit1) | (SST_VIDEO_RESET | SST_VIDEO_BLANK_EN)); - /* Turn off dram refresh to guarantee no contentions on the - memory bus */ - ISET(sstPtr->fbiInit2, IGET(sstPtr->fbiInit2) & ~SST_EN_DRAM_REFRESH); - - /* Reset graphics subsystem */ - ISET(sstPtr->fbiInit0, - IGET(sstPtr->fbiInit0) | (SST_GRX_RESET | SST_PCI_FIFO_RESET)); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_PCI_FIFO_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - ISET(sstPtr->fbiInit0, IGET(sstPtr->fbiInit0) & ~SST_GRX_RESET); - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - /* Turnaround VGA_PASS to allow VGA monitor */ - sst1InitVgaPassCtrl((FxU32 *) sstPtr, 1); - - sst1InitIdleFBINoNOP((FxU32 *) sstPtr); - - /* Set clock at 30 MHz to reduce power consumption... */ - sst1InitComputeClkParams((float) 30.0, &sstGrxClk); - if(sst1InitSetGrxClk((FxU32 *) sstPtr, &sstGrxClk) == FXFALSE) - return(FXFALSE); - sst1CurrentBoard->initGrxClkDone = 0; - - if((++n > 1) || !SliEnable) - break; - } - sst1InitIdle(sstbase); - INIT_PRINTF(("sst1InitShutdown(): Returning with status %d...\n", FXTRUE)); -#ifdef INIT_OUTPUT - if ( sst1InitMsgFile != stdout && sst1InitMsgFile ) - fclose(sst1InitMsgFile); -#endif - return(FXTRUE); -} - -/* -** sst1InitCheckBoard(): -** Set internal global variables for multiple SST-1 support -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitCheckBoard(FxU32 *sstbase) -{ - FxU32 n; - FxBool return_val = FXFALSE; - - for(n=0; n -#endif - -#define MAX_NUM_TMUS 3 - -/* Following defines need to go in "sst.h" eventually */ -/*--------- SST PCI Configuration Command bits --------------*/ -#define SST_PCIMEM_ACCESS_EN BIT(1) - -/*------- SST PCI Configuration Register defaults -----------*/ -#define SST_PCI_INIT_ENABLE_DEFAULT 0x0 -#define SST_PCI_BUS_SNOOP_DEFAULT 0x0 - -/*--- SST PCI Init Enable Configuration Register defaults ---*/ -#define SST_SLI_OWNPCI SST_SCANLINE_SLV_OWNPCI -#define SST_SLI_MASTER_OWNPCI 0x0 -#define SST_SLI_SLAVE_OWNPCI SST_SCANLINE_SLV_OWNPCI - -/*----------------- SST fbiinit0 bits -----------------------*/ -#define SST_FBIINIT0_DEFAULT 0x00000410 -#define SST_GRX_RESET BIT(1) -#define SST_PCI_FIFO_RESET BIT(2) -#define SST_EN_ENDIAN_SWAPPING BIT(3) - -/*----------------- SST fbiinit1 bits -----------------------*/ -#define SST_FBIINIT1_DEFAULT 0x00201102 -#define SST_SLI_DETECT BIT(2) - -/*----------------- SST fbiinit2 bits -----------------------*/ -#define SST_FBIINIT2_DEFAULT 0x80000040 -#define SST_DRAM_REFRESH_16MS (0x30 << SST_DRAM_REFRESH_CNTR_SHIFT) - -/*----------------- SST fbiinit3 bits -----------------------*/ -#define SST_FBIINIT3_DEFAULT 0x001E4000 -#define SST_TEXMAP_DISABLE BIT(6) -#define SST_FBI_MEM_TYPE_SHIFT 8 -#define SST_FBI_MEM_TYPE (0x7<numBoardInsystem & 0x1) || \ - ((sst1CurrentBoard->numBoardInsystem & 0x1) && \ - (sst1InitSliDetect(sstbase) == 0))) - -/*-----------------------------------------------------------*/ - -/* -** SST-1 Initialization typedefs -** -*/ - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct { - float freq; - FxU32 clkTiming_M; - FxU32 clkTiming_P; - FxU32 clkTiming_N; - FxU32 clkTiming_L; - FxU32 clkTiming_IB; -} sst1ClkTimingStruct; - -typedef struct { - FxU32 hSyncOn; - FxU32 hSyncOff; - FxU32 vSyncOn; - FxU32 vSyncOff; - FxU32 hBackPorch; - FxU32 vBackPorch; - FxU32 xDimension; - FxU32 yDimension; - FxU32 memOffset; - FxU32 memFifoEntries_1MB; - FxU32 memFifoEntries_2MB; - FxU32 memFifoEntries_4MB; - FxU32 tilesInX_Over2; - FxU32 vFifoThreshold; - FxBool video16BPPIsOK; - FxBool video24BPPIsOK; - float clkFreq16bpp; - float clkFreq24bpp; -} sst1VideoTimingStruct; - -typedef struct { - FxU32 *virtAddr; /* virtual memory base address */ - FxU32 physAddr; /* physical memory base address */ - FxU32 deviceNumber; /* PCI device number */ - FxU32 vendorID; /* PCI vendor ID */ - FxU32 deviceID; /* PCI device ID */ - FxU32 fbiRevision; /* FBI revision number */ - FxU32 fbiBoardID; /* FBI board ID (poweron strapping bits) */ - FxU32 fbiVideo16BPP; /* FBI video display mode */ - FxU32 fbiVideoWidth; /* FBI video display X-resolution */ - FxU32 fbiVideoHeight; /* FBI video display Y-resolution */ - FxU32 fbiMemoryFifoEn; /* FBI memory fifo enabled */ - FxU32 sstSliDetect; /* Scanline interleave detected */ - FxU32 tmuRevision; /* TMU revision number (for all TMUs) */ - FxU32 numberTmus; /* number of TMUs installed */ - FxU32 tmuConfig; /* TMU configuration bits */ - FxU32 fbiMemSize; /* FBI frame buffer memory (in MBytes) */ - FxU32 tmuMemSize[MAX_NUM_TMUS]; /* TMU texture memory (in MBytes) */ - - /* These cannot be read from the hardware, so we shadow them here */ - FxU32 tmuInit0[MAX_NUM_TMUS]; - FxU32 tmuInit1[MAX_NUM_TMUS]; - - /* Misc */ - FxU32 initGrxClkDone; - FxU32 vgaPassthruDisable; - FxU32 vgaPassthruEnable; - FxU32 fbiDacType; - FxU32 memFifoStatusLwm; - FxU32 numBoardInsystem; - FxU32 grxClkFreq; - FxU32 fbiMemSpeed; - FxU32 tmuMemSpeed; - FxU32 tmuClkFixed; - FxU32 fbiConfig; /* FBI strapping pins */ - FxU32 fbiVideoRefresh; /* FBI video refresh rate */ - FxU32 fbiRegulatorPresent; /* FBI voltage regulator detected */ - FxBool fbiTripleBufferingEnabled; /* Specify video triple buffering */ -} sst1DeviceInfoStruct; - -typedef struct { - unsigned char type; - unsigned char addr; - FxU32 data; - FxU32 mask; - void *nextRdWr; -} sst1InitDacRdWrStruct; - -typedef struct { - FxU32 width; - FxU32 height; - FxU32 refresh; - FxU32 video16BPP; - sst1InitDacRdWrStruct *setVideoRdWr; - void *nextSetVideo; -} sst1InitDacSetVideoStruct; - -typedef struct { - FxU32 frequency; - sst1InitDacRdWrStruct *setMemClkRdWr; - void *nextSetMemClk; -} sst1InitDacSetMemClkStruct; - -typedef struct { - FxU32 video16BPP; - sst1InitDacRdWrStruct *setVideoModeRdWr; - void *nextSetVideoMode; -} sst1InitDacSetVideoModeStruct; - -typedef struct { - char dacManufacturer[100]; - char dacDevice[100]; - sst1InitDacRdWrStruct *detect; - sst1InitDacSetVideoStruct *setVideo; - sst1InitDacSetMemClkStruct *setMemClk; - sst1InitDacSetVideoModeStruct *setVideoMode; - void *nextDac; -} sst1InitDacStruct; - -typedef struct { - char envVariable[100]; - char envValue[256]; - void *nextVar; -} sst1InitEnvVarStruct; - -FX_ENTRY FxU32 * FX_CALL sst1InitMapBoard(FxU32); -FX_ENTRY FxU32 FX_CALL sst1InitNumBoardsInSystem(void); -FX_ENTRY FxBool FX_CALL sst1InitRegisters(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGamma(FxU32 *, double); -FX_ENTRY FxBool FX_CALL sst1InitGammaRGB(FxU32 *, double, double, double); -FX_ENTRY FxBool FX_CALL sst1InitGammaTable(FxU32 *, FxU32, FxU32 *, FxU32 *, FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitVideo(FxU32 *, GrScreenResolution_t, - GrScreenRefresh_t, sst1VideoTimingStruct *); -FX_ENTRY sst1VideoTimingStruct * FX_CALL sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh); -FX_ENTRY FxBool FX_CALL sst1InitShutdown(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitShutdownSli(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSli(FxU32 *, FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetDeviceInfo(FxU32 *, sst1DeviceInfoStruct *); - -/* Miscellaneous routines */ -FX_ENTRY void FX_CALL sst1InitWrite32(FxU32 *, FxU32); -FX_ENTRY FxU32 FX_CALL sst1InitRead32(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdle(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdleFBI(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitIdleFBINoNOP(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitReturnStatus(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitDacRd(FxU32 *, FxU32); -FX_ENTRY void FX_CALL sst1InitDacWr(FxU32 *, FxU32, FxU32); -FxBool sst1InitExecuteDacRdWr(FxU32 *, sst1InitDacRdWrStruct *); -FX_ENTRY void FX_CALL sst1InitSetResolution(FxU32 *, sst1VideoTimingStruct *, - FxU32); -FX_ENTRY FxBool FX_CALL sst1InitDacIndexedEnable(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitGrxClk(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitCalcGrxClk(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitDacDetect(FxU32 *); -FxBool sst1InitDacDetectATT(FxU32 *); -FxBool sst1InitDacDetectTI(FxU32 *); -FxBool sst1InitDacDetectICS(FxU32 *); -FxBool sst1InitDacDetectINI(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSetGrxClk(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitComputeClkParams(float, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkATT(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkICS(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetGrxClkINI(FxU32 *, sst1ClkTimingStruct *); -FX_ENTRY FxBool FX_CALL sst1InitSetVidClk(FxU32 *, float); -FxBool sst1InitSetVidClkATT(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetVidClkICS(FxU32 *, sst1ClkTimingStruct *); -FxBool sst1InitSetVidClkINI(FxU32 *, FxU32, FxU32, FxU32, FxU32); -FxBool sst1InitSetVidMode(FxU32 *, FxU32); -FxBool sst1InitSetVidModeATT(FxU32 *, FxU32); -FxBool sst1InitSetVidModeICS(FxU32 *, FxU32); -FxBool sst1InitSetVidModeINI(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitCheckBoard(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetFbiInfo(FxU32 *, sst1DeviceInfoStruct *); -FX_ENTRY FxBool FX_CALL sst1InitGetTmuInfo(FxU32 *, sst1DeviceInfoStruct *); -FX_ENTRY void FX_CALL sst1InitRenderingRegisters(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitGetTmuMemory(FxU32 *sstbase, - sst1DeviceInfoStruct *info, FxU32 tmu, FxU32 *TmuMemorySize); -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitVgaPassCtrl(FxU32 *, FxU32); -FxBool sst1InitResetTmus(FxU32 *); -FX_ENTRY FxU32 FX_CALL sst1InitSliDetect(FxU32 *); -FX_ENTRY FxBool FX_CALL sst1InitSliPciOwner(FxU32 *, FxU32); -FX_ENTRY FxBool FX_CALL sst1InitVoodooFile(void); -FX_ENTRY char * FX_CALL sst1InitGetenv(char *); -FX_ENTRY FxU32 * FX_CALL sst1InitGetBaseAddr(FxU32); -FxBool sst1InitFillDeviceInfo(FxU32 *, sst1DeviceInfoStruct *); -void sst1InitIdleLoop(FxU32 *); -void sst1InitClearBoardInfo(void); -FX_ENTRY FxBool FX_CALL sst1InitSetTripleBuffering(FxU32 *, FxBool); -FX_ENTRY void FX_CALL sst1InitCachingOn(void); - -#ifdef __cplusplus -} -#endif - -/* Info/Print routines */ -#ifdef INIT_OUTPUT - -#ifdef __cplusplus -extern "C" { -#endif -FX_ENTRY void FX_CALL sst1InitPrintf(const char *, ...); -#ifdef __cplusplus -} -#endif - -#ifndef _FILE_DEFINED -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE -FILE *sst1InitMsgFile = NULL; /*stdout;*/ -#else -extern FILE *sst1InitMsgFile; -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/* Maximum number of SST-1 boards supported in system */ -#define SST1INIT_MAX_BOARDS 16 - -/* Maximum number of read pushes in "voodoo.ini" file */ -#define DACRDWR_MAX_PUSH 16 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SST1INIT_ALLOCATE - static char headersIdent[] = "@#%InitHeaders $Revision$"; - FxBool sst1InitUseVoodooFile = FXFALSE; - sst1InitEnvVarStruct *envVarsBase = (sst1InitEnvVarStruct *) NULL; - sst1InitDacStruct *dacStructBase = (sst1InitDacStruct *) NULL; - sst1InitDacStruct *iniDac = (sst1InitDacStruct *) NULL; - sst1InitDacSetVideoStruct *iniVideo = (sst1InitDacSetVideoStruct *) NULL; - sst1InitDacSetMemClkStruct *iniMemClk = (sst1InitDacSetMemClkStruct *) NULL; - FxU32 iniStack[DACRDWR_MAX_PUSH]; - int iniStackPtr = 0; - sst1DeviceInfoStruct *sst1CurrentBoard; - FxU32 sst1InitDeviceNumber; - sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - FxU32 boardsInSystem; - FxU32 sst1InitSliEnabled = 0; - FxU32 *sst1InitSliSlaveVirtAddr; - -#if 0 - /* In the newer revisions of swlibs these have moved to - newpci/pcilib/sst1_pci.c. Please make modifications there instead. */ - const PciRegister SST1_PCI_INIT_ENABLE = { 0x40, 4, READ_WRITE }; - const PciRegister SST1_PCI_BUS_SNOOP0 = { 0x44, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_BUS_SNOOP1 = { 0x48, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_CFG_STATUS = { 0x4c, 4, READ_ONLY }; - const PciRegister SST1_PCI_VCLK_ENABLE = { 0xc0, 4, WRITE_ONLY }; - const PciRegister SST1_PCI_VCLK_DISABLE = { 0xe0, 4, WRITE_ONLY }; -#else -#include -#endif - -#else - extern FxBool sst1InitUseVoodooFile; - extern sst1InitEnvVarStruct *envVarsBase; - extern sst1InitDacStruct *dacStructBase; - extern sst1InitDacStruct *iniDac; - extern sst1InitDacSetVideoStruct *iniVideo; - extern sst1InitDacSetMemClkStruct *iniMemClk; - extern FxU32 iniStack[]; - extern int iniStackPtr; - extern sst1DeviceInfoStruct *sst1CurrentBoard; - extern FxU32 sst1InitDeviceNumber; - extern sst1DeviceInfoStruct sst1BoardInfo[SST1INIT_MAX_BOARDS]; - extern FxU32 boardsInSystem; - extern FxU32 sst1InitSliEnabled; - extern FxU32 *sst1InitSliSlaveVirtAddr; - -#if 0 - /* In the newer revisions of swlibs these have moved to - newpci/pcilib/sst1_pci.h. Please make modification there instead. */ - extern PciRegister SST1_PCI_INIT_ENABLE; - extern PciRegister SST1_PCI_BUS_SNOOP0; - extern PciRegister SST1_PCI_BUS_SNOOP1; - extern PciRegister SST1_PCI_CFG_STATUS; - extern PciRegister SST1_PCI_VCLK_ENABLE; - extern PciRegister SST1_PCI_VCLK_DISABLE; -#else -#include -#endif - -#endif /* SST1INIT_ALLOCATE */ - -#ifdef __cplusplus -} -#endif - -#ifdef SST1INIT_VIDEO_ALLOCATE -/* SST1INIT_VIDEO_ALLOCATE is only #defined in video.c - - Define useful clock and video timings - Clocks generated are follows: - Clock Freq. (MHz) = - [14.318 * (clkTiming_M+2)] / [(clkTiming_N+2) * (2^clkTiming_P)] - - Solving for clkTiming_M yields: - clkTiming_M = - [ [(Clock Freq (Mhz)) * (clkTiming_N+2) * (2^clkTiming_P)] / 14.318 ] - 2 - - NOTE: [14.318 * (clkTiming_M+2)] / (clkTiming_N+2) should be between - 120 and 240 - NOTE: Max. M is 127 - NOTE: Max. N is 31 - NOTE: Max. P is 3 - NOTE: Max. L is 15 - NOTE: Max. IB is 15 -*/ - -/* 512x256@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X256_60 = { - 41, /* hSyncOn */ - 626, /* hSyncOff */ - 4, /* vSyncOn */ - 286, /* vSyncOff */ - 65, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 256, /* yDimension */ - 64, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 23.334F, /* clkFreq16bpp */ - 23.334F /* clkFreq24bpp */ -}; - -/* 512x384@60 only syncs to Arcade-style monitors */ -sst1VideoTimingStruct SST_VREZ_512X384_60 = { - 23, /* hSyncOn */ - 640, /* hSyncOff */ - 3, /* vSyncOn */ - 411, /* vSyncOff */ - 90, /* hBackPorch */ - 24, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXFALSE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.0F, /* clkFreq16bpp */ - 33.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_72 = { - 51, /* hSyncOn */ - 591, /* hSyncOff */ - 3, /* vSyncOn */ - 430, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.093F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 40.186F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_75 = { - 44, /* hSyncOn */ - 616, /* hSyncOff */ - 3, /* vSyncOn */ - 415, /* vSyncOff */ - 55, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 20.8F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 41.6F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_85 = { - 55, /* hSyncOn */ - 599, /* hSyncOff */ - 3, /* vSyncOn */ - 401, /* vSyncOff */ - 70, /* hBackPorch */ - 16, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 22.527F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 45.054F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_512X384_120 = { - 25, /* hSyncOn */ - 650, /* hSyncOff */ - 3, /* vSyncOn */ - 409, /* vSyncOff */ - 110, /* hBackPorch */ - 25, /* vBackPorch */ - 512, /* xDimension */ - 384, /* yDimension */ - 96, /* memOffset */ - 0x410, /* memFifoEntries_1MB ... 32256 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_2MB ... 57344 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 8, /* tilesInX_Over2 */ - 20, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 33.5F, /* clkFreq16bpp .. 72 Hz refresh rate */ - 67.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_70 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 447, /* vSyncOff */ - 48, /* hBackPorch */ - 35, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_75 = { - 99, /* hSyncOn */ - 733, /* hSyncOff */ - 3, /* vSyncOn */ - 429, /* vSyncOff */ - 52, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 19, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 27.0F, /* clkFreq16bpp */ - 54.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_85 = { - 63, /* hSyncOn */ - 767, /* hSyncOff */ - 3, /* vSyncOn */ - 442, /* vSyncOff */ - 94, /* hBackPorch */ - 41, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 18, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X400_120 = { - 67, /* hSyncOn */ - 798, /* hSyncOff */ - 3, /* vSyncOn */ - 424, /* vSyncOff */ - 94, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 400, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... memory fifo not supported */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 18, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 44.47F, /* clkFreq16bpp */ - 88.94F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_75 = { - 63, /* hSyncOn */ - 775, /* hSyncOff */ - 3, /* vSyncOn */ - 497, /* vSyncOff */ - 118, /* hBackPorch */ - 16, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 31.5F, /* clkFreq16bpp */ - 63.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_85 = { - 55, /* hSyncOn */ - 776, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 78, /* hBackPorch */ - 25, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 21, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_640X480_120 = { - 45, /* hSyncOn */ - 785, /* hSyncOff */ - 3, /* vSyncOn */ - 506, /* vSyncOff */ - 100, /* hBackPorch */ - 18, /* vBackPorch */ - 640, /* xDimension */ - 480, /* yDimension */ - 150, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 17, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 50.82F, /* clkFreq16bpp */ - 101.64F /* clkFreq24bpp */ -}; - -#ifdef H3D -sst1VideoTimingStruct SST_VREZ_640X502_60 = { - 96, /* hSyncOn */ - 704, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 38, /* hBackPorch */ - 15, /* vBackPorch */ - 640, /* xDimension */ - 502, /* yDimension */ - // 150, /* memOffset */ - 160, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x610, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 10, /* tilesInX_Over2 */ - 23, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 25.175F, /* clkFreq16bpp */ - 50.350F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_800X620_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 13, /* vBackPorch */ - 800, /* xDimension */ - 620, /* yDimension */ - 254, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x0, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -#endif - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_60 = { - 127, /* hSyncOn */ - 927, /* hSyncOff */ - 4, /* vSyncOn */ - 624, /* vSyncOff */ - 86, /* hBackPorch */ - 23, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 40.0F, /* clkFreq16bpp */ - 80.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_75 = { - 79, /* hSyncOn */ - 975, /* hSyncOff */ - 3, /* vSyncOn */ - 622, /* vSyncOff */ - 158, /* hBackPorch */ - 21, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 49.5F, /* clkFreq16bpp */ - 99.0F /* clkFreq24bpp */ -}; - -/* VESA Standard */ -/* Verified 10/21/96 */ -sst1VideoTimingStruct SST_VREZ_800X600_85 = { - 63, /* hSyncOn */ - 983, /* hSyncOff */ - 3, /* vSyncOn */ - 628, /* vSyncOff */ - 150, /* hBackPorch */ - 27, /* vBackPorch */ - 800, /* xDimension */ - 600, /* yDimension */ - 247, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x6e2, /* memFifoEntries_2MB ... 9152 entries in memory fifo (no Z) */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 13, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.25F, /* clkFreq16bpp */ - 112.5F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_856X480_60 = { - 136, /* hSyncOn */ - 1008, /* hSyncOff */ - 2, /* vSyncOn */ - 523, /* vSyncOff */ - 100, /* hBackPorch */ - 23, /* vBackPorch */ - 856, /* xDimension */ - 480, /* yDimension */ - 210, /* memOffset */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x430, /* memFifoEntries_2MB ... 31232 entries in memory fifo */ - 0x100, /* memFifoEntries_4MB ... 57344 entries in memory fifo */ - 14, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 36.0F, /* clkFreq16bpp */ - 72.0F /* clkFreq24bpp */ -}; - -sst1VideoTimingStruct SST_VREZ_960X720_60 = { - 200, /* hSyncOn */ - 1013, /* hSyncOff */ - 4, /* vSyncOn */ - 750, /* vSyncOff */ - 30, /* hBackPorch */ - 23, /* vBackPorch */ - 960, /* xDimension */ - 720, /* yDimension */ - 338, /* memOffset (really 337.5) */ - 0x0, /* memFifoEntries_1MB ... unsupported resolution */ - 0x0, /* memFifoEntries_2MB ... unsupported resolution */ - 0x765, /* memFifoEntries_4MB ... 4959 entries in memory fifo */ - 15, /* tilesInX_Over2 */ - 14, /* vFifoThreshold */ - FXTRUE, /* video16BPPIsOK */ - FXTRUE, /* video24BPPIsOK */ - 56.0F, /* clkFreq16bpp */ - 112.0F /* clkFreq24bpp */ -}; - -#else /* SST1INIT_VIDEO_ALLOCATE */ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern sst1VideoTimingStruct SST_VREZ_640X480_60; -extern sst1VideoTimingStruct SST_VREZ_800X600_60; - -#ifdef __cplusplus -} -#endif - -#endif /* SST1INIT_VIDEO_ALLOCATE */ - -#endif /* !__SST1INIT_H__ */ diff --git a/glide2x/sst1/init/initvg/util.c b/glide2x/sst1/init/initvg/util.c deleted file mode 100644 index 2bca87e..0000000 --- a/glide2x/sst1/init/initvg/util.c +++ /dev/null @@ -1,359 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Utility routines for SST-1 Initialization code -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#include -#include - -/* -** sst1InitIdle(): -** Return idle condition of SST-1 -** -** Returns: -** FXTRUE if SST-1 is idle (fifos are empty, graphics engines are idle) -** FXFALSE if SST-1 has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdle(FxU32 *sstbase) -{ - if(!sstbase) - return(FXFALSE); - - if(!sst1InitSliEnabled) - sst1InitIdleLoop(sstbase); - else { - FxU32 j, n; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - /* Check idle for Master... */ - sst1InitIdleLoop(sstbase); - - /* Cause slave to drive PCI bus */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SCANLINE_SLV_OWNPCI); - if(sst1InitCheckBoard(sst1InitSliSlaveVirtAddr) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j | SST_SCANLINE_SLV_OWNPCI); - - /* Check idle for Slave... */ - sst1InitIdleLoop(sstbase); - - /* Restore normal SLI conditions */ - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_SCANLINE_SLV_OWNPCI); - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - PCICFG_RD(SST1_PCI_INIT_ENABLE, j); - PCICFG_WR(SST1_PCI_INIT_ENABLE, j & ~SST_SCANLINE_SLV_OWNPCI); - } - return(FXTRUE); -} - -void sst1InitIdleLoop(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } -} - -/* -** sst1InitIdleFBI(): -** Return idle condition of FBI (ignoring idle status of TMU) -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBI(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - ISET(sst->nopCMD, 0x0); - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr >= 3) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* -** sst1InitIdleFBINoNOP(): -** Return idle condition of FBI (ignoring idle status of TMU) -** sst1InitIdleFBINoNOP() differs from sst1InitIdleFBI() in that no NOP command -** is issued to flush the graphics pipeline. -** -** Returns: -** FXTRUE if FBI is idle (fifos are empty, graphics engines are idle) -** FXFALSE if FBI has not been mapped -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitIdleFBINoNOP(FxU32 *sstbase) -{ - FxU32 cntr; - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(!sst) - return(FXFALSE); - - /* ISET(sst->nopCMD, 0x0); */ - cntr = 0; - while(1) { - if(!(sst1InitReturnStatus(sstbase) & SST_FBI_BUSY)) { - if(++cntr > 5) - break; - } else - cntr = 0; - } - return(FXTRUE); -} - -/* Included so compiler doesn't optimize out loop code waiting on status bits */ -FX_EXPORT FxU32 FX_CSTYLE sst1InitReturnStatus(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - return(IGET(sst->status)); -} - - -/* -** sst1InitClearSwapPending(): -** Clear any swaps pending in the status register -** NOTE: The video unit of FBI must be initialized before calling this routine -** -** Returns: -** FXTRUE -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitClearSwapPending(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 displayedBuffer, i; - - INIT_PRINTF(("sst1InitClearSwapPending() WARNING: Clearing pending swapbufferCMDs...\n")); - - sst1InitIdle(sstbase); - displayedBuffer = - (IGET(sst->status) & SST_DISPLAYED_BUFFER) >> - SST_DISPLAYED_BUFFER_SHIFT; - - /* Wait until vsync is inactive to guarantee that swaps queue in the */ - /* PCI fifo properly */ - while(!(IGET(sst->status) & SST_VRETRACE) || - ((IGET(sst->vRetrace) & 0xfff) > 100) || ((IGET(sst->vRetrace) & 0xfff) - < 10)) - ; - - /* First swap syncs to Vsync...Subsequent ones do not... */ - ISET(sst->swapbufferCMD, 0x1); - ISET(sst->nopCMD, 0x0); - for(i=0; i<17; i++) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - if(displayedBuffer) { - ISET(sst->swapbufferCMD, 0x0); - ISET(sst->nopCMD, 0x0); - } - sst1InitIdle(sstbase); - - return(FXTRUE); -} - -/* -** sst1InitVgaPassCtrl(): -** Control VGA passthrough setting -** -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVgaPassCtrl(FxU32 *sstbase, FxU32 enable) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(enable) { - /* VGA controls monitor */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruEnable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_BLANK_EN); - } else { - /* SST-1 controls monitor */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_EN_VGA_PASSTHRU) | - sst1CurrentBoard->vgaPassthruDisable); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_BLANK_EN); - } - - return(FXTRUE); -} - -/* -** sst1InitResetTmus(): -** Reset TMUs after changing graphics clocks -** Occasionally when changing the frequency of the graphics clock, the TMUs -** get in an unknown state. sst1InitResetTmus() cleans up the problem. -** -*/ -FxBool sst1InitResetTmus(FxU32 *sstbase) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - FxU32 n; - - /* Clear FBI registers */ - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fogMode, 0x0); - ISET(sst->alphaMode, 0x0); - ISET(sst->fbzMode, 0x0); - ISET(sst->lfbMode, 0x0); - ISET(sst->fogColor, 0x0); - ISET(sst->zaColor, 0x0); - ISET(sst->chromaKey, 0x0); - ISET(sst->stipple, 0x0); - ISET(sst->c0, 0x0); - ISET(sst->c1, 0x0); - - /* clear TMU registers */ - ISET(sst->textureMode, 0x0); - ISET(sst->tLOD, 0x0); - ISET(sst->tDetail, 0x0); - ISET(sst->texBaseAddr, 0x0); - ISET(sst->texBaseAddr1, 0x0); - ISET(sst->texBaseAddr2, 0x0); - ISET(sst->texBaseAddr38, 0x0); - - /* Set downstream TMU to intentionally overflow TT Fifo... */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TT_FIFO_SIL); - sst1InitIdleFBINoNOP(sstbase); - - /* Draw 256-pixel textured triangle to overflow TT fifo in downstream */ - /* TMU. Create numerous page misses in downstream TMU so upstream TMU */ - /* is always running faster */ - ISET(sst->fbzColorPath, SST_ENTEXTUREMAP); - ISET(sst->fbzMode, SST_DRAWBUFFER_FRONT); - ISET(sst->vA.x, 0); - ISET(sst->vA.y, 0); - ISET(sst->vB.x, (25<vB.y, 0); - ISET(sst->vC.x, 0); - ISET(sst->vC.y, (25<s, 0x0); - ISET(sst->t, 0x0); - ISET(sst->w, 0x0); - ISET(sst->dwdx, 0x0); - ISET(sst->dwdy, 0x0); - ISET(SST_TREX(sst,0)->dsdx, (69<dsdy, (69<dsdx, (69<dsdy, (69<dsdx, (0<dsdy, (0<dsdx, (0<dsdy, (0<triangleCMD, 0x0); - ISET(sst->nopCMD, 0x1); /* This will reset pixel counter registers... */ - - /* Wait for command to execute... */ - for(n=0; n<25000; n++) - sst1InitReturnStatus(sstbase); - - /* Upstream TMU is now idle */ - /* Set downstream TMU to always accept upstream data */ - /* This will flush pending pixels in the downstream TMU */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0] | - SST_TEX_RG_TTCII_INH | SST_TEX_USE_RG_TTCII_INH); - for(n=0; n<100; n++) - sst1InitReturnStatus(sstbase); - - /* Wait for command to execute... */ - for(n=0; n<25000; n++) - sst1InitReturnStatus(sstbase); - - /* Restore registers */ - ISET(SST_TREX(sst,0)->trexInit1, sst1CurrentBoard->tmuInit1[0]); - ISET(sst->fbzColorPath, 0x0); - ISET(sst->fbzMode, 0x0); - for(n=0; n<100; n++) - sst1InitReturnStatus(sstbase); - - if(sst1InitReturnStatus(sstbase) & SST_TREX_BUSY) { - INIT_PRINTF(("sst1InitResetTmus(): Could not reset TMUs...\n")); - return(FXFALSE); - } else - return(FXTRUE); -} - -/* -** sst1InitWrite32(): -** Write 32-bit Word to specified address -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitWrite32(FxU32 *addr, FxU32 data) -{ - P6FENCE; - *addr = data; - P6FENCE; -} - -/* -** sst1InitRead32(): -** Read 32-bit Word from specified address -** -*/ -FX_EXPORT FxU32 FX_CSTYLE sst1InitRead32(FxU32 *addr) -{ - P6FENCE; - return(*addr); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/initvg/video.c b/glide2x/sst1/init/initvg/video.c deleted file mode 100644 index b7bfec6..0000000 --- a/glide2x/sst1/init/initvg/video.c +++ /dev/null @@ -1,1106 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -** Initialization code for initializing SST-1 video unit -** -*/ -#pragma optimize ("",off) -#include -#include -#include -#include -#define FX_DLL_DEFINITION -#include -#define SST1INIT_VIDEO_ALLOCATE /* allocate data structures for video timing */ -#include -#include - -/* -** sst1InitVideo(): -** Initialize video (including DAC setup) for the specified resolution -** -** Returns: -** FXTRUE if successfully initializes specified SST-1 video resolution -** FXFALSE if cannot initialize SST-1 to specified video resolution -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitVideo(FxU32 *sstbase, - GrScreenResolution_t screenResolution, GrScreenRefresh_t screenRefresh, - sst1VideoTimingStruct *altVideoTiming) -{ - FxU32 n, vtmp; - volatile Sstregs *sst = (Sstregs *) sstbase; - sst1VideoTimingStruct *sstVideoRez; - FxU32 sst1MonitorRefresh; - FxU32 sst1MonitorRez; - FxU32 video16BPP; - FxU32 memFifoEntries; - FxU32 memFifoLwm, memFifoHwm, pciFifoLwm; - FxU32 vInClkDel, vOutClkDel; - FxU32 tf0_clk_del, tf1_clk_del, tf2_clk_del; - FxU32 ft_clk_del; - - if(!sst) - return(FXFALSE); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(GETENV(("SST_IGNORE_INIT_VIDEO"))) { - INIT_PRINTF(("WARNING: Ignoring sst1InitVideo()...\n")); - sst1InitIdleFBINoNOP(sstbase); - return(FXTRUE); - } - - switch(screenResolution) { - case(GR_RESOLUTION_512x256): - sst1MonitorRez = 512256; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 256; - break; - case(GR_RESOLUTION_512x384): - sst1MonitorRez = 512; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 384; - break; - case(GR_RESOLUTION_640x400): - sst1MonitorRez = 640400; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 400; - break; - case(GR_RESOLUTION_640x480): - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - break; -#ifdef H3D - case(GR_RESOLUTION_640x240_AUTOFLIPPED): - sst1MonitorRez = 640502; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 502; - break; - case(GR_RESOLUTION_800x300_AUTOFLIPPED): - sst1MonitorRez = 800620; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 620; - break; -#endif - case(GR_RESOLUTION_800x600): - sst1MonitorRez = 800; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 600; - break; - case(GR_RESOLUTION_856x480): - sst1MonitorRez = 856; - sst1CurrentBoard->fbiVideoWidth = 856; - sst1CurrentBoard->fbiVideoHeight = 480; - break; - case(GR_RESOLUTION_960x720): - sst1MonitorRez = 960; - sst1CurrentBoard->fbiVideoWidth = 960; - sst1CurrentBoard->fbiVideoHeight = 720; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Resolution...\n")); - return(FXFALSE); - break; - } - - switch(screenRefresh) { - case(GR_REFRESH_60Hz): - sst1MonitorRefresh = 60; - break; - case(GR_REFRESH_70Hz): - sst1MonitorRefresh = 70; - break; - case(GR_REFRESH_72Hz): - sst1MonitorRefresh = 72; - break; - case(GR_REFRESH_75Hz): - sst1MonitorRefresh = 75; - break; - case(GR_REFRESH_80Hz): - sst1MonitorRefresh = 80; - break; - case(GR_REFRESH_85Hz): - sst1MonitorRefresh = 85; - break; - case(GR_REFRESH_90Hz): - sst1MonitorRefresh = 90; - break; - case(GR_REFRESH_100Hz): - sst1MonitorRefresh = 100; - break; - case(GR_REFRESH_120Hz): - sst1MonitorRefresh = 120; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Refresh Rate...\n")); - return(FXFALSE); - break; - } - - /* Override settings with environment variables */ - if(GETENV(("SST_SCREENREZ"))) { - if(ATOI(GETENV(("SST_SCREENREZ"))) == 640) { - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 640400) { - sst1MonitorRez = 640400; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 400; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 800) { - sst1MonitorRez = 800; - sst1CurrentBoard->fbiVideoWidth = 800; - sst1CurrentBoard->fbiVideoHeight = 600; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512256) { - sst1MonitorRez = 512256; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 256; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512) { - sst1MonitorRez = 512; - sst1CurrentBoard->fbiVideoWidth = 512; - sst1CurrentBoard->fbiVideoHeight = 384; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 856) { - sst1MonitorRez = 856; - sst1CurrentBoard->fbiVideoWidth = 856; - sst1CurrentBoard->fbiVideoHeight = 480; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 960) { - sst1MonitorRez = 960; - sst1CurrentBoard->fbiVideoWidth = 960; - sst1CurrentBoard->fbiVideoHeight = 720; - } else { - sst1MonitorRez = 640; - sst1CurrentBoard->fbiVideoWidth = 640; - sst1CurrentBoard->fbiVideoHeight = 480; - } - } - if(GETENV(("SST_SCREENREFRESH"))) { - if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 60) - sst1MonitorRefresh = 60; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 72) - sst1MonitorRefresh = 72; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 75) - sst1MonitorRefresh = 75; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 85) - sst1MonitorRefresh = 85; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 120) - sst1MonitorRefresh = 120; - else - sst1MonitorRefresh = 60; - } - - /* SLI only supports up to 60 Hz refresh at high resolutions */ - if(sst1CurrentBoard->sstSliDetect && sst1CurrentBoard->fbiBoardID == 0x1) - sst1MonitorRefresh = 60; - - if(altVideoTiming && !GETENV(("SST_SCREENREZ")) && - !GETENV(("SST_SCREENREFRESH"))) { - sstVideoRez = altVideoTiming; - sst1CurrentBoard->fbiVideoRefresh = 60; - sst1CurrentBoard->fbiVideoWidth = sstVideoRez->xDimension; - sst1CurrentBoard->fbiVideoHeight = sstVideoRez->yDimension; - } else { - switch(sst1MonitorRez) { - case(512256): - sstVideoRez = &SST_VREZ_512X256_60; - break; - case(512): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_512X384_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_512X384_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_512X384_75; - else if(sst1MonitorRefresh == 60 && GETENV(("SST_ARCADE"))) - sstVideoRez = &SST_VREZ_512X384_60; - else { - sst1MonitorRefresh = 72; - sstVideoRez = &SST_VREZ_512X384_72; - } - break; - case(640400): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X400_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X400_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X400_75; - else { - sst1MonitorRefresh = 70; - sstVideoRez = &SST_VREZ_640X400_70; - } - break; - case(640): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X480_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X480_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X480_75; - else { - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_640X480_60; - } - break; -#ifdef H3D - case(640502): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_640X502_60; - break; - case(800620): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_800X620_60; - break; -#endif - case(800): - if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_800X600_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_800X600_75; - else { - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_800X600_60; - } - break; - case(856): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_856X480_60; - break; - case(960): - sst1MonitorRefresh = 60; - sstVideoRez = &SST_VREZ_960X720_60; - break; - default: - INIT_PRINTF(("sst1InitVideo(): Unsupported Resolution %d...\n", - screenResolution)); - return(FXFALSE); - break; - } - sst1CurrentBoard->fbiVideoRefresh = sst1MonitorRefresh; - } - - if(GETENV(("SST_VIDEO_24BPP"))) - sst1CurrentBoard->fbiVideo16BPP = - (ATOI(GETENV(("SST_VIDEO_24BPP")))) ^ 0x1; - else { - sst1CurrentBoard->fbiVideo16BPP = 0; - - if(sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video16BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 0; - if(!sst1CurrentBoard->fbiVideo16BPP && (sstVideoRez->video24BPPIsOK == - FXFALSE)) - sst1CurrentBoard->fbiVideo16BPP = 1; - - if(altVideoTiming == (sst1VideoTimingStruct *) NULL) { - if(sst1CurrentBoard->sstSliDetect && - (sst1CurrentBoard->fbiBoardID == 0x1) && - (sstVideoRez->clkFreq24bpp > 52.0F)) { - sst1CurrentBoard->fbiVideo16BPP = 1; - } else if(sst1CurrentBoard->fbiBoardID == 0x1) { - // Obsidian Pro Board... - if(sstVideoRez->clkFreq24bpp > 81.0F) - sst1CurrentBoard->fbiVideo16BPP = 1; - } else { - if((sst1MonitorRefresh >= 85) || (sst1MonitorRez == 800) || - (sst1MonitorRez == 960)) - sst1CurrentBoard->fbiVideo16BPP = 1; - } - } -#if 0 -#if 0 - if(sst1CurrentBoard->fbiRevision == 2 && - (altVideoTiming == (sst1VideoTimingStruct *) NULL) && - (((sst1MonitorRez > 640) && (sst1MonitorRez != 512256) && - (sst1MonitorRez != 640400)) || (sst1MonitorRefresh > 85))) - sst1CurrentBoard->fbiVideo16BPP = 1; -#else - if((sst1MonitorRefresh >= 85) || (sst1MonitorRez == 800) || - (sst1MonitorRez == 960)) - sst1CurrentBoard->fbiVideo16BPP = 1; -#endif -#endif - } - video16BPP = sst1CurrentBoard->fbiVideo16BPP; - - /* Reset Video Refresh Unit */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - - /* Enable video clock */ - if(SLI_DRIVEOK()) { - INIT_PRINTF(("sst1InitVideo(): Enabling Video Clock...\n")); - PCICFG_WR(SST1_PCI_VCLK_ENABLE, 0x0); - } - - /* Setup SST video timing registers */ - if(GETENV(("SST_HSYNC"))) { - SSCANF(GETENV(("SST_HSYNC")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_HSYNC=0x%x\n", vtmp)); - ISET(sst->hSync, vtmp); - } else - ISET(sst->hSync, ((sstVideoRez->hSyncOff << SST_VIDEO_HSYNC_OFF_SHIFT) | - (sstVideoRez->hSyncOn << SST_VIDEO_HSYNC_ON_SHIFT))); - if(GETENV(("SST_VSYNC"))) { - SSCANF(GETENV(("SST_VSYNC")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_VSYNC=0x%x\n", vtmp)); - ISET(sst->vSync, vtmp); - } else - ISET(sst->vSync, ((sstVideoRez->vSyncOff << SST_VIDEO_VSYNC_OFF_SHIFT) | - (sstVideoRez->vSyncOn << SST_VIDEO_VSYNC_ON_SHIFT))); - if(GETENV(("SST_BACKPORCH"))) { - SSCANF(GETENV(("SST_BACKPORCH")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_BACKPORCH=0x%x\n", vtmp)); - ISET(sst->backPorch, vtmp); - } else - ISET(sst->backPorch, - ((sstVideoRez->vBackPorch << SST_VIDEO_VBACKPORCH_SHIFT) | - (sstVideoRez->hBackPorch << SST_VIDEO_HBACKPORCH_SHIFT))); - if(GETENV(("SST_DIMENSIONS"))) { - SSCANF(GETENV(("SST_DIMENSIONS")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using SST_DIMENSIONS=0x%x\n", vtmp)); - sstVideoRez->yDimension = (vtmp >> SST_VIDEO_YDIM_SHIFT) & 0x3ff; - sstVideoRez->xDimension = vtmp & 0x3ff; - } - ISET(sst->videoDimensions, - ((sstVideoRez->yDimension << SST_VIDEO_YDIM_SHIFT) | - ((sstVideoRez->xDimension-1) << SST_VIDEO_XDIM_SHIFT))); - if(GETENV(("SST_MEMOFFSET"))) { - SSCANF(GETENV(("SST_MEMOFFSET")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video memOffset=0x%x\n", vtmp)); - sstVideoRez->memOffset = vtmp; - } - if(GETENV(("SST_TILESINX"))) { - SSCANF(GETENV(("SST_TILESINX")), "%i", &vtmp); - INIT_PRINTF(("sst1InitVideo(): Using video tilesInX=0x%x\n", vtmp)); - sstVideoRez->tilesInX_Over2 = vtmp; - } - - /* Setup SST memory mapper for desired resolution */ - if(sst1CurrentBoard->fbiMemSize == 4) - sst1InitSetResolution(sstbase, sstVideoRez, 1); - else - sst1InitSetResolution(sstbase, sstVideoRez, 0); - - if((GETENV(("SST_TRIPLE_BUFFER"))) || - (sst1CurrentBoard->fbiTripleBufferingEnabled == FXTRUE)) { - INIT_PRINTF(("sst1InitVideo(): Enabling Triple Buffering\n")); - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_TRIPLE_BUFFERING); - } - - /* Calculate graphics clock frequency */ - if(sst1InitCalcGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - /* Setup video fifo */ - /* NOTE: Lower values for the video fifo threshold improve video fifo */ - /* underflow problems */ - if(GETENV(("SST_VFIFO_THRESH"))) { - INIT_PRINTF(("sst1InitVideo(): Overriding Default Video Fifo Threshold %d and Storing %d\n", - sstVideoRez->vFifoThreshold, ATOI(GETENV(("SST_VFIFO_THRESH"))))); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - ((ATOI(GETENV(("SST_VFIFO_THRESH")))) - << SST_VIDEO_FIFO_THRESH_SHIFT)); - } else { - FxU32 vFifoThresholdVal = sstVideoRez->vFifoThreshold; - - if(sst1CurrentBoard->grxClkFreq < 45) - /* Lower threshold value for slower graphics clocks */ - vFifoThresholdVal = sstVideoRez->vFifoThreshold - 4; - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_VIDEO_FIFO_THRESH) | - (vFifoThresholdVal << SST_VIDEO_FIFO_THRESH_SHIFT)); - } - - INIT_PRINTF(("sst1InitVideo() Setting up video for resolution (%d, %d), Refresh:%d Hz...\n", - sstVideoRez->xDimension, sstVideoRez->yDimension, sst1MonitorRefresh)); - INIT_PRINTF(("sst1InitVideo(): Video Fifo Threshold = %d\n", - (IGET(sst->fbiInit3) & SST_VIDEO_FIFO_THRESH) >> - SST_VIDEO_FIFO_THRESH_SHIFT)); - - /* Initialize Y-Origin */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_YORIGIN_TOP) | - ((sstVideoRez->yDimension - 1) << SST_YORIGIN_TOP_SHIFT)); - - sst1InitIdleFBINoNOP(sstbase); - - memFifoLwm = 23; - if(GETENV(("SST_MEMFIFO_LWM"))) - SSCANF(GETENV(("SST_MEMFIFO_LWM")), "%i", &memFifoLwm); - memFifoHwm = 54; - if(GETENV(("SST_MEMFIFO_HWM"))) - SSCANF(GETENV(("SST_MEMFIFO_HWM")), "%i", &memFifoHwm); - pciFifoLwm = 13; - if(GETENV(("SST_PCIFIFO_LWM"))) - SSCANF(GETENV(("SST_PCIFIFO_LWM")), "%i", &pciFifoLwm); - INIT_PRINTF(("sst1InitVideo(): pciFifoLwm:%d memFifoLwm:%d memFifoHwm:%d\n", - pciFifoLwm, memFifoLwm, memFifoHwm)); - - /* Setup Memory FIFO */ - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) & - ~(SST_MEM_FIFO_ROW_BASE | SST_MEM_FIFO_ROW_ROLL | SST_MEM_FIFO_LWM)); - sst1InitIdleFBINoNOP(sstbase); - if(sst1CurrentBoard->fbiMemSize == 1) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0xff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else if (sst1CurrentBoard->fbiMemSize == 2) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x1ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - else - /* 4 MBytes frame buffer memory... */ - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (0x3ff << SST_MEM_FIFO_ROW_ROLL_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - if((sst1CurrentBoard->fbiMemSize == 1 && sst1MonitorRez == 512) || - (sst1CurrentBoard->fbiMemSize == 1 && sst1MonitorRez == 512256) || - (sst1CurrentBoard->fbiMemSize == 2 && sst1MonitorRez == 800) || - (sst1CurrentBoard->fbiMemSize == 2 && sst1MonitorRez == 856)) - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - ((2*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - else if(sst1CurrentBoard->fbiMemSize < 4 && sst1MonitorRez == 960 && - sst1CurrentBoard->sstSliDetect == 0) - return(FXFALSE); - else - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - ((3*sstVideoRez->memOffset) << SST_MEM_FIFO_ROW_BASE_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - ISET(sst->fbiInit4, IGET(sst->fbiInit4) | - (memFifoLwm << SST_MEM_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - /* Set PCI FIFO LWM */ - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~SST_PCI_FIFO_LWM) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - /* Enable Memory Fifo... */ - if(GETENV(("SST_MEMFIFO"))) - n = ATOI(GETENV(("SST_MEMFIFO"))); - else - n = 1; - - /* Prohibit illegal memory fifo settings... */ - if(sst1CurrentBoard->fbiMemSize == 1 && sstVideoRez->xDimension > 512) - n = 0; - - if(n) { - sst1CurrentBoard->fbiMemoryFifoEn = 1; - if(sst1CurrentBoard->fbiMemSize == 1) - memFifoEntries = sstVideoRez->memFifoEntries_1MB; - else if(sst1CurrentBoard->fbiMemSize == 2) - memFifoEntries = sstVideoRez->memFifoEntries_2MB; - else - memFifoEntries = sstVideoRez->memFifoEntries_4MB; - if(GETENV(("SST_MEMFIFO_ENTRIES"))) - SSCANF(GETENV(("SST_MEMFIFO_ENTRIES")), "%i", &memFifoEntries); - INIT_PRINTF(("sst1InitVideo(): Enabling Memory FIFO (Entries=%d)...\n", - 0xffff - (memFifoEntries << 5))); - - sst1CurrentBoard->memFifoStatusLwm = (memFifoEntries << 5) | 0x1f; - ISET(sst->fbiInit0, (IGET(sst->fbiInit0) & ~(SST_MEM_FIFO_EN | - SST_MEM_FIFO_HWM | SST_PCI_FIFO_LWM | SST_MEM_FIFO_BURST_HWM)) | - (memFifoEntries << SST_MEM_FIFO_HWM_SHIFT) | - (pciFifoLwm << SST_PCI_FIFO_LWM_SHIFT) | - (memFifoHwm << SST_MEM_FIFO_BURST_HWM_SHIFT) | - SST_MEM_FIFO_EN); - } - INIT_PRINTF(("sst1InitVideo(): Setting memory FIFO LWM to 0x%x (%d)\n", - sst1CurrentBoard->memFifoStatusLwm, - sst1CurrentBoard->memFifoStatusLwm)); - - vInClkDel = 0; - if((sst1MonitorRez == 960 && !video16BPP) || - (sst1MonitorRez == 640 && !video16BPP && sst1MonitorRefresh == 120) || - (sst1MonitorRez == 800 && !video16BPP && sst1MonitorRefresh == 75) || - (sst1MonitorRez == 800 && !video16BPP && sst1MonitorRefresh == 85)) - vInClkDel = 2; - if(sst1CurrentBoard->fbiRevision == 2) - vInClkDel = 0; - if(GETENV(("SST_VIN_CLKDEL"))) - SSCANF(GETENV(("SST_VIN_CLKDEL")), "%i", &vInClkDel); - - if(sst1CurrentBoard->fbiRevision == 2) - vOutClkDel = 2; - else - vOutClkDel = 0; - if(GETENV(("SST_VOUT_CLKDEL"))) - SSCANF(GETENV(("SST_VOUT_CLKDEL")), "%i", &vOutClkDel); - - INIT_PRINTF(("sst1InitVideo(): vInClkDel=0x%x vOutClkDel=0x%x\n", - vInClkDel, vOutClkDel)); - - /* Drive dac output signals and select input video clock */ - if(video16BPP) { - INIT_PRINTF(("sst1InitVideo(): Setting 16BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_VCLK_SEL)); - sst1InitIdleFBINoNOP(sstbase); - } else { - INIT_PRINTF(("sst1InitVideo(): Setting 24BPP video mode...\n")); - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_MASK) | - (SST_VIDEO_DATA_OE_EN | - SST_VIDEO_BLANK_OE_EN | - SST_VIDEO_HVSYNC_OE_EN | - SST_VIDEO_DCLK_OE_EN | - SST_VIDEO_VID_CLK_2X | - SST_VIDEO_VCLK_DIV2 | - (vInClkDel << SST_VIDEO_VCLK_DEL_SHIFT) | - (vOutClkDel << SST_VIDEO_VCLK_2X_OUTPUT_DEL_SHIFT) | - SST_VIDEO_24BPP_EN)); - sst1InitIdleFBINoNOP(sstbase); - if(!GETENV(("SST_VIDEO_FILTER_DISABLE"))) { - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_FILTER_EN); - if(GETENV(("SST_VIDEO_FILTER_THRESHOLD"))) { - SSCANF(GETENV(("SST_VIDEO_FILTER_THRESHOLD")), "%i", &n); - INIT_PRINTF(("sst1InitVideo(): Setting Video Filtering Treshold to 0x%x...\n", n)); - - ISET(sst->videoFilterRgbThreshold, n); - } else - /* sst->videoFilterRgbThreshold = 0x180c18; */ - ISET(sst->videoFilterRgbThreshold, 0x080408); - } else - INIT_PRINTF(("sst1InitVideo(): Disabling Video Filtering...\n")); - } - - /* Adjust FT-clock delay */ - if(sst1CurrentBoard->fbiRevision == 2) { - /* .5 micron */ - if(sst1CurrentBoard->tmuRevision == 1) - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R21; - else - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R20; - } else { - /* .6 micron */ - if(sst1CurrentBoard->tmuRevision == 1) - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R11; - else - ft_clk_del = SST_FT_CLK_DEL_ADJ_DEFAULT_R10; - } - - /* Adjust TF-clock delay */ - if(sst1CurrentBoard->tmuRevision == 1) { - if(sst1CurrentBoard->fbiRevision == 2) { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R21; - } else { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R11; - } - } else { - if(sst1CurrentBoard->fbiRevision == 2) { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R20; - } else { - tf0_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - tf1_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - tf2_clk_del = SST_TEX_TF_CLK_DEL_ADJ_DEFAULT_R10; - } - } - /* Adjust clock delays for .5 micron to account for frequency - dependencies */ - if(sst1CurrentBoard->fbiRevision == 2 && sst1CurrentBoard->tmuRevision == 1) - { - if(sst1CurrentBoard->grxClkFreq >= 55) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x4; - } else if(sst1CurrentBoard->grxClkFreq >= 50) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x5; - } else if(sst1CurrentBoard->grxClkFreq >= 48) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x6; - } else if(sst1CurrentBoard->grxClkFreq >= 45) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x7; - } else if(sst1CurrentBoard->grxClkFreq >= 43) { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x8; - } else { - ft_clk_del = tf0_clk_del = tf1_clk_del = tf2_clk_del = 0x9; - } - } - - /* Override with environment variables */ - if(GETENV(("SST_FT_CLK_DEL"))) - SSCANF(GETENV(("SST_FT_CLK_DEL")), "%i", &ft_clk_del); - if(GETENV(("SST_TF0_CLK_DEL"))) - SSCANF(GETENV(("SST_TF0_CLK_DEL")), "%i", &tf0_clk_del); - if(GETENV(("SST_TF1_CLK_DEL"))) - SSCANF(GETENV(("SST_TF1_CLK_DEL")), "%i", &tf1_clk_del); - if(GETENV(("SST_TF2_CLK_DEL"))) - SSCANF(GETENV(("SST_TF2_CLK_DEL")), "%i", &tf2_clk_del); - - INIT_PRINTF(("sst1InitVideo(): Setting FBI-to-TREX clock delay to 0x%x...\n", ft_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#0 TREX-to-FBI clock delay to 0x%x\n", - tf0_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#1 TREX-to-FBI clock delay to 0x%x\n", - tf1_clk_del)); - INIT_PRINTF(("sst1InitVideo(): Setting TREX#2 TREX-to-FBI clock delay to 0x%x\n", - tf2_clk_del)); - - ISET(sst->fbiInit3, (IGET(sst->fbiInit3) & ~SST_FT_CLK_DEL_ADJ) | - (ft_clk_del << SST_FT_CLK_DEL_ADJ_SHIFT)); - sst1InitIdleFBINoNOP(sstbase); - - sst1CurrentBoard->tmuInit1[0] = (sst1CurrentBoard->tmuInit1[0] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf0_clk_del<tmuInit1[1] = (sst1CurrentBoard->tmuInit1[1] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf1_clk_del<tmuInit1[2] = (sst1CurrentBoard->tmuInit1[2] & - ~SST_TEX_TF_CLK_DEL_ADJ) | (tf2_clk_del<trexInit1, sst1CurrentBoard->tmuInit1[0]); - /* sst1InitIdleFBINoNOP(sstbase); */ - /* Can't use sst1InitIdleFbi because changing the tf clock delay may */ - /* incorrectly put data into the TREX-to-FBI fifo */ - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - ISET(SST_TREX(sst,1)->trexInit1, sst1CurrentBoard->tmuInit1[1]); - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - ISET(SST_TREX(sst,2)->trexInit1, sst1CurrentBoard->tmuInit1[2]); - for(n=0; n<100; n++) sst1InitReturnStatus(sstbase); - - /* Setup graphics clock */ - if(sst1InitGrxClk(sstbase) == FXFALSE) - return(FXFALSE); - - /* Setup video mode */ - if(sst1InitSetVidMode(sstbase, video16BPP) == FXFALSE) - return(FXFALSE); - - /* Adjust Video Clock */ -#ifndef DIRECTX - if(GETENV(("SST_VIDCLK2X"))) { - float vidClkFreq; - - SSCANF(GETENV(("SST_VIDCLK2X")), "%f", &vidClkFreq); - if(sst1InitSetVidClk(sstbase, vidClkFreq) == FXFALSE) - return(FXFALSE); - } else { -#endif - if(sst1InitUseVoodooFile == FXTRUE) { - if(sst1InitSetVidClkINI(sstbase, sst1CurrentBoard->fbiVideoWidth, - sst1CurrentBoard->fbiVideoHeight, - sst1CurrentBoard->fbiVideoRefresh, video16BPP) == FXFALSE) - return(FXFALSE); - } else { - if(video16BPP) { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq16bpp) == - FXFALSE) - return(FXFALSE); - } else { - if(sst1InitSetVidClk(sstbase, sstVideoRez->clkFreq24bpp) == - FXFALSE) - return(FXFALSE); - } - } -#ifndef DIRECTX - } -#endif - - /* Wait for video clock to stabilize */ - for(n=0; n<200000; n++) - sst1InitReturnStatus(sstbase); - - /* Run Video Reset Module */ - ISET(sst->fbiInit1, IGET(sst->fbiInit1) & ~SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - - ISET(sst->fbiInit2, IGET(sst->fbiInit2) | SST_EN_DRAM_REFRESH); - - sst1InitIdleFBINoNOP(sstbase); - - if(!GETENV(("SST_VIDEO_NOCLEAR"))) { - /* Clear Screen */ - FxU32 clearColor = 0x0; - - if(GETENV(("SST_VIDEO_CLEARCOLOR"))) - SSCANF(GETENV(("SST_VIDEO_CLEARCOLOR")), "%i", &clearColor); - ISET(sst->c1, clearColor); - ISET(sst->c0, clearColor); - ISET(sst->zaColor, 0x0); - ISET(sst->clipLeftRight, sstVideoRez->xDimension); - ISET(sst->clipBottomTop, sstVideoRez->yDimension); - ISET(sst->fbzMode, SST_RGBWRMASK | SST_ZAWRMASK); - ISET(sst->fastfillCMD, 0x0); /* Frontbuffer & Z/A */ - ISET(sst->fbzMode, SST_RGBWRMASK | SST_DRAWBUFFER_BACK);/* Backbuffer */ - ISET(sst->fastfillCMD, 0x0); - /* Clear fbistat registers after clearing screen */ - ISET(sst->nopCMD, 0x1); - sst1InitIdleFBINoNOP(sstbase); - } else - INIT_PRINTF(("sst1InitVideo(): Not Clearing Frame Buffer(s)...\n")); - - sst1InitVgaPassCtrl(sstbase, 0); - - if(GETENV(("SST_VIDEO_DISABLE"))) { - INIT_PRINTF(("sst1InitVideo(): Disabling video timing...\n")); - ISET(sst->fbiInit1, IGET(sst->fbiInit1) | SST_VIDEO_RESET); - sst1InitIdleFBINoNOP(sstbase); - } - sst1InitIdle(sstbase); - - if(((IGET(sst->status) & SST_SWAPBUFPENDING) >> - SST_SWAPBUFPENDING_SHIFT) > 0) - sst1InitClearSwapPending(sstbase); - - INIT_PRINTF(("sst1InitVideo() exiting with status %d...\n", FXTRUE)); - return(FXTRUE); -} - -/* -** sst1InitFindVideoTimingStruct(): -** Returns: -** Video Timing Structure -*/ -FX_EXPORT sst1VideoTimingStruct * FX_CSTYLE sst1InitFindVideoTimingStruct(GrScreenResolution_t screenResolution, - GrScreenRefresh_t screenRefresh) -{ - sst1VideoTimingStruct *sstVideoRez = NULL; - FxU32 sst1MonitorRefresh; - FxU32 sst1MonitorRez; - - switch(screenResolution) { - case(GR_RESOLUTION_512x256): - sst1MonitorRez = 512256; - break; - case(GR_RESOLUTION_512x384): - sst1MonitorRez = 512; - break; - case(GR_RESOLUTION_640x400): - sst1MonitorRez = 640400; - break; - case(GR_RESOLUTION_640x480): - sst1MonitorRez = 640; - break; -#ifdef H3D - case(GR_RESOLUTION_640x240_AUTOFLIPPED): - sst1MonitorRez = 640502; - break; - case(GR_RESOLUTION_800x300_AUTOFLIPPED): - sst1MonitorRez = 800620; - break; -#endif - case(GR_RESOLUTION_800x600): - sst1MonitorRez = 800; - break; - case(GR_RESOLUTION_856x480): - sst1MonitorRez = 856; - break; - case(GR_RESOLUTION_960x720): - sst1MonitorRez = 960; - break; - default: - return(NULL); - break; - } - - switch(screenRefresh) { - case(GR_REFRESH_60Hz): - sst1MonitorRefresh = 60; - break; - case(GR_REFRESH_70Hz): - sst1MonitorRefresh = 70; - break; - case(GR_REFRESH_72Hz): - sst1MonitorRefresh = 72; - break; - case(GR_REFRESH_75Hz): - sst1MonitorRefresh = 75; - break; - case(GR_REFRESH_80Hz): - sst1MonitorRefresh = 80; - break; - case(GR_REFRESH_85Hz): - sst1MonitorRefresh = 85; - break; - case(GR_REFRESH_90Hz): - sst1MonitorRefresh = 90; - break; - case(GR_REFRESH_100Hz): - sst1MonitorRefresh = 100; - break; - case(GR_REFRESH_120Hz): - sst1MonitorRefresh = 120; - break; - default: - return(NULL); - break; - } - - /* Override settings with environment variables */ - if(GETENV(("SST_SCREENREZ"))) { - if(ATOI(GETENV(("SST_SCREENREZ"))) == 640) { - sst1MonitorRez = 640; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 640400) { - sst1MonitorRez = 640400; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 800) { - sst1MonitorRez = 800; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512256) { - sst1MonitorRez = 512256; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 512) { - sst1MonitorRez = 512; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 856) { - sst1MonitorRez = 856; - } else if(ATOI(GETENV(("SST_SCREENREZ"))) == 960) { - sst1MonitorRez = 960; - } else { - sst1MonitorRez = 640; - } - } - if(GETENV(("SST_SCREENREFRESH"))) { - if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 60) - sst1MonitorRefresh = 60; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 72) - sst1MonitorRefresh = 72; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 75) - sst1MonitorRefresh = 75; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 85) - sst1MonitorRefresh = 85; - else if(ATOI(GETENV(("SST_SCREENREFRESH"))) == 120) - sst1MonitorRefresh = 120; - else - sst1MonitorRefresh = 60; - } - - switch(sst1MonitorRez) { - case(512256): - sstVideoRez = &SST_VREZ_512X256_60; - break; - case(512): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_512X384_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_512X384_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_512X384_75; - else if(sst1MonitorRefresh == 60 && GETENV(("SST_ARCADE"))) - sstVideoRez = &SST_VREZ_512X384_60; - else { - sstVideoRez = &SST_VREZ_512X384_72; - } - break; - case(640400): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X400_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X400_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X400_75; - else { - sstVideoRez = &SST_VREZ_640X400_70; - } - break; - case(640): - if(sst1MonitorRefresh == 120) - sstVideoRez = &SST_VREZ_640X480_120; - else if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_640X480_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_640X480_75; - else { - sstVideoRez = &SST_VREZ_640X480_60; - } - break; -#ifdef H3D - case(640502): - sstVideoRez = &SST_VREZ_640X502_60; - break; - case(800620): - sstVideoRez = &SST_VREZ_800X620_60; - break; -#endif - case(800): - if(sst1MonitorRefresh == 85) - sstVideoRez = &SST_VREZ_800X600_85; - else if(sst1MonitorRefresh == 75) - sstVideoRez = &SST_VREZ_800X600_75; - else { - sstVideoRez = &SST_VREZ_800X600_60; - } - break; - case(856): - sstVideoRez = &SST_VREZ_856X480_60; - break; - case(960): - sstVideoRez = &SST_VREZ_960X720_60; - break; - default: - return(NULL); - break; - } - return(sstVideoRez); -} - -/* -** sst1InitSetVidMode(): -** Set video Mode -** -*/ -FxBool sst1InitSetVidMode(FxU32 *sstbase, FxU32 video16BPP) -{ - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetVidMode(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - return(sst1InitSetVidModeINI(sstbase, video16BPP)); - } else { - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidModeATT(sstbase, video16BPP)); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidModeICS(sstbase, video16BPP)); - else - return(FXFALSE); - } -} - -/* -** sst1InitSetResolution(): -** Setup FBI video resolution registers -** This routine is used by sst1InitVideo() -** -** -*/ -FX_EXPORT void FX_CSTYLE sst1InitSetResolution(FxU32 *sstbase, - sst1VideoTimingStruct *sstVideoRez, FxU32 Banked) -{ - volatile Sstregs *sst = (Sstregs *) sstbase; - - if(Banked) - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT) | - SST_DRAM_BANKING_CONFIG | SST_EN_DRAM_BANKED); - else - ISET(sst->fbiInit2, (IGET(sst->fbiInit2) & ~SST_VIDEO_BUFFER_OFFSET) | - (sstVideoRez->memOffset << SST_VIDEO_BUFFER_OFFSET_SHIFT)); - - ISET(sst->fbiInit1, (IGET(sst->fbiInit1) & ~SST_VIDEO_TILES_IN_X) | - (sstVideoRez->tilesInX_Over2 << SST_VIDEO_TILES_IN_X_SHIFT)); -} - -/* -** sst1InitSetVidClk(): -** Set video clock -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetVidClk(FxU32 *sstbase, float vidClkFreq) -{ - sst1ClkTimingStruct vidClkTiming; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - - INIT_PRINTF(("sst1InitSetVidClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitComputeClkParams(vidClkFreq, &vidClkTiming) == FXFALSE) - return(FXFALSE); - - INIT_PRINTF(("sst1InitSetVidClk(): Setting up %.2f MHz Video Clock...\n", - vidClkFreq)); - - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - return(sst1InitSetVidClkATT(sstbase, &vidClkTiming)); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - return(sst1InitSetVidClkICS(sstbase, &vidClkTiming)); - else - return(FXFALSE); -} - -/* -** sst1InitSetGrxClk(): -** Set graphics clock -** NOTE: sst1InitSetGrxClk() resets the PCI fifo and the graphics subsystem -** of FBI -** -*/ -FX_EXPORT FxBool FX_CSTYLE sst1InitSetGrxClk(FxU32 *sstbase, - sst1ClkTimingStruct *sstGrxClk) -{ - FxBool retVal = FXFALSE; - int helper = (GETENV(("SST_DEBUGDAC"))) ? 1 : 0; - - if(helper) - INIT_PRINTF(("sst1InitSetGrxClk(): Entered...\n")); - - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - if(sst1InitUseVoodooFile == FXTRUE) { - retVal = sst1InitSetGrxClkINI(sstbase, sstGrxClk); - } else { - if((sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ATT) || - (sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_TI)) - retVal = sst1InitSetGrxClkATT(sstbase, sstGrxClk); - else if(sst1CurrentBoard->fbiDacType == SST_FBI_DACTYPE_ICS) - retVal = sst1InitSetGrxClkICS(sstbase, sstGrxClk); - } - if(retVal == FXFALSE) - return(FXFALSE); - - /* Fix problem where first Texture downloads to TMU weren't being - received properly */ - ISET(*(long *) (0xf00000 + (long) sstbase), 0xdeadbeef); - - if(sst1InitReturnStatus(sstbase) & SST_TREX_BUSY) { - INIT_PRINTF(("sst1InitSetGrxClk(): Resetting TMUs after clock change...\n")); - return(sst1InitResetTmus(sstbase)); - } - return(FXTRUE); -} - -/* -** sst1InitSetTripleBuffering(): -** Specify Video Triple Buffering -** NOTE: sst1InitSetTripleBuffering() must be called prior to calling -** sst1InitVideo() to properly setup Video Triple Buffering -** -*/ -FX_ENTRY FxBool FX_CALL sst1InitSetTripleBuffering(FxU32 *sstbase, - FxBool enableTripleBuffering) -{ - if(sst1InitCheckBoard(sstbase) == FXFALSE) - return(FXFALSE); - - sst1CurrentBoard->fbiTripleBufferingEnabled = enableTripleBuffering; - - return(FXTRUE); -} - -#pragma optimize ("",on) diff --git a/glide2x/sst1/init/makefile.linux b/glide2x/sst1/init/makefile.linux deleted file mode 100644 index e73ea84..0000000 --- a/glide2x/sst1/init/makefile.linux +++ /dev/null @@ -1,51 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR=init -SUBDIRS=initvg init96 - -# local defines, options, includes -ifdef DEBUG -LCDEFS = -DGDBG_INFO_ON -endif -LCOPTS = -LCINCS = -I$(BUILD_ROOT_HW)/include - -ifeq ($(FX_GLIDE_HW),SST96) -INITHW = SST96 -else -INITHW = SST1 -endif - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -LCDEFS += -D$(INITHW) - -HEADERS = init.h sst1vid.h -PRIVATE_HEADERS = fxinit.h -INSTALL_DESTINATION = $(BUILD_ROOT_HW) -CFILES = init.c vgdrvr.c vg96drvr.c h3drvr.c - -LIBRARIES = libinit.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/init/makefile.unix b/glide2x/sst1/init/makefile.unix deleted file mode 100644 index cf87f55..0000000 --- a/glide2x/sst1/init/makefile.unix +++ /dev/null @@ -1,51 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR=init -SUBDIRS=initvg init96 - -# local defines, options, includes -ifdef DEBUG -LCDEFS = -DGDBG_INFO_ON -endif -LCOPTS = -LCINCS = -I$(BUILD_ROOT_SST1)/include - -ifeq ($(FX_GLIDE_HW),SST96) -INITHW = SST96 -else -INITHW = SST1 -endif - -# Turn on the alternate fifo handling code -ifeq ($(FX_SST96_PAGE_FIFO),1) -LCDEFS += -DSST96_ALT_FIFO_WRAP -endif - -LCDEFS += -D$(INITHW) - -HEADERS = init.h sst1vid.h -PRIVATE_HEADERS = fxinit.h -INSTALL_DESTINATION = $(BUILD_ROOT_SST1) -CFILES = init.c vgdrvr.c vg96drvr.c h3drvr.c - -LIBRARIES = libinit.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/init/project.txt b/glide2x/sst1/init/project.txt deleted file mode 100644 index 035a4c9..0000000 --- a/glide2x/sst1/init/project.txt +++ /dev/null @@ -1,80 +0,0 @@ -What happens when glide initializes: - -* Identify Installed Hardware - - What if both an SST-1 and an AT3D are installed? - some behavior must be defined. We could have an - enumerate3DfxHardware? -* Locate and Load the correct DLL for the desired hardware. - - This requires that the interface be very well defined, - and we want it to be binary compatible across revisions. - - Under DOS either all init code must be statically linked in, - or we need a DOS DLL mechanism. -* Map the desired device into virtual memory -* Describe the selected hardware to the user/glide -* Do card soft reset. - - this sets all register state to desired power on defaults so - that future operations can proceed from a known, well-defined - hardware state -* Do card initialization: - - Under full screen this will involve setting up video timing - for the desired resolution and setting up whatever registers - are necessary to enable requrested color, alpha, depth buffers, - as well as configuring a command fifo if necessary. - - In a window this will negotiate with the operating system - for whatever shared resources are necessary. -* Initialize gamma correction - - Under Win95 this does nothing probably - - -What happens when glide shuts down: - -* Idle the graphics hardware -* Shut down graphics - - Win95 ( window ) - free all ddraw resources. - - Win95 ( full-screen ) - switch back to desktop - free all ddraw resources - - Dos ( full-screen ) - switch back to mode 3 -* Unmap card from virtual memory - - -What happens when the user wants to write to the LFB: -** Two approaches: -* Define a code region in which LFB accesses are permitted - - Win95 ( window ) - take a DDRAW lock on the surface and give pointer to users - lfbBegin( enum READWRITE ) - now returns a write pointer - do lfb writes - release ddraw lock - ( invalidates pointer ) - - Win95 ( fullscreen ) - same - - DOS ( fullscreen ) - return pointer to frame buffer that was mapped at init time - -* Don't ever allow user direct access to LFB - - All ugliness of lfb writes is - hidden in writepixel/writerect functions - -What happens when the user wants to read from the LFB: -** Two approaches: -* Define a code region in which LFB accesses are permitted - - Win95 ( window ) - take a readable DDRAW lock on the surface and give pointer to users - lfbBegin( enum READWRITE ) - now returns a readpointer pointer - do lfb writes - release ddraw lock - ( invalidates pointer ) - - Win95 ( fullscreen ) - same - - DOS ( fullscreen ) - return pointer to frame buffer that was mapped at init time - -* Don't ever allow user direct access to LFB - - All ugliness of lfb reads is - hidden in readpixel/readrect functions - - - - - diff --git a/glide2x/sst1/init/sst1vid.h b/glide2x/sst1/init/sst1vid.h deleted file mode 100644 index cc04865..0000000 --- a/glide2x/sst1/init/sst1vid.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** $Header$ -** $Log$ - * - * 4 9/09/97 7:35p Sellers - * Added 400x300 resolution - * - * 3 8/24/97 9:31a Sellers - * moved new video timing to sst1vid.h - * redefined 1600x1280 to be 1600x1200 - * - * 2 6/05/97 11:14p Pgj - * - * 5 7/24/96 3:43p Sellers - * added 512x384 @ 60 Hz for arcade monitors - * added 512x256 @ 60 Hz for arcade monitors - * - * 4 7/18/96 10:58a Sellers - * fixed FT and TF clock delay values for lower frequencies with - * .5/.5 combos - * - * 3 6/18/96 6:54p Sellers - * added sst1InitShutdownSli() to fix Glide Splash screen problems with - * SLI - * - * 2 6/13/96 7:45p Sellers - * added "voodoo.ini" support - * added DirectX support - * misc cleanup - * - * 2 6/11/96 1:43p Sellers - * added support for 60, 75, 85, and 120 Hz refresh rates for "most" - * resolutions - * - * 1 5/08/96 5:43p Paik - * Video definitions -*/ -#ifndef __SST1VID_H__ -#define __SST1VID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Video defines */ - -typedef FxI32 GrScreenRefresh_t; -#define GR_REFRESH_60Hz 0x0 -#define GR_REFRESH_70Hz 0x1 -#define GR_REFRESH_72Hz 0x2 -#define GR_REFRESH_75Hz 0x3 -#define GR_REFRESH_80Hz 0x4 -#define GR_REFRESH_90Hz 0x5 -#define GR_REFRESH_100Hz 0x6 -#define GR_REFRESH_85Hz 0x7 -#define GR_REFRESH_120Hz 0x8 -#define GR_REFRESH_NONE 0xff - -typedef FxI32 GrScreenResolution_t; -#define GR_RESOLUTION_320x200 0x0 -#define GR_RESOLUTION_320x240 0x1 -#define GR_RESOLUTION_400x256 0x2 -#define GR_RESOLUTION_512x384 0x3 -#define GR_RESOLUTION_640x200 0x4 -#define GR_RESOLUTION_640x350 0x5 -#define GR_RESOLUTION_640x400 0x6 -#define GR_RESOLUTION_640x480 0x7 -#define GR_RESOLUTION_800x600 0x8 -#define GR_RESOLUTION_960x720 0x9 -#define GR_RESOLUTION_856x480 0xa -#define GR_RESOLUTION_512x256 0xb -#define GR_RESOLUTION_1024x768 0xC -#define GR_RESOLUTION_1280x1024 0xD -#define GR_RESOLUTION_1600x1200 0xE -#define GR_RESOLUTION_400x300 0xF -#define GR_RESOLUTION_NONE 0xff - -#ifdef GR_RESOLUTION_MAX -#undef GR_RESOLUTION_MAX -#endif -#ifdef GR_RESOLUTION_MIN -#undef GR_RESOLUTION_MIN -#endif -#define GR_RESOLUTION_MIN GR_RESOLUTION_320x200 -#define GR_RESOLUTION_MAX GR_RESOLUTION_1600x1200 - -#ifdef __cplusplus -} -#endif - -#endif /* __SST1VID_H__ */ diff --git a/glide2x/sst1/init/tests/test_a.c b/glide2x/sst1/init/tests/test_a.c deleted file mode 100644 index 9691bb2..0000000 --- a/glide2x/sst1/init/tests/test_a.c +++ /dev/null @@ -1,105 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include - -#include -#include - -#define NUM_LINES 25 - -void morePrintf( FxU32 *lines, const char *fmt, ... ) { - va_list args; - - if ( *lines > NUM_LINES ) { - printf( "" ); - getch(); - *lines = 0; - } - - va_start( args, fmt ); - vfprintf( stdout, fmt, args ); - va_end( args ); - (*lines)++; - return; -} - -static FxU32 lineCount; - -static char *vgaChipNames[] = { - "Alliance Semiconductor AT3D" -}; - -void detectCallback( const InitDeviceInfo *info ) { - switch( info->hwClass ) { - case INIT_VOODOO: - morePrintf( &lineCount, - "Device: %d Type: Voodoo\n", - info->devNumber ); - morePrintf( &lineCount, - "- pfxRev: %.02d pfxRam: %.02d\n", - info->vgInfo.pfxRev, info->vgInfo.pfxRam ); - morePrintf( &lineCount, - "- nTFX: %.02d\n", - info->vgInfo.nTFX ); - morePrintf( &lineCount, - "- tfxRev: %.02d tfxRam: %.02d\n", - info->vgInfo.tfxRev, - info->vgInfo.tfxRam ); - morePrintf( &lineCount, - "- sli: %s\n", - info->vgInfo.sliDetect?"TRUE":"FALSE" ); - break; - case INIT_VG96: - morePrintf( &lineCount, - "Device: %d Type: VG96\n", - info->devNumber ); - morePrintf( &lineCount, - "- vgaChip: %s\n", - vgaChipNames[info->vg96Info.vgaChip] ); - morePrintf( &lineCount, - "- vg96Rev: %.02d vg96Ram: %.02d\n", - info->vg96Info.vg96Rev, info->vg96Info.vg96Ram ); - morePrintf( &lineCount, - "- nTFX: %.02d\n", - info->vg96Info.nTFX ); - morePrintf( &lineCount, - "- tfxRev: %.02d tfxRam: %.02d\n", - info->vg96Info.tfxRev, - info->vg96Info.tfxRam ); - break; - } - return; -} - -/*----------------------------------------------- - Detects the presence of 3DFX hardware and - prints out all info pertaining ot located boards. - -----------------------------------------------*/ -void main( void ) { - while( initEnumHardware( detectCallback ) ); - return; -} diff --git a/glide2x/sst1/init/tests/test_b.c b/glide2x/sst1/init/tests/test_b.c deleted file mode 100644 index 7a7de9e..0000000 --- a/glide2x/sst1/init/tests/test_b.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include -#include -#include - -#include - -static InitDeviceInfo devInfo; -static FxBool found = FXFALSE; - -FxBool detectCallback( const InitDeviceInfo *info ) { - if ( info->hwClass == INIT_VG96 ) { - devInfo = *info; - found = FXTRUE; - return FXTRUE; - } - return FXFALSE; -} - -void cb( FxU32 addr, FxU32 val ) { - return; -} - -/*----------------------------------------------- - Detects the presence of 3DFX hardware and - prints out all info pertaining ot located boards. - -----------------------------------------------*/ -int main( void ) { - FxU32 *hw; - InitBufferDesc desc; - - initEnumHardware( detectCallback ); - if ( found ) { - initDeviceSelect( devInfo.devNumber ); - hw = initMapDevice(); - if ( !hw ) { - puts( "initMapDevice failed." ); - exit( -1 ); - } - initResetRegisters(); - - if ( !initAllocBuffers( &desc ) ) { - puts( "intiAllocBuffers failed." ); - } - puts( "Press a key to exit." ); - getch(); - } - return 0; -} diff --git a/glide2x/sst1/init/vg96drvr.c b/glide2x/sst1/init/vg96drvr.c deleted file mode 100644 index aa1fdd7..0000000 --- a/glide2x/sst1/init/vg96drvr.c +++ /dev/null @@ -1,192 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include <3dfx.h> -#include -#include "init.h" -#include -#include "fxinit.h" - -/* hack */ -#include -#include -#include -#include - -/* This is currently disabled, thus breaking rush, until we can get some - * sources from Aliance Semiconductor */ -#if 0 -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - return init96SetVideo( hWnd, sRes, vRefresh, cFormat, yOrigin, - nColBuffers, nAuxBuffers, - &context->info.regs, - xres, yres, fbStride ); -} - -static void restoreVideo( void ) { - init96RestoreVideo( &context->info.regs ); -} - -static FxBool enableTransport( InitFIFOData *info ) { - return init96EnableTransport( info, &context->info.regs ); -} - -static void disableTransport( void ) { - init96DisableTransport(); -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - if ( context && context->writeMethod ) - init96Swap( code, &context->info.regs, context->writeMethod ); - return INIT_SWAP_FLIP; -} - -static FxU32 status( void ) { - return *(context->info.regs.hwDep.VG96RegDesc.serialStatus); -} - -static FxBool busy(void) { - FxBool rv; - - rv = (status() & 0x1) ? FXTRUE : FXFALSE; - - return rv; -} - -static void idle( void ) { - init96Idle(context->writeMethod); -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return init96GetBufferPtr( buffer, strideBytes ); -} - -static void renderBuffer( InitBuffer_t buffer ) { - init96RenderBuffer( buffer, context->writeMethod ); - return; -} - -static void origin( InitOriginLocation_t origin ) { - init96Origin( origin, context->writeMethod ); - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - FxBool rv = FXFALSE; - GDBG_INFO((80, "vg96drvr: control: code = %d\n", code)); - if (context) - rv = init96Control( code, &context->info.regs); - return rv; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return init96WrapFIFO(&(context->info.regs), fd); -} - -static void gamma( double gamma ) { -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { -} - -static FxBool gammargb( double r, double g, double b ) { - return FXFALSE; -} - -static FxBool gammatable( FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b ) { - return FXFALSE; -} - -static sst1VideoTimingStruct *findvidtiming( GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - return NULL; -} - -void vg96DriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; - - context->gammaRGB = gammargb; - context->initGammaTable = gammatable; - context->findVidTimingStruct = findvidtiming; -} -#else -/* I've got to stub this one to get the Voodoo Graphics glide to link */ -void vg96DriverInit( InitContext *context ) { - context->setVideo = NULL; - context->restoreVideo = NULL; - context->enableTransport = NULL; - context->disableTransport = NULL; - context->swapBuffers = NULL; - context->status = NULL; - context->busy = NULL; - context->idle = NULL; - context->getBufferPtr = NULL; - context->renderBuffer = NULL; - context->origin = NULL; - context->ioCtl = NULL; - context->control = NULL; - context->wrapFIFO = NULL; - - context->gamma = NULL; - context->sliPciOwner = NULL; - - context->gammaRGB = NULL; - context->initGammaTable = NULL; - context->findVidTimingStruct = NULL; - -} -#endif - - - diff --git a/glide2x/sst1/init/vgdrvr.c b/glide2x/sst1/init/vgdrvr.c deleted file mode 100644 index d832999..0000000 --- a/glide2x/sst1/init/vgdrvr.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -** FULL TEXT OF THE NON-WARRANTY PROVISIONS. -** -** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -** THE UNITED STATES. -** -** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -** -** -** $Revision$ -** $Date$ -** -*/ - -#include <3dfx.h> -#include -#include "init.h" -#include "fxinit.h" -#include -#include - -static FxBool setVideo( FxU32 hWnd, - GrScreenResolution_t sRes, - GrScreenRefresh_t vRefresh, - InitColorFormat_t cFormat, - InitOriginLocation_t yOrigin, - int nColBuffers, - int nAuxBuffers, - int *xres, - int *yres, - int *fbStride, - sst1VideoTimingStruct *vidTimings) { - FxBool rv; - static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512}; - static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256}; - - rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - sRes, - vRefresh, - vidTimings ); - - if ( !rv ) goto BAIL; - - if ( context->info.hwDep.vgInfo.sliDetect ) { - rv = sst1InitRegisters((FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr); - if ( !rv ) goto BAIL; - rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr, - sRes, - vRefresh, - vidTimings ); - if ( !rv ) goto BAIL; - rv = sst1InitSli( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr ); - if ( !rv ) goto BAIL; - } - - if(vidTimings) { - *xres = vidTimings->xDimension; - *yres = vidTimings->yDimension; - } else { - *xres = _w[sRes]; - *yres = _h[sRes]; - } - *fbStride = 1024; /* 1024 always */ - -BAIL: - return rv; -} - -static void restoreVideo( void ) { - sst1InitShutdown( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr ); -} - -static FxBool enableTransport( InitFIFOData *info ) { - FxBool rv = FXFALSE; - sst1DeviceInfoStruct sstInfo; - - if ( info ) { - rv = sst1InitGetDeviceInfo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - &sstInfo ); - info->hwDep.vgFIFOData.memFifoStatusLwm = sstInfo.memFifoStatusLwm; - } - - sst1InitCachingOn(); - - return rv; -} - -static void disableTransport( void ) { -} - -static InitSwapType_t swapBuffers( FxU32 code ) { - return INIT_SWAP_FLIP; -} - -static FxU32 status( void ) { - return sst1InitReturnStatus((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr); -} - -static FxBool busy(void) { - FxU32 stat = status(); - FxBool ret = (stat & SST_BUSY) ? FXTRUE : FXFALSE; - - return ret; -} - -static void idle( void ) { - sst1InitIdle((FxU32 *)context->info.hwDep.vgInfo.vgBaseAddr); -} - -static void *getBufferPtr( InitBuffer_t buffer, int *strideBytes ) { - return 0; -} - -static void renderBuffer( InitBuffer_t buffer ) { - return; -} - -static void origin( InitOriginLocation_t origin ) { - return; -} - -static void ioCtl( FxU32 token, void *argument ) { - return; -} - -static FxBool control( FxU32 code ) { - switch ( code ) { - case INIT_CONTROL_DEACTIVATE: - sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - FXTRUE ); - break; - case INIT_CONTROL_ACTIVATE: - sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr, - FXFALSE ); - break; - } - return FXTRUE; -} - -static FxBool wrapFIFO(InitFIFOData *fd) { - return FXTRUE; -} - -static void gamma( double gamma ) { - sst1InitGamma((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, gamma); -} - -static void sliPciOwner( FxU32 *regbase, FxU32 owner ) { - sst1InitSliPciOwner(regbase, owner); -} - -static FxBool gammargb( double r, double g, double b ) { - return sst1InitGammaRGB((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, r, g, b); -} - -static FxBool gammatable( FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b ) { - return sst1InitGammaTable((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, nentries, r, g, b); -} - -static sst1VideoTimingStruct *findvidtiming( GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) { - return sst1InitFindVideoTimingStruct(sRes, vRefresh); -} - -void vgDriverInit( InitContext *context ) { - context->setVideo = setVideo; - context->restoreVideo = restoreVideo; - context->enableTransport = enableTransport; - context->disableTransport = disableTransport; - context->swapBuffers = swapBuffers; - context->status = status; - context->busy = busy; - context->idle = idle; - context->getBufferPtr = getBufferPtr; - context->renderBuffer = renderBuffer; - context->origin = origin; - context->ioCtl = ioCtl; - context->control = control; - context->wrapFIFO = wrapFIFO; - - - context->gamma = gamma; - context->sliPciOwner = sliPciOwner; - - context->gammaRGB = gammargb; - context->initGammaTable = gammatable; - context->findVidTimingStruct = findvidtiming; - -} - diff --git a/glide2x/sst1/lib/makefile.linux b/glide2x/sst1/lib/makefile.linux deleted file mode 100644 index 728178d..0000000 --- a/glide2x/sst1/lib/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/lib/makefile.sun b/glide2x/sst1/lib/makefile.sun deleted file mode 100644 index 4df48c1..0000000 --- a/glide2x/sst1/lib/makefile.sun +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = *.a - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/lib/makefile.unix b/glide2x/sst1/lib/makefile.unix deleted file mode 100644 index 728178d..0000000 --- a/glide2x/sst1/lib/makefile.unix +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -LDIRT = $(wildcard *.a *.so) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/libsrc/makefile.linux b/glide2x/sst1/libsrc/makefile.linux deleted file mode 100644 index e6e0607..0000000 --- a/glide2x/sst1/libsrc/makefile.linux +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT_HW) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/libsrc/makefile.unix b/glide2x/sst1/libsrc/makefile.unix deleted file mode 100644 index 5c6417d..0000000 --- a/glide2x/sst1/libsrc/makefile.unix +++ /dev/null @@ -1,26 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# -# $Revision$ -# $Date$ -# - -INSTALL_DESTINATION=$(BUILD_ROOT_SST1) - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/makefile.linux b/glide2x/sst1/makefile.linux deleted file mode 100644 index 10eb27a..0000000 --- a/glide2x/sst1/makefile.linux +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = sst1 -SUBDIRS = incsrc libsrc binsrc include bin lib init glide cmd - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak diff --git a/glide2x/sst1/makefile.unix b/glide2x/sst1/makefile.unix deleted file mode 100644 index 10eb27a..0000000 --- a/glide2x/sst1/makefile.unix +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY -# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT -# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX -# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE -# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com). -# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A -# FULL TEXT OF THE NON-WARRANTY PROVISIONS. -# -# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO -# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN -# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, -# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR -# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF -# THE UNITED STATES. -# -# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED -# - -THISDIR = sst1 -SUBDIRS = incsrc libsrc binsrc include bin lib init glide cmd - -include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak