3 * Mesa 3-D graphics library
6 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the
29 * Thank you for your contribution, David!
31 * Please make note of the above copyright/license statement. If you
32 * contributed code or bug fixes to this code under the previous (GNU
33 * Library) license and object to the new license, your code will be
34 * removed at your request. Please see the Mesa docs/COPYRIGHT file
35 * for more information.
37 * Additional Mesa/3Dfx driver developers:
38 * Daryll Strauss <daryll@precisioninsight.com>
39 * Keith Whitwell <keith@precisioninsight.com>
41 * See fxapi.h for more revision/author details.
48 /* If you comment out this define, a variable takes its place, letting
49 * you turn debugging on/off from the debugger.
55 #if defined(__linux__)
66 #include "GL/fxmesa.h"
69 #include "math/m_vector.h"
72 /* Define some shorter names for these things.
74 #define XCOORD GR_VERTEX_X_OFFSET
75 #define YCOORD GR_VERTEX_Y_OFFSET
76 #define ZCOORD GR_VERTEX_OOZ_OFFSET
77 #define OOWCOORD GR_VERTEX_OOW_OFFSET
79 #define RCOORD GR_VERTEX_R_OFFSET
80 #define GCOORD GR_VERTEX_G_OFFSET
81 #define BCOORD GR_VERTEX_B_OFFSET
82 #define ACOORD GR_VERTEX_A_OFFSET
84 #define S0COORD GR_VERTEX_SOW_TMU0_OFFSET
85 #define T0COORD GR_VERTEX_TOW_TMU0_OFFSET
86 #define S1COORD GR_VERTEX_SOW_TMU1_OFFSET
87 #define T1COORD GR_VERTEX_TOW_TMU1_OFFSET
90 extern float gl_ubyte_to_float_255_color_tab
[256];
91 #define UBYTE_COLOR_TO_FLOAT_255_COLOR(c) gl_ubyte_to_float_255_color_tab[c]
92 #define UBYTE_COLOR_TO_FLOAT_255_COLOR2(f,c) \
93 (*(int *)&(f)) = ((int *)gl_ubyte_to_float_255_color_tab)[c]
96 #define LINTERP(T, A, B) ((A) + (T) * ((B) - (A)))
100 /* Should have size == 16 * sizeof(float).
108 /* Used in the fxvtxfmt t&l engine.
113 GLfloat texcoord
[2][2];
115 GLfloat normal
[3]; /* for replay & fallback */
120 typedef void (*vfmt_project_func
)( GLcontext
*ctx
, fxClipVertex
*v
);
121 typedef void (*vfmt_interpolate_func
)( GLfloat t
,
123 const fxClipVertex
*I
,
124 const fxClipVertex
*J
);
128 #if defined(FXMESA_USE_ARGB)
129 #define FXCOLOR4( c ) ( \
130 ( ((unsigned int)(c[3]))<<24 ) | \
131 ( ((unsigned int)(c[0]))<<16 ) | \
132 ( ((unsigned int)(c[1]))<<8 ) | \
133 ( (unsigned int)(c[2])) )
137 #define FXCOLOR4( c ) (* (int *)c)
139 #define FXCOLOR4( c ) ( \
140 ( ((unsigned int)(c[3]))<<24 ) | \
141 ( ((unsigned int)(c[2]))<<16 ) | \
142 ( ((unsigned int)(c[1]))<<8 ) | \
143 ( (unsigned int)(c[0])) )
149 /* fastpath/vtxfmt flags first
151 #define SETUP_TMU0 0x1
152 #define SETUP_TMU1 0x2
153 #define SETUP_RGBA 0x4
154 #define SETUP_SNAP 0x8
155 #define SETUP_XYZW 0x10
156 #define MAX_SETUP 0x20
161 #define FX_TMU0 GR_TMU0
162 #define FX_TMU1 GR_TMU1
163 #define FX_TMU_SPLIT 98
164 #define FX_TMU_BOTH 99
165 #define FX_TMU_NONE 100
167 /* Used for fxMesa->lastUnitsMode */
169 #define FX_UM_NONE 0x00000000
171 #define FX_UM_E0_REPLACE 0x00000001
172 #define FX_UM_E0_MODULATE 0x00000002
173 #define FX_UM_E0_DECAL 0x00000004
174 #define FX_UM_E0_BLEND 0x00000008
175 #define FX_UM_E0_ADD 0x00000010
177 #define FX_UM_E1_REPLACE 0x00000020
178 #define FX_UM_E1_MODULATE 0x00000040
179 #define FX_UM_E1_DECAL 0x00000080
180 #define FX_UM_E1_BLEND 0x00000100
181 #define FX_UM_E1_ADD 0x00000200
183 #define FX_UM_E_ENVMODE 0x000003ff
185 #define FX_UM_E0_ALPHA 0x00001000
186 #define FX_UM_E0_LUMINANCE 0x00002000
187 #define FX_UM_E0_LUMINANCE_ALPHA 0x00004000
188 #define FX_UM_E0_INTENSITY 0x00008000
189 #define FX_UM_E0_RGB 0x00010000
190 #define FX_UM_E0_RGBA 0x00020000
192 #define FX_UM_E1_ALPHA 0x00040000
193 #define FX_UM_E1_LUMINANCE 0x00080000
194 #define FX_UM_E1_LUMINANCE_ALPHA 0x00100000
195 #define FX_UM_E1_INTENSITY 0x00200000
196 #define FX_UM_E1_RGB 0x00400000
197 #define FX_UM_E1_RGBA 0x00800000
199 #define FX_UM_E_IFMT 0x00fff000
201 #define FX_UM_COLOR_ITERATED 0x01000000
202 #define FX_UM_COLOR_CONSTANT 0x02000000
203 #define FX_UM_ALPHA_ITERATED 0x04000000
204 #define FX_UM_ALPHA_CONSTANT 0x08000000
208 Memory range from startAddr to endAddr-1
210 typedef struct MemRange_t
{
211 struct MemRange_t
*next
;
212 FxU32 startAddr
, endAddr
;
216 GLsizei width
, height
; /* image size */
217 GrTextureFormat_t glideFormat
; /* Glide image format */
218 unsigned short *data
; /* Glide-formated texture image */
221 typedef struct tfxTexInfo_t
{
222 struct tfxTexInfo
*next
;
223 struct gl_texture_object
*tObj
;
229 tfxMipMapLevel mipmapLevel
[MAX_TEXTURE_LEVELS
];
231 MemRange
*tm
[FX_NUM_TMU
];
233 GLint minLevel
, maxLevel
;
234 GLint baseLevelInternalFormat
;
238 GrTextureFilterMode_t minFilt
;
239 GrTextureFilterMode_t maxFilt
;
242 GrTextureClampMode_t sClamp
;
243 GrTextureClampMode_t tClamp
;
245 GrMipMapMode_t mmMode
;
247 GLfloat sScale
, tScale
;
248 GLint int_sScale
, int_tScale
; /* x86 floating point trick for
249 * multiplication by powers of 2.
250 * Used in fxfasttmp.h
253 GuTexPalette palette
;
255 GLboolean fixedPalette
;
271 GLboolean alphaTestEnabled
;
272 GrCmpFnc_t alphaTestFunc
;
273 GrAlpha_t alphaTestRefValue
;
277 GLboolean blendEnabled
;
278 GrAlphaBlendFnc_t blendSrcFuncRGB
;
279 GrAlphaBlendFnc_t blendDstFuncRGB
;
280 GrAlphaBlendFnc_t blendSrcFuncAlpha
;
281 GrAlphaBlendFnc_t blendDstFuncAlpha
;
285 GLboolean depthTestEnabled
;
287 GrCmpFnc_t depthTestFunc
;
293 /* Flags for fxMesa->new_state
295 #define FX_NEW_TEXTURING 0x1
296 #define FX_NEW_BLEND 0x2
297 #define FX_NEW_ALPHA 0x4
298 #define FX_NEW_DEPTH 0x8
299 #define FX_NEW_FOG 0x10
300 #define FX_NEW_SCISSOR 0x20
301 #define FX_NEW_COLOR_MASK 0x40
302 #define FX_NEW_CULL 0x80
305 #define FX_CONTEXT(ctx) ((fxMesaContext)((ctx)->DriverCtx))
306 #define FX_TEXTURE_DATA(t) fxTMGetTexInfo((t)->_Current)
308 #define BEGIN_BOARD_LOCK()
309 #define END_BOARD_LOCK()
310 #define BEGIN_CLIP_LOOP()
311 #define END_CLIP_LOOP()
316 /* Covers the state referenced by IsInHardware:
318 #define _FX_NEW_IS_IN_HARDWARE (_NEW_TEXTURE| \
325 /* Covers the state referenced by fxDDChooseRenderState
327 #define _FX_NEW_RENDERSTATE (_FX_NEW_IS_IN_HARDWARE | \
328 _DD_NEW_FLATSHADE | \
329 _DD_NEW_TRI_LIGHT_TWOSIDE| \
330 _DD_NEW_TRI_OFFSET | \
331 _DD_NEW_TRI_UNFILLED | \
332 _DD_NEW_TRI_SMOOTH | \
333 _DD_NEW_TRI_STIPPLE | \
334 _DD_NEW_LINE_SMOOTH | \
335 _DD_NEW_LINE_STIPPLE | \
336 _DD_NEW_LINE_WIDTH | \
337 _DD_NEW_POINT_SMOOTH | \
338 _DD_NEW_POINT_SIZE | \
341 /* Covers the state referenced by fxDDChooseSetupFunction.
343 #define _FX_NEW_SETUP_FUNCTION (_NEW_LIGHT| \
349 /* Covers the state referenced in fxDDCheckVtxfmt.
351 #define _FX_NEW_VTXFMT (_NEW_TEXTURE | \
352 _NEW_TEXTURE_MATRIX | \
357 _TNL_NEW_NEED_EYE_COORDS | \
361 /* These lookup table are used to extract RGB values in [0,255] from
362 * 16-bit pixel values.
364 extern GLubyte FX_PixelToR
[0x10000];
365 extern GLubyte FX_PixelToG
[0x10000];
366 extern GLubyte FX_PixelToB
[0x10000];
369 typedef void (*fx_tri_func
)( GLcontext
*, const fxVertex
*,
370 const fxVertex
*, const fxVertex
* );
371 typedef void (*fx_line_func
)( GLcontext
*, const fxVertex
*, const fxVertex
* );
372 typedef void (*fx_point_func
)( GLcontext
*, const fxVertex
* );
374 struct tfxMesaContext
{
375 GuTexPalette glbPalette
;
377 GLcontext
*glCtx
; /* the core Mesa context */
378 GLvisual
*glVis
; /* describes the color buffer */
379 GLframebuffer
*glBuffer
; /* the ancillary buffers */
381 GLint board
; /* the board used for this context */
382 GLint width
, height
; /* size of color buffer */
384 GrBuffer_t currentFB
;
391 GrCullMode_t cullMode
;
393 tfxUnitsState unitsState
;
394 tfxUnitsState restoreUnitsState
; /* saved during multipass */
399 /* Texture Memory Manager Data
401 GLuint texBindNumber
;
403 GLuint lastUnitsMode
;
404 GLuint freeTexMem
[FX_NUM_TMU
];
406 MemRange
*tmFree
[FX_NUM_TMU
];
410 GLfloat fogStart
, fogEnd
;
414 /* Vertex building and storage:
416 GLuint tmu_source
[FX_NUM_TMU
];
417 GLuint tex_dest
[MAX_TEXTURE_UNITS
];
419 GLuint setup_gone
; /* for multipass */
420 GLuint stw_hint_state
; /* for grHints */
427 GLuint passes
, multipass
;
428 GLuint is_in_hardware
;
430 /* Current rasterization functions
432 fx_point_func draw_point
;
433 fx_line_func draw_line
;
434 fx_tri_func draw_tri
;
436 /* System to turn culling on/off for tris/lines/points.
438 fx_point_func initial_point
;
439 fx_line_func initial_line
;
440 fx_tri_func initial_tri
;
442 fx_point_func subsequent_point
;
443 fx_line_func subsequent_line
;
444 fx_tri_func subsequent_tri
;
446 /* Keep texture scales somewhere handy:
466 GLboolean haveTwoTMUs
; /* True if we really have 2 tmu's */
467 GLboolean emulateTwoTMUs
; /* True if we present 2 tmu's to mesa. */
468 GLboolean haveAlphaBuffer
;
469 GLboolean haveZBuffer
;
470 GLboolean haveDoubleBuffer
;
471 GLboolean haveGlobalPaletteTexture
;
473 GLint maxPendingSwapBuffers
;
475 FX_GrContext_t glideContext
;
487 GLboolean allow_vfmt
;
488 GLvertexformat vtxfmt
;
489 fxClipVertex current
;
490 fxClipVertex
*vert
; /* points into verts[] */
491 void (*fire_on_vertex
)( GLcontext
* );
492 void (*fire_on_end
)( GLcontext
* );
493 void (*fire_on_fallback
)( GLcontext
* );
495 vfmt_project_func project_vertex
;
496 vfmt_interpolate_func interpolate_vertices
;
498 int vtxfmt_fallback_count
;
499 int vtxfmt_installed
;
500 void (*old_begin
)( GLenum
);
504 GLfloat basecolor
[4];
507 /* Projected vertices, fastpath data:
509 GLvector1ui clipped_elements
;
514 typedef void (*tfxSetupFunc
)(GLcontext
*ctx
, GLuint
, GLuint
, GLuint
);
516 extern GrHwConfiguration glbHWConfig
;
517 extern int glbCurrentBoard
;
519 extern void fxSetupFXUnits(GLcontext
*);
520 extern void fxSetupDDPointers(GLcontext
*);
524 extern void fxDDSetupInit(void);
525 extern void fxAllocVB( GLcontext
*ctx
);
526 extern void fxFreeVB( GLcontext
*ctx
);
527 extern void fxPrintSetupFlags( const char *msg
, GLuint flags
);
528 extern void fx_BuildProjVerts( GLcontext
*ctx
,
529 GLuint start
, GLuint count
,
531 extern void fx_validate_BuildProjVerts(GLcontext
*ctx
,
532 GLuint start
, GLuint count
,
537 extern void fxDDTrifuncInit(void);
538 extern void fxDDChooseRenderState( GLcontext
*ctx
);
541 extern void fxUpdateDDSpanPointers(GLcontext
*);
542 extern void fxSetupDDSpanPointers(GLcontext
*);
544 extern void fxPrintTextureData(tfxTexInfo
*ti
);
545 extern GLboolean
fxDDTexImage2D(GLcontext
*ctx
, GLenum target
, GLint level
,
546 GLenum format
, GLenum type
, const GLvoid
*pixels
,
547 const struct gl_pixelstore_attrib
*packing
,
548 struct gl_texture_object
*texObj
,
549 struct gl_texture_image
*texImage
,
550 GLboolean
*retainInternalCopy
);
551 extern GLboolean
fxDDTexSubImage2D(GLcontext
*ctx
, GLenum target
, GLint level
,
552 GLint xoffset
, GLint yoffset
,
553 GLsizei width
, GLsizei height
,
554 GLenum format
, GLenum type
, const GLvoid
*pixels
,
555 const struct gl_pixelstore_attrib
*packing
,
556 struct gl_texture_object
*texObj
,
557 struct gl_texture_image
*texImage
);
558 extern GLvoid
*fxDDGetTexImage(GLcontext
*ctx
, GLenum target
, GLint level
,
559 const struct gl_texture_object
*texObj
,
560 GLenum
*formatOut
, GLenum
*typeOut
,
561 GLboolean
*freeImageOut
);
562 extern void fxDDTexEnv(GLcontext
*, GLenum
, GLenum
, const GLfloat
*);
563 extern void fxDDTexParam(GLcontext
*, GLenum
, struct gl_texture_object
*,
564 GLenum
, const GLfloat
*);
565 extern void fxDDTexBind(GLcontext
*, GLenum
, struct gl_texture_object
*);
566 extern void fxDDTexDel(GLcontext
*, struct gl_texture_object
*);
567 extern void fxDDTexPalette(GLcontext
*, struct gl_texture_object
*);
568 extern void fxDDTexUseGlbPalette(GLcontext
*, GLboolean
);
570 extern void fxDDEnable(GLcontext
*, GLenum
, GLboolean
);
571 extern void fxDDAlphaFunc(GLcontext
*, GLenum
, GLclampf
);
572 extern void fxDDBlendFunc(GLcontext
*, GLenum
, GLenum
);
573 extern void fxDDDepthMask(GLcontext
*, GLboolean
);
574 extern void fxDDDepthFunc(GLcontext
*, GLenum
);
576 extern void fxDDInitExtensions( GLcontext
*ctx
);
578 #define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData))
579 extern void fxTMInit(fxMesaContext ctx
);
580 extern void fxTMClose(fxMesaContext ctx
);
581 extern void fxTMRestoreTextures_NoLock(fxMesaContext ctx
);
582 extern void fxTMMoveInTM(fxMesaContext
, struct gl_texture_object
*, GLint
);
583 extern void fxTMMoveOutTM(fxMesaContext
, struct gl_texture_object
*);
584 #define fxTMMoveOutTM_NoLock fxTMMoveOutTM
585 extern void fxTMFreeTexture(fxMesaContext
, struct gl_texture_object
*);
586 extern void fxTMReloadMipMapLevel(fxMesaContext
, struct gl_texture_object
*, GLint
);
587 extern void fxTMReloadSubMipMapLevel(fxMesaContext
, struct gl_texture_object
*,
588 GLint
, GLint
, GLint
);
590 extern void fxTexGetFormat(GLenum
, GrTextureFormat_t
*, GLint
*);
591 extern int fxTexGetInfo(int, int, GrLOD_t
*, GrAspectRatio_t
*,
592 float *, float *, int *, int *, int *, int *);
594 extern void fxDDScissor( GLcontext
*ctx
,
595 GLint x
, GLint y
, GLsizei w
, GLsizei h
);
596 extern void fxDDFogfv( GLcontext
*ctx
, GLenum pname
, const GLfloat
*params
);
597 extern void fxDDColorMask(GLcontext
*ctx
,
598 GLboolean r
, GLboolean g
,
599 GLboolean b
, GLboolean a
);
601 extern void fxDDWriteDepthSpan(GLcontext
*ctx
, GLuint n
, GLint x
, GLint y
,
602 const GLdepth depth
[], const GLubyte mask
[]);
604 extern void fxDDReadDepthSpan(GLcontext
*ctx
, GLuint n
, GLint x
, GLint y
,
607 extern void fxDDWriteDepthPixels(GLcontext
*ctx
, GLuint n
,
608 const GLint x
[], const GLint y
[],
609 const GLdepth depth
[], const GLubyte mask
[]);
611 extern void fxDDReadDepthPixels(GLcontext
*ctx
, GLuint n
,
612 const GLint x
[], const GLint y
[],
615 extern void fxDDShadeModel(GLcontext
*ctx
, GLenum mode
);
617 extern void fxDDCullFace(GLcontext
*ctx
, GLenum mode
);
618 extern void fxDDFrontFace(GLcontext
*ctx
, GLenum mode
);
620 extern void fxPrintRenderState( const char *msg
, GLuint state
);
621 extern void fxPrintHintState( const char *msg
, GLuint state
);
623 extern int fxDDInitFxMesaContext( fxMesaContext fxMesa
);
624 extern void fxDDDestroyFxMesaContext( fxMesaContext fxMesa
);
629 extern void fxSetScissorValues(GLcontext
*ctx
);
630 extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa
,
631 struct gl_texture_object
*tObj
,
633 extern void fxInitPixelTables(fxMesaContext fxMesa
, GLboolean bgrOrder
);
638 extern void fxDDCheckVtxfmt( GLcontext
*ctx
);
639 extern void fx_update_lighting( GLcontext
*ctx
);
640 extern void fxDDInitVtxfmt( GLcontext
*ctx
);
644 extern const struct gl_pipeline_stage fx_render_stage
;