#ifndef __TDFX_CONTEXT_H__
#define __TDFX_CONTEXT_H__
#ifdef GLX_DIRECT_RENDERING
#include <sys/time.h>
#include "dri_util.h"
#ifdef XFree86Server
#include "GL/xf86glx.h"
#else
#include "glheader.h"
#endif
#if defined(__linux__)
#include <signal.h>
#endif
#include "tdfx_glide.h"
#include "clip.h"
#include "context.h"
#include "macros.h"
#include "matrix.h"
#include "imports.h"
#include "mtypes.h"
#include "tdfx_screen.h"
#define TDFX_TMU0 GR_TMU0
#define TDFX_TMU1 GR_TMU1
#define TDFX_TMU_SPLIT 98
#define TDFX_TMU_BOTH 99
#define TDFX_TMU_NONE 100
#define TDFX_NEW_COLOR 0x0001
#define TDFX_NEW_ALPHA 0x0002
#define TDFX_NEW_DEPTH 0x0004
#define TDFX_NEW_FOG 0x0008
#define TDFX_NEW_STENCIL 0x0010
#define TDFX_NEW_CLIP 0x0020
#define TDFX_NEW_VIEWPORT 0x0040
#define TDFX_NEW_CULL 0x0080
#define TDFX_NEW_GLIDE 0x0100
#define TDFX_NEW_TEXTURE 0x0200
#define TDFX_NEW_CONTEXT 0x0400
#define TDFX_NEW_LINE 0x0800
#define TDFX_NEW_RENDER 0x1000
#define TDFX_NEW_STIPPLE 0x2000
#define TDFX_NEW_TEXTURE_BIND 0x4000
#define TDFX_UPLOAD_COLOR_COMBINE 0x00000001
#define TDFX_UPLOAD_ALPHA_COMBINE 0x00000002
#define TDFX_UPLOAD_RENDER_BUFFER 0x00000004
#define TDFX_UPLOAD_ALPHA_TEST 0x00000008
#define TDFX_UPLOAD_ALPHA_REF 0x00000010
#define TDFX_UPLOAD_BLEND_FUNC 0x00000020
#define TDFX_UPLOAD_DEPTH_MODE 0x00000040
#define TDFX_UPLOAD_DEPTH_BIAS 0x00000080
#define TDFX_UPLOAD_DEPTH_FUNC 0x00000100
#define TDFX_UPLOAD_DEPTH_MASK 0x00000200
#define TDFX_UPLOAD_FOG_MODE 0x00000400
#define TDFX_UPLOAD_FOG_COLOR 0x00000800
#define TDFX_UPLOAD_FOG_TABLE 0x00001000
#define TDFX_UPLOAD_CLIP 0x00002000
#define TDFX_UPLOAD_CULL 0x00004000
#define TDFX_UPLOAD_VERTEX_LAYOUT 0x00008000
#define TDFX_UPLOAD_COLOR_MASK 0x00010000
#define TDFX_UPLOAD_DITHER 0x00040000
#define TDFX_UPLOAD_STENCIL 0x00080000
#define TDFX_UPLOAD_TEXTURE_SOURCE 0x00100000
#define TDFX_UPLOAD_TEXTURE_PARAMS 0x00200000
#define TDFX_UPLOAD_TEXTURE_PALETTE 0x00400000
#define TDFX_UPLOAD_TEXTURE_ENV 0x00800000
#define TDFX_UPLOAD_TEXTURE_IMAGES 0x01000000
#define TDFX_UPLOAD_LINE 0x02000000
#define TDFX_UPLOAD_STIPPLE 0x04000000
#define TDFX_FALLBACK_TEXTURE_1D_3D 0x0001
#define TDFX_FALLBACK_DRAW_BUFFER 0x0002
#define TDFX_FALLBACK_SPECULAR 0x0004
#define TDFX_FALLBACK_STENCIL 0x0008
#define TDFX_FALLBACK_RENDER_MODE 0x0010
#define TDFX_FALLBACK_LOGICOP 0x0020
#define TDFX_FALLBACK_TEXTURE_ENV 0x0040
#define TDFX_FALLBACK_TEXTURE_BORDER 0x0080
#define TDFX_FALLBACK_COLORMASK 0x0100
#define TDFX_FALLBACK_BLEND 0x0200
#define TDFX_FALLBACK_LINE_STIPPLE 0x0400
#define TDFX_LAYOUT_TINY 0
#define TDFX_LAYOUT_NOTEX 1
#define TDFX_LAYOUT_SINGLE 2
#define TDFX_LAYOUT_MULTI 3
#define TDFX_LAYOUT_PROJECT 4
#define TDFX_NUM_LAYOUTS 5
#define TDFX_XY_OFFSET 0
#define TDFX_Z_OFFSET 8
#define TDFX_Q_OFFSET 12
#define TDFX_ARGB_OFFSET 16
#define TDFX_PAD_OFFSET 20
#define TDFX_FOG_OFFSET 20
#define TDFX_ST0_OFFSET 24
#define TDFX_ST1_OFFSET 32
#define TDFX_Q0_OFFSET 40
#define TDFX_Q1_OFFSET 44
#define TDFX_FRONT 0x1
#define TDFX_BACK 0x2
#define TDFX_DEPTH 0x4
#define TDFX_STENCIL 0x8
#define TRI_X_OFFSET ( 0.0F)
#define TRI_Y_OFFSET ( 0.0F)
#define LINE_X_OFFSET ( 0.0F)
#define LINE_Y_OFFSET ( 0.125F)
#define PNT_X_OFFSET ( 0.375F)
#define PNT_Y_OFFSET ( 0.375F)
#define TDFX_DEPTH_BIAS_SCALE 128
#ifndef PCI_CHIP_BANSHEE
#define PCI_CHIP_BANSHEE 0x0003
#define PCI_CHIP_VOODOO3 0x0005
#define PCI_CHIP_VOODOO4 0x0009
#define PCI_CHIP_VOODOO5 0x0009
#endif
#define TDFX_IS_BANSHEE( fxMesa ) \
( fxMesa->fxScreen->deviceID == PCI_CHIP_BANSHEE )
#define TDFX_IS_VOODOO3( fxMesa ) \
( fxMesa->fxScreen->deviceID == PCI_CHIP_VOODOO3 )
#define TDFX_IS_VOODOO4( fxMesa ) \
( fxMesa->fxScreen->deviceID == PCI_CHIP_VOODOO4 )
#define TDFX_IS_VOODOO5( fxMesa ) \
( fxMesa->fxScreen->deviceID == PCI_CHIP_VOODOO5 )
#define TDFX_IS_NAPALM( fxMesa ) \
( (fxMesa->fxScreen->deviceID == PCI_CHIP_VOODOO4) || \
(fxMesa->fxScreen->deviceID == PCI_CHIP_VOODOO5) )
#define PACK_BGRA32(R, G, B, A) \
( (((GLuint) (R)) << 16) | \
(((GLuint) (G)) << 8) | \
(((GLuint) (B)) ) | \
(((GLuint) (A)) << 24) )
#define PACK_RGBA32(R, G, B, A) \
( (((GLuint) (R)) ) | \
(((GLuint) (G)) << 8) | \
(((GLuint) (B)) << 16) | \
(((GLuint) (A)) << 24) )
#define PACK_RGB16(R, G, B) \
((((GLuint) (R) & 0xF8) << 8) | \
(((GLuint) (G) & 0xFC) << 3) | \
(((GLuint) (B) & 0xFF) >> 3))
#define PACK_BGR16(R, G, B) \
((((GLuint) (B) & 0xF8) << 8) | \
(((GLuint) (G) & 0xFC) << 3) | \
(((GLuint) (R) & 0xFF) >> 3))
#define PACK_RGBA16(R, G, B, A) \
(((((GLuint) (A) & 0xFF) > 0) << 15)| \
(((GLuint) (R) & 0xF8) << 7) | \
(((GLuint) (G) & 0xF8) << 2) | \
(((GLuint) (B) & 0xF8) >> 3))
#define PACK_BGRA16(R, G, B, A) \
(((((GLuint) (A) & 0xFF) > 0) << 15)| \
(((GLuint) (B) & 0xF8) << 7) | \
(((GLuint) (G) & 0xF8) << 2) | \
(((GLuint) (R) & 0xF8) >> 3))
extern const GLboolean false4[4];
extern const GLboolean true4[4];
typedef struct tdfx_context tdfxContextRec;
typedef struct tdfx_context *tdfxContextPtr;
typedef struct {
volatile int fifoPtr;
volatile int fifoRead;
volatile int fifoOwner;
volatile int ctxOwner;
volatile int texOwner;
}
TDFXSAREAPriv;
typedef struct {
GLuint swapBuffer;
GLuint reqTexUpload;
GLuint texUpload;
GLuint memTexUpload;
GLuint texSwaps;
} tdfxStats;
typedef struct mem_range {
struct mem_range *next;
FxU32 startAddr, endAddr;
}
tdfxMemRange;
typedef struct {
GLsizei width, height;
GLint wScale, hScale;
GrTextureFormat_t glideFormat;
}
tdfxMipMapLevel;
#define TDFX_NUM_TMU 2
typedef struct tdfxTexInfo_t
{
GLboolean isInTM;
GLboolean reloadImages;
GLuint lastTimeUsed;
FxU32 whichTMU;
GrTexInfo info;
GrAspectRatio_t aspectRatio;
tdfxMemRange *tm[TDFX_NUM_TMU];
GLint minLevel, maxLevel;
GrTextureFilterMode_t minFilt;
GrTextureFilterMode_t magFilt;
GrTextureClampMode_t sClamp;
GrTextureClampMode_t tClamp;
FxBool LODblend;
GrMipMapMode_t mmMode;
GLfloat sScale, tScale;
GuTexPalette palette;
}
tdfxTexInfo;
#define TDFX_TEXTURE_DATA(mesaObj) ((tdfxTexInfo *)((mesaObj)->DriverData))
#define TDFX_TEXIMAGE_DATA(mesaImg) ((tdfxMipMapLevel *)((mesaImg)->DriverData))
struct tdfxSharedState {
GLboolean umaTexMemory;
GLuint totalTexMem[TDFX_NUM_TMU];
GLuint freeTexMem[TDFX_NUM_TMU];
tdfxMemRange *tmPool;
tdfxMemRange *tmFree[TDFX_NUM_TMU];
};
typedef struct {
GLubyte blue;
GLubyte green;
GLubyte red;
GLubyte alpha;
} tdfx_color_t;
typedef struct {
GLfloat x, y, z;
GLfloat rhw;
tdfx_color_t color;
GLuint pad;
GLfloat tu0, tv0;
GLfloat tu1, tv1;
} tdfx_vertex;
typedef struct {
GLfloat x, y, z;
GLfloat rhw;
tdfx_color_t color;
GLuint pad;
GLfloat tu0, tv0;
GLfloat tu1, tv1;
GLfloat tq0, tq1;
} tdfx_ptex_vertex;
typedef struct {
GLfloat x, y, z;
tdfx_color_t color;
} tdfx_tiny_vertex;
union tdfx_vertex_t {
tdfx_vertex v;
tdfx_tiny_vertex tv;
tdfx_ptex_vertex pv;
GLfloat f[16];
GLuint ui[16];
GLubyte ub4[16][4];
};
typedef union tdfx_vertex_t tdfxVertex, *tdfxVertexPtr;
struct tdfx_texsource {
FxU32 StartAddress;
FxU32 EvenOdd;
GrTexInfo *Info;
};
struct tdfx_texparams {
GrTextureClampMode_t sClamp;
GrTextureClampMode_t tClamp;
GrTextureFilterMode_t minFilt;
GrTextureFilterMode_t magFilt;
GrMipMapMode_t mmMode;
FxBool LODblend;
GLfloat LodBias;
};
struct tdfx_texpalette {
GrTexTable_t Type;
void *Data;
};
struct tdfx_combine {
GrCombineFunction_t Function;
GrCombineFactor_t Factor;
GrCombineLocal_t Local;
GrCombineOther_t Other;
FxBool Invert;
};
struct tdfx_texcombine {
GrCombineFunction_t FunctionRGB;
GrCombineFactor_t FactorRGB;
GrCombineFunction_t FunctionAlpha;
GrCombineFactor_t FactorAlpha;
FxBool InvertRGB;
FxBool InvertAlpha;
};
struct tdfx_combine_color_ext {
GrCCUColor_t SourceA;
GrCombineMode_t ModeA;
GrCCUColor_t SourceB;
GrCombineMode_t ModeB;
GrCCUColor_t SourceC;
FxBool InvertC;
GrCCUColor_t SourceD;
FxBool InvertD;
FxU32 Shift;
FxBool Invert;
};
struct tdfx_combine_alpha_ext {
GrACUColor_t SourceA;
GrCombineMode_t ModeA;
GrACUColor_t SourceB;
GrCombineMode_t ModeB;
GrACUColor_t SourceC;
FxBool InvertC;
GrACUColor_t SourceD;
FxBool InvertD;
FxU32 Shift;
FxBool Invert;
};
struct tdfx_color_texenv {
GrTCCUColor_t SourceA;
GrCombineMode_t ModeA;
GrTCCUColor_t SourceB;
GrCombineMode_t ModeB;
GrTCCUColor_t SourceC;
FxBool InvertC;
GrTCCUColor_t SourceD;
FxBool InvertD;
FxU32 Shift;
FxBool Invert;
};
struct tdfx_alpha_texenv {
GrTACUColor_t SourceA;
GrCombineMode_t ModeA;
GrTACUColor_t SourceB;
GrCombineMode_t ModeB;
GrTACUColor_t SourceC;
FxBool InvertC;
GrTCCUColor_t SourceD;
FxBool InvertD;
FxU32 Shift;
FxBool Invert;
};
struct tdfx_texcombine_ext {
struct tdfx_alpha_texenv Alpha;
struct tdfx_color_texenv Color;
GrColor_t EnvColor;
};
struct tdfx_texstate {
GLuint Enabled[2];
GLenum EnvMode[TDFX_NUM_TMU];
GLenum TexFormat[TDFX_NUM_TMU];
};
struct tdfx_color {
GrColor_t ClearColor;
GrAlpha_t ClearAlpha;
FxBool ColorMask[4];
GrColor_t MonoColor;
GrCmpFnc_t AlphaFunc;
GrAlpha_t AlphaRef;
GrAlphaBlendFnc_t BlendSrcRGB;
GrAlphaBlendFnc_t BlendDstRGB;
GrAlphaBlendFnc_t BlendSrcA;
GrAlphaBlendFnc_t BlendDstA;
GrDitherMode_t Dither;
};
struct tdfx_depth {
GrDepthBufferMode_t Mode;
FxI32 Bias;
GrCmpFnc_t Func;
FxU32 Clear;
FxBool Mask;
};
struct tdfx_stipple {
GrStippleMode_t Mode;
FxU32 Pattern;
};
struct tdfx_fog {
GrFogMode_t Mode;
GrColor_t Color;
GLenum TableMode;
GrFog_t *Table;
FxFloat Density;
FxFloat Near;
FxFloat Far;
};
struct tdfx_stencil {
GrCmpFnc_t Function;
GrStencil_t RefValue;
GrStencil_t ValueMask;
GrStencil_t WriteMask;
GrStencil_t FailFunc;
GrStencil_t ZFailFunc;
GrStencil_t ZPassFunc;
GrStencil_t Clear;
};
struct tdfx_scissor {
FxU32 minX, minY;
FxU32 maxX, maxY;
};
struct tdfx_viewport {
GrCoordinateSpaceMode_t Mode;
FxI32 X, Y;
FxI32 Width, Height;
FxFloat Near, Far;
};
struct tdfx_glide {
void *State;
GrContext_t Context;
FxI32 Board;
GrColorFormat_t ColorFormat;
GrOriginLocation_t Origin;
FxBool Initialized;
FxI32 SwapInterval;
FxI32 MaxPendingSwaps;
FxI32 TextureAlign;
FxBool HaveCombineExt;
FxBool HaveCommandTransportExt;
FxBool HaveFogCoordExt;
FxBool HavePixelExt;
FxBool HaveTextureBufferExt;
FxBool HaveTexFmtExt;
FxBool HaveTexUMAExt;
FxBool HaveTexus2;
void (*grDrawPoint)( const void *pt );
void (*grDrawLine)( const void *v1, const void *v2 );
void (*grDrawTriangle)( const void *a, const void *b, const void *c );
void (*grVertexLayout)(FxU32 param, FxI32 offset, FxU32 mode);
void (*grDrawVertexArray)(FxU32 mode, FxU32 Count, void *pointers);
void (*grDrawVertexArrayContiguous)(FxU32 mode, FxU32 Count,
void *pointers, FxU32 stride);
void (*grBufferClear)( GrColor_t color, GrAlpha_t alpha, FxU32 depth );
void (*grBufferSwap)( FxU32 swap_interval );
void (*grRenderBuffer)( GrBuffer_t buffer );
void (*grErrorSetCallback)( GrErrorCallbackFnc_t fnc );
void (*grFinish)(void);
void (*grFlush)(void);
GrContext_t (*grSstWinOpen)(FxU32 hWnd,
GrScreenResolution_t screen_resolution,
GrScreenRefresh_t refresh_rate,
GrColorFormat_t color_format,
GrOriginLocation_t origin_location,
int nColBuffers,
int nAuxBuffers);
void (*grSstWinClose)( GrContext_t context );
#if 0
void (*grSetNumPendingBuffers)(FxI32 NumPendingBuffers);
#endif
void (*grSelectContext)( GrContext_t context );
void (*grSstOrigin)(GrOriginLocation_t origin);
void (*grSstSelect)( int which_sst );
void (*grAlphaBlendFunction)(GrAlphaBlendFnc_t rgb_sf,
GrAlphaBlendFnc_t rgb_df,
GrAlphaBlendFnc_t alpha_sf,
GrAlphaBlendFnc_t alpha_df);
void (*grAlphaCombine)(GrCombineFunction_t function,
GrCombineFactor_t factor,
GrCombineLocal_t local, GrCombineOther_t other,
FxBool invert);
void (*grAlphaControlsITRGBLighting)( FxBool enable );
void (*grAlphaTestFunction)( GrCmpFnc_t function );
void (*grAlphaTestReferenceValue)( GrAlpha_t value );
void (*grChromakeyMode)( GrChromakeyMode_t mode );
void (*grChromakeyValue)( GrColor_t value );
void (*grClipWindow)( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy );
void (*grColorCombine)( GrCombineFunction_t function,
GrCombineFactor_t factor,
GrCombineLocal_t local,
GrCombineOther_t other,
FxBool invert );
void (*grColorMask)( FxBool rgb, FxBool a );
void (*grCullMode)( GrCullMode_t mode );
void (*grConstantColorValue)( GrColor_t value );
void (*grDepthBiasLevel)( FxI32 level );
void (*grDepthBufferFunction)( GrCmpFnc_t function );
void (*grDepthBufferMode)( GrDepthBufferMode_t mode );
void (*grDepthMask)( FxBool mask );
void (*grDisableAllEffects)( void );
void (*grDitherMode)( GrDitherMode_t mode );
void (*grFogColorValue)( GrColor_t fogcolor );
void (*grFogMode)( GrFogMode_t mode );
void (*grFogTable)( const GrFog_t ft[] );
void (*grLoadGammaTable)( FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue);
void (*grSplash)(float x, float y, float width, float height, FxU32 frame);
FxU32 (*grGet)( FxU32 pname, FxU32 plength, FxI32 *params );
const char * (*grGetString)( FxU32 pname );
FxI32 (*grQueryResolutions)( const GrResolution *resTemplate,
GrResolution *output );
FxBool (*grReset)( FxU32 what );
GrProc (*grGetProcAddress)( char *procName );
void (*grEnable)( GrEnableMode_t mode );
void (*grDisable)( GrEnableMode_t mode );
void (*grCoordinateSpace)( GrCoordinateSpaceMode_t mode );
void (*grDepthRange)( FxFloat n, FxFloat f );
void (*grStippleMode)( GrStippleMode_t mode );
void (*grStipplePattern)( GrStipplePattern_t mode );
void (*grViewport)( FxI32 x, FxI32 y, FxI32 width, FxI32 height );
FxU32 (*grTexCalcMemRequired)(GrLOD_t lodmin, GrLOD_t lodmax,
GrAspectRatio_t aspect, GrTextureFormat_t fmt);
FxU32 (*grTexTextureMemRequired)( FxU32 evenOdd, GrTexInfo *info );
FxU32 (*grTexMinAddress)( GrChipID_t tmu );
FxU32 (*grTexMaxAddress)( GrChipID_t tmu );
void (*grTexNCCTable)( GrNCCTable_t table );
void (*grTexSource)( GrChipID_t tmu, FxU32 startAddress,
FxU32 evenOdd, GrTexInfo *info );
void (*grTexClampMode)( GrChipID_t tmu,
GrTextureClampMode_t s_clampmode,
GrTextureClampMode_t t_clampmode );
void (*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);
void (*grTexDetailControl)( GrChipID_t tmu, int lod_bias,
FxU8 detail_scale, float detail_max );
void (*grTexFilterMode)( GrChipID_t tmu,
GrTextureFilterMode_t minfilter_mode,
GrTextureFilterMode_t magfilter_mode );
void (*grTexLodBiasValue)(GrChipID_t tmu, float bias );
void (*grTexDownloadMipMap)( GrChipID_t tmu, FxU32 startAddress,
FxU32 evenOdd, GrTexInfo *info );
void (*grTexDownloadMipMapLevel)( GrChipID_t tmu,
FxU32 startAddress,
GrLOD_t thisLod,
GrLOD_t largeLod,
GrAspectRatio_t aspectRatio,
GrTextureFormat_t format,
FxU32 evenOdd,
void *data );
FxBool (*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 );
void (*grTexDownloadTable)( GrTexTable_t type, void *data );
void (*grTexDownloadTablePartial)( GrTexTable_t type,
void *data, int start, int end );
void (*grTexMipMapMode)( GrChipID_t tmu, GrMipMapMode_t mode,
FxBool lodBlend );
void (*grTexMultibase)( GrChipID_t tmu, FxBool enable );
void (*grTexMultibaseAddress)( GrChipID_t tmu,
GrTexBaseRange_t range,
FxU32 startAddress,
FxU32 evenOdd,
GrTexInfo *info );
FxBool (*grLfbLock)( GrLock_t type, GrBuffer_t buffer,
GrLfbWriteMode_t writeMode,
GrOriginLocation_t origin, FxBool pixelPipeline,
GrLfbInfo_t *info );
FxBool (*grLfbUnlock)( GrLock_t type, GrBuffer_t buffer );
void (*grLfbConstantAlpha)( GrAlpha_t alpha );
void (*grLfbConstantDepth)( FxU32 depth );
void (*grLfbWriteColorSwizzle)(FxBool swizzleBytes, FxBool swapWords);
void (*grLfbWriteColorFormat)(GrColorFormat_t colorFormat);
FxBool (*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 );
FxBool (*grLfbReadRegion)( GrBuffer_t src_buffer,
FxU32 src_x, FxU32 src_y,
FxU32 src_width, FxU32 src_height,
FxU32 dst_stride, void *dst_data );
void (*grGlideInit)( void );
void (*grGlideShutdown)( void );
void (*grGlideGetState)( void *state );
void (*grGlideSetState)( const void *state );
void (*grGlideGetVertexLayout)( void *layout );
void (*grGlideSetVertexLayout)( const void *layout );
void (*guFogGenerateExp)( GrFog_t *fogtable, float density );
void (*guFogGenerateExp2)( GrFog_t *fogtable, float density );
void (*guFogGenerateLinear)(GrFog_t *fogtable, float nearZ, float farZ );
void (*grDRIOpen)( char *pFB, char *pRegs, int deviceID,
int width, int height,
int mem, int cpp, int stride,
int fifoOffset, int fifoSize,
int fbOffset, int backOffset, int depthOffset,
int textureOffset, int textureSize,
volatile int *fifoPtr, volatile int *fifoRead );
void (*grDRIPosition)( int x, int y, int w, int h,
int numClip, XF86DRIClipRectPtr pClip );
void (*grDRILostContext)( void );
void (*grDRIImportFifo)( int fifoPtr, int fifoRead );
void (*grDRIInvalidateAll)( void );
void (*grDRIResetSAREA)( void );
void (*grDRIBufferSwap)( FxU32 swapInterval );
void (*grStencilFunc)( GrCmpFnc_t func, GrStencil_t ref, GrStencil_t mask );
void (*grStencilMask)( GrStencil_t mask );
void (*grStencilOp)( GrStencilOp_t fail, GrStencilOp_t zfail,
GrStencilOp_t zpass );
void (*grBufferClearExt)( GrColor_t color, GrAlpha_t alpha,
FxU32 depth, GrStencil_t stencil );
void (*grColorMaskExt)( FxBool r, FxBool g, FxBool b, FxBool a );
void (*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 (*grTexColorCombineExt)( FxU32 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 (*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 (*grTexAlphaCombineExt)( FxU32 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 (*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 (*grConstantColorValueExt)( FxU32 tmu, GrColor_t value );
void (*txImgQuantize)( void *xxx_unknown_arguments );
void (*txImgDequantizeFXT1)( void *txMip, void *pxMip );
void (*txErrorSetCallback)( void *fnc );
};
typedef void (*tdfx_tri_func)( tdfxContextPtr, tdfxVertex *, tdfxVertex *,
tdfxVertex * );
typedef void (*tdfx_line_func)( tdfxContextPtr, tdfxVertex *, tdfxVertex * );
typedef void (*tdfx_point_func)( tdfxContextPtr, tdfxVertex * );
struct tdfx_context {
GLcontext *glCtx;
GLuint new_gl_state;
GLuint new_state;
GLuint dirty;
struct tdfx_texsource TexSource[TDFX_NUM_TMU];
struct tdfx_texparams TexParams[TDFX_NUM_TMU];
struct tdfx_texpalette TexPalette;
struct tdfx_combine ColorCombine;
struct tdfx_combine AlphaCombine;
struct tdfx_texcombine TexCombine[TDFX_NUM_TMU];
struct tdfx_combine_color_ext ColorCombineExt;
struct tdfx_combine_alpha_ext AlphaCombineExt;
struct tdfx_texcombine_ext TexCombineExt[TDFX_NUM_TMU];
struct tdfx_texstate TexState;
GrBuffer_t DrawBuffer;
GrBuffer_t ReadBuffer;
struct tdfx_color Color;
struct tdfx_depth Depth;
struct tdfx_fog Fog;
struct tdfx_stencil Stencil;
struct tdfx_scissor Scissor;
struct tdfx_viewport Viewport;
struct tdfx_stipple Stipple;
GrCullMode_t CullMode;
struct tdfx_glide Glide;
struct gl_client_array UbyteColor;
tdfx_point_func draw_point;
tdfx_line_func draw_line;
tdfx_tri_func draw_triangle;
GLuint vertexFormat;
GLuint vertex_stride_shift;
void *layout[TDFX_NUM_LAYOUTS];
GLubyte *verts;
GLfloat hw_viewport[16];
GLuint SetupIndex;
GLuint SetupNewInputs;
GLuint RenderIndex;
GLuint Fallback;
GLenum render_primitive;
GLenum raster_primitive;
GLfloat sScale0, tScale0;
GLfloat sScale1, tScale1;
GLuint texBindNumber;
GLint tmuSrc;
int screen_width;
int screen_height;
GLboolean haveTwoTMUs;
GLboolean haveHwStencil;
GLboolean haveHwStipple;
GLint maxPendingSwapBuffers;
char rendererString[100];
__DRIscreenPrivate *driScreen;
__DRIcontextPrivate *driContext;
__DRIdrawablePrivate *driDrawable;
drmContext hHWContext;
drmLock *driHwLock;
int driFd;
tdfxScreenPrivate *fxScreen;
TDFXSAREAPriv *sarea;
int width, height;
int x_offset;
int y_offset;
int y_delta;
int numClipRects;
XF86DRIClipRectPtr pClipRects;
GLboolean scissoredClipRects;
GuTexPalette glbPalette;
tdfxStats stats;
GLboolean debugFallbacks;
};
#define TDFX_CONTEXT(ctx) ((tdfxContextPtr)((ctx)->DriverCtx))
extern GLboolean
tdfxCreateContext( const __GLcontextModes *mesaVis,
__DRIcontextPrivate *driContextPriv,
void *sharedContextPrivate );
extern void
tdfxDestroyContext( __DRIcontextPrivate *driContextPriv );
extern GLboolean
tdfxUnbindContext( __DRIcontextPrivate *driContextPriv );
extern GLboolean
tdfxMakeCurrent( __DRIcontextPrivate *driContextPriv,
__DRIdrawablePrivate *driDrawPriv,
__DRIdrawablePrivate *driReadPriv );
extern GLboolean
tdfxInitGlide( tdfxContextPtr tmesa );
extern void
FX_grColorMaskv(GLcontext *ctx, const GLboolean rgba[4]);
extern void
FX_grColorMaskv_NoLock(GLcontext *ctx, const GLboolean rgba[4]);
#define TDFXPACKCOLOR332( r, g, b ) \
(((b) & 0xe0) | (((g) & 0xe0) >> 3) | (((r) & 0xc0) >> 6))
#define TDFXPACKCOLOR1555( r, g, b, a ) \
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
((a) ? 0x8000 : 0))
#define TDFXPACKCOLOR565( r, g, b ) \
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
#define TDFXPACKCOLOR888( r, g, b ) \
(((b) << 16) | ((g) << 8) | (r))
#define TDFXPACKCOLOR8888( r, g, b, a ) \
(((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define TDFXPACKCOLOR4444( r, g, b, a ) \
((((a) & 0xf0) << 8) | (((b) & 0xf0) << 4) | ((g) & 0xf0) | ((r) >> 4))
static __inline__ GrColor_t tdfxPackColor( GLuint cpp,
GLubyte r, GLubyte g,
GLubyte b, GLubyte a )
{
switch ( cpp ) {
case 2:
return TDFXPACKCOLOR565( r, g, b );
case 4:
return TDFXPACKCOLOR8888( r, g, b, a );
default:
return 0;
}
}
#define DO_DEBUG 0
#if DO_DEBUG
extern int TDFX_DEBUG;
#else
#define TDFX_DEBUG 0
#endif
#define DEBUG_ALWAYS_SYNC 0x01
#define DEBUG_VERBOSE_API 0x02
#define DEBUG_VERBOSE_MSG 0x04
#define DEBUG_VERBOSE_LRU 0x08
#define DEBUG_VERBOSE_DRI 0x10
#define DEBUG_VERBOSE_IOCTL 0x20
#define DEBUG_VERBOSE_2D 0x40
#endif
#endif