nouveau: memory leak
[mesa.git] / src / mesa / tnl_dd / t_dd_vb.c
index 4a742bcbbee52e37a5a6ff8ef21ceb399141a988..3cedd9011904f99d6a21d2d4545c21034bc91b61 100644 (file)
@@ -50,9 +50,9 @@ static void copy_pv_rgba4_spec5( GLcontext *ctx, GLuint edst, GLuint esrc )
 {
    LOCALVARS   
    GLubyte *verts = GET_VERTEX_STORE();
-   GLuint shift = GET_VERTEX_STRIDE_SHIFT();
-   GLuint *dst = (GLuint *)(verts + (edst << shift));
-   GLuint *src = (GLuint *)(verts + (esrc << shift));
+   GLuint size = GET_VERTEX_SIZE();
+   GLuint *dst = (GLuint *)(verts + (edst * size));
+   GLuint *src = (GLuint *)(verts + (esrc * size));
    dst[4] = src[4];
    dst[5] = src[5];
 }
@@ -61,9 +61,9 @@ static void copy_pv_rgba4( GLcontext *ctx, GLuint edst, GLuint esrc )
 {
    LOCALVARS
    GLubyte *verts = GET_VERTEX_STORE();
-   GLuint shift = GET_VERTEX_STRIDE_SHIFT();
-   GLuint *dst = (GLuint *)(verts + (edst << shift));
-   GLuint *src = (GLuint *)(verts + (esrc << shift));
+   GLuint size = GET_VERTEX_SIZE();
+   GLuint *dst = (GLuint *)(verts + (edst * size));
+   GLuint *src = (GLuint *)(verts + (esrc * size));
    dst[4] = src[4];
 }
 
@@ -71,9 +71,9 @@ static void copy_pv_rgba3( GLcontext *ctx, GLuint edst, GLuint esrc )
 {
    LOCALVARS
    GLubyte *verts = GET_VERTEX_STORE();
-   GLuint shift = GET_VERTEX_STRIDE_SHIFT();
-   GLuint *dst = (GLuint *)(verts + (edst << shift));
-   GLuint *src = (GLuint *)(verts + (esrc << shift));
+   GLuint size = GET_VERTEX_SIZE();
+   GLuint *dst = (GLuint *)(verts + (edst * size));
+   GLuint *src = (GLuint *)(verts + (esrc * size));
    dst[3] = src[3];
 }
 
