On Wed, Feb 13, 2002 at 03:40:58AM +0000, Keith Whitwell wrote:
> Fog & specular don't seem to be working. It's just as well I forgot to enable
> the extensions...
This fixes seccolor + adds the missing enable calls
I moved the call to Driver.Start in radeon_run_render because when
VB->Elts was true the texcoords weren't being fixed until after it'd
tried to emit them, seg faulting anything that tries to use tex unit 0
and 2 sans 1.
For fog I wasn't sure as tests/fogcoord did what it said on the tin
here, but I've added USE_SPEC_ALPHA and used the masks to assign fog_color to
the hardware state. I've attached a separate patch to t_dd_vbtmp.h
because I assumed, hopefully correctly, that copy_pv_rgba_spec5 should
be used if DO_FOG is true as well as DO_SPEC?
> There's also tests/fogcoord and tests/seccolor in Mesa cvs.
They seem to work now, I used a few of ATI's samples too, for
separate specular, dot3 bump mapping, fog coord and secondary colour.
--
Michael.
Index: extras/Mesa/src/tnl_dd/t_dd_vbtmp.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/extras/Mesa/src/tnl_dd/t_dd_vbtmp.h,v
retrieving revision 1.1.4.3
diff -u -3 -p -r1.1.4.3 t_dd_vbtmp.h
--- extras/Mesa/src/tnl_dd/t_dd_vbtmp.h 12 Feb 2002 17:35:00 -0000 1.1.4.3
+++ extras/Mesa/src/tnl_dd/t_dd_vbtmp.h 17 Feb 2002 00:35:55 -0000
@@ -736,7 +750,7 @@ static void TAG(init)( void )
setup_tab[IND].interp = TAG(interp);
#endif
- if (DO_SPEC)
+ if (DO_SPEC || DO_FOG)
setup_tab[IND].copy_pv = copy_pv_rgba4_spec5;
else if (HAVE_HW_DIVIDE || DO_SPEC || DO_FOG || DO_TEX0 || DO_TEX1 ||
DO_TEX2 || DO_TEX3 || !HAVE_TINY_VERTICES)
Index: extras/Mesa/src/tnl_dd/t_dd_vbtmp.h
===================================================================
RCS file: /cvsroot/dri/xc/xc/extras/Mesa/src/tnl_dd/t_dd_vbtmp.h,v
retrieving revision 1.1.4.3
diff -u -3 -p -r1.1.4.3 t_dd_vbtmp.h
--- extras/Mesa/src/tnl_dd/t_dd_vbtmp.h 12 Feb 2002 17:35:00 -0000 1.1.4.3
+++ extras/Mesa/src/tnl_dd/t_dd_vbtmp.h 17 Feb 2002 00:35:55 -0000
@@ -387,6 +387,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.v2 = 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: lib/GL/mesa/src/drv/radeon/radeon_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v
retrieving revision 1.6.6.5
diff -u -3 -p -r1.6.6.5 radeon_context.c
--- lib/GL/mesa/src/drv/radeon/radeon_context.c 12 Feb 2002 16:46:56 -0000 1.6.6.5
+++ lib/GL/mesa/src/drv/radeon/radeon_context.c 17 Feb 2002 00:35:56 -0000
@@ -202,6 +202,8 @@ static void radeonInitExtensions( GLcont
_mesa_enable_extension( ctx, "GL_EXT_texture_env_dot3" );
_mesa_enable_extension( ctx, "GL_EXT_texture_filter_anisotropic" );
_mesa_enable_extension( ctx, "GL_EXT_texture_lod_bias" );
+ _mesa_enable_extension( ctx, "GL_EXT_fog_coord" );
+ _mesa_enable_extension( ctx, "GL_EXT_secondary_color" );
}
@@ -321,7 +323,7 @@ radeonCreateContext( Display *dpy, const
ctx->Const.MaxTextureLevels = 9; /* 256x256 */
}
- ctx->Const.MaxTextureUnits = 2;
+ ctx->Const.MaxTextureUnits = RADEON_MAX_TEXTURE_UNITS;
ctx->Const.MaxTextureMaxAnisotropy = 16.0;
/* No wide points.
@@ -541,6 +543,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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_context.h 20 Nov 2001 11:49:21 -0000 1.8.6.4
+++ lib/GL/mesa/src/drv/radeon/radeon_context.h 17 Feb 2002 00:35:56 -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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_ioctl.c 11 Dec 2001 11:03:08 -0000
1.10.4.11
+++ lib/GL/mesa/src/drv/radeon/radeon_ioctl.c 17 Feb 2002 00:35:57 -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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_lock.c 30 Oct 2001 02:19:46 -0000 1.6.4.2
+++ lib/GL/mesa/src/drv/radeon/radeon_lock.c 17 Feb 2002 00:35:57 -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: lib/GL/mesa/src/drv/radeon/radeon_render.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_render.c,v
retrieving revision 1.1.4.4
diff -u -3 -p -r1.1.4.4 radeon_render.c
--- lib/GL/mesa/src/drv/radeon/radeon_render.c 13 Feb 2002 18:05:51 -0000 1.1.4.4
+++ lib/GL/mesa/src/drv/radeon/radeon_render.c 17 Feb 2002 00:35:57 -0000
@@ -186,6 +186,8 @@ static GLboolean radeon_run_render( GLco
ctx->Line.StippleFlag) /* GH: THIS IS A HACK!!! */
return GL_TRUE;
+ tnl->Driver.Render.Start( ctx );
+
if (VB->Elts) {
tab = TAG(render_tab_elts);
if (!rmesa->dma.retained)
@@ -195,9 +197,6 @@ static GLboolean radeon_run_render( GLco
tab = TAG(render_tab_verts);
}
-
- tnl->Driver.Render.Start( ctx );
-
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
{
flags = VB->Primitive[i];
@@ -227,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: lib/GL/mesa/src/drv/radeon/radeon_state.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c,v
retrieving revision 1.9.6.7
diff -u -3 -p -r1.9.6.7 radeon_state.c
--- lib/GL/mesa/src/drv/radeon/radeon_state.c 21 Nov 2001 13:34:03 -0000 1.9.6.7
+++ lib/GL/mesa/src/drv/radeon/radeon_state.c 17 Feb 2002 00:35:57 -0000
@@ -292,9 +292,10 @@ static void radeonFogfv( GLcontext *ctx,
GLchan c[4];
RADEON_STATECHANGE( rmesa, RADEON_UPLOAD_CONTEXT );
+ rmesa->state.hw.context.pp_fog_color &= ~RADEON_FOG_COLOR_MASK;
UNCLAMPED_FLOAT_TO_RGB_CHAN( c, ctx->Fog.Color );
- rmesa->state.hw.context.pp_fog_color =
- radeonPackColor( 4, c[0], c[1], c[2], 0 );
+ rmesa->state.hw.context.pp_fog_color |=
+ (radeonPackColor( 4, c[0], c[1], c[2], 0) & RADEON_FOG_COLOR_MASK);
}
@@ -489,8 +491,8 @@ static void radeonUpdateSpecular( GLcont
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
CARD32 p = rmesa->state.hw.context.pp_cntl;
- if ( ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
- ctx->Light.Enabled) {
+ if ( (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
+ ctx->Light.Enabled) || ctx->Fog.ColorSumEnabled) {
p |= RADEON_SPECULAR_ENABLE;
} else {
p &= ~RADEON_SPECULAR_ENABLE;
@@ -953,6 +955,10 @@ static void radeonEnable( GLcontext *ctx
radeonCullFace( ctx, 0 );
break;
+ case GL_COLOR_SUM_EXT:
+ radeonUpdateSpecular(ctx);
+ break;
+
case GL_DEPTH_TEST:
RADEON_STATECHANGE(rmesa, RADEON_UPLOAD_CONTEXT);
if ( state ) {
@@ -1190,7 +1196,7 @@ void radeonInitState( radeonContextPtr r
rmesa->state.hw.context.pp_fog_color = ((0x00000000 & RADEON_FOG_COLOR_MASK) |
RADEON_FOG_VERTEX |
- RADEON_FOG_USE_DEPTH);
+ RADEON_FOG_USE_SPEC_ALPHA);
rmesa->state.hw.context.re_solid_color = 0x00000000;
Index: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_tex.c 30 Oct 2001 15:12:14 -0000
1.13.2.3
+++ lib/GL/mesa/src/drv/radeon/radeon_tex.c 17 Feb 2002 00:35:58 -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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_texmem.c 7 Nov 2001 00:47:02 -0000 1.8.4.4
+++ lib/GL/mesa/src/drv/radeon/radeon_texmem.c 17 Feb 2002 00:35:58 -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 +522,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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_texstate.c 30 Oct 2001 15:12:14 -0000
1.3.6.3
+++ lib/GL/mesa/src/drv/radeon/radeon_texstate.c 17 Feb 2002 00:35:58 -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: lib/GL/mesa/src/drv/radeon/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
--- lib/GL/mesa/src/drv/radeon/radeon_vb.c 5 Dec 2001 11:52:33 -0000 1.5.6.6
+++ lib/GL/mesa/src/drv/radeon/radeon_vb.c 17 Feb 2002 00:35:58 -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 0x100
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;