fix up radeon span functions using latest r200 code from Brian,
[mesa.git] / src / mesa / drivers / dri / r200 / r200_vtxfmt_c.c
index 776cb9a52764bd1fc0c999547cae699ddf75e353..1db5950c8ffea980e877bb5ca7ef562a11f77a46 100644 (file)
@@ -42,6 +42,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "vtxfmt.h"
 
 #include "r200_vtxfmt.h"
+#include "r200_tcl.h"
+
+#include "dispatch.h"
 
 /* Fallback versions of all the entrypoints for situations where
  * codegen isn't available.  This is still a lot faster than the
@@ -122,6 +125,7 @@ static void r200_Vertex2fv( const GLfloat *v )
 
 /* Color for ubyte (packed) color formats:
  */
+#if 0
 static void r200_Color3ub_ub( GLubyte r, GLubyte g, GLubyte b )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -161,7 +165,7 @@ static void r200_Color4ubv_ub( const GLubyte *v )
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
    *(GLuint *)rmesa->vb.colorptr = LE32_TO_CPU(*(GLuint *)v);
 }
-
+#endif /* 0 */
 
 static void r200_Color3f_ub( GLfloat r, GLfloat g, GLfloat b )
 {
@@ -210,6 +214,7 @@ static void r200_Color4fv_ub( const GLfloat *v )
 
 /* Color for float color+alpha formats:
  */
+#if 0
 static void r200_Color3ub_4f( GLubyte r, GLubyte g, GLubyte b )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -253,6 +258,7 @@ static void r200_Color4ubv_4f( const GLubyte *v )
    dest[2] = UBYTE_TO_FLOAT(v[2]);
    dest[3] = UBYTE_TO_FLOAT(v[3]);
 }
+#endif /* 0 */
 
 
 static void r200_Color3f_4f( GLfloat r, GLfloat g, GLfloat b )
@@ -302,6 +308,7 @@ static void r200_Color4fv_4f( const GLfloat *v )
 
 /* Color for float color formats:
  */
+#if 0
 static void r200_Color3ub_3f( GLubyte r, GLubyte g, GLubyte b )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -343,6 +350,7 @@ static void r200_Color4ubv_3f( const GLubyte *v )
    dest[2] = UBYTE_TO_FLOAT(v[2]);
    ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3] = UBYTE_TO_FLOAT(v[3]);
 }
+#endif /* 0 */
 
 
 static void r200_Color3f_3f( GLfloat r, GLfloat g, GLfloat b )
@@ -390,6 +398,7 @@ static void r200_Color4fv_3f( const GLfloat *v )
 
 /* Secondary Color:
  */
+#if 0
 static void r200_SecondaryColor3ubEXT_ub( GLubyte r, GLubyte g, GLubyte b )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -411,6 +420,7 @@ static void r200_SecondaryColor3ubvEXT_ub( const GLubyte *v )
    dest->blue  = v[2];
    dest->alpha = 0xff;
 }
+#endif /* 0 */
 
 static void r200_SecondaryColor3fEXT_ub( GLfloat r, GLfloat g, GLfloat b )
 {
@@ -434,6 +444,7 @@ static void r200_SecondaryColor3fvEXT_ub( const GLfloat *v )
    dest->alpha = 255;
 }
 
+#if 0
 static void r200_SecondaryColor3ubEXT_3f( GLubyte r, GLubyte g, GLubyte b )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -455,6 +466,7 @@ static void r200_SecondaryColor3ubvEXT_3f( const GLubyte *v )
    dest[2] = UBYTE_TO_FLOAT(v[2]);
    dest[3] = 1.0;
 }
+#endif /* 0 */
 
 static void r200_SecondaryColor3fEXT_3f( GLfloat r, GLfloat g, GLfloat b )
 {
@@ -503,91 +515,143 @@ static void r200_Normal3fv( const GLfloat *v )
 }
 
 
-/* TexCoord
+/* FogCoord
  */
-static void r200_TexCoord1f( GLfloat s )
+static void r200_FogCoordfEXT( GLfloat f )
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[0];
-   dest[0] = s;
-   dest[1] = 0;
+   GLfloat *dest = rmesa->vb.fogptr;
+   dest[0] = r200ComputeFogBlendFactor( ctx, f );
+/*   ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = f;*/
 }
 
