X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fglide%2Ffxdrv.h;h=bee10de2f49088f35ac6af025cb9ce3e3e96fbfa;hb=06d3732a9094030fc33120f16f162e0d405f132c;hp=f708a279b9fada39305d0a727b457b891b1a7d7f;hpb=dbd1e2b5990a3689bf718296c57c14fc3ba38db5;p=mesa.git diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h index f708a279b9f..bee10de2f49 100644 --- a/src/mesa/drivers/glide/fxdrv.h +++ b/src/mesa/drivers/glide/fxdrv.h @@ -1,9 +1,8 @@ - /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 4.0 * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -21,26 +20,19 @@ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * - * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the - * terms stated above. - * - * Thank you for your contribution, David! - * - * Please make note of the above copyright/license statement. If you - * contributed code or bug fixes to this code under the previous (GNU - * Library) license and object to the new license, your code will be - * removed at your request. Please see the Mesa docs/COPYRIGHT file - * for more information. - * - * Additional Mesa/3Dfx driver developers: - * Daryll Strauss - * Keith Whitwell - * - * See fxapi.h for more revision/author details. */ +/* Authors: + * David Bucciarelli + * Brian Paul + * Daryll Strauss + * Keith Whitwell + * Daniel Borca + * Hiroshi Morii + */ + +/* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */ + #ifndef FXDRV_H #define FXDRV_H @@ -56,30 +48,19 @@ #include #endif -#include "context.h" -#include "macros.h" -#include "matrix.h" -#include "mem.h" -#include "texture.h" -#include "mtypes.h" +#include "main/context.h" +#include "main/imports.h" +#include "main/macros.h" +#include "main/matrix.h" +#include "main/mtypes.h" #include "GL/fxmesa.h" #include "fxglidew.h" #include "math/m_vector.h" -/* use gl/gl.h GLAPI/GLAPIENTRY/GLCALLBACK in place of - * WINGDIAPI/APIENTRY/CALLBACK, these are defined in mesa gl/gl.h - - * tjump@spgs.com - */ - - - -extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); -#if defined(MESA_DEBUG) && 0 -#define grDrawTriangle fx_sanity_triangle -#endif +#define COPY_FLOAT(dst, src) (dst) = (src) /* Define some shorter names for these things. */ @@ -88,11 +69,6 @@ extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); #define ZCOORD GR_VERTEX_OOZ_OFFSET #define OOWCOORD GR_VERTEX_OOW_OFFSET -#define RCOORD GR_VERTEX_R_OFFSET -#define GCOORD GR_VERTEX_G_OFFSET -#define BCOORD GR_VERTEX_B_OFFSET -#define ACOORD GR_VERTEX_A_OFFSET - #define S0COORD GR_VERTEX_SOW_TMU0_OFFSET #define T0COORD GR_VERTEX_TOW_TMU0_OFFSET #define S1COORD GR_VERTEX_SOW_TMU1_OFFSET @@ -100,34 +76,6 @@ extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); -#define CLIP_XCOORD 0 /* normal place */ -#define CLIP_YCOROD 1 /* normal place */ -#define CLIP_ZCOORD 2 /* GR_VERTEX_Z_OFFSET */ -#define CLIP_WCOORD 3 /* GR_VERTEX_R_OFFSET */ -#define CLIP_GCOORD 4 /* normal place */ -#define CLIP_BCOORD 5 /* normal place */ -#define CLIP_RCOORD 6 /* GR_VERTEX_OOZ_OFFSET */ -#define CLIP_ACOORD 7 /* normal place */ - - - -/* Should have size == 16 * sizeof(float). - */ -typedef union { - GrVertex v; - GLfloat f[16]; - GLuint ui[16]; -} fxVertex; - - -#if defined(FXMESA_USE_ARGB) -#define FXCOLOR4( c ) ( \ - ( ((unsigned int)(c[3]))<<24 ) | \ - ( ((unsigned int)(c[0]))<<16 ) | \ - ( ((unsigned int)(c[1]))<<8 ) | \ - ( (unsigned int)(c[2])) ) - -#else #ifdef __i386__ #define FXCOLOR4( c ) (* (int *)c) #else @@ -137,19 +85,29 @@ typedef union { ( ((unsigned int)(c[1]))<<8 ) | \ ( (unsigned int)(c[0])) ) #endif -#endif +#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 TDFXPACKCOLOR8888( r, g, b, a ) \ + (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)) -/* Mergable items first - */ -#define SETUP_RGBA 0x1 -#define SETUP_TMU0 0x2 -#define SETUP_TMU1 0x4 -#define SETUP_XYZW 0x8 -#define MAX_SETUP 0x10 -#define MAX_MERGABLE 0x8 +/* fastpath flags first + */ +#define SETUP_TMU0 0x1 +#define SETUP_TMU1 0x2 +#define SETUP_RGBA 0x4 +#define SETUP_SNAP 0x8 +#define SETUP_XYZW 0x10 +#define SETUP_PTEX 0x20 +#define SETUP_PSIZ 0x40 +#define SETUP_SPEC 0x80 +#define SETUP_FOGC 0x100 +#define MAX_SETUP 0x200 #define FX_NUM_TMU 2 @@ -199,90 +157,199 @@ typedef union { #define FX_UM_ALPHA_ITERATED 0x04000000 #define FX_UM_ALPHA_CONSTANT 0x08000000 -typedef void (*tfxRenderVBFunc)(GLcontext *); + +/* 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; +}; + /* Memory range from startAddr to endAddr-1 */ -typedef struct MemRange_t { - struct MemRange_t *next; - FxU32 startAddr, endAddr; -} MemRange; +typedef struct MemRange_t +{ + struct MemRange_t *next; + FxU32 startAddr, endAddr; +} +MemRange; + +typedef struct +{ + GLsizei width, height; /* image size */ + GLint wScale, hScale; /* image scale factor */ + GrTextureFormat_t glideFormat; /* Glide image format */ +} +tfxMipMapLevel; + +/* + * TDFX-specific texture object data. This hangs off of the + * struct gl_texture_object DriverData pointer. + */ +typedef struct tfxTexInfo_t +{ + struct tfxTexInfo_t *next; + struct gl_texture_object *tObj; -typedef struct { - GLsizei width, height; /* image size */ - GrTextureFormat_t glideFormat; /* Glide image format */ - unsigned short *data; /* Glide-formated texture image */ -} tfxMipMapLevel; + GLuint lastTimeUsed; + FxU32 whichTMU; + GLboolean isInTM; -typedef struct tfxTexInfo_t { - struct tfxTexInfo *next; - struct gl_texture_object *tObj; + MemRange *tm[FX_NUM_TMU]; - GLuint lastTimeUsed; - FxU32 whichTMU; - GLboolean isInTM; + GLint minLevel, maxLevel; + GLint baseLevelInternalFormat; - tfxMipMapLevel mipmapLevel[MAX_TEXTURE_LEVELS]; + GrTexInfo info; - MemRange *tm[FX_NUM_TMU]; + GrTextureFilterMode_t minFilt; + GrTextureFilterMode_t maxFilt; + FxBool LODblend; - GLint minLevel, maxLevel; - GLint baseLevelInternalFormat; + GrTextureClampMode_t sClamp; + GrTextureClampMode_t tClamp; - GrTexInfo info; + GrMipMapMode_t mmMode; - GrTextureFilterMode_t minFilt; - GrTextureFilterMode_t maxFilt; - FxBool LODblend; + GLfloat sScale, tScale; - GrTextureClampMode_t sClamp; - GrTextureClampMode_t tClamp; + GrTexTable_t paltype; + GuTexPalette palette; - GrMipMapMode_t mmMode; + GLboolean fixedPalette; + GLboolean validated; - GLfloat sScale, tScale; - GLint int_sScale, int_tScale; /* x86 floating point trick for - * multiplication by powers of 2. - * Used in fxfasttmp.h - */ + GLboolean padded; +} +tfxTexInfo; - GuTexPalette palette; +typedef struct +{ + GLuint swapBuffer; + GLuint reqTexUpload; + GLuint texUpload; + GLuint memTexUpload; +} +tfxStats; - GLboolean fixedPalette; - GLboolean validated; -} tfxTexInfo; -typedef struct { - GLuint swapBuffer; - GLuint reqTexUpload; - GLuint texUpload; - GLuint memTexUpload; -} tfxStats; +typedef struct +{ + /* Alpha test */ + GLboolean alphaTestEnabled; + GrCmpFnc_t alphaTestFunc; + GLfloat alphaTestRefValue; -typedef struct { - /* Alpha test */ + /* Blend function */ - GLboolean alphaTestEnabled; - GrCmpFnc_t alphaTestFunc; - GrAlpha_t alphaTestRefValue; + GLboolean blendEnabled; + GrAlphaBlendFnc_t blendSrcFuncRGB; + GrAlphaBlendFnc_t blendDstFuncRGB; + GrAlphaBlendFnc_t blendSrcFuncAlpha; + GrAlphaBlendFnc_t blendDstFuncAlpha; + GrAlphaBlendOp_t blendEqRGB; + GrAlphaBlendOp_t blendEqAlpha; - /* Blend function */ + /* Depth test */ - GLboolean blendEnabled; - GrAlphaBlendFnc_t blendSrcFuncRGB; - GrAlphaBlendFnc_t blendDstFuncRGB; - GrAlphaBlendFnc_t blendSrcFuncAlpha; - GrAlphaBlendFnc_t blendDstFuncAlpha; + GLboolean depthTestEnabled; + GLboolean depthMask; + GrCmpFnc_t depthTestFunc; + FxI32 depthBias; - /* Depth test */ + /* Stencil */ - GLboolean depthTestEnabled; - GLboolean depthMask; - GrCmpFnc_t depthTestFunc; -} tfxUnitsState; + GLboolean stencilEnabled; + GrCmpFnc_t stencilFunction; /* Stencil function */ + GrStencil_t stencilRefValue; /* Stencil reference value */ + GrStencil_t stencilValueMask; /* Value mask */ + GrStencil_t stencilWriteMask; /* Write mask */ + GrCmpFnc_t stencilFailFunc; /* Stencil fail function */ + GrCmpFnc_t stencilZFailFunc; /* Stencil pass, depth fail function */ + GrCmpFnc_t stencilZPassFunc; /* Stencil pass, depth pass function */ + GrStencil_t stencilClear; /* Buffer clear value */ +} +tfxUnitsState; @@ -297,22 +364,16 @@ typedef struct { #define FX_NEW_SCISSOR 0x20 #define FX_NEW_COLOR_MASK 0x40 #define FX_NEW_CULL 0x80 +#define FX_NEW_STENCIL 0x100 -/* FX struct stored in VB->driver_data. - */ -struct tfxMesaVertexBuffer { - GLvector1ui clipped_elements; - fxVertex *verts; - fxVertex *last_vert; - void *vert_store; +#define FX_CONTEXT(ctx) ((fxMesaContext)((ctx)->DriverCtx)) - GLuint size; -}; +#define FX_TEXTURE_DATA(texUnit) fxTMGetTexInfo((texUnit)->_Current) -#define FX_DRIVER_DATA(vb) ((struct tfxMesaVertexBuffer *)((vb)->driver_data)) -#define FX_CONTEXT(ctx) ((fxMesaContext)((ctx)->DriverCtx)) -#define FX_TEXTURE_DATA(t) fxTMGetTexInfo((t)->_Current) +#define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData)) + +#define FX_MIPMAP_DATA(img) ((tfxMipMapLevel *) (img)->DriverData) #define BEGIN_BOARD_LOCK() #define END_BOARD_LOCK() @@ -347,6 +408,7 @@ struct tfxMesaVertexBuffer { _DD_NEW_POINT_SIZE | \ _NEW_LINE) + /* Covers the state referenced by fxDDChooseSetupFunction. */ #define _FX_NEW_SETUP_FUNCTION (_NEW_LIGHT| \ @@ -355,188 +417,239 @@ struct tfxMesaVertexBuffer { _NEW_COLOR) \ -/* These lookup table are used to extract RGB values in [0,255] from - * 16-bit pixel values. - */ -extern GLubyte FX_PixelToR[0x10000]; -extern GLubyte FX_PixelToG[0x10000]; -extern GLubyte FX_PixelToB[0x10000]; - - -typedef void (*fx_tri_func)( GLcontext *, const fxVertex *, const fxVertex *, const fxVertex * ); -typedef void (*fx_line_func)( GLcontext *, const fxVertex *, const fxVertex * ); -typedef void (*fx_point_func)( GLcontext *, const fxVertex * ); -typedef void (*fxRenderEltsFunc)( struct vertex_buffer * ); - -struct tfxMesaContext { - GuTexPalette glbPalette; +/* lookup table for scaling y bit colors up to 8 bits */ +extern GLuint FX_rgb_scale_4[16]; +extern GLuint FX_rgb_scale_5[32]; +extern GLuint FX_rgb_scale_6[64]; - GLcontext *glCtx; /* the core Mesa context */ - GLvisual *glVis; /* describes the color buffer */ - GLframebuffer *glBuffer; /* the ancillary buffers */ +typedef void (*fx_tri_func) (fxMesaContext, GrVertex *, GrVertex *, GrVertex *); +typedef void (*fx_line_func) (fxMesaContext, GrVertex *, GrVertex *); +typedef void (*fx_point_func) (fxMesaContext, GrVertex *); - GLint board; /* the board used for this context */ - GLint width, height; /* size of color buffer */ +struct tfxMesaContext +{ + GrTexTable_t glbPalType; + GuTexPalette glbPalette; - GrBuffer_t currentFB; + GLcontext *glCtx; /* the core Mesa context */ + GLvisual *glVis; /* describes the color buffer */ + GLframebuffer *glBuffer; /* the ancillary buffers */ - GLboolean bgrOrder; - GrColor_t color; - GrColor_t clearC; - GrAlpha_t clearA; - GLuint constColor; - GrCullMode_t cullMode; + GLint board; /* the board used for this context */ + GLint width, height; /* size of color buffer */ - tfxUnitsState unitsState; - tfxUnitsState restoreUnitsState; /* saved during multipass */ + GrBuffer_t currentFB; - GLuint tmu_source[FX_NUM_TMU]; - GLuint tex_dest[MAX_TEXTURE_UNITS]; - GLuint render_index; - GLuint setupindex; - GLuint setupdone; - GLuint stw_hint_state; /* for grHints */ - GLuint is_in_hardware; - GLuint new_state; - GLuint using_fast_path, passes, multipass; + GLboolean bgrOrder; + GrColor_t color; + GrColor_t clearC; + GrAlpha_t clearA; + GLuint constColor; + GrCullMode_t cullMode; - /* Texture Memory Manager Data */ + tfxUnitsState unitsState; + tfxUnitsState restoreUnitsState; /* saved during multipass */ + GLboolean multipass; /* true when drawing intermediate pass */ - GLuint texBindNumber; - GLint tmuSrc; - GLuint lastUnitsMode; - GLuint freeTexMem[FX_NUM_TMU]; - MemRange *tmPool; - MemRange *tmFree[FX_NUM_TMU]; + GLuint new_state; + GLuint new_gl_state; - GLenum fogTableMode; - GLfloat fogDensity; - GLfloat fogStart, fogEnd; - GrFog_t *fogTable; - GLint textureAlign; - - /* Acc. functions */ - - fx_point_func draw_point; - fx_line_func draw_line; - fx_tri_func draw_tri; + /* Texture Memory Manager Data + */ + GLuint texBindNumber; + GLint tmuSrc; + GLuint lastUnitsMode; + GLuint freeTexMem[FX_NUM_TMU]; + MemRange *tmPool; + MemRange *tmFree[FX_NUM_TMU]; + + GLenum fogTableMode; + GLfloat fogDensity; + GLfloat fogStart, fogEnd; + GrFog_t *fogTable; + GLint textureAlign; + GLint textureMaxLod; + + /* Vertex building and storage: + */ + GLuint tmu_source[FX_NUM_TMU]; + GLuint SetupIndex; + GLuint stw_hint_state; /* for grHints */ + GrVertex *verts; + GLboolean snapVertices; /* needed for older Voodoo hardware */ - fxRenderEltsFunc RenderElementsRaw; + /* Rasterization: + */ + GLuint render_index; + GLuint fallback; + GLenum render_primitive; + GLenum raster_primitive; - /* System to turn culling on/off for tris/lines/points. + /* Current rasterization functions */ - fx_point_func initial_point; - fx_line_func initial_line; - fx_tri_func initial_tri; + fx_point_func draw_point; + fx_line_func draw_line; + fx_tri_func draw_tri; - fx_point_func subsequent_point; - fx_line_func subsequent_line; - fx_tri_func subsequent_tri; + /* Keep texture scales somewhere handy: + */ + GLfloat s0scale; + GLfloat s1scale; + GLfloat t0scale; + GLfloat t1scale; GLfloat inv_s0scale; GLfloat inv_s1scale; GLfloat inv_t0scale; GLfloat inv_t1scale; - tfxStats stats; - - void *state; - - /* Options */ - - GLboolean verbose; - GLboolean haveTwoTMUs; /* True if we really have 2 tmu's */ - GLboolean emulateTwoTMUs; /* True if we present 2 tmu's to mesa. */ - GLboolean haveAlphaBuffer; - GLboolean haveZBuffer; - GLboolean haveDoubleBuffer; - GLboolean haveGlobalPaletteTexture; - GLint swapInterval; - GLint maxPendingSwapBuffers; - - FX_GrContext_t glideContext; - - int screen_width; - int screen_height; - int initDone; - int clipMinX; - int clipMaxX; - int clipMinY; - int clipMaxY; + /* Glide stuff + */ + tfxStats stats; + void *state; + + /* Options */ + + GLboolean verbose; + GLboolean haveTwoTMUs; /* True if we really have 2 tmu's */ + GLboolean haveHwAlpha; + GLboolean haveHwStencil; + GLboolean haveZBuffer; + GLboolean haveDoubleBuffer; + GLboolean haveGlobalPaletteTexture; + GLint swapInterval; + GLint maxPendingSwapBuffers; + + GrContext_t glideContext; + + int screen_width; + int screen_height; + int clipMinX; + int clipMaxX; + int clipMinY; + int clipMaxY; + + int colDepth; + GLboolean fsaa; + + /* Glide (per card) capabilities. These get mirrored + * from `glbHWConfig' when creating a new context... + */ + GrSstType type; + FxBool HavePalExt; /* PALETTE6666 */ + FxBool HavePixExt; /* PIXEXT */ + FxBool HaveTexFmt; /* TEXFMT */ + FxBool HaveCmbExt; /* COMBINE */ + FxBool HaveMirExt; /* TEXMIRROR */ + FxBool HaveTexUma; /* TEXUMA */ + FxBool HaveTexus2; /* Texus 2 - FXT1 */ + struct tdfx_glide Glide; + char rendererString[64]; }; -typedef void (*tfxSetupFunc)(struct vertex_buffer *, GLuint, GLuint); - -extern GrHwConfiguration glbHWConfig; -extern int glbCurrentBoard; -extern void fxPrintSetupFlags( const char *msg, GLuint flags ); extern void fxSetupFXUnits(GLcontext *); extern void fxSetupDDPointers(GLcontext *); -extern void fxDDSetupInit(void); -extern void fxDDCvaInit(void); -extern void fxDDTrifuncInit(void); -extern void fxDDFastPathInit(void); +/* fxvb.c: + */ +extern void fxAllocVB(GLcontext * ctx); +extern void fxFreeVB(GLcontext * ctx); +extern void fxPrintSetupFlags(char *msg, GLuint flags ); +extern void fxCheckTexSizes( GLcontext *ctx ); +extern void fxBuildVertices( GLcontext *ctx, GLuint start, GLuint end, + GLuint newinputs ); +extern void fxChooseVertexState( GLcontext *ctx ); + + + -extern void fxDDChooseRenderState( GLcontext *ctx ); -extern tfxSetupFunc fxDDChooseSetupFunction(GLcontext *); +/* fxtrifuncs: + */ +extern void fxDDInitTriFuncs(GLcontext *); +extern void fxDDChooseRenderState(GLcontext * ctx); -extern void fxDDRenderInit(GLcontext *); extern void fxUpdateDDSpanPointers(GLcontext *); extern void fxSetupDDSpanPointers(GLcontext *); -extern void fxPrintTextureData(tfxTexInfo *ti); -extern GLboolean fxDDTexImage2D(GLcontext *ctx, GLenum target, GLint level, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage, - GLboolean *retainInternalCopy); -extern GLboolean fxDDTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLsizei width, GLsizei height, - GLenum format, GLenum type, const GLvoid *pixels, - const struct gl_pixelstore_attrib *packing, - struct gl_texture_object *texObj, - struct gl_texture_image *texImage); -extern GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, - const struct gl_texture_object *texObj, - GLenum *formatOut, GLenum *typeOut, - GLboolean *freeImageOut ); +extern void fxPrintTextureData(tfxTexInfo * ti); + +extern const struct gl_texture_format * +fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, + GLenum srcFormat, GLenum srcType ); +extern void fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, + GLint internalFormat, GLint width, GLint height, + GLint border, GLenum format, GLenum type, + const GLvoid * pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid * pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDCompressedTexImage2D(GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLsizei width, GLsizei height, GLint border, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDCompressedTexSubImage2D(GLcontext *ctx, GLenum target, + GLint level, GLint xoffset, + GLint yoffset, GLsizei width, + GLint height, GLenum format, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDTexImage1D(GLcontext * ctx, GLenum target, GLint level, + GLint internalFormat, GLint width, + GLint border, GLenum format, GLenum type, + const GLvoid * pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint width, + GLenum format, GLenum type, + const GLvoid * pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern GLboolean fxDDTestProxyTexImage (GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLenum format, GLenum type, + GLint width, GLint height, + GLint depth, GLint border); extern void fxDDTexEnv(GLcontext *, GLenum, GLenum, const GLfloat *); extern void fxDDTexParam(GLcontext *, GLenum, struct gl_texture_object *, GLenum, const GLfloat *); extern void fxDDTexBind(GLcontext *, GLenum, struct gl_texture_object *); +extern struct gl_texture_object *fxDDNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ); extern void fxDDTexDel(GLcontext *, struct gl_texture_object *); +extern GLboolean fxDDIsTextureResident(GLcontext *, struct gl_texture_object *); extern void fxDDTexPalette(GLcontext *, struct gl_texture_object *); extern void fxDDTexUseGlbPalette(GLcontext *, GLboolean); extern void fxDDEnable(GLcontext *, GLenum, GLboolean); -extern void fxDDAlphaFunc(GLcontext *, GLenum, GLclampf); -extern void fxDDBlendFunc(GLcontext *, GLenum, GLenum); +extern void fxDDAlphaFunc(GLcontext *, GLenum, GLfloat); +extern void fxDDBlendFuncSeparate(GLcontext *, GLenum, GLenum, GLenum, GLenum); +extern void fxDDBlendEquationSeparate(GLcontext *, GLenum, GLenum); extern void fxDDDepthMask(GLcontext *, GLboolean); extern void fxDDDepthFunc(GLcontext *, GLenum); +extern void fxDDStencilFuncSeparate (GLcontext *ctx, GLenum face, GLenum func, GLint ref, GLuint mask); +extern void fxDDStencilMaskSeparate (GLcontext *ctx, GLenum face, GLuint mask); +extern void fxDDStencilOpSeparate (GLcontext *ctx, GLenum face, GLenum sfail, GLenum zfail, GLenum zpass); -extern void fxDDRegisterVB( struct vertex_buffer *VB ); -extern void fxDDUnregisterVB( struct vertex_buffer *VB ); -extern void fxDDResizeVB( struct vertex_buffer *VB, GLuint size ); - -extern void fxDDPartialRasterSetup( struct vertex_buffer *VB ); - -extern void fxDDDoRasterSetup( struct vertex_buffer *VB ); - -extern void fxDDRegisterPipelineStages( GLcontext *ctx ); - -extern GLboolean fxDDBuildPrecalcPipeline( GLcontext *ctx ); - -extern void fxDDInitExtensions( GLcontext *ctx ); +extern void fxDDInitExtensions(GLcontext * ctx); -#define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData)) extern void fxTMInit(fxMesaContext ctx); extern void fxTMClose(fxMesaContext ctx); extern void fxTMRestoreTextures_NoLock(fxMesaContext ctx); @@ -544,54 +657,117 @@ extern void fxTMMoveInTM(fxMesaContext, struct gl_texture_object *, GLint); extern void fxTMMoveOutTM(fxMesaContext, struct gl_texture_object *); #define fxTMMoveOutTM_NoLock fxTMMoveOutTM extern void fxTMFreeTexture(fxMesaContext, struct gl_texture_object *); -extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *, GLint); -extern void fxTMReloadSubMipMapLevel(fxMesaContext, struct gl_texture_object *, - GLint, GLint, GLint); +extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *, + GLint); +extern void fxTMReloadSubMipMapLevel(fxMesaContext, + struct gl_texture_object *, GLint, GLint, + GLint); +extern int fxTMCheckStartAddr (fxMesaContext fxMesa, GLint tmu, tfxTexInfo *ti); + +extern void fxTexGetFormat(GLcontext *, GLenum, GrTextureFormat_t *, GLint *); /* [koolsmoky] */ -extern void fxTexGetFormat(GLenum, GrTextureFormat_t *, GLint *); extern int fxTexGetInfo(int, int, GrLOD_t *, GrAspectRatio_t *, - float *, float *, int *, int *, int *, int *); + float *, float *, int *, int *); -extern void fxDDScissor( GLcontext *ctx, - GLint x, GLint y, GLsizei w, GLsizei h ); -extern void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ); -extern void fxDDColorMask(GLcontext *ctx, - GLboolean r, GLboolean g, - GLboolean b, GLboolean a ); +extern void fxDDScissor(GLcontext * ctx, + GLint x, GLint y, GLsizei w, GLsizei h); +extern void fxDDFogfv(GLcontext * ctx, GLenum pname, const GLfloat * params); +extern void fxDDColorMask(GLcontext * ctx, + GLboolean r, GLboolean g, GLboolean b, GLboolean a); -extern void fxDDWriteDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLdepth depth[], const GLubyte mask[]); +extern void fxDDWriteDepthSpan(GLcontext * ctx, GLuint n, GLint x, GLint y, + const GLuint depth[], const GLubyte mask[]); -extern void fxDDReadDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y, - GLdepth depth[]); +extern void fxDDReadDepthSpan(GLcontext * ctx, GLuint n, GLint x, GLint y, + GLuint depth[]); -extern void fxDDWriteDepthPixels(GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], - const GLdepth depth[], const GLubyte mask[]); +extern void fxDDWriteDepthPixels(GLcontext * ctx, GLuint n, + const GLint x[], const GLint y[], + const GLuint depth[], const GLubyte mask[]); -extern void fxDDReadDepthPixels(GLcontext *ctx, GLuint n, - const GLint x[], const GLint y[], - GLdepth depth[]); +extern void fxDDReadDepthPixels(GLcontext * ctx, GLuint n, + const GLint x[], const GLint y[], + GLuint depth[]); -extern void fxDDFastPath( struct vertex_buffer *VB ); +extern void fxDDShadeModel(GLcontext * ctx, GLenum mode); -extern void fxDDShadeModel(GLcontext *ctx, GLenum mode); +extern void fxDDCullFace(GLcontext * ctx, GLenum mode); +extern void fxDDFrontFace(GLcontext * ctx, GLenum mode); -extern void fxDDCullFace(GLcontext *ctx, GLenum mode); -extern void fxDDFrontFace(GLcontext *ctx, GLenum mode); +extern void fxPrintRenderState(const char *msg, GLuint state); +extern void fxPrintHintState(const char *msg, GLuint state); -extern void fxPrintRenderState( const char *msg, GLuint state ); -extern void fxPrintHintState( const char *msg, GLuint state ); +extern int fxDDInitFxMesaContext(fxMesaContext fxMesa); +extern void fxDDDestroyFxMesaContext(fxMesaContext fxMesa); -extern void fxDDDoRenderVB( struct vertex_buffer *VB ); -extern int fxDDInitFxMesaContext( fxMesaContext fxMesa ); +extern void fxSetScissorValues(GLcontext * ctx); +extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, + struct gl_texture_object *tObj, GLint where); +extern void fxCheckIsInHardware(GLcontext *ctx); -extern void fxSetScissorValues(GLcontext *ctx); -extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, - struct gl_texture_object *tObj, - GLint where); -extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder); +/* fxsetup: + * semi-private functions + */ +void fxSetupCull (GLcontext * ctx); +void fxSetupScissor (GLcontext * ctx); +void fxSetupColorMask (GLcontext * ctx); +void fxSetupBlend (GLcontext *ctx); +void fxSetupDepthTest (GLcontext *ctx); +void fxSetupTexture (GLcontext *ctx); +void fxSetupStencil (GLcontext *ctx); +void fxSetupStencilFace (GLcontext *ctx, GLint face); + +/* Flags for software fallback cases */ +#define FX_FALLBACK_TEXTURE_MAP 0x0001 +#define FX_FALLBACK_DRAW_BUFFER 0x0002 +#define FX_FALLBACK_SPECULAR 0x0004 +#define FX_FALLBACK_STENCIL 0x0008 +#define FX_FALLBACK_RENDER_MODE 0x0010 +#define FX_FALLBACK_LOGICOP 0x0020 +#define FX_FALLBACK_TEXTURE_ENV 0x0040 +#define FX_FALLBACK_TEXTURE_BORDER 0x0080 +#define FX_FALLBACK_COLORMASK 0x0100 +#define FX_FALLBACK_BLEND 0x0200 +#define FX_FALLBACK_TEXTURE_MULTI 0x0400 + +extern GLuint fx_check_IsInHardware(GLcontext *ctx); + +/*** + *** CNORM: clamp float to [0,1] and map to float in [0,255] + ***/ +#if defined(USE_IEEE) && !defined(DEBUG) +#define IEEE_0996 0x3f7f0000 /* 0.996 or so */ +#define CNORM(N, F) \ + do { \ + fi_type __tmp; \ + __tmp.f = (F); \ + if (__tmp.i < 0) \ + N = 0; \ + else if (__tmp.i >= IEEE_0996) \ + N = 255.0f; \ + else { \ + N = (F) * 255.0f; \ + } \ + } while (0) +#else +#define CNORM(n, f) \ + n = (CLAMP((f), 0.0F, 1.0F) * 255.0F) +#endif + +/* run-time debugging */ +#ifndef FX_DEBUG +#define FX_DEBUG 0 +#endif +#if FX_DEBUG +extern int TDFX_DEBUG; +#else +#define TDFX_DEBUG 0 +#endif + +/* dirty hacks */ +#define FX_RESCALE_BIG_TEXURES_HACK 1 +#define FX_COMPRESS_S3TC_AS_FXT1_HACK 1 #endif