draw: check for instance divisors in vcache_check_run()
authorBrian Paul <brianp@vmware.com>
Tue, 3 Aug 2010 22:32:32 +0000 (16:32 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 3 Aug 2010 22:37:58 +0000 (16:37 -0600)
When we have instance divisors we don't really know which vertex
elements we'll be fetching ahead of time.

This fixes a bug in instanced drawing which was exposed by the new
draw_vbo() code because of max_index not being ~0 as often as it used
to be.  The test for max_index >= DRAW_PIPE_MAX_VERTICES often hid
this problem before.

src/gallium/auxiliary/draw/draw_pt_vcache.c

index 8ef94c3163c2283b2b6fd86d4e3996a873c82e76..d2fa1c6d4e0f2e879e0f446010638f751eb9952c 100644 (file)
@@ -339,6 +339,25 @@ format_from_get_elt( pt_elt_func get_elt )
 #endif
 
 
+/**
+ * Check if any vertex attributes use instance divisors.
+ * Note that instance divisors complicate vertex fetching so we need
+ * to take the vcache path when they're in use.
+ */
+static boolean
+any_instance_divisors(const struct draw_context *draw)
+{
+   uint i;
+
+   for (i = 0; i < draw->pt.nr_vertex_elements; i++) {
+      uint div = draw->pt.vertex_element[i].instance_divisor;
+      if (div)
+         return TRUE;
+   }
+   return FALSE;
+}
+
+
 static INLINE void 
 vcache_check_run( struct draw_pt_front_end *frontend, 
                   pt_elt_func get_elt,
@@ -382,6 +401,9 @@ vcache_check_run( struct draw_pt_front_end *frontend,
    if (max_index >= (unsigned) DRAW_PIPE_MAX_VERTICES)
       goto fail;
 
+   if (any_instance_divisors(draw))
+      goto fail;
+
    fetch_count = max_index + 1 - min_index;
 
    if (0)