-static void r200_TexCoord1fv( const GLfloat *v )
+static void r200_FogCoordfvEXT( 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;
+   GLfloat *dest = rmesa->vb.fogptr;
+   dest[0] = r200ComputeFogBlendFactor( ctx, v[0] );
+/*   ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = v[0];*/
 }
 
-static void r200_TexCoord2f( GLfloat s, GLfloat t )
+
+/* TexCoord
+ */
+
+/* \todo maybe (target & 4 ? target & 5 : target & 3) is more save than (target & 7) */
+static void r200_MultiTexCoord1fARB(GLenum target, GLfloat s)
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[0];
-   dest[0] = s;
-   dest[1] = t;
+   GLint unit = (target & 7);
+   GLfloat * const dest = rmesa->vb.texcoordptr[unit];
+
+   switch( ctx->Texture.Unit[unit]._ReallyEnabled ) {
+   case TEXTURE_CUBE_BIT:
+   case TEXTURE_3D_BIT:
+      dest[2] = 0.0;
+      /* FALLTHROUGH */
+   case TEXTURE_2D_BIT:
+   case TEXTURE_RECT_BIT:
+      dest[1] = 0.0;
+      /* FALLTHROUGH */
+   case TEXTURE_1D_BIT:
+      dest[0] = s;
+   }
 }
 
-static void r200_TexCoord2fv( const GLfloat *v )
+static void r200_MultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[0];
-   dest[0] = v[0];
-   dest[1] = v[1];
-}
+   GLint unit = (target & 7);
+   GLfloat * const dest = rmesa->vb.texcoordptr[unit];
 
+   switch( ctx->Texture.Unit[unit]._ReallyEnabled ) {
+   case TEXTURE_CUBE_BIT:
+   case TEXTURE_3D_BIT:
+      dest[2] = 0.0;
+      /* FALLTHROUGH */
+   case TEXTURE_2D_BIT:
+   case TEXTURE_RECT_BIT:
+      dest[1] = t;
+      dest[0] = s;
+      break;
+   default:
+      VFMT_FALLBACK(__FUNCTION__);
+      CALL_MultiTexCoord2fARB(GET_DISPATCH(), (target, s, t));
+      return;  
+   }
+}
 
-/* MultiTexcoord
- * 
- * Technically speaking, these functions should subtract GL_TEXTURE0 from
- * \c target before masking and using it.  The value of GL_TEXTURE0 is 0x84C0,
- * which has the low-order 5 bits 0.  For all possible valid values of 
- * \c target.  Subtracting GL_TEXTURE0 has the net effect of masking \c target
- * with 0x1F.  Masking with 0x1F and then masking with 0x01 is redundant, so
- * the subtraction has been omitted.
- */
-
-static void r200_MultiTexCoord1fARB( GLenum target, GLfloat s  )
+static void r200_MultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[target & 1];
-   dest[0] = s;
-   dest[1] = 0;
+   GLint unit = (target & 7);
+   GLfloat * const dest = rmesa->vb.texcoordptr[unit];
+
+   switch( ctx->Texture.Unit[unit]._ReallyEnabled ) {
+   case TEXTURE_CUBE_BIT:
+   case TEXTURE_3D_BIT:
+      dest[2] = r;
+      dest[1] = t;
+      dest[0] = s;
+      break;
+   default:
+      VFMT_FALLBACK(__FUNCTION__);
+      CALL_MultiTexCoord3fARB(GET_DISPATCH(), (target, s, t, r));
+      return;  
+   }
 }
 
-static void r200_MultiTexCoord1fvARB( GLenum target, const GLfloat *v )
+static void r200_TexCoord1f(GLfloat s)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[target & 1];
-   dest[0] = v[0];
-   dest[1] = 0;
+   r200_MultiTexCoord1fARB(GL_TEXTURE0, s);
 }
 
-static void r200_MultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t )
+static void r200_TexCoord2f(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;
+   r200_MultiTexCoord2fARB(GL_TEXTURE0, s, t);
 }
 
-static void r200_MultiTexCoord2fvARB( GLenum target, const GLfloat *v )
+static void r200_TexCoord3f(GLfloat s, GLfloat t, GLfloat r)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   r200ContextPtr rmesa = R200_CONTEXT(ctx);
-   GLfloat *dest = rmesa->vb.texcoordptr[target & 1];
-   dest[0] = v[0];
-   dest[1] = v[1];
+   r200_MultiTexCoord3fARB(GL_TEXTURE0, s, t, r);
 }
 
