blob: dc8ece59399c1224540f9b0437723ce0994cacf5 [file] [log] [blame]
/* -*- mode: c; c-basic-offset: 3 -*-
*
* Copyright 2000 VA Linux Systems Inc., Fremont, California.
*
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* VA LINUX SYSTEMS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h,v 1.5 2002/02/24 21:51:10 dawes Exp $ */
/*
* New fixes:
* Daniel Borca <dborca@users.sourceforge.net>, 19 Jul 2004
*
* Original rewrite:
* Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
*
*/
#ifndef __TDFX_CONTEXT_H__
#define __TDFX_CONTEXT_H__
#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 "drm.h"
#include "drm_sarea.h"
#include "tdfx_glide.h"
#include "xmlconfig.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
/* Flags for fxMesa->new_state
*/
#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 /* experimental */
/* Flags for fxMesa->dirty
*/
#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_CONSTANT_COLOR 0x00002000
#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
/* Flags for software fallback cases */
/* See correponding strings in tdfx_tris.c */
#define TDFX_FALLBACK_TEXTURE_MAP 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_FALLBACK_DISABLE 0x0800
/* Different Glide vertex layouts
*/
#define TDFX_LAYOUT_TINY 0
#define TDFX_LAYOUT_NOTEX 1
#define TDFX_LAYOUT_SINGLE 2
#define TDFX_LAYOUT_MULTI 3
#define TDFX_LAYOUT_PROJ1 4
#define TDFX_LAYOUT_PROJ2 5
#define TDFX_NUM_LAYOUTS 6
#define TDFX_XY_OFFSET 0
#define TDFX_Z_OFFSET 8
#define TDFX_Q_OFFSET 12
#define TDFX_ARGB_OFFSET 16
#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
/* Flags for buffer clears
*/
#define TDFX_FRONT 0x1
#define TDFX_BACK 0x2
#define TDFX_DEPTH 0x4
#define TDFX_STENCIL 0x8
/*
* Subpixel offsets to adjust Mesa's (true) window coordinates to
* Glide coordinates. We need these to ensure precise rasterization.
* Otherwise, we'll fail a bunch of conformance tests.
*/
#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
/* Including xf86PciInfo.h causes a bunch of errors
*/
#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) )
/*
* The first two macros are to pack 8 bit color
* channel values into a 565 format.
*/
#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))
/*
* The second two macros pack 8 bit color channel values
* into 1555 values.
*/
#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))
/* Used in calls to grColorMaskv()...
*/
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;
/*
* Memory range from startAddr to endAddr-1
*/
typedef struct mem_range {
struct mem_range *next;
FxU32 startAddr, endAddr;
}
tdfxMemRange;
typedef struct {
GLsizei width, height; /* image size */
GLint wScale, hScale; /* scale factors */
GrTextureFormat_t glideFormat; /* Glide image format */
}
tdfxMipMapLevel;
#define TDFX_NUM_TMU 2
typedef struct tdfxTexInfo_t
{
GLboolean isInTM;
GLboolean reloadImages; /* if true, resend images to Glide */
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; /* texcoord scale factor */
GrTexTable_t paltype;
GuTexPalette palette;
GLboolean padded;
}
tdfxTexInfo;
#define TDFX_TEXTURE_DATA(mesaObj) ((tdfxTexInfo *)((mesaObj)->DriverData))
#define TDFX_TEXIMAGE_DATA(mesaImg) ((tdfxMipMapLevel *)((mesaImg)->DriverData))
/*
* This is state which may be shared by several tdfx contexts.
* It hangs off of Mesa's gl_shared_state object (ctx->Shared->DriverData).
*/
struct tdfxSharedState {
GLboolean umaTexMemory;
GLuint totalTexMem[TDFX_NUM_TMU]; /* constant */
GLuint freeTexMem[TDFX_NUM_TMU]; /* changes as we go */
tdfxMemRange *tmPool;
tdfxMemRange *tmFree[TDFX_NUM_TMU];
};
/* ================================================================
* The vertex structures.
*/
/* The size of this union is not of relevence:
*/
typedef struct tdfx_vertex_t {
GLfloat x, y, z; /* Coordinates in screen space */
GLfloat rhw; /* Reciprocal homogeneous w */
GLubyte color[4]; /* Diffuse color */
GLfloat fog;
GLfloat tu0, tv0; /* Texture 0 coordinates */
GLfloat tu1, tv1; /* Texture 1 coordinates */
GLfloat tq0, tq1; /* Texture 0/1 q coords */
unsigned char pspec[4]; /* B, G, R, A [0..255] */
float psize; /* point size */
long pad[16 - 14]; /* ensure 64b structure */
} tdfxVertex, *tdfxVertexPtr;
/* ================================================================
*
* We want to keep a mirror of the Glide function call parameters so we
* can avoid updating our state too often.
*
* Each of these broad groups will typically have a new state flag
* associated with it, and will be updated together. The individual
* Glide function calls each have a dirty flag and will only be called
* when absolutely necessary.
*/
/* for grTexSource() */
struct tdfx_texsource {
FxU32 StartAddress;
FxU32 EvenOdd;
GrTexInfo *Info;
};
/* Texture object params */
struct tdfx_texparams {
GrTextureClampMode_t sClamp;
GrTextureClampMode_t tClamp;
GrTextureFilterMode_t minFilt;
GrTextureFilterMode_t magFilt;
GrMipMapMode_t mmMode;
FxBool LODblend;
GLfloat LodBias;
};
/* for grTexDownloadTable() texture palettes */
struct tdfx_texpalette {
GrTexTable_t Type;
void *Data;
};
/* for Voodoo3/Banshee's grColorCombine() and grAlphaCombine() */
struct tdfx_combine {
GrCombineFunction_t Function; /* Combine function */
GrCombineFactor_t Factor; /* Combine scale factor */
GrCombineLocal_t Local; /* Local combine source */
GrCombineOther_t Other; /* Other combine source */
FxBool Invert; /* Combine result inversion flag */
};
/* for Voodoo3's grTexCombine() */
struct tdfx_texcombine {
GrCombineFunction_t FunctionRGB;
GrCombineFactor_t FactorRGB;
GrCombineFunction_t FunctionAlpha;
GrCombineFactor_t FactorAlpha;
FxBool InvertRGB;
FxBool InvertAlpha;
};
/* for Voodoo5's grColorCombineExt() */
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;
};
/* for Voodoo5's grAlphaCombineExt() */
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;
};
/* for Voodoo5's grTexColorCombineExt() */
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;
};
/* for Voodoo5's grTexAlphaCombineExt() */
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;
};
/* Voodoo5's texture combine environment */
struct tdfx_texcombine_ext {
struct tdfx_alpha_texenv Alpha;
struct tdfx_color_texenv Color;
GrColor_t EnvColor;
};
/* Used to track changes between Glide's state and Mesa's */
struct tdfx_texstate {
GLuint Enabled[2]; /* values ala ctx->Texture.Unit[i]._ReallyEnabled */
GLenum EnvMode[TDFX_NUM_TMU]; /* index is Glide index, not OpenGL */
GLenum TexFormat[TDFX_NUM_TMU]; /* index is Glide index, not OpenGL */
};
struct tdfx_color {
GrColor_t ClearColor; /* Buffer clear color value */
GrAlpha_t ClearAlpha; /* Buffer clear alpha value */
FxBool ColorMask[4]; /* Per-channel write enable flags */
GrColor_t MonoColor; /* Constant color value */
/* Alpha testing */
GrCmpFnc_t AlphaFunc; /* Alpha test function */
GrAlpha_t AlphaRef; /* Alpha ref value in range [0,255] */
/* Blending */
GrAlphaBlendFnc_t BlendSrcRGB; /* Blend source RGB factor */
GrAlphaBlendFnc_t BlendDstRGB; /* Blend destination RGB factor */
GrAlphaBlendOp_t BlendEqRGB; /* Blend source RGB op */
GrAlphaBlendFnc_t BlendSrcA; /* Blend source alpha factor */
GrAlphaBlendFnc_t BlendDstA; /* Blend destination alpha factor */
GrAlphaBlendOp_t BlendEqA; /* Blend source alpha op */
GrDitherMode_t Dither; /* Dither enable */
};
struct tdfx_depth {
GrDepthBufferMode_t Mode; /* Fixed-point Z or floating-point W */
FxI32 Bias; /* Polygon offset factor */
GrCmpFnc_t Func; /* Depth test function */
FxU32 Clear; /* Buffer clear value */
FxBool Mask; /* Write enable flag */
};
struct tdfx_stipple {
GrStippleMode_t Mode; /* Stipple enable/disable */
FxU32 Pattern; /* 8x4 Stipple Pattern */
};
struct tdfx_fog {
GrFogMode_t Mode; /* Glide fog mode */
GrColor_t Color; /* Fog color value */
GLenum TableMode; /* GL fog mode currently in table */
GrFog_t *Table; /* Fog value table */
FxFloat Density; /* Density >= 0 */
FxFloat Near; /* Start distance in eye coords */
FxFloat Far; /* End distance in eye coords */
};
struct tdfx_stencil {
GrCmpFnc_t Function; /* Stencil function */
GrStencil_t RefValue; /* Stencil reference value */
GrStencil_t ValueMask; /* Value mask */
GrStencil_t WriteMask; /* Write mask */
GrStencil_t FailFunc; /* Stencil fail function */
GrStencil_t ZFailFunc; /* Stencil pass, depth fail function */
GrStencil_t ZPassFunc; /* Stencil pass, depth pass function */
GrStencil_t Clear; /* Buffer clear value */
};
struct tdfx_scissor {
FxU32 minX, minY; /* Lower left corner */
FxU32 maxX, maxY; /* Upper right corner */
};
struct tdfx_viewport {
GrCoordinateSpaceMode_t Mode; /* Coordinate space */
FxI32 X, Y; /* Position */
FxI32 Width, Height; /* Size */
FxFloat Near, Far; /* Depth buffer range */
};
struct tdfx_glide {
void *State; /* Mirror of internal Glide state */
GrContext_t Context; /* Glide context identifier */
FxI32 Board; /* Current graphics subsystem */
GrColorFormat_t ColorFormat; /* Framebuffer format */
GrOriginLocation_t Origin; /* Location of screen space origin */
FxBool Initialized; /* Glide initialization done? */
FxI32 SwapInterval; /* SwapBuffers interval */
FxI32 MaxPendingSwaps; /* Maximum outstanding SwapBuffers */
FxI32 TextureAlign;
/* Extensions */
FxBool HaveCombineExt; /* COMBINE */
FxBool HaveCommandTransportExt; /* COMMAND_TRANSPORT */
FxBool HaveFogCoordExt; /* FOGCOORD */
FxBool HavePixelExt; /* PIXEXT */
FxBool HaveTextureBufferExt; /* TEXTUREBUFFER */
FxBool HaveTexFmtExt; /* TEXFMT */
FxBool HaveTexUMAExt; /* TEXUMA */
FxBool HaveMirrorExt; /* MIRROR */
FxBool HaveTexus2; /* Texus 2 - FXT1 */
/* Glide library function pointers */
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 );
/* Not used */
#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 );
/* Glide utility functions */
void (*guFogGenerateExp)( GrFog_t *fogtable, float density );
void (*guFogGenerateExp2)( GrFog_t *fogtable, float density );
void (*guFogGenerateLinear)(GrFog_t *fogtable, float nearZ, float farZ );
/* DRI functions */
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, drm_clip_rect_t *pClip );
void (*grDRILostContext)( void );
void (*grDRIImportFifo)( int fifoPtr, int fifoRead );
void (*grDRIInvalidateAll)( void );
void (*grDRIResetSAREA)( void );
void (*grDRIBufferSwap)( FxU32 swapInterval );
/* Glide extensions */
/* PIXEXT extension */
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 );
/* COMBINE extension */
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 );
/* Texus 2 */
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 {
/* Set once and never changed:
*/
GLcontext *glCtx; /* The core Mesa context */
GLuint new_gl_state;
GLuint new_state;
GLuint dirty;
/* Mirror of hardware state, Glide parameters
*/
GLuint tmu_source[TDFX_NUM_TMU];
struct tdfx_texsource TexSource[TDFX_NUM_TMU];
struct tdfx_texparams TexParams[TDFX_NUM_TMU];
struct tdfx_texpalette TexPalette;
/* Voodoo3 texture/color combine state */
struct tdfx_combine ColorCombine;
struct tdfx_combine AlphaCombine;
struct tdfx_texcombine TexCombine[TDFX_NUM_TMU];
/* Voodoo5 texture/color combine state */
struct tdfx_combine_color_ext ColorCombineExt;
struct tdfx_combine_alpha_ext AlphaCombineExt;
struct tdfx_texcombine_ext TexCombineExt[TDFX_NUM_TMU];
/* Tracks tex state difference between Glide and Mesa */
struct tdfx_texstate TexState;
GrBuffer_t DrawBuffer; /* Current draw buffer */
GrBuffer_t ReadBuffer; /* Current read buffer */
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;
/* Fallback rasterization functions
*/
tdfx_point_func draw_point;
tdfx_line_func draw_line;
tdfx_tri_func draw_triangle;
/* Variable-size Glide vertex formats
*/
GLuint vertexFormat; /* the current format */
void *layout[TDFX_NUM_LAYOUTS];
tdfxVertex *verts;
GLfloat hw_viewport[16];
GLuint SetupIndex;
GLuint SetupNewInputs;
GLuint RenderIndex;
GLuint Fallback;
GLenum render_primitive; /* what GL thinks */
GLenum raster_primitive; /* what the hardware thinks */
GLfloat sScale0, tScale0;
GLfloat sScale1, tScale1;
GLuint texBindNumber;
GLint tmuSrc;
int screen_width;
int screen_height;
GLboolean haveTwoTMUs; /* True if we have 2 tmu's */
GLboolean haveHwAlpha;
GLboolean haveHwStencil;
GLboolean haveHwStipple;
GLint maxPendingSwapBuffers;
char rendererString[100];
/* stuff added for DRI */
__DRIscreenPrivate *driScreen;
__DRIcontextPrivate *driContext;
/**
* DRI drawable bound to this context for drawing.
*/
__DRIdrawablePrivate *driDrawable;
/**
* DRI drawable bound to this context for reading.
*/
__DRIdrawablePrivate *driReadable;
drm_context_t hHWContext;
drm_hw_lock_t *driHwLock;
int driFd;
tdfxScreenPrivate *fxScreen;
TDFXSAREAPriv *sarea;
/*
* Changes during execution:
*/
int width, height; /* size of window */
int x_offset; /* distance from window left to screen left */
int y_offset; /* distance from window top to screen top */
int y_delta; /* distance from window bottom to screen bottom */
int numClipRects;
drm_clip_rect_t *pClipRects;
GLboolean scissoredClipRects; /* if true, pClipRects is private storage */
GuTexPalette glbPalette; /* global texture palette */
tdfxStats stats;
/* Configuration cache
*/
driOptionCache optionCache;
};
#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]);
/* Color packing utilities
*/
#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 1
#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_DRI 0x04
#define DEBUG_VERBOSE_FALL 0x08
/* conf */
#define FX_COMPRESS_S3TC_AS_FXT1_HACK 1
#define FX_TC_NAPALM 0
#endif /* __TDFX_CONTEXT_H__ */