@@ -89,15 +89,15 @@ void TAG(translate_vertex)(GLcontext *ctx,
 
    if (format == TINY_VERTEX_FORMAT) {
       if (HAVE_HW_VIEWPORT) {
-        dst->win[0] = s[0]  * src->v.x + s[12];
-        dst->win[1] = s[5]  * src->v.y + s[13];
-        dst->win[2] = s[10] * src->v.z + s[14];
-        dst->win[3] = 1.0;
+        dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x + s[12];
+        dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y + s[13];
+        dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z + s[14];
+        dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
       } else {
-        dst->win[0] = UNVIEWPORT_X( src->v.x );
-        dst->win[1] = UNVIEWPORT_Y( src->v.y );
-        dst->win[2] = UNVIEWPORT_Z( src->v.z );
-        dst->win[3] = 1.0;
+        dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( src->v.x );
+        dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( src->v.y );
+        dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( src->v.z );
+        dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
       }
 
       dst->color[0] = src->tv.color.red;
@@ -109,21 +109,21 @@ void TAG(translate_vertex)(GLcontext *ctx,
       if (HAVE_HW_VIEWPORT) {
         if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) {
            GLfloat oow = 1.0 / src->v.w;
-           dst->win[0] = s[0]  * src->v.x * oow + s[12];
-           dst->win[1] = s[5]  * src->v.y * oow + s[13];
-           dst->win[2] = s[10] * src->v.z * oow + s[14];
-           dst->win[3] = oow;
+           dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x * oow + s[12];
+           dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y * oow + s[13];
+           dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z * oow + s[14];
+           dst->attrib[FRAG_ATTRIB_WPOS][3] = oow;
         } else {
-           dst->win[0] = s[0]  * src->v.x + s[12];
-           dst->win[1] = s[5]  * src->v.y + s[13];
-           dst->win[2] = s[10] * src->v.z + s[14];
-           dst->win[3] = src->v.w;
+           dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x + s[12];
+           dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y + s[13];
+           dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z + s[14];
+           dst->attrib[FRAG_ATTRIB_WPOS][3] = src->v.w;
         }
       } else {
-        dst->win[0] = UNVIEWPORT_X( src->v.x );
-        dst->win[1] = UNVIEWPORT_Y( src->v.y );
-        dst->win[2] = UNVIEWPORT_Z( src->v.z );
-        dst->win[3] = src->v.w;
+        dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( src->v.x );
+        dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( src->v.y );
+        dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( src->v.z );
+        dst->attrib[FRAG_ATTRIB_WPOS][3] = src->v.w;
       }
 
       dst->color[0] = src->v.color.red;
@@ -131,60 +131,60 @@ void TAG(translate_vertex)(GLcontext *ctx,
       dst->color[2] = src->v.color.blue;
       dst->color[3] = src->v.color.alpha;
 
-      dst->specular[0] = src->v.specular.red;
-      dst->specular[1] = src->v.specular.green;
-      dst->specular[2] = src->v.specular.blue;
+      dst->attrib[FRAG_ATTRIB_COL1][0] = UBYTE_TO_FLOAT(src->v.specular.red);
+      dst->attrib[FRAG_ATTRIB_COL1][1] = UBYTE_TO_FLOAT(src->v.specular.green);
+      dst->attrib[FRAG_ATTRIB_COL1][2] = UBYTE_TO_FLOAT(src->v.specular.blue);
 
-      dst->fog = src->v.specular.alpha/255.0;
+      dst->attrib[FRAG_ATTRIB_FOGC][0] = UBYTE_TO_FLOAT(src->v.specular.alpha);
 
       if (HAVE_PTEX_VERTICES &&
          ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) ||
           (format == PROJ_TEX1_VERTEX_FORMAT))) {
 
-        dst->texcoord[0][0] = src->pv.u0;
-        dst->texcoord[0][1] = src->pv.v0;
-        dst->texcoord[0][3] = src->pv.q0;
+        dst->attrib[FRAG_ATTRIB_TEX0][0] = src->pv.u0;
+        dst->attrib[FRAG_ATTRIB_TEX0][1] = src->pv.v0;
+        dst->attrib[FRAG_ATTRIB_TEX0][3] = src->pv.q0;
 
-        dst->texcoord[1][0] = src->pv.u1;
-        dst->texcoord[1][1] = src->pv.v1;
-        dst->texcoord[1][3] = src->pv.q1;
+        dst->attrib[FRAG_ATTRIB_TEX1][0] = src->pv.u1;
+        dst->attrib[FRAG_ATTRIB_TEX1][1] = src->pv.v1;
+        dst->attrib[FRAG_ATTRIB_TEX1][3] = src->pv.q1;
 
         if (HAVE_TEX2_VERTICES) {
-           dst->texcoord[2][0] = src->pv.u2;
-           dst->texcoord[2][1] = src->pv.v2;
-           dst->texcoord[2][3] = src->pv.q2;
+           dst->attrib[FRAG_ATTRIB_TEX2][0] = src->pv.u2;
+           dst->attrib[FRAG_ATTRIB_TEX2][1] = src->pv.v2;
+           dst->attrib[FRAG_ATTRIB_TEX2][3] = src->pv.q2;
         }
 
         if (HAVE_TEX3_VERTICES) {
-           dst->texcoord[3][0] = src->pv.u3;
-           dst->texcoord[3][1] = src->pv.v3;
-           dst->texcoord[3][3] = src->pv.q3;
+           dst->attrib[FRAG_ATTRIB_TEX3][0] = src->pv.u3;
+           dst->attrib[FRAG_ATTRIB_TEX3][1] = src->pv.v3;
+           dst->attrib[FRAG_ATTRIB_TEX3][3] = src->pv.q3;
         }
       }
       else {
-        dst->texcoord[0][0] = src->v.u0;
-        dst->texcoord[0][1] = src->v.v0;
-        dst->texcoord[0][3] = 1.0;
+        dst->attrib[FRAG_ATTRIB_TEX0][0] = src->v.u0;
+        dst->attrib[FRAG_ATTRIB_TEX0][1] = src->v.v0;
+        dst->attrib[FRAG_ATTRIB_TEX0][3] = 1.0;
 
-        dst->texcoord[1][0] = src->v.u1;
-        dst->texcoord[1][1] = src->v.v1;
-        dst->texcoord[1][3] = 1.0;
+        dst->attrib[FRAG_ATTRIB_TEX1][0] = src->v.u1;
+        dst->attrib[FRAG_ATTRIB_TEX1][1] = src->v.v1;
+        dst->attrib[FRAG_ATTRIB_TEX1][3] = 1.0;
 
         if (HAVE_TEX2_VERTICES) {
-           dst->texcoord[2][0] = src->v.u2;
-           dst->texcoord[2][1] = src->v.v2;
-           dst->texcoord[2][3] = 1.0;
+           dst->attrib[FRAG_ATTRIB_TEX2][0] = src->v.u2;
+           dst->attrib[FRAG_ATTRIB_TEX2][1] = src->v.v2;
+           dst->attrib[FRAG_ATTRIB_TEX2][3] = 1.0;
         }
 
         if (HAVE_TEX3_VERTICES) {
-           dst->texcoord[3][0] = src->v.u3;
-           dst->texcoord[3][1] = src->v.v3;
-           dst->texcoord[3][3] = 1.0;
+           dst->attrib[FRAG_ATTRIB_TEX3][0] = src->v.u3;
+           dst->attrib[FRAG_ATTRIB_TEX3][1] = src->v.v3;
+           dst->attrib[FRAG_ATTRIB_TEX3][3] = 1.0;
         }
       }
    }
 