+static void r200_TexCoord1fv(const GLfloat *v)
+{
+   r200_MultiTexCoord1fARB(GL_TEXTURE0, v[0]);
+}
+
+static void r200_TexCoord2fv(const GLfloat *v)
+{
+   r200_MultiTexCoord2fARB(GL_TEXTURE0, v[0], v[1]);
+}
+
+static void r200_TexCoord3fv(const GLfloat *v)
+{
+   r200_MultiTexCoord3fARB(GL_TEXTURE0, v[0], v[1], v[2]);
+}
+
+static void r200_MultiTexCoord1fvARB(GLenum target, const GLfloat *v)
+{
+   r200_MultiTexCoord1fARB(target, v[0]);
+}
+
+static void r200_MultiTexCoord2fvARB(GLenum target, const GLfloat *v)
+{
+   r200_MultiTexCoord2fARB(target, v[0], v[1]);
+}
+
+static void r200_MultiTexCoord3fvARB(GLenum target, const GLfloat *v)
+{
+   r200_MultiTexCoord3fARB(target, v[0], v[1], v[2]);
+}
+
+
 static struct dynfn *lookup( struct dynfn *l, const int *key )
 {
    struct dynfn *f;
@@ -597,7 +661,7 @@ static struct dynfn *lookup( struct dynfn *l, const int *key )
         return f;
    }
 
-   return 0;
+   return NULL;
 }
 
 /* Can't use the loopback template for this:
@@ -621,15 +685,15 @@ static void choose_##FN ARGS1                                             \
       fprintf(stderr, "%s -- cached codegen\n", __FUNCTION__ );                \
                                                                        \
    if (dfn)                                                            \
-      ctx->Exec->FN = (FNTYPE)(dfn->code);                             \
+      SET_ ## FN (ctx->Exec, (FNTYPE)(dfn->code));                     \
    else {                                                              \
       if (R200_DEBUG & DEBUG_CODEGEN)                                  \
         fprintf(stderr, "%s -- generic version\n", __FUNCTION__ );     \
-      ctx->Exec->FN = r200_##FN;                                       \
+      SET_ ## FN (ctx->Exec, r200_##FN);                               \
    }                                                                   \
                                                                        \
    ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;                      \
-   ctx->Exec->FN ARGS2;                                                        \
+   CALL_ ## FN (ctx->Exec, ARGS2);                                     \
 }
 
 
@@ -653,7 +717,7 @@ static void choose_##FN ARGS1                                               \
    key[1] = rmesa->vb.vtxfmt_1 & MASK1;                                        \
                                                                        \
    if (VTX_COLOR(rmesa->vb.vtxfmt_0,0) == R200_VTX_PK_RGBA) {          \
-      ctx->Exec->FN = r200_##FN##_ub;                                  \
+      SET_ ## FN (ctx->Exec, r200_##FN##_ub);                          \
    }                                                                   \
    else if (VTX_COLOR(rmesa->vb.vtxfmt_0,0) == R200_VTX_FP_RGB) {      \
                                                                        \
@@ -663,15 +727,15 @@ static void choose_##FN ARGS1                                             \
          if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) {           \
             r200_copy_to_current( ctx );                               \
             _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt );       \
-            ctx->Exec->FN ARGS2;                                       \
+            CALL_ ## FN (ctx->Exec, ARGS2);                            \
             return;                                                    \
          }                                                             \
       }                                                                        \
                                                                        \
-      ctx->Exec->FN = r200_##FN##_3f;                                  \
+      SET_ ## FN (ctx->Exec, r200_##FN##_3f);                          \
    }                                                                   \
    else {                                                              \
-      ctx->Exec->FN = r200_##FN##_4f;                                  \
+      SET_ ## FN (ctx->Exec, r200_##FN##_4f);                          \
    }                                                                   \
                                                                        \
                                                                        \
@@ -681,13 +745,13 @@ static void choose_##FN ARGS1                                             \
    if (dfn) {                                                          \
       if (R200_DEBUG & DEBUG_CODEGEN)                                  \
          fprintf(stderr, "%s -- codegen version\n", __FUNCTION__ );    \
-      ctx->Exec->FN = (FNTYPE)dfn->code;                               \
+      SET_ ## FN (ctx->Exec, (FNTYPE)dfn->code);                       \
    }                                                                   \
    else if (R200_DEBUG & DEBUG_CODEGEN)                                        \
          fprintf(stderr, "%s -- 'c' version\n", __FUNCTION__ );                \
                                                                        \
    ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;                      \
-   ctx->Exec->FN ARGS2;                                                        \
+   CALL_ ## FN (ctx->Exec, ARGS2);                                     \
 }
 
 
@@ -716,39 +780,43 @@ static void choose_##FN ARGS1                                             \
       fprintf(stderr, "%s -- cached version\n", __FUNCTION__ );                \
                                                                        \
    if (dfn)                                                            \
-      ctx->Exec->FN = (FNTYPE)(dfn->code);                     \
+      SET_ ## FN (ctx->Exec, (FNTYPE)(dfn->code));                     \
    else {                                                              \
       if (R200_DEBUG & DEBUG_CODEGEN)                                  \
          fprintf(stderr, "%s -- generic version\n", __FUNCTION__ );    \
-      ctx->Exec->FN = (VTX_COLOR(rmesa->vb.vtxfmt_0,1) == R200_VTX_PK_RGBA) \
-         ? r200_##FN##_ub : r200_##FN##_3f                           \
+      SET_ ## FN (ctx->Exec, (VTX_COLOR(rmesa->vb.vtxfmt_0,1) == R200_VTX_PK_RGBA) \
+         ? r200_##FN##_ub : r200_##FN##_3f);                           \
    }                                                                   \
                                                                        \
    ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;              \
-   ctx->Exec->FN ARGS2;                                                \
+   CALL_ ## FN (ctx->Exec, ARGS2);                                     \
 }
 
 
 
 
 
+
+
 /* VTXFMT_0
  */
 #define MASK_XYZW  (R200_VTX_W0|R200_VTX_Z0)
 #define MASK_NORM  (MASK_XYZW|R200_VTX_N0)
