r300: use vbo_split_prims to split up large vertex buffers.
authorDave Airlie <airlied@redhat.com>
Thu, 18 Jun 2009 03:20:32 +0000 (13:20 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 18 Jun 2009 03:25:38 +0000 (13:25 +1000)
This lets ut2004 avoid hitting the elt warning.

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

index cc5650fb7c8976c5be68bfed128b92332e6a99c4..92bb0ee3385b33aaef6f4db8f1a1d77729cbd173 100644 (file)
@@ -452,12 +452,21 @@ static void r300DrawPrims(GLcontext *ctx,
                         GLuint min_index,
                         GLuint max_index)
 {
+       struct split_limits limits;
        GLboolean retval;
 
+       limits.max_verts = 65535;
+       limits.max_indices = 65535;
+       limits.max_vb_size = 1024*1024;
+
        if (min_index) {
                vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, r300DrawPrims );
                return;
        }
+       if ((ib && ib->count > 65536)) {
+               vbo_split_prims (ctx, arrays, prim, nr_prims, ib, min_index, max_index, r300DrawPrims, &limits);
+               return;
+       }
 
        /* Make an attempt at drawing */
        retval = r300TryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
index 1356305a212a451cf33683fdecd9de1a38569158..bf50b062f6ce65ac9ded40bcc4eb2c9a531dd623 100644 (file)
@@ -243,7 +243,6 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
                fprintf(stderr, "%s: nr=%d, ofs=0x%08x\n", __FUNCTION__, nr,
                        offset);
 
-
        if (!rmesa->radeon.radeonScreen->kernel_mm) {
                BEGIN_BATCH(sz+2+(nr * 2));
                OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, sz - 1);
@@ -384,7 +383,8 @@ void r300RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
                 * arrays. *sigh*
                 */
                r300EmitElts(ctx, num_verts);
-               r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
+               /* don't pass start if we are split up */
+               r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, 0);
                if (rmesa->radeon.radeonScreen->kernel_mm) {
                        BEGIN_BATCH_NO_AUTOSTATE(2);
                        OUT_BATCH_REGSEQ(R300_VAP_VF_MAX_VTX_INDX, 1);