Mesa (master): r300: split vbo rendering with big drawarray case

Jerome Glisse glisse at kemper.freedesktop.org
Mon Aug 17 10:49:23 UTC 2009


Module: Mesa
Branch: master
Commit: c952c1f109960a50aebf5a6d6bf3cf1e005e0729
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c952c1f109960a50aebf5a6d6bf3cf1e005e0729

Author: Jerome Glisse <jglisse at redhat.com>
Date:   Mon Aug 17 12:46:34 2009 +0200

r300: split vbo rendering with big drawarray case

Split vbo rendering when the number of elements requested
by drawarrays is bigger than 65536.

---

 src/mesa/drivers/dri/r300/r300_render.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index 369c3ed..45330cd 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -394,12 +394,23 @@ void r300RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
 		}
 
 	} else {
-		if (num_verts > 65535) {
-			WARN_ONCE("Fixme: can't handle more then 65535 vertices");
+		GLuint first, incr, offset = 0;
+
+		if (!split_prim_inplace(prim & PRIM_MODE_MASK, &first, &incr) &&
+			num_verts > 65500) {
+			WARN_ONCE("Fixme: can't handle spliting prim %d\n", prim);
 			return;
 		}
-		r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
-		r300FireAOS(rmesa, num_verts, type);
+		r300_emit_scissor(rmesa->radeon.glCtx);
+		while (num_verts > 0) {
+			int nr;
+			nr = MIN2(num_verts, 65535);
+			nr -= (nr - first) % incr;
+			r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start + offset);
+			r300FireAOS(rmesa, nr, type);
+			num_verts -= nr;
+			offset += nr;
+		}
 	}
 	COMMIT_BATCH();
 }




More information about the mesa-commit mailing list