-#define MASK_COLOR (MASK_NORM |(R200_VTX_COLOR_MASK<<R200_VTX_COLOR_0_SHIFT))
+#define MASK_FOG   (MASK_NORM |R200_VTX_DISCRETE_FOG)
+#define MASK_COLOR (MASK_FOG |(R200_VTX_COLOR_MASK<<R200_VTX_COLOR_0_SHIFT))
 #define MASK_SPEC  (MASK_COLOR|(R200_VTX_COLOR_MASK<<R200_VTX_COLOR_1_SHIFT))
 
 /* VTXFMT_1
  */
 #define MASK_ST0 (0x7 << R200_VTX_TEX0_COMP_CNT_SHIFT)
-
+/* FIXME: maybe something like in the radeon driver is needed here? */
 
 
 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 +861,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 +874,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,
@@ -820,6 +896,10 @@ CHOOSE(Vertex2f, p2f, ~0, ~0,
 CHOOSE(Vertex2fv, pfv, ~0, ~0, 
        (const GLfloat *v), (v))
 
+CHOOSE(FogCoordfEXT, p1f, MASK_FOG, ~0, 
+       (GLfloat f), (f))
+CHOOSE(FogCoordfvEXT, pfv, MASK_FOG, ~0, 
+       (const GLfloat *f), (f))
 
 
 
@@ -836,16 +916,22 @@ 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;
    vfmt->Vertex3fv = choose_Vertex3fv;
+/*   vfmt->FogCoordfEXT = choose_FogCoordfEXT;
+   vfmt->FogCoordfvEXT = choose_FogCoordfvEXT;*/
 
    /* TODO: restore ubyte colors to vtxfmt.
     */
@@ -863,7 +949,7 @@ void r200VtxfmtInitChoosers( GLvertexformat *vfmt )
 static struct dynfn *codegen_noop( GLcontext *ctx, const int *key )
 {
    (void) ctx; (void) key;
-   return 0;
+   return NULL;
 }
 
 void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen )
@@ -874,10 +960,23 @@ 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->FogCoordfEXT = codegen_noop;
+   gen->FogCoordfvEXT = codegen_noop;*/
+
    gen->Vertex2f = codegen_noop;
    gen->Vertex2fv = codegen_noop;
    gen->Color3ub = codegen_noop;
@@ -890,10 +989,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)