summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-04-19 16:13:43 -0600
committerBrian Paul <[email protected]>2011-04-19 16:13:47 -0600
commit8b7f760f835f870b8f6af6c4d6613d44440f1dc5 (patch)
tree9783e47a97c748a3c4872d15b5d9386b8dacc9c4
parent08d1c91e6c185a186e49189b7ed48629f35a4659 (diff)
translate: disable clamping of instanced array indexes
This fixes piglit's draw-instanced-divisor test for softpipe on both the generic and SSE paths. This is temporary until we have the correct per-array max_index information.
-rw-r--r--src/gallium/auxiliary/translate/translate_generic.c9
-rw-r--r--src/gallium/auxiliary/translate/translate_sse.c16
2 files changed, 16 insertions, 9 deletions
diff --git a/src/gallium/auxiliary/translate/translate_generic.c b/src/gallium/auxiliary/translate/translate_generic.c
index ad809db720d..e4e1c868333 100644
--- a/src/gallium/auxiliary/translate/translate_generic.c
+++ b/src/gallium/auxiliary/translate/translate_generic.c
@@ -381,14 +381,17 @@ static ALWAYS_INLINE void PIPE_CDECL generic_run_one( struct translate_generic *
if (tg->attrib[attr].instance_divisor) {
index = instance_id / tg->attrib[attr].instance_divisor;
+ /* XXX we need to clamp the index here too, but to a
+ * per-array max value, not the draw->pt.max_index value
+ * that's being given to us via translate->set_buffer().
+ */
}
else {
index = elt;
+ /* clamp to avoid going out of bounds */
+ index = MIN2(index, tg->attrib[attr].max_index);
}
- /* clamp to void going out of bounds */
- index = MIN2(index, tg->attrib[attr].max_index);
-
src = tg->attrib[attr].input_ptr +
tg->attrib[attr].input_stride * index;
diff --git a/src/gallium/auxiliary/translate/translate_sse.c b/src/gallium/auxiliary/translate/translate_sse.c
index 09e70d93db4..c3d15661f05 100644
--- a/src/gallium/auxiliary/translate/translate_sse.c
+++ b/src/gallium/auxiliary/translate/translate_sse.c
@@ -1098,14 +1098,19 @@ static boolean init_inputs( struct translate_sse *p,
x86_mov_reg_imm(p->func, tmp_ECX, variant->instance_divisor);
x86_div(p->func, tmp_ECX); /* EAX = EDX:EAX / ECX */
}
+
+ /* XXX we need to clamp the index here too, but to a
+ * per-array max value, not the draw->pt.max_index value
+ * that's being given to us via translate->set_buffer().
+ */
} else {
x86_mov(p->func, tmp_EAX, elt);
- }
- /* Clamp to max_index
- */
- x86_cmp(p->func, tmp_EAX, buf_max_index);
- x86_cmovcc(p->func, tmp_EAX, buf_max_index, cc_AE);
+ /* Clamp to max_index
+ */
+ x86_cmp(p->func, tmp_EAX, buf_max_index);
+ x86_cmovcc(p->func, tmp_EAX, buf_max_index, cc_AE);
+ }
x86_imul(p->func, tmp_EAX, buf_stride);
x64_rexw(p->func);
@@ -1113,7 +1118,6 @@ static boolean init_inputs( struct translate_sse *p,
x86_cmp(p->func, p->count_EBP, p->tmp_EAX);
-
/* In the linear case, keep the buffer pointer instead of the
* index number.
*/