Here's a first stab at the Radeon 3rd texture unit for testing, comments, flames etc.
I'm currently testing this and I'll probably make some of the 0,1,2's
into loops as I do that, but if anyone has a pile of 3 texture demos
they were itching to run... :o)
I've not found much to test it with.
It works in very simple 2 texture tests replacing TEXTURE0 with
TEXTURE2 and mostly with the 'texCombine' test in glean (that's
complaining about results of a few of the tests, mostly DOT3 iirc, but
the single texture tests complain too) it doesn't seem to have broken
any of the existing stuff I run here.
TIA.
--
Michael.
Index: src/tnl_dd/t_dd_vbtmp.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/extras/Mesa/src/tnl_dd/Attic/t_dd_vbtmp.h,v
retrieving revision 1.1.4.2
diff -u -3 -p -r1.1.4.2 t_dd_vbtmp.h
--- src/tnl_dd/t_dd_vbtmp.h 20 Dec 2001 09:51:05 -0000 1.1.4.2
+++ src/tnl_dd/t_dd_vbtmp.h 13 Feb 2002 00:10:20 -0000
@@ -382,6 +384,20 @@ static void TAG(emit)( GLcontext *ctx,
v->v.v1 = tc1[i][1];
}
}
+ if (DO_TEX2) {
+ if (DO_PTEX) {
+ v->pv.u2 = tc2[i][0];
+ v->pv.v1 = tc2[i][1];
+ if (tc2_size == 4)
+ v->pv.q2 = tc2[i][3];
+ else
+ v->pv.q2 = 1.0;
+ }
+ else {
+ v->v.u2 = tc2[i][0];
+ v->v.v2 = tc2[i][1];
+ }
+ }
}
}
}
Index: radeon_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v
retrieving revision 1.6.6.4
diff -u -3 -p -r1.6.6.4 radeon_context.c
--- radeon_context.c 6 Nov 2001 16:47:17 -0000 1.6.6.4
+++ radeon_context.c 13 Feb 2002 00:43:06 -0000
@@ -323,7 +323,8 @@ radeonCreateContext( Display *dpy, const
ctx->Const.MaxTextureLevels = 9; /* 256x256 */
}
- ctx->Const.MaxTextureUnits = 2;
+ ctx->Const.MaxTextureLevels = 12; /* 2048x2048 */
+ ctx->Const.MaxTextureUnits = 3;
ctx->Const.MaxTextureMaxAnisotropy = 16.0;
/* No wide points.
@@ -545,6 +546,8 @@ radeonMakeCurrent( __DRIcontextPrivate *
newRadeonCtx->state.hw.dirty |= RADEON_UPLOAD_TEX0;
if ( newRadeonCtx->state.texture.unit[1].texobj )
newRadeonCtx->state.hw.dirty |= RADEON_UPLOAD_TEX1;
+ if ( newRadeonCtx->state.texture.unit[2].texobj )
+ newRadeonCtx->state.hw.dirty |= RADEON_UPLOAD_TEX2;
}
if ( newRadeonCtx->dri.drawable != driDrawPriv ) {
Index: radeon_context.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h,v
retrieving revision 1.8.6.4
diff -u -3 -p -r1.8.6.4 radeon_context.h
--- radeon_context.h 20 Nov 2001 11:49:21 -0000 1.8.6.4
+++ radeon_context.h 13 Feb 2002 00:43:06 -0000
@@ -224,7 +224,7 @@ struct radeon_dri_mirror {
};
struct radeon_store {
- radeonTexObjPtr texture[2][RADEON_MAX_STATES];
+ radeonTexObjPtr texture[RADEON_MAX_TEXTURE_UNITS][RADEON_MAX_STATES];
drmRadeonState state[RADEON_MAX_STATES];
drmRadeonPrim prim[RADEON_MAX_PRIMS];
GLuint statenr;
Index: radeon_ioctl.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c,v
retrieving revision 1.10.4.11
diff -u -3 -p -r1.10.4.11 radeon_ioctl.c
--- radeon_ioctl.c 11 Dec 2001 11:03:08 -0000 1.10.4.11
+++ radeon_ioctl.c 13 Feb 2002 00:43:06 -0000
@@ -170,6 +170,17 @@ static void emit_state( radeonContextPtr
dest->texture[1].pp_txablend = state->hw.texture[1].pp_txablend;
dest->texture[1].pp_tfactor = state->hw.texture[1].pp_tfactor;
}
+ if ( dirty & RADEON_UPLOAD_TEX2 ) {
+ radeonTexObjPtr t2 = state->texture.unit[2].texobj;
+
+ dest->texture[2].pp_txfilter = t2->pp_txfilter |
+state->hw.texture[2].pp_txfilter;
+ dest->texture[2].pp_txformat = t2->pp_txformat | RADEON_TXFORMAT_ST_ROUTE_STQ2;
+ dest->texture[2].pp_txoffset = t2->pp_txoffset;
+ dest->texture[2].pp_border_color = t2->pp_border_color;
+ dest->texture[2].pp_txcblend = state->hw.texture[2].pp_txcblend;
+ dest->texture[2].pp_txablend = state->hw.texture[2].pp_txablend;
+ dest->texture[2].pp_tfactor = state->hw.texture[2].pp_tfactor;
+ }
}
@@ -220,6 +231,9 @@ static void print_state( drmRadeonState
if ( dirty & RADEON_UPLOAD_TEX1 )
print_values( "TEX1", &state->texture[1], sizeof(state->texture[1]) );
+
+ if ( dirty & RADEON_UPLOAD_TEX2 )
+ print_values( "TEX2", &state->texture[2], sizeof(state->texture[2]) );
}
@@ -250,6 +264,7 @@ static void emit_prim( radeonContextPtr
dirty = RADEON_UPLOAD_CONTEXT_ALL;
if (rmesa->state.texture.unit[0].texobj) dirty |= RADEON_UPLOAD_TEX0;
if (rmesa->state.texture.unit[1].texobj) dirty |= RADEON_UPLOAD_TEX1;
+ if (rmesa->state.texture.unit[2].texobj) dirty |= RADEON_UPLOAD_TEX2;
}
@@ -263,6 +278,7 @@ static void emit_prim( radeonContextPtr
rmesa->store.state[state].dirty = rmesa->state.hw.dirty; /* override */
rmesa->store.texture[0][state] = rmesa->state.texture.unit[0].texobj;
rmesa->store.texture[1][state] = rmesa->state.texture.unit[1].texobj;
+ rmesa->store.texture[2][state] = rmesa->state.texture.unit[2].texobj;
rmesa->state.hw.dirty = 0;
/* print_state( &rmesa->store.state[state] ); */
}
@@ -302,6 +318,8 @@ void radeonFlushPrimsLocked( radeonConte
rmesa->store.state[0].dirty &= ~RADEON_UPLOAD_TEX0;
if ( !rmesa->store.texture[1][0] )
rmesa->store.state[0].dirty &= ~RADEON_UPLOAD_TEX1;
+ if ( !rmesa->store.texture[2][0] )
+ rmesa->store.state[0].dirty &= ~RADEON_UPLOAD_TEX2;
}
@@ -569,6 +587,8 @@ void radeonCopyBuffer( const __DRIdrawab
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX0 );
if ( rmesa->state.texture.unit[1].texobj )
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
+ if ( rmesa->state.texture.unit[2].texobj )
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
rmesa->upload_cliprects = 1;
@@ -787,6 +807,8 @@ static void radeonClear( GLcontext *ctx,
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX0 );
if ( rmesa->state.texture.unit[1].texobj )
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
+ if ( rmesa->state.texture.unit[2].texobj )
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
rmesa->upload_cliprects = 1;
}
Index: radeon_lock.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_lock.c,v
retrieving revision 1.6.4.2
diff -u -3 -p -r1.6.4.2 radeon_lock.c
--- radeon_lock.c 30 Oct 2001 02:19:46 -0000 1.6.4.2
+++ radeon_lock.c 13 Feb 2002 00:43:06 -0000
@@ -88,6 +88,8 @@ void radeonGetLock( radeonContextPtr rme
rmesa->store.state[0].dirty |= RADEON_UPLOAD_TEX0;
if ( rmesa->store.texture[1][0] )
rmesa->store.state[0].dirty |= RADEON_UPLOAD_TEX1;
+ if ( rmesa->store.texture[2][0] )
+ rmesa->store.state[0].dirty |= RADEON_UPLOAD_TEX2;
}
else {
rmesa->state.hw.dirty = RADEON_UPLOAD_CONTEXT_ALL;
@@ -95,6 +97,8 @@ void radeonGetLock( radeonContextPtr rme
rmesa->state.hw.dirty |= RADEON_UPLOAD_TEX0;
if ( rmesa->state.texture.unit[1].texobj )
rmesa->state.hw.dirty |= RADEON_UPLOAD_TEX1;
+ if ( rmesa->state.texture.unit[2].texobj )
+ rmesa->state.hw.dirty |= RADEON_UPLOAD_TEX2;
}
for ( i = 0 ; i < rmesa->texture.numHeaps ; i++ ) {
Index: radeon_render.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/Attic/radeon_render.c,v
retrieving revision 1.1.4.2
diff -u -3 -p -r1.1.4.2 radeon_render.c
--- radeon_render.c 22 Nov 2001 14:00:39 -0000 1.1.4.2
+++ radeon_render.c 13 Feb 2002 00:43:06 -0000
@@ -226,6 +226,9 @@ static void radeon_check_render( GLconte
if (ctx->Texture.Unit[1]._ReallyEnabled)
inputs |= VERT_TEX(1);
+ if (ctx->Texture.Unit[2]._ReallyEnabled)
+ inputs |= VERT_TEX(2);
+
if (ctx->Fog.Enabled)
inputs |= VERT_FOG_COORD;
}
Index: radeon_tex.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c,v
retrieving revision 1.13.2.3
diff -u -3 -p -r1.13.2.3 radeon_tex.c
--- radeon_tex.c 30 Oct 2001 15:12:14 -0000 1.13.2.3
+++ radeon_tex.c 13 Feb 2002 00:43:08 -0000
@@ -323,6 +323,9 @@ static void radeonTexImage1D( GLcontext
if ( t == rmesa->state.texture.unit[1].texobj ) {
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
}
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
+ }
}
@@ -364,6 +367,9 @@ static void radeonTexSubImage1D( GLconte
if ( t == rmesa->state.texture.unit[1].texobj ) {
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
}
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
+ }
}
@@ -403,6 +409,9 @@ static void radeonTexImage2D( GLcontext
if ( t == rmesa->state.texture.unit[1].texobj ) {
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
}
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
+ }
}
@@ -444,6 +453,9 @@ static void radeonTexSubImage2D( GLconte
if ( t == rmesa->state.texture.unit[1].texobj ) {
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
}
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
+ }
}
#if 0
@@ -634,6 +646,9 @@ static void radeonTexParameter( GLcontex
if ( t == rmesa->state.texture.unit[1].texobj ) {
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
}
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
+ }
}
@@ -712,6 +727,18 @@ static void radeonInitTextureObjects( GL
texObj = ctx->Texture.Unit[1].Current2D;
radeonBindTexture( ctx, GL_TEXTURE_2D, texObj );
move_to_tail( &rmesa->texture.swapped,
+ (radeonTexObjPtr)texObj->DriverData );
+
+ ctx->Texture.CurrentUnit = 2;
+
+ texObj = ctx->Texture.Unit[2].Current1D;
+ radeonBindTexture( ctx, GL_TEXTURE_1D, texObj );
+ move_to_tail( &rmesa->texture.swapped,
+ (radeonTexObjPtr)texObj->DriverData );
+
+ texObj = ctx->Texture.Unit[2].Current2D;
+ radeonBindTexture( ctx, GL_TEXTURE_2D, texObj );
+ move_to_tail( &rmesa->texture.swapped,
(radeonTexObjPtr)texObj->DriverData );
ctx->Texture.CurrentUnit = tmp;
Index: radeon_texmem.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_texmem.c,v
retrieving revision 1.8.4.4
diff -u -3 -p -r1.8.4.4 radeon_texmem.c
--- radeon_texmem.c 7 Nov 2001 00:47:02 -0000 1.8.4.4
+++ radeon_texmem.c 13 Feb 2002 00:43:08 -0000
@@ -82,6 +82,11 @@ void radeonDestroyTexObj( radeonContextP
rmesa->state.texture.unit[1].texobj = NULL;
rmesa->state.hw.dirty &= ~RADEON_UPLOAD_TEX1;
}
+
+ if ( t == rmesa->state.texture.unit[2].texobj ) {
+ rmesa->state.texture.unit[2].texobj = NULL;
+ rmesa->state.hw.dirty &= ~RADEON_UPLOAD_TEX2;
+ }
}
remove_from_list( t );
@@ -517,6 +525,9 @@ int radeonUploadTexImages( radeonContext
if ( t == rmesa->state.texture.unit[1].texobj )
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX1 );
+
+ if ( t == rmesa->state.texture.unit[2].texobj )
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_TEX2 );
}
/* Let the world know we've used this memory recently */
Index: radeon_texstate.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_texstate.c,v
retrieving revision 1.3.6.3
diff -u -3 -p -r1.3.6.3 radeon_texstate.c
--- radeon_texstate.c 30 Oct 2001 15:12:14 -0000 1.3.6.3
+++ radeon_texstate.c 13 Feb 2002 00:43:08 -0000
@@ -142,11 +142,17 @@ static void radeonSetTexImages( radeonCo
*/
firstLevel = tObj->BaseLevel + (GLint) (tObj->MinLod + 0.5);
firstLevel = MAX2(firstLevel, tObj->BaseLevel);
- lastLevel = tObj->BaseLevel + (GLint) (tObj->MaxLod + 0.5);
- lastLevel = MAX2(lastLevel, tObj->BaseLevel);
- lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2);
- lastLevel = MIN2(lastLevel, tObj->MaxLevel);
- lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */
+ if ( tObj->MinFilter != GL_NEAREST && tObj->MinFilter != GL_LINEAR ) {
+ firstLevel = tObj->BaseLevel + (GLint) (tObj->MinLod + 0.5);
+ firstLevel = MAX2(firstLevel, tObj->BaseLevel);
+ lastLevel = tObj->BaseLevel + (GLint) (tObj->MaxLod + 0.5);
+ lastLevel = MAX2(lastLevel, tObj->BaseLevel);
+ lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2);
+ lastLevel = MIN2(lastLevel, tObj->MaxLevel);
+ lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */
+ }
+ else
+ lastLevel = firstLevel;
/* save these values */
t->firstLevel = firstLevel;
@@ -1135,9 +1141,9 @@ static void radeonUpdateTextureUnit( GLc
}
else {
/* Texture unit disabled */
+ RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_CONTEXT );
rmesa->state.texture.unit[unit].texobj = 0;
rmesa->state.hw.dirty &= ~(RADEON_UPLOAD_TEX0 << unit);
- RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_CONTEXT );
rmesa->state.hw.context.pp_cntl &= ~((RADEON_TEX_0_ENABLE |
RADEON_TEX_BLEND_0_ENABLE) << unit);
}
@@ -1149,4 +1155,5 @@ void radeonUpdateTextureState( GLcontext
FALLBACK( rmesa, RADEON_FALLBACK_TEXTURE, GL_FALSE );
radeonUpdateTextureUnit( ctx, 0 );
radeonUpdateTextureUnit( ctx, 1 );
+ radeonUpdateTextureUnit( ctx, 2 );
}
Index: radeon_vb.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c,v
retrieving revision 1.5.6.6
diff -u -3 -p -r1.5.6.6 radeon_vb.c
--- radeon_vb.c 5 Dec 2001 11:52:33 -0000 1.5.6.6
+++ radeon_vb.c 13 Feb 2002 00:43:09 -0000
@@ -61,8 +61,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#define RADEON_SPEC_BIT 0x08
#define RADEON_TEX0_BIT 0x10
#define RADEON_TEX1_BIT 0x20
-#define RADEON_PTEX_BIT 0x40
-#define RADEON_MAX_SETUP 0x80
+#define RADEON_TEX2_BIT 0x40
+#define RADEON_PTEX_BIT 0x80
+#define RADEON_MAX_SETUP 0xff
static struct {
void (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint );
@@ -110,7 +111,26 @@ static struct {
RADEON_CP_VC_FRMT_ST1 | \
RADEON_CP_VC_FRMT_Q1)
-#define TEX2_VERTEX_FORMAT 0
+#define TEX2_VERTEX_FORMAT (RADEON_CP_VC_FRMT_XY | \
+ RADEON_CP_VC_FRMT_Z | \
+ RADEON_CP_VC_FRMT_W0 | \
+ RADEON_CP_VC_FRMT_PKCOLOR | \
+ RADEON_CP_VC_FRMT_PKSPEC | \
+ RADEON_CP_VC_FRMT_ST0 | \
+ RADEON_CP_VC_FRMT_ST1 | \
+ RADEON_CP_VC_FRMT_ST2)
+
+#define PROJ_TEX2_VERTEX_FORMAT (RADEON_CP_VC_FRMT_XY | \
+ RADEON_CP_VC_FRMT_Z | \
+ RADEON_CP_VC_FRMT_W0 | \
+ RADEON_CP_VC_FRMT_PKCOLOR | \
+ RADEON_CP_VC_FRMT_PKSPEC | \
+ RADEON_CP_VC_FRMT_ST0 | \
+ RADEON_CP_VC_FRMT_Q0 | \
+ RADEON_CP_VC_FRMT_ST1 | \
+ RADEON_CP_VC_FRMT_Q1 | \
+ RADEON_CP_VC_FRMT_ST2 | \
+ RADEON_CP_VC_FRMT_Q2)
#define TEX3_VERTEX_FORMAT 0
#define PROJ_TEX3_VERTEX_FORMAT 0
@@ -120,7 +140,7 @@ static struct {
#define DO_FOG (IND & RADEON_FOG_BIT)
#define DO_TEX0 (IND & RADEON_TEX0_BIT)
#define DO_TEX1 (IND & RADEON_TEX1_BIT)
-#define DO_TEX2 0
+#define DO_TEX2 (IND & RADEON_TEX2_BIT)
#define DO_TEX3 0
#define DO_PTEX (IND & RADEON_PTEX_BIT)
@@ -140,7 +160,7 @@ static struct {
#define HAVE_NOTEX_VERTICES 1
#define HAVE_TEX0_VERTICES 1
#define HAVE_TEX1_VERTICES 1
-#define HAVE_TEX2_VERTICES 0
+#define HAVE_TEX2_VERTICES 1
#define HAVE_TEX3_VERTICES 0
#define HAVE_PTEX_VERTICES 1
@@ -194,6 +214,14 @@ static struct {
#define TAG(x) x##_wgpt0t1
#include "tnl_dd/t_dd_vbtmp.h"
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT)
+#define TAG(x) x##_wgt0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT|RADEON_PTEX_BIT)
+#define TAG(x) x##_wgpt0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
#define IND (RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_SPEC_BIT|RADEON_TEX0_BIT)
#define TAG(x) x##_wgst0
#include "tnl_dd/t_dd_vbtmp.h"
@@ -213,6 +241,14 @@ static struct {
#define TAG(x) x##_wgspt0t1
#include "tnl_dd/t_dd_vbtmp.h"
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_SPEC_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT)
+#define TAG(x) x##_wgst0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_SPEC_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT|RADEON_PTEX_BIT)
+#define TAG(x) x##_wgspt0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
#define IND (RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT)
#define TAG(x) x##_wgf
#include "tnl_dd/t_dd_vbtmp.h"
@@ -240,6 +276,14 @@ static struct {
#define TAG(x) x##_wgfpt0t1
#include "tnl_dd/t_dd_vbtmp.h"
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT)
+#define TAG(x) x##_wgft0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT|RADEON_PTEX_BIT)
+#define TAG(x) x##_wgfpt0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
#define IND (RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT|RADEON_SPEC_BIT|\
RADEON_TEX0_BIT)
#define TAG(x) x##_wgfst0
@@ -260,6 +304,14 @@ static struct {
#define TAG(x) x##_wgfspt0t1
#include "tnl_dd/t_dd_vbtmp.h"
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT|RADEON_SPEC_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT)
+#define TAG(x) x##_wgfst0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
+#define IND
+(RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_FOG_BIT|RADEON_SPEC_BIT|RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT|RADEON_PTEX_BIT)
+#define TAG(x) x##_wgfspt0t1t2
+#include "tnl_dd/t_dd_vbtmp.h"
+
/* Specialized emit, hardwired with q3 strides.
*/
@@ -331,20 +383,28 @@ static void init_setup_tab( void )
init_wgpt0();
init_wgt0t1();
init_wgpt0t1();
+ init_wgt0t1t2();
+ init_wgpt0t1t2();
init_wgst0();
init_wgspt0();
init_wgst0t1();
init_wgspt0t1();
+ init_wgst0t1t2();
+ init_wgspt0t1t2();
init_wgf();
init_wgfs();
init_wgft0();
init_wgfpt0();
init_wgft0t1();
init_wgfpt0t1();
+ init_wgft0t1t2();
+ init_wgfpt0t1t2();
init_wgfst0();
init_wgfspt0();
init_wgfst0t1();
init_wgfspt0t1();
+ init_wgfst0t1t2();
+ init_wgfspt0t1t2();
setup_tab[RADEON_XYZW_BIT|RADEON_RGBA_BIT|RADEON_TEX0_BIT].emit = emit_q3;
}
@@ -353,7 +413,7 @@ static void init_setup_tab( void )
void radeonPrintSetupFlags(char *msg, GLuint flags )
{
- fprintf(stderr, "%s(%x): %s%s%s%s%s%s%s\n",
+ fprintf(stderr, "%s(%x): %s%s%s%s%s%s%s%s\n",
msg,
(int)flags,
(flags & RADEON_XYZW_BIT) ? " xyzw," : "",
@@ -362,6 +422,7 @@ void radeonPrintSetupFlags(char *msg, GL
(flags & RADEON_FOG_BIT) ? " fog," : "",
(flags & RADEON_TEX0_BIT) ? " tex-0," : "",
(flags & RADEON_TEX1_BIT) ? " tex-1," : "",
+ (flags & RADEON_TEX2_BIT) ? " tex-2," : "",
(flags & RADEON_PTEX_BIT) ? " proj-tex," : "");
}
@@ -422,7 +483,9 @@ void radeonChooseVertexState( GLcontext
if (ctx->Fog.Enabled)
ind |= RADEON_FOG_BIT;
- if (ctx->Texture._ReallyEnabled & 0x0f0)
+ if (ctx->Texture._ReallyEnabled & 0xf00)
+ ind |= RADEON_TEX0_BIT|RADEON_TEX1_BIT|RADEON_TEX2_BIT;
+ else if (ctx->Texture._ReallyEnabled & 0x0f0)
ind |= RADEON_TEX0_BIT|RADEON_TEX1_BIT;
else if (ctx->Texture._ReallyEnabled & 0x00f)
ind |= RADEON_TEX0_BIT;