OSDN Git Service

r300: Always emit LOAD_VBPNTR immediately before index-based rendering
authorNicolai Haehnle <nhaehnle@gmail.com>
Sat, 26 Jul 2008 14:15:33 +0000 (16:15 +0200)
committerNicolai Haehnle <nhaehnle@gmail.com>
Sat, 26 Jul 2008 14:15:33 +0000 (16:15 +0200)
This fixes one type of lockup I've been seeing on my test system.

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

index 69ff6d5..58bc088 100644 (file)
@@ -269,13 +269,24 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
                return;
 
        if (vb->Elts) {
-               r300EmitAOS(rmesa, rmesa->state.aos_count, start);
                if (num_verts > 65535) {
                        /* not implemented yet */
                        WARN_ONCE("Too many elts\n");
                        return;
                }
+               /* Note: The following is incorrect, but it's the best I can do
+                * without a major refactoring of how DMA memory is handled.
+                * The problem: Ensuring that both vertex arrays *and* index
+                * arrays are at the right position, and then ensuring that
+                * the LOAD_VBPNTR, DRAW_INDX and INDX_BUFFER packets are emitted
+                * at once.
+                *
+                * So why is the following incorrect? Well, it seems like
+                * allocating the index array might actually evict the vertex
+                * arrays. *sigh*
+                */
                r300EmitElts(ctx, vb->Elts, num_verts);
+               r300EmitAOS(rmesa, rmesa->state.aos_count, start);
                r300FireEB(rmesa, rmesa->state.elt_dma.aos_offset, num_verts, type);
        } else {
                r300EmitAOS(rmesa, rmesa->state.aos_count, start);