fix mixed conventional / generic vertex arrays which caused a wrong array order leadi...
authorRoland Scheidegger <rscheidegger@gmx.ch>
Thu, 30 Nov 2006 00:52:54 +0000 (00:52 +0000)
committerRoland Scheidegger <rscheidegger@gmx.ch>
Thu, 30 Nov 2006 00:52:54 +0000 (00:52 +0000)
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 9f109e07ff511700d16e155f32f7c20d0e56f504..fa38a78e2634d8d5c5bccda4fb9153d62f626548 100644 (file)
@@ -107,6 +107,8 @@ struct r200_vertex_program {
         VERTEX_SHADER_INSTRUCTION instr[R200_VSF_MAX_INST + 6];
         int pos_end;
         int inputs[VERT_ATTRIB_MAX];
+        int rev_inputs[16];
+        int gen_inputs_mapped;
         int native;
         int fogpidx;
         int fogmode;
index f6ab2f00746e813069471eaeba01a56dbfb9a806..39c1f68911fc61e5b696bf7f7a3c6fc86eaa24cf 100644 (file)
@@ -385,6 +385,14 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
    GLuint vfmt0 = 0, vfmt1 = 0;
    GLuint count = VB->Count;
    GLuint i;
+   GLuint generic_in_mapped = 0;
+   struct r200_vertex_program *vp = NULL;
+
+   /* this looks way more complicated than necessary... */
+   if (ctx->VertexProgram._Enabled) {
+      vp = rmesa->curr_vp_hw;
+      generic_in_mapped = vp->gen_inputs_mapped;
+   }
 
    if (inputs & VERT_BIT_POS) {
       if (!rmesa->tcl.obj.buf) 
@@ -404,6 +412,19 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
       }
       component[nr++] = &rmesa->tcl.obj;
    }
+   else if (generic_in_mapped & (1 << 0)) {
+      int geninput = vp->rev_inputs[0] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |=  R200_VTX_W0 | R200_VTX_Z0;
+   }
 
    if (inputs & VERT_BIT_NORMAL) {
       if (!rmesa->tcl.norm.buf)
@@ -463,6 +484,23 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
 
       component[nr++] = &rmesa->tcl.rgba;
    }
+/*     vfmt0 |= R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT;
+       emit_ubyte_rgba( ctx, &rmesa->tcl.rgba, 
+               (char *)VB->ColorPtr[0]->data, 4,
+                     VB->ColorPtr[0]->stride, count);*/
+   else if (generic_in_mapped & (1 << 2)) {
+      int geninput = vp->rev_inputs[2] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT;
+   }
 
 
    if (inputs & VERT_BIT_COLOR1) {
@@ -480,8 +518,49 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
       vfmt0 |= R200_VTX_FP_RGB << R200_VTX_COLOR_1_SHIFT; 
       component[nr++] = &rmesa->tcl.spec;
    }
+   else if (generic_in_mapped & (1 << 3)) {
+      int geninput = vp->rev_inputs[3] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT;
+   }
 
-   for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) {
+   if (generic_in_mapped & (1 << 4)) {
+      int geninput = vp->rev_inputs[4] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_2_SHIFT;
+   }
+
+   if (generic_in_mapped & (1 << 5)) {
+      int geninput = vp->rev_inputs[5] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_3_SHIFT;
+   }
+
+   for ( i = 0 ; i < 6 ; i++ ) {
       if (inputs & (VERT_BIT_TEX0 << i)) {
         if (!rmesa->tcl.tex[i].buf)
             emit_vector( ctx, 
@@ -494,8 +573,37 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
         vfmt1 |= VB->TexCoordPtr[i]->size << (i * 3);
         component[nr++] = &rmesa->tcl.tex[i];
       }
+      else if (generic_in_mapped & (1 << (i + 6))) {
+        int geninput = vp->rev_inputs[i + 6] - VERT_ATTRIB_GENERIC0;
+        if (!rmesa->tcl.generic[geninput].buf) {
+            emit_vector( ctx,
+                        &(rmesa->tcl.generic[geninput]),
+                       (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                       4,
+                       VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                       count );
+        }
+        component[nr++] = &rmesa->tcl.generic[geninput];
+        vfmt1 |= 4 << (R200_VTX_TEX0_COMP_CNT_SHIFT + (i * 3));
+      }
    }
 
+   if (generic_in_mapped & (1 << 13)) {
+      int geninput = vp->rev_inputs[13] - VERT_ATTRIB_GENERIC0;
+      if (!rmesa->tcl.generic[geninput].buf) {
+         emit_vector( ctx,
+                     &(rmesa->tcl.generic[geninput]),
+                     (char *)VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->data,
+                     4,
+                     VB->AttribPtr[geninput + VERT_ATTRIB_GENERIC0]->stride,
+                     count );
+      }
+      component[nr++] = &rmesa->tcl.generic[geninput];
+      vfmt0 |= R200_VTX_XY1 | R200_VTX_Z1 | R200_VTX_W1;
+   }
+
+/* doesn't work. Wrong order with mixed generic & conventional! */
+/*
    if (ctx->VertexProgram._Enabled) {
       int *vp_inputs = rmesa->curr_vp_hw->inputs;
       for ( i = VERT_ATTRIB_GENERIC0; i < VERT_ATTRIB_MAX; i++ ) {
@@ -539,6 +647,7 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
         }
       }
    }
+*/
 
    if (vfmt0 != rmesa->hw.vtx.cmd[VTX_VTXFMT_0] ||
        vfmt1 != rmesa->hw.vtx.cmd[VTX_VTXFMT_1]) { 
index ce14c617c8ea451f5e329187da55e673d75ebf86..899e84caa0f48e093de181dcaaa44f2c09c5503f 100644 (file)
@@ -405,6 +405,7 @@ static GLboolean r200_translate_vertex_program(GLcontext *ctx, struct r200_verte
    int dofogfix = 0;
    int fog_temp_i = 0;
    int free_inputs;
+   int free_inputs_conv;
    int array_count = 0;
 
    vp->native = GL_FALSE;
@@ -530,6 +531,7 @@ static GLboolean r200_translate_vertex_program(GLcontext *ctx, struct r200_verte
         array_count++;
       }
    }
+   free_inputs_conv = free_inputs;
    /* using VERT_ATTRIB_TEX6/7 would be illegal */
    /* completely ignore aliasing? */
    for (i = VERT_ATTRIB_GENERIC0; i < VERT_ATTRIB_MAX; i++) {
@@ -548,11 +550,13 @@ static GLboolean r200_translate_vertex_program(GLcontext *ctx, struct r200_verte
            if (free_inputs & (1 << j)) {
               free_inputs &= ~(1 << j);
               vp->inputs[i] = j;
+              vp->rev_inputs[j] = i;
               break;
            }
         }
       }
    }
+   vp->gen_inputs_mapped = free_inputs ^ free_inputs_conv;
 
    if (!(mesa_vp->Base.OutputsWritten & (1 << VERT_RESULT_HPOS))) {
       if (R200_DEBUG & DEBUG_FALLBACKS) {