-   dst->pointSize = ctx->Point._Size;
+   dst->pointSize = ctx->Point.Size;
 }
 
 
@@ -271,56 +271,7 @@ void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v )
    fprintf(stderr, "\n");
 }
 
-static void do_import( struct vertex_buffer *VB,
-                      struct gl_client_array *to,
-                      struct gl_client_array *from )
-{
-   GLuint count = VB->Count;
-
-   if (!to->Ptr) {
-      to->Ptr = ALIGN_MALLOC( VB->Size * 4 * sizeof(GLubyte), 32 );
-      to->Type = GL_UNSIGNED_BYTE;
-   }
-
-   /* No need to transform the same value 3000 times.
-    */
-   if (!from->StrideB) {
-      to->StrideB = 0;
-      count = 1;
-   }
-   else
-      to->StrideB = 4 * sizeof(GLubyte);
-   
-   _math_trans_4ub( (GLubyte (*)[4]) to->Ptr,
-                   from->Ptr,
-                   from->StrideB,
-                   from->Type,
-                   from->Size,
-                   0,
-                   count);
-}
-
-#ifndef IMPORT_QUALIFIER
-#define IMPORT_QUALIFIER static
-#endif
-
-IMPORT_QUALIFIER void TAG(import_float_colors)( GLcontext *ctx )
-{
-   LOCALVARS
-   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
-   struct gl_client_array *to = GET_UBYTE_COLOR_STORE();
-   do_import( VB, to, VB->ColorPtr[0] );
-   VB->ColorPtr[0] = to;
-}
 
-IMPORT_QUALIFIER void TAG(import_float_spec_colors)( GLcontext *ctx )
-{
-   LOCALVARS
-   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
-   struct gl_client_array *to = GET_UBYTE_SPEC_COLOR_STORE();
-   do_import( VB, to, VB->SecondaryColorPtr[0] );
-   VB->SecondaryColorPtr[0] = to;
-}
 
 /* Interpolate the elements of the VB not included in typical hardware
  * vertices.  
@@ -332,7 +283,7 @@ IMPORT_QUALIFIER void TAG(import_float_spec_colors)( GLcontext *ctx )
 #define INTERP_QUALIFIER static
 #endif
 
-#define GET_COLOR(ptr, idx) (((GLchan (*)[4])((ptr)->Ptr))[idx])
+#define GET_COLOR(ptr, idx) ((ptr)->data[idx])
 
 
 INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx,
@@ -344,13 +295,15 @@ INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx,
    struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 
    if (VB->ColorPtr[1]) {
-      INTERP_4CHAN( t,
+      assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat));
+
+      INTERP_4F( t,
                    GET_COLOR(VB->ColorPtr[1], dst),
                    GET_COLOR(VB->ColorPtr[1], out),
                    GET_COLOR(VB->ColorPtr[1], in) );
 
       if (VB->SecondaryColorPtr[1]) {
-        INTERP_3CHAN( t,
+        INTERP_3F( t,
                       GET_COLOR(VB->SecondaryColorPtr[1], dst),
                       GET_COLOR(VB->SecondaryColorPtr[1], out),
                       GET_COLOR(VB->SecondaryColorPtr[1], in) );
@@ -371,12 +324,12 @@ INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx,
       struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 
    if (VB->ColorPtr[1]) {
-      COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst), 
-                 GET_COLOR(VB->ColorPtr[1], src) );
+      COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), 
+               GET_COLOR(VB->ColorPtr[1], src) );
 
       if (VB->SecondaryColorPtr[1]) {
-        COPY_CHAN4( GET_COLOR(VB->SecondaryColorPtr[1], dst), 
-                    GET_COLOR(VB->SecondaryColorPtr[1], src) );
+        COPY_4FV( GET_COLOR(VB->SecondaryColorPtr[1], dst), 
+                  GET_COLOR(VB->SecondaryColorPtr[1], src) );
       }
    }
 
@@ -385,7 +338,6 @@ INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx,
 
 
 #undef INTERP_QUALIFIER
-#undef IMPORT_QUALIFIER
 #undef GET_COLOR
 
 #undef IND