diff options
author | ldelgass <ldelgass> | 2002-02-14 07:41:37 +0000 |
---|---|---|
committer | ldelgass <ldelgass> | 2002-02-14 07:41:37 +0000 |
commit | 3edc4992e2ebc30aca8a47931002f24cd8558c10 (patch) | |
tree | 6256c088dff7125bec04431b8aa680c3f3ff8738 | |
parent | b1b0c548e8886224c7e7d4c16c9f07cb57175498 (diff) |
Enable multitexturing, fog, texture environment modes. Details:mach64-0-0-2-branch
- Multitexturing tested and working with Quake3 demo and UT.
To get this to work, the vertex setup functions in mach64_vb.c
pre-multiply the texture coordinates by the homogenous coord.
This is how the utah-glx driver does it. There may still be some
blending/compositing bugs here and there.
- Enables fog only if alpha blending is off (RagePRO can't do both).
A fog enable is silently ignored when alpha blending is on, and enabling
alpha blending disables fog. There's probably a better way to fallback.
Tested and working with Nate Robins' fog tutorial and the Mesa fog demo.
- Sets texture environment modes. I'm not sure this bit is totally
correct, but the texenv Mesa demo seems to be working right. Note that
I've set GL_BLEND to use software fallback.
- The stuff in here on color masks is probably not necessary, as it's
still done with software fallback. I just cleaned it up a bit as there
was some vestigal r128 code there.
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_state.c | 73 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_tex.c | 121 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_tris.h | 46 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_vb.c | 41 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_vb.h | 4 |
5 files changed, 251 insertions, 34 deletions
diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_state.c b/xc/lib/GL/mesa/src/drv/mach64/mach64_state.c index 46dcba93e..b99a37301 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_state.c +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_state.c @@ -152,6 +152,7 @@ static void mach64UpdateAlphaMode( GLcontext *ctx ) break; } + s &= ~MACH64_ALPHA_FOG_EN_FOG; /* Can't fog and blend at the same time */ s |= MACH64_ALPHA_FOG_EN_ALPHA; } else { s &= ~MACH64_ALPHA_FOG_EN_ALPHA; @@ -295,29 +296,48 @@ static void mach64DDClearDepth( GLcontext *ctx, GLclampd d ) static void mach64UpdateFogAttrib( GLcontext *ctx ) { mach64ContextPtr mmesa = MACH64_CONTEXT(ctx); -#if 0 - CARD32 t = mmesa->setup.tex_cntl_c; + + CARD32 s = mmesa->setup.scale_3d_cntl; GLubyte c[4]; CARD32 col; + /* Can't fog if blending is on */ + if ( ctx->Color.BlendEnabled ) + return; + if ( ctx->FogMode == FOG_FRAGMENT ) { - t |= MACH64_FOG_ENABLE; + s |= MACH64_ALPHA_FOG_EN_FOG; + s &= ~(MACH64_ALPHA_BLEND_SRC_MASK | + MACH64_ALPHA_BLEND_DST_MASK | + MACH64_ALPHA_BLEND_SAT); + /* From Utah-glx: "fog color is now dest and fog factor is alpha, so + * use GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA" + */ + s |= (MACH64_ALPHA_BLEND_SRC_SRCALPHA | + MACH64_ALPHA_BLEND_DST_INVSRCALPHA); + /* From Utah-glx: "can't use texture alpha when fogging" */ + s &= ~MACH64_TEX_MAP_AEN; } else { - t &= ~MACH64_FOG_ENABLE; + s &= ~(MACH64_ALPHA_BLEND_SRC_MASK | + MACH64_ALPHA_BLEND_DST_MASK | + MACH64_ALPHA_BLEND_SAT); + s |= (MACH64_ALPHA_BLEND_SRC_ONE | + MACH64_ALPHA_BLEND_DST_ZERO); + s &= ~MACH64_ALPHA_FOG_EN_FOG; } FLOAT_RGBA_TO_UBYTE_RGBA( c, ctx->Fog.Color ); col = mach64PackColor( 4, c[0], c[1], c[2], c[3] ); - if ( mmesa->setup.fog_color_c != col ) { - mmesa->setup.fog_color_c = col; - mmesa->dirty |= MACH64_UPLOAD_CONTEXT; + if ( mmesa->setup.dp_fog_clr != col ) { + mmesa->setup.dp_fog_clr = col; + mmesa->dirty |= MACH64_UPLOAD_CONTEXT | MACH64_UPLOAD_DP_FOG_CLR; } - if ( mmesa->setup.tex_cntl_c != t ) { - mmesa->setup.tex_cntl_c = t; - mmesa->dirty |= MACH64_UPLOAD_CONTEXT; + if ( mmesa->setup.scale_3d_cntl != s ) { + mmesa->setup.scale_3d_cntl = s; + mmesa->dirty |= MACH64_UPLOAD_CONTEXT | MACH64_UPLOAD_SCALE_3D_CNTL; } -#endif + } static void mach64DDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) @@ -479,18 +499,19 @@ static void mach64UpdateMasks( GLcontext *ctx ) { mach64ContextPtr mmesa = MACH64_CONTEXT(ctx); -#if 0 - GLuint mask = mach64PackColor( mmesa->BufferSize, + if ( !ctx->Color.BlendEnabled ) { + GLuint mask = mach64PackColor( mmesa->mach64Screen->cpp, ctx->Color.ColorMask[RCOMP], ctx->Color.ColorMask[GCOMP], ctx->Color.ColorMask[BCOMP], ctx->Color.ColorMask[ACOMP] ); - if ( mmesa->setup.plane_3d_mask_c != mask ) { - mmesa->setup.plane_3d_mask_c = mask; - mmesa->dirty |= MACH64_UPLOAD_CONTEXT | MACH64_UPLOAD_MASKS; + if ( mmesa->setup.dp_write_mask != mask ) { + mmesa->setup.dp_write_mask = mask; + mmesa->dirty |= MACH64_UPLOAD_CONTEXT | MACH64_UPLOAD_DP_WRITE_MASK; } -#endif + } + } static GLboolean mach64DDColorMask( GLcontext *ctx, @@ -502,7 +523,8 @@ static GLboolean mach64DDColorMask( GLcontext *ctx, FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_MASKS; - return GL_TRUE; + return GL_FALSE; /* This forces the software paths to do colormasking. */ + /* This function will return void when we use Mesa 3.5 */ } @@ -733,12 +755,12 @@ static void mach64DDEnable( GLcontext *ctx, GLenum cap, GLboolean state ) FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_RENDER; break; - +#endif case GL_FOG: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_FOG; break; - +#if 0 case GL_INDEX_LOGIC_OP: case GL_COLOR_LOGIC_OP: FLUSH_BATCH( mmesa ); @@ -754,14 +776,13 @@ static void mach64DDEnable( GLcontext *ctx, GLenum cap, GLboolean state ) mmesa->scissor = state; mmesa->new_state |= MACH64_NEW_CLIP; break; - +#endif case GL_TEXTURE_1D: case GL_TEXTURE_2D: case GL_TEXTURE_3D: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_TEXTURE; break; -#endif default: return; @@ -894,10 +915,10 @@ void mach64DDUpdateHWState( GLcontext *ctx ) #if 0 if ( new_state & MACH64_NEW_CULL ) mach64UpdateCull( ctx ); - +#endif if ( new_state & MACH64_NEW_MASKS ) mach64UpdateMasks( ctx ); - +#if 0 if ( new_state & MACH64_NEW_RENDER ) mach64UpdateRenderAttrib( ctx ); #endif @@ -1091,7 +1112,9 @@ void mach64DDInitState( mach64ContextPtr mmesa ) MACH64_COMP_BLEND_NEAREST | MACH64_COMP_FILTER_NEAREST | /* MACH64_TEXTURE_TILING | */ - /* MACH64_TEX_ST_DIRECT | */ +#ifdef MACH64_PREMULT_TEXCOORDS + MACH64_TEX_ST_DIRECT | +#endif MACH64_TEX_SRC_LOCAL | MACH64_TEX_UNCOMPRESSED | MACH64_TEX_CACHE_FLUSH | diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_tex.c b/xc/lib/GL/mesa/src/drv/mach64/mach64_tex.c index d4574193e..b1ce9dd50 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_tex.c +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_tex.c @@ -861,6 +861,7 @@ static void mach64UpdateTextureStage( GLcontext *ctx, int unit ) struct gl_texture_object *tObj; mach64TextureObjectPtr t; GLuint enabled; + GLuint s = mmesa->setup.scale_3d_cntl; if ( MACH64_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s( %p, %d )\n", @@ -885,6 +886,101 @@ static void mach64UpdateTextureStage( GLcontext *ctx, int unit ) /* We definately have a valid texture now */ t = tObj->DriverData; + if ( unit == 0 ) { + s &= ~MACH64_TEX_LIGHT_FCN_MASK; + + /* Set the texture environment state + * Need to verify these are working correctly, but the + * texenv Mesa demo seems to work. + */ + switch ( ctx->Texture.Unit[source].EnvMode ) { + case GL_REPLACE: + switch ( tObj->Image[0]->Format ) { + case GL_ALPHA: + s |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + default: + s |= MACH64_TEX_LIGHT_FCN_REPLACE; + break; + } + break; + case GL_MODULATE: + s |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + case GL_DECAL: + switch ( tObj->Image[0]->Format ) { + case GL_RGBA: + s |= MACH64_TEX_LIGHT_FCN_ALPHA_DECAL; + break; + case GL_RGB: + s |= MACH64_TEX_LIGHT_FCN_REPLACE; + break; + default: /* undefined */ + s |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + } + break; + case GL_BLEND: + switch ( tObj->Image[0]->Format ) { + case GL_ALPHA: + s |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + default: + /* Most blending modes not supported by RagePRO, use software */ + mmesa->Fallback |= MACH64_FALLBACK_TEXTURE; + mmesa->setup.scale_3d_cntl |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + } + default: + s |= MACH64_TEX_LIGHT_FCN_MODULATE; + break; + } + + if ( mmesa->setup.scale_3d_cntl != s ) { + mmesa->setup.scale_3d_cntl = s; + mmesa->dirty |= MACH64_UPLOAD_SCALE_3D_CNTL; + } + + } else { + /* blend = 0, modulate = 1 - initialize to blend */ + mmesa->setup.tex_cntl &= ~MACH64_COMP_COMBINE_MODULATE; + /* Set the texture composite function for multitexturing*/ + switch ( ctx->Texture.Unit[source].EnvMode ) { + case GL_BLEND: + switch ( tObj->Image[0]->Format ) { + case GL_ALPHA: + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_MODULATE; + break; + default: + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_BLEND; + break; + } + break; + case GL_MODULATE: + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_MODULATE; + break; + case GL_REPLACE: + switch ( tObj->Image[0]->Format ) { + case GL_ALPHA: + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_MODULATE; + break; + default: /* not supported by RagePRO */ + mmesa->Fallback |= MACH64_FALLBACK_TEXTURE; + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_MODULATE; + break; + } + break; + case GL_DECAL: + default: /* not supported by RagePRO */ + mmesa->Fallback |= MACH64_FALLBACK_TEXTURE; + mmesa->setup.tex_cntl |= MACH64_COMP_COMBINE_MODULATE; + break; + } + } + + /* This code is from r128, but I'm leaving it here for now as + * a reference. + */ #if 0 if ( unit == 0 ) { combine = INPUT_INTERP; @@ -1189,11 +1285,6 @@ static void mach64UpdateTextureObject( GLcontext *ctx, int unit ) s |= MACH64_TEX_MAP_AEN; } - if ( mmesa->setup.scale_3d_cntl != s ) { - mmesa->setup.scale_3d_cntl = s; - mmesa->dirty |= MACH64_UPLOAD_SCALE_3D_CNTL; - } - mmesa->setup.tex_cntl &= ~(MACH64_TEXTURE_CLAMP_S | MACH64_TEXTURE_CLAMP_T | MACH64_SECONDARY_STW); @@ -1209,6 +1300,10 @@ static void mach64UpdateTextureObject( GLcontext *ctx, int unit ) (t->maxLog2 << 4) | (t->heightLog2 << 8)); } else { + + /* Enable texture mapping mode */ + s &= ~MACH64_TEXTURE_DISABLE; + d &= ~MACH64_COMPOSITE_PIX_WIDTH_MASK; d |= (t->textureFormat << 4); @@ -1218,6 +1313,17 @@ static void mach64UpdateTextureObject( GLcontext *ctx, int unit ) mmesa->setup.tex_cntl |= (MACH64_TEXTURE_COMPOSITE | MACH64_SECONDARY_STW); + if ( t->BilinearMin ) { + s |= MACH64_COMP_BLEND_BILINEAR; + } else { + s &= ~MACH64_COMP_BLEND_BILINEAR; + } + if ( t->BilinearMag ) { + s |= MACH64_COMP_FILTER_BILINEAR; + } else { + s &= ~MACH64_COMP_FILTER_BILINEAR; + } + if ( t->hasAlpha ) { mmesa->setup.tex_cntl |= MACH64_COMP_ALPHA; } @@ -1233,6 +1339,11 @@ static void mach64UpdateTextureObject( GLcontext *ctx, int unit ) (t->heightLog2 << 24)); } + if ( mmesa->setup.scale_3d_cntl != s ) { + mmesa->setup.scale_3d_cntl = s; + mmesa->dirty |= MACH64_UPLOAD_SCALE_3D_CNTL; + } + if ( mmesa->setup.dp_pix_width != d ) { mmesa->setup.dp_pix_width = d; mmesa->dirty |= MACH64_UPLOAD_DP_PIX_WIDTH; diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_tris.h b/xc/lib/GL/mesa/src/drv/mach64/mach64_tris.h index 92e4c3b35..d0398bfa1 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_tris.h +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_tris.h @@ -97,6 +97,12 @@ static __inline void mach64_draw_triangle( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_1_ARGB, v0->ui[4] ); MACH64_WRITE( MACH64_VERTEX_1_X_Y, (xx[0] << 16) | (yy[0] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_S, v0->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_T, v0->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_W, v0->ui[10] ); + } + MACH64_WRITE( MACH64_VERTEX_2_S, v1->ui[6] ); MACH64_WRITE( MACH64_VERTEX_2_T, v1->ui[7] ); MACH64_WRITE( MACH64_VERTEX_2_W, v1->ui[3] ); @@ -105,6 +111,12 @@ static __inline void mach64_draw_triangle( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_2_ARGB, v1->ui[4] ); MACH64_WRITE( MACH64_VERTEX_2_X_Y, (xx[1] << 16) | (yy[1] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_S, v1->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_T, v1->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_W, v1->ui[10] ); + } + MACH64_WRITE( MACH64_VERTEX_3_S, v2->ui[6] ); MACH64_WRITE( MACH64_VERTEX_3_T, v2->ui[7] ); MACH64_WRITE( MACH64_VERTEX_3_W, v2->ui[3] ); @@ -113,6 +125,12 @@ static __inline void mach64_draw_triangle( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_3_ARGB, v2->ui[4] ); MACH64_WRITE( MACH64_VERTEX_3_X_Y, (xx[2] << 16) | (yy[2] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_S, v2->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_T, v2->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_W, v2->ui[10] ); + } + MACH64_WRITE( MACH64_ONE_OVER_AREA_UC, *(GLuint *)&ooa ); UNLOCK_HARDWARE( mmesa ); @@ -168,6 +186,12 @@ static __inline void mach64_draw_quad( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_1_ARGB, v0->ui[4] ); MACH64_WRITE( MACH64_VERTEX_1_X_Y, (xx[0] << 16) | (yy[0] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_S, v0->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_T, v0->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_W, v0->ui[10] ); + } + MACH64_WRITE( MACH64_VERTEX_2_S, v1->ui[6] ); MACH64_WRITE( MACH64_VERTEX_2_T, v1->ui[7] ); MACH64_WRITE( MACH64_VERTEX_2_W, v1->ui[3] ); @@ -176,6 +200,12 @@ static __inline void mach64_draw_quad( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_2_ARGB, v1->ui[4] ); MACH64_WRITE( MACH64_VERTEX_2_X_Y, (xx[1] << 16) | (yy[1] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_S, v1->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_T, v1->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_2_SECONDARY_W, v1->ui[10] ); + } + MACH64_WRITE( MACH64_VERTEX_3_S, v3->ui[6] ); MACH64_WRITE( MACH64_VERTEX_3_T, v3->ui[7] ); MACH64_WRITE( MACH64_VERTEX_3_W, v3->ui[3] ); @@ -184,6 +214,12 @@ static __inline void mach64_draw_quad( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_3_ARGB, v3->ui[4] ); MACH64_WRITE( MACH64_VERTEX_3_X_Y, (xx[2] << 16) | (yy[2] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_S, v3->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_T, v3->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_3_SECONDARY_W, v3->ui[10] ); + } + MACH64_WRITE( MACH64_ONE_OVER_AREA_UC, *(GLuint *)&ooa ); xx[0] = (GLint)(v2->v.x * 4); @@ -201,6 +237,12 @@ static __inline void mach64_draw_quad( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_VERTEX_1_ARGB, v2->ui[4] ); MACH64_WRITE( MACH64_VERTEX_1_X_Y, (xx[0] << 16) | (yy[0] & 0xffff) ); + if (mmesa->multitex) { + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_S, v2->ui[8] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_T, v2->ui[9] ); + MACH64_WRITE( MACH64_VERTEX_1_SECONDARY_W, v2->ui[10] ); + } + MACH64_WRITE( MACH64_ONE_OVER_AREA_UC, *(GLuint *)&ooa ); UNLOCK_HARDWARE( mmesa ); @@ -211,7 +253,6 @@ static __inline void mach64_draw_line( mach64ContextPtr mmesa, mach64Vertex *tmp1, float width ) { -#if 1 GLcontext *ctx = mmesa->glCtx; GLint vertsize = mmesa->vertsize; #if 0 @@ -329,14 +370,12 @@ static __inline void mach64_draw_line( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_ONE_OVER_AREA_UC, *(GLuint *)&ooa ); UNLOCK_HARDWARE( mmesa ); -#endif } static __inline void mach64_draw_point( mach64ContextPtr mmesa, mach64Vertex *tmp, float sz ) { -#if 1 GLcontext *ctx = mmesa->glCtx; GLint vertsize = mmesa->vertsize; #if 0 @@ -417,7 +456,6 @@ static __inline void mach64_draw_point( mach64ContextPtr mmesa, MACH64_WRITE( MACH64_ONE_OVER_AREA_UC, *(GLuint *)&ooa ); UNLOCK_HARDWARE( mmesa ); -#endif } #endif diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.c b/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.c index b979ffe0f..4310d8b48 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.c +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.c @@ -37,6 +37,7 @@ #include "mem.h" #include "stages.h" +#ifndef MACH64_PREMULT_TEXCOORDS #define TEX0 \ do { \ v->v.tu0 = tc0[i][0]; \ @@ -48,6 +49,7 @@ do { \ v->v.tu1 = tc1[i][0]; \ v->v.tv1 = tc1[i][1]; \ } while (0) +#endif /* MACH64_PREMULT_TEXCOORDS */ #define SPC \ do { \ @@ -72,6 +74,43 @@ do { \ v->v.color.alpha = col[3]; \ } while (0) +#ifdef MACH64_PREMULT_TEXCOORDS +#define TEX0 \ +do { \ + GLfloat *win = VB->Win.data[i]; \ + v->v.tu0 = tc0[i][0]; \ + v->v.tv0 = tc0[i][1]; \ + v->v.rhw = win[3]; \ + v->v.tu0 *= v->v.rhw; \ + v->v.tv0 *= v->v.rhw; \ + if ( VB->TexCoordPtr[0]->size == 4 ) \ + v->v.rhw *= tc0[i][3]; \ +} while (0) + +#define TEX1 \ +do { \ + GLfloat *win = VB->Win.data[i]; \ + v->v.tu1 = tc1[i][0]; \ + v->v.tv1 = tc1[i][1]; \ + v->v.rhw2 = win[3]; \ + v->v.tu1 *= v->v.rhw2; \ + v->v.tv1 *= v->v.rhw2; \ + if ( VB->TexCoordPtr[1]->size == 4 ) \ + v->v.rhw2 *= tc1[i][3]; \ +} while (0) + +#define COORD \ +do { \ + GLfloat *win = VB->Win.data[i]; \ + v->v.x = win[0] + xoffset; \ + v->v.y = - win[1] + yoffset; \ + v->v.z = win[2]; \ +} while (0) + +#define TEX0_4 + +#else + #define TEX0_4 \ do { \ if (VB->TexCoordPtr[0]->size == 4) { \ @@ -95,6 +134,8 @@ do { \ v->v.rhw = win[3]; \ } while (0) +#endif /* MACH64_PREMULT_TEXCOORDS */ + #define NOP /* Setup the mach64 vertex buffer entries */ diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.h b/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.h index cbe53de35..6523e8af9 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.h +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_vb.h @@ -34,6 +34,9 @@ #ifdef GLX_DIRECT_RENDERING +/* premultiply texture coordinates by homogenous coordinate */ +#define MACH64_PREMULT_TEXCOORDS + /* This is endian-specific. PPC will need to change this. */ typedef struct { @@ -58,6 +61,7 @@ typedef struct { mach64_color_t specular; /* Specular color (alpha is fog) */ GLfloat tu0, tv0; /* Texture 0 coordinates */ GLfloat tu1, tv1; /* Texture 1 coordinates */ + GLfloat rhw2; /* Reciprocal homogeneous w2 */ } mach64_vertex; /* The fastpath code still expects a 16-float stride vertex. |