diff options
author | Ian Romanick <idr@us.ibm.com> | 2004-05-05 20:16:17 +0000 |
---|---|---|
committer | Ian Romanick <idr@us.ibm.com> | 2004-05-05 20:16:17 +0000 |
commit | 95a0bd6762737bb25bdf5c4147da9d1372f6aac3 (patch) | |
tree | 4621bed2826ef56c66ea12e401a75bdf062a332f /src/mesa/drivers/dri/r200/r200_vtxfmt_c.c | |
parent | 4045b6e5b85ee407a21559155c34d16fd63dc79c (diff) |
Added support for the 3rd texture coordinate for cubemaps and 3D
textures. progs/demos/cubemap and progs/demos/stex3d seem to work
correctly at all tcl_mode settings. x86 / SSE codegen is currently
disabled.
Diffstat (limited to 'src/mesa/drivers/dri/r200/r200_vtxfmt_c.c')
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_vtxfmt_c.c | 140 |
1 files changed, 70 insertions, 70 deletions
diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c b/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c index 776cb9a527..e9f66fb5d7 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c @@ -505,41 +505,30 @@ static void r200_Normal3fv( const GLfloat *v ) /* TexCoord */ -static void r200_TexCoord1f( GLfloat s ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[0]; - dest[0] = s; - dest[1] = 0; -} -static void r200_TexCoord1fv( const GLfloat *v ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[0]; - dest[0] = v[0]; - dest[1] = 0; -} - -static void r200_TexCoord2f( GLfloat s, GLfloat t ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[0]; - dest[0] = s; - dest[1] = t; -} +#define TEX_to_nF(N, P, S, T, R) \ + static void r200_TexCoord ## N P \ + { \ + GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); \ + GLfloat * const dest = rmesa->vb.texcoordptr[0]; \ + switch( ctx->Texture.Unit[0]._ReallyEnabled ) { \ + case TEXTURE_CUBE_BIT: \ + case TEXTURE_3D_BIT: \ + dest[2] = R; \ + case TEXTURE_2D_BIT: \ + case TEXTURE_RECT_BIT: \ + dest[1] = T; \ + case TEXTURE_1D_BIT: \ + dest[0] = S; \ + } \ + } -static void r200_TexCoord2fv( const GLfloat *v ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[0]; - dest[0] = v[0]; - dest[1] = v[1]; -} +TEX_to_nF( 1f, (GLfloat s), s, 0.0, 0.0 ) +TEX_to_nF( 2f, (GLfloat s, GLfloat t), s, t, 0.0 ) +TEX_to_nF( 3f, (GLfloat s, GLfloat t, GLfloat r), s, t, r ) +TEX_to_nF( 1fv, (const GLfloat * v), v[0], 0.0, 0.0 ) +TEX_to_nF( 2fv, (const GLfloat * v), v[0], v[1], 0.0 ) +TEX_to_nF( 3fv, (const GLfloat * v), v[0], v[1], v[2] ) /* MultiTexcoord @@ -552,41 +541,30 @@ static void r200_TexCoord2fv( const GLfloat *v ) * the subtraction has been omitted. */ -static void r200_MultiTexCoord1fARB( GLenum target, GLfloat s ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; - dest[0] = s; - dest[1] = 0; -} - -static void r200_MultiTexCoord1fvARB( GLenum target, const GLfloat *v ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; - dest[0] = v[0]; - dest[1] = 0; -} +#define MTEX_to_nF(N, P, U, S, T, R) \ + static void r200_MultiTexCoord ## N ## ARB P \ + { \ + GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); \ + GLfloat * const dest = rmesa->vb.texcoordptr[U]; \ + switch( ctx->Texture.Unit[U]._ReallyEnabled ) { \ + case TEXTURE_CUBE_BIT: \ + case TEXTURE_3D_BIT: \ + dest[2] = R; \ + case TEXTURE_2D_BIT: \ + case TEXTURE_RECT_BIT: \ + dest[1] = T; \ + case TEXTURE_1D_BIT: \ + dest[0] = S; \ + } \ + } -static void r200_MultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; - dest[0] = s; - dest[1] = t; -} +MTEX_to_nF( 1f, (GLenum target, GLfloat s), (target & 1), s, 0.0, 0.0 ) +MTEX_to_nF( 2f, (GLenum target, GLfloat s, GLfloat t), (target & 1), s, t, 0.0 ) +MTEX_to_nF( 3f, (GLenum target, GLfloat s, GLfloat t, GLfloat r), (target & 1), s, t, r ) -static void r200_MultiTexCoord2fvARB( GLenum target, const GLfloat *v ) -{ - GET_CURRENT_CONTEXT(ctx); - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; - dest[0] = v[0]; - dest[1] = v[1]; -} +MTEX_to_nF( 1fv, (GLenum target, const GLfloat *v), (target & 1), v[0], 0.0, 0.0 ) +MTEX_to_nF( 2fv, (GLenum target, const GLfloat *v), (target & 1), v[0], v[1], 0.0 ) +MTEX_to_nF( 3fv, (GLenum target, const GLfloat *v), (target & 1), v[0], v[1], v[2] ) static struct dynfn *lookup( struct dynfn *l, const int *key ) { @@ -732,6 +710,8 @@ static void choose_##FN ARGS1 \ + + /* VTXFMT_0 */ #define MASK_XYZW (R200_VTX_W0|R200_VTX_Z0) @@ -749,6 +729,7 @@ typedef void (*p4f)( GLfloat, GLfloat, GLfloat, GLfloat ); typedef void (*p3f)( GLfloat, GLfloat, GLfloat ); typedef void (*p2f)( GLfloat, GLfloat ); typedef void (*p1f)( GLfloat ); +typedef void (*pe3f)( GLenum, GLfloat, GLfloat, GLfloat ); typedef void (*pe2f)( GLenum, GLfloat, GLfloat ); typedef void (*pe1f)( GLenum, GLfloat ); typedef void (*p4ub)( GLubyte, GLubyte, GLubyte, GLubyte ); @@ -793,6 +774,10 @@ CHOOSE_SECONDARY_COLOR(SecondaryColor3fEXT, p3f, MASK_SPEC, 0, CHOOSE_SECONDARY_COLOR(SecondaryColor3fvEXT, pfv, MASK_SPEC, 0, (const GLfloat *v), (v)) +CHOOSE(TexCoord3f, p3f, ~0, MASK_ST0, + (GLfloat a,GLfloat b,GLfloat c), (a,b,c)) +CHOOSE(TexCoord3fv, pfv, ~0, MASK_ST0, + (const GLfloat *v), (v)) CHOOSE(TexCoord2f, p2f, ~0, MASK_ST0, (GLfloat a,GLfloat b), (a,b)) CHOOSE(TexCoord2fv, pfv, ~0, MASK_ST0, @@ -802,6 +787,10 @@ CHOOSE(TexCoord1f, p1f, ~0, MASK_ST0, CHOOSE(TexCoord1fv, pfv, ~0, MASK_ST0, (const GLfloat *v), (v)) +CHOOSE(MultiTexCoord3fARB, pe3f, ~0, ~0, + (GLenum u,GLfloat a,GLfloat b,GLfloat c), (u,a,b,c)) +CHOOSE(MultiTexCoord3fvARB, pefv, ~0, ~0, + (GLenum u,const GLfloat *v), (u,v)) CHOOSE(MultiTexCoord2fARB, pe2f, ~0, ~0, (GLenum u,GLfloat a,GLfloat b), (u,a,b)) CHOOSE(MultiTexCoord2fvARB, pefv, ~0, ~0, @@ -836,12 +825,16 @@ void r200VtxfmtInitChoosers( GLvertexformat *vfmt ) vfmt->MultiTexCoord1fvARB = choose_MultiTexCoord1fvARB; vfmt->MultiTexCoord2fARB = choose_MultiTexCoord2fARB; vfmt->MultiTexCoord2fvARB = choose_MultiTexCoord2fvARB; + vfmt->MultiTexCoord3fARB = choose_MultiTexCoord3fARB; + vfmt->MultiTexCoord3fvARB = choose_MultiTexCoord3fvARB; vfmt->Normal3f = choose_Normal3f; vfmt->Normal3fv = choose_Normal3fv; vfmt->TexCoord1f = choose_TexCoord1f; vfmt->TexCoord1fv = choose_TexCoord1fv; vfmt->TexCoord2f = choose_TexCoord2f; vfmt->TexCoord2fv = choose_TexCoord2fv; + vfmt->TexCoord3f = choose_TexCoord3f; + vfmt->TexCoord3fv = choose_TexCoord3fv; vfmt->Vertex2f = choose_Vertex2f; vfmt->Vertex2fv = choose_Vertex2fv; vfmt->Vertex3f = choose_Vertex3f; @@ -874,10 +867,21 @@ void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) gen->Color4ubv = codegen_noop; gen->Normal3f = codegen_noop; gen->Normal3fv = codegen_noop; + + gen->TexCoord3f = codegen_noop; + gen->TexCoord3fv = codegen_noop; gen->TexCoord2f = codegen_noop; gen->TexCoord2fv = codegen_noop; + gen->TexCoord1f = codegen_noop; + gen->TexCoord1fv = codegen_noop; + + gen->MultiTexCoord3fARB = codegen_noop; + gen->MultiTexCoord3fvARB = codegen_noop; gen->MultiTexCoord2fARB = codegen_noop; gen->MultiTexCoord2fvARB = codegen_noop; + gen->MultiTexCoord1fARB = codegen_noop; + gen->MultiTexCoord1fvARB = codegen_noop; + gen->Vertex2f = codegen_noop; gen->Vertex2fv = codegen_noop; gen->Color3ub = codegen_noop; @@ -890,10 +894,6 @@ void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) gen->SecondaryColor3fvEXT = codegen_noop; gen->SecondaryColor3ubEXT = codegen_noop; gen->SecondaryColor3ubvEXT = codegen_noop; - gen->TexCoord1f = codegen_noop; - gen->TexCoord1fv = codegen_noop; - gen->MultiTexCoord1fARB = codegen_noop; - gen->MultiTexCoord1fvARB = codegen_noop; if (useCodegen) { #if defined(USE_X86_ASM) |