fix up specular color/fog and triangle vertex retrieval
authorDave Airlie <airliedfreedesktop.org>
Thu, 12 Feb 2004 11:20:29 +0000 (11:20 +0000)
committerDave Airlie <airliedfreedesktop.org>
Thu, 12 Feb 2004 11:20:29 +0000 (11:20 +0000)
src/mesa/drivers/dri/mach64/mach64_native_vbtmp.h
src/mesa/drivers/dri/mach64/mach64_tris.c

index c7cb798..b924bcc 100644 (file)
@@ -123,8 +123,13 @@ static void TAG(emit)( GLcontext *ctx,
 #endif
 
 #if DO_SPEC
-   spec = VB->SecondaryColorPtr[0]->data;
-   spec_stride = VB->SecondaryColorPtr[0]->stride;
+   if (VB->SecondaryColorPtr[0]) {
+      spec = VB->SecondaryColorPtr[0]->data;
+      spec_stride = VB->SecondaryColorPtr[0]->stride;
+   } else {
+      spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
+      spec_stride = 0;
+   }
 #endif
 
 #if DO_FOG
@@ -148,17 +153,16 @@ static void TAG(emit)( GLcontext *ctx,
 
    if (start) {
 #if DO_TEX1
-        tc1 =  (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride);
+         STRIDE_4F(tc1, start * tc1_stride);
 #endif
 #if DO_TEX0
-        tc0 =  (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
+         STRIDE_4F(tc0, start * tc0_stride);
 #endif
 #if DO_SPEC
         STRIDE_4F(spec, start * spec_stride);
 #endif
 #if DO_FOG
-        /*  STRIDE_F(fog, start * fog_stride); */
-        fog =  (GLfloat (*)[4])((GLubyte *)fog + start * fog_stride);
+        STRIDE_4F(fog, start * fog_stride);
 #endif
 #if DO_RGBA
         STRIDE_4F(col, start * col_stride);
@@ -207,7 +211,7 @@ static void TAG(emit)( GLcontext *ctx,
 #if DO_PTEX
         }
 #endif /* DO_PTEX */
-        tc1 =  (GLfloat (*)[4])((GLubyte *)tc1 +  tc1_stride);
+        STRIDE_4F(tc1, tc1_stride);
 #else /* !DO_TEX1 */
         p += 3;
 #endif /* !DO_TEX1 */
@@ -239,20 +243,22 @@ static void TAG(emit)( GLcontext *ctx,
 #if DO_PTEX
         }
 #endif /* DO_PTEX */
-        tc0 =  (GLfloat (*)[4])((GLubyte *)tc0 +  tc0_stride);
+        STRIDE_4F(tc0, tc0_stride);
 #else /* !DO_TEX0 */
         p += 3;
 #endif /* !DO_TEX0 */
 
 #if DO_SPEC
-        ((GLubyte *)p)[0] = spec[0][2];        /* VERTEX_?_SPEC_B */
-        ((GLubyte *)p)[1] = spec[0][1];        /* VERTEX_?_SPEC_G */
-        ((GLubyte *)p)[2] = spec[0][0];        /* VERTEX_?_SPEC_R */
+        UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[0],  spec[0][2]);      /* VERTEX_?_SPEC_B */
+        UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[1],  spec[0][1]);      /* VERTEX_?_SPEC_G */
+        UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[2],  spec[0][0]);      /* VERTEX_?_SPEC_R */
+
         STRIDE_4F(spec, spec_stride);
 #endif
 #if DO_FOG
-        ((GLubyte *)p)[3] = fog[0][0] * 255.0;         /* VERTEX_?_SPEC_A */
-        fog =  (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
+        UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[3], fog[0][0]);  /* VERTEX_?_SPEC_A */
+        /*      ((GLubyte *)p)[3] = fog[0][0] * 255.0;  */
+        STRIDE_4F(fog, fog_stride);
 #endif
         p++;
            
@@ -349,14 +355,15 @@ static void TAG(interp)( GLcontext *ctx,
    LOCALVARS
    struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
    GLubyte *ddverts = GET_VERTEX_STORE();
-   GLuint shift = GET_VERTEX_STRIDE_SHIFT();
+   /*   GLuint shift = GET_VERTEX_STRIDE_SHIFT();*/
+   GLuint size = GET_VERTEX_SIZE();
    const GLfloat *dstclip = VB->ClipPtr->data[edst];
    GLfloat w;
    const GLfloat *s = GET_VIEWPORT_MAT();
 
-   CARD32 *dst = (CARD32 *)(ddverts + (edst << shift));
-   CARD32 *in  = (CARD32 *)(ddverts + (ein  << shift));
-   CARD32 *out = (CARD32 *)(ddverts + (eout << shift));
+   CARD32 *dst = (CARD32 *)(ddverts + (edst * size));
+   CARD32 *in  = (CARD32 *)(ddverts + (ein  * size));
+   CARD32 *out = (CARD32 *)(ddverts + (eout * size));
 
    (void)s;
 
@@ -511,9 +518,9 @@ static void TAG(interp)( GLcontext *ctx,
             (VIEWPORT_X( dstclip[0] * w ) << 16) |             /* VERTEX_?_X */
             (VIEWPORT_Y( dstclip[1] * w ) & 0xffff) );         /* VERTEX_?_Y */
 
-   assert( dst + 1 - (CARD32 *)(ddverts + (edst << shift)) == 10 );
-   assert( in  + 2 - (CARD32 *)(ddverts + (ein  << shift)) == 10 );
-   assert( out + 2 - (CARD32 *)(ddverts + (eout << shift)) == 10 );
+   assert( dst + 1 - (CARD32 *)(ddverts + (edst * size)) == 10 );
+   assert( in  + 2 - (CARD32 *)(ddverts + (ein  * size)) == 10 );
+   assert( out + 2 - (CARD32 *)(ddverts + (eout * size)) == 10 );
 
    if (MACH64_DEBUG & DEBUG_VERBOSE_PRIMS) {
       fprintf( stderr, "%s: dst vert: %.2f %.2f %.2f %x\n",
index 9692b3c..64f69d2 100644 (file)
@@ -1265,21 +1265,21 @@ static struct {
 #define VERT_SET_Z(_v,val) LE32_OUT( &(_v)->ui[zoffset], (GLuint)(val) )
 #define VERT_Z_ADD(_v,val) LE32_OUT( &(_v)->ui[zoffset], LE32_IN( &(_v)->ui[zoffset] ) + (GLuint)(val) )
 #define AREA_IS_CCW( a ) ((a) < 0)
-#define GET_VERTEX(e) (mmesa->verts + ((e)<<mmesa->vertex_stride_shift))
+#define GET_VERTEX(e) (mmesa->verts + ((e) * mmesa->vertex_size * sizeof(int)))
 
 #define MACH64_COLOR( dst, src )                \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-   dst[3] = src[3];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[3], src[3]);                           \
 } while (0)
 
 #define MACH64_SPEC( dst, src )                        \
 do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[0], src[2]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[1], src[1]);   \
+   UNCLAMPED_FLOAT_TO_UBYTE(dst[2], src[0]);   \
 } while (0)
 
 #define VERT_SET_RGBA( v, c )    MACH64_COLOR( v->ub4[coloroffset], c )
@@ -1508,7 +1508,7 @@ mach64_fallback_point( mach64ContextPtr mmesa,
 /*               Render unclipped begin/end objects                   */
 /**********************************************************************/
 
-#define VERT(x) (mach64Vertex *)(mach64verts + ((x) << shift))
+#define VERT(x) (mach64Vertex *)(mach64verts + ((x) * vertsize * sizeof(int)))
 #define RENDER_POINTS( start, count )          \
    for ( ; start < count ; start++)            \
       mach64_draw_point( mmesa, VERT(start) )
@@ -1525,7 +1525,7 @@ mach64_fallback_point( mach64ContextPtr mmesa,
 #undef LOCAL_VARS
 #define LOCAL_VARS                                             \
     mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);              \
-    const GLuint shift = mmesa->vertex_stride_shift;           \
+    const GLuint vertsize = mmesa->vertex_size;                 \
     const char *mach64verts = (char *)mmesa->verts;            \
     const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;      \
     (void) elt;
@@ -1590,7 +1590,6 @@ static void mach64FastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
    unsigned vbsiz = (vertsize + (vertsize > 7 ? 2 : 1)) * n + (n-2);
    CARD32 *vb, *vbchk;
    GLubyte *mach64verts = (GLubyte *)mmesa->verts;
-   const GLuint shift = mmesa->vertex_stride_shift;
    mach64VertexPtr v0, v1, v2;
    int i;