r300: fixup vertex attributes ordering
authorMaciej Cencora <m.cencora@gmail.com>
Wed, 27 May 2009 20:17:31 +0000 (22:17 +0200)
committerDave Airlie <airlied@redhat.com>
Sun, 7 Jun 2009 06:39:23 +0000 (16:39 +1000)
Always allocate the vertex program input registers in the same order as the vertex attributes are passed in vertex arrays.

src/mesa/drivers/dri/r300/r300_vertprog.c

index 949c0b499c4ccc8b6d8e440329a7de40ea2fdb1f..35e5ec0f8e748788459410fdd9569a7afcace3b4 100644 (file)
@@ -215,21 +215,8 @@ static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
 static unsigned long t_src_index(struct r300_vertex_program *vp,
                                 struct prog_src_register *src)
 {
-       int i;
-       int max_reg = -1;
-
        if (src->File == PROGRAM_INPUT) {
-               if (vp->inputs[src->Index] != -1)
-                       return vp->inputs[src->Index];
-
-               for (i = 0; i < VERT_ATTRIB_MAX; i++)
-                       if (vp->inputs[i] > max_reg)
-                               max_reg = vp->inputs[i];
-
-               vp->inputs[src->Index] = max_reg + 1;
-
-               //vp_dump_inputs(vp, __FUNCTION__);
-
+               assert(vp->inputs[src->Index] != -1);
                return vp->inputs[src->Index];
        } else {
                if (src->Index < 0) {
@@ -944,11 +931,17 @@ static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,
 static void t_inputs_outputs(struct r300_vertex_program *vp)
 {
        int i;
-       int cur_reg = 0;
+       int cur_reg;
 
-       for (i = 0; i < VERT_ATTRIB_MAX; i++)
-               vp->inputs[i] = -1;
+       cur_reg = -1;
+       for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+               if (vp->key.InputsRead & (1 << i))
+                       vp->inputs[i] = ++cur_reg;
+               else
+                       vp->inputs[i] = -1;
+       }
 
+       cur_reg = 0;
        for (i = 0; i < VERT_RESULT_MAX; i++)
                vp->outputs[i] = -1;