summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/tdfx
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/tdfx')
-rw-r--r--src/mesa/drivers/dri/tdfx/BUGS64
-rw-r--r--src/mesa/drivers/dri/tdfx/Makefile34
-rw-r--r--src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fastpath.S83
-rw-r--r--src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fasttmp.h313
-rw-r--r--src/mesa/drivers/dri/tdfx/dri_glide.h59
-rw-r--r--src/mesa/drivers/dri/tdfx/server/tdfx_dri.h27
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_context.c1013
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_context.h1013
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_dd.c222
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_dd.h44
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_glide.h605
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_lock.c100
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_lock.h143
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_pixels.c686
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_pixels.h76
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_render.c804
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_render.h49
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_screen.c450
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_screen.h72
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_span.c1386
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_span.h48
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_state.c1429
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_state.h60
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_tex.c1868
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_tex.h101
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_texman.c994
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_texman.h83
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_texstate.c2218
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_texstate.h43
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_tris.c1291
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_tris.h41
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_vb.c347
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_vb.h68
-rw-r--r--src/mesa/drivers/dri/tdfx/tdfx_vbtmp.h266
34 files changed, 0 insertions, 16100 deletions
diff --git a/src/mesa/drivers/dri/tdfx/BUGS b/src/mesa/drivers/dri/tdfx/BUGS
deleted file mode 100644
index b15f6a91ed8..00000000000
--- a/src/mesa/drivers/dri/tdfx/BUGS
+++ /dev/null
@@ -1,64 +0,0 @@
-REMOVE THIS FILE BEFORE MERGING WITH TRUNK
-------------------------------------------
-
-OUTSTANDING BUGS
-
-demos/reflect - reading back Z on Voodoo3, image offset to right
- Fixed in latest Glide.
-
-Q3 - some polygons drawn as vertical strips, similar to bug that was
- seen in demos/fire. Voodoo3 only. May be related to glDepthMask
- or glColorMask.
-
-book/fog - not fogging
- Fog in orthograph mode still not implemented. Checking with
- 3dfx engineers for ideas.
-
-Q3 demo crashes after changing display settings
- but the full Q3 game version seems OK.
-
-
-
-MORE OUTSTANDING BUGS
-
-private context was NULL! causing immediate failure of any glx prog. cant
-reproduce after restarting the X server. putting it down as halluc.
-
-texture object image was NULL, causing segmentation failure. happens with
-prboom. ive put a check in tdfx_texstate.c but this isn't a fix.
-
-prboom, wall textures near first chainsaw aren't bound properly. sideways
-movements causes the wall textures to move with you. prboom busted?
-
-16bpp mode, quake3, windowed, q3dm1, floor under rocketlauncher bands. it
-looks like multitexturing gone wrong. i'll disable a tmu and test.
-
-sof, polygons appear at wrong x,y,z positions, intermittent, have not yet
-found reliable way of reproducing. culling? sometimes polys disappear.
-
-descent3 is all black in 16bpp mode - FIXED (palette problems)
-
-smeared pixels in quake3 - FIXED (texture memory overlapped FB)
-
-
-
-PERFORMANCE COMPARISON (Brian / Alan)
-
- V3/16 is Voodoo3 in 16bpp on a P3/500
- V5/16 is Voodoo5 in 16bpp on a P3/600
- V5/32 is Voodoo5 in 32bpp on a P3/600
- V5A/16 is Voodoo5 in 16bpp on an Alpha AXP/600
- V5A/32 is Voodoo5 in 32bpp on an Alpha AXP/600
-
- tdfx-2-1-branch tdfx-3-0-0-branch
-demo V3/16 V5/16 V5/32 V3/16 V5/16 V5/32 V5A/16 V5A/32
-------------------------------------------------------------------------
-gloss 257 183 174 320 308 177 313 167
-fire 42 39 52 41
-fire (no help) 98 80 50 106 113 73 124 80
-tunnel 61 50 70 58
-tunnel (no help) 167 142 57 138 152 113 171 122
-gears 663 554 540 881 1232 776 1484 830
-teapot 20 21 37 36
-teapot (no help) 22 14 14 24 30 30 43 42
-
diff --git a/src/mesa/drivers/dri/tdfx/Makefile b/src/mesa/drivers/dri/tdfx/Makefile
deleted file mode 100644
index ed84df20925..00000000000
--- a/src/mesa/drivers/dri/tdfx/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-# src/mesa/drivers/dri/tdfx/Makefile
-
-TOP = ../../../../..
-include $(TOP)/configs/current
-
-LIBNAME = tdfx_dri.so
-
-include ../Makefile.defines
-
-DRIVER_SOURCES = \
- tdfx_context.c \
- tdfx_dd.c \
- tdfx_lock.c \
- tdfx_pixels.c \
- tdfx_render.c \
- tdfx_screen.c \
- tdfx_span.c \
- tdfx_state.c \
- tdfx_tex.c \
- tdfx_texman.c \
- tdfx_texstate.c \
- tdfx_tris.c \
- tdfx_vb.c
-
-C_SOURCES = \
- $(COMMON_SOURCES) \
- $(DRIVER_SOURCES)
-
-
-ASM_SOURCES =
-
-include ../Makefile.targets
-
-
diff --git a/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fastpath.S b/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fastpath.S
deleted file mode 100644
index 500c97c536a..00000000000
--- a/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fastpath.S
+++ /dev/null
@@ -1,83 +0,0 @@
-
-#include "../../X86/assyntax.h"
-
-#define SETUP_RGBA 0x1
-#define SETUP_TMU0 0x2
-#define SETUP_TMU1 0x4
-
-
-/* Pack either rgba or texture into the remaining half of a 32 byte vertex.
- */
-#define CLIP_R 24
-#define CLIP_G 16
-#define CLIP_B 20
-#define CLIP_A 28 /* defined inf fxdrv.h */
-
-#define CLIP_S0 16
-#define CLIP_T0 20
-#define CLIP_S1 24
-#define CLIP_T1 28
-
-#define SIZE 4
-#define TYPE (0)
-#define TAG(x) x
-#include "fx_3dnow_fasttmp.h"
-
-#define SIZE 8
-#define TYPE (SETUP_RGBA)
-#define TAG(x) x##_RGBA
-#include "fx_3dnow_fasttmp.h"
-
-#define SIZE 6
-#define TYPE (SETUP_TMU0)
-#define TAG(x) x##_TMU0
-#include "fx_3dnow_fasttmp.h"
-
-#define SIZE 8
-#define TYPE (SETUP_TMU0|SETUP_TMU1)
-#define TAG(x) x##_TMU0_TMU1
-#include "fx_3dnow_fasttmp.h"
-
-#undef CLIP_S1
-#undef CLIP_T1
-#define CLIP_S1 16
-#define CLIP_T1 20
-
-#define SIZE 6
-#define TYPE (SETUP_TMU1)
-#define TAG(x) x##_TMU1
-#include "fx_3dnow_fasttmp.h"
-
-/* These three need to use a full 64 byte clip-space vertex.
- */
-#undef CLIP_S0
-#undef CLIP_T0
-#undef CLIP_S1
-#undef CLIP_T1
-
-#define CLIP_S0 32
-#define CLIP_T0 36
-#define CLIP_S1 40
-#define CLIP_T1 44
-
-#define SIZE 10
-#define TYPE (SETUP_RGBA|SETUP_TMU0)
-#define TAG(x) x##_RGBA_TMU0
-#include "fx_3dnow_fasttmp.h"
-
-#define SIZE 12
-#define TYPE (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
-#define TAG(x) x##_RGBA_TMU0_TMU1
-#include "fx_3dnow_fasttmp.h"
-
-#undef CLIP_S1
-#undef CLIP_T1
-#define CLIP_S1 32
-#define CLIP_T1 36
-
-#define SIZE 10
-#define TYPE (SETUP_RGBA|SETUP_TMU1)
-#define TAG(x) x##_RGBA_TMU1
-#include "fx_3dnow_fasttmp.h"
-
-
diff --git a/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fasttmp.h b/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fasttmp.h
deleted file mode 100644
index 78c5fef7469..00000000000
--- a/src/mesa/drivers/dri/tdfx/X86/fx_3dnow_fasttmp.h
+++ /dev/null
@@ -1,313 +0,0 @@
-
-#if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER)
-#define TAGLLBL(a) TAG(.L##a)
-#else
-#define TAGLLBL(a) TAG(a)
-#endif
-
-#if !GLIDE3
-
-#define GR_VERTEX_X_OFFSET 0
-#define GR_VERTEX_Y_OFFSET 4
-#define GR_VERTEX_Z_OFFSET 8
-#define GR_VERTEX_R_OFFSET 12
-#define GR_VERTEX_G_OFFSET 16
-#define GR_VERTEX_B_OFFSET 20
-#define GR_VERTEX_OOZ_OFFSET 24
-#define GR_VERTEX_A_OFFSET 28
-#define GR_VERTEX_OOW_OFFSET 32
-
-#else /* GLIDE3 */
-
-#define GR_VERTEX_X_OFFSET 0
-#define GR_VERTEX_Y_OFFSET 4
-#define GR_VERTEX_OOZ_OFFSET 8
-#define GR_VERTEX_OOW_OFFSET 12
-#define GR_VERTEX_R_OFFSET 16
-#define GR_VERTEX_G_OFFSET 20
-#define GR_VERTEX_B_OFFSET 24
-#define GR_VERTEX_A_OFFSET 28
-#define GR_VERTEX_Z_OFFSET 32
-
-#endif /* GLIDE3 */
-
-#define GR_VERTEX_SOW_TMU0_OFFSET 36
-#define GR_VERTEX_TOW_TMU0_OFFSET 40
-#define GR_VERTEX_OOW_TMU0_OFFSET 44
-#define GR_VERTEX_SOW_TMU1_OFFSET 48
-#define GR_VERTEX_TOW_TMU1_OFFSET 52
-#define GR_VERTEX_OOW_TMU1_OFFSET 56
-
-
-
-
-/*#define MAT_SX 0 /* accessed by REGIND !! */
-#define MAT_SY 20
-#define MAT_SZ 40
-#define MAT_TX 48
-#define MAT_TY 52
-#define MAT_TZ 56
-
-
-
-
-/* Do viewport map, device scale and perspective projection.
- *
- * void project_verts( GLfloat *first,
- * GLfloat *last,
- * const GLfloat *m,
- * GLuint stride )
- *
- *
- * Rearrange fxVertices to look like grVertices.
- */
-
-GLOBL GLNAME( TAG(fx_3dnow_project_vertices) )
-GLNAME( TAG(fx_3dnow_project_vertices) ):
-
- PUSH_L ( EBP )
-
- MOV_L ( REGOFF(8, ESP), ECX ) /* first_vert */
- MOV_L ( REGOFF(12, ESP), EDX ) /* last_vert */
-
- CMP_L ( ECX, EDX )
- JE ( TAGLLBL(FXPV_end) )
-
- FEMMS
-
- PREFETCH ( REGIND(ECX) ) /* fetch the first vertex */
-
- MOV_L ( REGOFF(16, ESP), EBP ) /* matrix */
- MOV_L ( REGOFF(20, ESP), EAX ) /* stride */
-
- MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */
- PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */
-
-#if !defined(FX_V2)
- MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) ) /* snapper */
- MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) ) /* snapper */
-#endif
-
- MOVQ ( REGOFF(-8, ESP), MM4 ) /* snapper | snapper */
- PFADD ( MM4, MM6 ) /* ty+snapper | tx+snapper */
-
- MOVD ( REGIND(EBP), MM5 )
- PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */
-
- MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */
-
-
-ALIGNTEXT32
-TAGLLBL(FXPV_loop_start):
-
- PREFETCH ( REGOFF(64, ECX) ) /* fetch the next-ish vertex */
-
-
- MOVD ( REGOFF(12, ECX), MM0 ) /* | f[3] */
- PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */
-
- MOVD ( REGOFF(12, ECX), MM7 ) /* | f[3] */
- PFRCPIT1 ( MM0, MM7 )
- PFRCPIT2 ( MM0, MM7 ) /* oow | oow */
-
- PUNPCKLDQ ( MM7, MM7 )
-
-
-#if (TYPE & SETUP_RGBA)
- MOVD ( REGOFF(CLIP_R, ECX ), MM0 ) /* f[RCOORD] = f[CLIP_R]; */
- MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) )
-#endif
-
-#if (TYPE & SETUP_TMU1)
- MOVQ ( REGOFF(CLIP_S1, ECX), MM0 ) /* f[S1COORD] = f[CLIP_S1] * oow */
- PFMUL ( MM7, MM0 ) /* f[T1COORD] = f[CLIP_T1] * oow */
- MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) )
-#endif
-
-
-#if (TYPE & SETUP_TMU0)
- MOVQ ( REGOFF(CLIP_S0, ECX), MM0 ) /* f[S0COORD] = f[CLIP_S0] * oow */
- PFMUL ( MM7, MM0 ) /* f[T0COORD] = f[CLIP_T0] * oow */
- MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) )
-#endif
-
-
-
-
-
-/* DO_SETUP_XYZ */
-
- MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */
- PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */
-
- MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */
- PFMUL ( MM7, MM3 ) /* | f[2] * oow */
-
- MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */
- PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */
-
- PFADD ( MM0, MM3 ) /* | f[2] += vtz */
- PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */
-
- PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */
-
-#if !defined(FX_V2)
- PFSUB ( MM4, MM2 ) /* f[0,1] -= snapper */
-#endif
-
- MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) )
- MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) )
-
-
-/* end of DO_SETUP_XYZ */
-
- MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) ) /* f[OOWCOORD] = oow */
- ADD_L ( EAX, ECX ) /* f += stride */
-
- CMP_L ( ECX, EDX ) /* stall??? */
- JA ( TAGLLBL(FXPV_loop_start) )
-
-TAGLLBL(FXPV_end):
- FEMMS
- POP_L ( EBP )
- RET
-
-
-
-
-
-
-
-/* void project_verts( GLfloat *first,
- * GLfloat *last,
- * const GLfloat *m,
- * GLuint stride,
- * const GLubyte *mask )
- *
- */
-
-GLOBL GLNAME( TAG(fx_3dnow_project_clipped_vertices) )
-GLNAME( TAG(fx_3dnow_project_clipped_vertices) ):
-
- PUSH_L ( EBP )
-
- MOV_L ( REGOFF(8, ESP), ECX ) /* first FXDRIVER(VB)->verts*/
- MOV_L ( REGOFF(12, ESP), EDX ) /* last FXDRIVER(VB)->last_vert */
-
- FEMMS
-
- PUSH_L ( EDI )
- PUSH_L ( ESI )
-
- PREFETCH ( REGIND(ECX) ) /* fetch the first vertex */
-
- MOV_L ( REGOFF(24, ESP), EBP ) /* mat ctx->Viewport.WindowMap.M */
- MOV_L ( REGOFF(28, ESP), EAX ) /* stride */
- MOV_L ( REGOFF(32, ESP), ESI ) /* VB->ClipMask */
-
- MOVD ( REGOFF(MAT_TX, EBP), MM6 ) /* | tx */
- PUNPCKLDQ ( REGOFF(MAT_TY, EBP), MM6 ) /* ty | tx */
-
-#if !defined(FX_V2)
- MOV_L ( CONST(0x49400000), REGOFF(-8, ESP) ) /* snapper */
- MOV_L ( CONST(0x49400000), REGOFF(-4, ESP) ) /* snapper */
-#endif
-
- MOVQ ( REGOFF(-8, ESP), MM4 ) /* snapper | snapper */
- PFADD ( MM4, MM6 ) /* ty+snapper | tx+snapper */
-
- MOVD ( REGIND(EBP), MM5 )
- PUNPCKLDQ ( REGOFF(MAT_SY, EBP), MM5 ) /* vsy | vsx */
-
- MOVD ( REGOFF(MAT_SZ, EBP), MM1 ) /* | vsz */
-
-
-
-ALIGNTEXT32
-TAGLLBL(FXPCV_loop_start):
-
- PREFETCH ( REGOFF(64, ECX) ) /* fetch the next-ish vertex */
-
- CMP_B ( CONST(0), REGIND(ESI) )
- JNE ( TAGLLBL(FXPCV_skip) )
-
- MOVD ( REGOFF(12, ECX), MM0) /* | f[3] */
- PFRCP ( MM0, MM0 ) /* oow = 1/f[3] */
-
- MOVD ( REGOFF(12, ECX), MM7) /* | f[3] */
- PFRCPIT1 ( MM0, MM7 )
- PFRCPIT2 ( MM0, MM7 ) /* oow | oow */
-
- PUNPCKLDQ ( MM7, MM7 )
-
-
-#if (TYPE & SETUP_RGBA)
- MOVD ( REGOFF(CLIP_R, ECX ), MM0 ) /* f[RCOORD] = f[CLIP_R]; */
- MOVD ( MM0, REGOFF(GR_VERTEX_R_OFFSET, ECX) )
-#endif
-
-#if (TYPE & SETUP_TMU1)
- MOVQ ( REGOFF(CLIP_S1, ECX), MM0 ) /* f[S1COORD] = f[CLIP_S1] * oow */
- PFMUL ( MM7, MM0 ) /* f[T1COORD] = f[CLIP_T1] * oow */
- MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU1_OFFSET, ECX) )
-#endif
-
-
-#if (TYPE & SETUP_TMU0)
- MOVQ ( REGOFF(CLIP_S0, ECX), MM0 ) /* f[S0COORD] = f[CLIP_S0] * oow */
- PFMUL ( MM7, MM0 ) /* f[T0COORD] = f[CLIP_T0] * oow */
- MOVQ ( MM0, REGOFF(GR_VERTEX_SOW_TMU0_OFFSET, ECX) )
-#endif
-
-
-
-
-/* DO_SETUP_XYZ */
-
- MOVQ ( REGIND(ECX), MM2 ) /* f[1] | f[0] */
- PFMUL ( MM7, MM2 ) /* f[1] * oow | f[0] * oow */
-
- MOVD ( REGOFF(8, ECX), MM3 ) /* | f[2] */
- PFMUL ( MM7, MM3 ) /* | f[2] * oow */
-
- MOVD ( REGOFF(MAT_TZ, EBP), MM0 ) /* | vtz */
- PFMUL ( MM1, MM3 ) /* | f[2] *= vsz */
-
- PFADD ( MM0, MM3 ) /* | f[2] += vtz */
- PFMUL ( MM5, MM2 ) /* f[1] *= vsy | f[0] *= vsx */
-
- PFADD ( MM6, MM2 ) /* f[1] += vty | f[0] += vtx */
-
-#if !defined(FX_V2)
- PFSUB ( MM4, MM2 ) /* f[0,1] -= snapper */
-#endif
-
- MOVQ ( MM2, REGOFF(GR_VERTEX_X_OFFSET, ECX) )
- MOVD ( MM3, REGOFF(GR_VERTEX_OOZ_OFFSET, ECX) )
-
-
-/* end of DO_SETUP_XYZ */
-
- MOVD ( MM7, REGOFF(GR_VERTEX_OOW_OFFSET, ECX) ) /* f[OOWCOORD] = oow */
-
-TAGLLBL(FXPCV_skip):
- ADD_L ( EAX, ECX ) /* f += stride */
-
- INC_L ( ESI ) /* next ClipMask */
- CMP_L ( ECX, EDX )
- JA ( TAGLLBL(FXPCV_loop_start) )
-
- POP_L ( ESI )
- POP_L ( EDI )
-
-TAGLLBL(FXPCV_end):
- FEMMS
- POP_L ( EBP )
- RET
-
-
-
-#undef TYPE
-#undef TAG
-#undef SIZE
-
diff --git a/src/mesa/drivers/dri/tdfx/dri_glide.h b/src/mesa/drivers/dri/tdfx/dri_glide.h
deleted file mode 100644
index 3ad2bf68c6e..00000000000
--- a/src/mesa/drivers/dri/tdfx/dri_glide.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#ifndef __DRI_GLIDE_H__
-#define __DRI_GLIDE_H__
-
-#include <glide.h>
-#include "dri_mesaint.h"
-
-/*
- * This is the private interface between Glide and the DRI.
- */
-extern 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 );
-extern void grDRIPosition( int x, int y, int w, int h,
- int numClip, drm_clip_rect_t *pClip );
-extern void grDRILostContext( void );
-extern void grDRIImportFifo( int fifoPtr, int fifoRead );
-extern void grDRIInvalidateAll( void );
-extern void grDRIResetSAREA( void );
-extern void grDRIBufferSwap( FxU32 swapInterval );
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/server/tdfx_dri.h b/src/mesa/drivers/dri/tdfx/server/tdfx_dri.h
deleted file mode 100644
index dc29984a272..00000000000
--- a/src/mesa/drivers/dri/tdfx/server/tdfx_dri.h
+++ /dev/null
@@ -1,27 +0,0 @@
-
-#ifndef _TDFX_DRI_
-#define _TDFX_DRI_
-
-#include "xf86drm.h"
-#include "drm.h"
-
-typedef struct {
- drm_handle_t regs;
- drmSize regsSize;
- 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;
- unsigned int sarea_priv_offset;
-} TDFXDRIRec, *TDFXDRIPtr;
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_context.c b/src/mesa/drivers/dri/tdfx/tdfx_context.c
deleted file mode 100644
index ad151359e67..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_context.c
+++ /dev/null
@@ -1,1013 +0,0 @@
-/* -*- 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.
- */
-
-/**
- * \file tdfx_context.c
- * Context management functions for 3Dfx hardware.
- *
- * \author Gareth Hughes <gareth@valinux.com> (original rewrite 29 Sep - 1 Oct 2000)
- * \author Brian Paul <brianp@valinux.com>
- * \author Daniel Borca <dborca@users.sourceforge.net> (new fixes 19 Jul 2004)
- */
-
-#include <dlfcn.h>
-#include "tdfx_context.h"
-#include "tdfx_dd.h"
-#include "tdfx_state.h"
-#include "tdfx_vb.h"
-#include "tdfx_tex.h"
-#include "tdfx_tris.h"
-#include "tdfx_render.h"
-#include "tdfx_span.h"
-#include "tdfx_texman.h"
-#include "main/extensions.h"
-#include "main/hash.h"
-#include "main/texobj.h"
-
-#include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "vbo/vbo.h"
-
-#include "tnl/tnl.h"
-#include "tnl/t_pipeline.h"
-
-#include "drivers/common/driverfuncs.h"
-
-#include "utils.h"
-
-/* #define need_GL_ARB_point_parameters */
-#define need_GL_ARB_occlusion_query
-/* #define need_GL_ARB_vertex_program */
-#define need_GL_EXT_blend_equation_separate
-#define need_GL_EXT_blend_func_separate
-#define need_GL_EXT_blend_minmax
-#define need_GL_EXT_fog_coord
-#define need_GL_EXT_paletted_texture
-/* #define need_GL_EXT_secondary_color */
-/* #define need_GL_NV_vertex_program */
-#include "main/remap_helper.h"
-
-
-/**
- * Common extension strings exported by all cards
- */
-static const struct dri_extension card_extensions[] =
-{
- { "GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-
- { "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
- { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions },
- { "GL_EXT_shared_texture_palette", NULL },
- { "GL_EXT_stencil_wrap", NULL },
- { "GL_EXT_texture_env_add", NULL },
- { "GL_EXT_texture_lod_bias", NULL },
-
-#ifdef need_GL_ARB_point_parameters
- { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions },
- { "GL_ARB_point_sprite", NULL },
-#endif
-#ifdef need_GL_EXT_secondary_color
- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
-#endif
-#ifdef need_GL_ARB_vertex_program
- { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions }
-#endif
-#ifdef need_GL_NV_vertex_program
- { "GL_NV_vertex_program", GL_NV_vertex_program_functions }
- { "GL_NV_vertex_program1_1", NULL },
-#endif
- { NULL, NULL }
-};
-
-/**
- * Extension strings exported only by Naplam (e.g., Voodoo4 & Voodoo5) cards.
- */
-static const struct dri_extension napalm_extensions[] =
-{
- { "GL_ARB_texture_env_combine", NULL },
- { "GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions },
- { "GL_EXT_blend_subtract", GL_EXT_blend_minmax_functions },
- { "GL_EXT_texture_compression_s3tc", NULL },
- { "GL_EXT_texture_env_combine", NULL },
-
- { "GL_3DFX_texture_compression_FXT1", NULL },
- { "GL_NV_blend_square", NULL },
- { "GL_S3_s3tc", NULL },
- { NULL, NULL }
-};
-
-/*
- * Enable/Disable the extensions for this context.
- */
-static void tdfxDDInitExtensions( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- driInitExtensions( ctx, card_extensions, GL_FALSE );
-
- if ( fxMesa->haveTwoTMUs ) {
- _mesa_enable_extension( ctx, "GL_ARB_multitexture" );
- }
-
- if ( TDFX_IS_NAPALM( fxMesa ) ) {
- driInitExtensions( ctx, napalm_extensions, GL_FALSE );
- }
-}
-
-
-
-static const struct tnl_pipeline_stage *tdfx_pipeline[] = {
- &_tnl_vertex_transform_stage,
- &_tnl_normal_transform_stage,
- &_tnl_lighting_stage,
- &_tnl_fog_coordinate_stage,
- &_tnl_texgen_stage,
- &_tnl_texture_transform_stage,
- &_tnl_point_attenuation_stage,
- &_tnl_render_stage,
- 0,
-};
-
-static const struct dri_debug_control debug_control[] =
-{
- { "dri", DEBUG_VERBOSE_DRI },
- { "sync", DEBUG_ALWAYS_SYNC },
- { "api", DEBUG_VERBOSE_API },
- { "fall", DEBUG_VERBOSE_FALL },
- { NULL, 0 }
-};
-
-GLboolean tdfxCreateContext( gl_api api,
- const struct gl_config *mesaVis,
- __DRIcontext *driContextPriv,
- void *sharedContextPrivate )
-{
- tdfxContextPtr fxMesa;
- struct gl_context *ctx, *shareCtx;
- __DRIscreen *sPriv = driContextPriv->driScreenPriv;
- tdfxScreenPrivate *fxScreen = (tdfxScreenPrivate *) sPriv->private;
- TDFXSAREAPriv *saPriv = (TDFXSAREAPriv *) ((char *) sPriv->pSAREA +
- sizeof(drm_sarea_t));
- struct dd_function_table functions;
-
- /* Allocate tdfx context */
- fxMesa = (tdfxContextPtr) CALLOC( sizeof(tdfxContextRec) );
- if (!fxMesa)
- return GL_FALSE;
-
- /* Init default driver functions then plug in our tdfx-specific functions
- * (the texture functions are especially important)
- */
- _mesa_init_driver_functions(&functions);
- tdfxDDInitDriverFuncs(mesaVis, &functions);
- tdfxInitTextureFuncs(&functions);
- tdfxInitRenderFuncs(&functions);
-
- /* Allocate the Mesa context */
- if (sharedContextPrivate)
- shareCtx = ((tdfxContextPtr) sharedContextPrivate)->glCtx;
- else
- shareCtx = NULL;
-
- fxMesa->glCtx = _mesa_create_context(api, mesaVis, shareCtx,
- &functions, (void *) fxMesa);
- if (!fxMesa->glCtx) {
- FREE(fxMesa);
- return GL_FALSE;
- }
- driContextPriv->driverPrivate = fxMesa;
-
- /* Mirror some important DRI state
- */
- fxMesa->hHWContext = driContextPriv->hHWContext;
- fxMesa->driHwLock = &sPriv->pSAREA->lock;
- fxMesa->driFd = sPriv->fd;
-
- fxMesa->driScreen = sPriv;
- fxMesa->driContext = driContextPriv;
- fxMesa->fxScreen = fxScreen;
- fxMesa->sarea = saPriv;
-
- /*JJJ - really?*/
- fxMesa->haveHwAlpha = ( mesaVis->alphaBits &&
- ((mesaVis->greenBits == 8) ||
- (mesaVis->depthBits == 0)) );
- fxMesa->haveHwStencil = ( TDFX_IS_NAPALM( fxMesa ) &&
- mesaVis->stencilBits &&
- mesaVis->depthBits == 24 );
-
- fxMesa->screen_width = fxScreen->width;
- fxMesa->screen_height = fxScreen->height;
-
- fxMesa->new_gl_state = ~0;
- fxMesa->new_state = ~0;
- fxMesa->dirty = ~0;
-
- /* Parse configuration files */
- driParseConfigFiles (&fxMesa->optionCache, &fxScreen->optionCache,
- fxMesa->driScreen->myNum, "tdfx");
-
- /* NOTE: This must be here before any Glide calls! */
- if (!tdfxInitGlide( fxMesa )) {
- FREE(fxMesa);
- return GL_FALSE;
- }
-
- fxMesa->Glide.grDRIOpen( (char*) sPriv->pFB, fxScreen->regs.map, fxScreen->deviceID,
- fxScreen->width, fxScreen->height, fxScreen->mem, fxScreen->cpp,
- fxScreen->stride, fxScreen->fifoOffset, fxScreen->fifoSize,
- fxScreen->fbOffset, fxScreen->backOffset, fxScreen->depthOffset,
- fxScreen->textureOffset, fxScreen->textureSize, &saPriv->fifoPtr,
- &saPriv->fifoRead );
-
- if ( getenv( "FX_GLIDE_SWAPINTERVAL" ) ) {
- fxMesa->Glide.SwapInterval = atoi( getenv( "FX_GLIDE_SWAPINTERVAL" ) );
- } else {
- fxMesa->Glide.SwapInterval = 0;
- }
- if ( getenv( "FX_MAX_PENDING_SWAPS" ) ) {
- fxMesa->Glide.MaxPendingSwaps = atoi( getenv( "FX_MAX_PENDING_SWAPS" ) );
- } else {
- fxMesa->Glide.MaxPendingSwaps = 2;
- }
-
- fxMesa->Glide.Initialized = GL_FALSE;
- fxMesa->Glide.Board = 0;
-
-
- if (getenv("FX_EMULATE_SINGLE_TMU")) {
- fxMesa->haveTwoTMUs = GL_FALSE;
- }
- else {
- if ( TDFX_IS_BANSHEE( fxMesa ) ) {
- fxMesa->haveTwoTMUs = GL_FALSE;
- } else {
- fxMesa->haveTwoTMUs = GL_TRUE;
- }
- }
-
- fxMesa->stats.swapBuffer = 0;
- fxMesa->stats.reqTexUpload = 0;
- fxMesa->stats.texUpload = 0;
- fxMesa->stats.memTexUpload = 0;
-
- fxMesa->tmuSrc = TDFX_TMU_NONE;
-
- ctx = fxMesa->glCtx;
- if ( TDFX_IS_NAPALM( fxMesa ) ) {
- ctx->Const.MaxTextureLevels = 12;
- } else {
- ctx->Const.MaxTextureLevels = 9;
- }
- ctx->Const.MaxTextureUnits = TDFX_IS_BANSHEE( fxMesa ) ? 1 : 2;
- ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits;
- ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits;
-
- /* No wide points.
- */
- ctx->Const.MinPointSize = 1.0;
- ctx->Const.MinPointSizeAA = 1.0;
- ctx->Const.MaxPointSize = 1.0;
- ctx->Const.MaxPointSizeAA = 1.0;
-
- /* Disable wide lines as we can't antialias them correctly in
- * hardware.
- */
- ctx->Const.MinLineWidth = 1.0;
- ctx->Const.MinLineWidthAA = 1.0;
- ctx->Const.MaxLineWidth = 1.0;
- ctx->Const.MaxLineWidthAA = 1.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
- ctx->Const.MaxDrawBuffers = 1;
-
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext( ctx );
- _vbo_CreateContext( ctx );
- _tnl_CreateContext( ctx );
- _swsetup_CreateContext( ctx );
-
- /* Install the customized pipeline:
- */
- _tnl_destroy_pipeline( ctx );
- _tnl_install_pipeline( ctx, tdfx_pipeline );
-
- /* Configure swrast and T&L to match hardware characteristics:
- */
- _swrast_allow_pixel_fog( ctx, GL_TRUE );
- _swrast_allow_vertex_fog( ctx, GL_FALSE );
- _tnl_allow_pixel_fog( ctx, GL_TRUE );
- _tnl_allow_vertex_fog( ctx, GL_FALSE );
-
- tdfxDDInitExtensions( ctx );
- /* XXX these should really go right after _mesa_init_driver_functions() */
- tdfxDDInitSpanFuncs( ctx );
- tdfxDDInitStateFuncs( ctx );
- tdfxDDInitTriFuncs( ctx );
- tdfxInitVB( ctx );
- tdfxInitState( fxMesa );
-
-#if DO_DEBUG
- TDFX_DEBUG = driParseDebugString( getenv( "TDFX_DEBUG" ), debug_control );
-#endif
-
- if (driQueryOptionb(&fxMesa->optionCache, "no_rast")) {
- fprintf(stderr, "disabling 3D acceleration\n");
- FALLBACK(fxMesa, TDFX_FALLBACK_DISABLE, 1);
- }
-
- return GL_TRUE;
-}
-
-
-static GLboolean tdfxInitVertexFormats( tdfxContextPtr fxMesa )
-{
- FxI32 result;
- int i;
-
- LOCK_HARDWARE( fxMesa );
-
- fxMesa->Glide.grGet( GR_GLIDE_VERTEXLAYOUT_SIZE, sizeof(FxI32), &result );
- for ( i = 0 ; i < TDFX_NUM_LAYOUTS ; i++ ) {
- fxMesa->layout[i] = MALLOC( result );
- if ( !fxMesa->layout[i] ) {
- UNLOCK_HARDWARE( fxMesa );
- return GL_FALSE;
- }
- }
-
- /* Tiny vertex format - 16 bytes.
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_TINY] );
-
- /* Non textured vertex format - 24 bytes (Need w for table fog)
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_NOTEX] );
-
- /* Single textured vertex format - 32 bytes.
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_SINGLE] );
-
- /* Multitextured vertex format - 40 bytes.
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST1, TDFX_ST1_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_MULTI] );
-
- /* Projected texture vertex format - 36 bytes.
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q0, TDFX_Q0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_PROJ1] );
-
- /* Projected multitexture vertex format - 48 bytes.
- */
- fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );
- fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );
- fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q0, TDFX_Q0_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_ST1, TDFX_ST1_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grVertexLayout( GR_PARAM_Q1, TDFX_Q1_OFFSET, GR_PARAM_ENABLE );
- fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_PROJ2] );
-
- UNLOCK_HARDWARE( fxMesa );
-
- return GL_TRUE;
-}
-
-
-/*
- * Initialize the state in an tdfxContextPtr struct.
- */
-static GLboolean
-tdfxInitContext( __DRIdrawable *driDrawPriv, tdfxContextPtr fxMesa )
-{
- /* KW: Would be nice to make one of these a member of the other.
- */
- FxI32 result[2];
- const char *gext;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)fxMesa );
- }
-
-#if DEBUG_LOCKING
- fprintf(stderr, "Debug locking enabled\n");
-#endif
-
- if ( fxMesa->Glide.Initialized )
- return GL_TRUE;
-
- fxMesa->width = driDrawPriv->w;
- fxMesa->height = driDrawPriv->h;
-
- /* We have to use a light lock here, because we can't do any glide
- * operations yet. No use of FX_* functions in this function.
- */
- DRM_LIGHT_LOCK( fxMesa->driFd, fxMesa->driHwLock, fxMesa->hHWContext );
-
- fxMesa->Glide.grGlideInit();
- fxMesa->Glide.grSstSelect( fxMesa->Glide.Board );
-
- fxMesa->Glide.Context = fxMesa->Glide.grSstWinOpen( (FxU32) -1,
- GR_RESOLUTION_NONE,
- GR_REFRESH_NONE,
- fxMesa->Glide.ColorFormat,
- fxMesa->Glide.Origin,
- 2, 1 );
-
- fxMesa->Glide.grDRIResetSAREA();
-
- DRM_UNLOCK( fxMesa->driFd, fxMesa->driHwLock, fxMesa->hHWContext );
-
- if ( !fxMesa->Glide.Context )
- return GL_FALSE;
-
-
- /* Perform the Glide-dependant part of the context initialization.
- */
- FX_grColorMaskv( fxMesa->glCtx, true4 );
-
- tdfxTMInit( fxMesa );
-
- LOCK_HARDWARE( fxMesa );
-
- /* JJJ - COMMAND_TRANSPORT, PALETTE6666 */
- gext = fxMesa->Glide.grGetString( GR_EXTENSION );
- fxMesa->Glide.HaveCombineExt = strstr(gext, "COMBINE") && !getenv("MESA_FX_IGNORE_CMBEXT");
- fxMesa->Glide.HaveCommandTransportExt = GL_FALSE;
- fxMesa->Glide.HaveFogCoordExt = GL_TRUE;
- fxMesa->Glide.HavePixelExt = strstr(gext, "PIXEXT") && !getenv("MESA_FX_IGNORE_PIXEXT");
- fxMesa->Glide.HaveTextureBufferExt = GL_TRUE;
- fxMesa->Glide.HaveTexFmtExt = strstr(gext, "TEXFMT") && !getenv("MESA_FX_IGNORE_TEXFMT");
- fxMesa->Glide.HaveTexUMAExt = strstr(gext, "TEXUMA") && !getenv("MESA_FX_IGNORE_TEXUMA");
- fxMesa->Glide.HaveMirrorExt = strstr(gext, "TEXMIRROR") && !getenv("MESA_FX_IGNORE_MIREXT");
- fxMesa->Glide.HaveTexus2 = GL_FALSE;
-
- if ( fxMesa->glCtx->Visual.depthBits > 0 ) {
- fxMesa->Glide.grDepthBufferMode(GR_DEPTHBUFFER_ZBUFFER);
- } else {
- fxMesa->Glide.grDepthBufferMode(GR_DEPTHBUFFER_DISABLE);
- }
-
- fxMesa->Glide.grLfbWriteColorFormat( GR_COLORFORMAT_ABGR );
-
- fxMesa->Glide.grGet( GR_TEXTURE_ALIGN, sizeof(FxI32), result );
- fxMesa->Glide.TextureAlign = result[0];
-
- fxMesa->Glide.State = NULL;
- fxMesa->Glide.grGet( GR_GLIDE_STATE_SIZE, sizeof(FxI32), result );
- fxMesa->Glide.State = MALLOC( result[0] );
-
- fxMesa->Fog.Table = NULL;
- fxMesa->Glide.grGet( GR_FOG_TABLE_ENTRIES, sizeof(FxI32), result );
- fxMesa->Fog.Table = MALLOC( result[0] * sizeof(GrFog_t) );
-
- UNLOCK_HARDWARE( fxMesa );
-
- if ( !fxMesa->Glide.State || !fxMesa->Fog.Table ) {
- if ( fxMesa->Glide.State )
- FREE( fxMesa->Glide.State );
- if ( fxMesa->Fog.Table )
- FREE( fxMesa->Fog.Table );
- return GL_FALSE;
- }
-
- if ( !tdfxInitVertexFormats( fxMesa ) ) {
- return GL_FALSE;
- }
-
- LOCK_HARDWARE( fxMesa );
-
- fxMesa->Glide.grGlideGetState( fxMesa->Glide.State );
-
- if ( getenv( "FX_GLIDE_INFO" ) ) {
- printf( "GR_RENDERER = %s\n", (char *) fxMesa->Glide.grGetString( GR_RENDERER ) );
- printf( "GR_VERSION = %s\n", (char *) fxMesa->Glide.grGetString( GR_VERSION ) );
- printf( "GR_VENDOR = %s\n", (char *) fxMesa->Glide.grGetString( GR_VENDOR ) );
- printf( "GR_HARDWARE = %s\n", (char *) fxMesa->Glide.grGetString( GR_HARDWARE ) );
- printf( "GR_EXTENSION = %s\n", (char *) gext );
- }
-
- UNLOCK_HARDWARE( fxMesa );
-
- fxMesa->numClipRects = 0;
- fxMesa->pClipRects = NULL;
- fxMesa->scissoredClipRects = GL_FALSE;
-
- fxMesa->Glide.Initialized = GL_TRUE;
-
- return GL_TRUE;
-}
-
-
-void
-tdfxDestroyContext( __DRIcontext *driContextPriv )
-{
- tdfxContextPtr fxMesa = (tdfxContextPtr) driContextPriv->driverPrivate;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)fxMesa );
- }
-
- if ( fxMesa ) {
- if (fxMesa->glCtx->Shared->RefCount == 1 && fxMesa->driDrawable) {
- /* This share group is about to go away, free our private
- * texture object data.
- */
- struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
- GLuint id;
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *tObj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- tdfxTMFreeTexture(fxMesa, tObj);
- }
- }
-
- tdfxTMClose(fxMesa); /* free texture memory */
-
- _swsetup_DestroyContext( fxMesa->glCtx );
- _tnl_DestroyContext( fxMesa->glCtx );
- _vbo_DestroyContext( fxMesa->glCtx );
- _swrast_DestroyContext( fxMesa->glCtx );
-
- tdfxFreeVB( fxMesa->glCtx );
-
- /* Free Mesa context */
- fxMesa->glCtx->DriverCtx = NULL;
- _mesa_destroy_context(fxMesa->glCtx);
-
- /* free the tdfx context */
- FREE( fxMesa );
- }
-}
-
-
-GLboolean
-tdfxUnbindContext( __DRIcontext *driContextPriv )
-{
- GET_CURRENT_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)driContextPriv );
- }
-
- if ( driContextPriv && (tdfxContextPtr) driContextPriv == fxMesa ) {
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grGlideGetState(fxMesa->Glide.State);
- UNLOCK_HARDWARE(fxMesa);
- }
- return GL_TRUE;
-}
-
-
-GLboolean
-tdfxMakeCurrent( __DRIcontext *driContextPriv,
- __DRIdrawable *driDrawPriv,
- __DRIdrawable *driReadPriv )
-{
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)driContextPriv );
- }
-
- if ( driContextPriv ) {
- tdfxContextPtr newFx = (tdfxContextPtr) driContextPriv->driverPrivate;
- struct gl_context *newCtx = newFx->glCtx;
- GET_CURRENT_CONTEXT(curCtx);
-
- if ((newFx->driDrawable != driDrawPriv)
- || (newFx->driReadable != driReadPriv)) {
- newFx->driDrawable = driDrawPriv;
- newFx->driReadable = driReadPriv;
- newFx->dirty = ~0;
- }
- else {
- if (curCtx == newCtx) {
- /* same drawable, same context -> no-op */
- /* Need to call _mesa_make_current2() in order to make sure API
- * dispatch is set correctly.
- */
- _mesa_make_current( newCtx,
- (struct gl_framebuffer *) driDrawPriv->driverPrivate,
- (struct gl_framebuffer *) driReadPriv->driverPrivate );
- return GL_TRUE;
- }
- /* [dBorca] tunnel2 requires this */
- newFx->dirty = ~0;
- }
-
- driUpdateFramebufferSize(newCtx, driDrawPriv);
- if (driDrawPriv != driReadPriv) {
- driUpdateFramebufferSize(newCtx, driReadPriv);
- }
-
- if ( !newFx->Glide.Initialized ) {
- if ( !tdfxInitContext( driDrawPriv, newFx ) )
- return GL_FALSE;
-
- LOCK_HARDWARE( newFx );
-
- /* FIXME: Force loading of window information */
- newFx->width = 0;
- tdfxUpdateClipping(newCtx);
- tdfxUploadClipping(newFx);
-
- UNLOCK_HARDWARE( newFx );
- } else {
- LOCK_HARDWARE( newFx );
-
- newFx->Glide.grSstSelect( newFx->Glide.Board );
- newFx->Glide.grGlideSetState( newFx->Glide.State );
-
- tdfxUpdateClipping(newCtx);
- tdfxUploadClipping(newFx);
-
- UNLOCK_HARDWARE( newFx );
- }
-
- _mesa_make_current( newCtx,
- (struct gl_framebuffer *) driDrawPriv->driverPrivate,
- (struct gl_framebuffer *) driReadPriv->driverPrivate );
- } else {
- _mesa_make_current( NULL, NULL, NULL );
- }
-
- return GL_TRUE;
-}
-
-
-/*
- * Enable this to trace calls to various Glide functions.
- */
-/*#define DEBUG_TRAP*/
-#ifdef DEBUG_TRAP
-static void (*real_grDrawTriangle)( const void *a, const void *b, const void *c );
-static void (*real_grDrawPoint)( const void *a );
-static void (*real_grDrawVertexArray)(FxU32 mode, FxU32 Count, void *pointers);
-static void (*real_grDrawVertexArrayContiguous)(FxU32 mode, FxU32 Count,
- void *pointers, FxU32 stride);
-static void (*real_grClipWindow)( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy );
-
-static void (*real_grVertexLayout)(FxU32 param, FxI32 offset, FxU32 mode);
-static void (*real_grGlideGetVertexLayout)( void *layout );
-static void (*real_grGlideSetVertexLayout)( const void *layout );
-
-static void (*real_grTexDownloadMipMapLevel)( GrChipID_t tmu,
- FxU32 startAddress,
- GrLOD_t thisLod,
- GrLOD_t largeLod,
- GrAspectRatio_t aspectRatio,
- GrTextureFormat_t format,
- FxU32 evenOdd,
- void *data );
-
-
-static void debug_grDrawTriangle( const void *a, const void *b, const void *c )
-{
- printf("%s\n", __FUNCTION__);
- (*real_grDrawTriangle)(a, b, c);
-}
-
-static void debug_grDrawPoint( const void *a )
-{
- const float *f = (const float *) a;
- printf("%s %g %g\n", __FUNCTION__, f[0], f[1]);
- (*real_grDrawPoint)(a);
-}
-
-static void debug_grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers)
-{
- printf("%s count=%d\n", __FUNCTION__, (int) Count);
- (*real_grDrawVertexArray)(mode, Count, pointers);
-}
-
-static void debug_grDrawVertexArrayContiguous(FxU32 mode, FxU32 Count,
- void *pointers, FxU32 stride)
-{
- printf("%s mode=0x%x count=%d\n", __FUNCTION__, (int) mode, (int) Count);
- (*real_grDrawVertexArrayContiguous)(mode, Count, pointers, stride);
-}
-
-static void debug_grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy )
-{
- printf("%s %d,%d .. %d,%d\n", __FUNCTION__,
- (int) minx, (int) miny, (int) maxx, (int) maxy);
- (*real_grClipWindow)(minx, miny, maxx, maxy);
-}
-
-static void debug_grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode)
-{
- (*real_grVertexLayout)(param, offset, mode);
-}
-
-static void debug_grGlideGetVertexLayout( void *layout )
-{
- (*real_grGlideGetVertexLayout)(layout);
-}
-
-static void debug_grGlideSetVertexLayout( const void *layout )
-{
- (*real_grGlideSetVertexLayout)(layout);
-}
-
-static void debug_grTexDownloadMipMapLevel( GrChipID_t tmu,
- FxU32 startAddress,
- GrLOD_t thisLod,
- GrLOD_t largeLod,
- GrAspectRatio_t aspectRatio,
- GrTextureFormat_t format,
- FxU32 evenOdd,
- void *data )
-{
- (*real_grTexDownloadMipMapLevel)(tmu, startAddress, thisLod, largeLod,
- aspectRatio, format, evenOdd, data);
-}
-
-#endif
-
-
-/*
- * Examine the context's deviceID to determine what kind of 3dfx hardware
- * is installed. dlopen() the appropriate Glide library and initialize
- * this context's Glide function pointers.
- * Return: true/false = success/failure
- */
-GLboolean tdfxInitGlide(tdfxContextPtr tmesa)
-{
- static const char *defaultGlide = "libglide3.so";
- const char *libName;
- void *libHandle;
-
- /*
- * XXX this code which selects a Glide library filename given the
- * deviceID may need to be cleaned up a bit.
- * Non-Linux systems may have different filenames, for example.
- */
- switch (tmesa->fxScreen->deviceID) {
- case PCI_CHIP_BANSHEE:
- case PCI_CHIP_VOODOO3:
- libName = "libglide3-v3.so";
- break;
- case PCI_CHIP_VOODOO5: /* same as PCI_CHIP_VOODOO4 */
- libName = "libglide3-v5.so";
- break;
- default:
- {
- __driUtilMessage("unrecognized 3dfx deviceID: 0x%x",
- tmesa->fxScreen->deviceID);
- }
- return GL_FALSE;
- }
-
- libHandle = dlopen(libName, RTLD_NOW);
- if (!libHandle) {
- /* The device-specific Glide library filename didn't work, try the
- * old, generic libglide3.so library.
- */
- libHandle = dlopen(defaultGlide, RTLD_NOW);
- if (!libHandle) {
- __driUtilMessage(
- "can't find Glide library, dlopen(%s) and dlopen(%s) both failed.",
- libName, defaultGlide);
- __driUtilMessage("dlerror() message: %s", dlerror());
- return GL_FALSE;
- }
- libName = defaultGlide;
- }
-
- {
- const char *env = getenv("LIBGL_DEBUG");
- if (env && strstr(env, "verbose")) {
- fprintf(stderr, "libGL: using Glide library %s\n", libName);
- }
- }
-
-#define GET_FUNCTION(PTR, NAME) \
- tmesa->Glide.PTR = dlsym(libHandle, NAME); \
- if (!tmesa->Glide.PTR) { \
- __driUtilMessage("couldn't find Glide function %s in %s.", \
- NAME, libName); \
- }
-
- GET_FUNCTION(grDrawPoint, "grDrawPoint");
- GET_FUNCTION(grDrawLine, "grDrawLine");
- GET_FUNCTION(grDrawTriangle, "grDrawTriangle");
- GET_FUNCTION(grVertexLayout, "grVertexLayout");
- GET_FUNCTION(grDrawVertexArray, "grDrawVertexArray");
- GET_FUNCTION(grDrawVertexArrayContiguous, "grDrawVertexArrayContiguous");
- GET_FUNCTION(grBufferClear, "grBufferClear");
- /*GET_FUNCTION(grBufferSwap, "grBufferSwap");*/
- GET_FUNCTION(grRenderBuffer, "grRenderBuffer");
- GET_FUNCTION(grErrorSetCallback, "grErrorSetCallback");
- GET_FUNCTION(grFinish, "grFinish");
- GET_FUNCTION(grFlush, "grFlush");
- GET_FUNCTION(grSstWinOpen, "grSstWinOpen");
- GET_FUNCTION(grSstWinClose, "grSstWinClose");
-#if 0
- /* Not in V3 lib, and not used anyway. */
- GET_FUNCTION(grSetNumPendingBuffers, "grSetNumPendingBuffers");
-#endif
- GET_FUNCTION(grSelectContext, "grSelectContext");
- GET_FUNCTION(grSstOrigin, "grSstOrigin");
- GET_FUNCTION(grSstSelect, "grSstSelect");
- GET_FUNCTION(grAlphaBlendFunction, "grAlphaBlendFunction");
- GET_FUNCTION(grAlphaCombine, "grAlphaCombine");
- GET_FUNCTION(grAlphaControlsITRGBLighting, "grAlphaControlsITRGBLighting");
- GET_FUNCTION(grAlphaTestFunction, "grAlphaTestFunction");
- GET_FUNCTION(grAlphaTestReferenceValue, "grAlphaTestReferenceValue");
- GET_FUNCTION(grChromakeyMode, "grChromakeyMode");
- GET_FUNCTION(grChromakeyValue, "grChromakeyValue");
- GET_FUNCTION(grClipWindow, "grClipWindow");
- GET_FUNCTION(grColorCombine, "grColorCombine");
- GET_FUNCTION(grColorMask, "grColorMask");
- GET_FUNCTION(grCullMode, "grCullMode");
- GET_FUNCTION(grConstantColorValue, "grConstantColorValue");
- GET_FUNCTION(grDepthBiasLevel, "grDepthBiasLevel");
- GET_FUNCTION(grDepthBufferFunction, "grDepthBufferFunction");
- GET_FUNCTION(grDepthBufferMode, "grDepthBufferMode");
- GET_FUNCTION(grDepthMask, "grDepthMask");
- GET_FUNCTION(grDisableAllEffects, "grDisableAllEffects");
- GET_FUNCTION(grDitherMode, "grDitherMode");
- GET_FUNCTION(grFogColorValue, "grFogColorValue");
- GET_FUNCTION(grFogMode, "grFogMode");
- GET_FUNCTION(grFogTable, "grFogTable");
- GET_FUNCTION(grLoadGammaTable, "grLoadGammaTable");
- GET_FUNCTION(grSplash, "grSplash");
- GET_FUNCTION(grGet, "grGet");
- GET_FUNCTION(grGetString, "grGetString");
- GET_FUNCTION(grQueryResolutions, "grQueryResolutions");
- GET_FUNCTION(grReset, "grReset");
- GET_FUNCTION(grGetProcAddress, "grGetProcAddress");
- GET_FUNCTION(grEnable, "grEnable");
- GET_FUNCTION(grDisable, "grDisable");
- GET_FUNCTION(grCoordinateSpace, "grCoordinateSpace");
- GET_FUNCTION(grDepthRange, "grDepthRange");
- GET_FUNCTION(grStippleMode, "grStippleMode");
- GET_FUNCTION(grStipplePattern, "grStipplePattern");
- GET_FUNCTION(grViewport, "grViewport");
- GET_FUNCTION(grTexCalcMemRequired, "grTexCalcMemRequired");
- GET_FUNCTION(grTexTextureMemRequired, "grTexTextureMemRequired");
- GET_FUNCTION(grTexMinAddress, "grTexMinAddress");
- GET_FUNCTION(grTexMaxAddress, "grTexMaxAddress");
- GET_FUNCTION(grTexNCCTable, "grTexNCCTable");
- GET_FUNCTION(grTexSource, "grTexSource");
- GET_FUNCTION(grTexClampMode, "grTexClampMode");
- GET_FUNCTION(grTexCombine, "grTexCombine");
- GET_FUNCTION(grTexDetailControl, "grTexDetailControl");
- GET_FUNCTION(grTexFilterMode, "grTexFilterMode");
- GET_FUNCTION(grTexLodBiasValue, "grTexLodBiasValue");
- GET_FUNCTION(grTexDownloadMipMap, "grTexDownloadMipMap");
- GET_FUNCTION(grTexDownloadMipMapLevel, "grTexDownloadMipMapLevel");
- GET_FUNCTION(grTexDownloadMipMapLevelPartial, "grTexDownloadMipMapLevelPartial");
- GET_FUNCTION(grTexDownloadTable, "grTexDownloadTable");
- GET_FUNCTION(grTexDownloadTablePartial, "grTexDownloadTablePartial");
- GET_FUNCTION(grTexMipMapMode, "grTexMipMapMode");
- GET_FUNCTION(grTexMultibase, "grTexMultibase");
- GET_FUNCTION(grTexMultibaseAddress, "grTexMultibaseAddress");
- GET_FUNCTION(grLfbLock, "grLfbLock");
- GET_FUNCTION(grLfbUnlock, "grLfbUnlock");
- GET_FUNCTION(grLfbConstantAlpha, "grLfbConstantAlpha");
- GET_FUNCTION(grLfbConstantDepth, "grLfbConstantDepth");
- GET_FUNCTION(grLfbWriteColorSwizzle, "grLfbWriteColorSwizzle");
- GET_FUNCTION(grLfbWriteColorFormat, "grLfbWriteColorFormat");
- GET_FUNCTION(grLfbWriteRegion, "grLfbWriteRegion");
- GET_FUNCTION(grLfbReadRegion, "grLfbReadRegion");
- GET_FUNCTION(grGlideInit, "grGlideInit");
- GET_FUNCTION(grGlideShutdown, "grGlideShutdown");
- GET_FUNCTION(grGlideGetState, "grGlideGetState");
- GET_FUNCTION(grGlideSetState, "grGlideSetState");
- GET_FUNCTION(grGlideGetVertexLayout, "grGlideGetVertexLayout");
- GET_FUNCTION(grGlideSetVertexLayout, "grGlideSetVertexLayout");
-
- /* Glide utility functions */
- GET_FUNCTION(guFogGenerateExp, "guFogGenerateExp");
- GET_FUNCTION(guFogGenerateExp2, "guFogGenerateExp2");
- GET_FUNCTION(guFogGenerateLinear, "guFogGenerateLinear");
-
- /* DRI functions */
- GET_FUNCTION(grDRIOpen, "grDRIOpen");
- GET_FUNCTION(grDRIPosition, "grDRIPosition");
- /*GET_FUNCTION(grDRILostContext, "grDRILostContext");*/
- GET_FUNCTION(grDRIImportFifo, "grDRIImportFifo");
- GET_FUNCTION(grDRIInvalidateAll, "grDRIInvalidateAll");
- GET_FUNCTION(grDRIResetSAREA, "grDRIResetSAREA");
- GET_FUNCTION(grDRIBufferSwap, "grDRIBufferSwap");
-
- /*
- * Extension functions:
- * Just use dlysm() because we want a NULL pointer if the function is
- * not found.
- */
- /* PIXEXT extension */
- tmesa->Glide.grStencilFunc = dlsym(libHandle, "grStencilFunc");
- tmesa->Glide.grStencilMask = dlsym(libHandle, "grStencilMask");
- tmesa->Glide.grStencilOp = dlsym(libHandle, "grStencilOp");
- tmesa->Glide.grBufferClearExt = dlsym(libHandle, "grBufferClearExt");
- tmesa->Glide.grColorMaskExt = dlsym(libHandle, "grColorMaskExt");
- /* COMBINE extension */
- tmesa->Glide.grColorCombineExt = dlsym(libHandle, "grColorCombineExt");
- tmesa->Glide.grTexColorCombineExt = dlsym(libHandle, "grTexColorCombineExt");
- tmesa->Glide.grAlphaCombineExt = dlsym(libHandle, "grAlphaCombineExt");
- tmesa->Glide.grTexAlphaCombineExt = dlsym(libHandle, "grTexAlphaCombineExt");
- tmesa->Glide.grAlphaBlendFunctionExt = dlsym(libHandle, "grAlphaBlendFunctionExt");
- tmesa->Glide.grConstantColorValueExt = dlsym(libHandle, "grConstantColorValueExt");
- /* Texus 2 */
- tmesa->Glide.txImgQuantize = dlsym(libHandle, "txImgQuantize");
- tmesa->Glide.txImgDequantizeFXT1 = dlsym(libHandle, "_txImgDequantizeFXT1");
- tmesa->Glide.txErrorSetCallback = dlsym(libHandle, "txErrorSetCallback");
-
-#ifdef DEBUG_TRAP
- /* wrap the drawing functions so we can trap them */
- real_grDrawTriangle = tmesa->Glide.grDrawTriangle;
- tmesa->Glide.grDrawTriangle = debug_grDrawTriangle;
-
- real_grDrawPoint = tmesa->Glide.grDrawPoint;
- tmesa->Glide.grDrawPoint = debug_grDrawPoint;
-
- real_grDrawVertexArray = tmesa->Glide.grDrawVertexArray;
- tmesa->Glide.grDrawVertexArray = debug_grDrawVertexArray;
-
- real_grDrawVertexArrayContiguous = tmesa->Glide.grDrawVertexArrayContiguous;
- tmesa->Glide.grDrawVertexArrayContiguous = debug_grDrawVertexArrayContiguous;
-
- real_grClipWindow = tmesa->Glide.grClipWindow;
- tmesa->Glide.grClipWindow = debug_grClipWindow;
-
- real_grVertexLayout = tmesa->Glide.grVertexLayout;
- tmesa->Glide.grVertexLayout = debug_grVertexLayout;
-
- real_grGlideGetVertexLayout = tmesa->Glide.grGlideGetVertexLayout;
- tmesa->Glide.grGlideGetVertexLayout = debug_grGlideGetVertexLayout;
-
- real_grGlideSetVertexLayout = tmesa->Glide.grGlideSetVertexLayout;
- tmesa->Glide.grGlideSetVertexLayout = debug_grGlideSetVertexLayout;
-
- real_grTexDownloadMipMapLevel = tmesa->Glide.grTexDownloadMipMapLevel;
- tmesa->Glide.grTexDownloadMipMapLevel = debug_grTexDownloadMipMapLevel;
-
-#endif
- return GL_TRUE;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_context.h b/src/mesa/drivers/dri/tdfx/tdfx_context.h
deleted file mode 100644
index 7e2f0e00a8e..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_context.h
+++ /dev/null
@@ -1,1013 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * 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"
-#include "main/glheader.h"
-#if defined(__linux__)
-#include <signal.h>
-#endif
-
-#include "drm.h"
-#include "drm_sarea.h"
-#include "tdfx_glide.h"
-#include "xmlconfig.h"
-
-#include "main/clip.h"
-#include "main/context.h"
-#include "main/macros.h"
-#include "main/matrix.h"
-#include "main/imports.h"
-#include "main/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:
- */
- struct gl_context *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 */
- __DRIscreen *driScreen;
- __DRIcontext *driContext;
-
- /**
- * DRI drawable bound to this context for drawing.
- */
- __DRIdrawable *driDrawable;
-
- /**
- * DRI drawable bound to this context for reading.
- */
- __DRIdrawable *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( gl_api api,
- const struct gl_config *mesaVis,
- __DRIcontext *driContextPriv,
- void *sharedContextPrivate );
-
-extern void
-tdfxDestroyContext( __DRIcontext *driContextPriv );
-
-extern GLboolean
-tdfxUnbindContext( __DRIcontext *driContextPriv );
-
-extern GLboolean
-tdfxMakeCurrent( __DRIcontext *driContextPriv,
- __DRIdrawable *driDrawPriv,
- __DRIdrawable *driReadPriv );
-
-extern GLboolean
-tdfxInitGlide( tdfxContextPtr tmesa );
-
-extern void
-FX_grColorMaskv(struct gl_context *ctx, const GLboolean rgba[4]);
-
-extern void
-FX_grColorMaskv_NoLock(struct gl_context *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__ */
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_dd.c b/src/mesa/drivers/dri/tdfx/tdfx_dd.c
deleted file mode 100644
index e981f9abedf..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_dd.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* -*- 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.
- */
-
-/**
- * \file tdfx_dd.c
- * Device driver interface functions for 3Dfx based cards.
- *
- * \author Gareth Hughes <gareth@valinux.com> (Original rewrite 29 Sep - 1 Oct 2000)
- * \author Brian Paul <brianp@valinux.com>
- */
-
-#include "tdfx_context.h"
-#include "tdfx_dd.h"
-#include "tdfx_lock.h"
-#include "tdfx_pixels.h"
-
-#include "utils.h"
-#include "main/context.h"
-
-
-/* These are used in calls to FX_grColorMaskv() */
-const GLboolean false4[4] = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE };
-const GLboolean true4[4] = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE };
-
-
-
-/* KW: Put the word Mesa in the render string because quakeworld
- * checks for this rather than doing a glGet(GL_MAX_TEXTURE_SIZE).
- * Why?
- */
-static const GLubyte *tdfxDDGetString( struct gl_context *ctx, GLenum name )
-{
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
-
- switch (name) {
- case GL_RENDERER:
- {
- /* The renderer string must be per-context state to handle
- * multihead correctly.
- */
- char *const buffer = fxMesa->rendererString;
- char hardware[64];
-
- LOCK_HARDWARE(fxMesa);
- strncpy(hardware, fxMesa->Glide.grGetString(GR_HARDWARE),
- sizeof(hardware));
- hardware[sizeof(hardware) - 1] = '\0';
- UNLOCK_HARDWARE(fxMesa);
-
- if ((strncmp(hardware, "Voodoo3", 7) == 0)
- || (strncmp(hardware, "Voodoo4", 7) == 0)
- || (strncmp(hardware, "Voodoo5", 7) == 0)) {
- hardware[7] = '\0';
- }
- else if (strncmp(hardware, "Voodoo Banshee", 14) == 0) {
- strcpy(&hardware[6], "Banshee");
- }
- else {
- /* unexpected result: replace spaces with hyphens */
- int i;
- for (i = 0; i < sizeof(hardware) && hardware[i]; i++) {
- if (hardware[i] == ' ' || hardware[i] == '\t') {
- hardware[i] = '-';
- }
- }
- }
-
- (void) driGetRendererString(buffer, hardware, 0);
- return (const GLubyte *) buffer;
- }
- case GL_VENDOR:
- return (const GLubyte *)"VA Linux Systems, Inc.";
- default:
- return NULL;
- }
-}
-
-
-static void
-tdfxBeginQuery(struct gl_context *ctx, struct gl_query_object *q)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- (void) q;
-
- if (q->Target == GL_SAMPLES_PASSED_ARB) {
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grFinish();
- fxMesa->Glide.grReset(GR_STATS_PIXELS);
- UNLOCK_HARDWARE(fxMesa);
- }
-}
-
-
-static void
-tdfxEndQuery(struct gl_context *ctx, struct gl_query_object *q)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FxI32 total_pixels;
- FxI32 z_fail_pixels;
-
-
- if (q->Target == GL_SAMPLES_PASSED_ARB) {
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grFinish();
-
- fxMesa->Glide.grGet(GR_STATS_PIXELS_DEPTHFUNC_FAIL, sizeof(FxI32),
- &z_fail_pixels);
- fxMesa->Glide.grGet(GR_STATS_PIXELS_IN, sizeof(FxI32), &total_pixels);
-
- q->Result = total_pixels - z_fail_pixels;
-
- /* Apparently, people have seen z_fail_pixels > total_pixels under
- * some conditions on some 3Dfx hardware. The occlusion query spec
- * requires that we clamp to 0.
- */
- if (q->Result < 0) {
- q->Result = 0;
- }
-
- q->Ready = GL_TRUE;
-
- UNLOCK_HARDWARE(fxMesa);
- }
-}
-
-
-#define VISUAL_EQUALS_RGBA(vis, r, g, b, a) \
- ((vis->redBits == r) && \
- (vis->greenBits == g) && \
- (vis->blueBits == b) && \
- (vis->alphaBits == a))
-
-void tdfxDDInitDriverFuncs( const struct gl_config *visual,
- struct dd_function_table *functions )
-{
- if ( MESA_VERBOSE & VERBOSE_DRIVER ) {
- fprintf( stderr, "tdfx: %s()\n", __FUNCTION__ );
- }
-
- functions->GetString = tdfxDDGetString;
- functions->BeginQuery = tdfxBeginQuery;
- functions->EndQuery = tdfxEndQuery;
-
- /* Accelerated paths
- */
- if ( VISUAL_EQUALS_RGBA(visual, 8, 8, 8, 8) )
- {
- functions->DrawPixels = tdfx_drawpixels_R8G8B8A8;
- functions->ReadPixels = tdfx_readpixels_R8G8B8A8;
- }
- else if ( VISUAL_EQUALS_RGBA(visual, 5, 6, 5, 0) )
- {
- functions->ReadPixels = tdfx_readpixels_R5G6B5;
- }
-}
-
-
-/*
- * These are here for lack of a better place.
- */
-
-void
-FX_grColorMaskv(struct gl_context *ctx, const GLboolean rgba[4])
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- LOCK_HARDWARE(fxMesa);
- if (ctx->Visual.redBits == 8) {
- /* 32bpp mode */
- ASSERT( fxMesa->Glide.grColorMaskExt );
- fxMesa->Glide.grColorMaskExt(rgba[RCOMP], rgba[GCOMP],
- rgba[BCOMP], rgba[ACOMP]);
- }
- else {
- /* 16 bpp mode */
- /* we never have an alpha buffer */
- fxMesa->Glide.grColorMask(rgba[RCOMP] || rgba[GCOMP] || rgba[BCOMP],
- GL_FALSE);
- }
- UNLOCK_HARDWARE(fxMesa);
-}
-
-void
-FX_grColorMaskv_NoLock(struct gl_context *ctx, const GLboolean rgba[4])
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- if (ctx->Visual.redBits == 8) {
- /* 32bpp mode */
- ASSERT( fxMesa->Glide.grColorMaskExt );
- fxMesa->Glide.grColorMaskExt(rgba[RCOMP], rgba[GCOMP],
- rgba[BCOMP], rgba[ACOMP]);
- }
- else {
- /* 16 bpp mode */
- /* we never have an alpha buffer */
- fxMesa->Glide.grColorMask(rgba[RCOMP] || rgba[GCOMP] || rgba[BCOMP],
- GL_FALSE);
- }
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_dd.h b/src/mesa/drivers/dri/tdfx/tdfx_dd.h
deleted file mode 100644
index d68e1ece1bd..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_dd.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#ifndef __TDFX_DD_H__
-#define __TDFX_DD_H__
-
-#include "main/context.h"
-
-extern void tdfxDDInitDriverFuncs( const struct gl_config *visual,
- struct dd_function_table *functions );
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_glide.h b/src/mesa/drivers/dri/tdfx/tdfx_glide.h
deleted file mode 100644
index 69e5399e729..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_glide.h
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * This file defines macros and types necessary for accessing glide3.
- */
-
-
-#ifndef NEWGLIDE_H
-#define NEWGLIDE_H
-
-#define FX_CALL
-
-typedef unsigned char FxU8;
-typedef signed char FxI8;
-typedef unsigned short FxU16;
-typedef signed short FxI16;
-#if defined(__alpha__) || defined (__LP64__)
-typedef signed int FxI32;
-typedef unsigned int FxU32;
-#else
-typedef signed long FxI32;
-typedef unsigned long FxU32;
-#endif
-typedef unsigned long AnyPtr;
-typedef int FxBool;
-typedef float FxFloat;
-typedef double FxDouble;
-
-typedef unsigned long FxColor_t;
-typedef struct
-{
- float r, g, b, a;
-}
-FxColor4;
-
-typedef FxU32 GrColor_t;
-typedef FxU8 GrAlpha_t;
-typedef FxU32 GrMipMapId_t;
-typedef FxU32 GrStipplePattern_t;
-typedef FxU8 GrFog_t;
-typedef FxU32 GrContext_t;
-typedef int (FX_CALL * GrProc) (void);
-
-#define FXTRUE 1
-#define FXFALSE 0
-
-#define FXBIT(i) (1L << (i))
-
-#define GR_NULL_MIPMAP_HANDLE ((GrMipMapId_t) -1)
-
-#define GR_MIPMAPLEVELMASK_EVEN FXBIT(0)
-#define GR_MIPMAPLEVELMASK_ODD FXBIT(1)
-#define GR_MIPMAPLEVELMASK_BOTH (GR_MIPMAPLEVELMASK_EVEN | GR_MIPMAPLEVELMASK_ODD )
-
-typedef FxI32 GrChipID_t;
-#define GR_TMU0 0x0
-#define GR_TMU1 0x1
-#define GR_TMU2 0x2
-
-#define GR_FBI 0x0
-
-typedef FxI32 GrCombineFunction_t;
-#define GR_COMBINE_FUNCTION_ZERO 0x0
-#define GR_COMBINE_FUNCTION_NONE GR_COMBINE_FUNCTION_ZERO
-#define GR_COMBINE_FUNCTION_LOCAL 0x1
-#define GR_COMBINE_FUNCTION_LOCAL_ALPHA 0x2
-#define GR_COMBINE_FUNCTION_SCALE_OTHER 0x3
-#define GR_COMBINE_FUNCTION_BLEND_OTHER GR_COMBINE_FUNCTION_SCALE_OTHER
-#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL 0x4
-#define GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA 0x5
-#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL 0x6
-#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL 0x7
-#define GR_COMBINE_FUNCTION_BLEND GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL
-#define GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x8
-#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL 0x9
-#define GR_COMBINE_FUNCTION_BLEND_LOCAL GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL
-#define GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA 0x10
-
-typedef FxI32 GrCombineFactor_t;
-#define GR_COMBINE_FACTOR_ZERO 0x0
-#define GR_COMBINE_FACTOR_NONE GR_COMBINE_FACTOR_ZERO
-#define GR_COMBINE_FACTOR_LOCAL 0x1
-#define GR_COMBINE_FACTOR_OTHER_ALPHA 0x2
-#define GR_COMBINE_FACTOR_LOCAL_ALPHA 0x3
-#define GR_COMBINE_FACTOR_TEXTURE_ALPHA 0x4
-#define GR_COMBINE_FACTOR_TEXTURE_RGB 0x5
-#define GR_COMBINE_FACTOR_DETAIL_FACTOR GR_COMBINE_FACTOR_TEXTURE_ALPHA
-#define GR_COMBINE_FACTOR_LOD_FRACTION 0x5
-#define GR_COMBINE_FACTOR_ONE 0x8
-#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL 0x9
-#define GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA 0xa
-#define GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA 0xb
-#define GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA 0xc
-#define GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA
-#define GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION 0xd
-
-typedef FxI32 GrCombineLocal_t;
-#define GR_COMBINE_LOCAL_ITERATED 0x0
-#define GR_COMBINE_LOCAL_CONSTANT 0x1
-#define GR_COMBINE_LOCAL_NONE GR_COMBINE_LOCAL_CONSTANT
-#define GR_COMBINE_LOCAL_DEPTH 0x2
-
-typedef FxI32 GrCombineOther_t;
-#define GR_COMBINE_OTHER_ITERATED 0x0
-#define GR_COMBINE_OTHER_TEXTURE 0x1
-#define GR_COMBINE_OTHER_CONSTANT 0x2
-#define GR_COMBINE_OTHER_NONE GR_COMBINE_OTHER_CONSTANT
-
-typedef FxI32 GrAlphaSource_t;
-#define GR_ALPHASOURCE_CC_ALPHA 0x0
-#define GR_ALPHASOURCE_ITERATED_ALPHA 0x1
-#define GR_ALPHASOURCE_TEXTURE_ALPHA 0x2
-#define GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA 0x3
-
-typedef FxI32 GrColorCombineFnc_t;
-#define GR_COLORCOMBINE_ZERO 0x0
-#define GR_COLORCOMBINE_CCRGB 0x1
-#define GR_COLORCOMBINE_ITRGB 0x2
-#define GR_COLORCOMBINE_ITRGB_DELTA0 0x3
-#define GR_COLORCOMBINE_DECAL_TEXTURE 0x4
-#define GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB 0x5
-#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB 0x6
-#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0 0x7
-#define GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA 0x8
-#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA 0x9
-#define GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB 0xa
-#define GR_COLORCOMBINE_TEXTURE_ADD_ITRGB 0xb
-#define GR_COLORCOMBINE_TEXTURE_SUB_ITRGB 0xc
-#define GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA 0xd
-#define GR_COLORCOMBINE_DIFF_SPEC_A 0xe
-#define GR_COLORCOMBINE_DIFF_SPEC_B 0xf
-#define GR_COLORCOMBINE_ONE 0x10
-
-typedef FxI32 GrAlphaBlendFnc_t;
-#define GR_BLEND_ZERO 0x0
-#define GR_BLEND_SRC_ALPHA 0x1
-#define GR_BLEND_SRC_COLOR 0x2
-#define GR_BLEND_DST_COLOR GR_BLEND_SRC_COLOR
-#define GR_BLEND_DST_ALPHA 0x3
-#define GR_BLEND_ONE 0x4
-#define GR_BLEND_ONE_MINUS_SRC_ALPHA 0x5
-#define GR_BLEND_ONE_MINUS_SRC_COLOR 0x6
-#define GR_BLEND_ONE_MINUS_DST_COLOR GR_BLEND_ONE_MINUS_SRC_COLOR
-#define GR_BLEND_ONE_MINUS_DST_ALPHA 0x7
-#define GR_BLEND_RESERVED_8 0x8
-#define GR_BLEND_RESERVED_9 0x9
-#define GR_BLEND_RESERVED_A 0xa
-#define GR_BLEND_RESERVED_B 0xb
-#define GR_BLEND_RESERVED_C 0xc
-#define GR_BLEND_RESERVED_D 0xd
-#define GR_BLEND_RESERVED_E 0xe
-#define GR_BLEND_ALPHA_SATURATE 0xf
-#define GR_BLEND_PREFOG_COLOR GR_BLEND_ALPHA_SATURATE
-#define GR_BLEND_SAME_COLOR_EXT 0x08
-#define GR_BLEND_ONE_MINUS_SAME_COLOR_EXT 0x09
-
-typedef FxI32 GrAspectRatio_t;
-#define GR_ASPECT_LOG2_8x1 3
-#define GR_ASPECT_LOG2_4x1 2
-#define GR_ASPECT_LOG2_2x1 1
-#define GR_ASPECT_LOG2_1x1 0
-#define GR_ASPECT_LOG2_1x2 -1
-#define GR_ASPECT_LOG2_1x4 -2
-#define GR_ASPECT_LOG2_1x8 -3
-
-typedef FxI32 GrBuffer_t;
-#define GR_BUFFER_FRONTBUFFER 0x0
-#define GR_BUFFER_BACKBUFFER 0x1
-#define GR_BUFFER_AUXBUFFER 0x2
-#define GR_BUFFER_DEPTHBUFFER 0x3
-#define GR_BUFFER_ALPHABUFFER 0x4
-#define GR_BUFFER_TRIPLEBUFFER 0x5
-
-typedef FxI32 GrChromakeyMode_t;
-#define GR_CHROMAKEY_DISABLE 0x0
-#define GR_CHROMAKEY_ENABLE 0x1
-
-typedef FxI32 GrChromaRangeMode_t;
-#define GR_CHROMARANGE_RGB_ALL_EXT 0x0
-
-#define GR_CHROMARANGE_DISABLE_EXT 0x00
-#define GR_CHROMARANGE_ENABLE_EXT 0x01
-
-typedef FxI32 GrTexChromakeyMode_t;
-#define GR_TEXCHROMA_DISABLE_EXT 0x0
-#define GR_TEXCHROMA_ENABLE_EXT 0x1
-
-#define GR_TEXCHROMARANGE_RGB_ALL_EXT 0x0
-
-typedef FxI32 GrCmpFnc_t;
-#define GR_CMP_NEVER 0x0
-#define GR_CMP_LESS 0x1
-#define GR_CMP_EQUAL 0x2
-#define GR_CMP_LEQUAL 0x3
-#define GR_CMP_GREATER 0x4
-#define GR_CMP_NOTEQUAL 0x5
-#define GR_CMP_GEQUAL 0x6
-#define GR_CMP_ALWAYS 0x7
-
-typedef FxI32 GrColorFormat_t;
-#define GR_COLORFORMAT_ARGB 0x0
-#define GR_COLORFORMAT_ABGR 0x1
-
-#define GR_COLORFORMAT_RGBA 0x2
-#define GR_COLORFORMAT_BGRA 0x3
-
-typedef FxI32 GrCullMode_t;
-#define GR_CULL_DISABLE 0x0
-#define GR_CULL_NEGATIVE 0x1
-#define GR_CULL_POSITIVE 0x2
-
-typedef FxI32 GrDepthBufferMode_t;
-#define GR_DEPTHBUFFER_DISABLE 0x0
-#define GR_DEPTHBUFFER_ZBUFFER 0x1
-#define GR_DEPTHBUFFER_WBUFFER 0x2
-#define GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS 0x3
-#define GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS 0x4
-
-typedef FxI32 GrDitherMode_t;
-#define GR_DITHER_DISABLE 0x0
-#define GR_DITHER_2x2 0x1
-#define GR_DITHER_4x4 0x2
-
-typedef FxI32 GrStippleMode_t;
-#define GR_STIPPLE_DISABLE 0x0
-#define GR_STIPPLE_PATTERN 0x1
-#define GR_STIPPLE_ROTATE 0x2
-
-typedef FxI32 GrFogMode_t;
-#define GR_FOG_DISABLE 0x0
-#define GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT 0x1
-#define GR_FOG_WITH_TABLE_ON_Q 0x2
-#define GR_FOG_WITH_TABLE_ON_W GR_FOG_WITH_TABLE_ON_Q
-#define GR_FOG_WITH_ITERATED_Z 0x3
-#define GR_FOG_WITH_ITERATED_ALPHA_EXT 0x4
-#define GR_FOG_MULT2 0x100
-#define GR_FOG_ADD2 0x200
-
-typedef FxU32 GrLock_t;
-#define GR_LFB_READ_ONLY 0x00
-#define GR_LFB_WRITE_ONLY 0x01
-#define GR_LFB_IDLE 0x00
-#define GR_LFB_NOIDLE 0x10
-
-typedef FxI32 GrLfbBypassMode_t;
-#define GR_LFBBYPASS_DISABLE 0x0
-#define GR_LFBBYPASS_ENABLE 0x1
-
-typedef FxI32 GrLfbWriteMode_t;
-#define GR_LFBWRITEMODE_565 0x0
-#define GR_LFBWRITEMODE_555 0x1
-#define GR_LFBWRITEMODE_1555 0x2
-#define GR_LFBWRITEMODE_RESERVED1 0x3
-#define GR_LFBWRITEMODE_888 0x4
-#define GR_LFBWRITEMODE_8888 0x5
-#define GR_LFBWRITEMODE_RESERVED2 0x6
-#define GR_LFBWRITEMODE_RESERVED3 0x7
-#define GR_LFBWRITEMODE_RESERVED4 0x8
-#define GR_LFBWRITEMODE_RESERVED5 0x9
-#define GR_LFBWRITEMODE_RESERVED6 0xa
-#define GR_LFBWRITEMODE_RESERVED7 0xb
-#define GR_LFBWRITEMODE_565_DEPTH 0xc
-#define GR_LFBWRITEMODE_555_DEPTH 0xd
-#define GR_LFBWRITEMODE_1555_DEPTH 0xe
-#define GR_LFBWRITEMODE_ZA16 0xf
-#define GR_LFBWRITEMODE_ANY 0xFF
-
-typedef FxI32 GrOriginLocation_t;
-#define GR_ORIGIN_UPPER_LEFT 0x0
-#define GR_ORIGIN_LOWER_LEFT 0x1
-#define GR_ORIGIN_ANY 0xFF
-
-typedef struct
-{
- int size;
- void *lfbPtr;
- FxU32 strideInBytes;
- GrLfbWriteMode_t writeMode;
- GrOriginLocation_t origin;
-}
-GrLfbInfo_t;
-
-typedef FxI32 GrLOD_t;
-#define GR_LOD_LOG2_2048 0xb
-#define GR_LOD_LOG2_1024 0xa
-#define GR_LOD_LOG2_512 0x9
-#define GR_LOD_LOG2_256 0x8
-#define GR_LOD_LOG2_128 0x7
-#define GR_LOD_LOG2_64 0x6
-#define GR_LOD_LOG2_32 0x5
-#define GR_LOD_LOG2_16 0x4
-#define GR_LOD_LOG2_8 0x3
-#define GR_LOD_LOG2_4 0x2
-#define GR_LOD_LOG2_2 0x1
-#define GR_LOD_LOG2_1 0x0
-
-typedef FxI32 GrMipMapMode_t;
-#define GR_MIPMAP_DISABLE 0x0
-#define GR_MIPMAP_NEAREST 0x1
-#define GR_MIPMAP_NEAREST_DITHER 0x2
-
-typedef FxI32 GrSmoothingMode_t;
-#define GR_SMOOTHING_DISABLE 0x0
-#define GR_SMOOTHING_ENABLE 0x1
-
-typedef FxI32 GrTextureClampMode_t;
-#define GR_TEXTURECLAMP_WRAP 0x0
-#define GR_TEXTURECLAMP_CLAMP 0x1
-#define GR_TEXTURECLAMP_MIRROR_EXT 0x2
-
-typedef FxI32 GrTextureCombineFnc_t;
-#define GR_TEXTURECOMBINE_ZERO 0x0
-#define GR_TEXTURECOMBINE_DECAL 0x1
-#define GR_TEXTURECOMBINE_OTHER 0x2
-#define GR_TEXTURECOMBINE_ADD 0x3
-#define GR_TEXTURECOMBINE_MULTIPLY 0x4
-#define GR_TEXTURECOMBINE_SUBTRACT 0x5
-#define GR_TEXTURECOMBINE_DETAIL 0x6
-#define GR_TEXTURECOMBINE_DETAIL_OTHER 0x7
-#define GR_TEXTURECOMBINE_TRILINEAR_ODD 0x8
-#define GR_TEXTURECOMBINE_TRILINEAR_EVEN 0x9
-#define GR_TEXTURECOMBINE_ONE 0xa
-
-typedef FxI32 GrTextureFilterMode_t;
-#define GR_TEXTUREFILTER_POINT_SAMPLED 0x0
-#define GR_TEXTUREFILTER_BILINEAR 0x1
-
-typedef FxI32 GrTextureFormat_t;
-#define GR_TEXFMT_8BIT 0x0
-#define GR_TEXFMT_RGB_332 GR_TEXFMT_8BIT
-#define GR_TEXFMT_YIQ_422 0x1
-#define GR_TEXFMT_ALPHA_8 0x2
-#define GR_TEXFMT_INTENSITY_8 0x3
-#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4
-#define GR_TEXFMT_P_8 0x5
-#define GR_TEXFMT_RSVD0 0x6
-#define GR_TEXFMT_RSVD1 0x7
-#define GR_TEXFMT_16BIT 0x8
-#define GR_TEXFMT_ARGB_8332 GR_TEXFMT_16BIT
-#define GR_TEXFMT_AYIQ_8422 0x9
-#define GR_TEXFMT_RGB_565 0xa
-#define GR_TEXFMT_ARGB_1555 0xb
-#define GR_TEXFMT_ARGB_4444 0xc
-#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd
-#define GR_TEXFMT_AP_88 0xe
-#define GR_TEXFMT_RSVD2 0xf
-#define GR_TEXFMT_ARGB_CMP_FXT1 0x11
-#define GR_TEXFMT_ARGB_8888 0x12
-#define GR_TEXFMT_YUYV_422 0x13
-#define GR_TEXFMT_UYVY_422 0x14
-#define GR_TEXFMT_AYUV_444 0x15
-#define GR_TEXFMT_ARGB_CMP_DXT1 0x16
-#define GR_TEXFMT_ARGB_CMP_DXT2 0x17
-#define GR_TEXFMT_ARGB_CMP_DXT3 0x18
-#define GR_TEXFMT_ARGB_CMP_DXT4 0x19
-#define GR_TEXFMT_ARGB_CMP_DXT5 0x1A
-
-typedef FxU32 GrTexTable_t;
-#define GR_TEXTABLE_NCC0 0x0
-#define GR_TEXTABLE_NCC1 0x1
-#define GR_TEXTABLE_PALETTE 0x2
-#define GR_TEXTABLE_PALETTE_6666_EXT 0x3
-
-typedef FxU32 GrNCCTable_t;
-#define GR_NCCTABLE_NCC0 0x0
-#define GR_NCCTABLE_NCC1 0x1
-
-typedef FxU32 GrTexBaseRange_t;
-#define GR_TEXBASE_256 0x3
-#define GR_TEXBASE_128 0x2
-#define GR_TEXBASE_64 0x1
-#define GR_TEXBASE_32_TO_1 0x0
-#define GR_TEXBASE_2048 0x7
-#define GR_TEXBASE_1024 0x6
-#define GR_TEXBASE_512 0x5
-#define GR_TEXBASE_256_TO_1 0x4
-
-typedef FxU32 GrEnableMode_t;
-#define GR_MODE_DISABLE 0x0
-#define GR_MODE_ENABLE 0x1
-
-#define GR_AA_ORDERED 0x01
-#define GR_ALLOW_MIPMAP_DITHER 0x02
-#define GR_PASSTHRU 0x03
-#define GR_SHAMELESS_PLUG 0x04
-#define GR_VIDEO_SMOOTHING 0x05
-
-typedef FxU32 GrCoordinateSpaceMode_t;
-#define GR_WINDOW_COORDS 0x00
-#define GR_CLIP_COORDS 0x01
-
-/* Parameters for strips */
-#define GR_PARAM_XY 0x01
-#define GR_PARAM_Z 0x02
-#define GR_PARAM_W 0x03
-#define GR_PARAM_Q 0x04
-#define GR_PARAM_FOG_EXT 0x05
-
-#define GR_PARAM_A 0x10
-
-#define GR_PARAM_RGB 0x20
-
-#define GR_PARAM_PARGB 0x30
-
-#define GR_PARAM_ST0 0x40
-#define GR_PARAM_ST1 GR_PARAM_ST0+1
-#define GR_PARAM_ST2 GR_PARAM_ST0+2
-
-#define GR_PARAM_Q0 0x50
-#define GR_PARAM_Q1 GR_PARAM_Q0+1
-#define GR_PARAM_Q2 GR_PARAM_Q0+2
-
-#define GR_PARAM_DISABLE 0x00
-#define GR_PARAM_ENABLE 0x01
-
-/* grDrawVertexArray/grDrawVertexArrayContiguous */
-#define GR_POINTS 0
-#define GR_LINE_STRIP 1
-#define GR_LINES 2
-#define GR_POLYGON 3
-#define GR_TRIANGLE_STRIP 4
-#define GR_TRIANGLE_FAN 5
-#define GR_TRIANGLES 6
-#define GR_TRIANGLE_STRIP_CONTINUE 7
-#define GR_TRIANGLE_FAN_CONTINUE 8
-
-/* grGet/grReset */
-#define GR_BITS_DEPTH 0x01
-#define GR_BITS_RGBA 0x02
-#define GR_FIFO_FULLNESS 0x03
-#define GR_FOG_TABLE_ENTRIES 0x04
-#define GR_GAMMA_TABLE_ENTRIES 0x05
-#define GR_GLIDE_STATE_SIZE 0x06
-#define GR_GLIDE_VERTEXLAYOUT_SIZE 0x07
-#define GR_IS_BUSY 0x08
-#define GR_LFB_PIXEL_PIPE 0x09
-#define GR_MAX_TEXTURE_SIZE 0x0a
-#define GR_MAX_TEXTURE_ASPECT_RATIO 0x0b
-#define GR_MEMORY_FB 0x0c
-#define GR_MEMORY_TMU 0x0d
-#define GR_MEMORY_UMA 0x0e
-#define GR_NUM_BOARDS 0x0f
-#define GR_NON_POWER_OF_TWO_TEXTURES 0x10
-#define GR_NUM_FB 0x11
-#define GR_NUM_SWAP_HISTORY_BUFFER 0x12
-#define GR_NUM_TMU 0x13
-#define GR_PENDING_BUFFERSWAPS 0x14
-#define GR_REVISION_FB 0x15
-#define GR_REVISION_TMU 0x16
-#define GR_STATS_LINES 0x17
-#define GR_STATS_PIXELS_AFUNC_FAIL 0x18
-#define GR_STATS_PIXELS_CHROMA_FAIL 0x19
-#define GR_STATS_PIXELS_DEPTHFUNC_FAIL 0x1a
-#define GR_STATS_PIXELS_IN 0x1b
-#define GR_STATS_PIXELS_OUT 0x1c
-#define GR_STATS_PIXELS 0x1d
-#define GR_STATS_POINTS 0x1e
-#define GR_STATS_TRIANGLES_IN 0x1f
-#define GR_STATS_TRIANGLES_OUT 0x20
-#define GR_STATS_TRIANGLES 0x21
-#define GR_SWAP_HISTORY 0x22
-#define GR_SUPPORTS_PASSTHRU 0x23
-#define GR_TEXTURE_ALIGN 0x24
-#define GR_VIDEO_POSITION 0x25
-#define GR_VIEWPORT 0x26
-#define GR_WDEPTH_MIN_MAX 0x27
-#define GR_ZDEPTH_MIN_MAX 0x28
-#define GR_VERTEX_PARAMETER 0x29
-#define GR_BITS_GAMMA 0x2a
-#define GR_GET_RESERVED_1 0x1000
-
-/* grGetString types */
-#define GR_EXTENSION 0xa0
-#define GR_HARDWARE 0xa1
-#define GR_RENDERER 0xa2
-#define GR_VENDOR 0xa3
-#define GR_VERSION 0xa4
-
-typedef FxI32 GrScreenRefresh_t;
-#define GR_REFRESH_NONE 0xff
-
-typedef FxI32 GrScreenResolution_t;
-#define GR_RESOLUTION_NONE 0xff
-
-typedef struct
-{
- GrLOD_t smallLodLog2;
- GrLOD_t largeLodLog2;
- GrAspectRatio_t aspectRatioLog2;
- GrTextureFormat_t format;
- void *data;
-}
-GrTexInfo;
-
-typedef struct GrSstPerfStats_s
-{
- FxU32 pixelsIn;
- FxU32 chromaFail;
- FxU32 zFuncFail;
- FxU32 aFuncFail;
- FxU32 pixelsOut;
-}
-GrSstPerfStats_t;
-
-typedef struct
-{
- GrScreenResolution_t resolution;
- GrScreenRefresh_t refresh;
- int numColorBuffers;
- int numAuxBuffers;
-}
-GrResolution;
-
-typedef GrResolution GlideResolution;
-#define GR_QUERY_ANY ((FxU32)(~0))
-
-typedef FxU32 GrLfbSrcFmt_t;
-#define GR_LFB_SRC_FMT_565 0x00
-#define GR_LFB_SRC_FMT_555 0x01
-#define GR_LFB_SRC_FMT_1555 0x02
-#define GR_LFB_SRC_FMT_888 0x04
-#define GR_LFB_SRC_FMT_8888 0x05
-#define GR_LFB_SRC_FMT_565_DEPTH 0x0c
-#define GR_LFB_SRC_FMT_555_DEPTH 0x0d
-#define GR_LFB_SRC_FMT_1555_DEPTH 0x0e
-#define GR_LFB_SRC_FMT_ZA16 0x0f
-#define GR_LFB_SRC_FMT_RLE16 0x80
-
-typedef FxU32 GrPixelFormat_t;
-#define GR_PIXFMT_I_8 0x0001
-#define GR_PIXFMT_AI_88 0x0002
-#define GR_PIXFMT_RGB_565 0x0003
-#define GR_PIXFMT_ARGB_1555 0x0004
-#define GR_PIXFMT_ARGB_8888 0x0005
-#define GR_PIXFMT_AA_2_RGB_565 0x0006
-#define GR_PIXFMT_AA_2_ARGB_1555 0x0007
-#define GR_PIXFMT_AA_2_ARGB_8888 0x0008
-#define GR_PIXFMT_AA_4_RGB_565 0x0009
-#define GR_PIXFMT_AA_4_ARGB_1555 0x000a
-#define GR_PIXFMT_AA_4_ARGB_8888 0x000b
-
-#define GR_LFBWRITEMODE_Z32 0x0008
-
-typedef FxU32 GrAAMode_t;
-#define GR_AA_NONE 0x0000
-#define GR_AA_4SAMPLES 0x0001
-
-typedef FxU8 GrStencil_t;
-
-typedef FxU32 GrStencilOp_t;
-#define GR_STENCILOP_KEEP 0x00
-#define GR_STENCILOP_ZERO 0x01
-#define GR_STENCILOP_REPLACE 0x02
-#define GR_STENCILOP_INCR_CLAMP 0x03
-#define GR_STENCILOP_DECR_CLAMP 0x04
-#define GR_STENCILOP_INVERT 0x05
-#define GR_STENCILOP_INCR_WRAP 0x06
-#define GR_STENCILOP_DECR_WRAP 0x07
-
-#define GR_TEXTURE_UMA_EXT 0x06
-#define GR_STENCIL_MODE_EXT 0x07
-#define GR_OPENGL_MODE_EXT 0x08
-
-typedef FxU32 GrCCUColor_t;
-typedef FxU32 GrACUColor_t;
-typedef FxU32 GrTCCUColor_t;
-typedef FxU32 GrTACUColor_t;
-#define GR_CMBX_ZERO 0x00
-#define GR_CMBX_TEXTURE_ALPHA 0x01
-#define GR_CMBX_ALOCAL 0x02
-#define GR_CMBX_AOTHER 0x03
-#define GR_CMBX_B 0x04
-#define GR_CMBX_CONSTANT_ALPHA 0x05
-#define GR_CMBX_CONSTANT_COLOR 0x06
-#define GR_CMBX_DETAIL_FACTOR 0x07
-#define GR_CMBX_ITALPHA 0x08
-#define GR_CMBX_ITRGB 0x09
-#define GR_CMBX_LOCAL_TEXTURE_ALPHA 0x0a
-#define GR_CMBX_LOCAL_TEXTURE_RGB 0x0b
-#define GR_CMBX_LOD_FRAC 0x0c
-#define GR_CMBX_OTHER_TEXTURE_ALPHA 0x0d
-#define GR_CMBX_OTHER_TEXTURE_RGB 0x0e
-#define GR_CMBX_TEXTURE_RGB 0x0f
-#define GR_CMBX_TMU_CALPHA 0x10
-#define GR_CMBX_TMU_CCOLOR 0x11
-
-typedef FxU32 GrCombineMode_t;
-#define GR_FUNC_MODE_ZERO 0x00
-#define GR_FUNC_MODE_X 0x01
-#define GR_FUNC_MODE_ONE_MINUS_X 0x02
-#define GR_FUNC_MODE_NEGATIVE_X 0x03
-#define GR_FUNC_MODE_X_MINUS_HALF 0x04
-
-typedef FxU32 GrAlphaBlendOp_t;
-#define GR_BLEND_OP_ADD 0x00
-#define GR_BLEND_OP_SUB 0x01
-#define GR_BLEND_OP_REVSUB 0x02
-
-typedef struct
-{
- FxU32 data[256];
-}
-GuTexPalette;
-
-typedef void (*GrErrorCallbackFnc_t) (const char *string, FxBool fatal);
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_lock.c b/src/mesa/drivers/dri/tdfx/tdfx_lock.c
deleted file mode 100644
index f218e4ee576..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_lock.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#include "tdfx_context.h"
-#include "tdfx_lock.h"
-#include "tdfx_state.h"
-#include "tdfx_render.h"
-#include "tdfx_texman.h"
-
-#include "drirenderbuffer.h"
-
-
-void tdfxGetLock( tdfxContextPtr fxMesa )
-{
- __DRIcontext *cPriv = fxMesa->driContext;
- __DRIdrawable *const drawable = cPriv->driDrawablePriv;
- __DRIdrawable *const readable = cPriv->driReadablePriv;
- __DRIscreen *sPriv = drawable->driScreenPriv;
- TDFXSAREAPriv *saPriv = (TDFXSAREAPriv *) (((char *) sPriv->pSAREA) +
- fxMesa->fxScreen->sarea_priv_offset);
- unsigned int stamp = drawable->lastStamp;
-
- drmGetLock( fxMesa->driFd, fxMesa->hHWContext, 0 );
-
- /* This macro will update drawable's cliprects if needed */
- DRI_VALIDATE_DRAWABLE_INFO(sPriv, drawable);
- if (drawable != readable) {
- DRI_VALIDATE_DRAWABLE_INFO(sPriv, readable);
- }
-
- if ( saPriv->fifoOwner != fxMesa->hHWContext ) {
- fxMesa->Glide.grDRIImportFifo( saPriv->fifoPtr, saPriv->fifoRead );
- }
-
- if ( saPriv->ctxOwner != fxMesa->hHWContext ) {
- /* This sequence looks a little odd. Glide mirrors the state, and
- * when you get the state you are forcing the mirror to be up to
- * date, and then getting a copy from the mirror. You can then force
- * that state onto the hardware when you set the state.
- */
- void *state;
- FxI32 stateSize;
- fxMesa->Glide.grGet(GR_GLIDE_STATE_SIZE, 4, &stateSize);
- state = malloc(stateSize);
- fxMesa->Glide.grGlideGetState( state );
- fxMesa->Glide.grGlideSetState( state );
- free( state );
- }
-
-#if 0
- if ( saPriv->texOwner != fxMesa->hHWContext ) {
- tdfxTMRestoreTextures_NoLock( fxMesa );
- }
-#endif
-
- if ((*drawable->pStamp != stamp)
- || (saPriv->ctxOwner != fxMesa->hHWContext)) {
- driUpdateFramebufferSize(fxMesa->glCtx, drawable);
- if (drawable != readable) {
- driUpdateFramebufferSize(fxMesa->glCtx, readable);
- }
-
- tdfxUpdateClipping(fxMesa->glCtx);
- tdfxUploadClipping(fxMesa);
- }
-
- DEBUG_LOCK();
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_lock.h b/src/mesa/drivers/dri/tdfx/tdfx_lock.h
deleted file mode 100644
index 74e3f5c9cc4..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_lock.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#ifndef __TDFX_LOCK_H__
-#define __TDFX_LOCK_H__
-
-/* You can turn this on to find locking conflicts.
- */
-#define DEBUG_LOCKING 0
-
-#if DEBUG_LOCKING
-extern char *prevLockFile;
-extern int prevLockLine;
-
-#define DEBUG_LOCK() \
- do { \
- prevLockFile = (__FILE__); \
- prevLockLine = (__LINE__); \
- } while (0)
-
-#define DEBUG_RESET() \
- do { \
- prevLockFile = 0; \
- prevLockLine = 0; \
- } while (0)
-
-#define DEBUG_CHECK_LOCK() \
- do { \
- if ( prevLockFile ) { \
- fprintf( stderr, \
- "LOCK SET!\n\tPrevious %s:%d\n\tCurrent: %s:%d\n", \
- prevLockFile, prevLockLine, __FILE__, __LINE__ ); \
- exit( 1 ); \
- } \
- } while (0)
-
-#else
-
-#define DEBUG_LOCK()
-#define DEBUG_RESET()
-#define DEBUG_CHECK_LOCK()
-
-#endif /* DEBUG_LOCKING */
-
-
-extern void tdfxGetLock( tdfxContextPtr fxMesa );
-
-
-/* !!! We may want to separate locks from locks with validation.
- This could be used to improve performance for those things
- commands that do not do any drawing !!! */
-
-#define DRM_LIGHT_LOCK_RETURN(fd,lock,context,__ret) \
- do { \
- DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
- if (__ret) drmGetLock(fd,context,0); \
- } while(0)
-
-#define LOCK_HARDWARE( fxMesa ) \
- do { \
- char __ret = 0; \
- \
- DEBUG_CHECK_LOCK(); \
- DRM_CAS( fxMesa->driHwLock, fxMesa->hHWContext, \
- DRM_LOCK_HELD | fxMesa->hHWContext, __ret ); \
- if ( __ret ) { \
- tdfxGetLock( fxMesa ); \
- } \
- DEBUG_LOCK(); \
- } while (0)
-
-/* Unlock the hardware using the global current context */
-#define UNLOCK_HARDWARE( fxMesa ) \
- do { \
- DRM_UNLOCK( fxMesa->driFd, fxMesa->driHwLock, fxMesa->hHWContext ); \
- DEBUG_RESET(); \
- } while (0)
-
-/*
- * This pair of macros makes a loop over the drawing operations
- * so it is not self contained and doesn't have the nice single
- * statement semantics of most macros.
- */
-#define BEGIN_CLIP_LOOP(fxMesa) \
- do { \
- LOCK_HARDWARE( fxMesa ); \
- BEGIN_CLIP_LOOP_LOCKED( fxMesa )
-
-#define BEGIN_CLIP_LOOP_LOCKED(fxMesa) \
- do { \
- int _nc = fxMesa->numClipRects; \
- while (_nc--) { \
- if (fxMesa->numClipRects > 1) { \
- int _height = fxMesa->screen_height; \
- fxMesa->Glide.grClipWindow(fxMesa->pClipRects[_nc].x1, \
- _height - fxMesa->pClipRects[_nc].y2, \
- fxMesa->pClipRects[_nc].x2, \
- _height - fxMesa->pClipRects[_nc].y1); \
- }
-
-
-#define END_CLIP_LOOP_LOCKED( fxMesa ) \
- } \
- } while (0)
-
-#define END_CLIP_LOOP( fxMesa ) \
- END_CLIP_LOOP_LOCKED( fxMesa ); \
- UNLOCK_HARDWARE( fxMesa ); \
- } while (0)
-
-#endif /* __TDFX_LOCK_H__ */
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_pixels.c b/src/mesa/drivers/dri/tdfx/tdfx_pixels.c
deleted file mode 100644
index bbbd0d5740f..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_pixels.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- * Nathan Hand <nhand@valinux.com>
- *
- */
-
-#include "tdfx_context.h"
-#include "tdfx_dd.h"
-#include "tdfx_lock.h"
-#include "tdfx_pixels.h"
-#include "tdfx_render.h"
-
-#include "swrast/swrast.h"
-
-#include "main/image.h"
-
-
-#define FX_grLfbWriteRegion(fxMesa,dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) \
- do { \
- LOCK_HARDWARE(fxMesa); \
- fxMesa->Glide.grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,FXFALSE,src_stride,src_data); \
- UNLOCK_HARDWARE(fxMesa); \
- } while(0)
-
-
-#define FX_grLfbReadRegion(fxMesa,src_buffer,src_x,src_y,src_width,src_height,dst_stride,dst_data) \
- do { \
- LOCK_HARDWARE(fxMesa); \
- fxMesa->Glide.grLfbReadRegion(src_buffer,src_x,src_y,src_width,src_height,dst_stride,dst_data); \
- UNLOCK_HARDWARE(fxMesa); \
- } while (0);
-
-
-#if 0
-static FxBool
-FX_grLfbLock(tdfxContextPtr fxMesa, GrLock_t type, GrBuffer_t buffer,
- GrLfbWriteMode_t writeMode, GrOriginLocation_t origin,
- FxBool pixelPipeline, GrLfbInfo_t * info)
-{
- FxBool result;
-
- LOCK_HARDWARE(fxMesa);
- result = fxMesa->Glide.grLfbLock(type, buffer, writeMode, origin, pixelPipeline, info);
- UNLOCK_HARDWARE(fxMesa);
- return result;
-}
-#endif
-
-
-#define FX_grLfbUnlock(fxMesa, t, b) \
- do { \
- LOCK_HARDWARE(fxMesa); \
- fxMesa->Glide.grLfbUnlock(t, b); \
- UNLOCK_HARDWARE(fxMesa); \
- } while (0)
-
-
-
-#if 0
-/* test if window coord (px,py) is visible */
-static GLboolean
-inClipRects(tdfxContextPtr fxMesa, int px, int py)
-{
- int i;
- for (i = 0; i < fxMesa->numClipRects; i++) {
- if ((px >= fxMesa->pClipRects[i].x1) &&
- (px < fxMesa->pClipRects[i].x2) &&
- (py >= fxMesa->pClipRects[i].y1) &&
- (py < fxMesa->pClipRects[i].y2)) return GL_TRUE;
- }
- return GL_FALSE;
-}
-#endif
-
-/* test if rectangle of pixels (px,py) (px+width,py+height) is visible */
-static GLboolean
-inClipRects_Region(tdfxContextPtr fxMesa, int x, int y, int width, int height)
-{
- int i;
- int x1, y1, x2, y2;
- int xmin, xmax, ymin, ymax, pixelsleft;
-
- y1 = y - height + 1; y2 = y;
- x1 = x; x2 = x + width - 1;
- pixelsleft = width * height;
-
- for (i = 0; i < fxMesa->numClipRects; i++)
- {
- /* algorithm requires x1 < x2 and y1 < y2 */
- if ((fxMesa->pClipRects[i].x1 < fxMesa->pClipRects[i].x2)) {
- xmin = fxMesa->pClipRects[i].x1;
- xmax = fxMesa->pClipRects[i].x2-1;
- } else {
- xmin = fxMesa->pClipRects[i].x2;
- xmax = fxMesa->pClipRects[i].x1-1;
- }
- if ((fxMesa->pClipRects[i].y1 < fxMesa->pClipRects[i].y2)) {
- ymin = fxMesa->pClipRects[i].y1;
- ymax = fxMesa->pClipRects[i].y2-1;
- } else {
- ymin = fxMesa->pClipRects[i].y2;
- ymax = fxMesa->pClipRects[i].y1-1;
- }
-
- /* reject trivial cases */
- if (xmax < x1) continue;
- if (ymax < y1) continue;
- if (xmin > x2) continue;
- if (ymin > y2) continue;
-
- /* find the intersection */
- if (xmin < x1) xmin = x1;
- if (ymin < y1) ymin = y1;
- if (xmax > x2) xmax = x2;
- if (ymax > y2) ymax = y2;
-
- pixelsleft -= (xmax-xmin+1) * (ymax-ymin+1);
- }
-
- return pixelsleft == 0;
-}
-
-#if 0
-GLboolean
-tdfx_bitmap_R5G6B5(struct gl_context * ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte * bitmap)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- TdfxU16 color;
- const struct gl_pixelstore_attrib *finalUnpack;
- struct gl_pixelstore_attrib scissoredUnpack;
-
- /* check if there's any raster operations enabled which we can't handle */
- if (ctx->RasterMask & (ALPHATEST_BIT |
- BLEND_BIT |
- DEPTH_BIT |
- FOG_BIT |
- LOGIC_OP_BIT |
- SCISSOR_BIT |
- STENCIL_BIT |
- MASKING_BIT |
- MULTI_DRAW_BIT)) return GL_FALSE;
-
- if (ctx->Scissor.Enabled) {
- /* This is a bit tricky, but by carefully adjusting the px, py,
- * width, height, skipPixels and skipRows values we can do
- * scissoring without special code in the rendering loop.
- */
-
- /* we'll construct a new pixelstore struct */
- finalUnpack = &scissoredUnpack;
- scissoredUnpack = *unpack;
- if (scissoredUnpack.RowLength == 0)
- scissoredUnpack.RowLength = width;
-
- /* clip left */
- if (px < ctx->Scissor.X) {
- scissoredUnpack.SkipPixels += (ctx->Scissor.X - px);
- width -= (ctx->Scissor.X - px);
- px = ctx->Scissor.X;
- }
- /* clip right */
- if (px + width >= ctx->Scissor.X + ctx->Scissor.Width) {
- width -= (px + width - (ctx->Scissor.X + ctx->Scissor.Width));
- }
- /* clip bottom */
- if (py < ctx->Scissor.Y) {
- scissoredUnpack.SkipRows += (ctx->Scissor.Y - py);
- height -= (ctx->Scissor.Y - py);
- py = ctx->Scissor.Y;
- }
- /* clip top */
- if (py + height >= ctx->Scissor.Y + ctx->Scissor.Height) {
- height -= (py + height - (ctx->Scissor.Y + ctx->Scissor.Height));
- }
-
- if (width <= 0 || height <= 0)
- return GL_TRUE; /* totally scissored away */
- }
- else {
- finalUnpack = unpack;
- }
-
- /* compute pixel value */
- {
- GLint r = (GLint) (ctx->Current.RasterColor[0] * 255.0f);
- GLint g = (GLint) (ctx->Current.RasterColor[1] * 255.0f);
- GLint b = (GLint) (ctx->Current.RasterColor[2] * 255.0f);
- /*GLint a = (GLint)(ctx->Current.RasterColor[3]*255.0f); */
- if (fxMesa->bgrOrder) {
- color = (TdfxU16)
- (((TdfxU16) 0xf8 & b) << (11 - 3)) |
- (((TdfxU16) 0xfc & g) << (5 - 3 + 1)) |
- (((TdfxU16) 0xf8 & r) >> 3);
- }
- else
- color = (TdfxU16)
- (((TdfxU16) 0xf8 & r) << (11 - 3)) |
- (((TdfxU16) 0xfc & g) << (5 - 3 + 1)) |
- (((TdfxU16) 0xf8 & b) >> 3);
- }
-
- info.size = sizeof(info);
- if (!TDFX_grLfbLock(fxMesa,
- GR_LFB_WRITE_ONLY,
- fxMesa->currentFB,
- GR_LFBWRITEMODE_565,
- GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
-#ifndef TDFX_SILENT
- fprintf(stderr, "tdfx Driver: error locking the linear frame buffer\n");
-#endif
- return GL_TRUE;
- }
-
- {
- const GLint winX = fxMesa->x_offset;
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- /* The dest stride depends on the hardware and whether we're drawing
- * to the front or back buffer. This compile-time test seems to do
- * the job for now.
- */
- const GLint dstStride = (fxMesa->glCtx->Color.DrawBuffer[0] == GL_FRONT)
- ? (fxMesa->screen_width) : (info.strideInBytes / 2);
- GLint row;
- /* compute dest address of bottom-left pixel in bitmap */
- GLushort *dst = (GLushort *) info.lfbPtr
- + (winY - py) * dstStride + (winX + px);
-
- for (row = 0; row < height; row++) {
- const GLubyte *src =
- (const GLubyte *) _mesa_image_address2d(finalUnpack,
- bitmap, width, height,
- GL_COLOR_INDEX,
- GL_BITMAP, row, 0);
- if (finalUnpack->LsbFirst) {
- /* least significan bit first */
- GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7);
- GLint col;
- for (col = 0; col < width; col++) {
- if (*src & mask) {
- if (inClipRects(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
- }
- if (mask == 128U) {
- src++;
- mask = 1U;
- }
- else {
- mask = mask << 1;
- }
- }
- if (mask != 1)
- src++;
- }
- else {
- /* most significan bit first */
- GLubyte mask = 128U >> (finalUnpack->SkipPixels & 0x7);
- GLint col;
- for (col = 0; col < width; col++) {
- if (*src & mask) {
- if (inClipRects(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
- }
- if (mask == 1U) {
- src++;
- mask = 128U;
- }
- else {
- mask = mask >> 1;
- }
- }
- if (mask != 128)
- src++;
- }
- dst -= dstStride;
- }
- }
-
- TDFX_grLfbUnlock(fxMesa, GR_LFB_WRITE_ONLY, fxMesa->currentFB);
- return GL_TRUE;
-}
-#endif
-
-#if 0
-GLboolean
-tdfx_bitmap_R8G8B8A8(struct gl_context * ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte * bitmap)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GLuint color;
- const struct gl_pixelstore_attrib *finalUnpack;
- struct gl_pixelstore_attrib scissoredUnpack;
-
- /* check if there's any raster operations enabled which we can't handle */
- if (ctx->RasterMask & (ALPHATEST_BIT |
- BLEND_BIT |
- DEPTH_BIT |
- FOG_BIT |
- LOGIC_OP_BIT |
- SCISSOR_BIT |
- STENCIL_BIT |
- MASKING_BIT |
- MULTI_DRAW_BIT)) return GL_FALSE;
-
- if (ctx->Scissor.Enabled) {
- /* This is a bit tricky, but by carefully adjusting the px, py,
- * width, height, skipPixels and skipRows values we can do
- * scissoring without special code in the rendering loop.
- */
-
- /* we'll construct a new pixelstore struct */
- finalUnpack = &scissoredUnpack;
- scissoredUnpack = *unpack;
- if (scissoredUnpack.RowLength == 0)
- scissoredUnpack.RowLength = width;
-
- /* clip left */
- if (px < ctx->Scissor.X) {
- scissoredUnpack.SkipPixels += (ctx->Scissor.X - px);
- width -= (ctx->Scissor.X - px);
- px = ctx->Scissor.X;
- }
- /* clip right */
- if (px + width >= ctx->Scissor.X + ctx->Scissor.Width) {
- width -= (px + width - (ctx->Scissor.X + ctx->Scissor.Width));
- }
- /* clip bottom */
- if (py < ctx->Scissor.Y) {
- scissoredUnpack.SkipRows += (ctx->Scissor.Y - py);
- height -= (ctx->Scissor.Y - py);
- py = ctx->Scissor.Y;
- }
- /* clip top */
- if (py + height >= ctx->Scissor.Y + ctx->Scissor.Height) {
- height -= (py + height - (ctx->Scissor.Y + ctx->Scissor.Height));
- }
-
- if (width <= 0 || height <= 0)
- return GL_TRUE; /* totally scissored away */
- }
- else {
- finalUnpack = unpack;
- }
-
- /* compute pixel value */
- {
- GLint r = (GLint) (ctx->Current.RasterColor[0] * 255.0f);
- GLint g = (GLint) (ctx->Current.RasterColor[1] * 255.0f);
- GLint b = (GLint) (ctx->Current.RasterColor[2] * 255.0f);
- GLint a = (GLint) (ctx->Current.RasterColor[3] * 255.0f);
- color = PACK_BGRA32(r, g, b, a);
- }
-
- info.size = sizeof(info);
- if (!TDFX_grLfbLock(fxMesa, GR_LFB_WRITE_ONLY,
- fxMesa->currentFB, GR_LFBWRITEMODE_8888,
- GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
-#ifndef TDFX_SILENT
- fprintf(stderr, "tdfx Driver: error locking the linear frame buffer\n");
-#endif
- return GL_TRUE;
- }
-
- {
- const GLint winX = fxMesa->x_offset;
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- GLint dstStride;
- GLuint *dst;
- GLint row;
-
- if (fxMesa->glCtx->Color.DrawBuffer[0] == GL_FRONT) {
- dstStride = fxMesa->screen_width;
- dst =
- (GLuint *) info.lfbPtr + (winY - py) * dstStride + (winX +
- px);
- }
- else {
- dstStride = info.strideInBytes / 4;
- dst =
- (GLuint *) info.lfbPtr + (winY - py) * dstStride + (winX +
- px);
- }
-
- /* compute dest address of bottom-left pixel in bitmap */
- for (row = 0; row < height; row++) {
- const GLubyte *src =
- (const GLubyte *) _mesa_image_address2d(finalUnpack,
- bitmap, width, height,
- GL_COLOR_INDEX,
- GL_BITMAP, row, 0);
- if (finalUnpack->LsbFirst) {
- /* least significan bit first */
- GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7);
- GLint col;
- for (col = 0; col < width; col++) {
- if (*src & mask) {
- if (inClipRects(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
- }
- if (mask == 128U) {
- src++;
- mask = 1U;
- }
- else {
- mask = mask << 1;
- }
- }
- if (mask != 1)
- src++;
- }
- else {
- /* most significan bit first */
- GLubyte mask = 128U >> (finalUnpack->SkipPixels & 0x7);
- GLint col;
- for (col = 0; col < width; col++) {
- if (*src & mask) {
- if (inClipRects(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
- }
- if (mask == 1U) {
- src++;
- mask = 128U;
- }
- else {
- mask = mask >> 1;
- }
- }
- if (mask != 128)
- src++;
- }
- dst -= dstStride;
- }
- }
-
- TDFX_grLfbUnlock(fxMesa, GR_LFB_WRITE_ONLY, fxMesa->currentFB);
- return GL_TRUE;
-}
-#endif
-
-void
-tdfx_readpixels_R5G6B5(struct gl_context * ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
- GLvoid * dstImage)
-{
- if (format != GL_RGB ||
- type != GL_UNSIGNED_SHORT_5_6_5 ||
- (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|
- IMAGE_MAP_COLOR_BIT)))
- {
- _swrast_ReadPixels( ctx, x, y, width, height, format, type, packing,
- dstImage );
- return;
- }
-
- {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- __DRIdrawable *const readable = fxMesa->driReadable;
- const GLint winX = readable->x;
- const GLint winY = readable->y + readable->h - 1;
- const GLint scrX = winX + x;
- const GLint scrY = winY - y;
-
- LOCK_HARDWARE( fxMesa );
- info.size = sizeof(info);
- if (fxMesa->Glide.grLfbLock(GR_LFB_READ_ONLY,
- fxMesa->ReadBuffer,
- GR_LFBWRITEMODE_ANY,
- GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
- const GLint srcStride = (fxMesa->glCtx->Color.DrawBuffer[0] ==
- GL_FRONT) ? (fxMesa->screen_width) : (info.strideInBytes / 2);
- const GLushort *src = (const GLushort *) info.lfbPtr
- + scrY * srcStride + scrX;
- GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing,
- dstImage, width, height, format, type, 0, 0);
- const GLint dstStride = _mesa_image_row_stride(packing,
- width, format, type);
-
- /* directly memcpy 5R6G5B pixels into client's buffer */
- const GLint widthInBytes = width * 2;
- GLint row;
- for (row = 0; row < height; row++) {
- memcpy(dst, src, widthInBytes);
- dst += dstStride;
- src -= srcStride;
- }
-
- fxMesa->Glide.grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->ReadBuffer);
- }
- UNLOCK_HARDWARE( fxMesa );
- return;
- }
-}
-
-void
-tdfx_readpixels_R8G8B8A8(struct gl_context * ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
- GLvoid * dstImage)
-{
- if ((!(format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8) &&
- !(format == GL_BGRA && type == GL_UNSIGNED_BYTE)) ||
- (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|
- IMAGE_MAP_COLOR_BIT)))
- {
- _swrast_ReadPixels( ctx, x, y, width, height, format, type, packing,
- dstImage );
- return;
- }
-
-
- {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- __DRIdrawable *const readable = fxMesa->driReadable;
- const GLint winX = readable->x;
- const GLint winY = readable->y + readable->h - 1;
- const GLint scrX = winX + x;
- const GLint scrY = winY - y;
-
- LOCK_HARDWARE(fxMesa);
- info.size = sizeof(info);
- if (fxMesa->Glide.grLfbLock(GR_LFB_READ_ONLY,
- fxMesa->ReadBuffer,
- GR_LFBWRITEMODE_ANY,
- GR_ORIGIN_UPPER_LEFT, FXFALSE, &info))
- {
- const GLint srcStride = (fxMesa->glCtx->Color.DrawBuffer[0] == GL_FRONT)
- ? (fxMesa->screen_width) : (info.strideInBytes / 4);
- const GLuint *src = (const GLuint *) info.lfbPtr
- + scrY * srcStride + scrX;
- const GLint dstStride =
- _mesa_image_row_stride(packing, width, format, type);
- GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing,
- dstImage, width, height, format, type, 0, 0);
- const GLint widthInBytes = width * 4;
-
- {
- GLint row;
- for (row = 0; row < height; row++) {
- memcpy(dst, src, widthInBytes);
- dst += dstStride;
- src -= srcStride;
- }
- }
-
- fxMesa->Glide.grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->ReadBuffer);
- }
- UNLOCK_HARDWARE(fxMesa);
- }
-}
-
-void
-tdfx_drawpixels_R8G8B8A8(struct gl_context * ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *unpack,
- const GLvoid * pixels)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ((!(format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8) &&
- !(format == GL_BGRA && type == GL_UNSIGNED_BYTE)) ||
- ctx->Pixel.ZoomX != 1.0F ||
- ctx->Pixel.ZoomY != 1.0F ||
- (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT|
- IMAGE_MAP_COLOR_BIT)) ||
- ctx->Color.AlphaEnabled ||
- ctx->Depth.Test ||
- ctx->Fog.Enabled ||
- ctx->Scissor.Enabled ||
- ctx->Stencil._Enabled ||
- !ctx->Color.ColorMask[0][0] ||
- !ctx->Color.ColorMask[0][1] ||
- !ctx->Color.ColorMask[0][2] ||
- !ctx->Color.ColorMask[0][3] ||
- ctx->Color.ColorLogicOpEnabled ||
- ctx->Texture._EnabledUnits ||
- fxMesa->Fallback)
- {
- _swrast_DrawPixels( ctx, x, y, width, height, format, type,
- unpack, pixels );
- return;
- }
-
- {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GLboolean result = GL_FALSE;
-
- const GLint winX = fxMesa->x_offset;
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- const GLint scrX = winX + x;
- const GLint scrY = winY - y;
-
- /* lock early to make sure cliprects are right */
- LOCK_HARDWARE(fxMesa);
-
- /* make sure hardware has latest blend funcs */
- if (ctx->Color.BlendEnabled) {
- fxMesa->dirty |= TDFX_UPLOAD_BLEND_FUNC;
- tdfxEmitHwStateLocked( fxMesa );
- }
-
- /* look for clipmasks, giveup if region obscured */
- if (fxMesa->glCtx->Color.DrawBuffer[0] == GL_FRONT) {
- if (!inClipRects_Region(fxMesa, scrX, scrY, width, height)) {
- UNLOCK_HARDWARE(fxMesa);
- _swrast_DrawPixels( ctx, x, y, width, height, format, type,
- unpack, pixels );
- return;
- }
- }
-
- info.size = sizeof(info);
- if (fxMesa->Glide.grLfbLock(GR_LFB_WRITE_ONLY,
- fxMesa->DrawBuffer,
- GR_LFBWRITEMODE_8888,
- GR_ORIGIN_UPPER_LEFT, FXTRUE, &info))
- {
- const GLint dstStride = (fxMesa->glCtx->Color.DrawBuffer[0] == GL_FRONT)
- ? (fxMesa->screen_width * 4) : (info.strideInBytes);
- GLubyte *dst = (GLubyte *) info.lfbPtr
- + scrY * dstStride + scrX * 4;
- const GLint srcStride =
- _mesa_image_row_stride(unpack, width, format, type);
- const GLubyte *src = (GLubyte *) _mesa_image_address2d(unpack,
- pixels, width, height, format, type, 0, 0);
- const GLint widthInBytes = width * 4;
-
- if ((format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8) ||
- (format == GL_BGRA && type == GL_UNSIGNED_BYTE)) {
- GLint row;
- for (row = 0; row < height; row++) {
- memcpy(dst, src, widthInBytes);
- dst -= dstStride;
- src += srcStride;
- }
- result = GL_TRUE;
- }
-
- fxMesa->Glide.grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->DrawBuffer);
- }
- UNLOCK_HARDWARE(fxMesa);
- }
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_pixels.h b/src/mesa/drivers/dri/tdfx/tdfx_pixels.h
deleted file mode 100644
index f4cc20fd625..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_pixels.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- * Nathan Hand <nhand@valinux.com>
- *
- */
-
-#ifndef __TDFX_PIXELS_H__
-#define __TDFX_PIXELS_H__
-
-#include "main/context.h"
-
-extern void
-tdfx_bitmap_R5G6B5( struct gl_context *ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte *bitmap );
-
-extern void
-tdfx_bitmap_R8G8B8A8( struct gl_context *ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte *bitmap );
-
-extern void
-tdfx_readpixels_R5G6B5( struct gl_context *ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
- GLvoid *dstImage );
-
-extern void
-tdfx_readpixels_R8G8B8A8( struct gl_context *ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *packing,
- GLvoid *dstImage );
-
-extern void
-tdfx_drawpixels_R8G8B8A8( struct gl_context *ctx, GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const struct gl_pixelstore_attrib *unpack,
- const GLvoid *pixels );
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_render.c b/src/mesa/drivers/dri/tdfx/tdfx_render.c
deleted file mode 100644
index f0837567877..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_render.c
+++ /dev/null
@@ -1,804 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * 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>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#include "tdfx_context.h"
-#include "tdfx_render.h"
-#include "tdfx_state.h"
-#include "tdfx_texman.h"
-#include "swrast/swrast.h"
-
-/* Clear the color and/or depth buffers.
- */
-static void tdfxClear( struct gl_context *ctx, GLbitfield mask )
-{
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
- GLbitfield softwareMask = mask & (BUFFER_BIT_ACCUM);
- const GLuint stencil_size =
- fxMesa->haveHwStencil ? fxMesa->glCtx->Visual.stencilBits : 0;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "tdfxClear(0x%x)\n", mask);
- }
-
- /* Need this check to respond to glScissor and clipping updates */
- if ((fxMesa->new_state & (TDFX_NEW_CLIP | TDFX_NEW_DEPTH)) ||
- (fxMesa->dirty & TDFX_UPLOAD_COLOR_MASK)) {
- tdfxDDUpdateHwState(ctx);
- }
-
- /* we can't clear accum buffers */
- mask &= ~(BUFFER_BIT_ACCUM);
-
- if (mask & BUFFER_BIT_STENCIL) {
- if (!fxMesa->haveHwStencil || (ctx->Stencil.WriteMask[0] & 0xff) != 0xff) {
- /* Napalm seems to have trouble with stencil write masks != 0xff */
- /* do stencil clear in software */
- mask &= ~(BUFFER_BIT_STENCIL);
- softwareMask |= BUFFER_BIT_STENCIL;
- }
- }
-
- if (fxMesa->glCtx->Visual.redBits != 8) {
- /* can only do color masking if running in 24/32bpp on Napalm */
- if (ctx->Color.ColorMask[0][RCOMP] != ctx->Color.ColorMask[0][GCOMP] ||
- ctx->Color.ColorMask[0][GCOMP] != ctx->Color.ColorMask[0][BCOMP]) {
- softwareMask |= (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT));
- mask &= ~(BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT);
- }
- }
-
- if (fxMesa->haveHwStencil) {
- /*
- * If we want to clear stencil, it must be enabled
- * in the HW, even if the stencil test is not enabled
- * in the OGL state.
- */
- LOCK_HARDWARE(fxMesa);
- if (mask & BUFFER_BIT_STENCIL) {
- fxMesa->Glide.grStencilMask(/*ctx->Stencil.WriteMask*/ 0xff);
- /* set stencil ref value = desired clear value */
- fxMesa->Glide.grStencilFunc(GR_CMP_ALWAYS,
- (fxMesa->Stencil.Clear & 0xff), 0xff);
- fxMesa->Glide.grStencilOp(GR_STENCILOP_REPLACE,
- GR_STENCILOP_REPLACE, GR_STENCILOP_REPLACE);
- fxMesa->Glide.grEnable(GR_STENCIL_MODE_EXT);
- }
- else {
- fxMesa->Glide.grDisable(GR_STENCIL_MODE_EXT);
- }
- UNLOCK_HARDWARE(fxMesa);
- }
-
- /*
- * This may be ugly, but it's needed in order to work around a number
- * of Glide bugs.
- */
- BEGIN_CLIP_LOOP(fxMesa);
- {
- /*
- * This could probably be done fancier but doing each possible case
- * explicitly is less error prone.
- */
- switch (mask & ~BUFFER_BIT_STENCIL) {
- case BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH:
- /* back buffer & depth */
- FX_grColorMaskv_NoLock(ctx, true4); /* work around Voodoo3 bug */
- fxMesa->Glide.grDepthMask(FXTRUE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- if (stencil_size > 0) {
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- }
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (!ctx->Depth.Mask || !ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXFALSE);
- }
- break;
- case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_DEPTH:
- /* XXX it appears that the depth buffer isn't cleared when
- * glRenderBuffer(GR_BUFFER_FRONTBUFFER) is set.
- * This is a work-around/
- */
- /* clear depth */
- fxMesa->Glide.grDepthMask(FXTRUE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- FX_grColorMaskv_NoLock(ctx, false4);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear & 0xff);
- /* clear front */
- FX_grColorMaskv_NoLock(ctx, true4);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (!ctx->Depth.Mask || !ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXFALSE);
- }
- break;
- case BUFFER_BIT_BACK_LEFT:
- /* back buffer only */
- fxMesa->Glide.grDepthMask(FXFALSE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (ctx->Depth.Mask && ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXTRUE);
- }
- break;
- case BUFFER_BIT_FRONT_LEFT:
- /* front buffer only */
- fxMesa->Glide.grDepthMask(FXFALSE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (ctx->Depth.Mask && ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXTRUE);
- }
- break;
- case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT:
- /* front and back */
- fxMesa->Glide.grDepthMask(FXFALSE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (ctx->Depth.Mask && ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXTRUE);
- }
- break;
- case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH:
- /* clear front */
- fxMesa->Glide.grDepthMask(FXFALSE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- /* clear back and depth */
- fxMesa->Glide.grDepthMask(FXTRUE);
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- if (!ctx->Depth.Mask || !ctx->Depth.Mask) {
- fxMesa->Glide.grDepthMask(FXFALSE);
- }
- break;
- case BUFFER_BIT_DEPTH:
- /* just the depth buffer */
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- FX_grColorMaskv_NoLock(ctx, false4);
- fxMesa->Glide.grDepthMask(FXTRUE);
- if (stencil_size > 0)
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- else
- fxMesa->Glide.grBufferClear(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear);
- FX_grColorMaskv_NoLock(ctx, true4);
- if (ctx->DrawBuffer->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT)
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (!ctx->Depth.Test || !ctx->Depth.Mask)
- fxMesa->Glide.grDepthMask(FXFALSE);
- break;
- default:
- /* clear no color buffers or depth buffer but might clear stencil */
- if (stencil_size > 0 && (mask & BUFFER_BIT_STENCIL)) {
- /* XXX need this RenderBuffer call to work around Glide bug */
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_BACKBUFFER);
- fxMesa->Glide.grDepthMask(FXFALSE);
- FX_grColorMaskv_NoLock(ctx, false4);
- fxMesa->Glide.grBufferClearExt(fxMesa->Color.ClearColor,
- fxMesa->Color.ClearAlpha,
- fxMesa->Depth.Clear,
- (FxU32) (ctx->Stencil.Clear & 0xff));
- if (ctx->Depth.Mask && ctx->Depth.Test) {
- fxMesa->Glide.grDepthMask(FXTRUE);
- }
- FX_grColorMaskv_NoLock(ctx, true4);
- if (ctx->DrawBuffer->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT)
- fxMesa->Glide.grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- }
- }
- }
- END_CLIP_LOOP(fxMesa);
-
- if (fxMesa->haveHwStencil && (mask & BUFFER_BIT_STENCIL)) {
- /* We changed the stencil state above. Signal that we need to
- * upload it again.
- */
- fxMesa->dirty |= TDFX_UPLOAD_STENCIL;
- }
-
- if (softwareMask)
- _swrast_Clear(ctx, softwareMask);
-}
-
-
-
-static void tdfxFinish( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
-
- LOCK_HARDWARE( fxMesa );
- fxMesa->Glide.grFinish();
- UNLOCK_HARDWARE( fxMesa );
-}
-
-static void tdfxFlush( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
-
- LOCK_HARDWARE( fxMesa );
- fxMesa->Glide.grFlush();
- UNLOCK_HARDWARE( fxMesa );
-}
-
-
-#if 0
-static const char *texSource(int k)
-{
- switch (k) {
- case GR_CMBX_ZERO:
- return "GR_CMBX_ZERO";
- case GR_CMBX_TEXTURE_ALPHA:
- return "GR_CMBX_TEXTURE_ALPHA";
- case GR_CMBX_ALOCAL:
- return "GR_CMBX_ALOCAL";
- case GR_CMBX_AOTHER:
- return "GR_CMBX_AOTHER";
- case GR_CMBX_B:
- return "GR_CMBX_B";
- case GR_CMBX_CONSTANT_ALPHA:
- return "GR_CMBX_CONSTANT_ALPHA";
- case GR_CMBX_CONSTANT_COLOR:
- return "GR_CMBX_CONSTANT_COLOR";
- case GR_CMBX_DETAIL_FACTOR:
- return "GR_CMBX_DETAIL_FACTOR";
- case GR_CMBX_ITALPHA:
- return "GR_CMBX_ITALPHA";
- case GR_CMBX_ITRGB:
- return "GR_CMBX_ITRGB";
- case GR_CMBX_LOCAL_TEXTURE_ALPHA:
- return "GR_CMBX_LOCAL_TEXTURE_ALPHA";
- case GR_CMBX_LOCAL_TEXTURE_RGB:
- return "GR_CMBX_LOCAL_TEXTURE_RGB";
- case GR_CMBX_LOD_FRAC:
- return "GR_CMBX_LOD_FRAC";
- case GR_CMBX_OTHER_TEXTURE_ALPHA:
- return "GR_CMBX_OTHER_TEXTURE_ALPHA";
- case GR_CMBX_OTHER_TEXTURE_RGB:
- return "GR_CMBX_OTHER_TEXTURE_RGB";
- case GR_CMBX_TEXTURE_RGB:
- return "GR_CMBX_TEXTURE_RGB";
- case GR_CMBX_TMU_CALPHA:
- return "GR_CMBX_TMU_CALPHA";
- case GR_CMBX_TMU_CCOLOR:
- return "GR_CMBX_TMU_CCOLOR";
- default:
- return "";
- }
-}
-#endif
-
-#if 0
-static const char *texMode(int k)
-{
- switch (k) {
- case GR_FUNC_MODE_ZERO:
- return "GR_FUNC_MODE_ZERO";
- case GR_FUNC_MODE_X:
- return "GR_FUNC_MODE_X";
- case GR_FUNC_MODE_ONE_MINUS_X:
- return "GR_FUNC_MODE_ONE_MINUS_X";
- case GR_FUNC_MODE_NEGATIVE_X:
- return "GR_FUNC_MODE_NEGATIVE_X";
- case GR_FUNC_MODE_X_MINUS_HALF:
- return "GR_FUNC_MODE_X_MINUS_HALF";
- default:
- return "";
- }
-}
-#endif
-
-#if 0
-static const char *texInvert(int k)
-{
- return k ? "FXTRUE" : "FXFALSE";
-}
-#endif
-
-static void uploadTextureEnv( tdfxContextPtr fxMesa )
-{
- if (TDFX_IS_NAPALM(fxMesa)) {
- int unit;
- for (unit = 0; unit < TDFX_NUM_TMU; unit++) {
-#if 0
- printf("upload env %d\n", unit);
- printf(" cSourceA = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceA));
- printf(" cModeA = %s\n", texMode(fxMesa->TexCombineExt[unit].Color.ModeA));
- printf(" cSourceB = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceB));
- printf(" cModeB = %s\n", texMode(fxMesa->TexCombineExt[unit].Color.ModeB));
- printf(" cSourceC = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceC));
- printf(" cInvertC = %s\n", texInvert(fxMesa->TexCombineExt[unit].Color.InvertC));
- printf(" cSourceD = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceD));
- printf(" cInvertD = %s\n", texInvert(fxMesa->TexCombineExt[unit].Color.InvertD));
- printf(" cShift = %d\t", fxMesa->TexCombineExt[unit].Color.Shift);
- printf(" cInvert = %d\n", fxMesa->TexCombineExt[unit].Color.Invert);
- printf(" aSourceA = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceA));
- printf(" aModeA = %s\n", texMode(fxMesa->TexCombineExt[unit].Alpha.ModeA));
- printf(" aSourceB = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceB));
- printf(" aModeB = %s\n", texMode(fxMesa->TexCombineExt[unit].Alpha.ModeB));
- printf(" aSourceC = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceC));
- printf(" aInvertC = %s\n", texInvert(fxMesa->TexCombineExt[unit].Alpha.InvertC));
- printf(" aSourceD = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceD));
- printf(" aInvertD = %s\n", texInvert(fxMesa->TexCombineExt[unit].Alpha.InvertD));
- printf(" aShift = %d\t", fxMesa->TexCombineExt[unit].Alpha.Shift);
- printf(" aInvert = %d\n", fxMesa->TexCombineExt[unit].Alpha.Invert);
- printf(" Color = 0x%08x\n", fxMesa->TexCombineExt[unit].EnvColor);
-#endif
- fxMesa->Glide.grTexColorCombineExt(TDFX_TMU0 + unit,
- fxMesa->TexCombineExt[unit].Color.SourceA,
- fxMesa->TexCombineExt[unit].Color.ModeA,
- fxMesa->TexCombineExt[unit].Color.SourceB,
- fxMesa->TexCombineExt[unit].Color.ModeB,
- fxMesa->TexCombineExt[unit].Color.SourceC,
- fxMesa->TexCombineExt[unit].Color.InvertC,
- fxMesa->TexCombineExt[unit].Color.SourceD,
- fxMesa->TexCombineExt[unit].Color.InvertD,
- fxMesa->TexCombineExt[unit].Color.Shift,
- fxMesa->TexCombineExt[unit].Color.Invert);
- fxMesa->Glide.grTexAlphaCombineExt(TDFX_TMU0 + unit,
- fxMesa->TexCombineExt[unit].Alpha.SourceA,
- fxMesa->TexCombineExt[unit].Alpha.ModeA,
- fxMesa->TexCombineExt[unit].Alpha.SourceB,
- fxMesa->TexCombineExt[unit].Alpha.ModeB,
- fxMesa->TexCombineExt[unit].Alpha.SourceC,
- fxMesa->TexCombineExt[unit].Alpha.InvertC,
- fxMesa->TexCombineExt[unit].Alpha.SourceD,
- fxMesa->TexCombineExt[unit].Alpha.InvertD,
- fxMesa->TexCombineExt[unit].Alpha.Shift,
- fxMesa->TexCombineExt[unit].Alpha.Invert);
- fxMesa->Glide.grConstantColorValueExt(TDFX_TMU0 + unit,
- fxMesa->TexCombineExt[unit].EnvColor);
- }
- }
- else {
- /* Voodoo3 */
- int unit;
- for (unit = 0; unit < TDFX_NUM_TMU; unit++) {
- struct tdfx_texcombine *comb = &fxMesa->TexCombine[unit];
- fxMesa->Glide.grTexCombine(TDFX_TMU0 + unit,
- comb->FunctionRGB,
- comb->FactorRGB,
- comb->FunctionAlpha,
- comb->FactorAlpha,
- comb->InvertRGB,
- comb->InvertAlpha);
- }
- }
-}
-
-
-static void uploadTextureParams( tdfxContextPtr fxMesa )
-{
- int unit;
- for (unit = 0; unit < TDFX_NUM_TMU; unit++) {
- const struct tdfx_texparams *p = &fxMesa->TexParams[unit];
- /*
- printf("upload params %d\n", unit);
- printf(" clamp %x %x\n", env->sClamp, env->tClamp);
- printf(" filter %x %x\n", env->minFilt, env->magFilt);
- printf(" mipmap %x %x\n", env->mmMode, env->LODblend);
- printf(" lod bias %f\n", env->LodBias);
- */
- fxMesa->Glide.grTexClampMode(GR_TMU0 + unit, p->sClamp, p->tClamp);
- fxMesa->Glide.grTexFilterMode(GR_TMU0 + unit, p->minFilt, p->magFilt);
- fxMesa->Glide.grTexMipMapMode(GR_TMU0 + unit, p->mmMode, p->LODblend);
- fxMesa->Glide.grTexLodBiasValue(GR_TMU0 + unit, CLAMP(p->LodBias, -8, 7.75));
- }
-}
-
-
-static void uploadTextureSource( tdfxContextPtr fxMesa )
-{
- int unit;
- for (unit = 0; unit < TDFX_NUM_TMU; unit++) {
- const struct tdfx_texsource *src = &fxMesa->TexSource[unit];
- /*
- printf("upload source %d @ %d %p\n", unit, src->StartAddress, src->Info);
- */
- if (src->Info) {
- /*
- printf(" smallLodLog2=%d largeLodLog2=%d ar=%d format=%d data=%p\n",
- src->Info->smallLodLog2, src->Info->largeLodLog2,
- src->Info->aspectRatioLog2, src->Info->format,
- src->Info->data);
- */
- fxMesa->Glide.grTexSource(GR_TMU0 + unit,
- src->StartAddress,
- src->EvenOdd,
- src->Info);
- }
- }
-}
-
-
-static void uploadTextureImages( tdfxContextPtr fxMesa )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- int unit;
- for (unit = 0; unit < TDFX_NUM_TMU; unit++) {
- if (ctx->Texture.Unit[unit]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT)) {
- struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- if (ti && ti->reloadImages && ti->whichTMU != TDFX_TMU_NONE) {
- /*
- printf("download texture image on unit %d\n", unit);
- */
- tdfxTMDownloadTexture(fxMesa, tObj);
- ti->reloadImages = GL_FALSE;
- }
- }
- }
-}
-
-
-
-/*
- * If scissoring is enabled, compute intersection of scissor region
- * with all X clip rects, resulting in new cliprect list.
- * If number of cliprects is zero or one, call grClipWindow to setup
- * the clip region. Otherwise we'll call grClipWindow inside the
- * BEGIN_CLIP_LOOP macro.
- */
-void tdfxUploadClipping( tdfxContextPtr fxMesa )
-{
- __DRIdrawable *dPriv = fxMesa->driDrawable;
-
- assert(dPriv);
-
- if (fxMesa->numClipRects == 0) {
- /* all drawing clipped away */
- fxMesa->Glide.grClipWindow(0, 0, 0, 0);
- }
- else if (fxMesa->numClipRects == 1) {
- fxMesa->Glide.grClipWindow(fxMesa->pClipRects[0].x1,
- fxMesa->screen_height - fxMesa->pClipRects[0].y2,
- fxMesa->pClipRects[0].x2,
- fxMesa->screen_height - fxMesa->pClipRects[0].y1);
- }
- /* else, we'll do a cliprect loop around all drawing */
-
- fxMesa->Glide.grDRIPosition( dPriv->x, dPriv->y, dPriv->w, dPriv->h,
- fxMesa->numClipRects, fxMesa->pClipRects );
-}
-
-
-void tdfxEmitHwStateLocked( tdfxContextPtr fxMesa )
-{
- if ( !fxMesa->dirty )
- return;
-
- if ( fxMesa->dirty & TDFX_UPLOAD_COLOR_COMBINE ) {
- if (TDFX_IS_NAPALM(fxMesa)) {
- fxMesa->Glide.grColorCombineExt(fxMesa->ColorCombineExt.SourceA,
- fxMesa->ColorCombineExt.ModeA,
- fxMesa->ColorCombineExt.SourceB,
- fxMesa->ColorCombineExt.ModeB,
- fxMesa->ColorCombineExt.SourceC,
- fxMesa->ColorCombineExt.InvertC,
- fxMesa->ColorCombineExt.SourceD,
- fxMesa->ColorCombineExt.InvertD,
- fxMesa->ColorCombineExt.Shift,
- fxMesa->ColorCombineExt.Invert);
- }
- else {
- /* Voodoo 3 */
- fxMesa->Glide.grColorCombine( fxMesa->ColorCombine.Function,
- fxMesa->ColorCombine.Factor,
- fxMesa->ColorCombine.Local,
- fxMesa->ColorCombine.Other,
- fxMesa->ColorCombine.Invert );
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_COLOR_COMBINE;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_COMBINE ) {
- if (TDFX_IS_NAPALM(fxMesa)) {
- fxMesa->Glide.grAlphaCombineExt(fxMesa->AlphaCombineExt.SourceA,
- fxMesa->AlphaCombineExt.ModeA,
- fxMesa->AlphaCombineExt.SourceB,
- fxMesa->AlphaCombineExt.ModeB,
- fxMesa->AlphaCombineExt.SourceC,
- fxMesa->AlphaCombineExt.InvertC,
- fxMesa->AlphaCombineExt.SourceD,
- fxMesa->AlphaCombineExt.InvertD,
- fxMesa->AlphaCombineExt.Shift,
- fxMesa->AlphaCombineExt.Invert);
- }
- else {
- /* Voodoo 3 */
- fxMesa->Glide.grAlphaCombine( fxMesa->AlphaCombine.Function,
- fxMesa->AlphaCombine.Factor,
- fxMesa->AlphaCombine.Local,
- fxMesa->AlphaCombine.Other,
- fxMesa->AlphaCombine.Invert );
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_COMBINE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_RENDER_BUFFER ) {
- fxMesa->Glide.grRenderBuffer( fxMesa->DrawBuffer );
- fxMesa->dirty &= ~TDFX_UPLOAD_RENDER_BUFFER;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_STIPPLE) {
- fxMesa->Glide.grStipplePattern( fxMesa->Stipple.Pattern );
- fxMesa->Glide.grStippleMode( fxMesa->Stipple.Mode );
- fxMesa->dirty &= ~TDFX_UPLOAD_STIPPLE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_TEST ) {
- fxMesa->Glide.grAlphaTestFunction( fxMesa->Color.AlphaFunc );
- fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_TEST;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_REF ) {
- fxMesa->Glide.grAlphaTestReferenceValue( fxMesa->Color.AlphaRef );
- fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_REF;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_BLEND_FUNC ) {
- if (fxMesa->Glide.grAlphaBlendFunctionExt) {
- fxMesa->Glide.grAlphaBlendFunctionExt( fxMesa->Color.BlendSrcRGB,
- fxMesa->Color.BlendDstRGB,
- fxMesa->Color.BlendEqRGB,
- fxMesa->Color.BlendSrcA,
- fxMesa->Color.BlendDstA,
- fxMesa->Color.BlendEqA );
- }
- else {
- fxMesa->Glide.grAlphaBlendFunction( fxMesa->Color.BlendSrcRGB,
- fxMesa->Color.BlendDstRGB,
- fxMesa->Color.BlendSrcA,
- fxMesa->Color.BlendDstA );
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_BLEND_FUNC;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_MODE ) {
- fxMesa->Glide.grDepthBufferMode( fxMesa->Depth.Mode );
- fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_MODE;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_BIAS ) {
- fxMesa->Glide.grDepthBiasLevel( fxMesa->Depth.Bias );
- fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_BIAS;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_FUNC ) {
- fxMesa->Glide.grDepthBufferFunction( fxMesa->Depth.Func );
- fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_FUNC;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_MASK ) {
- fxMesa->Glide.grDepthMask( fxMesa->Depth.Mask );
- fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_MASK;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_DITHER) {
- fxMesa->Glide.grDitherMode( fxMesa->Color.Dither );
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_FOG_MODE ) {
- fxMesa->Glide.grFogMode( fxMesa->Fog.Mode );
- fxMesa->dirty &= ~TDFX_UPLOAD_FOG_MODE;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_FOG_COLOR ) {
- fxMesa->Glide.grFogColorValue( fxMesa->Fog.Color );
- fxMesa->dirty &= ~TDFX_UPLOAD_FOG_COLOR;
- }
- if ( fxMesa->dirty & TDFX_UPLOAD_FOG_TABLE ) {
- fxMesa->Glide.grFogTable( fxMesa->Fog.Table );
- fxMesa->dirty &= ~TDFX_UPLOAD_FOG_TABLE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_CULL ) {
- fxMesa->Glide.grCullMode( fxMesa->CullMode );
- fxMesa->dirty &= ~TDFX_UPLOAD_CULL;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_CLIP ) {
- tdfxUploadClipping( fxMesa );
- fxMesa->dirty &= ~TDFX_UPLOAD_CLIP;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_COLOR_MASK ) {
- if ( fxMesa->Glide.grColorMaskExt
- && fxMesa->glCtx->Visual.redBits == 8) {
- fxMesa->Glide.grColorMaskExt( fxMesa->Color.ColorMask[RCOMP],
- fxMesa->Color.ColorMask[GCOMP],
- fxMesa->Color.ColorMask[BCOMP],
- fxMesa->Color.ColorMask[ACOMP] );
- } else {
- fxMesa->Glide.grColorMask( fxMesa->Color.ColorMask[RCOMP] ||
- fxMesa->Color.ColorMask[GCOMP] ||
- fxMesa->Color.ColorMask[BCOMP],
- /*fxMesa->Color.ColorMask[0][ACOMP]*/GL_FALSE/*[dBorca] no-no*/ );
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_COLOR_MASK;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_CONSTANT_COLOR ) {
- fxMesa->Glide.grConstantColorValue( fxMesa->Color.MonoColor );
- fxMesa->dirty &= ~TDFX_UPLOAD_CONSTANT_COLOR;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_LINE ) {
- if (fxMesa->glCtx->Line.SmoothFlag && fxMesa->glCtx->Line.Width == 1.0)
- fxMesa->Glide.grEnable(GR_AA_ORDERED);
- else
- fxMesa->Glide.grDisable(GR_AA_ORDERED);
- fxMesa->dirty &= ~TDFX_UPLOAD_LINE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_STENCIL ) {
- if (fxMesa->glCtx->Stencil._Enabled) {
- fxMesa->Glide.grEnable(GR_STENCIL_MODE_EXT);
- fxMesa->Glide.grStencilOp(fxMesa->Stencil.FailFunc,
- fxMesa->Stencil.ZFailFunc,
- fxMesa->Stencil.ZPassFunc);
- fxMesa->Glide.grStencilFunc(fxMesa->Stencil.Function,
- fxMesa->Stencil.RefValue,
- fxMesa->Stencil.ValueMask);
- fxMesa->Glide.grStencilMask(fxMesa->Stencil.WriteMask);
- }
- else {
- fxMesa->Glide.grDisable(GR_STENCIL_MODE_EXT);
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_STENCIL;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_VERTEX_LAYOUT ) {
- fxMesa->Glide.grGlideSetVertexLayout( fxMesa->layout[fxMesa->vertexFormat] );
- /* [dborca] enable fogcoord */
- fxMesa->Glide.grVertexLayout(GR_PARAM_FOG_EXT, TDFX_FOG_OFFSET,
- fxMesa->Fog.Mode == GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT);
- fxMesa->dirty &= ~TDFX_UPLOAD_VERTEX_LAYOUT;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_ENV ) {
- uploadTextureEnv(fxMesa);
- fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_ENV;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_PARAMS ) {
- uploadTextureParams(fxMesa);
- fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_PARAMS;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_PALETTE ) {
- if (fxMesa->TexPalette.Data) {
- fxMesa->Glide.grTexDownloadTable(fxMesa->TexPalette.Type, fxMesa->TexPalette.Data);
- }
- fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_PALETTE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_SOURCE ) {
- uploadTextureSource(fxMesa);
- fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_SOURCE;
- }
-
- if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_IMAGES ) {
- uploadTextureImages(fxMesa);
- fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_IMAGES;
- }
-
- fxMesa->dirty = 0;
-}
-
-
-
-void tdfxInitRenderFuncs( struct dd_function_table *functions )
-{
- functions->Clear = tdfxClear;
- functions->Finish = tdfxFinish;
- functions->Flush = tdfxFlush;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_render.h b/src/mesa/drivers/dri/tdfx/tdfx_render.h
deleted file mode 100644
index 18c61683335..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_render.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#ifndef __TDFX_RENDER_H__
-#define __TDFX_RENDER_H__
-
-#include "tdfx_context.h"
-
-extern void tdfxInitRenderFuncs( struct dd_function_table *functions );
-
-extern void tdfxEmitHwStateLocked( tdfxContextPtr fxMesa );
-
-extern void tdfxUploadClipping( tdfxContextPtr fxMesa );
-
-#define FLUSH_BATCH( fxMesa )
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_screen.c b/src/mesa/drivers/dri/tdfx/tdfx_screen.c
deleted file mode 100644
index 084560ff87d..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_screen.c
+++ /dev/null
@@ -1,450 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#include "tdfx_dri.h"
-#include "tdfx_context.h"
-#include "tdfx_lock.h"
-#include "tdfx_span.h"
-
-#include "main/framebuffer.h"
-#include "main/renderbuffer.h"
-#include "xmlpool.h"
-
-#include "utils.h"
-
-#ifdef DEBUG_LOCKING
-char *prevLockFile = 0;
-int prevLockLine = 0;
-#endif
-
-#ifndef TDFX_DEBUG
-int TDFX_DEBUG = 0;
-#endif
-
-PUBLIC const char __driConfigOptions[] =
-DRI_CONF_BEGIN
- DRI_CONF_SECTION_DEBUG
- DRI_CONF_NO_RAST(false)
- DRI_CONF_SECTION_END
-DRI_CONF_END;
-
-static const __DRIextension *tdfxExtensions[] = {
- &driReadDrawableExtension,
- NULL
-};
-
-static const GLuint __driNConfigOptions = 1;
-
-static GLboolean
-tdfxCreateScreen( __DRIscreen *sPriv )
-{
- tdfxScreenPrivate *fxScreen;
- TDFXDRIPtr fxDRIPriv = (TDFXDRIPtr) sPriv->pDevPriv;
-
- if (sPriv->devPrivSize != sizeof(TDFXDRIRec)) {
- fprintf(stderr,"\nERROR! sizeof(TDFXDRIRec) does not match passed size from device driver\n");
- return GL_FALSE;
- }
-
- /* Allocate the private area */
- fxScreen = (tdfxScreenPrivate *) CALLOC( sizeof(tdfxScreenPrivate) );
- if ( !fxScreen )
- return GL_FALSE;
-
- /* parse information in __driConfigOptions */
- driParseOptionInfo (&fxScreen->optionCache,
- __driConfigOptions, __driNConfigOptions);
-
- fxScreen->driScrnPriv = sPriv;
- sPriv->private = (void *) fxScreen;
-
- fxScreen->regs.handle = fxDRIPriv->regs;
- fxScreen->regs.size = fxDRIPriv->regsSize;
- fxScreen->deviceID = fxDRIPriv->deviceID;
- fxScreen->width = fxDRIPriv->width;
- fxScreen->height = fxDRIPriv->height;
- fxScreen->mem = fxDRIPriv->mem;
- fxScreen->cpp = fxDRIPriv->cpp;
- fxScreen->stride = fxDRIPriv->stride;
- fxScreen->fifoOffset = fxDRIPriv->fifoOffset;
- fxScreen->fifoSize = fxDRIPriv->fifoSize;
- fxScreen->fbOffset = fxDRIPriv->fbOffset;
- fxScreen->backOffset = fxDRIPriv->backOffset;
- fxScreen->depthOffset = fxDRIPriv->depthOffset;
- fxScreen->textureOffset = fxDRIPriv->textureOffset;
- fxScreen->textureSize = fxDRIPriv->textureSize;
- fxScreen->sarea_priv_offset = fxDRIPriv->sarea_priv_offset;
-
- if ( drmMap( sPriv->fd, fxScreen->regs.handle,
- fxScreen->regs.size, &fxScreen->regs.map ) ) {
- return GL_FALSE;
- }
-
- sPriv->extensions = tdfxExtensions;
-
- return GL_TRUE;
-}
-
-
-static void
-tdfxDestroyScreen( __DRIscreen *sPriv )
-{
- tdfxScreenPrivate *fxScreen = (tdfxScreenPrivate *) sPriv->private;
-
- if (!fxScreen)
- return;
-
- drmUnmap( fxScreen->regs.map, fxScreen->regs.size );
-
- /* free all option information */
- driDestroyOptionInfo (&fxScreen->optionCache);
-
- FREE( fxScreen );
- sPriv->private = NULL;
-}
-
-
-static GLboolean
-tdfxInitDriver( __DRIscreen *sPriv )
-{
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)sPriv );
- }
-
- if ( !tdfxCreateScreen( sPriv ) ) {
- tdfxDestroyScreen( sPriv );
- return GL_FALSE;
- }
-
- return GL_TRUE;
-}
-
-
-static GLboolean
-tdfxCreateBuffer( __DRIscreen *driScrnPriv,
- __DRIdrawable *driDrawPriv,
- const struct gl_config *mesaVis,
- GLboolean isPixmap )
-{
- tdfxScreenPrivate *screen = (tdfxScreenPrivate *) driScrnPriv->private;
-
- if (isPixmap) {
- return GL_FALSE; /* not implemented */
- }
- else {
- struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
-
- {
- driRenderbuffer *frontRb
- = driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
- screen->fbOffset, screen->width, driDrawPriv);
- tdfxSetSpanFunctions(frontRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);
- }
-
- if (mesaVis->doubleBufferMode) {
- driRenderbuffer *backRb
- = driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
- screen->backOffset, screen->width,
- driDrawPriv);
- tdfxSetSpanFunctions(backRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
- backRb->backBuffer = GL_TRUE;
- }
-
- if (mesaVis->depthBits == 16) {
- driRenderbuffer *depthRb
- = driNewRenderbuffer(MESA_FORMAT_Z16, NULL, screen->cpp,
- screen->depthOffset, screen->width,
- driDrawPriv);
- tdfxSetSpanFunctions(depthRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
- }
- else if (mesaVis->depthBits == 24) {
- driRenderbuffer *depthRb
- = driNewRenderbuffer(MESA_FORMAT_Z24_S8, NULL, screen->cpp,
- screen->depthOffset, screen->width,
- driDrawPriv);
- tdfxSetSpanFunctions(depthRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
- }
-
- if (mesaVis->stencilBits > 0) {
- driRenderbuffer *stencilRb
- = driNewRenderbuffer(MESA_FORMAT_S8, NULL, screen->cpp,
- screen->depthOffset, screen->width,
- driDrawPriv);
- tdfxSetSpanFunctions(stencilRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
- }
-
- _mesa_add_soft_renderbuffers(fb,
- GL_FALSE, /* color */
- GL_FALSE, /* depth */
- GL_FALSE, /*swStencil,*/
- mesaVis->accumRedBits > 0,
- GL_FALSE, /* alpha */
- GL_FALSE /* aux */);
- driDrawPriv->driverPrivate = (void *) fb;
-
- return (driDrawPriv->driverPrivate != NULL);
- }
-}
-
-
-static void
-tdfxDestroyBuffer(__DRIdrawable *driDrawPriv)
-{
- _mesa_reference_framebuffer((struct gl_framebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
-}
-
-
-static void
-tdfxSwapBuffers( __DRIdrawable *driDrawPriv )
-
-{
- GET_CURRENT_CONTEXT(ctx);
- tdfxContextPtr fxMesa = 0;
- struct gl_framebuffer *mesaBuffer;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {
- fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)driDrawPriv );
- }
-
- mesaBuffer = (struct gl_framebuffer *) driDrawPriv->driverPrivate;
- if ( !mesaBuffer->Visual.doubleBufferMode )
- return; /* can't swap a single-buffered window */
-
- /* If the current context's drawable matches the given drawable
- * we have to do a glFinish (per the GLX spec).
- */
- if ( ctx ) {
- __DRIdrawable *curDrawPriv;
- fxMesa = TDFX_CONTEXT(ctx);
- curDrawPriv = fxMesa->driContext->driDrawablePriv;
-
- if ( curDrawPriv == driDrawPriv ) {
- /* swapping window bound to current context, flush first */
- _mesa_notifySwapBuffers( ctx );
- LOCK_HARDWARE( fxMesa );
- }
- else {
- /* find the fxMesa context previously bound to the window */
- fxMesa = (tdfxContextPtr) driDrawPriv->driContextPriv->driverPrivate;
- if (!fxMesa)
- return;
- LOCK_HARDWARE( fxMesa );
- fxMesa->Glide.grSstSelect( fxMesa->Glide.Board );
-#ifdef DEBUG
- printf("SwapBuf SetState 1\n");
-#endif
- fxMesa->Glide.grGlideSetState(fxMesa->Glide.State );
- }
- }
-
-#ifdef STATS
- {
- int stalls;
- static int prevStalls = 0;
-
- stalls = fxMesa->Glide.grFifoGetStalls();
-
- fprintf( stderr, "%s:\n", __FUNCTION__ );
- if ( stalls != prevStalls ) {
- fprintf( stderr, " %d stalls occurred\n",
- stalls - prevStalls );
- prevStalls = stalls;
- }
- if ( fxMesa && fxMesa->texSwaps ) {
- fprintf( stderr, " %d texture swaps occurred\n",
- fxMesa->texSwaps );
- fxMesa->texSwaps = 0;
- }
- }
-#endif
-
- assert(fxMesa);
-
- if (fxMesa->scissoredClipRects) {
- /* restore clip rects without scissor box */
- fxMesa->Glide.grDRIPosition( driDrawPriv->x, driDrawPriv->y,
- driDrawPriv->w, driDrawPriv->h,
- driDrawPriv->numClipRects,
- driDrawPriv->pClipRects );
- }
-
- fxMesa->Glide.grDRIBufferSwap( fxMesa->Glide.SwapInterval );
-
- if (fxMesa->scissoredClipRects) {
- /* restore clip rects WITH scissor box */
- fxMesa->Glide.grDRIPosition( driDrawPriv->x, driDrawPriv->y,
- driDrawPriv->w, driDrawPriv->h,
- fxMesa->numClipRects, fxMesa->pClipRects );
- }
-
-
-#if 0
- {
- FxI32 result;
- do {
- FxI32 result;
- fxMesa->Glide.grGet(GR_PENDING_BUFFERSWAPS, 4, &result);
- } while ( result > fxMesa->maxPendingSwapBuffers );
- }
-#endif
-
- fxMesa->stats.swapBuffer++;
-
- if (ctx) {
- if (ctx->DriverCtx != fxMesa) {
- fxMesa = TDFX_CONTEXT(ctx);
- fxMesa->Glide.grSstSelect( fxMesa->Glide.Board );
-#ifdef DEBUG
- printf("SwapBuf SetState 2\n");
-#endif
- fxMesa->Glide.grGlideSetState(fxMesa->Glide.State );
- }
- UNLOCK_HARDWARE( fxMesa );
- }
-}
-
-static const __DRIconfig **
-tdfxFillInModes(__DRIscreen *psp,
- unsigned pixel_bits,
- unsigned depth_bits,
- unsigned stencil_bits,
- GLboolean have_back_buffer)
-{
- unsigned deep = (depth_bits > 17);
-
- /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy
- * enough to add support. Basically, if a context is created with an
- * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping
- * will never be used.
- */
-
- static const GLenum db_modes[2] = { GLX_NONE, GLX_SWAP_UNDEFINED_OML };
- uint8_t depth_bits_array[4];
- uint8_t stencil_bits_array[4];
- uint8_t msaa_samples_array[1];
- if(deep) {
- depth_bits_array[0] = 0;
- depth_bits_array[1] = 24;
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = 8;
- } else {
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = 0;
- depth_bits_array[2] = depth_bits;
- depth_bits_array[3] = 0;
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = 0;
- stencil_bits_array[2] = 8;
- stencil_bits_array[3] = 8;
- }
-
- msaa_samples_array[0] = 0;
-
- return (const __DRIconfig **)
- driCreateConfigs(deep ? GL_RGBA : GL_RGB,
- deep ? GL_UNSIGNED_INT_8_8_8_8 :
- GL_UNSIGNED_SHORT_5_6_5,
- depth_bits_array,
- stencil_bits_array,
- deep ? 2 : 4,
- db_modes, 2,
- msaa_samples_array, 1,
- GL_TRUE);
-}
-
-/**
- * This is the driver specific part of the createNewScreen entry point.
- *
- * \todo maybe fold this into intelInitDriver
- *
- * \return the struct gl_config supported by this driver
- */
-static const __DRIconfig **
-tdfxInitScreen(__DRIscreen *psp)
-{
- static const __DRIversion ddx_expected = { 1, 1, 0 };
- static const __DRIversion dri_expected = { 4, 0, 0 };
- static const __DRIversion drm_expected = { 1, 0, 0 };
-
- /* divined from tdfx_dri.c, sketchy */
- TDFXDRIPtr dri_priv = (TDFXDRIPtr) psp->pDevPriv;
-
- /* XXX i wish it was like this */
- /* bpp = dri_priv->bpp */
- int bpp = (dri_priv->cpp > 2) ? 24 : 16;
-
- if ( ! driCheckDriDdxDrmVersions2( "tdfx",
- &psp->dri_version, & dri_expected,
- &psp->ddx_version, & ddx_expected,
- &psp->drm_version, & drm_expected ) )
- return NULL;
-
- if (!tdfxInitDriver(psp))
- return NULL;
-
- return tdfxFillInModes(psp,
- bpp, (bpp == 16) ? 16 : 24,
- (bpp == 16) ? 0 : 8,
- (dri_priv->backOffset!=dri_priv->depthOffset));
-}
-
-const struct __DriverAPIRec driDriverAPI = {
- .InitScreen = tdfxInitScreen,
- .DestroyScreen = tdfxDestroyScreen,
- .CreateContext = tdfxCreateContext,
- .DestroyContext = tdfxDestroyContext,
- .CreateBuffer = tdfxCreateBuffer,
- .DestroyBuffer = tdfxDestroyBuffer,
- .SwapBuffers = tdfxSwapBuffers,
- .MakeCurrent = tdfxMakeCurrent,
- .UnbindContext = tdfxUnbindContext,
- .GetSwapInfo = NULL,
- .GetDrawableMSC = NULL,
- .WaitForMSC = NULL,
- .WaitForSBC = NULL,
- .SwapBuffersMSC = NULL
-};
-
-/* This is the table of extensions that the loader will dlsym() for. */
-PUBLIC const __DRIextension *__driDriverExtensions[] = {
- &driCoreExtension.base,
- &driLegacyExtension.base,
- NULL
-};
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_screen.h b/src/mesa/drivers/dri/tdfx/tdfx_screen.h
deleted file mode 100644
index 6aa42e86674..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_screen.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- *
- */
-
-#ifndef __TDFX_SCREEN_H__
-#define __TDFX_SCREEN_H__
-
-typedef struct {
- drm_handle_t handle;
- drmSize size;
- drmAddress map;
-} tdfxRegion, *tdfxRegionPtr;
-
-typedef struct {
- tdfxRegion regs;
-
- 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;
-
- __DRIscreen *driScrnPriv;
- unsigned int sarea_priv_offset;
-
- /* Configuration cache with default values for all contexts */
- driOptionCache optionCache;
-} tdfxScreenPrivate;
-
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_span.c b/src/mesa/drivers/dri/tdfx/tdfx_span.c
deleted file mode 100644
index 12524e2316a..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_span.c
+++ /dev/null
@@ -1,1386 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- * Keith Whitwell <keith@tungstengraphics.com>
- *
- */
-
-#include "tdfx_context.h"
-#include "tdfx_lock.h"
-#include "tdfx_span.h"
-#include "tdfx_render.h"
-#include "swrast/swrast.h"
-
-
-#define DBG 0
-
-
-#define LOCAL_VARS \
- driRenderbuffer *drb = (driRenderbuffer *) rb; \
- __DRIdrawable *const dPriv = drb->dPriv; \
- GLuint pitch = drb->backBuffer ? info.strideInBytes \
- : (drb->pitch * drb->cpp); \
- const GLuint bottom = dPriv->h - 1; \
- char *buf = (char *)((char *)info.lfbPtr + \
- (dPriv->x * drb->cpp) + \
- (dPriv->y * pitch)); \
- GLuint p; \
- (void) buf; (void) p;
-
-
-#define Y_FLIP(_y) (bottom - _y)
-
-
-#define HW_WRITE_LOCK() \
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); \
- GrLfbInfo_t info; \
- FLUSH_BATCH( fxMesa ); \
- UNLOCK_HARDWARE( fxMesa ); \
- LOCK_HARDWARE( fxMesa ); \
- info.size = sizeof(GrLfbInfo_t); \
- if (fxMesa->Glide.grLfbLock(GR_LFB_WRITE_ONLY, fxMesa->DrawBuffer, \
- LFB_MODE, GR_ORIGIN_UPPER_LEFT, FXFALSE, \
- &info)) {
-
-#define HW_WRITE_UNLOCK() \
- fxMesa->Glide.grLfbUnlock( GR_LFB_WRITE_ONLY, fxMesa->DrawBuffer );\
- }
-
-
-#define HW_READ_LOCK() \
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); \
- GrLfbInfo_t info; \
- FLUSH_BATCH( fxMesa ); \
- UNLOCK_HARDWARE( fxMesa ); \
- LOCK_HARDWARE( fxMesa ); \
- info.size = sizeof(GrLfbInfo_t); \
- if ( fxMesa->Glide.grLfbLock( GR_LFB_READ_ONLY, fxMesa->ReadBuffer, \
- LFB_MODE, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) \
- {
-
-#define HW_READ_UNLOCK() \
- fxMesa->Glide.grLfbUnlock( GR_LFB_READ_ONLY, fxMesa->ReadBuffer );\
- }
-
-
-#define HW_WRITE_CLIPLOOP() \
- do { \
- int _nc = fxMesa->numClipRects; \
- while (_nc--) { \
- int minx = fxMesa->pClipRects[_nc].x1 - fxMesa->x_offset; \
- int miny = fxMesa->pClipRects[_nc].y1 - fxMesa->y_offset; \
- int maxx = fxMesa->pClipRects[_nc].x2 - fxMesa->x_offset; \
- int maxy = fxMesa->pClipRects[_nc].y2 - fxMesa->y_offset;
-
-#define HW_READ_CLIPLOOP() \
- do { \
- const __DRIdrawable *dPriv = fxMesa->driDrawable; \
- drm_clip_rect_t *rect = dPriv->pClipRects; \
- int _nc = dPriv->numClipRects; \
- while (_nc--) { \
- const int minx = rect->x1 - fxMesa->x_offset; \
- const int miny = rect->y1 - fxMesa->y_offset; \
- const int maxx = rect->x2 - fxMesa->x_offset; \
- const int maxy = rect->y2 - fxMesa->y_offset; \
- rect++;
-
-#define HW_ENDCLIPLOOP() \
- } \
- } while (0)
-
-
-
-#define LFB_MODE GR_LFBWRITEMODE_565
-
-
-/* 16 bit, RGB565 color spanline and pixel functions */ \
-
-#undef INIT_MONO_PIXEL
-#define INIT_MONO_PIXEL(p, color) \
- p = TDFXPACKCOLOR565( color[0], color[1], color[2] )
-
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
- *(GLushort *)(buf + _x*2 + _y*pitch) = ((((int)r & 0xf8) << 8) | \
- (((int)g & 0xfc) << 3) | \
- (((int)b & 0xf8) >> 3))
-
-#define WRITE_PIXEL( _x, _y, p ) \
- *(GLushort *)(buf + _x*2 + _y*pitch) = p
-
-#define READ_RGBA( rgba, _x, _y ) \
- do { \
- GLushort p = *(GLushort *)(buf + _x*2 + _y*pitch); \
- rgba[0] = (((p >> 11) & 0x1f) * 255) / 31; \
- rgba[1] = (((p >> 5) & 0x3f) * 255) / 63; \
- rgba[2] = (((p >> 0) & 0x1f) * 255) / 31; \
- rgba[3] = 0xff; \
- } while (0)
-
-#define TAG(x) tdfx##x##_RGB565
-#define BYTESPERPIXEL 2
-#include "spantmp.h"
-#undef BYTESPERPIXEL
-
-
-/* 16 bit, BGR565 color spanline and pixel functions */ \
-#if 0
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
- *(GLushort *)(buf + _x*2 + _y*pitch) = ((((int)b & 0xf8) << 8) | \
- (((int)g & 0xfc) << 3) | \
- (((int)r & 0xf8) >> 3))
-
-#define WRITE_PIXEL( _x, _y, p ) \
- *(GLushort *)(buf + _x*2 + _y*pitch) = p
-
-#define READ_RGBA( rgba, _x, _y ) \
- do { \
- GLushort p = *(GLushort *)(buf + _x*2 + _y*pitch); \
- rgba[0] = (p << 3) & 0xf8; \
- rgba[1] = (p >> 3) & 0xfc; \
- rgba[2] = (p >> 8) & 0xf8; \
- rgba[3] = 0xff; \
- } while (0)
-
-#define TAG(x) tdfx##x##_BGR565
-#define BYTESPERPIXEL 2
-#include "spantmp.h"
-#undef BYTESPERPIXEL
-#endif
-
-
-#undef LFB_MODE
-#define LFB_MODE GR_LFBWRITEMODE_888
-
-
-/* 24 bit, RGB888 color spanline and pixel functions */
-#undef INIT_MONO_PIXEL
-#define INIT_MONO_PIXEL(p, color) \
- p = TDFXPACKCOLOR888( color[0], color[1], color[2] )
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
- *(GLuint *)(buf + _x*3 + _y*pitch) = ((b << 0) | \
- (g << 8) | \
- (r << 16))
-
-#define WRITE_PIXEL( _x, _y, p ) \
- *(GLuint *)(buf + _x*3 + _y*pitch) = p
-
-#define READ_RGBA( rgba, _x, _y ) \
-do { \
- GLuint p = *(GLuint *)(buf + _x*3 + _y*pitch); \
- rgba[0] = (p >> 16) & 0xff; \
- rgba[1] = (p >> 8) & 0xff; \
- rgba[2] = (p >> 0) & 0xff; \
- rgba[3] = 0xff; \
-} while (0)
-
-#define TAG(x) tdfx##x##_RGB888
-#define BYTESPERPIXEL 4
-#include "spantmp.h"
-#undef BYTESPERPIXEL
-
-
-#undef LFB_MODE
-#define LFB_MODE GR_LFBWRITEMODE_8888
-
-
-/* 32 bit, ARGB8888 color spanline and pixel functions */
-#undef INIT_MONO_PIXEL
-#define INIT_MONO_PIXEL(p, color) \
- p = TDFXPACKCOLOR8888( color[0], color[1], color[2], color[3] )
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
- *(GLuint *)(buf + _x*4 + _y*pitch) = ((b << 0) | \
- (g << 8) | \
- (r << 16) | \
- (a << 24) )
-
-#define WRITE_PIXEL( _x, _y, p ) \
- *(GLuint *)(buf + _x*4 + _y*pitch) = p
-
-#define READ_RGBA( rgba, _x, _y ) \
-do { \
- GLuint p = *(GLuint *)(buf + _x*4 + _y*pitch); \
- rgba[0] = (p >> 16) & 0xff; \
- rgba[1] = (p >> 8) & 0xff; \
- rgba[2] = (p >> 0) & 0xff; \
- rgba[3] = (p >> 24) & 0xff; \
-} while (0)
-
-#define TAG(x) tdfx##x##_ARGB8888
-#define BYTESPERPIXEL 4
-#include "spantmp.h"
-#undef BYTESPERPIXEL
-
-
-
-/* ================================================================
- * Old span functions below...
- */
-
-
-/*
- * Examine the cliprects to generate an array of flags to indicate
- * which pixels in a span are visible. Note: (x,y) is a screen
- * coordinate.
- */
-static void
-generate_vismask(const tdfxContextPtr fxMesa, GLint x, GLint y, GLint n,
- GLubyte vismask[])
-{
- GLboolean initialized = GL_FALSE;
- GLint i, j;
-
- /* Ensure we clear the visual mask */
- memset(vismask, 0, n);
-
- /* turn on flags for all visible pixels */
- for (i = 0; i < fxMesa->numClipRects; i++) {
- const drm_clip_rect_t *rect = &fxMesa->pClipRects[i];
-
- if (y >= rect->y1 && y < rect->y2) {
- if (x >= rect->x1 && x + n <= rect->x2) {
- /* common case, whole span inside cliprect */
- memset(vismask, 1, n);
- return;
- }
- if (x < rect->x2 && x + n >= rect->x1) {
- /* some of the span is inside the rect */
- GLint start, end;
- if (!initialized) {
- memset(vismask, 0, n);
- initialized = GL_TRUE;
- }
- if (x < rect->x1)
- start = rect->x1 - x;
- else
- start = 0;
- if (x + n > rect->x2)
- end = rect->x2 - x;
- else
- end = n;
- assert(start >= 0);
- assert(end <= n);
- for (j = start; j < end; j++)
- vismask[j] = 1;
- }
- }
- }
-}
-
-/*
- * Examine cliprects and determine if the given screen pixel is visible.
- */
-static GLboolean
-visible_pixel(const tdfxContextPtr fxMesa, int scrX, int scrY)
-{
- int i;
- for (i = 0; i < fxMesa->numClipRects; i++) {
- const drm_clip_rect_t *rect = &fxMesa->pClipRects[i];
- if (scrX >= rect->x1 &&
- scrX < rect->x2 &&
- scrY >= rect->y1 && scrY < rect->y2) return GL_TRUE;
- }
- return GL_FALSE;
-}
-
-
-
-/*
- * Depth buffer read/write functions.
- */
-/*
- * To read the frame buffer, we need to lock and unlock it. The
- * four macros {READ,WRITE}_FB_SPAN_{LOCK,UNLOCK}
- * do this for us.
- *
- * Note that the lock must be matched with an unlock. These
- * macros include a spare curly brace, so they must
- * be syntactically matched.
- *
- * Note, also, that you can't lock a buffer twice with different
- * modes. That is to say, you can't lock a buffer in both read
- * and write modes. The strideInBytes and LFB pointer will be
- * the same with read and write locks, so you can use either.
- * o The HW has different state for reads and writes, so
- * locking it twice may give screwy results.
- * o The DRM won't let you lock twice. It hangs. This is probably
- * because of the LOCK_HARDWARE IN THE *_FB_SPAN_LOCK macros,
- * and could be eliminated with nonlocking lock routines. But
- * what's the point after all.
- */
-#define READ_FB_SPAN_LOCK(fxMesa, info, target_buffer) \
- UNLOCK_HARDWARE(fxMesa); \
- LOCK_HARDWARE(fxMesa); \
- (info).size=sizeof(info); \
- if (fxMesa->Glide.grLfbLock(GR_LFB_READ_ONLY, \
- target_buffer, \
- GR_LFBWRITEMODE_ANY, \
- GR_ORIGIN_UPPER_LEFT, \
- FXFALSE, \
- &(info))) {
-
-#define READ_FB_SPAN_UNLOCK(fxMesa, target_buffer) \
- fxMesa->Glide.grLfbUnlock(GR_LFB_READ_ONLY, target_buffer); \
- } else { \
- fprintf(stderr, "tdfxDriver: Can't get %s (%d) read lock\n", \
- (target_buffer == GR_BUFFER_BACKBUFFER) \
- ? "back buffer" \
- : ((target_buffer == GR_BUFFER_AUXBUFFER) \
- ? "depth buffer" \
- : "unknown buffer"), \
- target_buffer); \
- }
-
-#define WRITE_FB_SPAN_LOCK(fxMesa, info, target_buffer, write_mode) \
- UNLOCK_HARDWARE(fxMesa); \
- LOCK_HARDWARE(fxMesa); \
- info.size=sizeof(info); \
- if (fxMesa->Glide.grLfbLock(GR_LFB_WRITE_ONLY, \
- target_buffer, \
- write_mode, \
- GR_ORIGIN_UPPER_LEFT, \
- FXFALSE, \
- &info)) {
-
-#define WRITE_FB_SPAN_UNLOCK(fxMesa, target_buffer) \
- fxMesa->Glide.grLfbUnlock(GR_LFB_WRITE_ONLY, target_buffer); \
- } else { \
- fprintf(stderr, "tdfxDriver: Can't get %s (%d) write lock\n", \
- (target_buffer == GR_BUFFER_BACKBUFFER) \
- ? "back buffer" \
- : ((target_buffer == GR_BUFFER_AUXBUFFER) \
- ? "depth buffer" \
- : "unknown buffer"), \
- target_buffer); \
- }
-
-/*
- * Because the Linear Frame Buffer is not necessarily aligned
- * with the depth buffer, we have to do some fiddling
- * around to get the right addresses.
- *
- * Perhaps a picture is in order. The Linear Frame Buffer
- * looks like this:
- *
- * |<----------------------info.strideInBytes------------->|
- * |<-----physicalStrideInBytes------->|
- * +-----------------------------------+xxxxxxxxxxxxxxxxxxx+
- * | | |
- * | Legal Memory | Forbidden Zone |
- * | | |
- * +-----------------------------------+xxxxxxxxxxxxxxxxxxx+
- *
- * You can only reliably read and write legal locations. Reads
- * and writes from the Forbidden Zone will return undefined values,
- * and may cause segmentation faults.
- *
- * Now, the depth buffer may not end up in a location such each
- * scan line is an LFB line. For example, the depth buffer may
- * look like this:
- *
- * wrapped ordinary.
- * +-----------------------------------+xxxxxxxxxxxxxxxxxxx+
- * |0000000000000000000000 | | back
- * |1111111111111111111111 | | buffer
- * |2222222222222222222222 | |
- * |4096b align. padxx00000000000000000| Forbidden Zone | depth
- * |0000 11111111111111111| | buffer
- * |1111 22222222222222222| |
- * |2222 | |
- * +-----------------------------------+xxxxxxxxxxxxxxxxxxx+
- * where each number is the scan line number. We know it will
- * be aligned on 128 byte boundaries, at least. Aligning this
- * on a scanline boundary causes the back and depth buffers to
- * thrash in the SST1 cache. (Note that the back buffer is always
- * allocated at the beginning of LFB memory, and so it is always
- * properly aligned with the LFB stride.)
- *
- * We call the beginning of the line (which is the rightmost
- * part of the depth line in the picture above) the *ordinary* part
- * of the scanline, and the end of the line (which is the
- * leftmost part, one line below) the *wrapped* part of the scanline.
- * a.) We need to know what x value to subtract from the screen
- * x coordinate to index into the wrapped part.
- * b.) We also need to figure out if we need to read from the ordinary
- * part scan line, or from the wrapped part of the scan line.
- *
- * [ad a]
- * The first wrapped x coordinate is that coordinate such that
- * depthBufferOffset&(info.strideInBytes) + x*elmentSize {*}
- * > physicalStrideInBytes
- * where depthBufferOffset is the LFB distance in bytes
- * from the back buffer to the depth buffer. The expression
- * depthBufferOffset&(info.strideInBytes)
- * is then the offset (in bytes) from the beginining of (any)
- * depth buffer line to first element in the line.
- * Simplifying inequation {*} above we see that x is the smallest
- * value such that
- * x*elementSize > physicalStrideInBytes {**}
- * - depthBufferOffset&(info.strideInBytes)
- * Now, we know that both the summands on the right are multiples of
- * 128, and elementSize <= 4, so if equality holds in {**}, x would
- * be a multiple of 32. Thus we can set x to
- * xwrapped = (physicalStrideInBytes
- * - depthBufferOffset&(info.strideInBytes))/elementSize
- * + 1
- *
- * [ad b]
- * Question b is now simple. We read from the wrapped scan line if
- * x is greater than xwrapped.
- */
-#define TILE_WIDTH_IN_BYTES 128
-#define TILE_WIDTH_IN_ZOXELS(bpz) (TILE_WIDTH_IN_BYTES/(bpz))
-#define TILE_HEIGHT_IN_LINES 32
-typedef struct
-{
- void *lfbPtr;
- void *lfbWrapPtr;
- FxU32 LFBStrideInElts;
- GLint firstWrappedX;
-}
-LFBParameters;
-
-/*
- * We need information about the back buffer. Note that
- * this function *cannot be called* while the aux buffer
- * is locked, or the caller will hang.
- *
- * Only Glide knows the LFB address of the back and depth
- * offsets. The upper levels of Mesa know the depth offset,
- * but that is not in LFB space, it is tiled memory space,
- * and is not useable for us.
- */
-static void
-GetBackBufferInfo(tdfxContextPtr fxMesa, GrLfbInfo_t * backBufferInfo)
-{
- READ_FB_SPAN_LOCK(fxMesa, *backBufferInfo, GR_BUFFER_BACKBUFFER);
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_BACKBUFFER);
-}
-
-static void
-GetFbParams(tdfxContextPtr fxMesa,
- GrLfbInfo_t * info,
- GrLfbInfo_t * backBufferInfo,
- LFBParameters * ReadParamsp, FxU32 elementSize)
-{
- FxU32 physicalStrideInBytes, bufferOffset;
- FxU32 strideInBytes = info->strideInBytes;
- char *lfbPtr = (char *) (info->lfbPtr); /* For arithmetic, use char * */
-
- /*
- * These two come directly from the info structure.
- */
- ReadParamsp->lfbPtr = (void *) lfbPtr;
- ReadParamsp->LFBStrideInElts = strideInBytes / elementSize;
- /*
- * Now, calculate the value of firstWrappedX.
- *
- * The physical stride is the screen width in bytes rounded up to
- * the next highest multiple of 128 bytes. Note that this fails
- * when TILE_WIDTH_IN_BYTES is not a power of two.
- *
- * The buffer Offset is the distance between the beginning of
- * the LFB space, which is the beginning of the back buffer,
- * and the buffer we are gathering information about.
- * We want to make this routine usable for operations on the
- * back buffer, though we don't actually use it on the back
- * buffer. Note, then, that if bufferOffset == 0, the firstWrappedX
- * is in the forbidden zone, and is therefore never reached.
- *
- * Note that if
- * physicalStrideInBytes
- * < bufferOffset&(info->strideInBytes-1)
- * the buffer begins in the forbidden zone. We assert for this.
- */
- bufferOffset = (FxU32)(lfbPtr - (char *) backBufferInfo->lfbPtr);
- physicalStrideInBytes
- = (fxMesa->screen_width * elementSize + TILE_WIDTH_IN_BYTES - 1)
- & ~(TILE_WIDTH_IN_BYTES - 1);
- assert(physicalStrideInBytes > (bufferOffset & (strideInBytes - 1)));
- ReadParamsp->firstWrappedX
- = (physicalStrideInBytes
- - (bufferOffset & (strideInBytes - 1))) / elementSize;
- /*
- * This is the address of the next physical line.
- */
- ReadParamsp->lfbWrapPtr
- = (void *) ((char *) backBufferInfo->lfbPtr
- + (bufferOffset & ~(strideInBytes - 1))
- + (TILE_HEIGHT_IN_LINES) * strideInBytes);
-}
-
-/*
- * These macros fetch data from the frame buffer. The type is
- * the type of data we want to fetch. It should match the type
- * whose size was used with GetFbParams to fill in the structure
- * in *ReadParamsp. We have a macro to read the ordinary
- * part, a second macro to read the wrapped part, and one which
- * will do either. When we are reading a span, we will know
- * when the ordinary part ends, so there's no need to test for
- * it. However, when reading and writing pixels, we don't
- * necessarily know. I suppose it's a matter of taste whether
- * it's better in the macro or in the call.
- *
- * Recall that x and y are screen coordinates.
- */
-#define GET_ORDINARY_FB_DATA(ReadParamsp, type, x, y) \
- (((type *)((ReadParamsp)->lfbPtr)) \
- [(y) * ((ReadParamsp)->LFBStrideInElts) \
- + (x)])
-#define GET_WRAPPED_FB_DATA(ReadParamsp, type, x, y) \
- (((type *)((ReadParamsp)->lfbWrapPtr)) \
- [((y)) * ((ReadParamsp)->LFBStrideInElts) \
- + ((x) - (ReadParamsp)->firstWrappedX)])
-#define GET_FB_DATA(ReadParamsp, type, x, y) \
- (((x) < (ReadParamsp)->firstWrappedX) \
- ? GET_ORDINARY_FB_DATA(ReadParamsp, type, x, y) \
- : GET_WRAPPED_FB_DATA(ReadParamsp, type, x, y))
-#define PUT_ORDINARY_FB_DATA(ReadParamsp, type, x, y, value) \
- (GET_ORDINARY_FB_DATA(ReadParamsp, type, x, y) = (type)(value))
-#define PUT_WRAPPED_FB_DATA(ReadParamsp, type, x, y, value) \
- (GET_WRAPPED_FB_DATA(ReadParamsp, type, x, y) = (type)(value))
-#define PUT_FB_DATA(ReadParamsp, type, x, y, value) \
- do { \
- if ((x) < (ReadParamsp)->firstWrappedX) \
- PUT_ORDINARY_FB_DATA(ReadParamsp, type, x, y, value); \
- else \
- PUT_WRAPPED_FB_DATA(ReadParamsp, type, x, y, value); \
- } while (0)
-
-
-static void
-tdfxDDWriteDepthSpan(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y, const void *values,
- const GLubyte mask[])
-{
- const GLuint *depth = (const GLuint *) values;
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
- GLint bottom = fxMesa->y_offset + fxMesa->height - 1;
- GLuint depth_size = fxMesa->glCtx->Visual.depthBits;
- GLuint stencil_size = fxMesa->glCtx->Visual.stencilBits;
- GrLfbInfo_t info;
- GLubyte visMask[MAX_WIDTH];
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "tdfxmesa: tdfxDDWriteDepthSpan(...)\n");
- }
-
- assert((depth_size == 16) || (depth_size == 24) || (depth_size == 32));
- /*
- * Convert x and y to screen coordinates.
- */
- x += fxMesa->x_offset;
- y = bottom - y;
- if (mask) {
- GLint i;
- GLushort d16;
- GrLfbInfo_t backBufferInfo;
-
- switch (depth_size) {
- case 16:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER,
- GR_LFBWRITEMODE_ANY);
- generate_vismask(fxMesa, x, y, n, visMask);
- {
- LFBParameters ReadParams;
- int wrappedPartStart;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLushort));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- for (i = 0; i < wrappedPartStart; i++) {
- if (mask[i] && visMask[i]) {
- d16 = depth[i];
- PUT_ORDINARY_FB_DATA(&ReadParams, GLushort, x + i, y, d16);
- }
- }
- for (; i < n; i++) {
- if (mask[i] && visMask[i]) {
- d16 = depth[i];
- PUT_WRAPPED_FB_DATA(&ReadParams, GLushort, x + i, y, d16);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- case 24:
- case 32:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER,
- GR_LFBWRITEMODE_ANY);
- generate_vismask(fxMesa, x, y, n, visMask);
- {
- LFBParameters ReadParams;
- int wrappedPartStart;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLuint));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- for (i = 0; i < wrappedPartStart; i++) {
- GLuint d32;
- if (mask[i] && visMask[i]) {
- if (stencil_size > 0) {
- d32 =
- GET_ORDINARY_FB_DATA(&ReadParams, GLuint,
- x + i, y);
- d32 =
- (d32 & 0xFF000000) | (depth[i] & 0x00FFFFFF);
- }
- else {
- d32 = depth[i];
- }
- PUT_ORDINARY_FB_DATA(&ReadParams, GLuint, x + i, y, d32);
- }
- }
- for (; i < n; i++) {
- GLuint d32;
- if (mask[i] && visMask[i]) {
- if (stencil_size > 0) {
- d32 =
- GET_WRAPPED_FB_DATA(&ReadParams, GLuint,
- x + i, y);
- d32 =
- (d32 & 0xFF000000) | (depth[i] & 0x00FFFFFF);
- }
- else {
- d32 = depth[i];
- }
- PUT_WRAPPED_FB_DATA(&ReadParams, GLuint, x + i, y, d32);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- }
- }
- else {
- GLint i;
- GLuint d32;
- GLushort d16;
- GrLfbInfo_t backBufferInfo;
-
- switch (depth_size) {
- case 16:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info,
- GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- generate_vismask(fxMesa, x, y, n, visMask);
- {
- LFBParameters ReadParams;
- GLuint wrappedPartStart;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLushort));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- for (i = 0; i < wrappedPartStart; i++) {
- if (visMask[i]) {
- d16 = depth[i];
- PUT_ORDINARY_FB_DATA(&ReadParams,
- GLushort,
- x + i, y,
- d16);
- }
- }
- for (; i < n; i++) {
- if (visMask[i]) {
- d16 = depth[i];
- PUT_WRAPPED_FB_DATA(&ReadParams,
- GLushort,
- x + i, y,
- d16);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- case 24:
- case 32:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info,
- GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- generate_vismask(fxMesa, x, y, n, visMask);
- {
- LFBParameters ReadParams;
- GLuint wrappedPartStart;
-
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLuint));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- for (i = 0; i < wrappedPartStart; i++) {
- if (visMask[i]) {
- if (stencil_size > 0) {
- d32 = GET_ORDINARY_FB_DATA(&ReadParams, GLuint, x + i, y);
- d32 =
- (d32 & 0xFF000000) | (depth[i] & 0x00FFFFFF);
- }
- else {
- d32 = depth[i];
- }
- PUT_ORDINARY_FB_DATA(&ReadParams, GLuint, x + i, y, d32);
- }
- }
- for (; i < n; i++) {
- if (visMask[i]) {
- if (stencil_size > 0) {
- d32 = GET_WRAPPED_FB_DATA(&ReadParams, GLuint, x + i, y);
- d32 =
- (d32 & 0xFF000000) | (depth[i] & 0x00FFFFFF);
- }
- else {
- d32 = depth[i];
- }
- PUT_WRAPPED_FB_DATA(&ReadParams, GLuint, x + i, y, d32);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- }
- }
-}
-
-static void
-tdfxDDWriteMonoDepthSpan(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y, const void *value,
- const GLubyte mask[])
-{
- GLuint depthVal = *((GLuint *) value);
- GLuint depths[MAX_WIDTH];
- GLuint i;
- for (i = 0; i < n; i++)
- depths[i] = depthVal;
- tdfxDDWriteDepthSpan(ctx, rb, n, x, y, depths, mask);
-}
-
-
-static void
-tdfxDDReadDepthSpan(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y, void *values)
-{
- GLuint *depth = (GLuint *) values;
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
- GLint bottom = fxMesa->height + fxMesa->y_offset - 1;
- GLuint i;
- GLuint depth_size = fxMesa->glCtx->Visual.depthBits;
- GrLfbInfo_t info;
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "tdfxmesa: tdfxDDReadDepthSpan(...)\n");
- }
-
- /*
- * Convert to screen coordinates.
- */
- x += fxMesa->x_offset;
- y = bottom - y;
- switch (depth_size) {
- case 16:
- {
- LFBParameters ReadParams;
- GrLfbInfo_t backBufferInfo;
- int wrappedPartStart;
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLushort));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- /*
- * Read the line.
- */
- for (i = 0; i < wrappedPartStart; i++) {
- depth[i] =
- GET_ORDINARY_FB_DATA(&ReadParams, GLushort, x + i, y);
- }
- for (; i < n; i++) {
- depth[i] = GET_WRAPPED_FB_DATA(&ReadParams, GLushort,
- x + i, y);
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- }
- case 24:
- case 32:
- {
- LFBParameters ReadParams;
- GrLfbInfo_t backBufferInfo;
- int wrappedPartStart;
- GLuint stencil_size = fxMesa->glCtx->Visual.stencilBits;
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLuint));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- /*
- * Read the line.
- */
- for (i = 0; i < wrappedPartStart; i++) {
- const GLuint mask =
- (stencil_size > 0) ? 0x00FFFFFF : 0xFFFFFFFF;
- depth[i] =
- GET_ORDINARY_FB_DATA(&ReadParams, GLuint, x + i, y);
- depth[i] &= mask;
- }
- for (; i < n; i++) {
- const GLuint mask =
- (stencil_size > 0) ? 0x00FFFFFF : 0xFFFFFFFF;
- depth[i] = GET_WRAPPED_FB_DATA(&ReadParams, GLuint, x + i, y);
- depth[i] &= mask;
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- }
- }
-}
-
-
-static void
-tdfxDDWriteDepthPixels(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, const GLint x[], const GLint y[],
- const void *values, const GLubyte mask[])
-{
- const GLuint *depth = (const GLuint *) values;
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
- GLint bottom = fxMesa->height + fxMesa->y_offset - 1;
- GLuint i;
- GLushort d16;
- GLuint d32;
- GLuint depth_size = fxMesa->glCtx->Visual.depthBits;
- GLuint stencil_size = fxMesa->glCtx->Visual.stencilBits;
- GrLfbInfo_t info;
- int xpos;
- int ypos;
- GrLfbInfo_t backBufferInfo;
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "tdfxmesa: tdfxDDWriteDepthPixels(...)\n");
- }
-
- switch (depth_size) {
- case 16:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info,
- GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- {
- LFBParameters ReadParams;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLushort));
- for (i = 0; i < n; i++) {
- if ((!mask || mask[i]) && visible_pixel(fxMesa, x[i], y[i])) {
- xpos = x[i] + fxMesa->x_offset;
- ypos = bottom - y[i];
- d16 = depth[i];
- PUT_FB_DATA(&ReadParams, GLushort, xpos, ypos, d16);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- case 24:
- case 32:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info,
- GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- {
- LFBParameters ReadParams;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLuint));
- for (i = 0; i < n; i++) {
- if (!mask || mask[i]) {
- if (visible_pixel(fxMesa, x[i], y[i])) {
- xpos = x[i] + fxMesa->x_offset;
- ypos = bottom - y[i];
- if (stencil_size > 0) {
- d32 =
- GET_FB_DATA(&ReadParams, GLuint, xpos, ypos);
- d32 = (d32 & 0xFF000000) | (depth[i] & 0xFFFFFF);
- }
- else {
- d32 = depth[i];
- }
- PUT_FB_DATA(&ReadParams, GLuint, xpos, ypos, d32);
- }
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- }
-}
-
-
-static void
-tdfxDDReadDepthPixels(struct gl_context * ctx, struct gl_renderbuffer *rb, GLuint n,
- const GLint x[], const GLint y[], void *values)
-{
- GLuint *depth = (GLuint *) values;
- tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
- GLint bottom = fxMesa->height + fxMesa->y_offset - 1;
- GLuint i;
- GLuint depth_size = fxMesa->glCtx->Visual.depthBits;
- GLushort d16;
- int xpos;
- int ypos;
- GrLfbInfo_t info;
- GLuint stencil_size;
- GrLfbInfo_t backBufferInfo;
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "tdfxmesa: tdfxDDReadDepthPixels(...)\n");
- }
-
- assert((depth_size == 16) || (depth_size == 24) || (depth_size == 32));
- switch (depth_size) {
- case 16:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- {
- LFBParameters ReadParams;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLushort));
- for (i = 0; i < n; i++) {
- /*
- * Convert to screen coordinates.
- */
- xpos = x[i] + fxMesa->x_offset;
- ypos = bottom - y[i];
- d16 = GET_FB_DATA(&ReadParams, GLushort, xpos, ypos);
- depth[i] = d16;
- }
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- case 24:
- case 32:
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- stencil_size = fxMesa->glCtx->Visual.stencilBits;
- {
- LFBParameters ReadParams;
- GetFbParams(fxMesa, &info, &backBufferInfo,
- &ReadParams, sizeof(GLuint));
- for (i = 0; i < n; i++) {
- GLuint d32;
-
- /*
- * Convert to screen coordinates.
- */
- xpos = x[i] + fxMesa->x_offset;
- ypos = bottom - y[i];
- d32 = GET_FB_DATA(&ReadParams, GLuint, xpos, ypos);
- if (stencil_size > 0) {
- d32 &= 0x00FFFFFF;
- }
- depth[i] = d32;
- }
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
- break;
- default:
- assert(0);
- }
-}
-
-/*
- * Stencil buffer read/write functions.
- */
-#define EXTRACT_S_FROM_ZS(zs) (((zs) >> 24) & 0xFF)
-#define EXTRACT_Z_FROM_ZS(zs) ((zs) & 0xffffff)
-#define BUILD_ZS(z, s) (((s) << 24) | (z))
-
-static void
-write_stencil_span(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y,
- const void *values, const GLubyte mask[])
-{
- const GLubyte *stencil = (const GLubyte *) values;
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GrLfbInfo_t backBufferInfo;
-
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- {
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- const GLint winX = fxMesa->x_offset;
- const GLint scrX = winX + x;
- const GLint scrY = winY - y;
- LFBParameters ReadParams;
- GLubyte visMask[MAX_WIDTH];
- GLuint i;
- int wrappedPartStart;
-
- GetFbParams(fxMesa, &info, &backBufferInfo, &ReadParams,
- sizeof(GLuint));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- generate_vismask(fxMesa, scrX, scrY, n, visMask);
- for (i = 0; i < wrappedPartStart; i++) {
- if (visMask[i] && (!mask || mask[i])) {
- GLuint z = GET_ORDINARY_FB_DATA(&ReadParams, GLuint,
- scrX + i, scrY) & 0x00FFFFFF;
- z |= (stencil[i] & 0xFF) << 24;
- PUT_ORDINARY_FB_DATA(&ReadParams, GLuint, scrX + i, scrY, z);
- }
- }
- for (; i < n; i++) {
- if (visMask[i] && (!mask || mask[i])) {
- GLuint z = GET_WRAPPED_FB_DATA(&ReadParams, GLuint,
- scrX + i, scrY) & 0x00FFFFFF;
- z |= (stencil[i] & 0xFF) << 24;
- PUT_WRAPPED_FB_DATA(&ReadParams, GLuint, scrX + i, scrY, z);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
-}
-
-
-static void
-write_mono_stencil_span(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y,
- const void *value, const GLubyte mask[])
-{
- GLbyte stencilVal = *((GLbyte *) value);
- GLbyte stencils[MAX_WIDTH];
- GLuint i;
- for (i = 0; i < n; i++)
- stencils[i] = stencilVal;
- write_stencil_span(ctx, rb, n, x, y, stencils, mask);
-}
-
-
-static void
-read_stencil_span(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, GLint x, GLint y,
- void *values)
-{
- GLubyte *stencil = (GLubyte *) values;
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GrLfbInfo_t backBufferInfo;
-
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- {
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- const GLint winX = fxMesa->x_offset;
- GLuint i;
- LFBParameters ReadParams;
- int wrappedPartStart;
-
- /*
- * Convert to screen coordinates.
- */
- x += winX;
- y = winY - y;
- GetFbParams(fxMesa, &info, &backBufferInfo, &ReadParams,
- sizeof(GLuint));
- if (ReadParams.firstWrappedX <= x) {
- wrappedPartStart = 0;
- }
- else if (n <= (ReadParams.firstWrappedX - x)) {
- wrappedPartStart = n;
- }
- else {
- wrappedPartStart = (ReadParams.firstWrappedX - x);
- }
- for (i = 0; i < wrappedPartStart; i++) {
- stencil[i] = (GET_ORDINARY_FB_DATA(&ReadParams, GLuint,
- x + i, y) >> 24) & 0xFF;
- }
- for (; i < n; i++) {
- stencil[i] = (GET_WRAPPED_FB_DATA(&ReadParams, GLuint,
- x + i, y) >> 24) & 0xFF;
- }
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
-}
-
-
-static void
-write_stencil_pixels(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, const GLint x[], const GLint y[],
- const void *values, const GLubyte mask[])
-{
- const GLubyte *stencil = (const GLubyte *) values;
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GrLfbInfo_t backBufferInfo;
-
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- WRITE_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
- {
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- const GLint winX = fxMesa->x_offset;
- LFBParameters ReadParams;
- GLuint i;
-
- GetFbParams(fxMesa, &info, &backBufferInfo, &ReadParams,
- sizeof(GLuint));
- for (i = 0; i < n; i++) {
- const GLint scrX = winX + x[i];
- const GLint scrY = winY - y[i];
- if ((!mask || mask[i]) && visible_pixel(fxMesa, scrX, scrY)) {
- GLuint z =
- GET_FB_DATA(&ReadParams, GLuint, scrX, scrY) & 0x00FFFFFF;
- z |= (stencil[i] & 0xFF) << 24;
- PUT_FB_DATA(&ReadParams, GLuint, scrX, scrY, z);
- }
- }
- }
- WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
-}
-
-
-static void
-read_stencil_pixels(struct gl_context * ctx, struct gl_renderbuffer *rb,
- GLuint n, const GLint x[], const GLint y[],
- void *values)
-{
- GLubyte *stencil = (GLubyte *) values;
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrLfbInfo_t info;
- GrLfbInfo_t backBufferInfo;
-
- GetBackBufferInfo(fxMesa, &backBufferInfo);
- /*
- * Note that the _LOCK macro adds a curly brace,
- * and the UNLOCK macro removes it.
- */
- READ_FB_SPAN_LOCK(fxMesa, info, GR_BUFFER_AUXBUFFER);
- {
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
- const GLint winX = fxMesa->x_offset;
- GLuint i;
- LFBParameters ReadParams;
-
- GetFbParams(fxMesa, &info, &backBufferInfo, &ReadParams,
- sizeof(GLuint));
- for (i = 0; i < n; i++) {
- const GLint scrX = winX + x[i];
- const GLint scrY = winY - y[i];
- stencil[i] =
- (GET_FB_DATA(&ReadParams, GLuint, scrX, scrY) >> 24) & 0xFF;
- }
- }
- READ_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
-}
-
-#define VISUAL_EQUALS_RGBA(vis, r, g, b, a) \
- ((vis.redBits == r) && \
- (vis.greenBits == g) && \
- (vis.blueBits == b) && \
- (vis.alphaBits == a))
-
-
-
-
-/**********************************************************************/
-/* Locking for swrast */
-/**********************************************************************/
-
-
-static void tdfxSpanRenderStart( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- LOCK_HARDWARE(fxMesa);
-}
-
-static void tdfxSpanRenderFinish( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- _swrast_flush( ctx );
- UNLOCK_HARDWARE(fxMesa);
-}
-
-/**********************************************************************/
-/* Initialize swrast device driver */
-/**********************************************************************/
-
-void tdfxDDInitSpanFuncs( struct gl_context *ctx )
-{
- struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
- swdd->SpanRenderStart = tdfxSpanRenderStart;
- swdd->SpanRenderFinish = tdfxSpanRenderFinish;
-}
-
-
-
-/**
- * Plug in the Get/Put routines for the given driRenderbuffer.
- */
-void
-tdfxSetSpanFunctions(driRenderbuffer *drb, const struct gl_config *vis)
-{
- if (drb->Base.InternalFormat == GL_RGBA) {
- if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) {
- tdfxInitPointers_RGB565(&drb->Base);
- }
- else if (vis->redBits == 8 && vis->greenBits == 8
- && vis->blueBits == 8 && vis->alphaBits == 0) {
- tdfxInitPointers_RGB888(&drb->Base);
- }
- else if (vis->redBits == 8 && vis->greenBits == 8
- && vis->blueBits == 8 && vis->alphaBits == 8) {
- tdfxInitPointers_ARGB8888(&drb->Base);
- }
- else {
- _mesa_problem(NULL, "problem in tdfxSetSpanFunctions");
- }
- }
- else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16 ||
- drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) {
- drb->Base.GetRow = tdfxDDReadDepthSpan;
- drb->Base.GetValues = tdfxDDReadDepthPixels;
- drb->Base.PutRow = tdfxDDWriteDepthSpan;
- drb->Base.PutMonoRow = tdfxDDWriteMonoDepthSpan;
- drb->Base.PutValues = tdfxDDWriteDepthPixels;
- drb->Base.PutMonoValues = NULL;
- }
- else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) {
- drb->Base.GetRow = read_stencil_span;
- drb->Base.GetValues = read_stencil_pixels;
- drb->Base.PutRow = write_stencil_span;
- drb->Base.PutMonoRow = write_mono_stencil_span;
- drb->Base.PutValues = write_stencil_pixels;
- drb->Base.PutMonoValues = NULL;
- }
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_span.h b/src/mesa/drivers/dri/tdfx/tdfx_span.h
deleted file mode 100644
index ae3d074a582..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_span.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#ifndef __TDFX_SPAN_H__
-#define __TDFX_SPAN_H__
-
-#include "main/context.h"
-#include "drirenderbuffer.h"
-
-extern void tdfxDDInitSpanFuncs( struct gl_context *ctx );
-
-extern void
-tdfxSetSpanFunctions(driRenderbuffer *rb, const struct gl_config *vis);
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_state.c b/src/mesa/drivers/dri/tdfx/tdfx_state.c
deleted file mode 100644
index b26b2c710b9..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_state.c
+++ /dev/null
@@ -1,1429 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * 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>
- * Brian Paul <brianp@valinux.com>
- * Keith Whitwell <keith@tungstengraphics.com> (port to 3.5)
- *
- */
-
-#include "main/mtypes.h"
-#include "main/colormac.h"
-
-#include "swrast/swrast.h"
-#include "vbo/vbo.h"
-#include "tnl/tnl.h"
-#include "tnl/t_pipeline.h"
-#include "swrast_setup/swrast_setup.h"
-
-#include "tdfx_context.h"
-#include "tdfx_state.h"
-#include "tdfx_tex.h"
-#include "tdfx_texman.h"
-#include "tdfx_texstate.h"
-#include "tdfx_render.h"
-
-
-
-/* =============================================================
- * Alpha blending
- */
-
-static void tdfxUpdateAlphaMode( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrCmpFnc_t func;
- GrAlphaBlendFnc_t srcRGB, dstRGB, srcA, dstA;
- GrAlphaBlendOp_t eqRGB, eqA;
- GrAlpha_t ref = (GLint) (ctx->Color.AlphaRef * 255.0);
-
- GLboolean isNapalm = TDFX_IS_NAPALM(fxMesa);
- GLboolean have32bpp = (ctx->Visual.greenBits == 8);
- GLboolean haveAlpha = fxMesa->haveHwAlpha;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- if ( ctx->Color.AlphaEnabled ) {
- func = ctx->Color.AlphaFunc - GL_NEVER + GR_CMP_NEVER;
- } else {
- func = GR_CMP_ALWAYS;
- }
-
- if ( ctx->Color.BlendEnabled
- && (fxMesa->Fallback & TDFX_FALLBACK_BLEND) == 0 ) {
- switch ( ctx->Color.Blend[0].SrcRGB ) {
- case GL_ZERO:
- srcRGB = GR_BLEND_ZERO;
- break;
- case GL_ONE:
- srcRGB = GR_BLEND_ONE;
- break;
- case GL_DST_COLOR:
- srcRGB = GR_BLEND_DST_COLOR;
- break;
- case GL_ONE_MINUS_DST_COLOR:
- srcRGB = GR_BLEND_ONE_MINUS_DST_COLOR;
- break;
- case GL_SRC_ALPHA:
- srcRGB = GR_BLEND_SRC_ALPHA;
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- srcRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA;
- break;
- case GL_DST_ALPHA:
- srcRGB = haveAlpha ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_ONE_MINUS_DST_ALPHA:
- srcRGB = haveAlpha ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- case GL_SRC_ALPHA_SATURATE:
- srcRGB = GR_BLEND_ALPHA_SATURATE;
- break;
- case GL_SRC_COLOR:
- if (isNapalm) {
- srcRGB = GR_BLEND_SAME_COLOR_EXT;
- break;
- }
- case GL_ONE_MINUS_SRC_COLOR:
- if (isNapalm) {
- srcRGB = GR_BLEND_ONE_MINUS_SAME_COLOR_EXT;
- break;
- }
- default:
- srcRGB = GR_BLEND_ONE;
- }
-
- switch ( ctx->Color.Blend[0].SrcA ) {
- case GL_ZERO:
- srcA = GR_BLEND_ZERO;
- break;
- case GL_ONE:
- srcA = GR_BLEND_ONE;
- break;
- case GL_SRC_COLOR:
- case GL_SRC_ALPHA:
- srcA = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- case GL_ONE_MINUS_SRC_ALPHA:
- srcA = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_DST_COLOR:
- case GL_DST_ALPHA:
- srcA = (have32bpp && haveAlpha) ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_ONE_MINUS_DST_COLOR:
- case GL_ONE_MINUS_DST_ALPHA:
- srcA = (have32bpp && haveAlpha) ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- case GL_SRC_ALPHA_SATURATE:
- srcA = GR_BLEND_ONE;
- break;
- default:
- srcA = GR_BLEND_ONE;
- }
-
- switch ( ctx->Color.Blend[0].DstRGB ) {
- case GL_ZERO:
- dstRGB = GR_BLEND_ZERO;
- break;
- case GL_ONE:
- dstRGB = GR_BLEND_ONE;
- break;
- case GL_SRC_COLOR:
- dstRGB = GR_BLEND_SRC_COLOR;
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- dstRGB = GR_BLEND_ONE_MINUS_SRC_COLOR;
- break;
- case GL_SRC_ALPHA:
- dstRGB = GR_BLEND_SRC_ALPHA;
- break;
- case GL_ONE_MINUS_SRC_ALPHA:
- dstRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA;
- break;
- case GL_DST_ALPHA:
- dstRGB = haveAlpha ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_ONE_MINUS_DST_ALPHA:
- dstRGB = haveAlpha ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- case GL_DST_COLOR:
- if (isNapalm) {
- dstRGB = GR_BLEND_SAME_COLOR_EXT;
- break;
- }
- case GL_ONE_MINUS_DST_COLOR:
- if (isNapalm) {
- dstRGB = GR_BLEND_ONE_MINUS_SAME_COLOR_EXT;
- break;
- }
- default:
- dstRGB = GR_BLEND_ZERO;
- }
-
- switch ( ctx->Color.Blend[0].DstA ) {
- case GL_ZERO:
- dstA = GR_BLEND_ZERO;
- break;
- case GL_ONE:
- dstA = GR_BLEND_ONE;
- break;
- case GL_SRC_COLOR:
- case GL_SRC_ALPHA:
- dstA = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- case GL_ONE_MINUS_SRC_COLOR:
- case GL_ONE_MINUS_SRC_ALPHA:
- dstA = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- case GL_DST_COLOR:
- case GL_DST_ALPHA:
- dstA = have32bpp ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/;
- break;
- case GL_ONE_MINUS_DST_COLOR:
- case GL_ONE_MINUS_DST_ALPHA:
- dstA = have32bpp ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/;
- break;
- default:
- dstA = GR_BLEND_ZERO;
- }
-
- switch ( ctx->Color.Blend[0].EquationRGB ) {
- case GL_FUNC_SUBTRACT:
- eqRGB = GR_BLEND_OP_SUB;
- break;
- case GL_FUNC_REVERSE_SUBTRACT:
- eqRGB = GR_BLEND_OP_REVSUB;
- break;
- case GL_FUNC_ADD:
- default:
- eqRGB = GR_BLEND_OP_ADD;
- break;
- }
-
- switch ( ctx->Color.Blend[0].EquationA ) {
- case GL_FUNC_SUBTRACT:
- eqA = GR_BLEND_OP_SUB;
- break;
- case GL_FUNC_REVERSE_SUBTRACT:
- eqA = GR_BLEND_OP_REVSUB;
- break;
- case GL_FUNC_ADD:
- default:
- eqA = GR_BLEND_OP_ADD;
- break;
- }
- } else {
- /* blend disabled */
- srcRGB = GR_BLEND_ONE;
- dstRGB = GR_BLEND_ZERO;
- eqRGB = GR_BLEND_OP_ADD;
- srcA = GR_BLEND_ONE;
- dstA = GR_BLEND_ZERO;
- eqA = GR_BLEND_OP_ADD;
- }
-
- if ( fxMesa->Color.AlphaFunc != func ) {
- fxMesa->Color.AlphaFunc = func;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_TEST;
- }
- if ( fxMesa->Color.AlphaRef != ref ) {
- fxMesa->Color.AlphaRef = ref;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_REF;
- }
-
- if ( fxMesa->Color.BlendSrcRGB != srcRGB ||
- fxMesa->Color.BlendDstRGB != dstRGB ||
- fxMesa->Color.BlendEqRGB != eqRGB ||
- fxMesa->Color.BlendSrcA != srcA ||
- fxMesa->Color.BlendDstA != dstA ||
- fxMesa->Color.BlendEqA != eqA )
- {
- fxMesa->Color.BlendSrcRGB = srcRGB;
- fxMesa->Color.BlendDstRGB = dstRGB;
- fxMesa->Color.BlendEqRGB = eqRGB;
- fxMesa->Color.BlendSrcA = srcA;
- fxMesa->Color.BlendDstA = dstA;
- fxMesa->Color.BlendEqA = eqA;
- fxMesa->dirty |= TDFX_UPLOAD_BLEND_FUNC;
- }
-}
-
-static void tdfxDDAlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_ALPHA;
-}
-
-static void tdfxDDBlendEquationSeparate( struct gl_context *ctx,
- GLenum modeRGB, GLenum modeA )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- assert( modeRGB == modeA );
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_ALPHA;
-}
-
-static void tdfxDDBlendFuncSeparate( struct gl_context *ctx,
- GLenum sfactorRGB, GLenum dfactorRGB,
- GLenum sfactorA, GLenum dfactorA )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_ALPHA;
-
- /*
- * XXX - Voodoo5 seems to suffer from precision problems in some
- * blend modes. To pass all the conformance tests we'd have to
- * fall back to software for many modes. Revisit someday.
- */
-}
-
-/* =============================================================
- * Stipple
- */
-
-void tdfxUpdateStipple( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- GrStippleMode_t mode = GR_STIPPLE_DISABLE;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- FLUSH_BATCH( fxMesa );
-
- if (ctx->Polygon.StippleFlag) {
- mode = GR_STIPPLE_PATTERN;
- }
-
- if ( fxMesa->Stipple.Mode != mode ) {
- fxMesa->Stipple.Mode = mode;
- fxMesa->dirty |= TDFX_UPLOAD_STIPPLE;
- }
-}
-
-
-/* =============================================================
- * Depth testing
- */
-
-static void tdfxUpdateZMode( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- GrCmpFnc_t func;
- FxI32 bias;
- FxBool mask;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API )
- fprintf( stderr, "%s()\n", __FUNCTION__ );
-
-
- bias = (FxI32) (ctx->Polygon.OffsetUnits * TDFX_DEPTH_BIAS_SCALE);
-
- if ( ctx->Depth.Test ) {
- func = ctx->Depth.Func - GL_NEVER + GR_CMP_NEVER;
- mask = ctx->Depth.Mask;
- }
- else {
- /* depth testing disabled */
- func = GR_CMP_ALWAYS; /* fragments always pass */
- mask = FXFALSE; /* zbuffer is not touched */
- }
-
- fxMesa->Depth.Clear = (FxU32) (ctx->DrawBuffer->_DepthMaxF * ctx->Depth.Clear);
-
- if ( fxMesa->Depth.Bias != bias ) {
- fxMesa->Depth.Bias = bias;
- fxMesa->dirty |= TDFX_UPLOAD_DEPTH_BIAS;
- }
- if ( fxMesa->Depth.Func != func ) {
- fxMesa->Depth.Func = func;
- fxMesa->dirty |= TDFX_UPLOAD_DEPTH_FUNC | TDFX_UPLOAD_DEPTH_MASK;
- }
- if ( fxMesa->Depth.Mask != mask ) {
- fxMesa->Depth.Mask = mask;
- fxMesa->dirty |= TDFX_UPLOAD_DEPTH_MASK;
- }
-}
-
-static void tdfxDDDepthFunc( struct gl_context *ctx, GLenum func )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_DEPTH;
-}
-
-static void tdfxDDDepthMask( struct gl_context *ctx, GLboolean flag )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_DEPTH;
-}
-
-static void tdfxDDClearDepth( struct gl_context *ctx, GLclampd d )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_DEPTH;
-}
-
-
-
-/* =============================================================
- * Stencil
- */
-
-
-/* Evaluate all stencil state and make the Glide calls.
- */
-static GrStencil_t convertGLStencilOp( GLenum op )
-{
- switch ( op ) {
- case GL_KEEP:
- return GR_STENCILOP_KEEP;
- case GL_ZERO:
- return GR_STENCILOP_ZERO;
- case GL_REPLACE:
- return GR_STENCILOP_REPLACE;
- case GL_INCR:
- return GR_STENCILOP_INCR_CLAMP;
- case GL_DECR:
- return GR_STENCILOP_DECR_CLAMP;
- case GL_INVERT:
- return GR_STENCILOP_INVERT;
- case GL_INCR_WRAP_EXT:
- return GR_STENCILOP_INCR_WRAP;
- case GL_DECR_WRAP_EXT:
- return GR_STENCILOP_DECR_WRAP;
- default:
- _mesa_problem( NULL, "bad stencil op in convertGLStencilOp" );
- }
- return GR_STENCILOP_KEEP; /* never get, silence compiler warning */
-}
-
-
-static void tdfxUpdateStencil( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- if (fxMesa->haveHwStencil) {
- if (ctx->Stencil._Enabled) {
- fxMesa->Stencil.Function = ctx->Stencil.Function[0] - GL_NEVER + GR_CMP_NEVER;
- fxMesa->Stencil.RefValue = ctx->Stencil.Ref[0] & 0xff;
- fxMesa->Stencil.ValueMask = ctx->Stencil.ValueMask[0] & 0xff;
- fxMesa->Stencil.WriteMask = ctx->Stencil.WriteMask[0] & 0xff;
- fxMesa->Stencil.FailFunc = convertGLStencilOp(ctx->Stencil.FailFunc[0]);
- fxMesa->Stencil.ZFailFunc = convertGLStencilOp(ctx->Stencil.ZFailFunc[0]);
- fxMesa->Stencil.ZPassFunc = convertGLStencilOp(ctx->Stencil.ZPassFunc[0]);
- fxMesa->Stencil.Clear = ctx->Stencil.Clear & 0xff;
- }
- fxMesa->dirty |= TDFX_UPLOAD_STENCIL;
- }
-}
-
-
-static void
-tdfxDDStencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func,
- GLint ref, GLuint mask )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_STENCIL;
-}
-
-static void
-tdfxDDStencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_STENCIL;
-}
-
-static void
-tdfxDDStencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum sfail,
- GLenum zfail, GLenum zpass )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_STENCIL;
-}
-
-
-/* =============================================================
- * Fog - orthographic fog still not working
- */
-
-static void tdfxUpdateFogAttrib( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrFogMode_t mode;
- GrColor_t color;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- if ( ctx->Fog.Enabled ) {
- if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
- mode = GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT;
- } else {
- mode = GR_FOG_WITH_TABLE_ON_Q;
- }
- } else {
- mode = GR_FOG_DISABLE;
- }
-
- color = TDFXPACKCOLOR888((GLubyte)(ctx->Fog.Color[0]*255.0F),
- (GLubyte)(ctx->Fog.Color[1]*255.0F),
- (GLubyte)(ctx->Fog.Color[2]*255.0F));
-
- if ( fxMesa->Fog.Mode != mode ) {
- fxMesa->Fog.Mode = mode;
- fxMesa->dirty |= TDFX_UPLOAD_FOG_MODE;
- fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT;/*JJJ*/
- }
- if ( fxMesa->Fog.Color != color ) {
- fxMesa->Fog.Color = color;
- fxMesa->dirty |= TDFX_UPLOAD_FOG_COLOR;
- }
- if ( fxMesa->Fog.TableMode != ctx->Fog.Mode ||
- fxMesa->Fog.Density != ctx->Fog.Density ||
- fxMesa->Fog.Near != ctx->Fog.Start ||
- fxMesa->Fog.Far != ctx->Fog.End )
- {
- switch( ctx->Fog.Mode ) {
- case GL_EXP:
- fxMesa->Glide.guFogGenerateExp( fxMesa->Fog.Table, ctx->Fog.Density );
- break;
- case GL_EXP2:
- fxMesa->Glide.guFogGenerateExp2( fxMesa->Fog.Table, ctx->Fog.Density);
- break;
- case GL_LINEAR:
- fxMesa->Glide.guFogGenerateLinear( fxMesa->Fog.Table,
- ctx->Fog.Start, ctx->Fog.End );
- break;
- }
-
- fxMesa->Fog.TableMode = ctx->Fog.Mode;
- fxMesa->Fog.Density = ctx->Fog.Density;
- fxMesa->Fog.Near = ctx->Fog.Start;
- fxMesa->Fog.Far = ctx->Fog.End;
- fxMesa->dirty |= TDFX_UPLOAD_FOG_TABLE;
- }
-}
-
-static void tdfxDDFogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_FOG;
-
- switch (pname) {
- case GL_FOG_COORDINATE_SOURCE_EXT: {
- GLenum p = (GLenum)*param;
- if (p == GL_FOG_COORDINATE_EXT) {
- _swrast_allow_vertex_fog(ctx, GL_TRUE);
- _swrast_allow_pixel_fog(ctx, GL_FALSE);
- _tnl_allow_vertex_fog( ctx, GL_TRUE);
- _tnl_allow_pixel_fog( ctx, GL_FALSE);
- } else {
- _swrast_allow_vertex_fog(ctx, GL_FALSE);
- _swrast_allow_pixel_fog(ctx, GL_TRUE);
- _tnl_allow_vertex_fog( ctx, GL_FALSE);
- _tnl_allow_pixel_fog( ctx, GL_TRUE);
- }
- break;
- }
- default:
- ;
- }
-}
-
-
-/* =============================================================
- * Clipping
- */
-
-static int intersect_rect( drm_clip_rect_t *out,
- const drm_clip_rect_t *a,
- const drm_clip_rect_t *b)
-{
- *out = *a;
- if (b->x1 > out->x1) out->x1 = b->x1;
- if (b->y1 > out->y1) out->y1 = b->y1;
- if (b->x2 < out->x2) out->x2 = b->x2;
- if (b->y2 < out->y2) out->y2 = b->y2;
- if (out->x1 >= out->x2) return 0;
- if (out->y1 >= out->y2) return 0;
- return 1;
-}
-
-
-/*
- * Examine XF86 cliprect list and scissor state to recompute our
- * cliprect list.
- */
-void tdfxUpdateClipping( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- __DRIdrawable *dPriv = fxMesa->driDrawable;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- assert(ctx);
- assert(fxMesa);
- assert(dPriv);
-
- if ( dPriv->x != fxMesa->x_offset || dPriv->y != fxMesa->y_offset ||
- dPriv->w != fxMesa->width || dPriv->h != fxMesa->height ) {
- fxMesa->x_offset = dPriv->x;
- fxMesa->y_offset = dPriv->y;
- fxMesa->width = dPriv->w;
- fxMesa->height = dPriv->h;
- fxMesa->y_delta =
- fxMesa->screen_height - fxMesa->y_offset - fxMesa->height;
- tdfxUpdateViewport( ctx );
- }
-
- if (fxMesa->scissoredClipRects && fxMesa->pClipRects) {
- free(fxMesa->pClipRects);
- }
-
- if (ctx->Scissor.Enabled) {
- /* intersect OpenGL scissor box with all cliprects to make a new
- * list of cliprects.
- */
- drm_clip_rect_t scissor;
- int x1 = ctx->Scissor.X + fxMesa->x_offset;
- int y1 = fxMesa->screen_height - fxMesa->y_delta
- - ctx->Scissor.Y - ctx->Scissor.Height;
- int x2 = x1 + ctx->Scissor.Width;
- int y2 = y1 + ctx->Scissor.Height;
- scissor.x1 = MAX2(x1, 0);
- scissor.y1 = MAX2(y1, 0);
- scissor.x2 = MAX2(x2, 0);
- scissor.y2 = MAX2(y2, 0);
-
- assert(scissor.x2 >= scissor.x1);
- assert(scissor.y2 >= scissor.y1);
-
- fxMesa->pClipRects = malloc(dPriv->numClipRects
- * sizeof(drm_clip_rect_t));
- if (fxMesa->pClipRects) {
- int i;
- fxMesa->numClipRects = 0;
- for (i = 0; i < dPriv->numClipRects; i++) {
- if (intersect_rect(&fxMesa->pClipRects[fxMesa->numClipRects],
- &scissor, &dPriv->pClipRects[i])) {
- fxMesa->numClipRects++;
- }
- }
- fxMesa->scissoredClipRects = GL_TRUE;
- }
- else {
- /* out of memory, forgo scissor */
- fxMesa->numClipRects = dPriv->numClipRects;
- fxMesa->pClipRects = dPriv->pClipRects;
- fxMesa->scissoredClipRects = GL_FALSE;
- }
- }
- else {
- fxMesa->numClipRects = dPriv->numClipRects;
- fxMesa->pClipRects = dPriv->pClipRects;
- fxMesa->scissoredClipRects = GL_FALSE;
- }
-
- fxMesa->dirty |= TDFX_UPLOAD_CLIP;
-}
-
-
-
-/* =============================================================
- * Culling
- */
-
-void tdfxUpdateCull( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrCullMode_t mode = GR_CULL_DISABLE;
-
- /* KW: don't need to check raster_primitive here as we don't
- * attempt to draw lines or points with triangles.
- */
- if ( ctx->Polygon.CullFlag ) {
- switch ( ctx->Polygon.CullFaceMode ) {
- case GL_FRONT:
- if ( ctx->Polygon.FrontFace == GL_CCW ) {
- mode = GR_CULL_POSITIVE;
- } else {
- mode = GR_CULL_NEGATIVE;
- }
- break;
-
- case GL_BACK:
- if ( ctx->Polygon.FrontFace == GL_CCW ) {
- mode = GR_CULL_NEGATIVE;
- } else {
- mode = GR_CULL_POSITIVE;
- }
- break;
-
- case GL_FRONT_AND_BACK:
- /* Handled as a fallback on triangles in tdfx_tris.c */
- return;
-
- default:
- ASSERT(0);
- break;
- }
- }
-
- if ( fxMesa->CullMode != mode ) {
- fxMesa->CullMode = mode;
- fxMesa->dirty |= TDFX_UPLOAD_CULL;
- }
-}
-
-static void tdfxDDCullFace( struct gl_context *ctx, GLenum mode )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_CULL;
-}
-
-static void tdfxDDFrontFace( struct gl_context *ctx, GLenum mode )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_CULL;
-}
-
-
-/* =============================================================
- * Line drawing.
- */
-
-static void tdfxUpdateLine( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- FLUSH_BATCH( fxMesa );
- fxMesa->dirty |= TDFX_UPLOAD_LINE;
-}
-
-
-static void tdfxDDLineWidth( struct gl_context *ctx, GLfloat width )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_LINE;
-}
-
-
-/* =============================================================
- * Color Attributes
- */
-
-static void tdfxDDColorMask( struct gl_context *ctx,
- GLboolean r, GLboolean g,
- GLboolean b, GLboolean a )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FLUSH_BATCH( fxMesa );
-
- if ( fxMesa->Color.ColorMask[RCOMP] != r ||
- fxMesa->Color.ColorMask[GCOMP] != g ||
- fxMesa->Color.ColorMask[BCOMP] != b ||
- fxMesa->Color.ColorMask[ACOMP] != a ) {
- fxMesa->Color.ColorMask[RCOMP] = r;
- fxMesa->Color.ColorMask[GCOMP] = g;
- fxMesa->Color.ColorMask[BCOMP] = b;
- fxMesa->Color.ColorMask[ACOMP] = a;
- fxMesa->dirty |= TDFX_UPLOAD_COLOR_MASK;
-
- if (ctx->Visual.redBits < 8) {
- /* Can't do RGB colormasking in 16bpp mode. */
- /* We can completely ignore the alpha mask. */
- FALLBACK( fxMesa, TDFX_FALLBACK_COLORMASK, (r != g || g != b) );
- }
- }
-}
-
-
-static void tdfxDDClearColor( struct gl_context *ctx,
- const GLfloat color[4] )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLubyte c[4];
- FLUSH_BATCH( fxMesa );
- CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
- fxMesa->Color.ClearColor = TDFXPACKCOLOR888( c[0], c[1], c[2] );
- fxMesa->Color.ClearAlpha = c[3];
-}
-
-
-/* =============================================================
- * Light Model
- */
-
-static void tdfxDDLightModelfv( struct gl_context *ctx, GLenum pname,
- const GLfloat *param )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ( pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
- FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR,
- (ctx->Light.Enabled &&
- ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ));
- }
-}
-
-static void tdfxDDShadeModel( struct gl_context *ctx, GLenum mode )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- /* FIXME: Can we implement native flat shading? */
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-/* =============================================================
- * Scissor
- */
-
-static void
-tdfxDDScissor(struct gl_context * ctx, GLint x, GLint y, GLsizei w, GLsizei h)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_CLIP;
-}
-
-/* =============================================================
- * Render
- */
-
-static void tdfxUpdateRenderAttrib( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FLUSH_BATCH( fxMesa );
- fxMesa->dirty |= TDFX_UPLOAD_RENDER_BUFFER;
-}
-
-/* =============================================================
- * Viewport
- */
-
-void tdfxUpdateViewport( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- const GLfloat *v = ctx->Viewport._WindowMap.m;
- GLfloat *m = fxMesa->hw_viewport;
-
- m[MAT_SX] = v[MAT_SX];
- m[MAT_TX] = v[MAT_TX] + fxMesa->x_offset + TRI_X_OFFSET;
- m[MAT_SY] = v[MAT_SY];
- m[MAT_TY] = v[MAT_TY] + fxMesa->y_delta + TRI_Y_OFFSET;
- m[MAT_SZ] = v[MAT_SZ];
- m[MAT_TZ] = v[MAT_TZ];
-
- fxMesa->SetupNewInputs |= VERT_BIT_POS;
-}
-
-
-static void tdfxDDViewport( struct gl_context *ctx, GLint x, GLint y,
- GLsizei w, GLsizei h )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_VIEWPORT;
-}
-
-
-static void tdfxDDDepthRange( struct gl_context *ctx, GLclampd nearVal, GLclampd farVal )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_VIEWPORT;
-}
-
-
-/* =============================================================
- * State enable/disable
- */
-
-static void tdfxDDEnable( struct gl_context *ctx, GLenum cap, GLboolean state )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- switch ( cap ) {
- case GL_ALPHA_TEST:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_ALPHA;
- break;
-
- case GL_BLEND:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_ALPHA;
- FALLBACK( fxMesa, TDFX_FALLBACK_LOGICOP,
- (ctx->Color.ColorLogicOpEnabled &&
- ctx->Color.LogicOp != GL_COPY)/*JJJ - more blending*/);
- break;
-
- case GL_CULL_FACE:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_CULL;
- break;
-
- case GL_DEPTH_TEST:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_DEPTH;
- break;
-
- case GL_DITHER:
- FLUSH_BATCH( fxMesa );
- if ( state ) {
- fxMesa->Color.Dither = GR_DITHER_2x2;
- } else {
- fxMesa->Color.Dither = GR_DITHER_DISABLE;
- }
- fxMesa->dirty |= TDFX_UPLOAD_DITHER;
- break;
-
- case GL_FOG:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_FOG;
- break;
-
- case GL_COLOR_LOGIC_OP:
- FALLBACK( fxMesa, TDFX_FALLBACK_LOGICOP,
- (ctx->Color.ColorLogicOpEnabled &&
- ctx->Color.LogicOp != GL_COPY));
- break;
-
- case GL_LIGHTING:
- FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR,
- (ctx->Light.Enabled &&
- ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ));
- break;
-
- case GL_LINE_SMOOTH:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_LINE;
- break;
-
- case GL_LINE_STIPPLE:
- FALLBACK(fxMesa, TDFX_FALLBACK_LINE_STIPPLE, state);
- break;
-
- case GL_POLYGON_STIPPLE:
- FLUSH_BATCH(fxMesa);
- fxMesa->new_state |= TDFX_NEW_STIPPLE;
- break;
-
- case GL_SCISSOR_TEST:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_CLIP;
- break;
-
- case GL_STENCIL_TEST:
- FLUSH_BATCH( fxMesa );
- FALLBACK( fxMesa, TDFX_FALLBACK_STENCIL, state && !fxMesa->haveHwStencil);
- fxMesa->new_state |= TDFX_NEW_STENCIL;
- break;
-
- case GL_TEXTURE_3D:
- FLUSH_BATCH( fxMesa );
- FALLBACK( fxMesa, TDFX_FALLBACK_TEXTURE_MAP, state); /* wrong */
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- case GL_TEXTURE_1D:
- case GL_TEXTURE_2D:
- FLUSH_BATCH( fxMesa );
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- default:
- return;
- }
-}
-
-
-
-/* Set the buffer used for drawing */
-/* XXX support for separate read/draw buffers hasn't been tested */
-static void tdfxDDDrawBuffer( struct gl_context *ctx, GLenum mode )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- FLUSH_BATCH( fxMesa );
-
- if (ctx->DrawBuffer->_NumColorDrawBuffers > 1) {
- FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE );
- return;
- }
-
- switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) {
- case BUFFER_FRONT_LEFT:
- fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER;
- fxMesa->new_state |= TDFX_NEW_RENDER;
- FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
- break;
- case BUFFER_BACK_LEFT:
- fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER;
- fxMesa->new_state |= TDFX_NEW_RENDER;
- FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
- break;
- case -1:
- FX_grColorMaskv( ctx, false4 );
- FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
- break;
- default:
- FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE );
- break;
- }
-}
-
-
-static void tdfxDDReadBuffer( struct gl_context *ctx, GLenum mode )
-{
- /* XXX ??? */
-}
-
-
-/* =============================================================
- * Polygon stipple
- */
-
-static void tdfxDDPolygonStipple( struct gl_context *ctx, const GLubyte *mask )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- const GLubyte *m = mask;
- GLubyte q[4];
- int i,j,k;
- GLboolean allBitsSet;
-
-/* int active = (ctx->Polygon.StippleFlag && */
-/* fxMesa->reduced_prim == GL_TRIANGLES); */
-
- FLUSH_BATCH(fxMesa);
- fxMesa->Stipple.Pattern = 0xffffffff;
- fxMesa->dirty |= TDFX_UPLOAD_STIPPLE;
- fxMesa->new_state |= TDFX_NEW_STIPPLE;
-
- /* Check if the stipple pattern is fully opaque. If so, use software
- * rendering. This basically a trick to make sure the OpenGL conformance
- * test passes.
- */
- allBitsSet = GL_TRUE;
- for (i = 0; i < 32; i++) {
- if (((GLuint *) mask)[i] != 0xffffffff) {
- allBitsSet = GL_FALSE;
- break;
- }
- }
- if (allBitsSet) {
- fxMesa->haveHwStipple = GL_FALSE;
- return;
- }
-
- q[0] = mask[0];
- q[1] = mask[4];
- q[2] = mask[8];
- q[3] = mask[12];
-
- for (k = 0 ; k < 8 ; k++)
- for (j = 0 ; j < 4; j++)
- for (i = 0 ; i < 4 ; i++,m++) {
- if (*m != q[j]) {
- fxMesa->haveHwStipple = GL_FALSE;
- return;
- }
- }
-
- fxMesa->haveHwStipple = GL_TRUE;
- fxMesa->Stipple.Pattern = ( (q[0] << 0) |
- (q[1] << 8) |
- (q[2] << 16) |
- (q[3] << 24) );
-}
-
-
-
-static void tdfxDDRenderMode( struct gl_context *ctx, GLenum mode )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FALLBACK( fxMesa, TDFX_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
-}
-
-
-
-static void tdfxDDPrintState( const char *msg, GLuint flags )
-{
- fprintf( stderr,
- "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s\n",
- msg,
- flags,
- (flags & TDFX_NEW_COLOR) ? "color, " : "",
- (flags & TDFX_NEW_ALPHA) ? "alpha, " : "",
- (flags & TDFX_NEW_DEPTH) ? "depth, " : "",
- (flags & TDFX_NEW_RENDER) ? "render, " : "",
- (flags & TDFX_NEW_FOG) ? "fog, " : "",
- (flags & TDFX_NEW_STENCIL) ? "stencil, " : "",
- (flags & TDFX_NEW_STIPPLE) ? "stipple, " : "",
- (flags & TDFX_NEW_CLIP) ? "clip, " : "",
- (flags & TDFX_NEW_VIEWPORT) ? "viewport, " : "",
- (flags & TDFX_NEW_CULL) ? "cull, " : "",
- (flags & TDFX_NEW_GLIDE) ? "glide, " : "",
- (flags & TDFX_NEW_TEXTURE) ? "texture, " : "",
- (flags & TDFX_NEW_CONTEXT) ? "context, " : "");
-}
-
-
-
-void tdfxDDUpdateHwState( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- int new_state = fxMesa->new_state;
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s()\n", __FUNCTION__ );
- }
-
- if ( new_state )
- {
- FLUSH_BATCH( fxMesa );
-
- fxMesa->new_state = 0;
-
- if ( 0 )
- tdfxDDPrintState( "tdfxUpdateHwState", new_state );
-
- /* Update the various parts of the context's state.
- */
- if ( new_state & TDFX_NEW_ALPHA ) {
- tdfxUpdateAlphaMode( ctx );
- }
-
- if ( new_state & TDFX_NEW_DEPTH )
- tdfxUpdateZMode( ctx );
-
- if ( new_state & TDFX_NEW_FOG )
- tdfxUpdateFogAttrib( ctx );
-
- if ( new_state & TDFX_NEW_CLIP )
- tdfxUpdateClipping( ctx );
-
- if ( new_state & TDFX_NEW_STIPPLE )
- tdfxUpdateStipple( ctx );
-
- if ( new_state & TDFX_NEW_CULL )
- tdfxUpdateCull( ctx );
-
- if ( new_state & TDFX_NEW_LINE )
- tdfxUpdateLine( ctx );
-
- if ( new_state & TDFX_NEW_VIEWPORT )
- tdfxUpdateViewport( ctx );
-
- if ( new_state & TDFX_NEW_RENDER )
- tdfxUpdateRenderAttrib( ctx );
-
- if ( new_state & TDFX_NEW_STENCIL )
- tdfxUpdateStencil( ctx );
-
- if ( new_state & TDFX_NEW_TEXTURE ) {
- tdfxUpdateTextureState( ctx );
- }
- else if ( new_state & TDFX_NEW_TEXTURE_BIND ) {
- tdfxUpdateTextureBinding( ctx );
- }
- }
-
- if ( 0 ) {
- FxI32 bias = (FxI32) (ctx->Polygon.OffsetUnits * TDFX_DEPTH_BIAS_SCALE);
-
- if ( fxMesa->Depth.Bias != bias ) {
- fxMesa->Depth.Bias = bias;
- fxMesa->dirty |= TDFX_UPLOAD_DEPTH_BIAS;
- }
- }
-
- if ( fxMesa->dirty ) {
- LOCK_HARDWARE( fxMesa );
- tdfxEmitHwStateLocked( fxMesa );
- UNLOCK_HARDWARE( fxMesa );
- }
-}
-
-
-static void tdfxDDInvalidateState( struct gl_context *ctx, GLuint new_state )
-{
- _swrast_InvalidateState( ctx, new_state );
- _swsetup_InvalidateState( ctx, new_state );
- _vbo_InvalidateState( ctx, new_state );
- _tnl_InvalidateState( ctx, new_state );
- TDFX_CONTEXT(ctx)->new_gl_state |= new_state;
-}
-
-
-
-/* Initialize the context's Glide state mirror. These values will be
- * used as Glide function call parameters when the time comes.
- */
-void tdfxInitState( tdfxContextPtr fxMesa )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- GLint i;
-
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->ColorCombine.Local = GR_COMBINE_LOCAL_ITERATED;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->AlphaCombine.Local = GR_COMBINE_LOCAL_ITERATED;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
-
- fxMesa->ColorCombineExt.SourceA = GR_CMBX_ITRGB;
- fxMesa->ColorCombineExt.ModeA = GR_FUNC_MODE_X;
- fxMesa->ColorCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.ModeB = GR_FUNC_MODE_ZERO;
- fxMesa->ColorCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertC = FXTRUE;
- fxMesa->ColorCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertD = FXFALSE;
- fxMesa->ColorCombineExt.Shift = 0;
- fxMesa->ColorCombineExt.Invert = FXFALSE;
- fxMesa->AlphaCombineExt.SourceA = GR_CMBX_ITALPHA;
- fxMesa->AlphaCombineExt.ModeA = GR_FUNC_MODE_X;
- fxMesa->AlphaCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.ModeB = GR_FUNC_MODE_ZERO;
- fxMesa->AlphaCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertC = FXTRUE;
- fxMesa->AlphaCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertD = FXFALSE;
- fxMesa->AlphaCombineExt.Shift = 0;
- fxMesa->AlphaCombineExt.Invert = FXFALSE;
-
- fxMesa->sScale0 = fxMesa->tScale0 = 1.0;
- fxMesa->sScale1 = fxMesa->tScale1 = 1.0;
-
- fxMesa->TexPalette.Type = 0;
- fxMesa->TexPalette.Data = NULL;
-
- for ( i = 0 ; i < TDFX_NUM_TMU ; i++ ) {
- fxMesa->TexSource[i].StartAddress = 0;
- fxMesa->TexSource[i].EvenOdd = GR_MIPMAPLEVELMASK_EVEN;
- fxMesa->TexSource[i].Info = NULL;
-
- fxMesa->TexCombine[i].FunctionRGB = 0;
- fxMesa->TexCombine[i].FactorRGB = 0;
- fxMesa->TexCombine[i].FunctionAlpha = 0;
- fxMesa->TexCombine[i].FactorAlpha = 0;
- fxMesa->TexCombine[i].InvertRGB = FXFALSE;
- fxMesa->TexCombine[i].InvertAlpha = FXFALSE;
-
- fxMesa->TexCombineExt[i].Alpha.SourceA = 0;
- /* XXX more state to init here */
- fxMesa->TexCombineExt[i].Color.SourceA = 0;
- fxMesa->TexCombineExt[i].EnvColor = 0x0;
-
- fxMesa->TexParams[i].sClamp = GR_TEXTURECLAMP_WRAP;
- fxMesa->TexParams[i].tClamp = GR_TEXTURECLAMP_WRAP;
- fxMesa->TexParams[i].minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- fxMesa->TexParams[i].magFilt = GR_TEXTUREFILTER_BILINEAR;
- fxMesa->TexParams[i].mmMode = GR_MIPMAP_DISABLE;
- fxMesa->TexParams[i].LODblend = FXFALSE;
- fxMesa->TexParams[i].LodBias = 0.0;
-
- fxMesa->TexState.EnvMode[i] = ~0;
- fxMesa->TexState.TexFormat[i] = ~0;
- fxMesa->TexState.Enabled[i] = 0;
- }
-
- if ( ctx->Visual.doubleBufferMode) {
- fxMesa->DrawBuffer = GR_BUFFER_BACKBUFFER;
- fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER;
- } else {
- fxMesa->DrawBuffer = GR_BUFFER_FRONTBUFFER;
- fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER;
- }
-
- fxMesa->Color.ClearColor = 0x00000000;
- fxMesa->Color.ClearAlpha = 0x00;
- fxMesa->Color.ColorMask[RCOMP] = FXTRUE;
- fxMesa->Color.ColorMask[BCOMP] = FXTRUE;
- fxMesa->Color.ColorMask[GCOMP] = FXTRUE;
- fxMesa->Color.ColorMask[ACOMP] = FXTRUE;
- fxMesa->Color.MonoColor = 0xffffffff;
-
- fxMesa->Color.AlphaFunc = GR_CMP_ALWAYS;
- fxMesa->Color.AlphaRef = 0x00;
- fxMesa->Color.BlendSrcRGB = GR_BLEND_ONE;
- fxMesa->Color.BlendDstRGB = GR_BLEND_ZERO;
- fxMesa->Color.BlendSrcA = GR_BLEND_ONE;
- fxMesa->Color.BlendSrcA = GR_BLEND_ZERO;
-
- fxMesa->Color.Dither = GR_DITHER_2x2;
-
- if ( fxMesa->glCtx->Visual.depthBits > 0 ) {
- fxMesa->Depth.Mode = GR_DEPTHBUFFER_ZBUFFER;
- } else {
- fxMesa->Depth.Mode = GR_DEPTHBUFFER_DISABLE;
- }
- fxMesa->Depth.Bias = 0;
- fxMesa->Depth.Func = GR_CMP_LESS;
- fxMesa->Depth.Clear = 0; /* computed later */
- fxMesa->Depth.Mask = FXTRUE;
-
-
- fxMesa->Fog.Mode = GR_FOG_DISABLE;
- fxMesa->Fog.Color = 0x00000000;
- fxMesa->Fog.Table = NULL;
- fxMesa->Fog.Density = 1.0;
- fxMesa->Fog.Near = 1.0;
- fxMesa->Fog.Far = 1.0;
-
- fxMesa->Stencil.Function = GR_CMP_ALWAYS;
- fxMesa->Stencil.RefValue = 0;
- fxMesa->Stencil.ValueMask = 0xff;
- fxMesa->Stencil.WriteMask = 0xff;
- fxMesa->Stencil.FailFunc = 0;
- fxMesa->Stencil.ZFailFunc = 0;
- fxMesa->Stencil.ZPassFunc = 0;
- fxMesa->Stencil.Clear = 0;
-
- fxMesa->Stipple.Mode = GR_STIPPLE_DISABLE;
- fxMesa->Stipple.Pattern = 0xffffffff;
-
- fxMesa->Scissor.minX = 0;
- fxMesa->Scissor.minY = 0;
- fxMesa->Scissor.maxX = 0;
- fxMesa->Scissor.maxY = 0;
-
- fxMesa->Viewport.Mode = GR_WINDOW_COORDS;
- fxMesa->Viewport.X = 0;
- fxMesa->Viewport.Y = 0;
- fxMesa->Viewport.Width = 0;
- fxMesa->Viewport.Height = 0;
- fxMesa->Viewport.Near = 0.0;
- fxMesa->Viewport.Far = 0.0;
-
- fxMesa->CullMode = GR_CULL_DISABLE;
-
- fxMesa->Glide.ColorFormat = GR_COLORFORMAT_ABGR;
- fxMesa->Glide.Origin = GR_ORIGIN_LOWER_LEFT;
- fxMesa->Glide.Initialized = FXFALSE;
-}
-
-
-
-void tdfxDDInitStateFuncs( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- ctx->Driver.UpdateState = tdfxDDInvalidateState;
-
- ctx->Driver.ClearColor = tdfxDDClearColor;
- ctx->Driver.DrawBuffer = tdfxDDDrawBuffer;
- ctx->Driver.ReadBuffer = tdfxDDReadBuffer;
-
- ctx->Driver.AlphaFunc = tdfxDDAlphaFunc;
- ctx->Driver.BlendEquationSeparate = tdfxDDBlendEquationSeparate;
- ctx->Driver.BlendFuncSeparate = tdfxDDBlendFuncSeparate;
- ctx->Driver.ClearDepth = tdfxDDClearDepth;
- ctx->Driver.ColorMask = tdfxDDColorMask;
- ctx->Driver.CullFace = tdfxDDCullFace;
- ctx->Driver.FrontFace = tdfxDDFrontFace;
- ctx->Driver.DepthFunc = tdfxDDDepthFunc;
- ctx->Driver.DepthMask = tdfxDDDepthMask;
- ctx->Driver.DepthRange = tdfxDDDepthRange;
- ctx->Driver.Enable = tdfxDDEnable;
- ctx->Driver.Fogfv = tdfxDDFogfv;
- ctx->Driver.LightModelfv = tdfxDDLightModelfv;
- ctx->Driver.LineWidth = tdfxDDLineWidth;
- ctx->Driver.PolygonStipple = tdfxDDPolygonStipple;
- ctx->Driver.RenderMode = tdfxDDRenderMode;
- ctx->Driver.Scissor = tdfxDDScissor;
- ctx->Driver.ShadeModel = tdfxDDShadeModel;
-
- if ( fxMesa->haveHwStencil ) {
- ctx->Driver.StencilFuncSeparate = tdfxDDStencilFuncSeparate;
- ctx->Driver.StencilMaskSeparate = tdfxDDStencilMaskSeparate;
- ctx->Driver.StencilOpSeparate = tdfxDDStencilOpSeparate;
- }
-
- ctx->Driver.Viewport = tdfxDDViewport;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_state.h b/src/mesa/drivers/dri/tdfx/tdfx_state.h
deleted file mode 100644
index 2e96fcbeb5d..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_state.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#ifndef __TDFX_STATE_H__
-#define __TDFX_STATE_H__
-
-#include "main/context.h"
-#include "tdfx_context.h"
-
-extern void tdfxDDInitStateFuncs( struct gl_context *ctx );
-
-extern void tdfxDDUpdateHwState( struct gl_context *ctx );
-
-extern void tdfxInitState( tdfxContextPtr fxMesa );
-
-extern void tdfxUpdateClipping( struct gl_context *ctx );
-
-
-extern void tdfxFallback( struct gl_context *ctx, GLuint bit, GLboolean mode );
-#define FALLBACK( rmesa, bit, mode ) tdfxFallback( rmesa->glCtx, bit, mode )
-
-extern void tdfxUpdateCull( struct gl_context *ctx );
-extern void tdfxUpdateStipple( struct gl_context *ctx );
-extern void tdfxUpdateViewport( struct gl_context *ctx );
-
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tex.c b/src/mesa/drivers/dri/tdfx/tdfx_tex.c
deleted file mode 100644
index d74ddb24005..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_tex.c
+++ /dev/null
@@ -1,1868 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * 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>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-
-#include "main/enums.h"
-#include "main/image.h"
-#include "main/mipmap.h"
-#include "main/texcompress.h"
-#include "main/teximage.h"
-#include "main/texstore.h"
-#include "main/texobj.h"
-#include "tdfx_context.h"
-#include "tdfx_tex.h"
-#include "tdfx_texman.h"
-
-
-/* no borders! can't halve 1x1! (stride > width * comp) not allowed */
-static void
-_mesa_halve2x2_teximage2d ( struct gl_context *ctx,
- struct gl_texture_image *texImage,
- GLuint bytesPerPixel,
- GLint srcWidth, GLint srcHeight,
- const GLvoid *srcImage, GLvoid *dstImage )
-{
- GLint i, j, k;
- GLint dstWidth = srcWidth / 2;
- GLint dstHeight = srcHeight / 2;
- GLint srcRowStride = srcWidth * bytesPerPixel;
- GLubyte *src = (GLubyte *)srcImage;
- GLubyte *dst = dstImage;
- GLuint dstImageOffsets = 0;
-
- GLuint bpt = 0;
- GLubyte *_s = NULL;
- GLubyte *_d = NULL;
- GLenum _t = 0;
-
- if (texImage->TexFormat == MESA_FORMAT_RGB565) {
- _t = GL_UNSIGNED_SHORT_5_6_5_REV;
- bpt = bytesPerPixel;
- } else if (texImage->TexFormat == MESA_FORMAT_ARGB4444) {
- _t = GL_UNSIGNED_SHORT_4_4_4_4_REV;
- bpt = bytesPerPixel;
- } else if (texImage->TexFormat == MESA_FORMAT_ARGB1555) {
- _t = GL_UNSIGNED_SHORT_1_5_5_5_REV;
- bpt = bytesPerPixel;
- }
- if (bpt) {
- bytesPerPixel = 4;
- srcRowStride = srcWidth * bytesPerPixel;
- if (dstWidth == 0) {
- dstWidth = 1;
- }
- if (dstHeight == 0) {
- dstHeight = 1;
- }
- _s = src = MALLOC(srcRowStride * srcHeight);
- _d = dst = MALLOC(dstWidth * bytesPerPixel * dstHeight);
- _mesa_texstore(ctx, 2, GL_RGBA,
- MESA_FORMAT_RGBA8888_REV, src,
- 0, 0, 0, /* dstX/Y/Zoffset */
- srcRowStride, /* dstRowStride */
- &dstImageOffsets,
- srcWidth, srcHeight, 1,
- texImage->_BaseFormat, _t, srcImage, &ctx->DefaultPacking);
- }
-
- if (srcHeight == 1) {
- for (i = 0; i < dstWidth; i++) {
- for (k = 0; k < bytesPerPixel; k++) {
- dst[0] = (src[0] + src[bytesPerPixel] + 1) / 2;
- src++;
- dst++;
- }
- src += bytesPerPixel;
- }
- } else if (srcWidth == 1) {
- for (j = 0; j < dstHeight; j++) {
- for (k = 0; k < bytesPerPixel; k++) {
- dst[0] = (src[0] + src[srcRowStride] + 1) / 2;
- src++;
- dst++;
- }
- src += srcRowStride;
- }
- } else {
- for (j = 0; j < dstHeight; j++) {
- for (i = 0; i < dstWidth; i++) {
- for (k = 0; k < bytesPerPixel; k++) {
- dst[0] = (src[0] +
- src[bytesPerPixel] +
- src[srcRowStride] +
- src[srcRowStride + bytesPerPixel] + 2) / 4;
- src++;
- dst++;
- }
- src += bytesPerPixel;
- }
- src += srcRowStride;
- }
- }
-
- if (bpt) {
- src = _s;
- dst = _d;
- _mesa_texstore(ctx, 2, texImage->_BaseFormat,
- texImage->TexFormat, dstImage,
- 0, 0, 0, /* dstX/Y/Zoffset */
- dstWidth * bpt,
- &dstImageOffsets,
- dstWidth, dstHeight, 1,
- GL_BGRA, CHAN_TYPE, dst, &ctx->DefaultPacking);
- FREE(dst);
- FREE(src);
- }
-}
-
-
-static int
-logbase2(int n)
-{
- GLint i = 1;
- GLint log2 = 0;
-
- if (n < 0) {
- return -1;
- }
-
- while (n > i) {
- i *= 2;
- log2++;
- }
- if (i != n) {
- return -1;
- }
- else {
- return log2;
- }
-}
-
-
-static void
-tdfxGenerateMipmap(struct gl_context *ctx, GLenum target,
- struct gl_texture_object *texObj)
-{
- GLint mipWidth, mipHeight;
- tdfxMipMapLevel *mip;
- struct gl_texture_image *mipImage; /* the new/next image */
- struct gl_texture_image *texImage;
- const GLint maxLevels = _mesa_max_texture_levels(ctx, texObj->Target);
- GLint level = texObj->BaseLevel;
- GLsizei width, height, texelBytes;
- const tdfxMipMapLevel *mml;
-
- texImage = _mesa_get_tex_image(ctx, texObj, target, level);
- texelBytes = _mesa_get_format_bytes(texImage->TexFormat);
-
- mml = TDFX_TEXIMAGE_DATA(texImage);
-
- width = texImage->Width;
- height = texImage->Height;
- while (level < texObj->MaxLevel && level < maxLevels - 1) {
- mipWidth = width / 2;
- if (!mipWidth) {
- mipWidth = 1;
- }
- mipHeight = height / 2;
- if (!mipHeight) {
- mipHeight = 1;
- }
- if ((mipWidth == width) && (mipHeight == height)) {
- break;
- }
- ++level;
- mipImage = _mesa_select_tex_image(ctx, texObj, target, level);
- mip = TDFX_TEXIMAGE_DATA(mipImage);
- _mesa_halve2x2_teximage2d(ctx,
- texImage,
- texelBytes,
- mml->width, mml->height,
- texImage->Data, mipImage->Data);
- texImage = mipImage;
- mml = mip;
- width = mipWidth;
- height = mipHeight;
- }
-}
-
-
-/*
- * Compute various texture image parameters.
- * Input: w, h - source texture width and height
- * Output: lodlevel - Glide lod level token for the larger texture dimension
- * aspectratio - Glide aspect ratio token
- * sscale - S scale factor used during triangle setup
- * tscale - T scale factor used during triangle setup
- * wscale - OpenGL -> Glide image width scale factor
- * hscale - OpenGL -> Glide image height scale factor
- *
- * Sample results:
- * w h lodlevel aspectRatio
- * 128 128 GR_LOD_LOG2_128 (=7) GR_ASPECT_LOG2_1x1 (=0)
- * 64 64 GR_LOD_LOG2_64 (=6) GR_ASPECT_LOG2_1x1 (=0)
- * 64 32 GR_LOD_LOG2_64 (=6) GR_ASPECT_LOG2_2x1 (=1)
- * 32 64 GR_LOD_LOG2_64 (=6) GR_ASPECT_LOG2_1x2 (=-1)
- * 32 32 GR_LOD_LOG2_32 (=5) GR_ASPECT_LOG2_1x1 (=0)
- */
-static void
-tdfxTexGetInfo(const struct gl_context *ctx, int w, int h,
- GrLOD_t *lodlevel, GrAspectRatio_t *aspectratio,
- float *sscale, float *tscale,
- int *wscale, int *hscale)
-{
- int logw, logh, ar, lod, ws, hs;
- float s, t;
-
- ASSERT(w >= 1);
- ASSERT(h >= 1);
-
- logw = logbase2(w);
- logh = logbase2(h);
- ar = logw - logh; /* aspect ratio = difference in log dimensions */
- s = t = 256.0;
- ws = hs = 1;
-
- /* Hardware only allows a maximum aspect ratio of 8x1, so handle
- |ar| > 3 by scaling the image and using an 8x1 aspect ratio */
- if (ar >= 0) {
- ASSERT(w >= h);
- lod = logw;
- if (ar <= GR_ASPECT_LOG2_8x1) {
- t = 256 >> ar;
- }
- else {
- /* have to stretch image height */
- t = 32.0;
- hs = 1 << (ar - 3);
- ar = GR_ASPECT_LOG2_8x1;
- }
- }
- else {
- ASSERT(w < h);
- lod = logh;
- if (ar >= GR_ASPECT_LOG2_1x8) {
- s = 256 >> -ar;
- }
- else {
- /* have to stretch image width */
- s = 32.0;
- ws = 1 << (-ar - 3);
- ar = GR_ASPECT_LOG2_1x8;
- }
- }
-
- if (lodlevel)
- *lodlevel = (GrLOD_t) lod;
- if (aspectratio)
- *aspectratio = (GrAspectRatio_t) ar;
- if (sscale)
- *sscale = s;
- if (tscale)
- *tscale = t;
- if (wscale)
- *wscale = ws;
- if (hscale)
- *hscale = hs;
-}
-
-
-/*
- * We need to call this when a texture object's minification filter
- * or texture image sizes change.
- */
-static void RevalidateTexture(struct gl_context *ctx, struct gl_texture_object *tObj)
-{
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- GLint minl, maxl;
-
- if (!ti)
- return;
-
- minl = maxl = tObj->BaseLevel;
-
- if (tObj->Image[0][minl]) {
- maxl = MIN2(tObj->MaxLevel, tObj->Image[0][minl]->MaxLog2);
-
- /* compute largeLodLog2, aspect ratio and texcoord scale factors */
- tdfxTexGetInfo(ctx, tObj->Image[0][minl]->Width, tObj->Image[0][minl]->Height,
- &ti->info.largeLodLog2,
- &ti->info.aspectRatioLog2,
- &(ti->sScale), &(ti->tScale), NULL, NULL);
- }
-
- if (tObj->Image[0][maxl] && (tObj->Sampler.MinFilter != GL_NEAREST) && (tObj->Sampler.MinFilter != GL_LINEAR)) {
- /* mipmapping: need to compute smallLodLog2 */
- tdfxTexGetInfo(ctx, tObj->Image[0][maxl]->Width,
- tObj->Image[0][maxl]->Height,
- &ti->info.smallLodLog2, NULL,
- NULL, NULL, NULL, NULL);
- }
- else {
- /* not mipmapping: smallLodLog2 = largeLodLog2 */
- ti->info.smallLodLog2 = ti->info.largeLodLog2;
- maxl = minl;
- }
-
- ti->minLevel = minl;
- ti->maxLevel = maxl;
- ti->info.data = NULL;
-
- /* this is necessary because of fxDDCompressedTexImage2D */
- if (ti->padded) {
- struct gl_texture_image *texImage = tObj->Image[0][minl];
- tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- if (mml->wScale != 1 || mml->hScale != 1) {
- ti->sScale /= mml->wScale;
- ti->tScale /= mml->hScale;
- }
- }
-}
-
-
-static tdfxTexInfo *
-fxAllocTexObjData(tdfxContextPtr fxMesa)
-{
- tdfxTexInfo *ti;
-
- if (!(ti = CALLOC(sizeof(tdfxTexInfo)))) {
- _mesa_problem(NULL, "tdfx driver: out of memory");
- return NULL;
- }
-
- ti->isInTM = GL_FALSE;
-
- ti->whichTMU = TDFX_TMU_NONE;
-
- ti->tm[TDFX_TMU0] = NULL;
- ti->tm[TDFX_TMU1] = NULL;
-
- ti->minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- ti->magFilt = GR_TEXTUREFILTER_BILINEAR;
-
- ti->sClamp = GR_TEXTURECLAMP_WRAP;
- ti->tClamp = GR_TEXTURECLAMP_WRAP;
-
- ti->mmMode = GR_MIPMAP_NEAREST;
- ti->LODblend = FXFALSE;
-
- return ti;
-}
-
-
-/*
- * Called via glBindTexture.
- */
-static void
-tdfxBindTexture(struct gl_context * ctx, GLenum target,
- struct gl_texture_object *tObj)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "fxmesa: fxDDTexBind(%d,%p)\n", tObj->Name,
- tObj->DriverData);
- }
-
- if ((target != GL_TEXTURE_1D) && (target != GL_TEXTURE_2D))
- return;
-
- if (!tObj->DriverData) {
- tObj->DriverData = fxAllocTexObjData(fxMesa);
- }
-
- ti = TDFX_TEXTURE_DATA(tObj);
- ti->lastTimeUsed = fxMesa->texBindNumber++;
-
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-/*
- * Called via glTexEnv.
- */
-static void
-tdfxTexEnv(struct gl_context * ctx, GLenum target, GLenum pname,
- const GLfloat * param)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
- if (param)
- fprintf(stderr, "fxmesa: texenv(%x,%x)\n", pname,
- (GLint) (*param));
- else
- fprintf(stderr, "fxmesa: texenv(%x)\n", pname);
- }
-
- /* XXX this is a bit of a hack to force the Glide texture
- * state to be updated.
- */
- fxMesa->TexState.EnvMode[ctx->Texture.CurrentUnit] = 0;
-
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-/*
- * Called via glTexParameter.
- */
-static void
-tdfxTexParameter(struct gl_context * ctx, GLenum target,
- struct gl_texture_object *tObj,
- GLenum pname, const GLfloat * params)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLenum param = (GLenum) (GLint) params[0];
- tdfxTexInfo *ti;
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "fxmesa: fxDDTexParam(%d,%p,%x,%x)\n", tObj->Name,
- tObj->DriverData, pname, param);
- }
-
- if ((target != GL_TEXTURE_1D) && (target != GL_TEXTURE_2D))
- return;
-
- if (!tObj->DriverData)
- tObj->DriverData = fxAllocTexObjData(fxMesa);
-
- ti = TDFX_TEXTURE_DATA(tObj);
-
- switch (pname) {
- case GL_TEXTURE_MIN_FILTER:
- switch (param) {
- case GL_NEAREST:
- ti->mmMode = GR_MIPMAP_DISABLE;
- ti->minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- ti->LODblend = FXFALSE;
- break;
- case GL_LINEAR:
- ti->mmMode = GR_MIPMAP_DISABLE;
- ti->minFilt = GR_TEXTUREFILTER_BILINEAR;
- ti->LODblend = FXFALSE;
- break;
- case GL_NEAREST_MIPMAP_LINEAR:
- if (!fxMesa->Glide.HaveCombineExt) {
- if (fxMesa->haveTwoTMUs) {
- ti->mmMode = GR_MIPMAP_NEAREST;
- ti->LODblend = FXTRUE;
- }
- else {
- ti->mmMode = GR_MIPMAP_NEAREST_DITHER;
- ti->LODblend = FXFALSE;
- }
- ti->minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- break;
- }
- /* XXX Voodoo3/Banshee mipmap blending seems to produce
- * incorrectly filtered colors for the smallest mipmap levels.
- * To work-around we fall-through here and use a different filter.
- */
- case GL_NEAREST_MIPMAP_NEAREST:
- ti->mmMode = GR_MIPMAP_NEAREST;
- ti->minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- ti->LODblend = FXFALSE;
- break;
- case GL_LINEAR_MIPMAP_LINEAR:
- if (!fxMesa->Glide.HaveCombineExt) {
- if (fxMesa->haveTwoTMUs) {
- ti->mmMode = GR_MIPMAP_NEAREST;
- ti->LODblend = FXTRUE;
- }
- else {
- ti->mmMode = GR_MIPMAP_NEAREST_DITHER;
- ti->LODblend = FXFALSE;
- }
- ti->minFilt = GR_TEXTUREFILTER_BILINEAR;
- break;
- }
- /* XXX Voodoo3/Banshee mipmap blending seems to produce
- * incorrectly filtered colors for the smallest mipmap levels.
- * To work-around we fall-through here and use a different filter.
- */
- case GL_LINEAR_MIPMAP_NEAREST:
- ti->mmMode = GR_MIPMAP_NEAREST;
- ti->minFilt = GR_TEXTUREFILTER_BILINEAR;
- ti->LODblend = FXFALSE;
- break;
- default:
- break;
- }
- ti->reloadImages = GL_TRUE;
- RevalidateTexture(ctx, tObj);
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- case GL_TEXTURE_MAG_FILTER:
- switch (param) {
- case GL_NEAREST:
- ti->magFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
- break;
- case GL_LINEAR:
- ti->magFilt = GR_TEXTUREFILTER_BILINEAR;
- break;
- default:
- break;
- }
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- case GL_TEXTURE_WRAP_S:
- switch (param) {
- case GL_CLAMP_TO_BORDER:
- case GL_CLAMP_TO_EDGE:
- case GL_CLAMP:
- ti->sClamp = GR_TEXTURECLAMP_CLAMP;
- break;
- case GL_REPEAT:
- ti->sClamp = GR_TEXTURECLAMP_WRAP;
- break;
- case GL_MIRRORED_REPEAT:
- ti->sClamp = GR_TEXTURECLAMP_MIRROR_EXT;
- break;
- default:
- break;
- }
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- case GL_TEXTURE_WRAP_T:
- switch (param) {
- case GL_CLAMP_TO_BORDER:
- case GL_CLAMP_TO_EDGE:
- case GL_CLAMP:
- ti->tClamp = GR_TEXTURECLAMP_CLAMP;
- break;
- case GL_REPEAT:
- ti->tClamp = GR_TEXTURECLAMP_WRAP;
- break;
- case GL_MIRRORED_REPEAT:
- ti->tClamp = GR_TEXTURECLAMP_MIRROR_EXT;
- break;
- default:
- break;
- }
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- break;
-
- case GL_TEXTURE_BORDER_COLOR:
- /* TO DO */
- break;
- case GL_TEXTURE_MIN_LOD:
- /* TO DO */
- break;
- case GL_TEXTURE_MAX_LOD:
- /* TO DO */
- break;
- case GL_TEXTURE_BASE_LEVEL:
- RevalidateTexture(ctx, tObj);
- break;
- case GL_TEXTURE_MAX_LEVEL:
- RevalidateTexture(ctx, tObj);
- break;
-
- default:
- break;
- }
-}
-
-
-/*
- * Called via glDeleteTextures to delete a texture object.
- * Here, we delete the Glide data associated with the texture.
- */
-static void
-tdfxDeleteTexture(struct gl_context * ctx, struct gl_texture_object *tObj)
-{
- if (ctx && ctx->DriverCtx) {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTMFreeTexture(fxMesa, tObj);
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
- /* Free mipmap images and the texture object itself */
- _mesa_delete_texture_object(ctx, tObj);
- }
-}
-
-
-/*
- * Return true if texture is resident, false otherwise.
- */
-static GLboolean
-tdfxIsTextureResident(struct gl_context *ctx, struct gl_texture_object *tObj)
-{
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- return (GLboolean) (ti && ti->isInTM);
-}
-
-
-
-/*
- * Convert a gl_color_table texture palette to Glide's format.
- */
-static GrTexTable_t
-convertPalette(FxU32 data[256], const struct gl_color_table *table)
-{
- const GLubyte *tableUB = table->TableUB;
- GLint width = table->Size;
- FxU32 r, g, b, a;
- GLint i;
-
- switch (table->_BaseFormat) {
- case GL_INTENSITY:
- for (i = 0; i < width; i++) {
- r = tableUB[i];
- g = tableUB[i];
- b = tableUB[i];
- a = tableUB[i];
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE_6666_EXT;
- case GL_LUMINANCE:
- for (i = 0; i < width; i++) {
- r = tableUB[i];
- g = tableUB[i];
- b = tableUB[i];
- a = 255;
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE;
- case GL_ALPHA:
- for (i = 0; i < width; i++) {
- r = g = b = 255;
- a = tableUB[i];
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE_6666_EXT;
- case GL_LUMINANCE_ALPHA:
- for (i = 0; i < width; i++) {
- r = g = b = tableUB[i * 2 + 0];
- a = tableUB[i * 2 + 1];
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE_6666_EXT;
- case GL_RGB:
- for (i = 0; i < width; i++) {
- r = tableUB[i * 3 + 0];
- g = tableUB[i * 3 + 1];
- b = tableUB[i * 3 + 2];
- a = 255;
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE;
- case GL_RGBA:
- for (i = 0; i < width; i++) {
- r = tableUB[i * 4 + 0];
- g = tableUB[i * 4 + 1];
- b = tableUB[i * 4 + 2];
- a = tableUB[i * 4 + 3];
- data[i] = (a << 24) | (r << 16) | (g << 8) | b;
- }
- return GR_TEXTABLE_PALETTE_6666_EXT;
- default:
- /* XXX fixme: how can this happen? */
- _mesa_error(NULL, GL_INVALID_ENUM, "convertPalette: table->_BaseFormat == %s",
- _mesa_lookup_enum_by_nr(table->_BaseFormat));
- return GR_TEXTABLE_PALETTE;
- }
-}
-
-
-
-static void
-tdfxUpdateTexturePalette(struct gl_context * ctx, struct gl_texture_object *tObj)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if (tObj) {
- /* per-texture palette */
- tdfxTexInfo *ti;
-
- /* This might be a proxy texture. */
- if (!tObj->Palette.TableUB)
- return;
-
- if (!tObj->DriverData)
- tObj->DriverData = fxAllocTexObjData(fxMesa);
- ti = TDFX_TEXTURE_DATA(tObj);
- assert(ti);
- ti->paltype = convertPalette(ti->palette.data, &tObj->Palette);
- /*tdfxTexInvalidate(ctx, tObj);*/
- }
- else {
- /* global texture palette */
- fxMesa->TexPalette.Type = convertPalette(fxMesa->glbPalette.data, &ctx->Texture.Palette);
- fxMesa->TexPalette.Data = &(fxMesa->glbPalette.data);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
- fxMesa->new_state |= TDFX_NEW_TEXTURE; /* XXX too heavy-handed */
-}
-
-
-/**********************************************************************/
-/**** NEW TEXTURE IMAGE FUNCTIONS ****/
-/**********************************************************************/
-
-#if 000
-static FxBool TexusFatalError = FXFALSE;
-static FxBool TexusError = FXFALSE;
-
-#define TX_DITHER_NONE 0x00000000
-
-static void
-fxTexusError(const char *string, FxBool fatal)
-{
- _mesa_problem(NULL, string);
- /*
- * Just propagate the fatal value up.
- */
- TexusError = FXTRUE;
- TexusFatalError = fatal;
-}
-#endif
-
-
-static gl_format
-tdfxChooseTextureFormat( struct gl_context *ctx, GLint internalFormat,
- GLenum srcFormat, GLenum srcType )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- const GLboolean allow32bpt = TDFX_IS_NAPALM(fxMesa);
-
- switch (internalFormat) {
- case GL_ALPHA:
- case GL_ALPHA4:
- case GL_ALPHA8:
- case GL_ALPHA12:
- case GL_ALPHA16:
- case GL_COMPRESSED_ALPHA:
- return MESA_FORMAT_A8;
- case 1:
- case GL_LUMINANCE:
- case GL_LUMINANCE4:
- case GL_LUMINANCE8:
- case GL_LUMINANCE12:
- case GL_LUMINANCE16:
- case GL_COMPRESSED_LUMINANCE:
- return MESA_FORMAT_L8;
- case 2:
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE4_ALPHA4:
- case GL_LUMINANCE6_ALPHA2:
- case GL_LUMINANCE8_ALPHA8:
- case GL_LUMINANCE12_ALPHA4:
- case GL_LUMINANCE12_ALPHA12:
- case GL_LUMINANCE16_ALPHA16:
- case GL_COMPRESSED_LUMINANCE_ALPHA:
- return MESA_FORMAT_AL88;
- case GL_INTENSITY:
- case GL_INTENSITY4:
- case GL_INTENSITY8:
- case GL_INTENSITY12:
- case GL_INTENSITY16:
- case GL_COMPRESSED_INTENSITY:
- return MESA_FORMAT_I8;
- case GL_R3_G3_B2:
- case GL_RGB4:
- case GL_RGB5:
- return MESA_FORMAT_RGB565;
- case GL_COMPRESSED_RGB:
- /* intentional fall-through */
- case 3:
- case GL_RGB:
- if ( srcFormat == GL_RGB && srcType == GL_UNSIGNED_SHORT_5_6_5 ) {
- return MESA_FORMAT_RGB565;
- }
- /* intentional fall through */
- case GL_RGB8:
- case GL_RGB10:
- case GL_RGB12:
- case GL_RGB16:
- return (allow32bpt) ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_RGB565;
- case GL_RGBA2:
- case GL_RGBA4:
- return MESA_FORMAT_ARGB4444;
- case GL_COMPRESSED_RGBA:
- /* intentional fall-through */
- case 4:
- case GL_RGBA:
- if ( srcFormat == GL_BGRA ) {
- if ( srcType == GL_UNSIGNED_INT_8_8_8_8_REV ) {
- return MESA_FORMAT_ARGB8888;
- }
- else if ( srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ) {
- return MESA_FORMAT_ARGB4444;
- }
- else if ( srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ) {
- return MESA_FORMAT_ARGB1555;
- }
- }
- /* intentional fall through */
- case GL_RGBA8:
- case GL_RGB10_A2:
- case GL_RGBA12:
- case GL_RGBA16:
- return allow32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444;
- case GL_RGB5_A1:
- return MESA_FORMAT_ARGB1555;
- case GL_COLOR_INDEX:
- case GL_COLOR_INDEX1_EXT:
- case GL_COLOR_INDEX2_EXT:
- case GL_COLOR_INDEX4_EXT:
- case GL_COLOR_INDEX8_EXT:
- case GL_COLOR_INDEX12_EXT:
- case GL_COLOR_INDEX16_EXT:
- return MESA_FORMAT_CI8;
- /* GL_EXT_texture_compression_s3tc */
- /* GL_S3_s3tc */
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_RGB_S3TC:
- case GL_RGB4_S3TC:
- return MESA_FORMAT_RGB_DXT1;
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- return MESA_FORMAT_RGBA_DXT1;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
- case GL_RGBA_S3TC:
- case GL_RGBA4_S3TC:
- return MESA_FORMAT_RGBA_DXT3;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
- return MESA_FORMAT_RGBA_DXT5;
- /* GL_3DFX_texture_compression_FXT1 */
- case GL_COMPRESSED_RGB_FXT1_3DFX:
- return MESA_FORMAT_RGB_FXT1;
- case GL_COMPRESSED_RGBA_FXT1_3DFX:
- return MESA_FORMAT_RGBA_FXT1;
- default:
- _mesa_problem(ctx, "unexpected format in tdfxChooseTextureFormat");
- return MESA_FORMAT_NONE;
- }
-}
-
-
-/*
- * Return the Glide format for the given mesa texture format.
- */
-static GrTextureFormat_t
-fxGlideFormat(GLint mesaFormat)
-{
- switch (mesaFormat) {
- case MESA_FORMAT_I8:
- return GR_TEXFMT_ALPHA_8;
- case MESA_FORMAT_A8:
- return GR_TEXFMT_ALPHA_8;
- case MESA_FORMAT_L8:
- return GR_TEXFMT_INTENSITY_8;
- case MESA_FORMAT_CI8:
- return GR_TEXFMT_P_8;
- case MESA_FORMAT_AL88:
- return GR_TEXFMT_ALPHA_INTENSITY_88;
- case MESA_FORMAT_RGB565:
- return GR_TEXFMT_RGB_565;
- case MESA_FORMAT_ARGB4444:
- return GR_TEXFMT_ARGB_4444;
- case MESA_FORMAT_ARGB1555:
- return GR_TEXFMT_ARGB_1555;
- case MESA_FORMAT_ARGB8888:
- return GR_TEXFMT_ARGB_8888;
- case MESA_FORMAT_RGB_FXT1:
- case MESA_FORMAT_RGBA_FXT1:
- return GR_TEXFMT_ARGB_CMP_FXT1;
- case MESA_FORMAT_RGB_DXT1:
- case MESA_FORMAT_RGBA_DXT1:
- return GR_TEXFMT_ARGB_CMP_DXT1;
- case MESA_FORMAT_RGBA_DXT3:
- return GR_TEXFMT_ARGB_CMP_DXT3;
- case MESA_FORMAT_RGBA_DXT5:
- return GR_TEXFMT_ARGB_CMP_DXT5;
- default:
- _mesa_problem(NULL, "Unexpected format in fxGlideFormat");
- return 0;
- }
-}
-
-
-/* Texel-fetch functions for software texturing and glGetTexImage().
- * We should have been able to use some "standard" fetch functions (which
- * may get defined in texutil.c) but we have to account for scaled texture
- * images on tdfx hardware (the 8:1 aspect ratio limit).
- * Hence, we need special functions here.
- */
-extern void
-fxt1_decode_1 (const void *texture, int width,
- int i, int j, unsigned char *rgba);
-
-static void
-fetch_intensity8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLubyte *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLubyte *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = *texel;
- rgba[GCOMP] = *texel;
- rgba[BCOMP] = *texel;
- rgba[ACOMP] = *texel;
-}
-
-
-static void
-fetch_luminance8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLubyte *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLubyte *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = *texel;
- rgba[GCOMP] = *texel;
- rgba[BCOMP] = *texel;
- rgba[ACOMP] = 255;
-}
-
-
-static void
-fetch_alpha8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLubyte *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLubyte *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = 255;
- rgba[GCOMP] = 255;
- rgba[BCOMP] = 255;
- rgba[ACOMP] = *texel;
-}
-
-
-static void
-fetch_index8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * indexOut)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLubyte *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLubyte *) texImage->Data) + j * mml->width + i;
- *indexOut = *texel;
-}
-
-
-static void
-fetch_luminance8_alpha8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLubyte *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLubyte *) texImage->Data) + (j * mml->width + i) * 2;
- rgba[RCOMP] = texel[0];
- rgba[GCOMP] = texel[0];
- rgba[BCOMP] = texel[0];
- rgba[ACOMP] = texel[1];
-}
-
-
-static void
-fetch_r5g6b5(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLushort *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLushort *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = (((*texel) >> 11) & 0x1f) * 255 / 31;
- rgba[GCOMP] = (((*texel) >> 5) & 0x3f) * 255 / 63;
- rgba[BCOMP] = (((*texel) >> 0) & 0x1f) * 255 / 31;
- rgba[ACOMP] = 255;
-}
-
-
-static void
-fetch_r4g4b4a4(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLushort *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLushort *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = (((*texel) >> 12) & 0xf) * 255 / 15;
- rgba[GCOMP] = (((*texel) >> 8) & 0xf) * 255 / 15;
- rgba[BCOMP] = (((*texel) >> 4) & 0xf) * 255 / 15;
- rgba[ACOMP] = (((*texel) >> 0) & 0xf) * 255 / 15;
-}
-
-
-static void
-fetch_r5g5b5a1(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLushort *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLushort *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = (((*texel) >> 11) & 0x1f) * 255 / 31;
- rgba[GCOMP] = (((*texel) >> 6) & 0x1f) * 255 / 31;
- rgba[BCOMP] = (((*texel) >> 1) & 0x1f) * 255 / 31;
- rgba[ACOMP] = (((*texel) >> 0) & 0x01) * 255;
-}
-
-
-static void
-fetch_a8r8g8b8(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan * rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
- const GLuint *texel;
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- texel = ((GLuint *) texImage->Data) + j * mml->width + i;
- rgba[RCOMP] = (((*texel) >> 16) & 0xff);
- rgba[GCOMP] = (((*texel) >> 8) & 0xff);
- rgba[BCOMP] = (((*texel) ) & 0xff);
- rgba[ACOMP] = (((*texel) >> 24) & 0xff);
-}
-
-
-static void
-fetch_rgb_fxt1(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- fxt1_decode_1(texImage->Data, mml->width, i, j, rgba);
- rgba[ACOMP] = 255;
-}
-
-
-static void
-fetch_rgba_fxt1(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- fxt1_decode_1(texImage->Data, mml->width, i, j, rgba);
-}
-
-
-static void
-fetch_rgb_dxt1(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- /* XXX Get fetch func from _mesa_get_texel_fetch_func()
- _mesa_texformat_rgb_dxt1.FetchTexel2D(texImage, i, j, k, rgba);
- */
-}
-
-
-static void
-fetch_rgba_dxt1(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- /* XXX Get fetch func from _mesa_get_texel_fetch_func()
- _mesa_texformat_rgba_dxt1.FetchTexel2D(texImage, i, j, k, rgba);
- */
-}
-
-
-static void
-fetch_rgba_dxt3(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- /* XXX Get fetch func from _mesa_get_texel_fetch_func()
- _mesa_texformat_rgba_dxt3.FetchTexel2D(texImage, i, j, k, rgba);
- */
-}
-
-
-static void
-fetch_rgba_dxt5(const struct gl_texture_image *texImage,
- GLint i, GLint j, GLint k, GLchan *rgba)
-{
- const tdfxMipMapLevel *mml = TDFX_TEXIMAGE_DATA(texImage);
-
- i = i * mml->wScale;
- j = j * mml->hScale;
-
- /* XXX Get fetch func from _mesa_get_texel_fetch_func()
- _mesa_texformat_rgba_dxt5.FetchTexel2D(texImage, i, j, k, rgba);
- */
-}
-
-
-static FetchTexelFuncC
-fxFetchFunction(GLint mesaFormat)
-{
- switch (mesaFormat) {
- case MESA_FORMAT_I8:
- return &fetch_intensity8;
- case MESA_FORMAT_A8:
- return &fetch_alpha8;
- case MESA_FORMAT_L8:
- return &fetch_luminance8;
- case MESA_FORMAT_CI8:
- return &fetch_index8;
- case MESA_FORMAT_AL88:
- return &fetch_luminance8_alpha8;
- case MESA_FORMAT_RGB565:
- return &fetch_r5g6b5;
- case MESA_FORMAT_ARGB4444:
- return &fetch_r4g4b4a4;
- case MESA_FORMAT_ARGB1555:
- return &fetch_r5g5b5a1;
- case MESA_FORMAT_ARGB8888:
- return &fetch_a8r8g8b8;
- case MESA_FORMAT_RGB_FXT1:
- return &fetch_rgb_fxt1;
- case MESA_FORMAT_RGBA_FXT1:
- return &fetch_rgba_fxt1;
- case MESA_FORMAT_RGB_DXT1:
- return &fetch_rgb_dxt1;
- case MESA_FORMAT_RGBA_DXT1:
- return &fetch_rgba_dxt1;
- case MESA_FORMAT_RGBA_DXT3:
- return &fetch_rgba_dxt3;
- case MESA_FORMAT_RGBA_DXT5:
- return &fetch_rgba_dxt5;
- default:
- _mesa_problem(NULL, "Unexpected format in fxFetchFunction");
- return NULL;
- }
-}
-
-
-static GLboolean
-adjust2DRatio (struct gl_context *ctx,
- GLint xoffset, GLint yoffset,
- GLint width, GLint height,
- GLenum format, GLenum type, const GLvoid *pixels,
- const struct gl_pixelstore_attrib *packing,
- tdfxMipMapLevel *mml,
- struct gl_texture_image *texImage,
- GLint texelBytes,
- GLint dstRowStride)
-{
- const GLint newWidth = width * mml->wScale;
- const GLint newHeight = height * mml->hScale;
- GLvoid *tempImage;
- GLuint dstImageOffsets = 0;
-
- if (!_mesa_is_format_compressed(texImage->TexFormat)) {
- GLubyte *destAddr;
-
- tempImage = MALLOC(width * height * texelBytes);
- if (!tempImage) {
- return GL_FALSE;
- }
-
- _mesa_texstore(ctx, 2, texImage->_BaseFormat,
- texImage->TexFormat, tempImage,
- 0, 0, 0, /* dstX/Y/Zoffset */
- width * texelBytes, /* dstRowStride */
- &dstImageOffsets,
- width, height, 1,
- format, type, pixels, packing);
-
- /* now rescale */
- /* compute address of dest subimage within the overal tex image */
- destAddr = (GLubyte *) texImage->Data
- + (yoffset * mml->hScale * mml->width
- + xoffset * mml->wScale) * texelBytes;
-
- _mesa_rescale_teximage2d(texelBytes,
- width,
- dstRowStride, /* dst stride */
- width, height,
- newWidth, newHeight,
- tempImage, destAddr);
- } else {
- const GLint rawBytes = 4;
- GLvoid *rawImage = MALLOC(width * height * rawBytes);
-
- if (!rawImage) {
- return GL_FALSE;
- }
- tempImage = MALLOC(newWidth * newHeight * rawBytes);
- if (!tempImage) {
- FREE(rawImage);
- return GL_FALSE;
- }
- /* unpack image, apply transfer ops and store in rawImage */
- _mesa_texstore(ctx, 2, GL_RGBA,
- MESA_FORMAT_RGBA8888_REV, rawImage,
- 0, 0, 0, /* dstX/Y/Zoffset */
- width * rawBytes, /* dstRowStride */
- &dstImageOffsets,
- width, height, 1,
- format, type, pixels, packing);
- _mesa_rescale_teximage2d(rawBytes,
- width,
- newWidth * rawBytes, /* dst stride */
- width, height, /* src */
- newWidth, newHeight, /* dst */
- rawImage /*src*/, tempImage /*dst*/ );
- _mesa_texstore(ctx, 2, texImage->_BaseFormat,
- texImage->TexFormat, texImage->Data,
- xoffset * mml->wScale, yoffset * mml->hScale, 0, /* dstX/Y/Zoffset */
- dstRowStride,
- &dstImageOffsets,
- newWidth, newHeight, 1,
- GL_RGBA, CHAN_TYPE, tempImage, &ctx->DefaultPacking);
- FREE(rawImage);
- }
-
- FREE(tempImage);
-
- return GL_TRUE;
-}
-
-
-static void
-tdfxTexImage2D(struct gl_context *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)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
- tdfxMipMapLevel *mml;
- GLint texelBytes, dstRowStride;
- GLuint mesaFormat;
-
- /*
- printf("TexImage id=%d int 0x%x format 0x%x type 0x%x %dx%d\n",
- texObj->Name, texImage->InternalFormat, format, type,
- texImage->Width, texImage->Height);
- */
-
- ti = TDFX_TEXTURE_DATA(texObj);
- if (!ti) {
- texObj->DriverData = fxAllocTexObjData(fxMesa);
- if (!texObj->DriverData) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
- return;
- }
- ti = TDFX_TEXTURE_DATA(texObj);
- }
- assert(ti);
-
- mml = TDFX_TEXIMAGE_DATA(texImage);
- if (!mml) {
- texImage->DriverData = CALLOC(sizeof(tdfxMipMapLevel));
- if (!texImage->DriverData) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
- return;
- }
- mml = TDFX_TEXIMAGE_DATA(texImage);
- }
-
- /* Determine width and height scale factors for texture.
- * Remember, Glide is limited to 8:1 aspect ratios.
- */
- tdfxTexGetInfo(ctx,
- texImage->Width, texImage->Height,
- NULL, /* lod level */
- NULL, /* aspect ratio */
- NULL, NULL, /* sscale, tscale */
- &mml->wScale, &mml->hScale);
-
- /* rescaled size: */
- mml->width = width * mml->wScale;
- mml->height = height * mml->hScale;
-
-#if FX_COMPRESS_S3TC_AS_FXT1_HACK
- /* [koolsmoky] substitute FXT1 for DXTn and Legacy S3TC */
- /* [dBorca] we should update texture's attribute, then,
- * because if the application asks us to decompress, we
- * have to know the REAL format! Also, DXT3/5 might not
- * be correct, since it would mess with "compressedSize".
- * Ditto for GL_RGBA[4]_S3TC, which is always mapped to DXT3.
- */
- if (_mesa_is_format_compressed(texImage->TexFormat)) {
- switch (internalFormat) {
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_RGB_S3TC:
- case GL_RGB4_S3TC:
- internalFormat = GL_COMPRESSED_RGB_FXT1_3DFX;
- break;
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
- case GL_RGBA_S3TC:
- case GL_RGBA4_S3TC:
- internalFormat = GL_COMPRESSED_RGBA_FXT1_3DFX;
- }
- texImage->InternalFormat = internalFormat;
- }
-#endif
-#if FX_TC_NAPALM
- if (fxMesa->type >= GR_SSTTYPE_Voodoo4) {
- GLenum texNapalm = 0;
- if (internalFormat == GL_COMPRESSED_RGB) {
- texNapalm = GL_COMPRESSED_RGB_FXT1_3DFX;
- } else if (internalFormat == GL_COMPRESSED_RGBA) {
- texNapalm = GL_COMPRESSED_RGBA_FXT1_3DFX;
- }
- if (texNapalm) {
- texImage->InternalFormat = internalFormat = texNapalm;
- _mesa_is_format_compressed(texImage->TexFormat) = GL_TRUE;
- }
- }
-#endif
-
- mesaFormat = texImage->TexFormat;
- mml->glideFormat = fxGlideFormat(mesaFormat);
- ti->info.format = mml->glideFormat;
- texImage->FetchTexelc = fxFetchFunction(mesaFormat);
- texelBytes = _mesa_get_format_bytes(texImage->TexFormat);
-
- if (_mesa_is_format_compressed(texImage->TexFormat)) {
- GLuint compressedSize = _mesa_format_image_size(mesaFormat, mml->width,
- mml->height, 1);
- dstRowStride = _mesa_format_row_stride(texImage->TexFormat, mml->width);
- texImage->Data = _mesa_alloc_texmemory(compressedSize);
- } else {
- dstRowStride = mml->width * texelBytes;
- texImage->Data = _mesa_alloc_texmemory(mml->width * mml->height * texelBytes);
- }
- if (!texImage->Data) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
- return;
- }
-
- if (pixels != NULL) {
- if (mml->wScale != 1 || mml->hScale != 1) {
- /* rescale image to overcome 1:8 aspect limitation */
- if (!adjust2DRatio(ctx,
- 0, 0,
- width, height,
- format, type, pixels,
- packing,
- mml,
- texImage,
- texelBytes,
- dstRowStride)
- ) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
- return;
- }
- }
- else {
- /* no rescaling needed */
- /* unpack image, apply transfer ops and store in texImage->Data */
- _mesa_texstore(ctx, 2, texImage->_BaseFormat,
- texImage->TexFormat, texImage->Data,
- 0, 0, 0, /* dstX/Y/Zoffset */
- dstRowStride,
- texImage->ImageOffsets,
- width, height, 1,
- format, type, pixels, packing);
- }
- }
-
- RevalidateTexture(ctx, texObj);
-
- ti->reloadImages = GL_TRUE;
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-static void
-tdfxTexSubImage2D(struct gl_context *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 )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
- tdfxMipMapLevel *mml;
- GLint texelBytes, dstRowStride;
-
- if (!texObj->DriverData) {
- _mesa_problem(ctx, "problem in fxDDTexSubImage2D");
- return;
- }
-
- ti = TDFX_TEXTURE_DATA(texObj);
- assert(ti);
- mml = TDFX_TEXIMAGE_DATA(texImage);
- assert(mml);
-
- assert(texImage->Data); /* must have an existing texture image! */
- assert(texImage->_BaseFormat);
-
- texelBytes = _mesa_get_format_bytes(texImage->TexFormat);
- if (_mesa_is_format_compressed(texImage->TexFormat)) {
- dstRowStride = _mesa_format_row_stride(texImage->TexFormat, mml->width);
- } else {
- dstRowStride = mml->width * texelBytes;
- }
-
- if (mml->wScale != 1 || mml->hScale != 1) {
- /* need to rescale subimage to match mipmap level's rescale factors */
- if (!adjust2DRatio(ctx,
- xoffset, yoffset,
- width, height,
- format, type, pixels,
- packing,
- mml,
- texImage,
- texelBytes,
- dstRowStride)
- ) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
- return;
- }
- }
- else {
- /* no rescaling needed */
- _mesa_texstore(ctx, 2, texImage->_BaseFormat,
- texImage->TexFormat, texImage->Data,
- xoffset, yoffset, 0,
- dstRowStride,
- texImage->ImageOffsets,
- width, height, 1,
- format, type, pixels, packing);
- }
-
- ti->reloadImages = GL_TRUE; /* signal the image needs to be reloaded */
- fxMesa->new_state |= TDFX_NEW_TEXTURE; /* XXX this might be a bit much */
-}
-
-
-static void
-tdfxTexImage1D(struct gl_context *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)
-{
- tdfxTexImage2D(ctx, target, level,
- internalFormat, width, 1, border,
- format, type, pixels,
- packing,
- texObj,
- texImage);
-}
-
-static void
-tdfxTexSubImage1D(struct gl_context *ctx, GLenum target, GLint level,
- GLint xoffset,
- GLsizei width,
- GLenum format, GLenum type,
- const GLvoid *pixels,
- const struct gl_pixelstore_attrib *packing,
- struct gl_texture_object *texObj,
- struct gl_texture_image *texImage )
-{
- tdfxTexSubImage2D(ctx, target, level,
- xoffset, 0,
- width, 1,
- format, type,
- pixels,
- packing,
- texObj,
- texImage);
-}
-
-/**********************************************************************/
-/**** COMPRESSED TEXTURE IMAGE FUNCTIONS ****/
-/**********************************************************************/
-
-static void
-tdfxCompressedTexImage2D (struct gl_context *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)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
- tdfxMipMapLevel *mml;
- gl_format mesaFormat;
- GLuint compressedSize = 0;
-
- if (TDFX_DEBUG & DEBUG_VERBOSE_DRI) {
- fprintf(stderr, "tdfxCompressedTexImage2D: id=%d int 0x%x %dx%d\n",
- texObj->Name, internalFormat,
- width, height);
- }
-
- if ((target != GL_TEXTURE_1D && target != GL_TEXTURE_2D) || texImage->Border > 0) {
- _mesa_problem(NULL, "tdfx: unsupported texture in tdfxCompressedTexImg()\n");
- return;
- }
-
- ti = TDFX_TEXTURE_DATA(texObj);
- if (!ti) {
- texObj->DriverData = fxAllocTexObjData(fxMesa);
- if (!texObj->DriverData) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
- return;
- }
- ti = TDFX_TEXTURE_DATA(texObj);
- }
- assert(ti);
-
- mml = TDFX_TEXIMAGE_DATA(texImage);
- if (!mml) {
- texImage->DriverData = CALLOC(sizeof(tdfxMipMapLevel));
- if (!texImage->DriverData) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
- return;
- }
- mml = TDFX_TEXIMAGE_DATA(texImage);
- }
-
- tdfxTexGetInfo(ctx, width, height, NULL, NULL, NULL, NULL,
- &mml->wScale, &mml->hScale);
-
- mml->width = width * mml->wScale;
- mml->height = height * mml->hScale;
-
-
- /* Determine the appropriate Glide texel format,
- * given the user's internal texture format hint.
- */
- mesaFormat = texImage->TexFormat;
- mml->glideFormat = fxGlideFormat(mesaFormat);
- ti->info.format = mml->glideFormat;
- texImage->FetchTexelc = fxFetchFunction(mesaFormat);
-
- /* allocate new storage for texture image, if needed */
- if (!texImage->Data) {
- compressedSize = _mesa_format_image_size(mesaFormat, mml->width,
- mml->height, 1);
- texImage->Data = _mesa_alloc_texmemory(compressedSize);
- if (!texImage->Data) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
- return;
- }
- }
-
- /* save the texture data */
- if (mml->wScale != 1 || mml->hScale != 1) {
- /* [dBorca] Hack alert:
- * now we're screwed. We can't decompress,
- * unless we do it in HW (via textureBuffer).
- * We still have some chances:
- * 1) we got FXT1 textures - we CAN decompress, rescale for
- * aspectratio, then compress back.
- * 2) there is a chance that MIN("s", "t") won't be overflowed.
- * Thus, we don't care about textureclamp and we could lower
- * MIN("uscale", "vscale") below 32. We still have to have
- * our data aligned inside a 8:1 rectangle.
- * 3) just in case if MIN("s", "t") gets overflowed with GL_REPEAT,
- * we replicate the data over the padded area.
- * For now, we take 2) + 3) but texelfetchers will be wrong!
- */
- const GLuint mesaFormat = texImage->TexFormat;
- GLuint srcRowStride = _mesa_format_row_stride(mesaFormat, width);
-
- GLuint destRowStride = _mesa_format_row_stride(mesaFormat,
- mml->width);
-
- _mesa_upscale_teximage2d(srcRowStride, (height+3) / 4,
- destRowStride, (mml->height+3) / 4,
- 1, data, srcRowStride,
- texImage->Data);
- ti->padded = GL_TRUE;
- } else {
- memcpy(texImage->Data, data, compressedSize);
- }
-
- RevalidateTexture(ctx, texObj);
-
- ti->reloadImages = GL_TRUE;
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-static void
-tdfxCompressedTexSubImage2D( struct gl_context *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 )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
- tdfxMipMapLevel *mml;
- GLint destRowStride, srcRowStride;
- GLint i, rows;
- GLubyte *dest;
- const GLuint mesaFormat = texImage->TexFormat;
-
- if (TDFX_DEBUG & DEBUG_VERBOSE_DRI) {
- fprintf(stderr, "tdfxCompressedTexSubImage2D: id=%d\n", texObj->Name);
- }
-
- ti = TDFX_TEXTURE_DATA(texObj);
- assert(ti);
- mml = TDFX_TEXIMAGE_DATA(texImage);
- assert(mml);
-
- srcRowStride = _mesa_format_row_stride(mesaFormat, width);
-
- destRowStride = _mesa_format_row_stride(mesaFormat, mml->width);
- dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
- mesaFormat,
- mml->width,
- (GLubyte*) texImage->Data);
-
- rows = height / 4; /* [dBorca] hardcoded 4, but works for FXT1/DXTC */
-
- for (i = 0; i < rows; i++) {
- memcpy(dest, data, srcRowStride);
- dest += destRowStride;
- data = (GLvoid *)((intptr_t)data + (intptr_t)srcRowStride);
- }
-
- /* [dBorca] Hack alert:
- * see fxDDCompressedTexImage2D for caveats
- */
- if (mml->wScale != 1 || mml->hScale != 1) {
- srcRowStride = _mesa_format_row_stride(mesaFormat, texImage->Width);
-
- destRowStride = _mesa_format_row_stride(mesaFormat, mml->width);
- _mesa_upscale_teximage2d(srcRowStride, texImage->Height / 4,
- destRowStride, mml->height / 4,
- 1, texImage->Data, destRowStride,
- texImage->Data);
- }
-
- RevalidateTexture(ctx, texObj);
-
- ti->reloadImages = GL_TRUE;
- fxMesa->new_state |= TDFX_NEW_TEXTURE;
-}
-
-
-#if 0
-static void
-PrintTexture(int w, int h, int c, const GLubyte * data)
-{
- int i, j;
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- if (c == 2)
- printf("%02x %02x ", data[0], data[1]);
- else if (c == 3)
- printf("%02x %02x %02x ", data[0], data[1], data[2]);
- data += c;
- }
- printf("\n");
- }
-}
-#endif
-
-
-GLboolean
-tdfxTestProxyTexImage(struct gl_context *ctx, GLenum target,
- GLint level, GLint internalFormat,
- GLenum format, GLenum type,
- GLint width, GLint height,
- GLint depth, GLint border)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
-
- switch (target) {
- case GL_PROXY_TEXTURE_1D:
- /*JJJ wrong*/
- case GL_PROXY_TEXTURE_2D:
- {
- struct gl_texture_object *tObj;
- tdfxTexInfo *ti;
- int memNeeded;
-
- tObj = ctx->Texture.ProxyTex[TEXTURE_2D_INDEX];
- if (!tObj->DriverData)
- tObj->DriverData = fxAllocTexObjData(fxMesa);
- ti = TDFX_TEXTURE_DATA(tObj);
- assert(ti);
-
- /* assign the parameters to test against */
- tObj->Image[0][level]->Width = width;
- tObj->Image[0][level]->Height = height;
- tObj->Image[0][level]->Border = border;
-#if 0
- tObj->Image[0][level]->InternalFormat = internalFormat;
-#endif
- if (level == 0) {
- /* don't use mipmap levels > 0 */
- tObj->Sampler.MinFilter = tObj->Sampler.MagFilter = GL_NEAREST;
- }
- else {
- /* test with all mipmap levels */
- tObj->Sampler.MinFilter = GL_LINEAR_MIPMAP_LINEAR;
- tObj->Sampler.MagFilter = GL_NEAREST;
- }
- RevalidateTexture(ctx, tObj);
-
- /*
- printf("small lodlog2 0x%x\n", ti->info.smallLodLog2);
- printf("large lodlog2 0x%x\n", ti->info.largeLodLog2);
- printf("aspect ratio 0x%x\n", ti->info.aspectRatioLog2);
- printf("glide format 0x%x\n", ti->info.format);
- printf("data %p\n", ti->info.data);
- printf("lodblend %d\n", (int) ti->LODblend);
- */
-
- /* determine where texture will reside */
- if (ti->LODblend && !shared->umaTexMemory) {
- /* XXX GR_MIPMAPLEVELMASK_BOTH might not be right, but works */
- memNeeded = fxMesa->Glide.grTexTextureMemRequired(
- GR_MIPMAPLEVELMASK_BOTH, &(ti->info));
- }
- else {
- /* XXX GR_MIPMAPLEVELMASK_BOTH might not be right, but works */
- memNeeded = fxMesa->Glide.grTexTextureMemRequired(
- GR_MIPMAPLEVELMASK_BOTH, &(ti->info));
- }
- /*
- printf("Proxy test %d > %d\n", memNeeded, shared->totalTexMem[0]);
- */
- if (memNeeded > shared->totalTexMem[0])
- return GL_FALSE;
- else
- return GL_TRUE;
- }
- case GL_PROXY_TEXTURE_3D:
- return GL_TRUE; /* software rendering */
- default:
- return GL_TRUE; /* never happens, silence compiler */
- }
-}
-
-
-/**
- * Allocate a new texture object.
- * Called via ctx->Driver.NewTextureObject.
- * Note: this function will be called during context creation to
- * allocate the default texture objects.
- * Note: we could use containment here to 'derive' the driver-specific
- * texture object from the core mesa gl_texture_object. Not done at this time.
- */
-static struct gl_texture_object *
-tdfxNewTextureObject( struct gl_context *ctx, GLuint name, GLenum target )
-{
- struct gl_texture_object *obj;
- obj = _mesa_new_texture_object(ctx, name, target);
- return obj;
-}
-
-
-void tdfxInitTextureFuncs( struct dd_function_table *functions )
-{
- functions->BindTexture = tdfxBindTexture;
- functions->NewTextureObject = tdfxNewTextureObject;
- functions->DeleteTexture = tdfxDeleteTexture;
- functions->TexEnv = tdfxTexEnv;
- functions->TexParameter = tdfxTexParameter;
- functions->ChooseTextureFormat = tdfxChooseTextureFormat;
- functions->TexImage1D = tdfxTexImage1D;
- functions->TexSubImage1D = tdfxTexSubImage1D;
- functions->TexImage2D = tdfxTexImage2D;
- functions->TexSubImage2D = tdfxTexSubImage2D;
- functions->IsTextureResident = tdfxIsTextureResident;
- functions->CompressedTexImage2D = tdfxCompressedTexImage2D;
- functions->CompressedTexSubImage2D = tdfxCompressedTexSubImage2D;
- functions->UpdateTexturePalette = tdfxUpdateTexturePalette;
- functions->GenerateMipmap = tdfxGenerateMipmap;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tex.h b/src/mesa/drivers/dri/tdfx/tdfx_tex.h
deleted file mode 100644
index 26885fae3e3..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_tex.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#ifndef _TDFX_TEX_H_
-#define _TDFX_TEX_H_
-
-
-#define tdfxDDIsCompressedFormatMacro(internalFormat) \
- (((internalFormat) == GL_COMPRESSED_RGB_FXT1_3DFX) || \
- ((internalFormat) == GL_COMPRESSED_RGBA_FXT1_3DFX))
-#define tdfxDDIsCompressedGlideFormatMacro(internalFormat) \
- ((internalFormat) == GR_TEXFMT_ARGB_CMP_FXT1)
-
-
-
-extern void
-tdfxTexValidate(struct gl_context * ctx, struct gl_texture_object *tObj);
-
-
-#if 000 /* DEAD? */
-extern void
-fxDDTexUseGlobalPalette(struct gl_context * ctx, GLboolean state);
-#endif
-
-extern GLboolean
-tdfxTestProxyTexImage(struct gl_context *ctx, GLenum target,
- GLint level, GLint internalFormat,
- GLenum format, GLenum type,
- GLint width, GLint height,
- GLint depth, GLint border);
-
-extern GLvoid *
-tdfxDDGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
- const struct gl_texture_object *texObj,
- GLenum * formatOut, GLenum * typeOut,
- GLboolean * freeImageOut);
-
-extern void
-tdfxDDGetCompressedTexImage( struct gl_context *ctx, GLenum target,
- GLint lod, void *image,
- const struct gl_texture_object *texObj,
- struct gl_texture_image *texImage );
-
-extern GLint
-tdfxSpecificCompressedTexFormat(struct gl_context *ctx,
- GLint internalFormat,
- GLint numDimensions);
-
-extern GLint
-tdfxBaseCompressedTexFormat(struct gl_context *ctx,
- GLint internalFormat);
-
-extern GLboolean
-tdfxDDIsCompressedFormat(struct gl_context *ctx, GLint internalFormat);
-
-extern GLsizei
-tdfxDDCompressedImageSize(struct gl_context *ctx,
- GLenum intFormat,
- GLuint numDimensions,
- GLuint width,
- GLuint height,
- GLuint depth);
-
-
-extern void
-tdfxInitTextureFuncs( struct dd_function_table *functions );
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_texman.c b/src/mesa/drivers/dri/tdfx/tdfx_texman.c
deleted file mode 100644
index 1160ae2d0bc..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_texman.c
+++ /dev/null
@@ -1,994 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#include "tdfx_context.h"
-#include "tdfx_texman.h"
-#include "main/texobj.h"
-#include "main/hash.h"
-
-
-#define BAD_ADDRESS ((FxU32) -1)
-
-
-#if 0 /* DEBUG use */
-/*
- * Verify the consistancy of the texture memory manager.
- * This involves:
- * Traversing all texture objects and computing total memory used.
- * Traverse the free block list and computing total memory free.
- * Compare the total free and total used amounts to the total memory size.
- * Make various assertions about the results.
- */
-static void
-VerifyFreeList(tdfxContextPtr fxMesa, FxU32 tmu)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxMemRange *block;
- int prevStart = -1, prevEnd = -1;
- int totalFree = 0;
- int numObj = 0, numRes = 0;
- int totalUsed = 0;
-
- for (block = shared->tmFree[tmu]; block; block = block->next) {
- assert( block->endAddr > 0 );
- assert( block->startAddr <= shared->totalTexMem[tmu] );
- assert( block->endAddr <= shared->totalTexMem[tmu] );
- assert( (int) block->startAddr > prevStart );
- assert( (int) block->startAddr >= prevEnd );
- prevStart = (int) block->startAddr;
- prevEnd = (int) block->endAddr;
- totalFree += (block->endAddr - block->startAddr);
- }
- assert(totalFree == shared->freeTexMem[tmu]);
-
- {
- struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
- GLuint id;
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *tObj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- if (ti) {
- if (ti->isInTM) {
- numRes++;
- assert(ti->tm[0]);
- if (ti->tm[tmu])
- totalUsed += (ti->tm[tmu]->endAddr - ti->tm[tmu]->startAddr);
- }
- else {
- assert(!ti->tm[0]);
- }
- }
- }
- }
-
- printf("totalFree: %d totalUsed: %d totalMem: %d #objs=%d #res=%d\n",
- shared->freeTexMem[tmu], totalUsed, shared->totalTexMem[tmu],
- numObj, numRes);
-
- assert(totalUsed + totalFree == shared->totalTexMem[tmu]);
-}
-
-
-static void
-dump_texmem(tdfxContextPtr fxMesa)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct _mesa_HashTable *textures = mesaShared->TexObjects;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxMemRange *r;
- FxU32 prev;
- GLuint id;
-
- printf("DUMP Objects:\n");
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *obj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- tdfxTexInfo *info = TDFX_TEXTURE_DATA(obj);
-
- if (info && info->isInTM) {
- printf("Obj %8p: %4d info = %p\n", obj, obj->Name, info);
-
- printf(" isInTM=%d whichTMU=%d lastTimeUsed=%d\n",
- info->isInTM, info->whichTMU, info->lastTimeUsed);
- printf(" tm[0] = %p", info->tm[0]);
- assert(info->tm[0]);
- if (info->tm[0]) {
- printf(" tm startAddr = %d endAddr = %d",
- info->tm[0]->startAddr,
- info->tm[0]->endAddr);
- }
- printf("\n");
- printf(" tm[1] = %p", info->tm[1]);
- if (info->tm[1]) {
- printf(" tm startAddr = %d endAddr = %d",
- info->tm[1]->startAddr,
- info->tm[1]->endAddr);
- }
- printf("\n");
- }
- }
-
- VerifyFreeList(fxMesa, 0);
- VerifyFreeList(fxMesa, 1);
-
- printf("Free memory unit 0: %d bytes\n", shared->freeTexMem[0]);
- prev = 0;
- for (r = shared->tmFree[0]; r; r = r->next) {
- printf("%8p: start %8d end %8d size %8d gap %8d\n", r, r->startAddr, r->endAddr, r->endAddr - r->startAddr, r->startAddr - prev);
- prev = r->endAddr;
- }
-
- printf("Free memory unit 1: %d bytes\n", shared->freeTexMem[1]);
- prev = 0;
- for (r = shared->tmFree[1]; r; r = r->next) {
- printf("%8p: start %8d end %8d size %8d gap %8d\n", r, r->startAddr, r->endAddr, r->endAddr - r->startAddr, r->startAddr - prev);
- prev = r->endAddr;
- }
-
-}
-#endif
-
-
-
-#ifdef TEXSANITY
-static void
-fubar(void)
-{
-}
-
-/*
- * Sanity Check
- */
-static void
-sanity(tdfxContextPtr fxMesa)
-{
- tdfxMemRange *tmp, *prev, *pos;
-
- prev = 0;
- tmp = fxMesa->tmFree[0];
- while (tmp) {
- if (!tmp->startAddr && !tmp->endAddr) {
- fprintf(stderr, "Textures fubar\n");
- fubar();
- }
- if (tmp->startAddr >= tmp->endAddr) {
- fprintf(stderr, "Node fubar\n");
- fubar();
- }
- if (prev && (prev->startAddr >= tmp->startAddr ||
- prev->endAddr > tmp->startAddr)) {
- fprintf(stderr, "Sorting fubar\n");
- fubar();
- }
- prev = tmp;
- tmp = tmp->next;
- }
- prev = 0;
- tmp = fxMesa->tmFree[1];
- while (tmp) {
- if (!tmp->startAddr && !tmp->endAddr) {
- fprintf(stderr, "Textures fubar\n");
- fubar();
- }
- if (tmp->startAddr >= tmp->endAddr) {
- fprintf(stderr, "Node fubar\n");
- fubar();
- }
- if (prev && (prev->startAddr >= tmp->startAddr ||
- prev->endAddr > tmp->startAddr)) {
- fprintf(stderr, "Sorting fubar\n");
- fubar();
- }
- prev = tmp;
- tmp = tmp->next;
- }
-}
-#endif
-
-
-
-
-
-/*
- * Allocate and initialize a new MemRange struct.
- * Try to allocate it from the pool of free MemRange nodes rather than malloc.
- */
-static tdfxMemRange *
-NewRangeNode(tdfxContextPtr fxMesa, FxU32 start, FxU32 end)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxMemRange *result;
-
- _glthread_LOCK_MUTEX(mesaShared->Mutex);
- if (shared && shared->tmPool) {
- result = shared->tmPool;
- shared->tmPool = shared->tmPool->next;
- }
- else {
- result = MALLOC(sizeof(tdfxMemRange));
-
- }
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
-
- if (!result) {
- /*fprintf(stderr, "fxDriver: out of memory!\n");*/
- return NULL;
- }
-
- result->startAddr = start;
- result->endAddr = end;
- result->next = NULL;
-
- return result;
-}
-
-
-/*
- * Initialize texture memory.
- * We take care of one or both TMU's here.
- */
-void
-tdfxTMInit(tdfxContextPtr fxMesa)
-{
- if (!fxMesa->glCtx->Shared->DriverData) {
- const char *extensions;
- struct tdfxSharedState *shared = CALLOC_STRUCT(tdfxSharedState);
- if (!shared)
- return;
-
- LOCK_HARDWARE(fxMesa);
- extensions = fxMesa->Glide.grGetString(GR_EXTENSION);
- UNLOCK_HARDWARE(fxMesa);
- if (strstr(extensions, "TEXUMA")) {
- FxU32 start, end;
- shared->umaTexMemory = GL_TRUE;
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grEnable(GR_TEXTURE_UMA_EXT);
- start = fxMesa->Glide.grTexMinAddress(0);
- end = fxMesa->Glide.grTexMaxAddress(0);
- UNLOCK_HARDWARE(fxMesa);
- shared->totalTexMem[0] = end - start;
- shared->totalTexMem[1] = 0;
- shared->freeTexMem[0] = end - start;
- shared->freeTexMem[1] = 0;
- shared->tmFree[0] = NewRangeNode(fxMesa, start, end);
- shared->tmFree[1] = NULL;
- /*printf("UMA tex memory: %d\n", (int) (end - start));*/
- }
- else {
- const int numTMUs = fxMesa->haveTwoTMUs ? 2 : 1;
- int tmu;
- shared->umaTexMemory = GL_FALSE;
- LOCK_HARDWARE(fxMesa);
- for (tmu = 0; tmu < numTMUs; tmu++) {
- FxU32 start = fxMesa->Glide.grTexMinAddress(tmu);
- FxU32 end = fxMesa->Glide.grTexMaxAddress(tmu);
- shared->totalTexMem[tmu] = end - start;
- shared->freeTexMem[tmu] = end - start;
- shared->tmFree[tmu] = NewRangeNode(fxMesa, start, end);
- /*printf("Split tex memory: %d\n", (int) (end - start));*/
- }
- UNLOCK_HARDWARE(fxMesa);
- }
-
- shared->tmPool = NULL;
- fxMesa->glCtx->Shared->DriverData = shared;
- /*printf("Texture memory init UMA: %d\n", shared->umaTexMemory);*/
- }
-}
-
-
-/*
- * Clean-up texture memory before destroying context.
- */
-void
-tdfxTMClose(tdfxContextPtr fxMesa)
-{
- if (fxMesa->glCtx->Shared->RefCount == 1 && fxMesa->driDrawable) {
- /* refcount will soon go to zero, free our 3dfx stuff */
- struct tdfxSharedState *shared = (struct tdfxSharedState *) fxMesa->glCtx->Shared->DriverData;
-
- const int numTMUs = fxMesa->haveTwoTMUs ? 2 : 1;
- int tmu;
- tdfxMemRange *tmp, *next;
-
- /* Deallocate the pool of free tdfxMemRange nodes */
- tmp = shared->tmPool;
- while (tmp) {
- next = tmp->next;
- FREE(tmp);
- tmp = next;
- }
-
- /* Delete the texture memory block tdfxMemRange nodes */
- for (tmu = 0; tmu < numTMUs; tmu++) {
- tmp = shared->tmFree[tmu];
- while (tmp) {
- next = tmp->next;
- FREE(tmp);
- tmp = next;
- }
- }
-
- FREE(shared);
- fxMesa->glCtx->Shared->DriverData = NULL;
- }
-}
-
-
-
-/*
- * Delete a tdfxMemRange struct.
- * We keep a linked list of free/available tdfxMemRange structs to
- * avoid extra malloc/free calls.
- */
-#if 0
-static void
-DeleteRangeNode_NoLock(struct TdfxSharedState *shared, tdfxMemRange *range)
-{
- /* insert at head of list */
- range->next = shared->tmPool;
- shared->tmPool = range;
-}
-#endif
-
-#define DELETE_RANGE_NODE(shared, range) \
- (range)->next = (shared)->tmPool; \
- (shared)->tmPool = (range)
-
-
-
-/*
- * When we've run out of texture memory we have to throw out an
- * existing texture to make room for the new one. This function
- * determins the texture to throw out.
- */
-static struct gl_texture_object *
-FindOldestObject(tdfxContextPtr fxMesa, FxU32 tmu)
-{
- const GLuint bindnumber = fxMesa->texBindNumber;
- struct gl_texture_object *oldestObj, *lowestPriorityObj;
- GLfloat lowestPriority;
- GLuint oldestAge;
- GLuint id;
- struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
-
- oldestObj = NULL;
- oldestAge = 0;
-
- lowestPriority = 1.0F;
- lowestPriorityObj = NULL;
-
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *obj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- tdfxTexInfo *info = TDFX_TEXTURE_DATA(obj);
-
- if (info && info->isInTM &&
- ((info->whichTMU == tmu) || (info->whichTMU == TDFX_TMU_BOTH) ||
- (info->whichTMU == TDFX_TMU_SPLIT))) {
- GLuint age, lasttime;
-
- assert(info->tm[0]);
- lasttime = info->lastTimeUsed;
-
- if (lasttime > bindnumber)
- age = bindnumber + (UINT_MAX - lasttime + 1); /* TO DO: check wrap around */
- else
- age = bindnumber - lasttime;
-
- if (age >= oldestAge) {
- oldestAge = age;
- oldestObj = obj;
- }
-
- /* examine priority */
- if (obj->Priority < lowestPriority) {
- lowestPriority = obj->Priority;
- lowestPriorityObj = obj;
- }
- }
- }
-
- if (lowestPriority < 1.0) {
- ASSERT(lowestPriorityObj);
- /*
- printf("discard %d pri=%f\n", lowestPriorityObj->Name, lowestPriority);
- */
- return lowestPriorityObj;
- }
- else {
- /*
- printf("discard %d age=%d\n", oldestObj->Name, oldestAge);
- */
- return oldestObj;
- }
-}
-
-
-#if 0
-static void
-FlushTexMemory(tdfxContextPtr fxMesa)
-{
- struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
- GLuint id;
-
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *obj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- if (obj->RefCount < 2) {
- /* don't flush currently bound textures */
- tdfxTMMoveOutTM_NoLock(fxMesa, obj);
- }
- }
-}
-#endif
-
-
-/*
- * Find the address (offset?) at which we can store a new texture.
- * <tmu> is the texture unit.
- * <size> is the texture size in bytes.
- */
-static FxU32
-FindStartAddr(tdfxContextPtr fxMesa, FxU32 tmu, FxU32 size)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxMemRange *prev, *block;
- FxU32 result;
-#if 0
- int discardedCount = 0;
-#define MAX_DISCARDS 10
-#endif
-
- if (shared->umaTexMemory) {
- assert(tmu == TDFX_TMU0);
- }
-
- _glthread_LOCK_MUTEX(mesaShared->Mutex);
- while (1) {
- prev = NULL;
- block = shared->tmFree[tmu];
- while (block) {
- if (block->endAddr - block->startAddr >= size) {
- /* The texture will fit here */
- result = block->startAddr;
- block->startAddr += size;
- if (block->startAddr == block->endAddr) {
- /* Remove this node since it's empty */
- if (prev) {
- prev->next = block->next;
- }
- else {
- shared->tmFree[tmu] = block->next;
- }
- DELETE_RANGE_NODE(shared, block);
- }
- shared->freeTexMem[tmu] -= size;
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
- return result;
- }
- prev = block;
- block = block->next;
- }
- /* We failed to find a block large enough to accomodate <size> bytes.
- * Find the oldest texObject and free it.
- */
-#if 0
- discardedCount++;
- if (discardedCount > MAX_DISCARDS + 1) {
- _mesa_problem(NULL, "%s: extreme texmem fragmentation", __FUNCTION__);
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
- return BAD_ADDRESS;
- }
- else if (discardedCount > MAX_DISCARDS) {
- /* texture memory is probably really fragmented, flush it */
- FlushTexMemory(fxMesa);
- }
- else
-#endif
- {
- struct gl_texture_object *obj = FindOldestObject(fxMesa, tmu);
- if (obj) {
- tdfxTMMoveOutTM_NoLock(fxMesa, obj);
- fxMesa->stats.texSwaps++;
- }
- else {
- _mesa_problem(NULL, "%s: extreme texmem fragmentation", __FUNCTION__);
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
- return BAD_ADDRESS;
- }
- }
- }
-
- /* never get here, but play it safe */
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
- return BAD_ADDRESS;
-}
-
-
-/*
- * Remove the given tdfxMemRange node from hardware texture memory.
- */
-static void
-RemoveRange_NoLock(tdfxContextPtr fxMesa, FxU32 tmu, tdfxMemRange *range)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxMemRange *block, *prev;
-
- if (shared->umaTexMemory) {
- assert(tmu == TDFX_TMU0);
- }
-
- if (!range)
- return;
-
- if (range->startAddr == range->endAddr) {
- DELETE_RANGE_NODE(shared, range);
- return;
- }
- shared->freeTexMem[tmu] += range->endAddr - range->startAddr;
-
- /* find position in linked list to insert this tdfxMemRange node */
- prev = NULL;
- block = shared->tmFree[tmu];
- while (block) {
- assert(range->startAddr != block->startAddr);
- if (range->startAddr > block->startAddr) {
- prev = block;
- block = block->next;
- }
- else {
- break;
- }
- }
-
- /* Insert the free block, combine with adjacent blocks when possible */
- range->next = block;
- if (block) {
- if (range->endAddr == block->startAddr) {
- /* Combine */
- block->startAddr = range->startAddr;
- DELETE_RANGE_NODE(shared, range);
- range = block;
- }
- }
- if (prev) {
- if (prev->endAddr == range->startAddr) {
- /* Combine */
- prev->endAddr = range->endAddr;
- prev->next = range->next;
- DELETE_RANGE_NODE(shared, range);
- }
- else {
- prev->next = range;
- }
- }
- else {
- shared->tmFree[tmu] = range;
- }
-}
-
-
-#if 0 /* NOT USED */
-static void
-RemoveRange(tdfxContextPtr fxMesa, FxU32 tmu, tdfxMemRange *range)
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- _glthread_LOCK_MUTEX(mesaShared->Mutex);
- RemoveRange_NoLock(fxMesa, tmu, range);
- _glthread_UNLOCK_MUTEX(mesaShared->Mutex);
-}
-#endif
-
-
-/*
- * Allocate space for a texture image.
- * <tmu> is the texture unit
- * <texmemsize> is the number of bytes to allocate
- */
-static tdfxMemRange *
-AllocTexMem(tdfxContextPtr fxMesa, FxU32 tmu, FxU32 texmemsize)
-{
- FxU32 startAddr;
- startAddr = FindStartAddr(fxMesa, tmu, texmemsize);
- if (startAddr == BAD_ADDRESS) {
- _mesa_problem(fxMesa->glCtx, "%s returned NULL! tmu=%d texmemsize=%d",
- __FUNCTION__, (int) tmu, (int) texmemsize);
- return NULL;
- }
- else {
- tdfxMemRange *range;
- range = NewRangeNode(fxMesa, startAddr, startAddr + texmemsize);
- return range;
- }
-}
-
-
-/*
- * Download (copy) the given texture data (all mipmap levels) into the
- * Voodoo's texture memory.
- * The texture memory must have already been allocated.
- */
-void
-tdfxTMDownloadTexture(tdfxContextPtr fxMesa, struct gl_texture_object *tObj)
-{
- tdfxTexInfo *ti;
- GLint l;
- FxU32 targetTMU;
-
- assert(tObj);
- ti = TDFX_TEXTURE_DATA(tObj);
- assert(ti);
- targetTMU = ti->whichTMU;
-
- switch (targetTMU) {
- case TDFX_TMU0:
- case TDFX_TMU1:
- if (ti->tm[targetTMU]) {
- for (l = ti->minLevel; l <= ti->maxLevel
- && tObj->Image[0][l]->Data; l++) {
- GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel;
- fxMesa->Glide.grTexDownloadMipMapLevel(targetTMU,
- ti->tm[targetTMU]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][l]->Data);
- }
- }
- break;
- case TDFX_TMU_SPLIT:
- if (ti->tm[TDFX_TMU0] && ti->tm[TDFX_TMU1]) {
- for (l = ti->minLevel; l <= ti->maxLevel
- && tObj->Image[0][l]->Data; l++) {
- GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel;
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0,
- ti->tm[TDFX_TMU0]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_ODD,
- tObj->Image[0][l]->Data);
-
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1,
- ti->tm[TDFX_TMU1]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_EVEN,
- tObj->Image[0][l]->Data);
- }
- }
- break;
- case TDFX_TMU_BOTH:
- if (ti->tm[TDFX_TMU0] && ti->tm[TDFX_TMU1]) {
- for (l = ti->minLevel; l <= ti->maxLevel
- && tObj->Image[0][l]->Data; l++) {
- GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel;
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0,
- ti->tm[TDFX_TMU0]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][l]->Data);
-
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1,
- ti->tm[TDFX_TMU1]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][l]->Data);
- }
- }
- break;
- default:
- _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)targetTMU);
- return;
- }
-}
-
-
-void
-tdfxTMReloadMipMapLevel(struct gl_context *ctx, struct gl_texture_object *tObj,
- GLint level)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- GrLOD_t glideLod;
- FxU32 tmu;
-
- tmu = ti->whichTMU;
- glideLod = ti->info.largeLodLog2 - level + tObj->BaseLevel;
- ASSERT(ti->isInTM);
-
- LOCK_HARDWARE(fxMesa);
-
- switch (tmu) {
- case TDFX_TMU0:
- case TDFX_TMU1:
- fxMesa->Glide.grTexDownloadMipMapLevel(tmu,
- ti->tm[tmu]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][level]->Data);
- break;
- case TDFX_TMU_SPLIT:
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0,
- ti->tm[GR_TMU0]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_ODD,
- tObj->Image[0][level]->Data);
-
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1,
- ti->tm[GR_TMU1]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_EVEN,
- tObj->Image[0][level]->Data);
- break;
- case TDFX_TMU_BOTH:
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0,
- ti->tm[GR_TMU0]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][level]->Data);
-
- fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1,
- ti->tm[GR_TMU1]->startAddr,
- glideLod,
- ti->info.largeLodLog2,
- ti->info.aspectRatioLog2,
- ti->info.format,
- GR_MIPMAPLEVELMASK_BOTH,
- tObj->Image[0][level]->Data);
- break;
-
- default:
- _mesa_problem(ctx, "%s: bad tmu (%d)", __FUNCTION__, (int)tmu);
- break;
- }
- UNLOCK_HARDWARE(fxMesa);
-}
-
-
-/*
- * Allocate space for the given texture in texture memory then
- * download (copy) it into that space.
- */
-void
-tdfxTMMoveInTM_NoLock( tdfxContextPtr fxMesa, struct gl_texture_object *tObj,
- FxU32 targetTMU )
-{
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- FxU32 texmemsize;
-
- fxMesa->stats.reqTexUpload++;
-
- if (ti->isInTM) {
- if (ti->whichTMU == targetTMU)
- return;
- if (targetTMU == TDFX_TMU_SPLIT || ti->whichTMU == TDFX_TMU_SPLIT) {
- tdfxTMMoveOutTM_NoLock(fxMesa, tObj);
- }
- else {
- if (ti->whichTMU == TDFX_TMU_BOTH)
- return;
- targetTMU = TDFX_TMU_BOTH;
- }
- }
-
- ti->whichTMU = targetTMU;
-
- switch (targetTMU) {
- case TDFX_TMU0:
- case TDFX_TMU1:
- texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH,
- &(ti->info));
- ti->tm[targetTMU] = AllocTexMem(fxMesa, targetTMU, texmemsize);
- break;
- case TDFX_TMU_SPLIT:
- texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD,
- &(ti->info));
- ti->tm[TDFX_TMU0] = AllocTexMem(fxMesa, TDFX_TMU0, texmemsize);
- if (ti->tm[TDFX_TMU0])
- fxMesa->stats.memTexUpload += texmemsize;
-
- texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN,
- &(ti->info));
- ti->tm[TDFX_TMU1] = AllocTexMem(fxMesa, TDFX_TMU1, texmemsize);
- break;
- case TDFX_TMU_BOTH:
- texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH,
- &(ti->info));
- ti->tm[TDFX_TMU0] = AllocTexMem(fxMesa, TDFX_TMU0, texmemsize);
- if (ti->tm[TDFX_TMU0])
- fxMesa->stats.memTexUpload += texmemsize;
-
- /*texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH,
- &(ti->info));*/
- ti->tm[TDFX_TMU1] = AllocTexMem(fxMesa, TDFX_TMU1, texmemsize);
- break;
- default:
- _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)targetTMU);
- return;
- }
-
- ti->reloadImages = GL_TRUE;
- ti->isInTM = GL_TRUE;
-
- fxMesa->stats.texUpload++;
-}
-
-
-/*
- * Move the given texture out of hardware texture memory.
- * This deallocates the texture's memory space.
- */
-void
-tdfxTMMoveOutTM_NoLock( tdfxContextPtr fxMesa, struct gl_texture_object *tObj )
-{
- struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
-
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "fxmesa: %s(%p (%d))\n", __FUNCTION__, (void *)tObj, tObj->Name);
- }
-
- /*
- VerifyFreeList(fxMesa, 0);
- VerifyFreeList(fxMesa, 1);
- */
-
- if (!ti || !ti->isInTM)
- return;
-
- switch (ti->whichTMU) {
- case TDFX_TMU0:
- case TDFX_TMU1:
- RemoveRange_NoLock(fxMesa, ti->whichTMU, ti->tm[ti->whichTMU]);
- break;
- case TDFX_TMU_SPLIT:
- case TDFX_TMU_BOTH:
- assert(!shared->umaTexMemory);
- (void) shared;
- RemoveRange_NoLock(fxMesa, TDFX_TMU0, ti->tm[TDFX_TMU0]);
- RemoveRange_NoLock(fxMesa, TDFX_TMU1, ti->tm[TDFX_TMU1]);
- break;
- default:
- _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)ti->whichTMU);
- return;
- }
-
- ti->isInTM = GL_FALSE;
- ti->tm[0] = NULL;
- ti->tm[1] = NULL;
- ti->whichTMU = TDFX_TMU_NONE;
-
- /*
- VerifyFreeList(fxMesa, 0);
- VerifyFreeList(fxMesa, 1);
- */
-}
-
-
-/*
- * Called via glDeleteTexture to delete a texture object.
- */
-void
-tdfxTMFreeTexture(tdfxContextPtr fxMesa, struct gl_texture_object *tObj)
-{
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- if (ti) {
- tdfxTMMoveOutTM(fxMesa, tObj);
- FREE(ti);
- tObj->DriverData = NULL;
- }
- /*
- VerifyFreeList(fxMesa, 0);
- VerifyFreeList(fxMesa, 1);
- */
-}
-
-
-
-/*
- * After a context switch this function will be called to restore
- * texture memory for the new context.
- */
-void tdfxTMRestoreTextures_NoLock( tdfxContextPtr fxMesa )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
- GLuint id;
-
- for (id = _mesa_HashFirstEntry(textures);
- id;
- id = _mesa_HashNextEntry(textures, id)) {
- struct gl_texture_object *tObj
- = _mesa_lookup_texture(fxMesa->glCtx, id);
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA( tObj );
- if ( ti && ti->isInTM ) {
- int i;
- for ( i = 0 ; i < MAX_TEXTURE_UNITS ; i++ ) {
- if ( ctx->Texture.Unit[i]._Current == tObj ) {
- tdfxTMDownloadTexture( fxMesa, tObj );
- break;
- }
- }
- if ( i == MAX_TEXTURE_UNITS ) {
- tdfxTMMoveOutTM_NoLock( fxMesa, tObj );
- }
- }
- }
- /*
- VerifyFreeList(fxMesa, 0);
- VerifyFreeList(fxMesa, 1);
- */
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_texman.h b/src/mesa/drivers/dri/tdfx/tdfx_texman.h
deleted file mode 100644
index 87bdc3fea93..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_texman.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#ifndef __TDFX_TEXMAN_H__
-#define __TDFX_TEXMAN_H__
-
-
-#include "tdfx_lock.h"
-
-
-extern void tdfxTMInit( tdfxContextPtr fxMesa );
-
-extern void tdfxTMClose( tdfxContextPtr fxMesa );
-
-extern void tdfxTMDownloadTexture(tdfxContextPtr fxMesa,
- struct gl_texture_object *tObj);
-
-extern void tdfxTMReloadMipMapLevel( struct gl_context *ctx,
- struct gl_texture_object *tObj,
- GLint level );
-
-extern void tdfxTMMoveInTM_NoLock( tdfxContextPtr fxMesa,
- struct gl_texture_object *tObj,
- FxU32 targetTMU );
-
-extern void tdfxTMMoveOutTM_NoLock( tdfxContextPtr fxMesa,
- struct gl_texture_object *tObj );
-
-extern void tdfxTMFreeTexture( tdfxContextPtr fxMesa,
- struct gl_texture_object *tObj );
-
-extern void tdfxTMRestoreTextures_NoLock( tdfxContextPtr fxMesa );
-
-
-#define tdfxTMMoveInTM( fxMesa, tObj, targetTMU ) \
- do { \
- LOCK_HARDWARE( fxMesa ); \
- tdfxTMMoveInTM_NoLock( fxMesa, tObj, targetTMU ); \
- UNLOCK_HARDWARE( fxMesa ); \
- } while (0)
-
-#define tdfxTMMoveOutTM( fxMesa, tObj ) \
- do { \
- LOCK_HARDWARE( fxMesa ); \
- tdfxTMMoveOutTM_NoLock( fxMesa, tObj ); \
- UNLOCK_HARDWARE( fxMesa ); \
- } while (0)
-
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_texstate.c b/src/mesa/drivers/dri/tdfx/tdfx_texstate.c
deleted file mode 100644
index 227f36be65d..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_texstate.c
+++ /dev/null
@@ -1,2218 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * 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>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#include "tdfx_state.h"
-#include "tdfx_texman.h"
-#include "tdfx_texstate.h"
-
-
-/* =============================================================
- * Texture
- */
-
-/*
- * These macros are used below when handling COMBINE_EXT.
- */
-#define TEXENV_OPERAND_INVERTED(operand) \
- (((operand) == GL_ONE_MINUS_SRC_ALPHA) \
- || ((operand) == GL_ONE_MINUS_SRC_COLOR))
-#define TEXENV_OPERAND_ALPHA(operand) \
- (((operand) == GL_SRC_ALPHA) || ((operand) == GL_ONE_MINUS_SRC_ALPHA))
-#define TEXENV_SETUP_ARG_A(param, source, operand, iteratedAlpha) \
- switch (source) { \
- case GL_TEXTURE: \
- param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
- break; \
- case GL_CONSTANT_EXT: \
- param = GR_CMBX_TMU_CALPHA; \
- break; \
- case GL_PRIMARY_COLOR_EXT: \
- param = GR_CMBX_ITALPHA; \
- break; \
- case GL_PREVIOUS_EXT: \
- param = iteratedAlpha; \
- break; \
- default: \
- /* \
- * This is here just to keep from getting \
- * compiler warnings. \
- */ \
- param = GR_CMBX_ZERO; \
- break; \
- }
-
-#define TEXENV_SETUP_ARG_RGB(param, source, operand, iteratedColor, iteratedAlpha) \
- if (!TEXENV_OPERAND_ALPHA(operand)) { \
- switch (source) { \
- case GL_TEXTURE: \
- param = GR_CMBX_LOCAL_TEXTURE_RGB; \
- break; \
- case GL_CONSTANT_EXT: \
- param = GR_CMBX_TMU_CCOLOR; \
- break; \
- case GL_PRIMARY_COLOR_EXT: \
- param = GR_CMBX_ITRGB; \
- break; \
- case GL_PREVIOUS_EXT: \
- param = iteratedColor; \
- break; \
- default: \
- /* \
- * This is here just to keep from getting \
- * compiler warnings. \
- */ \
- param = GR_CMBX_ZERO; \
- break; \
- } \
- } else { \
- switch (source) { \
- case GL_TEXTURE: \
- param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
- break; \
- case GL_CONSTANT_EXT: \
- param = GR_CMBX_TMU_CALPHA; \
- break; \
- case GL_PRIMARY_COLOR_EXT: \
- param = GR_CMBX_ITALPHA; \
- break; \
- case GL_PREVIOUS_EXT: \
- param = iteratedAlpha; \
- break; \
- default: \
- /* \
- * This is here just to keep from getting \
- * compiler warnings. \
- */ \
- param = GR_CMBX_ZERO; \
- break; \
- } \
- }
-
-#define TEXENV_SETUP_MODE_RGB(param, operand) \
- switch (operand) { \
- case GL_SRC_COLOR: \
- case GL_SRC_ALPHA: \
- param = GR_FUNC_MODE_X; \
- break; \
- case GL_ONE_MINUS_SRC_ALPHA: \
- case GL_ONE_MINUS_SRC_COLOR: \
- param = GR_FUNC_MODE_ONE_MINUS_X; \
- break; \
- default: \
- param = GR_FUNC_MODE_ZERO; \
- break; \
- }
-
-#define TEXENV_SETUP_MODE_A(param, operand) \
- switch (operand) { \
- case GL_SRC_ALPHA: \
- param = GR_FUNC_MODE_X; \
- break; \
- case GL_ONE_MINUS_SRC_ALPHA: \
- param = GR_FUNC_MODE_ONE_MINUS_X; \
- break; \
- default: \
- param = GR_FUNC_MODE_ZERO; \
- break; \
- }
-
-
-
-/*
- * Setup a texture environment on Voodoo5.
- * Return GL_TRUE for success, GL_FALSE for failure.
- * If we fail, we'll have to use software rendering.
- */
-static GLboolean
-SetupTexEnvNapalm(struct gl_context *ctx, GLboolean useIteratedRGBA,
- const struct gl_texture_unit *texUnit, GLenum baseFormat,
- struct tdfx_texcombine_ext *env)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrTCCUColor_t incomingRGB, incomingAlpha;
- const GLenum envMode = texUnit->EnvMode;
-
- if (useIteratedRGBA) {
- incomingRGB = GR_CMBX_ITRGB;
- incomingAlpha = GR_CMBX_ITALPHA;
- }
- else {
- incomingRGB = GR_CMBX_OTHER_TEXTURE_RGB;
- incomingAlpha = GR_CMBX_OTHER_TEXTURE_ALPHA;
- }
-
- /* invariant: */
- env->Color.Shift = 0;
- env->Color.Invert = FXFALSE;
- env->Alpha.Shift = 0;
- env->Alpha.Invert = FXFALSE;
-
- switch (envMode) {
- case GL_REPLACE:
- /* -- Setup RGB combiner */
- if (baseFormat == GL_ALPHA) {
- /* Rv = Rf */
- env->Color.SourceA = incomingRGB;
- }
- else {
- /* Rv = Rt */
- env->Color.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB;
- }
- env->Color.ModeA = GR_FUNC_MODE_X;
- env->Color.SourceB = GR_CMBX_ZERO;
- env->Color.ModeB = GR_FUNC_MODE_ZERO;
- env->Color.SourceC = GR_CMBX_ZERO;
- env->Color.InvertC = FXTRUE;
- env->Color.SourceD = GR_CMBX_ZERO;
- env->Color.InvertD = FXFALSE;
- /* -- Setup Alpha combiner */
- if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* Av = Af */
- env->Alpha.SourceD = incomingAlpha;
- }
- else {
- /* Av = At */
- env->Alpha.SourceD = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- }
- env->Alpha.SourceA = GR_CMBX_ITALPHA;
- env->Alpha.ModeA = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXFALSE;
- env->Alpha.InvertD = FXFALSE;
- break;
-
- case GL_MODULATE:
- /* -- Setup RGB combiner */
- if (baseFormat == GL_ALPHA) {
- /* Rv = Rf */
- env->Color.SourceC = GR_CMBX_ZERO;
- env->Color.InvertC = FXTRUE;
- }
- else {
- /* Result = Frag * Tex */
- env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB;
- env->Color.InvertC = FXFALSE;
- }
- env->Color.SourceA = incomingRGB;
- env->Color.ModeA = GR_FUNC_MODE_X;
- env->Color.SourceB = GR_CMBX_ZERO;
- env->Color.ModeB = GR_FUNC_MODE_ZERO;
- env->Color.SourceD = GR_CMBX_ZERO;
- env->Color.InvertD = FXFALSE;
- /* -- Setup Alpha combiner */
- if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* Av = Af */
- env->Alpha.SourceA = incomingAlpha;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXTRUE;
- }
- else {
- /* Av = Af * At */
- env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Alpha.SourceC = incomingAlpha;
- env->Alpha.InvertC = FXFALSE;
- }
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceD = GR_CMBX_ZERO;
- env->Alpha.InvertD = FXFALSE;
- break;
-
- case GL_DECAL:
- /* -- Setup RGB combiner */
- if (baseFormat == GL_RGB) {
- /* Rv = Rt */
- env->Color.SourceB = GR_CMBX_ZERO;
- env->Color.ModeB = GR_FUNC_MODE_X;
- env->Color.SourceC = GR_CMBX_ZERO;
- env->Color.InvertC = FXTRUE;
- env->Color.SourceD = GR_CMBX_ZERO;
- env->Color.InvertD = FXFALSE;
- }
- else {
- /* Rv = Rf * (1 - At) + Rt * At */
- env->Color.SourceB = incomingRGB;
- env->Color.ModeB = GR_FUNC_MODE_NEGATIVE_X;
- env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Color.InvertC = FXFALSE;
- env->Color.SourceD = GR_CMBX_B;
- env->Color.InvertD = FXFALSE;
- }
- env->Color.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB;
- env->Color.ModeA = GR_FUNC_MODE_X;
- /* -- Setup Alpha combiner */
- /* Av = Af */
- env->Alpha.SourceA = incomingAlpha;
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXTRUE;
- env->Alpha.SourceD = GR_CMBX_ZERO;
- env->Alpha.InvertD = FXFALSE;
- break;
-
- case GL_BLEND:
- /* -- Setup RGB combiner */
- if (baseFormat == GL_ALPHA) {
- /* Rv = Rf */
- env->Color.SourceA = incomingRGB;
- env->Color.ModeA = GR_FUNC_MODE_X;
- env->Color.SourceB = GR_CMBX_ZERO;
- env->Color.ModeB = GR_FUNC_MODE_ZERO;
- env->Color.SourceC = GR_CMBX_ZERO;
- env->Color.InvertC = FXTRUE;
- env->Color.SourceD = GR_CMBX_ZERO;
- env->Color.InvertD = FXFALSE;
- }
- else {
- /* Rv = Rf * (1 - Rt) + Rc * Rt */
- env->Color.SourceA = GR_CMBX_TMU_CCOLOR;
- env->Color.ModeA = GR_FUNC_MODE_X;
- env->Color.SourceB = incomingRGB;
- env->Color.ModeB = GR_FUNC_MODE_NEGATIVE_X;
- env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB;
- env->Color.InvertC = FXFALSE;
- env->Color.SourceD = GR_CMBX_B;
- env->Color.InvertD = FXFALSE;
- }
- /* -- Setup Alpha combiner */
- if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* Av = Af */
- env->Alpha.SourceA = incomingAlpha;
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceB = GR_CMBX_ZERO;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXTRUE;
- env->Alpha.SourceD = GR_CMBX_ZERO;
- env->Alpha.InvertD = FXFALSE;
- }
- else if (baseFormat == GL_INTENSITY) {
- /* Av = Af * (1 - It) + Ac * It */
- env->Alpha.SourceA = GR_CMBX_TMU_CALPHA;
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceB = incomingAlpha;
- env->Alpha.ModeB = GR_FUNC_MODE_NEGATIVE_X;
- env->Alpha.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Alpha.InvertC = FXFALSE;
- env->Alpha.SourceD = GR_CMBX_B;
- env->Alpha.InvertD = FXFALSE;
- }
- else {
- /* Av = Af * At */
- env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = incomingAlpha;
- env->Alpha.InvertC = FXFALSE;
- env->Alpha.SourceD = GR_CMBX_ZERO;
- env->Alpha.InvertD = FXFALSE;
- }
- /* Also have to set up the tex env constant color */
- env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F,
- texUnit->EnvColor[1] * 255.0F,
- texUnit->EnvColor[2] * 255.0F,
- texUnit->EnvColor[3] * 255.0F);
- break;
- case GL_ADD:
- /* -- Setup RGB combiner */
- if (baseFormat == GL_ALPHA) {
- /* Rv = Rf */
- env->Color.SourceB = GR_CMBX_ZERO;
- env->Color.ModeB = GR_FUNC_MODE_ZERO;
- }
- else {
- /* Rv = Rf + Tt */
- env->Color.SourceB = GR_CMBX_LOCAL_TEXTURE_RGB;
- env->Color.ModeB = GR_FUNC_MODE_X;
- }
- env->Color.SourceA = incomingRGB;
- env->Color.ModeA = GR_FUNC_MODE_X;
- env->Color.SourceC = GR_CMBX_ZERO;
- env->Color.InvertC = FXTRUE;
- env->Color.SourceD = GR_CMBX_ZERO;
- env->Color.InvertD = FXFALSE;
- /* -- Setup Alpha combiner */
- if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* Av = Af */
- env->Alpha.SourceA = incomingAlpha;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXTRUE;
-
- }
- else if (baseFormat == GL_INTENSITY) {
- /* Av = Af + It */
- env->Alpha.SourceA = incomingAlpha;
- env->Alpha.SourceB = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_X;
- env->Alpha.SourceC = GR_CMBX_ZERO;
- env->Alpha.InvertC = FXTRUE;
- }
- else {
- /* Av = Af * At */
- env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;
- env->Alpha.SourceB = GR_CMBX_ITALPHA;
- env->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- env->Alpha.SourceC = incomingAlpha;
- env->Alpha.InvertC = FXFALSE;
- }
- env->Alpha.ModeA = GR_FUNC_MODE_X;
- env->Alpha.SourceD = GR_CMBX_ZERO;
- env->Alpha.InvertD = FXFALSE;
- break;
-
- case GL_COMBINE_EXT:
- {
- FxU32 A_RGB, B_RGB, C_RGB, D_RGB;
- FxU32 Amode_RGB, Bmode_RGB;
- FxBool Cinv_RGB, Dinv_RGB, Ginv_RGB;
- FxU32 Shift_RGB;
- FxU32 A_A, B_A, C_A, D_A;
- FxU32 Amode_A, Bmode_A;
- FxBool Cinv_A, Dinv_A, Ginv_A;
- FxU32 Shift_A;
-
- /*
- *
- * In the formulas below, we write:
- * o "1(x)" for the identity function applied to x,
- * so 1(x) = x.
- * o "0(x)" for the constant function 0, so
- * 0(x) = 0 for all values of x.
- *
- * Calculate the color combination.
- */
- Shift_RGB = texUnit->Combine.ScaleShiftRGB;
- Shift_A = texUnit->Combine.ScaleShiftA;
- switch (texUnit->Combine.ModeRGB) {
- case GL_REPLACE:
- /*
- * The formula is: Arg0
- * We implement this by the formula:
- * (Arg0 + 0(0))*(1-0) + 0
- */
- TEXENV_SETUP_ARG_RGB(A_RGB,
- texUnit->Combine.SourceRGB[0],
- texUnit->Combine.OperandRGB[0],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_MODE_RGB(Amode_RGB,
- texUnit->Combine.OperandRGB[0]);
- B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;
- Bmode_RGB = GR_FUNC_MODE_ZERO;
- Cinv_RGB = FXTRUE;
- Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- case GL_MODULATE:
- /*
- * The formula is: Arg0 * Arg1
- *
- * We implement this by the formula
- * (Arg0 + 0(0)) * Arg1 + 0(0)
- */
- TEXENV_SETUP_ARG_RGB(A_RGB,
- texUnit->Combine.SourceRGB[0],
- texUnit->Combine.OperandRGB[0],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_MODE_RGB(Amode_RGB,
- texUnit->Combine.OperandRGB[0]);
- B_RGB = GR_CMBX_ZERO;
- Bmode_RGB = GR_CMBX_ZERO;
- TEXENV_SETUP_ARG_RGB(C_RGB,
- texUnit->Combine.SourceRGB[1],
- texUnit->Combine.OperandRGB[1],
- incomingRGB, incomingAlpha);
- Cinv_RGB = TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandRGB[1]);
- D_RGB = GR_CMBX_ZERO;
- Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- case GL_ADD:
- /*
- * The formula is Arg0 + Arg1
- */
- TEXENV_SETUP_ARG_RGB(A_RGB,
- texUnit->Combine.SourceRGB[0],
- texUnit->Combine.OperandRGB[0],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_MODE_RGB(Amode_RGB,
- texUnit->Combine.OperandRGB[0]);
- TEXENV_SETUP_ARG_RGB(B_RGB,
- texUnit->Combine.SourceRGB[1],
- texUnit->Combine.OperandRGB[1],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_MODE_RGB(Bmode_RGB,
- texUnit->Combine.OperandRGB[1]);
- C_RGB = D_RGB = GR_CMBX_ZERO;
- Cinv_RGB = FXTRUE;
- Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- case GL_ADD_SIGNED_EXT:
- /*
- * The formula is: Arg0 + Arg1 - 0.5.
- * We compute this by calculating:
- * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA}
- * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA}
- * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA}
- * we cannot implement the formula properly.
- */
- TEXENV_SETUP_ARG_RGB(A_RGB,
- texUnit->Combine.SourceRGB[0],
- texUnit->Combine.OperandRGB[0],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_ARG_RGB(B_RGB,
- texUnit->Combine.SourceRGB[1],
- texUnit->Combine.OperandRGB[1],
- incomingRGB, incomingAlpha);
- if (!TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[0])) {
- /*
- * A is not inverted. So, choose it.
- */
- Amode_RGB = GR_FUNC_MODE_X_MINUS_HALF;
- if (!TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandRGB[1])) {
- Bmode_RGB = GR_FUNC_MODE_X;
- }
- else {
- Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
- }
- }
- else {
- /*
- * A is inverted, so try to subtract 1/2
- * from B.
- */
- Amode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
- if (!TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandRGB[1])) {
- Bmode_RGB = GR_FUNC_MODE_X_MINUS_HALF;
- }
- else {
- /*
- * Both are inverted. This is the case
- * we cannot handle properly. We just
- * choose to not add the - 1/2.
- */
- Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
- return GL_FALSE;
- }
- }
- C_RGB = D_RGB = GR_CMBX_ZERO;
- Cinv_RGB = FXTRUE;
- Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- case GL_INTERPOLATE_EXT:
- /*
- * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2).
- * We compute this by the formula:
- * (Arg0 - Arg1) * Arg2 + Arg1
- * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1
- * == Arg0 * Arg2 + Arg1 * (1 - Arg2)
- * However, if both Arg1 is ONE_MINUS_X, the HW does
- * not support it properly.
- */
- TEXENV_SETUP_ARG_RGB(A_RGB,
- texUnit->Combine.SourceRGB[0],
- texUnit->Combine.OperandRGB[0],
- incomingRGB, incomingAlpha);
- TEXENV_SETUP_MODE_RGB(Amode_RGB,
- texUnit->Combine.OperandRGB[0]);
- TEXENV_SETUP_ARG_RGB(B_RGB,
- texUnit->Combine.SourceRGB[1],
- texUnit->Combine.OperandRGB[1],
- incomingRGB, incomingAlpha);
- if (TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[1])) {
- /*
- * This case is wrong.
- */
- Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;
- return GL_FALSE;
- }
- else {
- Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;
- }
- /*
- * The Source/Operand for the C value must
- * specify some kind of alpha value.
- */
- TEXENV_SETUP_ARG_A(C_RGB,
- texUnit->Combine.SourceRGB[2],
- texUnit->Combine.OperandRGB[2],
- incomingAlpha);
- Cinv_RGB = FXFALSE;
- D_RGB = GR_CMBX_B;
- Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- default:
- /*
- * This is here mostly to keep from getting
- * a compiler warning about these not being set.
- * However, this should set all the texture values
- * to zero.
- */
- A_RGB = B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;
- Amode_RGB = Bmode_RGB = GR_FUNC_MODE_X;
- Cinv_RGB = Dinv_RGB = Ginv_RGB = FXFALSE;
- break;
- }
- /*
- * Calculate the alpha combination.
- */
- switch (texUnit->Combine.ModeA) {
- case GL_REPLACE:
- /*
- * The formula is: Arg0
- * We implement this by the formula:
- * (Arg0 + 0(0))*(1-0) + 0
- */
- TEXENV_SETUP_ARG_A(A_A,
- texUnit->Combine.SourceA[0],
- texUnit->Combine.OperandA[0],
- incomingAlpha);
- TEXENV_SETUP_MODE_A(Amode_A,
- texUnit->Combine.OperandA[0]);
- B_A = GR_CMBX_ITALPHA;
- Bmode_A = GR_FUNC_MODE_ZERO;
- C_A = D_A = GR_CMBX_ZERO;
- Cinv_A = FXTRUE;
- Dinv_A = Ginv_A = FXFALSE;
- break;
- case GL_MODULATE:
- /*
- * The formula is: Arg0 * Arg1
- *
- * We implement this by the formula
- * (Arg0 + 0(0)) * Arg1 + 0(0)
- */
- TEXENV_SETUP_ARG_A(A_A,
- texUnit->Combine.SourceA[0],
- texUnit->Combine.OperandA[0],
- incomingAlpha);
- TEXENV_SETUP_MODE_A(Amode_A,
- texUnit->Combine.OperandA[0]);
- B_A = GR_CMBX_ZERO;
- Bmode_A = GR_CMBX_ZERO;
- TEXENV_SETUP_ARG_A(C_A,
- texUnit->Combine.SourceA[1],
- texUnit->Combine.OperandA[1],
- incomingAlpha);
- Cinv_A = TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandA[1]);
- D_A = GR_CMBX_ZERO;
- Dinv_A = Ginv_A = FXFALSE;
- break;
- case GL_ADD:
- /*
- * The formula is Arg0 + Arg1
- */
- TEXENV_SETUP_ARG_A(A_A,
- texUnit->Combine.SourceA[0],
- texUnit->Combine.OperandA[0],
- incomingAlpha);
- TEXENV_SETUP_MODE_A(Amode_A,
- texUnit->Combine.OperandA[0]);
- TEXENV_SETUP_ARG_A(B_A,
- texUnit->Combine.SourceA[1],
- texUnit->Combine.OperandA[1],
- incomingAlpha);
- TEXENV_SETUP_MODE_A(Bmode_A,
- texUnit->Combine.OperandA[1]);
- C_A = D_A = GR_CMBX_ZERO;
- Cinv_A = FXTRUE;
- Dinv_A = Ginv_A = FXFALSE;
- break;
- case GL_ADD_SIGNED_EXT:
- /*
- * The formula is: Arg0 + Arg1 - 0.5.
- * We compute this by calculating:
- * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA}
- * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA}
- * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA}
- * we cannot implement the formula properly.
- */
- TEXENV_SETUP_ARG_A(A_A,
- texUnit->Combine.SourceA[0],
- texUnit->Combine.OperandA[0],
- incomingAlpha);
- TEXENV_SETUP_ARG_A(B_A,
- texUnit->Combine.SourceA[1],
- texUnit->Combine.OperandA[1],
- incomingAlpha);
- if (!TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandA[0])) {
- /*
- * A is not inverted. So, choose it.
- */
- Amode_A = GR_FUNC_MODE_X_MINUS_HALF;
- if (!TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandA[1])) {
- Bmode_A = GR_FUNC_MODE_X;
- } else {
- Bmode_A = GR_FUNC_MODE_ONE_MINUS_X;
- }
- } else {
- /*
- * A is inverted, so try to subtract 1/2
- * from B.
- */
- Amode_A = GR_FUNC_MODE_ONE_MINUS_X;
- if (!TEXENV_OPERAND_INVERTED
- (texUnit->Combine.OperandA[1])) {
- Bmode_A = GR_FUNC_MODE_X_MINUS_HALF;
- } else {
- /*
- * Both are inverted. This is the case
- * we cannot handle properly. We just
- * choose to not add the - 1/2.
- */
- Bmode_A = GR_FUNC_MODE_ONE_MINUS_X;
- return GL_FALSE;
- }
- }
- C_A = D_A = GR_CMBX_ZERO;
- Cinv_A = FXTRUE;
- Dinv_A = Ginv_A = FXFALSE;
- break;
- case GL_INTERPOLATE_EXT:
- /*
- * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2).
- * We compute this by the formula:
- * (Arg0 - Arg1) * Arg2 + Arg1
- * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1
- * == Arg0 * Arg2 + Arg1 * (1 - Arg2)
- * However, if both Arg1 is ONE_MINUS_X, the HW does
- * not support it properly.
- */
- TEXENV_SETUP_ARG_A(A_A,
- texUnit->Combine.SourceA[0],
- texUnit->Combine.OperandA[0],
- incomingAlpha);
- TEXENV_SETUP_MODE_A(Amode_A,
- texUnit->Combine.OperandA[0]);
- TEXENV_SETUP_ARG_A(B_A,
- texUnit->Combine.SourceA[1],
- texUnit->Combine.OperandA[1],
- incomingAlpha);
- if (!TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandA[1])) {
- Bmode_A = GR_FUNC_MODE_NEGATIVE_X;
- }
- else {
- /*
- * This case is wrong.
- */
- Bmode_A = GR_FUNC_MODE_NEGATIVE_X;
- return GL_FALSE;
- }
- /*
- * The Source/Operand for the C value must
- * specify some kind of alpha value.
- */
- TEXENV_SETUP_ARG_A(C_A,
- texUnit->Combine.SourceA[2],
- texUnit->Combine.OperandA[2],
- incomingAlpha);
- Cinv_A = FXFALSE;
- D_A = GR_CMBX_B;
- Dinv_A = Ginv_A = FXFALSE;
- break;
- default:
- /*
- * This is here mostly to keep from getting
- * a compiler warning about these not being set.
- * However, this should set all the alpha values
- * to one.
- */
- A_A = B_A = C_A = D_A = GR_CMBX_ZERO;
- Amode_A = Bmode_A = GR_FUNC_MODE_X;
- Cinv_A = Dinv_A = FXFALSE;
- Ginv_A = FXTRUE;
- break;
- }
- /*
- * Save the parameters.
- */
- env->Color.SourceA = A_RGB;
- env->Color.ModeA = Amode_RGB;
- env->Color.SourceB = B_RGB;
- env->Color.ModeB = Bmode_RGB;
- env->Color.SourceC = C_RGB;
- env->Color.InvertC = Cinv_RGB;
- env->Color.SourceD = D_RGB;
- env->Color.InvertD = Dinv_RGB;
- env->Color.Shift = Shift_RGB;
- env->Color.Invert = Ginv_RGB;
- env->Alpha.SourceA = A_A;
- env->Alpha.ModeA = Amode_A;
- env->Alpha.SourceB = B_A;
- env->Alpha.ModeB = Bmode_A;
- env->Alpha.SourceC = C_A;
- env->Alpha.InvertC = Cinv_A;
- env->Alpha.SourceD = D_A;
- env->Alpha.InvertD = Dinv_A;
- env->Alpha.Shift = Shift_A;
- env->Alpha.Invert = Ginv_A;
- env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F,
- texUnit->EnvColor[1] * 255.0F,
- texUnit->EnvColor[2] * 255.0F,
- texUnit->EnvColor[3] * 255.0F);
- }
- break;
-
- default:
- _mesa_problem(ctx, "%s: Bad envMode", __FUNCTION__);
- }
-
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_ENV;
-
- fxMesa->ColorCombineExt.SourceA = GR_CMBX_TEXTURE_RGB;
- fxMesa->ColorCombineExt.ModeA = GR_FUNC_MODE_X,
- fxMesa->ColorCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.ModeB = GR_FUNC_MODE_X;
- fxMesa->ColorCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertC = FXTRUE;
- fxMesa->ColorCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertD = FXFALSE;
- fxMesa->ColorCombineExt.Shift = 0;
- fxMesa->ColorCombineExt.Invert = FXFALSE;
- fxMesa->dirty |= TDFX_UPLOAD_COLOR_COMBINE;
- fxMesa->AlphaCombineExt.SourceA = GR_CMBX_TEXTURE_ALPHA;
- fxMesa->AlphaCombineExt.ModeA = GR_FUNC_MODE_X;
- fxMesa->AlphaCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.ModeB = GR_FUNC_MODE_X;
- fxMesa->AlphaCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertC = FXTRUE;
- fxMesa->AlphaCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertD = FXFALSE;
- fxMesa->AlphaCombineExt.Shift = 0;
- fxMesa->AlphaCombineExt.Invert = FXFALSE;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_COMBINE;
- return GL_TRUE; /* success */
-}
-
-
-
-/*
- * Setup the Voodoo3 texture environment for a single texture unit.
- * Return GL_TRUE for success, GL_FALSE for failure.
- * If failure, we'll use software rendering.
- */
-static GLboolean
-SetupSingleTexEnvVoodoo3(struct gl_context *ctx, int unit,
- GLenum envMode, GLenum baseFormat)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GrCombineLocal_t localc, locala;
- struct tdfx_combine alphaComb, colorComb;
-
- if (1 /*iteratedRGBA*/)
- localc = locala = GR_COMBINE_LOCAL_ITERATED;
- else
- localc = locala = GR_COMBINE_LOCAL_CONSTANT;
-
- switch (envMode) {
- case GL_DECAL:
- alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_NONE;
- alphaComb.Invert = FXFALSE;
- colorComb.Function = GR_COMBINE_FUNCTION_BLEND;
- colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_ALPHA;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
- colorComb.Invert = FXFALSE;
- break;
- case GL_MODULATE:
- alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
- alphaComb.Invert = FXFALSE;
- if (baseFormat == GL_ALPHA) {
- colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- colorComb.Factor = GR_COMBINE_FACTOR_NONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_NONE;
- colorComb.Invert = FXFALSE;
- }
- else {
- colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- colorComb.Factor = GR_COMBINE_FACTOR_LOCAL;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
- colorComb.Invert = FXFALSE;
- }
- break;
-
- case GL_BLEND:
- /*
- * XXX we can't do real GL_BLEND mode. These settings assume that
- * the TexEnv color is black and incoming fragment color is white.
- */
- if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* Av = Af */
- alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_NONE;
- alphaComb.Invert = FXFALSE;
- }
- else if (baseFormat == GL_INTENSITY) {
- /* Av = Af * (1 - It) + Ac * It */
- alphaComb.Function = GR_COMBINE_FUNCTION_BLEND;
- alphaComb.Factor = GR_COMBINE_FACTOR_TEXTURE_ALPHA;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_CONSTANT;
- alphaComb.Invert = FXFALSE;
- }
- else {
- /* Av = Af * At */
- alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
- alphaComb.Invert = FXFALSE;
- }
- if (baseFormat == GL_ALPHA) {
- colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- colorComb.Factor = GR_COMBINE_FACTOR_NONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_NONE;
- colorComb.Invert = FXFALSE;
- }
- else {
- colorComb.Function = GR_COMBINE_FUNCTION_BLEND;
- colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_RGB;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_CONSTANT;
- colorComb.Invert = FXTRUE;
- }
- fxMesa->Color.MonoColor = PACK_RGBA32(
- ctx->Texture.Unit[unit].EnvColor[0] * 255.0f,
- ctx->Texture.Unit[unit].EnvColor[1] * 255.0f,
- ctx->Texture.Unit[unit].EnvColor[2] * 255.0f,
- ctx->Texture.Unit[unit].EnvColor[3] * 255.0f);
- fxMesa->dirty |= TDFX_UPLOAD_CONSTANT_COLOR;
- break;
-
- case GL_REPLACE:
- if ((baseFormat == GL_RGB) || (baseFormat == GL_LUMINANCE)) {
- alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_NONE;
- alphaComb.Invert = FXFALSE;
- }
- else {
- alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- alphaComb.Factor = GR_COMBINE_FACTOR_ONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
- alphaComb.Invert = FXFALSE;
- }
- if (baseFormat == GL_ALPHA) {
- colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- colorComb.Factor = GR_COMBINE_FACTOR_NONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_NONE;
- colorComb.Invert = FXFALSE;
- }
- else {
- colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- colorComb.Factor = GR_COMBINE_FACTOR_ONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
- colorComb.Invert = FXFALSE;
- }
- break;
-
- case GL_ADD:
- if (baseFormat == GL_ALPHA ||
- baseFormat == GL_LUMINANCE_ALPHA ||
- baseFormat == GL_RGBA) {
- /* product of texel and fragment alpha */
- alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
- alphaComb.Invert = FXFALSE;
- }
- else if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {
- /* fragment alpha is unchanged */
- alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_NONE;
- alphaComb.Invert = FXFALSE;
- }
- else {
- ASSERT(baseFormat == GL_INTENSITY);
- /* sum of texel and fragment alpha */
- alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
- alphaComb.Factor = GR_COMBINE_FACTOR_ONE;
- alphaComb.Local = locala;
- alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
- alphaComb.Invert = FXFALSE;
- }
- if (baseFormat == GL_ALPHA) {
- /* rgb unchanged */
- colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
- colorComb.Factor = GR_COMBINE_FACTOR_NONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_NONE;
- colorComb.Invert = FXFALSE;
- }
- else {
- /* sum of texel and fragment rgb */
- colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
- colorComb.Factor = GR_COMBINE_FACTOR_ONE;
- colorComb.Local = localc;
- colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
- colorComb.Invert = FXFALSE;
- }
- break;
-
- default: {
- (void) memcpy(&colorComb, &fxMesa->ColorCombine, sizeof(colorComb));
- (void) memcpy(&alphaComb, &fxMesa->AlphaCombine, sizeof(alphaComb));
- _mesa_problem(ctx, "bad texture env mode in %s", __FUNCTION__);
- }
- }
-
- if (colorComb.Function != fxMesa->ColorCombine.Function ||
- colorComb.Factor != fxMesa->ColorCombine.Factor ||
- colorComb.Local != fxMesa->ColorCombine.Local ||
- colorComb.Other != fxMesa->ColorCombine.Other ||
- colorComb.Invert != fxMesa->ColorCombine.Invert) {
- fxMesa->ColorCombine = colorComb;
- fxMesa->dirty |= TDFX_UPLOAD_COLOR_COMBINE;
- }
-
- if (alphaComb.Function != fxMesa->AlphaCombine.Function ||
- alphaComb.Factor != fxMesa->AlphaCombine.Factor ||
- alphaComb.Local != fxMesa->AlphaCombine.Local ||
- alphaComb.Other != fxMesa->AlphaCombine.Other ||
- alphaComb.Invert != fxMesa->AlphaCombine.Invert) {
- fxMesa->AlphaCombine = alphaComb;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_COMBINE;
- }
- return GL_TRUE;
-}
-
-
-/*
- * Setup the Voodoo3 texture environment for dual texture units.
- * Return GL_TRUE for success, GL_FALSE for failure.
- * If failure, we'll use software rendering.
- */
-static GLboolean
-SetupDoubleTexEnvVoodoo3(struct gl_context *ctx, int tmu0,
- GLenum envMode0, GLenum baseFormat0,
- GLenum envMode1, GLenum baseFormat1)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- const GrCombineLocal_t locala = GR_COMBINE_LOCAL_ITERATED;
- const GrCombineLocal_t localc = GR_COMBINE_LOCAL_ITERATED;
- const int tmu1 = 1 - tmu0;
-
- if (envMode0 == GL_MODULATE && envMode1 == GL_MODULATE) {
- GLboolean isalpha[TDFX_NUM_TMU];
-
- isalpha[tmu0] = (baseFormat0 == GL_ALPHA);
- isalpha[tmu1] = (baseFormat1 == GL_ALPHA);
-
- if (isalpha[TDFX_TMU1]) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXTRUE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
- if (isalpha[TDFX_TMU0]) {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- else if (envMode0 == GL_REPLACE && envMode1 == GL_BLEND) { /* Quake */
- if (tmu0 == TDFX_TMU1) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXTRUE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- else if (envMode0 == GL_REPLACE && envMode1 == GL_MODULATE) {
- /* Quake 2/3 */
- if (tmu1 == TDFX_TMU1) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXTRUE;
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
-
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- if (baseFormat0 == GL_RGB) {
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- else {
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- }
- else if (envMode0 == GL_MODULATE && envMode1 == GL_ADD) {
- /* Quake 3 sky */
- GLboolean isalpha[TDFX_NUM_TMU];
-
- isalpha[tmu0] = (baseFormat0 == GL_ALPHA);
- isalpha[tmu1] = (baseFormat1 == GL_ALPHA);
-
- if (isalpha[TDFX_TMU1]) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXTRUE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
- if (isalpha[TDFX_TMU0]) {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- else {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_LOCAL;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- else if (envMode0 == GL_REPLACE && envMode1 == GL_ADD) {
- /* Vulpine sky */
- GLboolean isalpha[TDFX_NUM_TMU];
-
- isalpha[tmu0] = (baseFormat0 == GL_ALPHA);
- isalpha[tmu1] = (baseFormat1 == GL_ALPHA);
-
- if (isalpha[TDFX_TMU1]) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXTRUE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- } else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
-
- if (isalpha[TDFX_TMU0]) {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- } else {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- }
-
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- else if (envMode1 == GL_REPLACE) {
- /* Homeworld2 */
-
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
-
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
-
- if ((baseFormat0 == GL_RGB) || (baseFormat0 == GL_LUMINANCE)) {
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- } else {
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->AlphaCombine.Local = locala;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
- if (baseFormat0 == GL_ALPHA) {
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- } else {
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;
- fxMesa->ColorCombine.Local = localc;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- }
- }
- else {
- _mesa_problem(ctx, "%s: Unexpected dual texture mode encountered", __FUNCTION__);
- return GL_FALSE;
- }
-
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_ENV;
- fxMesa->dirty |= TDFX_UPLOAD_COLOR_COMBINE;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_COMBINE;
- return GL_TRUE;
-}
-
-
-/*
- * This function makes sure that the correct mipmap levels are loaded
- * in the right places in memory and then makes the Glide calls to
- * setup the texture source pointers.
- */
-static void
-setupSingleTMU(tdfxContextPtr fxMesa, struct gl_texture_object *tObj)
-{
- struct tdfxSharedState *shared = (struct tdfxSharedState *) fxMesa->glCtx->Shared->DriverData;
- tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj);
- const struct gl_context *ctx = fxMesa->glCtx;
-
- /* Make sure we're not loaded incorrectly */
- if (ti->isInTM && !shared->umaTexMemory) {
- /* if doing filtering between mipmap levels, alternate mipmap levels
- * must be in alternate TMUs.
- */
- if (ti->LODblend) {
- if (ti->whichTMU != TDFX_TMU_SPLIT)
- tdfxTMMoveOutTM_NoLock(fxMesa, tObj);
- }
- else {
- if (ti->whichTMU == TDFX_TMU_SPLIT)
- tdfxTMMoveOutTM_NoLock(fxMesa, tObj);
- }
- }
-
- /* Make sure we're loaded correctly */
- if (!ti->isInTM) {
- /* Have to download the texture */
- if (shared->umaTexMemory) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj, TDFX_TMU0);
- }
- else {
- /* Voodoo3 (split texture memory) */
- if (ti->LODblend) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj, TDFX_TMU_SPLIT);
- }
- else {
-#if 0
- /* XXX putting textures into the second memory bank when the
- * first bank is full is not working at this time.
- */
- if (fxMesa->haveTwoTMUs) {
- GLint memReq = fxMesa->Glide.grTexTextureMemRequired(
- GR_MIPMAPLEVELMASK_BOTH, &(ti->info));
- if (shared->freeTexMem[TDFX_TMU0] > memReq) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj, TDFX_TMU0);
- }
- else {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj, TDFX_TMU1);
- }
- }
- else
-#endif
- {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj, TDFX_TMU0);
- }
- }
- }
- }
-
- if (ti->LODblend && ti->whichTMU == TDFX_TMU_SPLIT) {
- /* mipmap levels split between texture banks */
- GLint u;
-
- if (ti->info.format == GR_TEXFMT_P_8 && !ctx->Texture.SharedPalette) {
- fxMesa->TexPalette.Type = ti->paltype;
- fxMesa->TexPalette.Data = &(ti->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
-
- for (u = 0; u < 2; u++) {
- fxMesa->TexParams[u].sClamp = ti->sClamp;
- fxMesa->TexParams[u].tClamp = ti->tClamp;
- fxMesa->TexParams[u].minFilt = ti->minFilt;
- fxMesa->TexParams[u].magFilt = ti->magFilt;
- fxMesa->TexParams[u].mmMode = ti->mmMode;
- fxMesa->TexParams[u].LODblend = ti->LODblend;
- fxMesa->TexParams[u].LodBias = ctx->Texture.Unit[u].LodBias;
- }
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PARAMS;
-
- fxMesa->TexSource[0].StartAddress = ti->tm[TDFX_TMU0]->startAddr;
- fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_ODD;
- fxMesa->TexSource[0].Info = &(ti->info);
- fxMesa->TexSource[1].StartAddress = ti->tm[TDFX_TMU1]->startAddr;
- fxMesa->TexSource[1].EvenOdd = GR_MIPMAPLEVELMASK_EVEN;
- fxMesa->TexSource[1].Info = &(ti->info);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_SOURCE;
- }
- else {
- FxU32 tmu;
-
- if (ti->whichTMU == TDFX_TMU_BOTH)
- tmu = TDFX_TMU0;
- else
- tmu = ti->whichTMU;
-
- if (shared->umaTexMemory) {
- assert(ti->whichTMU == TDFX_TMU0);
- assert(tmu == TDFX_TMU0);
- }
-
- if (ti->info.format == GR_TEXFMT_P_8 && !ctx->Texture.SharedPalette) {
- fxMesa->TexPalette.Type = ti->paltype;
- fxMesa->TexPalette.Data = &(ti->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
-
- /* KW: The alternative is to do the download to the other tmu. If
- * we get to this point, I think it means we are thrashing the
- * texture memory, so perhaps it's not a good idea.
- */
-
- if (fxMesa->TexParams[tmu].sClamp != ti->sClamp ||
- fxMesa->TexParams[tmu].tClamp != ti->tClamp ||
- fxMesa->TexParams[tmu].minFilt != ti->minFilt ||
- fxMesa->TexParams[tmu].magFilt != ti->magFilt ||
- fxMesa->TexParams[tmu].mmMode != ti->mmMode ||
- fxMesa->TexParams[tmu].LODblend != FXFALSE ||
- fxMesa->TexParams[tmu].LodBias != ctx->Texture.Unit[tmu].LodBias) {
- fxMesa->TexParams[tmu].sClamp = ti->sClamp;
- fxMesa->TexParams[tmu].tClamp = ti->tClamp;
- fxMesa->TexParams[tmu].minFilt = ti->minFilt;
- fxMesa->TexParams[tmu].magFilt = ti->magFilt;
- fxMesa->TexParams[tmu].mmMode = ti->mmMode;
- fxMesa->TexParams[tmu].LODblend = FXFALSE;
- fxMesa->TexParams[tmu].LodBias = ctx->Texture.Unit[tmu].LodBias;
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PARAMS;
- }
-
- /* Glide texture source info */
- fxMesa->TexSource[0].Info = NULL;
- fxMesa->TexSource[1].Info = NULL;
- if (ti->tm[tmu]) {
- fxMesa->TexSource[tmu].StartAddress = ti->tm[tmu]->startAddr;
- fxMesa->TexSource[tmu].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu].Info = &(ti->info);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_SOURCE;
- }
- }
-
- fxMesa->sScale0 = ti->sScale;
- fxMesa->tScale0 = ti->tScale;
-}
-
-static void
-selectSingleTMUSrc(tdfxContextPtr fxMesa, GLint tmu, FxBool LODblend)
-{
- if (LODblend) {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
-
- if (fxMesa->haveTwoTMUs) {
- const struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- const struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- int tmu;
-
- if (shared->umaTexMemory)
- tmu = GR_TMU0;
- else
- tmu = GR_TMU1;
-
- fxMesa->TexCombine[tmu].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[tmu].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[tmu].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[tmu].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[tmu].InvertRGB = FXFALSE;
- fxMesa->TexCombine[tmu].InvertAlpha = FXFALSE;
- }
- fxMesa->tmuSrc = TDFX_TMU_SPLIT;
- }
- else {
- if (tmu != TDFX_TMU1) {
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- if (fxMesa->haveTwoTMUs) {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- }
- fxMesa->tmuSrc = TDFX_TMU0;
- }
- else {
- fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;
- fxMesa->TexCombine[1].InvertRGB = FXFALSE;
- fxMesa->TexCombine[1].InvertAlpha = FXFALSE;
- /* GR_COMBINE_FUNCTION_SCALE_OTHER doesn't work ?!? */
- fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND;
- fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND;
- fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;
- fxMesa->TexCombine[0].InvertRGB = FXFALSE;
- fxMesa->TexCombine[0].InvertAlpha = FXFALSE;
- fxMesa->tmuSrc = TDFX_TMU1;
- }
- }
-
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_ENV;
-}
-
-#if 0
-static void print_state(tdfxContextPtr fxMesa)
-{
- struct gl_context *ctx = fxMesa->glCtx;
- struct gl_texture_object *tObj0 = ctx->Texture.Unit[0]._Current;
- struct gl_texture_object *tObj1 = ctx->Texture.Unit[1]._Current;
- GLenum base0 = tObj0->Image[0][tObj0->BaseLevel] ? tObj0->Image[0][tObj0->BaseLevel]->Format : 99;
- GLenum base1 = tObj1->Image[0][tObj1->BaseLevel] ? tObj1->Image[0][tObj1->BaseLevel]->Format : 99;
-
- printf("Unit 0: Enabled: GL=%d Gr=%d\n", ctx->Texture.Unit[0]._ReallyEnabled,
- fxMesa->TexState.Enabled[0]);
- printf(" EnvMode: GL=0x%x Gr=0x%x\n", ctx->Texture.Unit[0].EnvMode,
- fxMesa->TexState.EnvMode[0]);
- printf(" BaseFmt: GL=0x%x Gr=0x%x\n", base0, fxMesa->TexState.TexFormat[0]);
-
-
- printf("Unit 1: Enabled: GL=%d Gr=%d\n", ctx->Texture.Unit[1]._ReallyEnabled,
- fxMesa->TexState.Enabled[1]);
- printf(" EnvMode: GL=0x%x Gr:0x%x\n", ctx->Texture.Unit[1].EnvMode,
- fxMesa->TexState.EnvMode[1]);
- printf(" BaseFmt: GL=0x%x Gr:0x%x\n", base1, fxMesa->TexState.TexFormat[1]);
-}
-#endif
-
-/*
- * When we're only using a single texture unit, we always use the 0th
- * Glide/hardware unit, regardless if it's GL_TEXTURE0_ARB or GL_TEXTURE1_ARB
- * that's enalbed.
- * Input: ctx - the context
- * unit - the OpenGL texture unit to use.
- */
-static void setupTextureSingleTMU(struct gl_context * ctx, GLuint unit)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxTexInfo *ti;
- struct gl_texture_object *tObj;
- int tmu;
- GLenum envMode, baseFormat;
-
- tObj = ctx->Texture.Unit[unit]._Current;
- if (tObj->Image[0][tObj->BaseLevel]->Border > 0) {
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_BORDER, GL_TRUE);
- return;
- }
-
- setupSingleTMU(fxMesa, tObj);
-
- ti = TDFX_TEXTURE_DATA(tObj);
- if (ti->whichTMU == TDFX_TMU_BOTH)
- tmu = TDFX_TMU0;
- else
- tmu = ti->whichTMU;
-
- if (fxMesa->tmuSrc != tmu) {
- selectSingleTMUSrc(fxMesa, tmu, ti->LODblend);
- }
-
- if (ti->reloadImages)
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_IMAGES;
-
- /* Check if we really need to update the texenv state */
- envMode = ctx->Texture.Unit[unit].EnvMode;
- baseFormat = tObj->Image[0][tObj->BaseLevel]->_BaseFormat;
-
- if (TDFX_IS_NAPALM(fxMesa)) {
- /* see if we really need to update the unit */
- if (1/*fxMesa->TexState.Enabled[unit] != ctx->Texture.Unit[unit]._ReallyEnabled ||
- envMode != fxMesa->TexState.EnvMode[0] ||
- envMode == GL_COMBINE_EXT ||
- baseFormat != fxMesa->TexState.TexFormat[0]*/) {
- struct tdfx_texcombine_ext *otherEnv;
- if (!SetupTexEnvNapalm(ctx, GL_TRUE,
- &ctx->Texture.Unit[unit], baseFormat,
- &fxMesa->TexCombineExt[0])) {
- /* software fallback */
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_TRUE);
- }
- /* disable other unit */
- otherEnv = &fxMesa->TexCombineExt[1];
- otherEnv->Color.SourceA = GR_CMBX_ZERO;
- otherEnv->Color.ModeA = GR_FUNC_MODE_ZERO;
- otherEnv->Color.SourceB = GR_CMBX_ZERO;
- otherEnv->Color.ModeB = GR_FUNC_MODE_ZERO;
- otherEnv->Color.SourceC = GR_CMBX_ZERO;
- otherEnv->Color.InvertC = FXFALSE;
- otherEnv->Color.SourceD = GR_CMBX_ZERO;
- otherEnv->Color.InvertD = FXFALSE;
- otherEnv->Color.Shift = 0;
- otherEnv->Color.Invert = FXFALSE;
- otherEnv->Alpha.SourceA = GR_CMBX_ITALPHA;
- otherEnv->Alpha.ModeA = GR_FUNC_MODE_ZERO;
- otherEnv->Alpha.SourceB = GR_CMBX_ITALPHA;
- otherEnv->Alpha.ModeB = GR_FUNC_MODE_ZERO;
- otherEnv->Alpha.SourceC = GR_CMBX_ZERO;
- otherEnv->Alpha.InvertC = FXFALSE;
- otherEnv->Alpha.SourceD = GR_CMBX_ZERO;
- otherEnv->Alpha.InvertD = FXFALSE;
- otherEnv->Alpha.Shift = 0;
- otherEnv->Alpha.Invert = FXFALSE;
-
-#if 0/*JJJ*/
- fxMesa->TexState.Enabled[unit] = ctx->Texture.Unit[unit]._ReallyEnabled;
- fxMesa->TexState.EnvMode[0] = envMode;
- fxMesa->TexState.TexFormat[0] = baseFormat;
- fxMesa->TexState.EnvMode[1] = 0;
- fxMesa->TexState.TexFormat[1] = 0;
-#endif
- }
- }
- else {
- /* Voodoo3 */
-
- /* see if we really need to update the unit */
- if (1/*fxMesa->TexState.Enabled[unit] != ctx->Texture.Unit[unit]._ReallyEnabled ||
- envMode != fxMesa->TexState.EnvMode[0] ||
- envMode == GL_COMBINE_EXT ||
- baseFormat != fxMesa->TexState.TexFormat[0]*/) {
- if (!SetupSingleTexEnvVoodoo3(ctx, unit, envMode, baseFormat)) {
- /* software fallback */
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_TRUE);
- }
-#if 0/*JJJ*/
- fxMesa->TexState.Enabled[unit] = ctx->Texture.Unit[unit]._ReallyEnabled;
- fxMesa->TexState.EnvMode[0] = envMode;
- fxMesa->TexState.TexFormat[0] = baseFormat;
- fxMesa->TexState.EnvMode[1] = 0;
- fxMesa->TexState.TexFormat[1] = 0;
-#endif
- }
- }
-}
-
-
-static void
-setupDoubleTMU(tdfxContextPtr fxMesa,
- struct gl_texture_object *tObj0,
- struct gl_texture_object *tObj1)
-{
-#define T0_NOT_IN_TMU 0x01
-#define T1_NOT_IN_TMU 0x02
-#define T0_IN_TMU0 0x04
-#define T1_IN_TMU0 0x08
-#define T0_IN_TMU1 0x10
-#define T1_IN_TMU1 0x20
-
- const struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- const struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
- const struct gl_context *ctx = fxMesa->glCtx;
- tdfxTexInfo *ti0 = TDFX_TEXTURE_DATA(tObj0);
- tdfxTexInfo *ti1 = TDFX_TEXTURE_DATA(tObj1);
- GLuint tstate = 0;
- int tmu0 = 0, tmu1 = 1;
-
- if (shared->umaTexMemory) {
- if (!ti0->isInTM) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj0, TDFX_TMU0);
- assert(ti0->isInTM);
- }
- if (!ti1->isInTM) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj1, TDFX_TMU0);
- assert(ti1->isInTM);
- }
- }
- else {
- /* We shouldn't need to do this. There is something wrong with
- multitexturing when the TMUs are swapped. So, we're forcing
- them to always be loaded correctly. !!! */
- if (ti0->whichTMU == TDFX_TMU1)
- tdfxTMMoveOutTM_NoLock(fxMesa, tObj0);
- if (ti1->whichTMU == TDFX_TMU0)
- tdfxTMMoveOutTM_NoLock(fxMesa, tObj1);
-
- if (ti0->isInTM) {
- switch (ti0->whichTMU) {
- case TDFX_TMU0:
- tstate |= T0_IN_TMU0;
- break;
- case TDFX_TMU1:
- tstate |= T0_IN_TMU1;
- break;
- case TDFX_TMU_BOTH:
- tstate |= T0_IN_TMU0 | T0_IN_TMU1;
- break;
- case TDFX_TMU_SPLIT:
- tstate |= T0_NOT_IN_TMU;
- break;
- }
- }
- else
- tstate |= T0_NOT_IN_TMU;
-
- if (ti1->isInTM) {
- switch (ti1->whichTMU) {
- case TDFX_TMU0:
- tstate |= T1_IN_TMU0;
- break;
- case TDFX_TMU1:
- tstate |= T1_IN_TMU1;
- break;
- case TDFX_TMU_BOTH:
- tstate |= T1_IN_TMU0 | T1_IN_TMU1;
- break;
- case TDFX_TMU_SPLIT:
- tstate |= T1_NOT_IN_TMU;
- break;
- }
- }
- else
- tstate |= T1_NOT_IN_TMU;
-
- /* Move texture maps into TMUs */
-
- if (!(((tstate & T0_IN_TMU0) && (tstate & T1_IN_TMU1)) ||
- ((tstate & T0_IN_TMU1) && (tstate & T1_IN_TMU0)))) {
- if (tObj0 == tObj1) {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj1, TDFX_TMU_BOTH);
- }
- else {
- /* Find the minimal way to correct the situation */
- if ((tstate & T0_IN_TMU0) || (tstate & T1_IN_TMU1)) {
- /* We have one in the standard order, setup the other */
- if (tstate & T0_IN_TMU0) {
- /* T0 is in TMU0, put T1 in TMU1 */
- tdfxTMMoveInTM_NoLock(fxMesa, tObj1, TDFX_TMU1);
- }
- else {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj0, TDFX_TMU0);
- }
- /* tmu0 and tmu1 are setup */
- }
- else if ((tstate & T0_IN_TMU1) || (tstate & T1_IN_TMU0)) {
- /* we have one in the reverse order, setup the other */
- if (tstate & T1_IN_TMU0) {
- /* T1 is in TMU0, put T0 in TMU1 */
- tdfxTMMoveInTM_NoLock(fxMesa, tObj0, TDFX_TMU1);
- }
- else {
- tdfxTMMoveInTM_NoLock(fxMesa, tObj1, TDFX_TMU0);
- }
- tmu0 = 1;
- tmu1 = 0;
- }
- else { /* Nothing is loaded */
- tdfxTMMoveInTM_NoLock(fxMesa, tObj0, TDFX_TMU0);
- tdfxTMMoveInTM_NoLock(fxMesa, tObj1, TDFX_TMU1);
- /* tmu0 and tmu1 are setup */
- }
- }
- }
- }
-
- ti0->lastTimeUsed = fxMesa->texBindNumber;
- ti1->lastTimeUsed = fxMesa->texBindNumber;
-
-
- if (!ctx->Texture.SharedPalette) {
- if (ti0->info.format == GR_TEXFMT_P_8) {
- fxMesa->TexPalette.Type = ti0->paltype;
- fxMesa->TexPalette.Data = &(ti0->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
- else if (ti1->info.format == GR_TEXFMT_P_8) {
- fxMesa->TexPalette.Type = ti1->paltype;
- fxMesa->TexPalette.Data = &(ti1->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
- else {
- fxMesa->TexPalette.Data = NULL;
- }
- }
-
- /*
- * Setup Unit 0
- */
- assert(ti0->isInTM);
- assert(ti0->tm[tmu0]);
- fxMesa->TexSource[tmu0].StartAddress = ti0->tm[tmu0]->startAddr;
- fxMesa->TexSource[tmu0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu0].Info = &(ti0->info);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_SOURCE;
-
- if (fxMesa->TexParams[tmu0].sClamp != ti0->sClamp ||
- fxMesa->TexParams[tmu0].tClamp != ti0->tClamp ||
- fxMesa->TexParams[tmu0].minFilt != ti0->minFilt ||
- fxMesa->TexParams[tmu0].magFilt != ti0->magFilt ||
- fxMesa->TexParams[tmu0].mmMode != ti0->mmMode ||
- fxMesa->TexParams[tmu0].LODblend != FXFALSE ||
- fxMesa->TexParams[tmu0].LodBias != ctx->Texture.Unit[tmu0].LodBias) {
- fxMesa->TexParams[tmu0].sClamp = ti0->sClamp;
- fxMesa->TexParams[tmu0].tClamp = ti0->tClamp;
- fxMesa->TexParams[tmu0].minFilt = ti0->minFilt;
- fxMesa->TexParams[tmu0].magFilt = ti0->magFilt;
- fxMesa->TexParams[tmu0].mmMode = ti0->mmMode;
- fxMesa->TexParams[tmu0].LODblend = FXFALSE;
- fxMesa->TexParams[tmu0].LodBias = ctx->Texture.Unit[tmu0].LodBias;
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PARAMS;
- }
-
- /*
- * Setup Unit 1
- */
- if (shared->umaTexMemory) {
- ASSERT(ti1->isInTM);
- ASSERT(ti1->tm[0]);
- fxMesa->TexSource[tmu1].StartAddress = ti1->tm[0]->startAddr;
- fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu1].Info = &(ti1->info);
- }
- else {
- ASSERT(ti1->isInTM);
- ASSERT(ti1->tm[tmu1]);
- fxMesa->TexSource[tmu1].StartAddress = ti1->tm[tmu1]->startAddr;
- fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu1].Info = &(ti1->info);
- }
-
- if (fxMesa->TexParams[tmu1].sClamp != ti1->sClamp ||
- fxMesa->TexParams[tmu1].tClamp != ti1->tClamp ||
- fxMesa->TexParams[tmu1].minFilt != ti1->minFilt ||
- fxMesa->TexParams[tmu1].magFilt != ti1->magFilt ||
- fxMesa->TexParams[tmu1].mmMode != ti1->mmMode ||
- fxMesa->TexParams[tmu1].LODblend != FXFALSE ||
- fxMesa->TexParams[tmu1].LodBias != ctx->Texture.Unit[tmu1].LodBias) {
- fxMesa->TexParams[tmu1].sClamp = ti1->sClamp;
- fxMesa->TexParams[tmu1].tClamp = ti1->tClamp;
- fxMesa->TexParams[tmu1].minFilt = ti1->minFilt;
- fxMesa->TexParams[tmu1].magFilt = ti1->magFilt;
- fxMesa->TexParams[tmu1].mmMode = ti1->mmMode;
- fxMesa->TexParams[tmu1].LODblend = FXFALSE;
- fxMesa->TexParams[tmu1].LodBias = ctx->Texture.Unit[tmu1].LodBias;
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PARAMS;
- }
-
- fxMesa->sScale0 = ti0->sScale;
- fxMesa->tScale0 = ti0->tScale;
- fxMesa->sScale1 = ti1->sScale;
- fxMesa->tScale1 = ti1->tScale;
-
-#undef T0_NOT_IN_TMU
-#undef T1_NOT_IN_TMU
-#undef T0_IN_TMU0
-#undef T1_IN_TMU0
-#undef T0_IN_TMU1
-#undef T1_IN_TMU1
-}
-
-static void setupTextureDoubleTMU(struct gl_context * ctx)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- struct gl_texture_object *tObj0 = ctx->Texture.Unit[1]._Current;
- struct gl_texture_object *tObj1 = ctx->Texture.Unit[0]._Current;
- tdfxTexInfo *ti0 = TDFX_TEXTURE_DATA(tObj0);
- tdfxTexInfo *ti1 = TDFX_TEXTURE_DATA(tObj1);
- struct gl_texture_image *baseImage0 = tObj0->Image[0][tObj0->BaseLevel];
- struct gl_texture_image *baseImage1 = tObj1->Image[0][tObj1->BaseLevel];
-#if 0/*JJJ*/
- const GLenum envMode0 = ctx->Texture.Unit[0].EnvMode;
- const GLenum envMode1 = ctx->Texture.Unit[1].EnvMode;
-#endif
-
- if (baseImage0->Border > 0 || baseImage1->Border > 0) {
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_BORDER, GL_TRUE);
- return;
- }
-
- setupDoubleTMU(fxMesa, tObj0, tObj1);
-
- if (ti0->reloadImages || ti1->reloadImages)
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_IMAGES;
-
- fxMesa->tmuSrc = TDFX_TMU_BOTH;
-
- if (TDFX_IS_NAPALM(fxMesa)) {
- /* Remember, Glide has its texture units numbered in backward
- * order compared to OpenGL.
- */
- GLboolean hw1 = GL_TRUE, hw2 = GL_TRUE;
-
- /* check if we really need to update glide unit 1 */
- if (1/*fxMesa->TexState.Enabled[0] != ctx->Texture.Unit[0]._ReallyEnabled ||
- envMode0 != fxMesa->TexState.EnvMode[1] ||
- envMode0 == GL_COMBINE_EXT ||
- baseImage0->Format != fxMesa->TexState.TexFormat[1] ||
- (fxMesa->Fallback & TDFX_FALLBACK_TEXTURE_ENV)*/) {
- hw1 = SetupTexEnvNapalm(ctx, GL_TRUE, &ctx->Texture.Unit[0],
- baseImage0->_BaseFormat, &fxMesa->TexCombineExt[1]);
-#if 0/*JJJ*/
- fxMesa->TexState.EnvMode[1] = envMode0;
- fxMesa->TexState.TexFormat[1] = baseImage0->_BaseFormat;
- fxMesa->TexState.Enabled[0] = ctx->Texture.Unit[0]._ReallyEnabled;
-#endif
- }
-
- /* check if we really need to update glide unit 0 */
- if (1/*fxMesa->TexState.Enabled[1] != ctx->Texture.Unit[1]._ReallyEnabled ||
- envMode1 != fxMesa->TexState.EnvMode[0] ||
- envMode1 == GL_COMBINE_EXT ||
- baseImage1->_BaseFormat != fxMesa->TexState.TexFormat[0] ||
- (fxMesa->Fallback & TDFX_FALLBACK_TEXTURE_ENV)*/) {
- hw2 = SetupTexEnvNapalm(ctx, GL_FALSE, &ctx->Texture.Unit[1],
- baseImage1->_BaseFormat, &fxMesa->TexCombineExt[0]);
-#if 0/*JJJ*/
- fxMesa->TexState.EnvMode[0] = envMode1;
- fxMesa->TexState.TexFormat[0] = baseImage1->_BaseFormat;
- fxMesa->TexState.Enabled[1] = ctx->Texture.Unit[1]._ReallyEnabled;
-#endif
- }
-
-
- if (!hw1 || !hw2) {
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_TRUE);
- }
- }
- else {
- int unit0, unit1;
- if ((ti0->whichTMU == TDFX_TMU1) || (ti1->whichTMU == TDFX_TMU0))
- unit0 = 1;
- else
- unit0 = 0;
- unit1 = 1 - unit0;
-
- if (1/*fxMesa->TexState.Enabled[0] != ctx->Texture.Unit[0]._ReallyEnabled ||
- fxMesa->TexState.Enabled[1] != ctx->Texture.Unit[1]._ReallyEnabled ||
- envMode0 != fxMesa->TexState.EnvMode[unit0] ||
- envMode0 == GL_COMBINE_EXT ||
- envMode1 != fxMesa->TexState.EnvMode[unit1] ||
- envMode1 == GL_COMBINE_EXT ||
- baseImage0->_BaseFormat != fxMesa->TexState.TexFormat[unit0] ||
- baseImage1->_BaseFormat != fxMesa->TexState.TexFormat[unit1] ||
- (fxMesa->Fallback & TDFX_FALLBACK_TEXTURE_ENV)*/) {
-
- if (!SetupDoubleTexEnvVoodoo3(ctx, unit0,
- ctx->Texture.Unit[0].EnvMode, baseImage0->_BaseFormat,
- ctx->Texture.Unit[1].EnvMode, baseImage1->_BaseFormat)) {
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_TRUE);
- }
-
-#if 0/*JJJ*/
- fxMesa->TexState.EnvMode[unit0] = envMode0;
- fxMesa->TexState.TexFormat[unit0] = baseImage0->_BaseFormat;
- fxMesa->TexState.EnvMode[unit1] = envMode1;
- fxMesa->TexState.TexFormat[unit1] = baseImage1->_BaseFormat;
- fxMesa->TexState.Enabled[0] = ctx->Texture.Unit[0]._ReallyEnabled;
- fxMesa->TexState.Enabled[1] = ctx->Texture.Unit[1]._ReallyEnabled;
-#endif
- }
- }
-}
-
-
-void
-tdfxUpdateTextureState( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_BORDER, GL_FALSE);
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_FALSE);
-
- if (ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT) &&
- ctx->Texture.Unit[1]._ReallyEnabled == 0) {
- LOCK_HARDWARE( fxMesa ); /* XXX remove locking eventually */
- setupTextureSingleTMU(ctx, 0);
- UNLOCK_HARDWARE( fxMesa );
- }
- else if (ctx->Texture.Unit[0]._ReallyEnabled == 0 &&
- ctx->Texture.Unit[1]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT)) {
- LOCK_HARDWARE( fxMesa );
- setupTextureSingleTMU(ctx, 1);
- UNLOCK_HARDWARE( fxMesa );
- }
- else if (ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT) &&
- ctx->Texture.Unit[1]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT)) {
- LOCK_HARDWARE( fxMesa );
- setupTextureDoubleTMU(ctx);
- UNLOCK_HARDWARE( fxMesa );
- }
- else {
- /* disable hardware texturing */
- if (TDFX_IS_NAPALM(fxMesa)) {
- fxMesa->ColorCombineExt.SourceA = GR_CMBX_ITRGB;
- fxMesa->ColorCombineExt.ModeA = GR_FUNC_MODE_X;
- fxMesa->ColorCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.ModeB = GR_FUNC_MODE_ZERO;
- fxMesa->ColorCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertC = FXTRUE;
- fxMesa->ColorCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->ColorCombineExt.InvertD = FXFALSE;
- fxMesa->ColorCombineExt.Shift = 0;
- fxMesa->ColorCombineExt.Invert = FXFALSE;
- fxMesa->AlphaCombineExt.SourceA = GR_CMBX_ITALPHA;
- fxMesa->AlphaCombineExt.ModeA = GR_FUNC_MODE_X;
- fxMesa->AlphaCombineExt.SourceB = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.ModeB = GR_FUNC_MODE_ZERO;
- fxMesa->AlphaCombineExt.SourceC = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertC = FXTRUE;
- fxMesa->AlphaCombineExt.SourceD = GR_CMBX_ZERO;
- fxMesa->AlphaCombineExt.InvertD = FXFALSE;
- fxMesa->AlphaCombineExt.Shift = 0;
- fxMesa->AlphaCombineExt.Invert = FXFALSE;
- }
- else {
- /* Voodoo 3*/
- fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->ColorCombine.Local = GR_COMBINE_LOCAL_ITERATED;
- fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->ColorCombine.Invert = FXFALSE;
- fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
- fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
- fxMesa->AlphaCombine.Local = GR_COMBINE_LOCAL_ITERATED;
- fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
- fxMesa->AlphaCombine.Invert = FXFALSE;
- }
-
- fxMesa->TexState.Enabled[0] = 0;
- fxMesa->TexState.Enabled[1] = 0;
- fxMesa->TexState.EnvMode[0] = 0;
- fxMesa->TexState.EnvMode[1] = 0;
-
- fxMesa->dirty |= TDFX_UPLOAD_COLOR_COMBINE;
- fxMesa->dirty |= TDFX_UPLOAD_ALPHA_COMBINE;
-
- if (ctx->Texture.Unit[0]._ReallyEnabled != 0 ||
- ctx->Texture.Unit[1]._ReallyEnabled != 0) {
- /* software texture (cube map, rect tex, etc */
- FALLBACK(fxMesa, TDFX_FALLBACK_TEXTURE_ENV, GL_TRUE);
- }
- }
-}
-
-
-
-/*
- * This is a special case of texture state update.
- * It's used when we've simply bound a new texture to a texture
- * unit and the new texture has the exact same attributes as the
- * previously bound texture.
- * This is very common in Quake3.
- */
-void
-tdfxUpdateTextureBinding( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- struct gl_texture_object *tObj0 = ctx->Texture.Unit[0]._Current;
- struct gl_texture_object *tObj1 = ctx->Texture.Unit[1]._Current;
- tdfxTexInfo *ti0 = TDFX_TEXTURE_DATA(tObj0);
- tdfxTexInfo *ti1 = TDFX_TEXTURE_DATA(tObj1);
-
- const struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared;
- const struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData;
-
- if (ti0) {
- fxMesa->sScale0 = ti0->sScale;
- fxMesa->tScale0 = ti0->tScale;
- if (ti0->info.format == GR_TEXFMT_P_8) {
- fxMesa->TexPalette.Type = ti0->paltype;
- fxMesa->TexPalette.Data = &(ti0->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
- else if (ti1 && ti1->info.format == GR_TEXFMT_P_8) {
- fxMesa->TexPalette.Type = ti1->paltype;
- fxMesa->TexPalette.Data = &(ti1->palette);
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_PALETTE;
- }
- }
- if (ti1) {
- fxMesa->sScale1 = ti1->sScale;
- fxMesa->tScale1 = ti1->tScale;
- }
-
- if (ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT) &&
- ctx->Texture.Unit[0]._ReallyEnabled == 0) {
- /* Only unit 0 2D enabled */
- if (shared->umaTexMemory) {
- assert(ti0);
- fxMesa->TexSource[0].StartAddress = ti0->tm[0]->startAddr;
- fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[0].Info = &(ti0->info);
- }
- else {
- assert(ti0);
- if (ti0->LODblend && ti0->whichTMU == TDFX_TMU_SPLIT) {
- fxMesa->TexSource[0].StartAddress = ti0->tm[TDFX_TMU0]->startAddr;
- fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_ODD;
- fxMesa->TexSource[0].Info = &(ti0->info);
- fxMesa->TexSource[1].StartAddress = ti0->tm[TDFX_TMU1]->startAddr;
- fxMesa->TexSource[1].EvenOdd = GR_MIPMAPLEVELMASK_EVEN;
- fxMesa->TexSource[1].Info = &(ti0->info);
- }
- else {
- FxU32 tmu;
- if (ti0->whichTMU == TDFX_TMU_BOTH)
- tmu = TDFX_TMU0;
- else
- tmu = ti0->whichTMU;
- fxMesa->TexSource[0].Info = NULL;
- fxMesa->TexSource[1].Info = NULL;
- if (ti0->tm[tmu]) {
- fxMesa->TexSource[tmu].StartAddress = ti0->tm[tmu]->startAddr;
- fxMesa->TexSource[tmu].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu].Info = &(ti0->info);
- }
- }
- }
- }
- else if (ctx->Texture.Unit[0]._ReallyEnabled == 0 &&
- ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT)) {
- /* Only unit 1 2D enabled */
- if (shared->umaTexMemory) {
- fxMesa->TexSource[0].StartAddress = ti1->tm[0]->startAddr;
- fxMesa->TexSource[0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[0].Info = &(ti1->info);
- }
- }
- else if (ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT) &&
- ctx->Texture.Unit[0]._ReallyEnabled & (TEXTURE_1D_BIT|TEXTURE_2D_BIT)) {
- /* Both 2D enabled */
- if (shared->umaTexMemory) {
- const FxU32 tmu0 = 0, tmu1 = 1;
-
- assert(ti0);
- fxMesa->TexSource[tmu0].StartAddress = ti0->tm[0]->startAddr;
- fxMesa->TexSource[tmu0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu0].Info = &(ti0->info);
-
- assert(ti1);
- fxMesa->TexSource[tmu1].StartAddress = ti1->tm[0]->startAddr;
- fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu1].Info = &(ti1->info);
- }
- else {
- const FxU32 tmu0 = 0, tmu1 = 1;
-
- assert(ti0);
- fxMesa->TexSource[tmu0].StartAddress = ti0->tm[tmu0]->startAddr;
- fxMesa->TexSource[tmu0].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu0].Info = &(ti0->info);
-
- assert(ti1);
- fxMesa->TexSource[tmu1].StartAddress = ti1->tm[tmu1]->startAddr;
- fxMesa->TexSource[tmu1].EvenOdd = GR_MIPMAPLEVELMASK_BOTH;
- fxMesa->TexSource[tmu1].Info = &(ti1->info);
- }
- }
-
-
- fxMesa->dirty |= TDFX_UPLOAD_TEXTURE_SOURCE;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_texstate.h b/src/mesa/drivers/dri/tdfx/tdfx_texstate.h
deleted file mode 100644
index 92ac3a37eb9..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_texstate.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Original rewrite:
- * Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- * Brian Paul <brianp@valinux.com>
- *
- */
-
-#ifndef __TDFX_TEXSTATE_H__
-#define __TDFX_TEXSTATE_H__
-
-extern void tdfxUpdateTextureState( struct gl_context *ctx );
-extern void tdfxUpdateTextureBinding( struct gl_context *ctx );
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tris.c b/src/mesa/drivers/dri/tdfx/tdfx_tris.c
deleted file mode 100644
index 1f8cf6cde19..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_tris.c
+++ /dev/null
@@ -1,1291 +0,0 @@
-/* -*- 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.
- */
-
-/* New fixes:
- * Daniel Borca <dborca@users.sourceforge.net>, 19 Jul 2004
- *
- * Authors:
- * Keith Whitwell <keith@tungstengraphics.com>
- */
-
-#include "main/glheader.h"
-#include "main/mtypes.h"
-#include "main/macros.h"
-#include "main/colormac.h"
-
-#include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "swrast_setup/ss_context.h"
-#include "tnl/t_context.h"
-#include "tnl/t_pipeline.h"
-
-#include "tdfx_tris.h"
-#include "tdfx_state.h"
-#include "tdfx_vb.h"
-#include "tdfx_lock.h"
-#include "tdfx_render.h"
-
-
-static void tdfxRasterPrimitive( struct gl_context *ctx, GLenum prim );
-static void tdfxRenderPrimitive( struct gl_context *ctx, GLenum prim );
-
-static GLenum reduced_prim[GL_POLYGON+1] = {
- GL_POINTS,
- GL_LINES,
- GL_LINES,
- GL_LINES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES
-};
-
-/***********************************************************************
- * Macros for t_dd_tritmp.h to draw basic primitives *
- ***********************************************************************/
-
-#define TRI( a, b, c ) \
-do { \
- if (DO_FALLBACK) \
- fxMesa->draw_triangle( fxMesa, a, b, c ); \
- else \
- fxMesa->Glide.grDrawTriangle( a, b, c ); \
-} while (0) \
-
-#define QUAD( a, b, c, d ) \
-do { \
- if (DO_FALLBACK) { \
- fxMesa->draw_triangle( fxMesa, a, b, d ); \
- fxMesa->draw_triangle( fxMesa, b, c, d ); \
- } else { \
- tdfxVertex *_v_[4]; \
- _v_[0] = d; \
- _v_[1] = a; \
- _v_[2] = b; \
- _v_[3] = c; \
- fxMesa->Glide.grDrawVertexArray(GR_TRIANGLE_FAN, 4, _v_);\
- /*fxMesa->Glide.grDrawTriangle( a, b, d );*/\
- /*fxMesa->Glide.grDrawTriangle( b, c, d );*/\
- } \
-} while (0)
-
-#define LINE( v0, v1 ) \
-do { \
- if (DO_FALLBACK) \
- fxMesa->draw_line( fxMesa, v0, v1 ); \
- else { \
- v0->x += LINE_X_OFFSET - TRI_X_OFFSET; \
- v0->y += LINE_Y_OFFSET - TRI_Y_OFFSET; \
- v1->x += LINE_X_OFFSET - TRI_X_OFFSET; \
- v1->y += LINE_Y_OFFSET - TRI_Y_OFFSET; \
- fxMesa->Glide.grDrawLine( v0, v1 ); \
- v0->x -= LINE_X_OFFSET - TRI_X_OFFSET; \
- v0->y -= LINE_Y_OFFSET - TRI_Y_OFFSET; \
- v1->x -= LINE_X_OFFSET - TRI_X_OFFSET; \
- v1->y -= LINE_Y_OFFSET - TRI_Y_OFFSET; \
- } \
-} while (0)
-
-#define POINT( v0 ) \
-do { \
- if (DO_FALLBACK) \
- fxMesa->draw_point( fxMesa, v0 ); \
- else { \
- v0->x += PNT_X_OFFSET - TRI_X_OFFSET; \
- v0->y += PNT_Y_OFFSET - TRI_Y_OFFSET; \
- fxMesa->Glide.grDrawPoint( v0 ); \
- v0->x -= PNT_X_OFFSET - TRI_X_OFFSET; \
- v0->y -= PNT_Y_OFFSET - TRI_Y_OFFSET; \
- } \
-} while (0)
-
-
-/***********************************************************************
- * Fallback to swrast for basic primitives *
- ***********************************************************************/
-
-/* Build an SWvertex from a hardware vertex.
- *
- * This code is hit only when a mix of accelerated and unaccelerated
- * primitives are being drawn, and only for the unaccelerated
- * primitives.
- */
-static void
-tdfx_translate_vertex( struct gl_context *ctx, const tdfxVertex *src, SWvertex *dst)
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if (fxMesa->vertexFormat == TDFX_LAYOUT_TINY) {
- dst->attrib[FRAG_ATTRIB_WPOS][0] = src->x - fxMesa->x_offset;
- dst->attrib[FRAG_ATTRIB_WPOS][1] = src->y - (fxMesa->screen_height - fxMesa->height - fxMesa->y_offset);
- dst->attrib[FRAG_ATTRIB_WPOS][2] = src->z;
- dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
-
- dst->color[0] = src->color[2];
- dst->color[1] = src->color[1];
- dst->color[2] = src->color[0];
- dst->color[3] = src->color[3];
- }
- else {
- GLfloat w = 1.0 / src->rhw;
-
- dst->attrib[FRAG_ATTRIB_WPOS][0] = src->x - fxMesa->x_offset;
- dst->attrib[FRAG_ATTRIB_WPOS][1] = src->y - (fxMesa->screen_height - fxMesa->height - fxMesa->y_offset);
- dst->attrib[FRAG_ATTRIB_WPOS][2] = src->z;
- dst->attrib[FRAG_ATTRIB_WPOS][3] = src->rhw;
-
- dst->color[0] = src->color[2];
- dst->color[1] = src->color[1];
- dst->color[2] = src->color[0];
- dst->color[3] = src->color[3];
-
- dst->attrib[FRAG_ATTRIB_TEX0][0] = 1.0 / fxMesa->sScale0 * w * src->tu0;
- dst->attrib[FRAG_ATTRIB_TEX0][1] = 1.0 / fxMesa->tScale0 * w * src->tv0;
- if (fxMesa->vertexFormat == TDFX_LAYOUT_PROJ1 || fxMesa->vertexFormat == TDFX_LAYOUT_PROJ2) {
- dst->attrib[FRAG_ATTRIB_TEX0][3] = w * src->tq0;
- } else {
- dst->attrib[FRAG_ATTRIB_TEX0][3] = 1.0;
- }
-
- if (fxMesa->SetupIndex & TDFX_TEX1_BIT) {
- dst->attrib[FRAG_ATTRIB_TEX1][0] = 1.0 / fxMesa->sScale1 * w * src->tu1;
- dst->attrib[FRAG_ATTRIB_TEX1][1] = 1.0 / fxMesa->tScale1 * w * src->tv1;
- if (fxMesa->vertexFormat == TDFX_LAYOUT_PROJ2) {
- dst->attrib[FRAG_ATTRIB_TEX1][3] = w * src->tq1;
- } else {
- dst->attrib[FRAG_ATTRIB_TEX1][3] = 1.0;
- }
- }
- }
-
- dst->pointSize = ctx->Point.Size;
-}
-
-
-static void
-tdfx_fallback_tri( tdfxContextPtr fxMesa,
- tdfxVertex *v0,
- tdfxVertex *v1,
- tdfxVertex *v2 )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- SWvertex v[3];
- tdfx_translate_vertex( ctx, v0, &v[0] );
- tdfx_translate_vertex( ctx, v1, &v[1] );
- tdfx_translate_vertex( ctx, v2, &v[2] );
- _swrast_Triangle( ctx, &v[0], &v[1], &v[2] );
-}
-
-
-static void
-tdfx_fallback_line( tdfxContextPtr fxMesa,
- tdfxVertex *v0,
- tdfxVertex *v1 )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- SWvertex v[2];
- tdfx_translate_vertex( ctx, v0, &v[0] );
- tdfx_translate_vertex( ctx, v1, &v[1] );
- _swrast_Line( ctx, &v[0], &v[1] );
-}
-
-
-static void
-tdfx_fallback_point( tdfxContextPtr fxMesa,
- tdfxVertex *v0 )
-{
- struct gl_context *ctx = fxMesa->glCtx;
- SWvertex v[1];
- tdfx_translate_vertex( ctx, v0, &v[0] );
- _swrast_Point( ctx, &v[0] );
-}
-
-/***********************************************************************
- * Functions to draw basic primitives *
- ***********************************************************************/
-
-static void tdfx_print_vertex( struct gl_context *ctx, const tdfxVertex *v )
-{
- tdfxContextPtr tmesa = TDFX_CONTEXT( ctx );
-
- fprintf(stderr, "vertex at %p\n", (void *)v);
-
- if (tmesa->vertexFormat == TDFX_LAYOUT_TINY) {
- fprintf(stderr, "x %f y %f z %f\n", v->x, v->y, v->z);
- }
- else {
- fprintf(stderr, "x %f y %f z %f oow %f\n",
- v->x, v->y, v->z, v->rhw);
- }
- fprintf(stderr, "r %d g %d b %d a %d\n",
- v->color[0],
- v->color[1],
- v->color[2],
- v->color[3]);
-
- fprintf(stderr, "\n");
-}
-
-#define DO_FALLBACK 0
-
-/* Need to do clip loop at each triangle when mixing swrast and hw
- * rendering. These functions are only used when mixed-mode rendering
- * is occurring.
- */
-static void tdfx_draw_triangle( tdfxContextPtr fxMesa,
- tdfxVertexPtr v0,
- tdfxVertexPtr v1,
- tdfxVertexPtr v2 )
-{
-/* fprintf(stderr, "%s\n", __FUNCTION__); */
-/* tdfx_print_vertex( fxMesa->glCtx, v0 ); */
-/* tdfx_print_vertex( fxMesa->glCtx, v1 ); */
-/* tdfx_print_vertex( fxMesa->glCtx, v2 ); */
- BEGIN_CLIP_LOOP_LOCKED(fxMesa) {
- TRI( v0, v1, v2 );
- } END_CLIP_LOOP_LOCKED(fxMesa);
-}
-
-static void tdfx_draw_line( tdfxContextPtr fxMesa,
- tdfxVertexPtr v0,
- tdfxVertexPtr v1 )
-{
- /* No support for wide lines (avoid wide/aa line fallback).
- */
- BEGIN_CLIP_LOOP_LOCKED(fxMesa) {
- LINE(v0, v1);
- } END_CLIP_LOOP_LOCKED(fxMesa);
-}
-
-static void tdfx_draw_point( tdfxContextPtr fxMesa,
- tdfxVertexPtr v0 )
-{
- /* No support for wide points.
- */
- BEGIN_CLIP_LOOP_LOCKED(fxMesa) {
- POINT( v0 );
- } END_CLIP_LOOP_LOCKED(fxMesa);
-}
-
-#undef DO_FALLBACK
-
-
-#define TDFX_UNFILLED_BIT 0x1
-#define TDFX_OFFSET_BIT 0x2
-#define TDFX_TWOSIDE_BIT 0x4
-#define TDFX_FLAT_BIT 0x8
-#define TDFX_FALLBACK_BIT 0x10
-#define TDFX_MAX_TRIFUNC 0x20
-
-static struct {
- tnl_points_func points;
- tnl_line_func line;
- tnl_triangle_func triangle;
- tnl_quad_func quad;
-} rast_tab[TDFX_MAX_TRIFUNC];
-
-#define DO_FALLBACK (IND & TDFX_FALLBACK_BIT)
-#define DO_OFFSET (IND & TDFX_OFFSET_BIT)
-#define DO_UNFILLED (IND & TDFX_UNFILLED_BIT)
-#define DO_TWOSIDE (IND & TDFX_TWOSIDE_BIT)
-#define DO_FLAT (IND & TDFX_FLAT_BIT)
-#define DO_TRI 1
-#define DO_QUAD 1
-#define DO_LINE 1
-#define DO_POINTS 1
-#define DO_FULL_QUAD 1
-
-#define HAVE_SPEC 0
-#define HAVE_HW_FLATSHADE 0
-#define HAVE_BACK_COLORS 0
-#define VERTEX tdfxVertex
-#define TAB rast_tab
-
-#define DEPTH_SCALE 1.0
-#define UNFILLED_TRI unfilled_tri
-#define UNFILLED_QUAD unfilled_quad
-#define VERT_X(_v) _v->x
-#define VERT_Y(_v) _v->y
-#define VERT_Z(_v) _v->z
-#define AREA_IS_CCW( a ) (a < 0)
-#define GET_VERTEX(e) (fxMesa->verts + (e))
-
-#define VERT_SET_RGBA( dst, f ) \
-do { \
- UNCLAMPED_FLOAT_TO_UBYTE(dst->color[2], f[0]);\
- UNCLAMPED_FLOAT_TO_UBYTE(dst->color[1], f[1]);\
- UNCLAMPED_FLOAT_TO_UBYTE(dst->color[0], f[2]);\
- UNCLAMPED_FLOAT_TO_UBYTE(dst->color[3], f[3]);\
-} while (0)
-
-#define VERT_COPY_RGBA( v0, v1 ) \
- *(GLuint *)&v0->color = *(GLuint *)&v1->color
-
-#define VERT_SAVE_RGBA( idx ) \
- *(GLuint *)&color[idx] = *(GLuint *)&v[idx]->color
-
-#define VERT_RESTORE_RGBA( idx ) \
- *(GLuint *)&v[idx]->color = *(GLuint *)&color[idx]
-
-#define LOCAL_VARS(n) \
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); \
- GLubyte color[n][4]; \
- (void) color;
-
-
-
-/***********************************************************************
- * Functions to draw basic unfilled primitives *
- ***********************************************************************/
-
-#define RASTERIZE(x) if (fxMesa->raster_primitive != reduced_prim[x]) \
- tdfxRasterPrimitive( ctx, reduced_prim[x] )
-#define RENDER_PRIMITIVE fxMesa->render_primitive
-#define IND TDFX_FALLBACK_BIT
-#define TAG(x) x
-#include "tnl_dd/t_dd_unfilled.h"
-#undef IND
-
-/***********************************************************************
- * Functions to draw GL primitives *
- ***********************************************************************/
-
-#define IND (0)
-#define TAG(x) x
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT)
-#define TAG(x) x##_offset
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT)
-#define TAG(x) x##_twoside
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT)
-#define TAG(x) x##_twoside_offset
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_UNFILLED_BIT)
-#define TAG(x) x##_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT)
-#define TAG(x) x##_offset_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_UNFILLED_BIT)
-#define TAG(x) x##_twoside_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT)
-#define TAG(x) x##_twoside_offset_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_FALLBACK_BIT)
-#define TAG(x) x##_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_offset_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_twoside_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_twoside_offset_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_offset_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT)
-#define TAG(x) x##_twoside_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT| \
- TDFX_FALLBACK_BIT)
-#define TAG(x) x##_twoside_offset_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-
-/* Tdfx doesn't support provoking-vertex flat-shading?
- */
-#define IND (TDFX_FLAT_BIT)
-#define TAG(x) x##_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_offset_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_offset_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_UNFILLED_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_unfilled_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_offset_unfilled_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_UNFILLED_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_unfilled_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_offset_unfilled_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_offset_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_offset_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_unfilled_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_offset_unfilled_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_UNFILLED_BIT|TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_unfilled_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (TDFX_TWOSIDE_BIT|TDFX_OFFSET_BIT|TDFX_UNFILLED_BIT| \
- TDFX_FALLBACK_BIT|TDFX_FLAT_BIT)
-#define TAG(x) x##_twoside_offset_unfilled_fallback_flat
-#include "tnl_dd/t_dd_tritmp.h"
-
-
-static void init_rast_tab( void )
-{
- init();
- init_offset();
- init_twoside();
- init_twoside_offset();
- init_unfilled();
- init_offset_unfilled();
- init_twoside_unfilled();
- init_twoside_offset_unfilled();
- init_fallback();
- init_offset_fallback();
- init_twoside_fallback();
- init_twoside_offset_fallback();
- init_unfilled_fallback();
- init_offset_unfilled_fallback();
- init_twoside_unfilled_fallback();
- init_twoside_offset_unfilled_fallback();
-
- init_flat();
- init_offset_flat();
- init_twoside_flat();
- init_twoside_offset_flat();
- init_unfilled_flat();
- init_offset_unfilled_flat();
- init_twoside_unfilled_flat();
- init_twoside_offset_unfilled_flat();
- init_fallback_flat();
- init_offset_fallback_flat();
- init_twoside_fallback_flat();
- init_twoside_offset_fallback_flat();
- init_unfilled_fallback_flat();
- init_offset_unfilled_fallback_flat();
- init_twoside_unfilled_fallback_flat();
- init_twoside_offset_unfilled_fallback_flat();
-}
-
-
-/**********************************************************************/
-/* Render whole begin/end objects */
-/**********************************************************************/
-
-
-/* Accelerate vertex buffer rendering when renderindex == 0 and
- * there is no clipping.
- */
-#define INIT(x) tdfxRenderPrimitive( ctx, x )
-
-static void tdfx_render_vb_points( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- GLint i;
- (void) flags;
-
- INIT(GL_POINTS);
-
- /* Adjust point coords */
- for (i = start; i < count; i++) {
- fxVB[i].x += PNT_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y += PNT_Y_OFFSET - TRI_Y_OFFSET;
- }
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_POINTS, count-start,
- fxVB + start, sizeof(tdfxVertex));
- /* restore point coords */
- for (i = start; i < count; i++) {
- fxVB[i].x -= PNT_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y -= PNT_Y_OFFSET - TRI_Y_OFFSET;
- }
-}
-
-static void tdfx_render_vb_line_strip( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- GLint i;
- (void) flags;
-
- INIT(GL_LINE_STRIP);
-
- /* adjust line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x += LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y += LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_LINE_STRIP, count-start,
- fxVB + start, sizeof(tdfxVertex) );
-
- /* restore line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x -= LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y -= LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-}
-
-static void tdfx_render_vb_line_loop( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- GLint i;
- GLint j = start;
- (void) flags;
-
- INIT(GL_LINE_LOOP);
-
- if (!(flags & PRIM_BEGIN)) {
- j++;
- }
-
- /* adjust line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x += LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y += LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_LINE_STRIP, count-j,
- fxVB + j, sizeof(tdfxVertex));
-
- if (flags & PRIM_END)
- fxMesa->Glide.grDrawLine( fxVB + (count - 1),
- fxVB + start );
-
- /* restore line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x -= LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y -= LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-}
-
-static void tdfx_render_vb_lines( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- GLint i;
- (void) flags;
-
- INIT(GL_LINES);
-
- /* adjust line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x += LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y += LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_LINES, count-start,
- fxVB + start, sizeof(tdfxVertex));
-
- /* restore line coords */
- for (i = start; i < count; i++) {
- fxVB[i].x -= LINE_X_OFFSET - TRI_X_OFFSET;
- fxVB[i].y -= LINE_Y_OFFSET - TRI_Y_OFFSET;
- }
-}
-
-static void tdfx_render_vb_triangles( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- (void) flags;
-
- INIT(GL_TRIANGLES);
-
-#if 0
- /* [dBorca]
- * apparently, this causes troubles with some programs (GLExcess);
- * might be a bug in Glide... However, "grDrawVertexArrayContiguous"
- * eventually calls "grDrawTriangle" for GR_TRIANGLES, so we're better
- * off doing it by hand...
- */
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_TRIANGLES, count-start,
- fxVB + start, sizeof(tdfxVertex));
-#else
- {
- GLuint j;
- for (j=start+2; j<count; j+=3) {
- fxMesa->Glide.grDrawTriangle(fxVB + (j-2), fxVB + (j-1), fxVB + j);
- }
- }
-#endif
-}
-
-
-static void tdfx_render_vb_tri_strip( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- int mode;
- (void) flags;
-
- INIT(GL_TRIANGLE_STRIP);
-
-/* fprintf(stderr, "%s/%d\n", __FUNCTION__, 1<<shift); */
-/* if(!prevLockLine) abort(); */
-
- mode = GR_TRIANGLE_STRIP;
-
- fxMesa->Glide.grDrawVertexArrayContiguous( mode, count-start,
- fxVB + start, sizeof(tdfxVertex));
-}
-
-
-static void tdfx_render_vb_tri_fan( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- (void) flags;
-
- INIT(GL_TRIANGLE_FAN);
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_TRIANGLE_FAN, count-start,
- fxVB + start, sizeof(tdfxVertex) );
-}
-
-static void tdfx_render_vb_quads( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- GLuint i;
- (void) flags;
-
- INIT(GL_QUADS);
-
- for (i = start + 3 ; i < count ; i += 4 ) {
-#define VERT(x) (fxVB + (x))
- tdfxVertex *_v_[4];
- _v_[0] = VERT(i);
- _v_[1] = VERT(i-3);
- _v_[2] = VERT(i-2);
- _v_[3] = VERT(i-1);
- fxMesa->Glide.grDrawVertexArray(GR_TRIANGLE_FAN, 4, _v_);
- /*fxMesa->Glide.grDrawTriangle( VERT(i-3), VERT(i-2), VERT(i) );*/
- /*fxMesa->Glide.grDrawTriangle( VERT(i-2), VERT(i-1), VERT(i) );*/
-#undef VERT
- }
-}
-
-static void tdfx_render_vb_quad_strip( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- (void) flags;
-
- INIT(GL_QUAD_STRIP);
-
- count -= (count-start)&1;
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_TRIANGLE_STRIP,
- count-start, fxVB + start, sizeof(tdfxVertex));
-}
-
-static void tdfx_render_vb_poly( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- tdfxVertex *fxVB = fxMesa->verts;
- (void) flags;
-
- INIT(GL_POLYGON);
-
- fxMesa->Glide.grDrawVertexArrayContiguous( GR_POLYGON, count-start,
- fxVB + start, sizeof(tdfxVertex));
-}
-
-static void tdfx_render_vb_noop( struct gl_context *ctx,
- GLuint start,
- GLuint count,
- GLuint flags )
-{
- (void) (ctx && start && count && flags);
-}
-
-static void (*tdfx_render_tab_verts[GL_POLYGON+2])(struct gl_context *,
- GLuint,
- GLuint,
- GLuint) =
-{
- tdfx_render_vb_points,
- tdfx_render_vb_lines,
- tdfx_render_vb_line_loop,
- tdfx_render_vb_line_strip,
- tdfx_render_vb_triangles,
- tdfx_render_vb_tri_strip,
- tdfx_render_vb_tri_fan,
- tdfx_render_vb_quads,
- tdfx_render_vb_quad_strip,
- tdfx_render_vb_poly,
- tdfx_render_vb_noop,
-};
-#undef INIT
-
-
-/**********************************************************************/
-/* Render whole (indexed) begin/end objects */
-/**********************************************************************/
-
-
-#define VERT(x) (tdfxVertex *)(vertptr + (x))
-
-#define RENDER_POINTS( start, count ) \
- for ( ; start < count ; start++) \
- fxMesa->Glide.grDrawPoint( VERT(ELT(start)) );
-
-#define RENDER_LINE( v0, v1 ) \
- fxMesa->Glide.grDrawLine( VERT(v0), VERT(v1) )
-
-#define RENDER_TRI( v0, v1, v2 ) \
- fxMesa->Glide.grDrawTriangle( VERT(v0), VERT(v1), VERT(v2) )
-
-#define RENDER_QUAD( v0, v1, v2, v3 ) \
- do { \
- tdfxVertex *_v_[4]; \
- _v_[0] = VERT(v3); \
- _v_[1] = VERT(v0); \
- _v_[2] = VERT(v1); \
- _v_[3] = VERT(v2); \
- fxMesa->Glide.grDrawVertexArray(GR_TRIANGLE_FAN, 4, _v_);\
- /*fxMesa->Glide.grDrawTriangle( VERT(v0), VERT(v1), VERT(v3) );*/\
- /*fxMesa->Glide.grDrawTriangle( VERT(v1), VERT(v2), VERT(v3) );*/\
- } while (0)
-
-#define INIT(x) tdfxRenderPrimitive( ctx, x )
-
-#undef LOCAL_VARS
-#define LOCAL_VARS \
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); \
- tdfxVertex *vertptr = fxMesa->verts; \
- const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
- (void) elt;
-
-#define RESET_STIPPLE
-#define RESET_OCCLUSION
-#define PRESERVE_VB_DEFS
-
-/* Elts, no clipping.
- */
-#undef ELT
-#undef TAG
-#define TAG(x) tdfx_##x##_elts
-#define ELT(x) elt[x]
-#include "tnl_dd/t_dd_rendertmp.h"
-
-/* Verts, no clipping.
- */
-#undef ELT
-#undef TAG
-#define TAG(x) tdfx_##x##_verts
-#define ELT(x) x
-/*#include "tnl_dd/t_dd_rendertmp.h"*/
-
-
-
-/**********************************************************************/
-/* Render clipped primitives */
-/**********************************************************************/
-
-
-
-static void tdfxRenderClippedPoly( struct gl_context *ctx, const GLuint *elts,
- GLuint n )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- struct vertex_buffer *VB = &tnl->vb;
- GLuint prim = fxMesa->render_primitive;
-
- /* Render the new vertices as an unclipped polygon.
- */
- {
- GLuint *tmp = VB->Elts;
- VB->Elts = (GLuint *)elts;
- tnl->Driver.Render.PrimTabElts[GL_POLYGON]( ctx, 0, n, PRIM_BEGIN|PRIM_END );
- VB->Elts = tmp;
- }
-
- /* Restore the render primitive
- */
- if (prim != GL_POLYGON)
- tnl->Driver.Render.PrimitiveNotify( ctx, prim );
-}
-
-static void tdfxRenderClippedLine( struct gl_context *ctx, GLuint ii, GLuint jj )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tnl->Driver.Render.Line( ctx, ii, jj );
-}
-
-static void tdfxFastRenderClippedPoly( struct gl_context *ctx, const GLuint *elts,
- GLuint n )
-{
- int i;
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- tdfxVertex *vertptr = fxMesa->verts;
- if (n == 3) {
- fxMesa->Glide.grDrawTriangle( VERT(elts[0]), VERT(elts[1]), VERT(elts[2]) );
- } else if (n <= 32) {
- tdfxVertex *newvptr[32];
- for (i = 0 ; i < n ; i++) {
- newvptr[i] = VERT(elts[i]);
- }
- fxMesa->Glide.grDrawVertexArray(GR_TRIANGLE_FAN, n, newvptr);
- } else {
- const tdfxVertex *start = VERT(elts[0]);
- for (i = 2 ; i < n ; i++) {
- fxMesa->Glide.grDrawTriangle( start, VERT(elts[i-1]), VERT(elts[i]) );
- }
- }
-}
-
-/**********************************************************************/
-/* Choose render functions */
-/**********************************************************************/
-
-
-#define POINT_FALLBACK (DD_POINT_SMOOTH)
-#define LINE_FALLBACK (DD_LINE_STIPPLE)
-#define TRI_FALLBACK (DD_TRI_SMOOTH)
-#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK|DD_TRI_STIPPLE)
-#define ANY_RASTER_FLAGS (DD_FLATSHADE|DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET| \
- DD_TRI_UNFILLED)
-
-
-/* All state referenced below:
- */
-#define _TDFX_NEW_RENDERSTATE (_DD_NEW_POINT_SMOOTH | \
- _DD_NEW_LINE_STIPPLE | \
- _DD_NEW_TRI_SMOOTH | \
- _DD_NEW_FLATSHADE | \
- _DD_NEW_TRI_UNFILLED | \
- _DD_NEW_TRI_LIGHT_TWOSIDE | \
- _DD_NEW_TRI_OFFSET | \
- _DD_NEW_TRI_STIPPLE | \
- _NEW_POLYGONSTIPPLE)
-
-
-static void tdfxChooseRenderState(struct gl_context *ctx)
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLuint flags = ctx->_TriangleCaps;
- GLuint index = 0;
-
- if (0) {
- fxMesa->draw_point = tdfx_draw_point;
- fxMesa->draw_line = tdfx_draw_line;
- fxMesa->draw_triangle = tdfx_draw_triangle;
- index |= TDFX_FALLBACK_BIT;
- }
-
- if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) {
- if (flags & ANY_RASTER_FLAGS) {
- if (flags & DD_TRI_LIGHT_TWOSIDE) index |= TDFX_TWOSIDE_BIT;
- if (flags & DD_TRI_OFFSET) index |= TDFX_OFFSET_BIT;
- if (flags & DD_TRI_UNFILLED) index |= TDFX_UNFILLED_BIT;
- if (flags & DD_FLATSHADE) index |= TDFX_FLAT_BIT;
- }
-
- fxMesa->draw_point = tdfx_draw_point;
- fxMesa->draw_line = tdfx_draw_line;
- fxMesa->draw_triangle = tdfx_draw_triangle;
-
- /* Hook in fallbacks for specific primitives.
- *
- * DD_TRI_UNFILLED is here because the unfilled_tri functions use
- * fxMesa->draw_tri *always*, and thus can't use the multipass
- * approach to cliprects.
- *
- */
- if (flags & (POINT_FALLBACK|
- LINE_FALLBACK|
- TRI_FALLBACK|
- DD_TRI_STIPPLE|
- DD_TRI_UNFILLED))
- {
- if (flags & POINT_FALLBACK)
- fxMesa->draw_point = tdfx_fallback_point;
-
- if (flags & LINE_FALLBACK)
- fxMesa->draw_line = tdfx_fallback_line;
-
- if (flags & TRI_FALLBACK)
- fxMesa->draw_triangle = tdfx_fallback_tri;
-
- if ((flags & DD_TRI_STIPPLE) && !fxMesa->haveHwStipple)
- fxMesa->draw_triangle = tdfx_fallback_tri;
-
- index |= TDFX_FALLBACK_BIT;
- }
- }
-
- if (fxMesa->RenderIndex != index) {
- fxMesa->RenderIndex = index;
-
- tnl->Driver.Render.Points = rast_tab[index].points;
- tnl->Driver.Render.Line = rast_tab[index].line;
- tnl->Driver.Render.Triangle = rast_tab[index].triangle;
- tnl->Driver.Render.Quad = rast_tab[index].quad;
-
- if (index == 0) {
- tnl->Driver.Render.PrimTabVerts = tdfx_render_tab_verts;
- tnl->Driver.Render.PrimTabElts = tdfx_render_tab_elts;
- tnl->Driver.Render.ClippedLine = line; /* from tritmp.h */
- tnl->Driver.Render.ClippedPolygon = tdfxFastRenderClippedPoly;
- } else {
- tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
- tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
- tnl->Driver.Render.ClippedLine = tdfxRenderClippedLine;
- tnl->Driver.Render.ClippedPolygon = tdfxRenderClippedPoly;
- }
- }
-}
-
-/**********************************************************************/
-/* Use multipass rendering for cliprects */
-/**********************************************************************/
-
-
-
-/* TODO: Benchmark this.
- * TODO: Use single back-buffer cliprect where possible.
- * NOTE: <pass> starts at 1, not zero!
- */
-static GLboolean multipass_cliprect( struct gl_context *ctx, GLuint pass )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- if (pass >= fxMesa->numClipRects)
- return GL_FALSE;
- else {
- fxMesa->Glide.grClipWindow(fxMesa->pClipRects[pass].x1,
- fxMesa->screen_height - fxMesa->pClipRects[pass].y2,
- fxMesa->pClipRects[pass].x2,
- fxMesa->screen_height - fxMesa->pClipRects[pass].y1);
-
- return GL_TRUE;
- }
-}
-
-
-/**********************************************************************/
-/* Runtime render state and callbacks */
-/**********************************************************************/
-
-static void tdfxRunPipeline( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if (fxMesa->new_state) {
- tdfxDDUpdateHwState( ctx );
- }
-
- if (!fxMesa->Fallback && fxMesa->new_gl_state) {
- if (fxMesa->new_gl_state & _TDFX_NEW_RASTERSETUP)
- tdfxChooseVertexState( ctx );
-
- if (fxMesa->new_gl_state & _TDFX_NEW_RENDERSTATE)
- tdfxChooseRenderState( ctx );
-
- fxMesa->new_gl_state = 0;
- }
-
- _tnl_run_pipeline( ctx );
-}
-
-
-static void tdfxRenderStart( struct gl_context *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- tdfxCheckTexSizes( ctx );
-
- LOCK_HARDWARE(fxMesa);
-
- /* Make sure vertex format changes get uploaded before we start
- * sending triangles.
- */
- if (fxMesa->dirty) {
- tdfxEmitHwStateLocked( fxMesa );
- }
-
- if (fxMesa->numClipRects && !(fxMesa->RenderIndex & TDFX_FALLBACK_BIT)) {
- fxMesa->Glide.grClipWindow(fxMesa->pClipRects[0].x1,
- fxMesa->screen_height - fxMesa->pClipRects[0].y2,
- fxMesa->pClipRects[0].x2,
- fxMesa->screen_height - fxMesa->pClipRects[0].y1);
- if (fxMesa->numClipRects > 1)
- tnl->Driver.Render.Multipass = multipass_cliprect;
- else
- tnl->Driver.Render.Multipass = NULL;
- }
- else
- tnl->Driver.Render.Multipass = NULL;
-}
-
-
-
-/* Always called between RenderStart and RenderFinish --> We already
- * hold the lock.
- */
-static void tdfxRasterPrimitive( struct gl_context *ctx, GLenum prim )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- FLUSH_BATCH( fxMesa );
-
- fxMesa->raster_primitive = prim;
-
- tdfxUpdateCull(ctx);
- if ( fxMesa->dirty & TDFX_UPLOAD_CULL ) {
- fxMesa->Glide.grCullMode( fxMesa->CullMode );
- fxMesa->dirty &= ~TDFX_UPLOAD_CULL;
- }
-
- tdfxUpdateStipple(ctx);
- if ( fxMesa->dirty & TDFX_UPLOAD_STIPPLE ) {
- fxMesa->Glide.grStipplePattern ( fxMesa->Stipple.Pattern );
- fxMesa->Glide.grStippleMode ( fxMesa->Stipple.Mode );
- fxMesa->dirty &= ~TDFX_UPLOAD_STIPPLE;
- }
-}
-
-
-
-/* Determine the rasterized primitive when not drawing unfilled
- * polygons.
- *
- * Used only for the default render stage which always decomposes
- * primitives to trianges/lines/points. For the accelerated stage,
- * which renders strips as strips, the equivalent calculations are
- * performed in tdfx_render.c.
- */
-static void tdfxRenderPrimitive( struct gl_context *ctx, GLenum prim )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLuint rprim = reduced_prim[prim];
-
- fxMesa->render_primitive = prim;
-
- if (rprim == GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED))
- return;
-
- if (fxMesa->raster_primitive != rprim) {
- tdfxRasterPrimitive( ctx, rprim );
- }
-}
-
-static void tdfxRenderFinish( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- if (fxMesa->RenderIndex & TDFX_FALLBACK_BIT)
- _swrast_flush( ctx );
-
- UNLOCK_HARDWARE(fxMesa);
-}
-
-
-/**********************************************************************/
-/* Manage total rasterization fallbacks */
-/**********************************************************************/
-
-static char *fallbackStrings[] = {
- "3D/Rect/Cube Texture map",
- "glDrawBuffer(GL_FRONT_AND_BACK)",
- "Separate specular color",
- "glEnable/Disable(GL_STENCIL_TEST)",
- "glRenderMode(selection or feedback)",
- "glLogicOp()",
- "Texture env mode",
- "Texture border",
- "glColorMask",
- "blend mode",
- "line stipple",
- "Rasterization disable"
-};
-
-
-static char *getFallbackString(GLuint bit)
-{
- int i = 0;
- while (bit > 1) {
- i++;
- bit >>= 1;
- }
- return fallbackStrings[i];
-}
-
-
-void tdfxFallback( struct gl_context *ctx, GLuint bit, GLboolean mode )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLuint oldfallback = fxMesa->Fallback;
-
- if (mode) {
- fxMesa->Fallback |= bit;
- if (oldfallback == 0) {
- /*printf("Go to software rendering, bit = 0x%x\n", bit);*/
- FLUSH_BATCH(fxMesa);
- _swsetup_Wakeup( ctx );
- fxMesa->RenderIndex = ~0;
- if (TDFX_DEBUG & DEBUG_VERBOSE_FALL) {
- fprintf(stderr, "Tdfx begin software fallback: 0x%x %s\n",
- bit, getFallbackString(bit));
- }
- }
- }
- else {
- fxMesa->Fallback &= ~bit;
- if (oldfallback == bit) {
- /*printf("Go to hardware rendering, bit = 0x%x\n", bit);*/
- _swrast_flush( ctx );
- tnl->Driver.Render.Start = tdfxRenderStart;
- tnl->Driver.Render.PrimitiveNotify = tdfxRenderPrimitive;
- tnl->Driver.Render.Finish = tdfxRenderFinish;
- tnl->Driver.Render.BuildVertices = tdfxBuildVertices;
- fxMesa->new_gl_state |= (_TDFX_NEW_RENDERSTATE|
- _TDFX_NEW_RASTERSETUP);
- if (TDFX_DEBUG & DEBUG_VERBOSE_FALL) {
- fprintf(stderr, "Tdfx end software fallback: 0x%x %s\n",
- bit, getFallbackString(bit));
- }
- }
- }
-}
-
-
-void tdfxDDInitTriFuncs( struct gl_context *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- static int firsttime = 1;
-
- if (firsttime) {
- init_rast_tab();
- firsttime = 0;
- }
-
- fxMesa->RenderIndex = ~0;
-
- tnl->Driver.RunPipeline = tdfxRunPipeline;
- tnl->Driver.Render.Start = tdfxRenderStart;
- tnl->Driver.Render.Finish = tdfxRenderFinish;
- tnl->Driver.Render.PrimitiveNotify = tdfxRenderPrimitive;
- tnl->Driver.Render.ResetLineStipple = _swrast_ResetLineStipple;
- tnl->Driver.Render.BuildVertices = tdfxBuildVertices;
- tnl->Driver.Render.Multipass = NULL;
-
- (void) tdfx_print_vertex;
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tris.h b/src/mesa/drivers/dri/tdfx/tdfx_tris.h
deleted file mode 100644
index 421b8e1c0d7..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_tris.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- 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.
- */
-
-/*
- * Authors:
- * Keith Whitwell <keith@tungstengraphics.com>
- *
- */
-
-#ifndef TDFX_TRIS_INC
-#define TDFX_TRIS_INC
-
-#include "main/mtypes.h"
-
-extern void tdfxDDInitTriFuncs( struct gl_context *ctx );
-
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_vb.c b/src/mesa/drivers/dri/tdfx/tdfx_vb.c
deleted file mode 100644
index dafb6eccd99..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_vb.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * GLX Hardware Device Driver for Intel i810
- * Copyright (C) 1999 Keith Whitwell
- *
- * 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 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
- * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS 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.
- *
- *
- */
-
-#include "main/glheader.h"
-#include "main/mtypes.h"
-#include "main/imports.h"
-#include "main/macros.h"
-#include "main/colormac.h"
-
-#include "tdfx_context.h"
-#include "tdfx_vb.h"
-#include "tdfx_render.h"
-
-static void copy_pv( struct gl_context *ctx, GLuint edst, GLuint esrc )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- tdfxVertex *dst = fxMesa->verts + edst;
- tdfxVertex *src = fxMesa->verts + esrc;
- *(GLuint *)&dst->color = *(GLuint *)&src->color;
-}
-
-static struct {
- void (*emit)( struct gl_context *, GLuint, GLuint, void * );
- tnl_interp_func interp;
- tnl_copy_pv_func copy_pv;
- GLboolean (*check_tex_sizes)( struct gl_context *ctx );
- GLuint vertex_format;
-} setup_tab[TDFX_MAX_SETUP];
-
-
-
-
-#define GET_COLOR(ptr, idx) ((ptr)->data[idx])
-
-
-static void interp_extras( struct gl_context *ctx,
- GLfloat t,
- GLuint dst, GLuint out, GLuint in,
- GLboolean force_boundary )
-{
- struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
-
- /*fprintf(stderr, "%s\n", __FUNCTION__);*/
-
- if (VB->BackfaceColorPtr) {
- INTERP_4F( t,
- GET_COLOR(VB->BackfaceColorPtr, dst),
- GET_COLOR(VB->BackfaceColorPtr, out),
- GET_COLOR(VB->BackfaceColorPtr, in) );
- }
-
- if (VB->EdgeFlag) {
- VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary;
- }
-
- setup_tab[TDFX_CONTEXT(ctx)->SetupIndex].interp(ctx, t, dst, out, in,
- force_boundary);
-}
-
-static void copy_pv_extras( struct gl_context *ctx, GLuint dst, GLuint src )
-{
- struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
-
- if (VB->BackfaceColorPtr) {
- COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst),
- GET_COLOR(VB->BackfaceColorPtr, src) );
- }
-
- setup_tab[TDFX_CONTEXT(ctx)->SetupIndex].copy_pv(ctx, dst, src);
-}
-
-
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT)
-#define TAG(x) x##_wg
-#include "tdfx_vbtmp.h"
-
-/* Special for tdfx: fog requires w
- */
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT)
-#define TAG(x) x##_wg_fog
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT)
-#define TAG(x) x##_wgt0
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_TEX1_BIT)
-#define TAG(x) x##_wgt0t1
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_PTEX_BIT)
-#define TAG(x) x##_wgpt0
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_TEX1_BIT|\
- TDFX_PTEX_BIT)
-#define TAG(x) x##_wgpt0t1
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_RGBA_BIT)
-#define TAG(x) x##_g
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_TEX0_BIT)
-#define TAG(x) x##_t0
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_TEX0_BIT|TDFX_TEX1_BIT)
-#define TAG(x) x##_t0t1
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_RGBA_BIT|TDFX_TEX0_BIT)
-#define TAG(x) x##_gt0
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_RGBA_BIT|TDFX_TEX0_BIT|TDFX_TEX1_BIT)
-#define TAG(x) x##_gt0t1
-#include "tdfx_vbtmp.h"
-
-
-/* fogc { */
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_FOGC_BIT)
-#define TAG(x) x##_wgf
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_FOGC_BIT)
-#define TAG(x) x##_wgt0f
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_TEX1_BIT|TDFX_FOGC_BIT)
-#define TAG(x) x##_wgt0t1f
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_PTEX_BIT|TDFX_FOGC_BIT)
-#define TAG(x) x##_wgpt0f
-#include "tdfx_vbtmp.h"
-
-#define IND (TDFX_XYZ_BIT|TDFX_RGBA_BIT|TDFX_W_BIT|TDFX_TEX0_BIT|TDFX_TEX1_BIT|\
- TDFX_PTEX_BIT|TDFX_FOGC_BIT)
-#define TAG(x) x##_wgpt0t1f
-#include "tdfx_vbtmp.h"
-/* fogc } */
-
-
-static void init_setup_tab( void )
-{
- init_wg();
- init_wg_fog();
- init_wgt0();
- init_wgt0t1();
- init_wgpt0();
- init_wgpt0t1();
-
- init_g();
- init_t0();
- init_t0t1();
- init_gt0();
- init_gt0t1();
-
- /* fogcoord */
- init_wgf();
- init_wgt0f();
- init_wgt0t1f();
- init_wgpt0f();
- init_wgpt0t1f();
-}
-
-
-void tdfxPrintSetupFlags(char *msg, GLuint flags )
-{
- fprintf(stderr, "%s(%x): %s%s%s%s%s%s\n",
- msg,
- (int)flags,
- (flags & TDFX_XYZ_BIT) ? " xyz," : "",
- (flags & TDFX_W_BIT) ? " w," : "",
- (flags & TDFX_RGBA_BIT) ? " rgba," : "",
- (flags & TDFX_TEX0_BIT) ? " tex-0," : "",
- (flags & TDFX_TEX1_BIT) ? " tex-1," : "",
- (flags & TDFX_FOGC_BIT) ? " fogc," : "");
-}
-
-
-
-void tdfxCheckTexSizes( struct gl_context *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
-
- if (!setup_tab[fxMesa->SetupIndex].check_tex_sizes(ctx)) {
- GLuint ind = fxMesa->SetupIndex |= (TDFX_PTEX_BIT|TDFX_RGBA_BIT);
-
- /* Tdfx handles projective textures nicely; just have to change
- * up to the new vertex format.
- */
- if (setup_tab[ind].vertex_format != fxMesa->vertexFormat) {
- FLUSH_BATCH(fxMesa);
- fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT;
- fxMesa->vertexFormat = setup_tab[ind].vertex_format;
-
- /* This is required as we have just changed the vertex
- * format, so the interp and copy routines must also change.
- * In the unfilled and twosided cases we are using the
- * swrast_setup ones anyway, so leave them in place.
- */
- if (!(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
- tnl->Driver.Render.Interp = setup_tab[fxMesa->SetupIndex].interp;
- tnl->Driver.Render.CopyPV = setup_tab[fxMesa->SetupIndex].copy_pv;
- }
- }
- }
-}
-
-
-void tdfxBuildVertices( struct gl_context *ctx, GLuint start, GLuint end,
- GLuint newinputs )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- tdfxVertex *v = fxMesa->verts + start;
-
- newinputs |= fxMesa->SetupNewInputs;
- fxMesa->SetupNewInputs = 0;
-
- if (!newinputs)
- return;
-
- if (newinputs & VERT_BIT_POS) {
- setup_tab[fxMesa->SetupIndex].emit( ctx, start, end, v );
- } else {
- GLuint ind = 0;
-
- if (newinputs & VERT_BIT_COLOR0)
- ind |= TDFX_RGBA_BIT;
-
- if (newinputs & VERT_BIT_FOG)
- ind |= TDFX_FOGC_BIT;
-
- if (newinputs & VERT_BIT_TEX0)
- ind |= TDFX_TEX0_BIT;
-
- if (newinputs & VERT_BIT_TEX1)
- ind |= TDFX_TEX0_BIT|TDFX_TEX1_BIT;
-
- if (fxMesa->SetupIndex & TDFX_PTEX_BIT)
- ind = ~0;
-
- ind &= fxMesa->SetupIndex;
-
- if (ind) {
- setup_tab[ind].emit( ctx, start, end, v );
- }
- }
-}
-
-
-void tdfxChooseVertexState( struct gl_context *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- GLuint ind = TDFX_XYZ_BIT|TDFX_RGBA_BIT;
-
- fxMesa->tmu_source[0] = 0;
- fxMesa->tmu_source[1] = 1;
-
- if (ctx->Texture._EnabledUnits & 0x2) {
- if (ctx->Texture._EnabledUnits & 0x1) {
- ind |= TDFX_TEX1_BIT;
- }
- ind |= TDFX_W_BIT|TDFX_TEX0_BIT;
- fxMesa->tmu_source[0] = 1;
- fxMesa->tmu_source[1] = 0;
- } else if (ctx->Texture._EnabledUnits & 0x1) {
- /* unit 0 enabled */
- ind |= TDFX_W_BIT|TDFX_TEX0_BIT;
- } else if (fxMesa->Fog.Mode != GR_FOG_DISABLE) {
- ind |= TDFX_W_BIT;
- }
-
- if (fxMesa->Fog.Mode == GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT) {
- ind |= TDFX_FOGC_BIT;
- }
-
- fxMesa->SetupIndex = ind;
-
- if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
- tnl->Driver.Render.Interp = interp_extras;
- tnl->Driver.Render.CopyPV = copy_pv_extras;
- } else {
- tnl->Driver.Render.Interp = setup_tab[ind].interp;
- tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
- }
-
- if (setup_tab[ind].vertex_format != fxMesa->vertexFormat) {
- FLUSH_BATCH(fxMesa);
- fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT;
- fxMesa->vertexFormat = setup_tab[ind].vertex_format;
- }
-}
-
-
-
-void tdfxInitVB( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- GLuint size = TNL_CONTEXT(ctx)->vb.Size;
- static int firsttime = 1;
- if (firsttime) {
- init_setup_tab();
- firsttime = 0;
- }
-
- fxMesa->verts = _mesa_align_malloc(size * sizeof(tdfxVertex), 32);
- fxMesa->vertexFormat = TDFX_LAYOUT_TINY;
- fxMesa->SetupIndex = TDFX_XYZ_BIT|TDFX_RGBA_BIT;
-}
-
-
-void tdfxFreeVB( struct gl_context *ctx )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- if (fxMesa->verts) {
- _mesa_align_free(fxMesa->verts);
- fxMesa->verts = 0;
- }
-}
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_vb.h b/src/mesa/drivers/dri/tdfx/tdfx_vb.h
deleted file mode 100644
index 238a076d87a..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_vb.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * GLX Hardware Device Driver for Intel tdfx
- * Copyright (C) 1999 Keith Whitwell
- *
- * 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 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
- * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS 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.
- *
- *
- */
-
-#ifndef TDFXVB_INC
-#define TDFXVB_INC
-
-#include "main/mtypes.h"
-
-#include "tnl/tnl.h"
-#include "tnl/t_context.h"
-#include "math/m_xform.h"
-
-#define TDFX_XYZ_BIT 0x1
-#define TDFX_W_BIT 0x2
-#define TDFX_RGBA_BIT 0x4
-#define TDFX_TEX1_BIT 0x8
-#define TDFX_TEX0_BIT 0x10
-#define TDFX_PTEX_BIT 0x20
-#define TDFX_FOGC_BIT 0x40
-#define TDFX_MAX_SETUP 0x80
-
-#define _TDFX_NEW_RASTERSETUP (_NEW_TEXTURE | \
- _DD_NEW_SEPARATE_SPECULAR | \
- _DD_NEW_TRI_UNFILLED | \
- _DD_NEW_TRI_LIGHT_TWOSIDE | \
- _NEW_FOG)
-
-
-extern void tdfxValidateBuildProjVerts(struct gl_context *ctx,
- GLuint start, GLuint count,
- GLuint newinputs );
-
-extern void tdfxPrintSetupFlags(char *msg, GLuint flags );
-
-extern void tdfxInitVB( struct gl_context *ctx );
-
-extern void tdfxFreeVB( struct gl_context *ctx );
-
-extern void tdfxCheckTexSizes( struct gl_context *ctx );
-
-extern void tdfxChooseVertexState( struct gl_context *ctx );
-
-extern void tdfxBuildVertices( struct gl_context *ctx, GLuint start, GLuint end,
- GLuint newinputs );
-
-#endif
diff --git a/src/mesa/drivers/dri/tdfx/tdfx_vbtmp.h b/src/mesa/drivers/dri/tdfx/tdfx_vbtmp.h
deleted file mode 100644
index c593ce05eae..00000000000
--- a/src/mesa/drivers/dri/tdfx/tdfx_vbtmp.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version: 4.1
- *
- * Copyright (C) 1999-2002 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"),
- * 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 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
- * 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.
- */
-
-/* Authors:
- * Keith Whitwell <keith@tungstengraphics.com>
- * Daniel Borca <dborca@users.sourceforge.net>
- */
-
-
-#define VIEWPORT_X(dst,x) dst = s[0] * x + s[12]
-#define VIEWPORT_Y(dst,y) dst = s[5] * y + s[13]
-#define VIEWPORT_Z(dst,z) dst = s[10] * z + s[14]
-
-
-static void TAG(emit)( struct gl_context *ctx,
- GLuint start, GLuint end,
- void *dest )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
- GLuint tmu0_source = fxMesa->tmu_source[0];
- GLuint tmu1_source = fxMesa->tmu_source[1];
- GLfloat (*tc0)[4], (*tc1)[4];
- GLfloat (*col)[4];
- GLuint tc0_stride, tc1_stride, col_stride;
- GLuint tc0_size, tc1_size, col_size;
- GLfloat (*proj)[4] = VB->NdcPtr->data;
- GLuint proj_stride = VB->NdcPtr->stride;
- GLfloat (*fog)[4];
- GLuint fog_stride;
- tdfxVertex *v = (tdfxVertex *)dest;
- GLfloat u0scale,v0scale,u1scale,v1scale;
- const GLubyte *mask = VB->ClipMask;
- const GLfloat *s = fxMesa->hw_viewport;
- int i;
-
-/* fprintf(stderr, "%s\n", __FUNCTION__); */
-
- if (IND & TDFX_TEX0_BIT) {
- tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->stride;
- tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->data;
- u0scale = fxMesa->sScale0;
- v0scale = fxMesa->tScale0;
- if (IND & TDFX_PTEX_BIT)
- tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->size;
- }
-
- if (IND & TDFX_TEX1_BIT) {
- tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->data;
- tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->stride;
- u1scale = fxMesa->sScale1;
- v1scale = fxMesa->tScale1;
- if (IND & TDFX_PTEX_BIT)
- tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->size;
- }
-
- if (IND & TDFX_RGBA_BIT) {
- col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data;
- col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride;
- col_size = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size;
- }
-
- if (IND & TDFX_FOGC_BIT) {
- fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data;
- fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride;
- }
-
- {
- /* May have nonstandard strides:
- */
- if (start) {
- proj = (GLfloat (*)[4])((GLubyte *)proj + start * proj_stride);
- if (IND & TDFX_TEX0_BIT)
- tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
- if (IND & TDFX_TEX1_BIT)
- tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride);
- if (IND & TDFX_RGBA_BIT)
- STRIDE_4F(col, start * col_stride);
- if (IND & TDFX_FOGC_BIT)
- STRIDE_4F(fog, start * fog_stride);
- }
-
- for (i=start; i < end; i++, v++) {
- if (IND & TDFX_XYZ_BIT) {
- if (mask[i] == 0) {
- /* unclipped */
- VIEWPORT_X(v->x, proj[0][0]);
- VIEWPORT_Y(v->y, proj[0][1]);
- VIEWPORT_Z(v->z, proj[0][2]);
- v->rhw = proj[0][3];
- } else {
- /* clipped */
- v->rhw = 1.0;
- }
- proj = (GLfloat (*)[4])((GLubyte *)proj + proj_stride);
- }
- if (IND & TDFX_RGBA_BIT) {
- UNCLAMPED_FLOAT_TO_UBYTE(v->color[0], col[0][2]);
- UNCLAMPED_FLOAT_TO_UBYTE(v->color[1], col[0][1]);
- UNCLAMPED_FLOAT_TO_UBYTE(v->color[2], col[0][0]);
- if (col_size == 4) {
- UNCLAMPED_FLOAT_TO_UBYTE(v->color[3], col[0][3]);
- } else {
- v->color[3] = 255;
- }
- STRIDE_4F(col, col_stride);
- }
- if (IND & TDFX_FOGC_BIT) {
- v->fog = CLAMP(fog[0][0], 0.0f, 1.0f);
- STRIDE_4F(fog, fog_stride);
- }
- if (IND & TDFX_TEX0_BIT) {
- GLfloat w = v->rhw;
- v->tu0 = tc0[0][0] * u0scale * w;
- v->tv0 = tc0[0][1] * v0scale * w;
- if (IND & TDFX_PTEX_BIT) {
- v->tq0 = w;
- if (tc0_size == 4)
- v->tq0 = tc0[0][3] * w;
- }
- tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
- }
- if (IND & TDFX_TEX1_BIT) {
- GLfloat w = v->rhw;
- v->tu1 = tc1[0][0] * u1scale * w;
- v->tv1 = tc1[0][1] * v1scale * w;
- if (IND & TDFX_PTEX_BIT) {
- v->tq1 = w;
- if (tc1_size == 4)
- v->tq1 = tc1[0][3] * w;
- }
- tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride);
- }
- }
- }
-}
-
-
-static GLboolean TAG(check_tex_sizes)( struct gl_context *ctx )
-{
-/* fprintf(stderr, "%s\n", __FUNCTION__); */
-
- if (IND & TDFX_PTEX_BIT)
- return GL_TRUE;
-
- if (IND & TDFX_TEX0_BIT) {
- struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
-
- if (IND & TDFX_TEX1_BIT) {
- if (VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0)
- VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1];
-
- if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4)
- return GL_FALSE;
- }
-
- if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4)
- return GL_FALSE;
- }
-
- return GL_TRUE;
-}
-
-
-static void TAG(interp)( struct gl_context *ctx,
- GLfloat t,
- GLuint edst, GLuint eout, GLuint ein,
- GLboolean force_boundary )
-{
- tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
- struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
- const GLfloat *dstclip = VB->ClipPtr->data[edst];
- const GLfloat oow = (dstclip[3] == 0.0F) ? 1.0F : (1.0F / dstclip[3]);
- const GLfloat *s = fxMesa->hw_viewport;
- tdfxVertex *dst = fxMesa->verts + edst;
- const tdfxVertex *out = fxMesa->verts + eout;
- const tdfxVertex *in = fxMesa->verts + ein;
- const GLfloat wout = oow / out->rhw;
- const GLfloat win = oow / in->rhw;
-
- VIEWPORT_X(dst->x, dstclip[0] * oow);
- VIEWPORT_Y(dst->y, dstclip[1] * oow);
- VIEWPORT_Z(dst->z, dstclip[2] * oow);
- dst->rhw = oow;
-
- INTERP_UB( t, dst->color[0], out->color[0], in->color[0] );
- INTERP_UB( t, dst->color[1], out->color[1], in->color[1] );
- INTERP_UB( t, dst->color[2], out->color[2], in->color[2] );
- INTERP_UB( t, dst->color[3], out->color[3], in->color[3] );
-
- if (IND & TDFX_FOGC_BIT) {
- INTERP_F( t, dst->fog, out->fog, in->fog );
- }
-
- if (IND & TDFX_TEX0_BIT) {
- INTERP_F( t, dst->tu0, out->tu0 * wout, in->tu0 * win );
- INTERP_F( t, dst->tv0, out->tv0 * wout, in->tv0 * win );
- if (IND & TDFX_PTEX_BIT) {
- INTERP_F( t, dst->tq0, out->tq0 * wout, in->tq0 * win );
- }
- }
- if (IND & TDFX_TEX1_BIT) {
- INTERP_F( t, dst->tu1, out->tu1 * wout, in->tu1 * win );
- INTERP_F( t, dst->tv1, out->tv1 * wout, in->tv1 * win );
- if (IND & TDFX_PTEX_BIT) {
- INTERP_F( t, dst->tq1, out->tq1 * wout, in->tq1 * win );
- }
- }
-}
-
-
-static void TAG(init)( void )
-{
-/* fprintf(stderr, "%s\n", __FUNCTION__); */
-
- setup_tab[IND].emit = TAG(emit);
- setup_tab[IND].check_tex_sizes = TAG(check_tex_sizes);
- setup_tab[IND].interp = TAG(interp);
- setup_tab[IND].copy_pv = copy_pv;
-
- if (IND & TDFX_TEX1_BIT) {
- if (IND & TDFX_PTEX_BIT) {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_PROJ2;
- }
- else {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_MULTI;
- }
- }
- else if (IND & TDFX_TEX0_BIT) {
- if (IND & TDFX_PTEX_BIT) {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_PROJ1;
- } else {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_SINGLE;
- }
- }
- else if (IND & TDFX_W_BIT) {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_NOTEX;
- } else {
- setup_tab[IND].vertex_format = TDFX_LAYOUT_TINY;
- }
-}
-
-
-#undef IND
-#undef TAG