submit vertex weights to make World of Warcraft maybe happy (bug 8250)
authorRoland Scheidegger <sroland@tungstengraphics.com>
Wed, 13 Dec 2006 23:34:44 +0000 (00:34 +0100)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Wed, 13 Dec 2006 23:34:44 +0000 (00:34 +0100)
submit the vertex weights to hw, which will enable broken vertex programs
errorneously using them to work. Note however that this will only work
if glWeight is used, there is no code in mesa at all to deal with weight
vertex array (glWeightPointerARB).

src/mesa/drivers/dri/r200/r200_context.h
src/mesa/drivers/dri/r200/r200_maos_arrays.c
src/mesa/drivers/dri/r200/r200_vertprog.c

index fa38a78e2634d8d5c5bccda4fb9153d62f626548..44c67b68cbc5b52bdf4ab2c58e72692ddf7f8dd3 100644 (file)
@@ -735,6 +735,7 @@ struct r200_tcl_info {
    GLuint *Elts;
 
    struct r200_dma_region indexed_verts;
+   struct r200_dma_region weight;
    struct r200_dma_region obj;
    struct r200_dma_region rgba;
    struct r200_dma_region spec;
index 39c1f68911fc61e5b696bf7f7a3c6fc86eaa24cf..270dc35a46aba09a04788b4644234e9674ac7413 100644 (file)
@@ -423,7 +423,21 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
                      count );
       }
       component[nr++] = &rmesa->tcl.generic[geninput];
-      vfmt0 |=  R200_VTX_W0 | R200_VTX_Z0;
+      vfmt0 |= R200_VTX_W0 | R200_VTX_Z0;
+   }
+
+   if (inputs & VERT_BIT_WEIGHT) {
+      if (!rmesa->tcl.weight.buf)
+        emit_vector( ctx, 
+                     &rmesa->tcl.weight, 
+                     (char *)VB->AttribPtr[VERT_ATTRIB_WEIGHT]->data,
+                     VB->AttribPtr[VERT_ATTRIB_WEIGHT]->size,
+                     VB->AttribPtr[VERT_ATTRIB_WEIGHT]->stride,
+                     count);
+
+      assert(VB->AttribPtr[VERT_ATTRIB_WEIGHT]->size <= 4);
+      vfmt0 |= VB->AttribPtr[VERT_ATTRIB_WEIGHT]->size << R200_VTX_WEIGHT_COUNT_SHIFT;
+      component[nr++] = &rmesa->tcl.weight;
    }
 
    if (inputs & VERT_BIT_NORMAL) {
@@ -672,6 +686,9 @@ void r200ReleaseArrays( GLcontext *ctx, GLuint newinputs )
    if (newinputs & VERT_BIT_POS) 
      r200ReleaseDmaRegion( rmesa, &rmesa->tcl.obj, __FUNCTION__ );
 
+   if (newinputs & VERT_BIT_WEIGHT) 
+     r200ReleaseDmaRegion( rmesa, &rmesa->tcl.weight, __FUNCTION__ );
+
    if (newinputs & VERT_BIT_NORMAL) 
       r200ReleaseDmaRegion( rmesa, &rmesa->tcl.norm, __FUNCTION__ );
 
index 899e84caa0f48e093de181dcaaa44f2c09c5503f..491701b796eccb996e90255d9e4b0a158ed948b4 100644 (file)
@@ -503,7 +503,6 @@ static GLboolean r200_translate_vertex_program(GLcontext *ctx, struct r200_verte
       array_count++;
    }
    if (mesa_vp->Base.InputsRead & VERT_BIT_WEIGHT) {
-   /* we don't actually handle that later. Then again, we don't have to... */
       vp->inputs[VERT_ATTRIB_WEIGHT] = 12;
       array_count++;
    }