Files
glide/glide3x/h5/glide3/src/fxglide.h
2004-10-05 14:54:44 +00:00

3338 lines
108 KiB
C

/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONL
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGH
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DF
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT T
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS I
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FA
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS O
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVE
**
** $Header: fxglide.h, 44, 6/15/2000 9:18:11 AM, Bill White
** $Log:
** 44 3dfx 1.42.1.0 06/15/00 Bill White Merged changes to support
** Linux.
**
** 43 3dfx 1.42 04/21/00 Kenneth Dyke Magic FX_GLIDE_NO_HW
** support.
** 42 3dfx 1.41 04/13/00 Kenneth Dyke Added support for new style
** 2-sample AA mode.
** 41 3dfx 1.40 04/10/00 Kenneth Dyke Added magical screenshot
** hotkey.
** 40 3dfx 1.39 04/04/00 Kenneth Dyke Fixed addressing for large
** tiled textures.
** 39 3dfx 1.38 03/25/00 Adam Briggs added support for
** SSTH3_SLI_AA_CONFIGURATION (the env var the control panel uses to force AA
** modes)
** 38 3dfx 1.37 03/24/00 Chris Dow Added code to fence every n
** writes (not to exceed 0x10000) where n is either 0x10000 or indicated by
** the environment variable FX_GLIDE_FENCE_LIMIT
**
** 37 3dfx 1.36 03/23/00 Kenneth Dyke Added tracking for whether
** or not the stencil buffer has ever been cleared.
** 36 3dfx 1.35 03/21/00 Kenneth Dyke Added variable to allow Y
** origin swapping SLI band height clamp to be disabled.
** 35 3dfx 1.34 03/19/00 Kenneth Dyke Made mode2ppc stuff part of
** the Glide state.
** 34 3dfx 1.33 03/16/00 Kenneth Dyke User-adjustable LOD bias
** value.
** 33 3dfx 1.32 03/14/00 Adam Briggs enable analog sli in 2X
** modes or when forced
** 32 3dfx 1.31 03/08/00 Kenneth Dyke Remove bad hwInitP flag.
** 31 3dfx 1.30 03/07/00 Kenneth Dyke Workaround for weird
** compressed texture quirk.
** 30 3dfx 1.29 03/06/00 Kenneth Dyke Added backdoor hack to
** toggle AA on and off on the fly.
** 29 3dfx 1.28 02/22/00 Kenneth Dyke Added flag to keep track of
** whether or not paletted textures are in use.
** 28 3dfx 1.27 02/18/00 Adam Briggs added FX_GLIDE_WAX_ON var
** which must be set to 1 to enable the newly uncommented SLI WAX buffer
** clears
** 27 3dfx 1.26 02/02/00 Kenneth Dyke Fixed per-TMU constant
** color values to not interfere with texture chroma keying.
** 26 3dfx 1.25 02/02/00 Kenneth Dyke Fix parameter setup issue
** with 2PPC modes.
** 25 3dfx 1.24 02/01/00 Kenneth Dyke Added code to detect when
** TMU0 is in passthrough mode and to enabled 2PPC in that case. (Remap TMU1
** to TMU0).
** 24 3dfx 1.23 01/31/00 Adam Briggs Changed all device ID magic
** numbers to use those defined in fxhal.h & added IS_NAPALM macro to test
** against device ID range
** 23 3dfx 1.22 01/28/00 Kenneth Dyke Totoally revamped TMU
** register update mechanism to make 2PPC modes work right regardless of the
** order of Glide calls. Also fixed a few register config bugs found when
** switching between new and old style combine modes.
** 22 3dfx 1.21 01/23/00 Adam Briggs set & recognize the SSTTYPE
** var for Voodoo4
** 21 3dfx 1.20 01/21/00 Adam Briggs some changes to get the
** correct linear mappings for slave regs and use them to sync the fifos in
** sli mode
** 20 3dfx 1.19 01/18/00 Kenneth Dyke Added default AA jitter
** values to Glide environment.
** 19 3dfx 1.18 01/16/00 Kenneth Dyke Added column width stuff.
** 18 3dfx 1.17 01/16/00 Kenneth Dyke Added support to track
** combine extension usage.
** 17 3dfx 1.16 01/07/00 Adam Briggs Moved freeThreadStorage
** from grShutdown to the DllMain process detach code. This fixes PRS#12190,
** 12192 and 12196.
** 16 3dfx 1.15 01/04/00 Adam Briggs changed grGetGammaTable to
** be an extension called grGetGammaTableExt
** 15 3dfx 1.14 12/10/99 Leo Galway Reset GR_MAX_RESOLUTION to
** 0x17 as result of new mode info breaking builds for V3 and V2 from 3dfx
** view.
** 14 3dfx 1.13 12/08/99 Leo Galway Upped GR_MAX_RESOLUTION to
** compensate for added mode information (1600x1280, 1792x1440, 1920x1080,
** 1920x1200, 2046x1536 ).
** 13 3dfx 1.12 11/22/99 Adam Briggs Made separate TRISETUP
** macros for msvc 4x, msvc6 retail and msvc6 debug... fixes some crashing.
** 12 3dfx 1.11 11/10/99 Adam Briggs Made grBufferClear(Ext)
** cooperate with linear surfaces & texture buffers
** 11 3dfx 1.10 11/09/99 Adam Briggs Added support for reading
** the Status reg on slave chips in order to form a more perfect flush
** function.
** 10 3dfx 1.9 11/08/99 Larry warner Changes to enable building
** with MSVC 6.
** 9 3dfx 1.8 11/05/99 Anthony tai added
** FX_GLIDE_SWAPPENDINGCOUNT. Default=1. Range 0-3
** 8 3dfx 1.7 10/20/99 Anthony tai remove un-used tmu register
** shadow
** 7 3dfx 1.6 10/15/99 Anthony tai move 2ppc setting to state
** validation
** 6 3dfx 1.5 10/08/99 Adam Briggs Supported FX_GLIDE_BPP &
** FX_GLIDE_AA_SAMPLE environment vars so the user can override the pixel
** format in grSstWinOpen calls
** 5 3dfx 1.4 10/06/99 Anthony tai disable 2ppc if tmu1 is
** specified
** 4 3dfx 1.3 09/22/99 Larry warner Created download procedures
** for FXT1 format.
** 3 3dfx 1.2 09/22/99 Adam Briggs Added
** grConstantColorValueExt... not yet tested.
** 2 3dfx 1.1 09/17/99 Anthony tai fixed 2ppc and tmumask for
** texture color/alpha combine extension
** 1 3dfx 1.0 09/11/99 StarTeam VTS Administrator
** $
**
** 164 9/03/99 4:32p Atai
** disable aaCtrl and sliCtrl in winclose
**
** 163 8/25/99 8:44p Larryw
** Expand mipmap size and offset tables to accommodate FXT1.
**
** 162 8/20/99 4:56p Atai
** fixed packet4 register bit mask for window glide
**
** 161 8/19/99 7:55p Larryw
** FXT1 Tsplit changes.
**
** 160 8/18/99 3:20p Larryw
** FXT1 refinements.
**
** 159 8/17/99 5:10p Kcd
** sync rather than eieio for P6FENCE on PPC.
**
** 158 8/16/99 11:18a Adamb
** Merged in V3_OEM_100 fixes
**
** 157 8/05/99 5:03p Larryw
** FXT1 format works now.
**
** 156 7/30/99 1:22p Kcd
** Custom TRISETUP macro for PowerPC.
**
** 155 7/29/99 7:07p Larryw
** Pave the way for FXT1 (but not quite there yet).
**
** 154 7/26/99 12:11p Atai
** initialize pci registers for sli/aa
**
** 153 7/23/99 2:01p Atai
** change tbuffer interface to grTBufferWriteMaskExt
**
** 152 7/22/99 8:14p Larryw
** Texture format byte-depth improvements
**
** 151 7/22/99 1:18p Atai
** added grTBufferMaskExt
**
** 149 7/19/99 2:52p Atai
** added variable for sli
**
** 148 7/18/99 1:59p Atai
** added grAlphaBlendFunctionExt
**
** 146 7/16/99 10:59a Atai
** remove un-supported mode
** fixed tcc, tac problem
**
** 145 7/14/99 6:23p Larryw
** Remove obsolete G3_LOD_TRANSLATE() macro
** Define _grMipMapOffset[][] at compile time
** Fix 2k texture address-finding
**
** 144 7/14/99 5:07p Atai
** fixed stencil interface and some cc/ac stuff
**
** 143 7/14/99 9:39a Atai
** direct register write for glide3x
** test04 can do 4 sample aa (2 chips)
**
** 142 7/08/99 8:48p Atai
** stencil interface update
**
** 141 7/07/99 6:52p Larryw
** * 2k texture support
** * Reversed order of LOD tables
** * Added 512,1024, and 2048-sized entries in tables
** * Nullified G3_LOD_TRANSLATE()
** * Created _g3LodXlat() for where tLOD register is read/written
** * Misc cosmetic changes.
**
** 140 7/06/99 2:43p Atai
** added grcolormaskext and gbc variables
**
** 139 6/29/99 7:19p Atai
** remove argument for enabling SST_CM_USE_COMBINE_MODE
**
** 138 6/29/99 2:52p Atai
** added invert mode for COMBINE ext c and d term
**
** 137 6/27/99 12:44p Atai
** fixed CC and TCC
**
** 136 6/24/99 7:18p Atai
** added coombine_ext_mode and 2 buffers per chip
**
** 135 6/14/99 5:54p Larryw
** Added support for 32-bit textures.
**
** 134 6/14/99 2:05p Atai
** added grPixelFormat and grPixelSample.
**
** 133 6/13/99 6:07p Atai
** remove aa type for winopen ext
**
** 131 6/10/99 5:12p Atai
** fist pass CC and AC ext
**
** 130 6/09/99 5:23p Atai
** added _grChipMask
**
** 129 6/09/99 2:35p Atai
** added combine mode bit and args defines
**
** 128 6/08/99 6:03p Stb_sbrooks
** Added fifoSize environment var
**
** 127 6/08/99 5:48p Atai
** place holder
**
** 124 6/04/99 11:16a Atai
** added #include "h3ext.h"
**
** 122 6/03/99 6:16p Atai
** added stencil typedef and prototype
**
** 121 6/03/99 5:22p Russp
** Add in some ifdef'd code to allow variable texture alignment
**
** 120 6/03/99 4:46p Atai
** added NAPALM_ZDEPTHVALUE_NEAREST and NAPALM_WDEPTHVALUE_FARTHEST
**
** 119 6/03/99 4:26p Atai
** added device id #defs
**
** 118 6/03/99 12:16p Kcd
** Wrong SET_ macro being used for FIFO write.
**
** 117 6/03/99 11:18a Atai
** force deviceID to 7 for code development
**
** 116 6/01/99 2:34p Atai
** Added grSstWinOpenExt
**
** 115 5/28/99 12:55p Atai
** fixed clip coord, fog coord ext with w-buffering
**
** 114 5/24/99 2:49p Jamesb
** Added ptrLostContext field to exported command transport struct.
**
** 113 5/19/99 3:55p Denis
**
** 112 5/19/99 12:45p Denis
** First check in of the TEXTUREBUFFER extension.
** Contains both the texture color buffer and texture aux. buffer
** extensions
** that allows to specify a piece of texture memory as a rendering target
** and/or a piece of texture memory as the aux. buffer.
**
** Probably a non conventional check in, in the sense that the API
** isn't entirely frozen / specified yet. To ease whoever's job it will be
** to complete the extension, I've added a "tbext" comment
** everywhere I made a modification. These should go away
** once the API is frozen.
**
**
** 111 5/07/99 12:53p Dow
** My mods to Matts TexAddress fixes
**
** 110 4/09/99 4:22p Dow
** Fixes for lost surfaces
**
** 109 4/07/99 7:18p Atai
** added uma extension
**
** 108 4/06/99 2:43p Dow
** Let alt-tab and surface extension live in peace
**
** 107 4/05/99 8:25p Dow
** Alt tab mostly happy
**
** 106 4/04/99 8:51p Atai
** Partial check-in for alt-tab issue. set FX_GLIDE_ALT_TAB=1 to build
** glide3x with hwcQueryContext built into GR_BEGIN_NOFIFOCHECK. It works
** with DEBUG glide only. In the non-debug glide, we can still see the
** desktop corruption.
**
** 104 4/01/99 7:55p Peter
** made names and comments more meaningful
**
** 103 3/31/99 9:02p Dow
** context loosing means no writing to hw
**
** 102 3/30/99 3:20p Atai
** place holder for texture and fifofree defs
**
** 101 3/24/99 6:17p Peter
** removed rle cruft
**
** 100 3/19/99 3:18p Peter
** warning about fifo extension
**
** 99 3/19/99 11:53a Peter
** re-ordered struct for exposing to gl
**
** 98 3/19/99 11:26a Peter
** expose direct fifo for gl
**
** 97 3/14/99 1:48p Peter
** really invoke gggsoph
**
** 96 3/11/99 6:38p Dow
** Resolution help
**
** 95 3/11/99 6:07p Dow
** Upped GR_MAX_RESOLUTION
**
** 94 3/10/99 10:42a Peter
** detect katmai-ness
**
** 93 3/09/99 12:49p Kcd
** oops.
**
** 92 3/09/99 12:33p Kcd
** Added committedSerialNumebr to command transport struct.
**
** 91 2/23/99 3:10p Peter
** h3 has a direct gamma table
**
** 90 2/19/99 8:03p Peter
** new splash crapola
**
** 89 2/18/99 5:56p Peter
** cleaned up more of the random texture tables
**
** 88 2/18/99 4:06p Kcd
** Faster getThreadValueFast for MacOS.
**
** 87 2/18/99 3:38p Kcd
** Mac happiness.
**
** 86 2/11/99 1:38p Atai
** sync buffer swap pending code, the right way.
**
** 85 2/09/99 2:08p Atai
** change buffer size to 4
**
** 84 2/08/99 2:16p Peter
** single buffering is allowed
**
** 83 2/02/99 4:38p Peter
** 16 byte texture alignmnet boundary
**
** 82 1/25/99 6:35p Peter
** tiled texture cleanup
**
** 81 1/20/99 10:54a Dow
** Voodoo 3 id for apps
**
** 80 1/15/99 10:52a Peter
** cleanup lazy evaluation of fbzMode for grDepthMask and grColorMask
**
** 79 1/14/99 7:48p Peter
** cleanedup bytes per texel stuff
**
** 78 1/06/99 11:30a Peter
** cleanup trinalge dispatch code
**
** 77 1/04/99 12:03p Peter
** use window contexts for sending state
**
** 76 12/23/98 2:01p Peter
** nt currently has mutexing problems via ddraw and extescape
**
** 75 12/14/98 6:19p Dow
** Fixed for current surface extension spec
**
** 74 12/11/98 1:37p Peter
** thread tracing
**
** 73 12/07/98 11:33a Peter
** norbert's re-fixes of my merge
**
** 72 12/03/98 9:37a Dow
** Added reserved enumerant for RAM type
**
** 71 11/30/98 6:57p Peter
** video memory fifo's
**
** 70 11/21/98 10:19a Atai
** fixed test37 grChromaRangeModeExt error and rename functions
**
** 69 11/15/98 3:21a Atai
** first attempt to make 2 tmus work in H4 glide3x full screen mode, just
** in time check-in for comdex demo. warning: the code is not completed
** yet.
**
** 68 11/09/98 5:07p Dow
** Texturing from tiled rendered surfaces works now
**
** 67 11/02/98 5:34p Peter
** tls per thread for fullscreen contexts
**
** 66 10/20/98 8:28p Peter
** shared files and fixed whackage
**
** 65 10/14/98 3:38p Dow
** Gamma stuff
**
** 64 10/14/98 1:47p Jdt
** Add texture chroma to hw state restore buffer.
**
** 63 10/13/98 5:27p Peter
** 6666 format hack
**
** 62 10/12/98 9:51a Peter
** dynamic 3DNow!(tm)
**
** 61 10/09/98 3:32p Atai
** move texchroma key shadow
**
** 60 10/09/98 2:44p Atai
** fixed 6666 palette
**
** 59 9/30/98 12:59p Atai
** added texchromakey and texchromarange for shadow state
**
** 58 9/11/98 10:45p Jdt
** Switch over to statically allocated in-memory fifo.
**
** 57 9/04/98 11:35a Peter
** re-open fix for nt (thanks to taco/rob/nt bob)
**
** 56 8/31/98 10:33a Peter
** asm w/ debugging
**
** 55 8/30/98 10:54p Jdt
** promote INVALIDATE macro to global dominion
**
** 54 8/30/98 1:34p Dow
** State & other optimizations
**
** 53 8/29/98 8:12p Dow
** Clip optimization
**
** 52 8/29/98 4:34p Dow
** thread optimization stuff
**
** 51 8/27/98 9:27p Atai
** fix env variable for glide3x
**
** 50 7/01/98 8:40a Jdt
** removed gc arg from trisetup functions
**
** 49 8/03/98 6:34a Jdt
** Changes for multi-thread
**
** 48 8/02/98 5:01p Dow
** Glide Surface Extension
**
** 46 7/21/98 7:41p Jdt
** fixed palettes
**
** 45 7/18/98 1:45p Jdt
** Removed TACO_MEMORY_FIFO_HACK
**
** 44 7/18/98 12:25a Jdt
** Some clean up and new shadow register structure to support state
** restoration.
**
*/
/*
** 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.
**
** HAL_CSIM: Defined if GLIDE should use the software simulator. 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
----------------------------------------------------------------------- */
/* standard */
#include <limits.h>
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
/* 3dfx */
#include <3dfx.h>
#include <glidesys.h>
#include <gdebug.h>
#include <h3.h>
#include <cpuid.h>
/* local */
#ifdef __WATCOMC__
#define GR_CDECL __cdecl
#else
#define GR_CDECL
#endif
#include "g3ext.h"
#include "fxcmd.h"
#include "gsfc.h"
/* conditional */
#if defined( GLIDE_INIT_HAL )
#include <fxhal.h>
#include <minihwc.h>
#else
#include <minihwc.h>
#define HWC_BASE_ADDR_MASK 0x03UL
#endif /* defined ( GLIDE_INIT_HAL ) */
#include "fxsplash.h"
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
#define WIN32_LEANER_AND_MEANER
#include <windows.h>
#else
FxBool FX_CALL fxSplashInit (FxU32 hWnd,
FxU32 screenWidth, FxU32 screenHeight,
FxU32 numColBuf, FxU32 numAuxBuf,
GrColorFormat_t colorFormat);
void FX_CALL fxSplashShutdown (void);
void FX_CALL fxSplash (float x, float y, float w, float h, FxU32 frameNumber);
const void * FX_CALL fxSplashPlug (FxU32* w, FxU32* h,
FxI32* strideInBytes,
GrLfbWriteMode_t* format);
#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */
/* -----------------------------------------------------------------------
Manifest Constants
----------------------------------------------------------------------- */
#define MAX_NUM_SST 4
#define MAX_NUM_CONTEXTS 16
#define VOODOO_GAMMA_TABLE_SIZE 256
#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
#define NAPALM_ZDEPTHVALUE_NEAREST 0xFFFFFF
#define NAPALM_WDEPTHVALUE_FARTHEST 0xFFFFFF
/* Internal define so that we don't have to use the stupid reserved
* bits identifier in the code since no one knows what that means.
*/
#define GR_TEXFMT_P_8_RGBA GR_TEXFMT_RSVD0
#define GR_MAX_RESOLUTION 0x17
#define GR_MAX_REFRESH 8
#define GR_MAX_COLOR_BUF 3
#define GR_MAX_AUX_BUF 1
#define GR_MIN_RESOLUTION 0
#define GR_MIN_REFRESH 0
#define GR_MIN_COLOR_BUF 1
#define GR_MIN_AUX_BUF 0
#define GR_AA_ORDERED_OGL 0x00010000
#define GR_AA_ORDERED_POINTS_OGL GR_AA_ORDERED_OGL+1
#define GR_AA_ORDERED_LINES_OGL GR_AA_ORDERED_OGL+2
#define GR_AA_ORDERED_TRIANGLES_OGL GR_AA_ORDERED_OGL+3
#define GR_AA_ORDERED_POINTS_MASK 0x01
#define GR_AA_ORDERED_LINES_MASK 0x02
#define GR_AA_ORDERED_TRIANGLES_MASK 0x04
/* -----------------------------------------------------------------------
Code Macros
----------------------------------------------------------------------- */
#undef GETENV
#define GETENV(a) hwcGetenv(a)
/* -----------------------------------------------------------------------
Internal Enumerated Types
----------------------------------------------------------------------- */
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
#define GR_SSTTYPE_Voodoo3 5
#define GR_SSTTYPE_Voodoo4 6
/*
* gregk 5/3/99
* Constants defined for SSTH3_ALPHADITHERMODE registry key
*/
#define OPTIMAL 1
#define SHARPER 2
#define SMOOTHER 3
/* -----------------------------------------------------------------------
Internal Structures
----------------------------------------------------------------------- */
typedef struct {
GrScreenResolution_t resolution;
FxU32 xres;
FxU32 yres;
} ResEntry;
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;
/*
** -----------------------------------------------------------------------
** 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
mode; /* enable / disable */
FxI32
offset; /* offset to the parameter data */
} GrVParamInfo;
typedef struct {
GrVParamInfo
vertexInfo, /* xy */
zInfo, /* z(ooz) */
wInfo, /* w(oow) */
aInfo, /* a float */
fogInfo, /* fog */
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 */
} GrVertexLayout;
/*============================================================
** State Monster Stuff:
**============================================================*/
#define GR_FLUSH_STATE() \
if (gc->state.invalid) _grValidateState();
/* internal enable/disable mode */
#define GR_COMBINEEXT_MODE 0x80000001
#define GR_AA_MULTI_SAMPLE 0x80000002
/* 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)
#define chromaRangeBIT FXBIT(10)
#define stencilModeBIT FXBIT(11)
#define stencilOpBIT FXBIT(12)
#define combineModeBIT FXBIT(13)
#define renderModeBIT FXBIT(14)
#define tmuConfigBIT FXBIT(15)
#define stippleBIT FXBIT(16)
/* Similar bits for TMU registers */
#define textureModeBIT FXBIT(0)
#define texBaseAddrBIT FXBIT(1)
#define texchromaBIT FXBIT(2)
/*
** lazy evaluate vertexlayout.
** it is not part of the registers so we add the bit in MSB
*/
#define vtxlayoutBIT FXBIT(31)
/*============================================================
** Video Stuff:
**============================================================*/
#define VRETRACEMASK 0x00000fff
#define HRETRACEPOS 16
struct tmuState_s {
#define OOOO_OOOO_OIII_IIII 0x007f
#define SR_MASK_4 OOOO_OOOO_OIII_IIII
FxU32 texPkt4Hdr_0;
FxU32 textureMode; /* 0x300 ( 0 ) */
FxU32 tLOD; /* 0x304 ( 1 ) */
FxU32 tDetail; /* 0x308 ( 2 ) */
FxU32 texBaseAddr; /* 0x30C ( 3 ) */
FxU32 texBaseAddr_1; /* 0x310 ( 4 ) */
FxU32 texBaseAddr_2; /* 0x314 ( 5 ) */
FxU32 texBaseAddr_3_8; /* 0x318 ( 6 ) */
/* ----------- end packet -------------*/
#define OOOO_OOOO_OOOO_OOII 0x0002
#define SR_MASK_5 OOOO_OOOO_OOOO_OOII
FxU32 texPkt4Hdr_1;
FxU32 texchromaKey;
FxU32 texchromaRange;
/* ----------- end packet -------------*/
#define SR_WORDS_6 24
FxU32 texPkt1Hdr_2;
FxU32 nccTable0[12];
FxU32 nccTable1[12];
/* ----------- end packet -------------*/
#ifdef FX_GLIDE_NAPALM
#define OOOO_OOOO_OOOO_OOOI 0x0001
#define SR_MASK_7 OOOO_OOOO_OOOO_OOOI
FxU32 texPkt4Hdr_3;
FxU32 combineMode;
/* ----------- end packet -------------*/
#endif /* FX_GLIDE_NAPALM */
};
/*--------------------------------------------------------------------------
State Restoration Buffer
--------------------------------------------------------------------------*/
typedef struct {
#define OOII_IIOO_OIII_IIII 0x3C7f
#define SR_MASK_0 OOII_IIOO_OIII_IIII
#define SR_ADDR_0 ((FxU32) &((( SstRegs* )0)->fbzColorPath))
FxU32 pkt4Hdr_0;
FxU32 fbzColorPath; /* 0x104 ( 0 ) */
FxU32 fogMode; /* 0x108 ( 1 ) */
FxU32 alphaMode; /* 0x10C ( 2 ) */
FxU32 fbzMode; /* 0x110 ( 3 ) */
FxU32 lfbMode; /* 0x114 ( 4 ) */
FxU32 clipLeftRight; /* 0x118 ( 5 ) */
FxU32 clipBottomTop; /* 0x11C ( 6 ) */
/* space */
FxU32 fogColor; /* 0x12C ( 10 ) */
FxU32 zaColor; /* 0x130 ( 11 ) */
FxU32 chromaKey; /* 0x134 ( 12 ) */
FxU32 chromaRange; /* 0x138 ( 13 ) */
/* ----------- end packet -------------*/
#define OOOO_OOOO_OOOO_OIII 0x0007
#define SR_MASK_1 OOOO_OOOO_OOOO_OIII
#define SR_ADDR_1 ((FxU32) &((( SstRegs* )0)->stipple))
FxU32 pkt4Hdr_1;
FxU32 stipple; /* 0x140 ( 15 ) */
FxU32 color0; /* 0x144 ( 16 ) */
FxU32 color1; /* 0x148 ( 17 ) */
/* ----------- end packet -------------*/
#define SR_WORDS_2 32
#define SR_ADDR_2 ((FxU32) &((( SstRegs* )0)->fogTable[0]))
FxU32 pkt1Hdr_2;
FxU32 fogTable[32];
/* ----------- end packet -------------*/
#ifdef FX_GLIDE_NAPALM
#define OOII_IIII_IIII_IIII 0x3fff
#define SR_MASK_3 OOII_IIII_IIII_IIII
#define SR_ADDR_3 ((FxU32) &((( SstRegs* )0)->renderMode))
FxU32 pkt4Hdr_3;
FxU32 renderMode; /* 0x1E0 ( 0 ) */
FxU32 stencilMode; /* 0x1E4 ( 1 ) */
FxU32 stencilOp; /* 0x1E8 ( 2 ) */
FxU32 colBufferAddr; /* 0x1EC ( 3 ) */
FxU32 colBufferStride; /* 0x1F0 ( 4 ) */
FxU32 auxBufferAddr; /* 0x1F4 ( 5 ) */
FxU32 auxBufferStride; /* 0x1F8 ( 6 ) */
FxU32 fbiStenciltestFail; /* 0x1FC ( 7 ) */
FxU32 clipLeftRight1; /* 0x200 ( 8 ) */
FxU32 clipBottomTop1; /* 0x204 ( 9 ) */
FxU32 combineMode; /* 0x208 ( 10 ) */
FxU32 sliCtrl; /* 0x20C ( 11 ) */
FxU32 aaCtrl; /* 0x210 ( 12 ) */
FxU32 chipMask; /* 0x214 ( 13 ) */
/* ----------- end packet -------------*/
#else /* !FX_GLIDE_NAPALM */
#define OOOO_OOOO_OOOO_IIII 0x000f
#define SR_MASK_3 OOOO_OOOO_OOOO_IIII
#define SR_ADDR_3 ((FxU32) &((( SstRegs* )0)->colBufferAddr))
FxU32 pkt4Hdr_3;
FxU32 colBufferAddr; /* 0x1EC ( 0 ) */
FxU32 colBufferStride; /* 0x1F0 ( 1 ) */
FxU32 auxBufferAddr; /* 0x1F4 ( 2 ) */
FxU32 auxBufferStride; /* 0x1F8 ( 3 ) */
/* ----------- end packet -------------*/
#endif /* FX_GLIDE_NAPALM */
struct tmuState_s tmuState[GLIDE_NUM_TMU];
struct PaletteRow {
#define SR_WORDS_P 8
#define SR_ADDR_P ((FxU32) &((( SstRegs* )0)->nccTable0[4]))
FxU32 pkt1Hdr_P;
FxU32 data[8];
/* ----------- end packet -------------*/
} paletteRow[32];
} GrStateBuffer;
/*==========================================================================*/
/*
** GrState
**
** This structure comprises the entire queryable state in Glide.
**
** Two types of data qualify for inclusion here:
**
** API State - cull-mode
** Chip State - hw register state
**
** Not included:
** any volatile data: eg fifo setup, colBufferAddr, etc
*/
typedef struct {
FxU32 cull_mode; /* cull neg, cull pos, don't cull */
FxU32 paramIndex; /* Index into array containing
parameter indeces to be sent ot the
triangle setup code */
#if GLIDE_INIT_HAL
FxI32
fifoFree; /* # free entries in FIFO */
#endif
FxU32 tmuMask; /* Tells the paramIndex updater which
TMUs need values */
FxU32 tcctmuMask; /* Tells the paramIndex updater which
TMUs need values - for tcc */
FxU32 tactmuMask; /* Tells the paramIndex updater which
TMUs need values - for tac */
FxU32 combineExtsInUse; /* Tells us which combine extensions are
in use by the application. */
FxU32 tmuColorPassthrough; /* TMU color combine is in passthrough */
FxU32 tmuAlphaPassthrough; /* TMU alpha combine is in passthrough */
GrStateBuffer shadow; /* shadow of all hw state registers */
struct tmuState_s tmuShadow[GLIDE_NUM_TMU]; /* shadow of TMU registers */
GrColor_t tmuColor[GLIDE_NUM_TMU]; /* Shadow of TMU constant color values */
FxU32 tmuMaskShadow; /* Intermediate tmuMask value before grValidateTMUState() */
/* We run into a bad situation when the color buffer and aux
buffers are not the same size. Thus, we need to clip to the
intersection of the two rectangles. */
struct wClipping_s { /* Windowed clipping */
FxBool
colBufferSet, auxBufferSet;
struct colBufferClip_s {
FxU32
width, height;
} colClip;
struct auxBufferClip_s {
FxU32
width, height;
} auxClip;
struct winClip_s {
FxU32 width, height;
} winClip;
} wClipping;
struct PerTmuState {
float s_scale;
float t_scale;
FxU32 mmMode;
FxU32 smallLod;
FxU32 largeLod;
FxU32 evenOdd;
FxU32 nccTable;
FxU32 textureMode;
FxU32 tLOD;
FxBool texSubLodDither;
} per_tmu[GLIDE_NUM_TMU];
float depth_range;
FxU32 tbufferMask;
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,
allowLODdither, /* allow LOD dithering */
mode2ppc,
mode2ppcTMU,
checkFifo; /* Check fifo status as specified by hints */
FxBool /* Values needed to determine which */
tac_requires_it_alpha[GLIDE_NUM_TMU], /* parameters need gradients computed */
tac_requires_texture[GLIDE_NUM_TMU], /* when drawing triangles */
tac_requires_prev_texture[GLIDE_NUM_TMU],
tac_requires_constant_color[GLIDE_NUM_TMU],
tcc_requires_it_alpha[GLIDE_NUM_TMU],
tcc_requires_it_rgb[GLIDE_NUM_TMU],
tcc_requires_texture[GLIDE_NUM_TMU],
tcc_requires_prev_texture[GLIDE_NUM_TMU],
tcc_requires_constant_color[GLIDE_NUM_TMU],
palletizedTexture[GLIDE_NUM_TMU];
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. */
GrOriginLocation_t /* lower left, upper left */
origin;
GrTexTable_t tex_table; /* Current palette type - ncc vs palette */
float
clipwindowf_xmin, clipwindowf_ymin, /* Clipping info */
clipwindowf_xmax, clipwindowf_ymax;
FxU32
screen_width, screen_height; /* Screen width and height */
/* viewport and clip space coordinate related stuff */
struct {
float
n, f;
FxFloat
ox, oy, oz;
FxFloat
hwidth, hheight, hdepth;
} Viewport;
/* Strip Stuff */
GrVertexLayout vData;
/*============================================================
** 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
*/
FxU32
tmuInvalid[GLIDE_NUM_TMU];
FxU32
tmuNop;
/*
** 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;
GrAlphaBlendOp_t rgb_op;
GrAlphaBlendOp_t alpha_op;
} 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;
FxI32 alpha;
} grColorMaskArgs;
struct {
FxBool enable;
} grDepthMaskArgs;
struct {
GrChromakeyMode_t mode;
} grChromakeyModeArgs;
struct {
GrColor_t color;
} grChromakeyValueArgs;
struct {
GrColor_t range;
GrChromaRangeMode_t mode;
GrChromaRangeMode_t match_mode;
} grChromaRangeArgs;
struct {
GrCmpFnc_t fnc;
} grDepthBufferFunctionArgs;
struct {
GrDepthBufferMode_t mode;
} grDepthBufferModeArgs;
struct {
GrDitherMode_t mode;
} grDitherModeArgs;
struct {
GrStippleMode_t mode;
} grStippleModeArgs;
struct {
GrStipplePattern_t stipple;
} grStipplePatternArgs;
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;
struct {
GrCmpFnc_t fnc;
GrStencil_t ref;
GrStencil_t mask;
} grStencilFuncArgs;
struct {
GrStencil_t value;
} grStencilMaskArgs;
struct {
GrStencil_t value;
} grLfbConstantStencilArgs;
struct {
GrStencilOp_t stencil_fail;
GrStencilOp_t depth_fail;
GrStencilOp_t depth_pass;
} grStencilOpArgs;
struct {
GrCCUColor_t a;
GrCombineMode_t a_mode;
GrCCUColor_t b;
GrCombineMode_t b_mode;
GrCCUColor_t c;
FxBool c_invert;
GrCCUColor_t d;
FxBool d_invert;
FxU32 shift;
FxBool invert;
} grColorCombineExtArgs;
struct {
GrACUColor_t a;
GrCombineMode_t a_mode;
GrACUColor_t b;
GrCombineMode_t b_mode;
GrACUColor_t c;
FxBool c_invert;
GrACUColor_t d;
FxBool d_invert;
FxU32 shift;
FxBool invert;
} grAlphaCombineExtArgs;
struct {
GrCombineFunction_t rgb_function[GLIDE_NUM_TMU];
GrCombineFactor_t rgb_factor[GLIDE_NUM_TMU];
GrCombineFunction_t alpha_function[GLIDE_NUM_TMU];
GrCombineFactor_t alpha_factor[GLIDE_NUM_TMU];
FxBool rgb_invert[GLIDE_NUM_TMU];
FxBool alpha_invert[GLIDE_NUM_TMU];
} grTexCombineArgs;
struct {
GrTCCUColor_t a[GLIDE_NUM_TMU];
GrCombineMode_t a_mode[GLIDE_NUM_TMU];
GrTCCUColor_t b[GLIDE_NUM_TMU];
GrCombineMode_t b_mode[GLIDE_NUM_TMU];
GrTCCUColor_t c[GLIDE_NUM_TMU];
FxBool c_invert[GLIDE_NUM_TMU];
GrTCCUColor_t d[GLIDE_NUM_TMU];
FxBool d_invert[GLIDE_NUM_TMU];
FxU32 shift[GLIDE_NUM_TMU];
FxBool invert[GLIDE_NUM_TMU];
} grTexColorCombineExtArgs;
struct {
GrTACUColor_t a[GLIDE_NUM_TMU];
GrCombineMode_t a_mode[GLIDE_NUM_TMU];
GrTACUColor_t b[GLIDE_NUM_TMU];
GrCombineMode_t b_mode[GLIDE_NUM_TMU];
GrTACUColor_t c[GLIDE_NUM_TMU];
FxBool c_invert[GLIDE_NUM_TMU];
GrTACUColor_t d[GLIDE_NUM_TMU];
FxBool d_invert[GLIDE_NUM_TMU];
FxU32 shift[GLIDE_NUM_TMU];
FxBool invert[GLIDE_NUM_TMU];
} grTexAlphaCombineExtArgs;
struct {
GrColor_t value ;
} grConstantColorValueExtArgs ;
struct {
FxBool r;
FxBool g;
FxBool b;
FxBool a;
} grColorMaskExtArgs;
} stateArgs;
struct{
GrEnableMode_t primitive_smooth_mode;
GrEnableMode_t shameless_plug_mode;
GrEnableMode_t video_smooth_mode;
GrEnableMode_t texture_uma_mode;
GrEnableMode_t combine_ext_mode;
GrEnableMode_t stencil_mode;
FxU32 aaMultisampleDisableCount;
} grEnableArgs;
struct{
GrCoordinateSpaceMode_t coordinate_space_mode;
} grCoordinateSpaceArgs;
FxU32 forced32BPP;
} GrState;
/*
** Private GR_GET enumerants:
*/
#define GR_MEMTYPE GR_GET_RESERVED_1
/* 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.
*/
typedef FxI32 (FX_CALL* GrTriSetupProc)(const void *a, const void *b, const void *c);
typedef void (FX_CALL* GrVertexListProc)(FxU32 pkType, FxU32 type, FxI32 mode, FxI32 count, void* ptrs);
typedef void (FX_CALL* GrDrawTrianglesProc)(FxI32 mode, FxI32 count, void* vPtrs);
/* [grState valid bit][cull/no cull mode] */
typedef GrTriSetupProc GrTriSetupProcVector[2][2];
/* [Coordinate mode - window/clip] */
typedef GrTriSetupProcVector GrTriSetupProcArchVector[2];
/* Decalrations of the dispatchable procs found in xdraw2.asm and
* xtexdl.c for teh triangle and texture download procs respectively.
*
* NB: These procs have the special calling convention that the current
* gc is nabbed from tls and passed in edx. Screw w/ this at your
* own peril. You have been warned.
*/
extern FxI32 FX_CALL _trisetup_Default_win_cull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_Default_win_cull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_Default_win_nocull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_Default_win_nocull_valid(const void*, const void*, const void*);
/* Only one specialziation exists so far */
extern FxI32 FX_CALL _vptrisetup_cull(const void*, const void*, const void*);
/* Routine to call into the architecture specialized version of
* _grDrawTriangles if there is no specialized version of the
* grDrawTriangle routine for clip coordinates.
*/
extern FxI32 FX_CALL _trisetup_clip_coor_thunk(const void*, const void*, const void*);
#if GL_SSE
extern FxI32 FX_CALL _trisetup_SSE_clip_coor_thunk(const void*, const void*, const void*);
#endif /* GL_SSE */
extern void FX_CALL _grDrawTriangles_Default(FxI32, FxI32, void*);
void FX_CSTYLE _drawvertexlist(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
void FX_CSTYLE _vpdrawvertexlist(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
#if GL_AMD3D
extern FxI32 FX_CALL _trisetup_3DNow_win_cull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_win_cull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_win_nocull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_win_nocull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_clip_cull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_clip_cull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_clip_nocull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_3DNow_clip_nocull_valid(const void*, const void*, const void*);
extern void FX_CALL _grDrawTriangles_3DNow(FxI32, FxI32, void*);
void FX_CSTYLE _grDrawVertexList_3DNow_Window(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
void FX_CSTYLE _grDrawVertexList_3DNow_Clip(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
#endif /* GL_AMD3D */
#if GL_SSE
extern FxI32 FX_CALL _trisetup_SSE_win_cull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_win_cull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_win_nocull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_win_nocull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_clip_cull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_clip_cull_valid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_clip_nocull_invalid(const void*, const void*, const void*);
extern FxI32 FX_CALL _trisetup_SSE_clip_nocull_valid(const void*, const void*, const void*);
extern void FX_CALL _grDrawTriangles_SSE(FxI32, FxI32, void*);
void FX_CSTYLE _grDrawVertexList_SSE_Window(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
void FX_CSTYLE _grDrawVertexList_SSE_Clip(FxU32 pktype, FxU32 type, FxI32 mode, FxI32 count, void *pointers);
#endif /* GL_SSE */
#ifdef __GNUC__
/* Define this structure otherwise it assumes the structure only exists
within the function */
struct GrGC_s;
#endif /* __GNUC__ */
/* _GlideRoot.curTexProcs is an array of (possibly specialized)
* function pointers indexed by texture format size (8/16 bits for
* pre-Napalm, 4/8/16/32 for Napalm) 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[4][5];
extern void FX_CALL _grTexDownload_Default_4_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_4_8(struct GrGC_s* gc,
const FxU32 tmuBaseAddr,
const FxI32 maxS,
const FxI32 minT,
const FxI32 maxT,
void* texData);
extern void FX_CALL _grTexDownload_Default_4_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_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);
extern void FX_CALL _grTexDownload_Default_32_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_32_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 */
#if GL_MMX
/* xtexdl.asm */
extern void FX_CALL _grTexDownload_MMX(struct GrGC_s* gc,
const FxU32 tmuBaseAddr,
const FxI32 maxS,
const FxI32 minT,
const FxI32 maxT,
void* texData);
#endif
#if GL_SSE2
/* xtexdl.asm */
extern void FX_CALL _grTexDownload_SSE2_64(struct GrGC_s* gc,
const FxU32 tmuBaseAddr,
const FxI32 maxS,
const FxI32 minT,
const FxI32 maxT,
void* texData);
extern void FX_CALL _grTexDownload_SSE2_128(struct GrGC_s* gc,
const FxU32 tmuBaseAddr,
const FxI32 maxS,
const FxI32 minT,
const FxI32 maxT,
void* texData);
#endif
typedef struct GrGC_s
{
struct {
FxU32 bufferSwaps; /* number of buffer swaps */
FxU32 pointsDrawn;
FxU32 linesDrawn;
FxU32 trisProcessed;
FxU32 trisDrawn;
FxU32 othertrisDrawn;
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;
struct {
float ftemp1, ftemp2; /* temps to convert floats to ints */
} pool;
#if GLIDE_HW_TRI_SETUP
FxI32 curVertexSize; /* Size in bytes of a single vertex's parameters */
#endif
FxI32 curTriSize; /* the size in bytes of the current triangle */
FxU32
orgSW, orgSH; /* Original Screen width & Height */
FxU32
totBuffers,
strideInTiles,
heightInTiles,
bufferStride,
bufSizeInTiles,
bufSize,
fbOffset,
*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 */
FxU32 is_master;
FxU32 chipCount;
FxU32 sliCount;
FxU32 sliBandHeight;
#ifdef HAL_CSIM
HalInfo *halInfo;
#endif
struct GrTmuMemInfo {
/* Information for keeping track of the characteristics of the
* memory 'surfaces'. (We use 'surfaces' here not in the surface
* extension sense, but in the region sense).
*
* xxxTiled: Is this logical memory location in a tiled region?
* xxxStride: The stride to the next logical 'line' in a given
* region. This is in the units based on the respective
* xxxTiled field.
*/
FxU32
tramOffset,
tramSize,
tramLfbAddr;
FxU32
texStrideTiles,
texStrideBytes;
FxBool
texTiled;
/* Information about how to flush the textures and an
* downloads from any internal hw fifos.
*
* flushCount: If > 0 then the flush operations should be
* performed using the pre/post flush packets.
* This should initially be set to 1 in the hw
* init stuff and then will be decremented in
* the multiple level downloads so the lower
* levels know not to worry about the flush.
* xxxPacket: The actual packet data need to flush the
* textures and internal pixel fifo's
* pre:
* pkt1 header: wax command
* command = nop | go
* post:
* pkt1 header: texBaseAddr
* ~user texBaseAddr
* pkt1 header: nopCMD
* 0
* pkt1 header: texBaseAddr
* user texBaseAddr
* pkt1 header: wax command
* command = nop | go
*/
#if USE_PACKET_FIFO
# define GR_TEX_FLUSH_WRITE(__writeCount, __writeData) \
if (gc->contextP) { \
GR_SET_EXPECTED_SIZE((__writeCount) * sizeof(FxU32), 0); \
{ \
FxU32 \
*curFifoPtr = gc->cmdTransportInfo.fifoPtr, \
*curPktData = __writeData, \
i; \
for(i = 0; i < (__writeCount); i++) { \
SET_FIFO(*curFifoPtr++, *curPktData++); \
} \
GR_INC_SIZE((__writeCount) * sizeof(FxU32)); \
gc->cmdTransportInfo.fifoRoom -= ((FxU32)curFifoPtr - (FxU32)gc->cmdTransportInfo.fifoPtr); \
gc->cmdTransportInfo.fifoPtr = curFifoPtr; \
} \
GR_CHECK_SIZE(); \
}
# define TEX_FLUSH_COUNT_PRE 2
# define TEX_FLUSH_COUNT_POST 8
# define GR_TEX_FLUSH_PRE(__tmuMemInfo) \
do { \
if ((__tmuMemInfo)->flushCount > 0) { \
GR_TEX_FLUSH_WRITE(TEX_FLUSH_COUNT_PRE, (__tmuMemInfo)->prePacket); \
} \
(__tmuMemInfo)->flushCount--; \
} while(0)
# define GR_TEX_FLUSH_POST(__tmuMemInfo) \
do { \
(__tmuMemInfo)->flushCount++; \
if ((__tmuMemInfo)->flushCount > 0) { \
GR_TEX_FLUSH_WRITE(TEX_FLUSH_COUNT_POST, (__tmuMemInfo)->postPacket); \
} \
} while(0)
#else /* !USE_PACKET_FIFO */
/* temp defs */
# define TEX_FLUSH_COUNT_PRE 2
# define TEX_FLUSH_COUNT_POST 8
# define GR_TEX_FLUSH_PRE(__tmuMemInfo)
# define GR_TEX_FLUSH_POST(__tmuMemInfo)
#endif /* !USE_PACKET_FIFO */
FxI32
flushCount;
FxU32
prePacket[TEX_FLUSH_COUNT_PRE],
postPacket[TEX_FLUSH_COUNT_POST];
} tmuMemInfo[GLIDE_NUM_TMU];
hwcBoardInfo
*bInfo;
#ifdef GLIDE_INIT_HWC
FxU32
winContextId;
#endif
#if GLIDE_MULTIPLATFORM
GrGCFuncs
gcFuncs;
#endif
#define kMaxVertexParam (20 + (12 * GLIDE_NUM_TMU) + 3)
#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP
struct dataList_s {
int i;
FxFloat* addr;
} regDataList[kMaxVertexParam];
int tsuDataList[kMaxVertexParam];
#ifdef FAST_C_CLIP
int tsuDataListByte[kMaxVertexParam];
#endif
#else
int tsuDataList[kMaxVertexParam];
#ifdef FAST_C_CLIP
int tsuDataListByte[kMaxVertexParam];
#endif
#endif
#ifdef GLIDE3_SCALER
int tsuDataListScaler[kMaxVertexParam];
#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 {
/* Current triangle rendering proc specialized for culling/no
* culling and viewport/window coordinates.
*/
GrTriSetupProc triSetupProc;
GrDrawTrianglesProc drawTrianglesProc;
GrVertexListProc drawVertexList;
/* Vector to choose triangle rendering proc from based on the
* cull/no-cull mode and whether or not the state is valid. This
* vector is specialized on viewport vs window coordinates.
*/
GrTriSetupProcVector* coorModeTriVector;
/* Vector of texture download procs specialized by size
* and processor vendor type.
*/
GrTexDownloadProcVector* texDownloadProcs;
} archDispatchProcs;
/* NB: This structure is exported via the COMMAND_TRANSPORT
* extension which is shared w/ cvg glide3 as well. Care must be
* taken to make the structures compatible and to inform the OpenGL
* team (the only users of the extension) of any changes.
*/
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.
*/
FxU32* fifoPtr; /* Current write pointer into fifo */
FxU32 fifoRead; /* Last known hw read ptr.
* If on an sli enabled system this will be
* the 'closest' hw read ptr of the sli
* master and slave.
*/
/* Fifo checking information. In units of usuable bytes until
* the appropriate condition.
*/
FxI32 fifoRoom; /* Space until next fifo check */
FxBool autoBump; /* Are we auto bumping (aka hole counting?) */
FxU32
*lastBump, /* Last ptr where we bumped. */
*bumpPos; /* Next place to bump */
FxU32
bumpSize; /* # of DWORDS per bump */
FxU32 **ptrLostContext;
/* Internal bookkeeping information - Everything after this point
* is not exposed via the COMMAND_TRANSPORT extension
*/
/* 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
*/
/* NB: These are only valid for the fullscreen case
*/
FxI32 roomToReadPtr;/* Bytes until last known hw ptr */
FxI32 roomToEnd; /* # of bytes until last usable address before fifoEnd */
FxU32 lfbLockCount; /* Have we done an lfb lock? Count of the locks. */
#if GLIDE_INIT_HWC
GrStateBuffer*
stateBuffer;
HwcWinFifo
hwcFifoInfo;
FxU32
numCommandBuf, /* # of command buffers */
curCommandBuf, /* Current command buffer waiting to issue */
numQueuedBuf, /* # of command buffers waiting to issue */
serialNumber, /* Current serial # */
issuedSerialNumber, /* Last issued command buffer # */
committedSerialNumber; /* Last known committed buffer */
/* This is the backing store that gets used if we are not abled to
* allocate surface storage for the fifo information.
*/
/* <=32k bytes -- don't want segment overflow in 16-bit driver*/
#define WINDOW_FIFO_SIZE_IN_DWORDS 0x2000
FxU32
windowedFifo[WINDOW_FIFO_SIZE_IN_DWORDS];
GrStateBuffer
windowedState;
#endif /* GLIDE_INIT_HWC */
FxU32
*lastFence; /* Either beginning of the fifo (at
start or after a wrap), or the last
place we fenced. Fencing must
occur every 64K writes. */
} cmdTransportInfo;
FxI32 (FX_CALL *triSetupProc)(const void *a, const void *b, const void *c);
SstIORegs
*ioRegs; /* I/O remap regs */
SstCRegs
*cRegs; /* AGP/Cmd xfer/misc regs */
SstGRegs
*gRegs; /* 2D regs */
SstRegs
*sstRegs; /* Graphics Regs (3D Regs) */
SstRegs
*slaveSstRegs[3] ; /* AJB - ptrs to slave chips */
SstCRegs
*slaveCRegs[3] ; /* AJB - ptrs to slave chips cmd regs */
FxU32
*rawLfb,
nBuffers,
curBuffer,
frontBuffer,
backBuffer,
buffers0[4],
buffers1[4],
lfbBuffers[4]; /* Tile relative addresses of the color/aux
* buffers for lfbReads.
*/
FxU32 lockPtrs[2]; /* pointers to locked buffers */
FxU32 fbStride;
FxBool colTiled, // AJB - grBufferClear needs to know when target surfaces
auxTiled ; // are linear in windowed & fullscreen glide.
/* TextureBuffer extension
** Used for Rendering into a Texture.
** tbext
*/
struct {
FxBool init;
FxBool on;
FxU32 addr;
FxI32 stride;
FxU32 width, height;
struct {
FxBool valid;
float cwMinx, cwMiny, cwMaxx, cwMaxy; /* ClipWindow Min/Max */
FxU32 clipLeftRight, clipBottomTop;
} prevState;
} textureBuffer;
/* tbext. TODO: remove the prevState member? */
struct {
FxBool init;
FxBool on;
FxU32 addr;
FxI32 stride;
FxU32 width, height;
struct {
FxBool valid;
float cwMinx, cwMiny, cwMaxx, cwMaxy; /* ClipWindow Min/Max */
FxU32 clipLeftRight, clipBottomTop;
} prevState;
} textureAuxBuffer;
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;
int grPixelFormat; /* Specific pixel format */
int grPixelSample; /* Total number of AA samples */
int grPixelSize; /* Pixel size in bytes */
int grSamplesPerChip; /* Numbef of AA samples per chip */
int sampleOffsetIndex; /* Which index do we use for AA offsets? */
int enableSecondaryBuffer; /* Whether or not secondary AA buffer is in use. */
FxBool do2ppc;
FxU32 chipmask;
FxU32 stencilCleared;
#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 */
/* Has GC Been Opened?
*
* NB: The following fields are similar, but subtly different.
* Make sure that you keep their meanings differentiated when
* messing w/ their values because various internacl bits of glide
* make various assumptions about their values.
*
* hwInitP: Is the hw mapping active? Some OS's (notably NT) require
* that the driver keep track of mappings on a per process
* basis. This flag indicates whether or not glide thinks that it
* has a mapping allocated w/ the driver via hwcMapBoard. This is
* only meaningful for a fullscreen application.
*
* %%KCD: hwInitP is inherently broken for apps that switch back
* and forth between fullscreen and windowed, since different
* GC's are used in those cases, which means the hwInitP flag
* won't carry over. So, hwcBoardInfo now has an isMapped
* flag that keeps track of whether a given board is mapped or
* not, so it can be kept track of the right way.
*
* open: Does the application have an fullscreen context open.
* Fullscreen: grSstWinOpen/grSstWinClose
* Surface Extension: grSurfaceCreateContext/grSurfaceReleaseContext
*
* contextP: This indicates whether glide thinks that its fsem
* context is still valid. This can become false if the app looses
* its context due to some os interaction (alt-tab on win32
* platforns), but this does not affect the state of gc->open.
*/
FxBool
/* hwInitP, */
open,
contextP;
FxU32 *
lostContext;
FxBool auxRendering; /* Is an aux rendering surface current? */
FxBool windowed; /* is this a fullscreen or windowed gc */
#ifdef GLIDE_INIT_HWC
hwcBufferDesc
tBuffer, /* Texture Buuffer */
*arBuffer; /* Aux Rendering Buffer */
GrSurface_t
curSurface, /* Current rendering surface */
auxSurface, /* Aux buffer surface */
texSurface[GLIDE_NUM_TMU]; /* Current texture surface */
#endif /* GLIDE_INIT_HWC */
/* Splash screen/shameless plug crap */
struct {
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
HMODULE
moduleHandle;
#endif /* (GLIDE_PLATFORM & GLIDE_OS_WIN32) */
GrSplashInitProc
initProc;
GrSplashShutdownProc
shutdownProc;
GrSplashProc
splashProc;
GrSplashPlugProc
plugProc;
} pluginInfo;
} 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 {
int p6Fencer; /* xchg to here to keep this in cache!!! */
FxU32 tlsIndex;
FxU32 tlsOffset;
int current_sst;
FxI32 windowsInit; /* Is the fullscreen part of glide initialized? */
_p_info CPUType; /* CPUID */
#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP
FxU32 paramCount;
FxI32 curTriSizeNoGradient; /* special for _trisetup_nogradients */
FxI32 curTriSize; /* the size in bytes of the current triangle */
#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;
#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 */
FxU32 fifoSize; /* specifies fifo size in windowed glide mode */
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 */
float gammaR, gammaG, gammaB; /* Gamma settings */
FxBool useAppGamma; /* enable(1)(default)/disable(0) application gamma control */
FxBool guardbandclipping; /* enable gbc */
FxI32 do2ppc; /* enable 2ppc */
FxU32 band2ppc; /* 2ppc band */
FxU32 sliBandHeight; /* sli band height */
FxI32 swapPendingCount; /* pending buffer swap count */
FxI32 forceOldAA; /* Force AA to use SLI when possible */
FxI32 waxon ; /* Enable use of WAX */
FxU32 aaToggleKey; /* Raw Key code for AA toggle */
FxU32 aaScreenshotKey; /* Raw Key code for AA toggle */
FxI32 analogSli ; /* force digital or analog sli */
FxI32 lodBias; /* User-adjustable lod bias value (signed) */
FxU32 sliBandHeightForce; /* Force user-specified band height */
FxU32 is_opengl; /* specify whether we are opengl app or not */
FxU32 noHW; /* Disable HW writes */
/* Force alternate buffer strategy */
FxI32 nColorBuffer;
FxI32 nAuxBuffer;
FxBool autoBump; /* Auto bump or do it manually? */
FxU32 bumpSize;
FxU32 forceSingleChip ; /* force off SLI */
FxU32 outputBpp ; /* force 16/32bpp rendering */
FxU32 aaSample ; /* force 2/4 sample anti-aliasing */
FxU32 columnWidth; /* 'n' in columns of n */
/* Anti-aliasing default perturbation values */
FxU32 aaXOffset[15][8]; /* increase arrays for 8xaa */
FxU32 aaYOffset[15][8];
/* Limit number of writes between fences */
FxI32 fenceLimit;
FxBool texSubLodDither; /* always do subsample mipmap dithering */
FxBool aaClip; /* clean out AA garbage */
FxBool forceAutoBump; /* force Auto bump? */
#if CHECK_SLAVE_SWAPCMD
FxU32 checkSlaveSwapCMD; /* check swap commands across all chips */
#endif
#if TACO_MEMORY_FIFO_HACK
FxBool memFIFOHack; /* flush FIFO as much as possible */
#endif
FxU32 ditherHwcAA; /* Specifies whether to use HwcAAReadRegion should dither */
FxU32 taaToggleKey; /* Raw key code for TemporalAA toggle */
FxBool taaEnabled; /* TemporalAA enabled */
} environment;
GrHwConfiguration hwConfig;
GrGC GCs[MAX_NUM_SST]; /* one GC per board */
GrGC surfaceGCs[MAX_NUM_CONTEXTS];
GrGC *surfaceGCHeap[MAX_NUM_CONTEXTS];
struct {
GrTriSetupProcArchVector* curTriProcs;
GrDrawTrianglesProc curDrawTrisProc;
GrVertexListProc* curVertexListProcs;
GrTexDownloadProcVector* curTexProcs;
#define PROC_SELECT_TRISETUP(__procVector, __cullMode) (__procVector)[(__cullMode) != GR_CULL_DISABLE]
#define PROC_SELECT_TEXDOWNLOAD() _GlideRoot.curTexProcs
GrTriSetupProcArchVector* nullTriProcs;
GrDrawTrianglesProc nullDrawTrisProc;
GrVertexListProc* nullVertexListProcs;
GrTexDownloadProcVector* nullTexProcs;
} deviceArchProcs;
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
#define OS_WIN32_95 0
#define OS_WIN32_98 1
#define OS_WIN32_ME 2
#define OS_WIN32_NT4 3
#define OS_WIN32_2K 4
#define OS_WIN32_XP 5
FxI32 OS;
#endif
};
extern struct _GlideRoot_s GR_CDECL _GlideRoot;
#if GLIDE_MULTIPLATFORM
extern GrGCFuncs _curGCFuncs;
#endif
#if 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 __sync()
#elif defined(__GNUC__) && defined(__i386__)
/*
* This is the __linux__ code.
*/
#define P6FENCE asm("xchg %%eax, %0" : : "m" (_GlideRoot.p6Fencer) : "eax");
#elif defined(__WATCOMC__)
void
p6Fence(void);
#pragma aux p6Fence = \
"xchg eax, dword ptr _GlideRoot" \
modify [eax];
#define P6FENCE p6Fence()
#else /* !defined ( P6FENCE ) */
# error "P6 Fencing code needs to be added for this compiler"
#endif /* !defined ( P6FENCE ) */
/*==========================================================================*/
/* Macros for declaring functions */
#define GR_DDFUNC(name, type, args) \
type FX_CSTYLE name args
#define GR_EXT_ENTRY( name, type, args ) \
type FX_CSTYLE name args
#define GR_ENTRY(name, type, args) \
type FX_CSTYLE name args
//FX_EXPORT type FX_CSTYLE name args
#define GR_FAST_ENTRY(name, type, args) \
__declspec naked FX_EXPORT type FX_CSTYLE name args
#define GR_DIENTRY(name, type, args) \
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_DRGB_SHIFT 0
#define STATE_REQUIRES_IT_ALPHA FXBIT(1)
#define STATE_REQUIRES_IT_ALPHA_SHIFT 1
#define STATE_REQUIRES_OOZ FXBIT(2)
#define STATE_REQUIRES_OOZ_SHIFT 2
#define STATE_REQUIRES_OOW_FBI FXBIT(3)
#define STATE_REQUIRES_OOW_FBI_SHIFT 3
#define STATE_REQUIRES_W_TMU0 FXBIT(4)
#define STATE_REQUIRES_W_TMU0_SHIFT 4
#define STATE_REQUIRES_ST_TMU0 FXBIT(5)
#define STATE_REQUIRES_ST_TMU0_SHIFT 5
#define STATE_REQUIRES_W_TMU1 FXBIT(6)
#define STATE_REQUIRES_W_TMU1_SHIFT 6
#define STATE_REQUIRES_ST_TMU1 FXBIT(7)
#define STATE_REQUIRES_ST_TMU1_SHIFT 7
#define STATE_REQUIRES_W_TMU2 FXBIT(8)
#define STATE_REQUIRES_W_TMU2_SHIFT 8
#define STATE_REQUIRES_ST_TMU2 FXBIT(9)
#define STATE_REQUIRES_ST_TMU2_SHIFT 9
#define GR_TMUMASK_TMU0 FXBIT(GR_TMU0)
#define GR_TMUMASK_TMU1 FXBIT(GR_TMU1)
#define GR_TMUMASK_TMU2 FXBIT(GR_TMU2)
#define STATE_USING_CC FXBIT(0)
#define STATE_USING_CA FXBIT(1)
#define STATE_USING_TCC FXBIT(2)
#define STATE_USING_TAC FXBIT(3)
/*
** 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
/* NB: These routines are generally in asm (see xdraw2.inc), and have
* their own internally defined calling conventions. The gc pointer
* will be setup by the caller and will be in edx and that stack will
* be configured as: return address, vertex a, vertex b, vertex c.
*/
FxI32 FX_CSTYLE
_trisetup_cull(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_cull_noclip(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_noclip(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_cull_valid(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_valid(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_cull_noclip_valid(const void *va, const void *vb, const void *vc );
FxI32 FX_CSTYLE
_trisetup_noclip_valid(const void *va, const void *vb, const void *vc );
#define TRISETUP_NORGB(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \
? _trisetup \
: _trisetup_cull)
#define TRISETUP_NORGB_NOCLIP(__cullMode) (((__cullMode) == GR_CULL_DISABLE) \
? _trisetup_noclip \
: _trisetup_cull_noclip)
#define TRISETUP_RGB(__cullMode) TRISETUP_NORGB(__cullMode)
#define TRISETUP_ARGB(__cullMode) TRISETUP_NORGB(__cullMode)
#if defined( __MSC__ )
#if (_MSC_VER < 1200)
// TRISETUP Macro for pre-msvc 6.0
#define TRISETUP \
__asm { mov edx, gc }; \
(*gc->triSetupProc)
#else // _MSC_VER
// TRISETUP Macro for msvc 6 or later
#if defined(GLIDE_DEBUG) || GLIDE_USE_C_TRISETUP
// MSVC6 Debug does funny stuff, so push our parms inline
#define TRISETUP(_a, _b, _c) \
__asm { \
__asm mov edx, gc \
__asm mov eax, _c \
__asm push eax \
__asm mov ebx, _b \
__asm push ebx \
__asm mov ecx, _a \
__asm push ecx \
} \
((FxI32 (*)(void))*gc->triSetupProc)()
#else // GLIDE_DEBUG
// MSVC6 Retail does funny stuff too, but Larry figured it out:
#define TRISETUP(_a, _b, _c) \
__asm { mov edx, gc }; \
((FxI32 (*)(const void *va, const void *vb, const void *vc, GrGC *gc))*gc->triSetupProc)(_a, _b, _c, gc)
#endif // GLIDE_DEBUG
#endif // _MSC_VER
#elif defined(__POWERPC__)
#define TRISETUP(_a, _b, _c) \
((FxI32 (*)(const void *va, const void *vb, const void *vc, GrGC *gc))*gc->triSetupProc)(_a, _b, _c, gc)
#elif (GLIDE_PLATFORM & GLIDE_OS_UNIX) || defined(__DJGPP__)
#define TRISETUP \
__asm(""::"d"(gc)); \
(*gc->triSetupProc)
#elif defined(__WATCOMC__)
extern void wat_trisetup (void *gc, const void *a, const void *b, const void *c);
#pragma aux wat_trisetup = \
"push ecx" \
"push ebx" \
"push eax" \
parm [edx] [eax] [ebx] [ecx];
#define TRISETUP(_a, _b, _c) \
do { \
wat_trisetup(gc, _a, _b, _c); \
((FxI32 (*)(void))*gc->triSetupProc)(); \
} while (0)
#else
#define TRISETUP \
(*gc->triSetupProc)
#endif
void GR_CDECL
_grValidateState();
void FX_CSTYLE
_grDrawVertexList(FxU32 pktype, FxU32 type, 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 );
void FX_CALL
grGetGammaTable(FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue);
void FX_CALL
grChromaRangeMode(GrChromaRangeMode_t mode);
void FX_CALL
grChromaRange( GrColor_t min, GrColor_t max , GrChromaRangeMode_t mode);
void FX_CALL
grTexChromaMode(GrChipID_t tmu, GrTexChromakeyMode_t mode);
void FX_CALL
grTexChromaRange(GrChipID_t tmu, GrColor_t min, GrColor_t max, GrTexChromakeyMode_t mode);
/*
** Napalm extension
*/
GrContext_t FX_CALL
grSstWinOpenExt(
FxU32 hWnd,
GrScreenResolution_t resolution,
GrScreenRefresh_t refresh,
GrColorFormat_t format,
GrOriginLocation_t origin,
GrPixelFormat_t pixelformat,
int nColBuffers,
int nAuxBuffers);
void FX_CALL
grStencilFunc(GrCmpFnc_t fnc, GrStencil_t ref, GrStencil_t mask);
void FX_CALL
grStencilMask(GrStencil_t write_mask);
/*void FX_CALL
grStipplePattern(
GrStipplePattern_t stipple);*/
void FX_CALL
grStencilOp(
GrStencilOp_t stencil_fail,
GrStencilOp_t depth_fail,
GrStencilOp_t depth_pass);
void FX_CALL
grBufferClearExt(
GrColor_t color,
GrAlpha_t alpha,
FxU32 depth,
GrStencil_t stencil);
void FX_CALL
grLfbConstantStencil(GrStencil_t mode);
void FX_CALL
grColorCombineExt(
GrCCUColor_t a,
GrCombineMode_t a_mode,
GrCCUColor_t b,
GrCombineMode_t b_mode,
GrCCUColor_t c,
FxBool c_invert,
GrCCUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CALL
grAlphaCombineExt(
GrACUColor_t a,
GrCombineMode_t a_mode,
GrACUColor_t b,
GrCombineMode_t b_mode,
GrACUColor_t c,
FxBool c_invert,
GrACUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CALL
grTexColorCombineExt(
GrChipID_t tmu,
GrTCCUColor_t a,
GrCombineMode_t a_mode,
GrTCCUColor_t b,
GrCombineMode_t b_mode,
GrTCCUColor_t c,
FxBool c_invert,
GrTCCUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CALL
grTexAlphaCombineExt(
GrChipID_t tmu,
GrTACUColor_t a,
GrCombineMode_t a_mode,
GrTACUColor_t b,
GrCombineMode_t b_mode,
GrTACUColor_t c,
FxBool c_invert,
GrTACUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CALL
grConstantColorValueExt(
GrChipID_t tmu,
GrColor_t value) ;
void FX_CALL
grColorMaskExt( FxBool r,
FxBool g,
FxBool b,
FxBool a );
void FX_CALL
grAlphaBlendFunctionExt( GrAlphaBlendFnc_t rgb_sf,
GrAlphaBlendFnc_t rgb_df,
GrAlphaBlendOp_t rgb_op,
GrAlphaBlendFnc_t alpha_sf,
GrAlphaBlendFnc_t alpha_df,
GrAlphaBlendOp_t alpha_op );
void FX_CALL
grTBufferWriteMaskExt( FxU32 mask );
/* end of Napalm extension */
void
_grChipMask(FxU32 mask);
void
_grTex2ppc(FxBool enable);
void
_grAAOffsetValue(FxU32 *xOffset,
FxU32 *yOffset,
FxU32 minchipid,
FxU32 maxchipid,
FxBool enablePrimary,
FxBool enableSecondary);
void
_grEnableSliCtrl(void);
void
_grDisableSliCtrl(void);
void
_grRenderMode(FxU32 pixelformat);
void
_grChromaMode( GrChromaRangeMode_t mode );
void
_grChromakeyMode( GrChromakeyMode_t mode );
/* tbext */
void FX_CALL
grTextureBuffer( GrChipID_t tmu,
FxU32 startAddress,
GrLOD_t thisLOD,
GrLOD_t largeLOD,
GrAspectRatio_t aspectRatio,
GrTextureFormat_t format,
FxU32 odd_even_mask );
void FX_CALL
grTextureAuxBuffer( GrChipID_t tmu,
FxU32 startAddress,
GrLOD_t thisLOD,
GrLOD_t largeLOD,
GrAspectRatio_t aspectRatio,
GrTextureFormat_t format,
FxU32 odd_even_mask );
void FX_CALL
grAuxBuffer( GrBuffer_t buffer );
void
_grValidateClipState( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy );
#if GLIDE_DEBUG
/* These are only called for debug builds for tracing because their
* handling is special cased in _grValidateState because of the
* interdependency between the calls.
*/
void _grDepthMask( FxBool mask );
void _grColorMask( FxBool rgb, FxBool a );
void _grLfbWriteColorFormat(GrColorFormat_t colorFormat);
void _grLfbWriteColorSwizzle(FxBool swizzleBytes, FxBool swapWords);
void _grFogColorValue( GrColor_t fogcolor );
void _grDepthBiasLevel( FxI32 level );
void _grChromakeyValue( GrColor_t color );
void _grChromaRange( GrColor_t max , GrChromaRangeMode_t mode);
#endif /* GLIDE_DEBUG */
void
_grDepthBufferFunction( GrCmpFnc_t function );
void
_grDepthBufferMode( GrDepthBufferMode_t mode );
void
_grDitherMode( GrDitherMode_t mode );
void
_grStippleMode( GrStippleMode_t mode );
void
_grRenderBuffer( GrBuffer_t buffer );
void
_grSstOrigin(GrOriginLocation_t origin);
void
_grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy );
void
_grFogMode( GrFogMode_t mode );
void
_grConstantColorValue( GrColor_t value );
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
_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);
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 /* FX_GLIDE_NO_FUNC_PROTO */
/*==========================================================================*/
/*
** thread stuff
*/
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
/* [koolsmoky] According to MSJ, in WinNT, the pointer to the TLS slots for
* the thread contains a null pointer until the first time a TLS slot is used
* in the thread, then the system allocates memory for the TLS slots out of
* the default process heap. In Win95, it points to the TLS slots that are
* always kept as part of the Ring 3 thread database.
*
* The value of TLS index X can be read as follows on all Win32 systems;
* get pointer to the TLS slots for the thread, add (X * sizeof(DWORD)) to it,
* and read from that address.
*
* NOTE: This is valid for TLS slots 0 through 63 (64 slots).
*
* Win2k/XP
* From Win2k/XP DDK's ntddk.h;
* FS:[0x3C] - contains a pointer to the TLS slots for the thread.
*
* Win9x/Me/NT4
* FS:[0x2C] - contains a pointer to the TLS slots for the thread.
*
*
* According to MSDN, the TLS slots are always kept as part of the Ring 3
* thread database on all Win32 systems; they are kept at the following
* offsets of the Thread Environment Block (TEB) structure.
*
* Win95
* offsets 0x88 - 0x188 (64 slots)
*
* WinNT4
* offsets 0xE10 - 0xF0F (64 slots)
*
* Win98/Me
* offsets 0x88 - 0x188, 0x???? - 0x???? (80 slots)
*
* Win2k/XP
* offsets 0xE10 - 0xF0F, 0x268C - 0x368C (1088 slots)
*
* FS:[0x18] contains the base address of the TEB structure.
*
* NOTE: The minimum slots is guaranteed to be at least 64 on all systems.
* TLS_MINIMUM_AVAILABLE = 64
*/
#define USE_STANDARD_TLS_FUNC 0
#if USE_STANDARD_TLS_FUNC
__inline FxU32
getThreadValueFast() {
/* According to Microsoft, TlsGetValue is implemented with speed as the
* primary goal. The function performs minimal parameter validation and
* error checking. This function succeeds only when the TLS index is in
* the range 0 through (TLS_MINIMUM_AVAILABLE - 1).
*/
return (FxU32)TlsGetValue(_GlideRoot.tlsIndex);
}
#else
#define W95_TEB_PTR 0x18
#define W95_TEB_TLS_OFFSET 0x88
#define W95_TLS_INDEX_TO_OFFSET(i) ((i)*sizeof(DWORD)+W95_TEB_TLS_OFFSET)
#define WNT_TEB_PTR 0x18
#define WNT_TEB_TLS_OFFSET 0xE10
#define WNT_TLS_INDEX_TO_OFFSET(i) ((i)*sizeof(DWORD)+WNT_TEB_TLS_OFFSET)
#ifdef __GNUC__
extern __inline FxU32 getThreadValueFast (void)
{
FxU32 t;
__asm __volatile (" \
mov %%fs:(%0), %%eax; \
add %1, %%eax; \
mov (%%eax), %%eax; \
":"=a"(t):"i"(WNT_TEB_PTR), "g"(_GlideRoot.tlsOffset));
return t;
}
#else /* __GNUC__ */
#pragma warning (4:4035) /* No return value */
__inline FxU32
getThreadValueFast() {
__asm {
__asm mov eax, DWORD PTR fs:[WNT_TEB_PTR]
__asm add eax, DWORD PTR _GlideRoot.tlsOffset
__asm mov eax, DWORD PTR [eax]
}
}
#endif /* __GNUC__ */
#endif
#endif
#if (GLIDE_PLATFORM & GLIDE_OS_MACOS)
extern FxU32 _threadValueMacOS;
__inline FxU32
getThreadValueFast() {
return _threadValueMacOS;
}
#endif
#if (GLIDE_PLATFORM & GLIDE_OS_UNIX)
extern FxU32 threadValueLinux;
#define getThreadValueFast() threadValueLinux
#endif /* defined(GLIDE_PLATFORM & GLIDE_OS_UNIX) */
#if (GLIDE_PLATFORM & GLIDE_OS_DOS32)
extern FxU32 GR_CDECL threadValueDJGPP;
#define getThreadValueFast() threadValueDJGPP
#endif /* DOS32 */
#define CUR_TRI_PROC(__checkValidP, __cullP) \
(*gc->archDispatchProcs.coorModeTriVector)[__checkValidP][__cullP]
#define INVALIDATE(regset) {\
gc->state.invalid |= regset ## BIT; \
gc->triSetupProc = CUR_TRI_PROC(FXTRUE, (gc->state.cull_mode != GR_CULL_DISABLE)); \
}
#define INVALIDATE_TMU(tmu, regset) {\
INVALIDATE(tmuConfig); \
gc->state.tmuInvalid[tmu] |= regset ## BIT; \
}
void
initThreadStorage( void );
void
freeThreadStorage( void );
void
setThreadValue( FxU32 value );
FxU32
getThreadValueSLOW( void );
void
initCriticalSection( void );
void
deleteCriticalSection( void );
void
beginCriticalSection( void );
void
endCriticalSection( void );
/*==========================================================================*/
/*
** 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);
void FX_CSTYLE
_grCCExtfbzColorPath(GrCCUColor_t a,
GrCombineMode_t a_mode,
GrCCUColor_t b,
GrCombineMode_t b_mode,
GrCCUColor_t c,
FxBool c_invert,
GrCCUColor_t d,
FxBool invert);
void FX_CSTYLE
_grACExtfbzColorPath(GrACUColor_t a,
GrCombineMode_t a_mode,
GrACUColor_t b,
GrCombineMode_t b_mode,
GrACUColor_t c,
FxBool c_invert,
GrACUColor_t d,
FxBool invert);
void FX_CSTYLE
_grCCExtcombineMode(GrCCUColor_t a,
GrCombineMode_t a_mode,
GrCCUColor_t b,
GrCombineMode_t b_mode,
GrCCUColor_t c,
FxBool d_invert,
FxU32 shift);
void FX_CSTYLE
_grACExtcombineMode(GrACUColor_t a,
GrCombineMode_t a_mode,
GrACUColor_t b,
GrCombineMode_t b_mode,
FxBool d_invert,
FxU32 shift);
void FX_CSTYLE
_grTexColorCombineExt(GrChipID_t tmu,
GrTCCUColor_t a,
GrCombineMode_t a_mode,
GrTCCUColor_t b,
GrCombineMode_t b_mode,
GrTCCUColor_t c,
FxBool c_invert,
GrTCCUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CSTYLE
_grTexAlphaCombineExt(GrChipID_t tmu,
GrTACUColor_t a,
GrCombineMode_t a_mode,
GrTACUColor_t b,
GrCombineMode_t b_mode,
GrTACUColor_t c,
FxBool c_invert,
GrTACUColor_t d,
FxBool d_invert,
FxU32 shift,
FxBool invert);
void FX_CSTYLE
_grRebuildDataList(void);
void
_grReCacheFifo(FxI32 n);
FxI32 GR_CDECL
_grSpinFifo(FxI32 n);
void
_grShamelessPlug(void);
FxBool
_grSstDetectResources(void);
#if 0 /* KoolSmoky - remove junk */
FxU16
_grTexFloatLODToFixedLOD(float value);
#endif
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,
GrTexTable_t type,
GuTexPalette *pal,
int start, int end);
FxU32
_grTexCalcBaseAddress(FxU32 start_address, GrLOD_t largeLod,
GrAspectRatio_t aspect, GrTextureFormat_t fmt,
FxU32 odd_even_mask);
FxI32
_grTexCalcBaseAddressTiled(GrChipID_t tmu,
FxU32 start_address,
GrAspectRatio_t aspect,
GrLOD_t largeLod,
GrTextureFormat_t fmt,
FxU32 odd_even_mask);
void
_grTexForceLod(GrChipID_t tmu, int value);
FxU32
_grTexCalcMipmapLevelOffsetTiled(GrChipID_t tmu,
GrLOD_t lod, GrLOD_t largeLOD,
GrAspectRatio_t ar,
GrTextureFormat_t fmt,
FxU32 evenOdd,
FxU32 *tileXreturn,
FxU32 *tileYreturn);
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);
/* gsst.c */
extern void
initGC( GrGC *gc );
extern void
assertDefaultState( void );
/*==========================================================================*/
/* 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 <assert.h>
#endif
#define GR_DCL_GC GrGC *gc = (GrGC*)getThreadValueFast()
#define GR_DCL_HW_INIT SstRegs *hw
#define GR_DCL_HW_STAGE2 hw = (SstRegs *)gc->sstRegs
#define GR_DCL_HW SstRegs *hw = (SstRegs *)gc->sstRegs
#ifdef DEBUG_MODE
#define ASSERT(exp) GR_ASSERT(exp)
#define GR_DEBUG_DCL_INIT() \
FxI32 saveLevel; \
char* myName
#define GR_DEBUG_DCL_STAGE2(name,level) \
GR_ASSERT(gc != NULL); \
saveLevel = gc->myLevel; \
myName = name; \
gc->myLevel = level; \
gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \
GDBG_INFO(gc->myLevel,myName); \
FXUNUSED(saveLevel); \
FXUNUSED(hw); \
FXUNUSED(saveLevel)
#define GR_DEBUG_DCL(name,level) \
const FxI32 saveLevel = gc->myLevel; \
const char* myName = name; \
GR_ASSERT(gc != NULL); \
gc->myLevel = level; \
gc->checkPtr = (FxU32)gc->cmdTransportInfo.fifoPtr; \
GDBG_INFO(gc->myLevel,myName); \
FXUNUSED(saveLevel); \
FXUNUSED(hw); \
FXUNUSED(saveLevel)
#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_DEBUG_DCL_INIT()
#define GR_DEBUG_DCL_STAGE2(name, level)
#define GR_DEBUG_DCL(name, level)
#define GR_TRACE_EXIT(__n)
#define GR_TRACE_RETURN(__l, __n, __v)
#endif /* !DEBUG_MODE */
#include <assert.h>
#ifdef GLIDE_ALT_TAB
#define GR_BEGIN_NOFIFOCHECK(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw); \
if (!gc) \
return; \
if (!(gc->windowed)) { \
if (gc->lostContext) { \
if (*gc->lostContext) { \
return;\
}\
}\
}
#define GR_BEGIN_NOFIFOCHECK_RET(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw); \
if (!gc) \
return 0; \
if (!(gc->windowed)) { \
if (gc->lostContext) {\
if (*gc->lostContext) { \
return 0;\
}\
}\
}
#define GR_BEGIN_NOFIFOCHECK_NORET(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw)
#else
#define GR_BEGIN_NOFIFOCHECK(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw)
#define GR_BEGIN_NOFIFOCHECK_RET(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw)
#define GR_BEGIN_NOFIFOCHECK_NORET(name,level) \
GR_DCL_GC; \
GR_DCL_HW; \
GR_DEBUG_DCL(name, level); \
FXUNUSED(hw)
#endif
#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) \
do { \
if (GDBG_GET_DEBUGLEVEL(gc->myLevel)) { \
GR_CHECK_SIZE(); \
} else { \
GR_END(); \
} \
GR_TRACE_RETURN(gc->myLevel, myName, val); \
return val; \
} while (0)
#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 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
/* 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
#ifdef GLIDE_TEST_TEXTURE_ALIGNMENT
extern FxU32 SST_TEXTURE_ALIGN;
#else
#define SST_TEXTURE_ALIGN 0x10UL
#endif
#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]))
#if GDBG_INFO_ON
/* cvg.c */
extern void
_grErrorCallback(const char* const procName,
const char* const format,
va_list args);
#endif
/* The translation macros convert from the reasonable log2 formats to
* the somewhat whacked (For those of us coming back to sst1 things
* from sst2 w/ its saner lms notation) sst1 lod format. The api and
* internal functions pass log2 values, but we convert to lod values
* when writing things out to the hw or to index the legacy size
* tables listed below.
*
* G3_LOD_TRANSLATE() is now undefined. Use _g3LodXlat() if necessary.
*/
#define G3_ASPECT_TRANSLATE(__aspect) (0x3 - (__aspect))
/* ditex.c -
* Lookup tables to do translations from various aspect ratio/lod
* sizes to more meaningful things like bytes.
*/
extern const FxU32 _grBitsPerTexel[];
extern const int _grMipMapHostWH[G3_ASPECT_TRANSLATE(GR_ASPECT_LOG2_1x8) + 1]
[GR_LOD_LOG2_2048 + 1][2];
extern const int _grMipMapHostWHCmp4Bit[G3_ASPECT_TRANSLATE(GR_ASPECT_LOG2_1x8) + 1][GR_LOD_LOG2_2048 + 1][2];
extern const int _grMipMapHostWHDXT[G3_ASPECT_TRANSLATE(GR_ASPECT_LOG2_1x8) + 1][GR_LOD_LOG2_2048 + 1][2];
extern const FxU32 _grMipMapHostSize[][12];
extern const FxU32 _grMipMapHostSizeCmp4Bit[][12];
extern const FxU32 _grMipMapHostSizeDXT[][12];
extern const FxI32 _grMipMapOffset[4][16];
extern const FxI32 _grMipMapOffsetCmp4Bit[7][16];
extern const FxI32 _grMipMapOffsetDXT[4][16];
extern const FxI32 _grMipMapOffset_Tsplit[4][16];
extern const FxI32 _grMipMapOffset_TsplitCmp4Bit[7][16];
extern const FxI32 _grMipMapOffset_TsplitDXT[4][16];
extern const FxU32 _gr_evenOdd_xlate_table[];
extern const FxU32 _gr_aspect_xlate_table[];
#define WIDTH_BY_ASPECT_LOD(__aspect, __lod) \
_grMipMapHostWH[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][0]
#define HEIGHT_BY_ASPECT_LOD(__aspect, __lod) \
_grMipMapHostWH[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][1]
#define WIDTH_BY_ASPECT_LOD_FXT1(__aspect, __lod) \
_grMipMapHostWHCmp4Bit[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][0]
#define HEIGHT_BY_ASPECT_LOD_FXT1(__aspect, __lod) \
_grMipMapHostWHCmp4Bit[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][1]
#define WIDTH_BY_ASPECT_LOD_DXT(__aspect, __lod) \
_grMipMapHostWHDXT[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][0]
#define HEIGHT_BY_ASPECT_LOD_DXT(__aspect, __lod) \
_grMipMapHostWHDXT[G3_ASPECT_TRANSLATE(__aspect)][(__lod)][1]
#if 0 /* KoolSmoky - remove */
GrLOD_t
_g3LodXlat(const GrLOD_t someLOD, const FxBool tBig);
#endif
extern void g3LodBiasPerChip(GrChipID_t tmu, FxU32 tLod);
#if 0 /* KoolSmoky - remove */
extern GrChipID_t MultitextureAndTrilinear(void);
#endif
#define _grTexFloatLODToFixedLOD(value) \
(FxU16)((( int )(( value + .125F ) / .25F)) & 0x003F)
#if 0 /* [dBorca] moved to `gtex.c' */
static GrLOD_t g3LodXlat_base[2] = { GR_LOD_LOG2_256, GR_LOD_LOG2_2048 };
#define _g3LodXlat(someLOD, tBig) \
(g3LodXlat_base[tBig] - someLOD)
#endif
GR_EXT_ENTRY(grTexDownloadTableExt,
void,
(GrChipID_t tmu, GrTexTable_t type, void *data));
#endif /* __FXGLIDE_H__ */