summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Rusin <zackr@vmware.com>2010-06-16 08:52:33 -0400
committerZack Rusin <zackr@vmware.com>2010-06-16 14:43:56 -0400
commit668fa68019ec09fcd0486e612d01d61a0c9a4b2f (patch)
tree3cf52ea6769808d7175533c5d72052895438ab50
parente41ad8d2c5cac28cbdc3c1c234f1149c91a8d803 (diff)
translate: don't crash on elts paths with instances
-rw-r--r--src/gallium/auxiliary/translate/translate_generic.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/gallium/auxiliary/translate/translate_generic.c b/src/gallium/auxiliary/translate/translate_generic.c
index f8dbd2b36a1..0e43a512ee8 100644
--- a/src/gallium/auxiliary/translate/translate_generic.c
+++ b/src/gallium/auxiliary/translate/translate_generic.c
@@ -378,25 +378,28 @@ static void PIPE_CDECL generic_run_elts( struct translate *translate,
char *dst = (vert +
tg->attrib[attr].output_offset);
- if (tg->attrib[attr].instance_divisor) {
- index = instance_id / tg->attrib[attr].instance_divisor;
- } else {
- index = elt;
- }
+ if (tg->attrib[attr].type == TRANSLATE_ELEMENT_NORMAL) {
+ if (tg->attrib[attr].instance_divisor) {
+ index = instance_id / tg->attrib[attr].instance_divisor;
+ } else {
+ index = elt;
+ }
- index = MIN2(index, tg->attrib[attr].max_index);
+ index = MIN2(index, tg->attrib[attr].max_index);
- src = tg->attrib[attr].input_ptr +
- tg->attrib[attr].input_stride * index;
+ src = tg->attrib[attr].input_ptr +
+ tg->attrib[attr].input_stride * index;
- tg->attrib[attr].fetch( data, src, 0, 0 );
+ tg->attrib[attr].fetch( data, src, 0, 0 );
+ } else {
+ data[0] = (float)instance_id;
+ }
if (0) debug_printf("vert %d/%d attr %d: %f %f %f %f\n",
i, elt, attr, data[0], data[1], data[2], data[3]);
tg->attrib[attr].emit( data, dst );
}
-
vert += tg->translate.key.output_stride;
}
}