Index: r300_context.c
===================================================================
RCS file: /cvsroot/r300/r300_driver/r300/r300_context.c,v
retrieving revision 1.30
diff -u -b -B -u -r1.30 r300_context.c
--- r300_context.c	1 Jul 2005 21:22:05 -0000	1.30
+++ r300_context.c	27 Jul 2005 21:03:39 -0000
@@ -367,6 +368,17 @@
 	ctx->Const.MinLineWidthAA = 1.0;
 	ctx->Const.MaxLineWidth = R300_LINESIZE_MAX;
 	ctx->Const.MaxLineWidthAA = R300_LINESIZE_MAX;
+#ifdef R300_MAOS_VERTS
+	ctx->Const.MaxArrayLockSize = RADEON_BUFFER_SIZE / (R300_MAX_AOS_ARRAYS*4*4);
+	ctx->Const.MaxArrayLockSize *= 4;
+#else	
+	ctx->Const.MaxArrayLockSize = RADEON_BUFFER_SIZE / (4*4);
+#endif
+#ifdef DMA_EXT
+	ctx->Const.MaxArrayLockSize *= 32;
+#endif
+	fprintf(stderr, "lock size %d\n", ctx->Const.MaxArrayLockSize);
 
 	/* Initialize the software rasterizer and helper modules.
 	 */
@@ -444,9 +456,13 @@
 		TCL_FALLBACK(r300->radeon.glCtx, RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
 	}
 
 	return GL_TRUE;
 }
 
Index: r300_context.h
===================================================================
RCS file: /cvsroot/r300/r300_driver/r300/r300_context.h,v
retrieving revision 1.69
diff -u -b -B -u -r1.69 r300_context.h
--- r300_context.h	14 Jul 2005 06:07:50 -0000	1.69
+++ r300_context.h	27 Jul 2005 21:03:44 -0000
@@ -48,6 +48,9 @@
 #include "radeon_context.h"
 
 #define USE_ARB_F_P 1
+//#define DMA_EXT
+//#define R300_MAOS_VERTS
 
 struct r300_context;
 typedef struct r300_context r300ContextRec;
@@ -117,7 +120,12 @@
 /* A retained region, eg vertices for indexed vertices.
  */
 struct r300_dma_region {
+#ifdef DMA_EXT
+	int bufs_used;
+	struct r300_dma_buffer *bufs[32];
+#else
 	struct r300_dma_buffer *buf;
+#endif
 	char *address;		/* == buf->address */
 	int start, end, ptr;	/* offsets from start of buf */
 
Index: r300_ioctl.c
===================================================================
RCS file: /cvsroot/r300/r300_driver/r300/r300_ioctl.c,v
retrieving revision 1.34
diff -u -b -B -u -r1.34 r300_ioctl.c
--- r300_ioctl.c	14 Jul 2005 06:07:52 -0000	1.34
+++ r300_ioctl.c	27 Jul 2005 21:03:54 -0000
+#ifdef DMA_EXT
+void r300ReleaseDmaRegion(r300ContextPtr rmesa,
+			  struct r300_dma_region *region, const char *caller)
+{
+	int i;
+	if (RADEON_DEBUG & DEBUG_IOCTL)
+		fprintf(stderr, "%s from %s\n", __FUNCTION__, caller);
+
+#if 0		
+	if (!region->buf)
+		return;
+#endif
+	if (rmesa->dma.flush)
+		rmesa->dma.flush(rmesa);
+
+	for(i=0; i < region->bufs_used; i++)
+	if (region->bufs[i] && (--region->bufs[i]->refcount == 0)) {
+		drm_radeon_cmd_header_t *cmd;
+
+		/*if (RADEON_DEBUG & (DEBUG_IOCTL | DEBUG_DMA))
+			fprintf(stderr, "%s -- DISCARD BUF %d\n", __FUNCTION__,
+				region->buf->buf->idx);*/
+		cmd =
+		    (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa,
+								sizeof(*cmd) / 4,
+								__FUNCTION__);
+		cmd->dma.cmd_type = R300_CMD_DMA_DISCARD;
+		cmd->dma.buf_idx = region->bufs[i]->buf->idx; //region->buf->buf->idx;
+		/* XXX */
+		//FREE(region->bufs[i]);
+		//region->bufs[i] = NULL;
+		rmesa->dma.nr_released_bufs++;
+	}
+
+	//region->buf = 0;
+	region->bufs_used = 0;
+	region->start = region->ptr = region->end = 0;
+}
+
+void r300AllocDmaRegion(r300ContextPtr rmesa,
+			struct r300_dma_region *region,
+			int bytes, int alignment)
+{
+	struct r300_dma_buffer *dmabuf;
+	int fd = rmesa->radeon.dri.fd;
+	int i;
+	int buf_count;
+	int index[32] = {0};
+	int size[32] = {0};
+	drmDMAReq dma;
+	int ret;
+	drmBufPtr buf;
 
+	if (RADEON_DEBUG & DEBUG_IOCTL)
+		fprintf(stderr, "%s %d\n", __FUNCTION__, bytes);
+
+	if (rmesa->dma.flush)
+		rmesa->dma.flush(rmesa);
+
+	if(region->bufs_used)
+		r300ReleaseDmaRegion(rmesa, region, __FUNCTION__);
+	
+	if(region == NULL) fprintf(stderr, "AIEE!!\n");
+	if(rmesa->dma.current.bufs_used && rmesa->dma.current.bufs[0]->refcount &&
+		rmesa->dma.current.ptr/*start*/ + bytes + alignment </*=*/ rmesa->dma.current.end){
+		//buf = region->bufs[0]->buf;
+		//region->bufs[0] = &rmesa->dma.current;
+		
+		rmesa->dma.current.start = rmesa->dma.current.ptr;
+		rmesa->dma.current.start = (rmesa->dma.current.start + alignment) & ~alignment;
+		
+		rmesa->dma.current.ptr = rmesa->dma.current.start + bytes;
+		
+		region->bufs_used = rmesa->dma.current.bufs_used;
+		for(i=0; i < region->bufs_used; i++){
+			region->bufs[i] = rmesa->dma.current.bufs[i];
+			if(region->bufs[i]->refcount == 0){
+				fprintf(stderr, "AIEEE!\n");
+				exit(1);
+			}
+			
+			region->bufs[i]->refcount++;
+		}
+		region->address = rmesa->dma.current.address;
+		region->start = rmesa->dma.current.start;
+		region->ptr = rmesa->dma.current.ptr;
+		region->end = rmesa->dma.current.end;
+		return ;
+	}
+	if (rmesa->dma.nr_released_bufs > 4)
+		r300FlushCmdBuf(rmesa, __FUNCTION__);
+	
+	buf_count = (bytes + RADEON_BUFFER_SIZE - 1) / RADEON_BUFFER_SIZE;
+	
+	dma.context = rmesa->radeon.dri.hwContext;
+	dma.send_count = 0;
+	dma.send_list = NULL;
+	dma.send_sizes = NULL;
+	dma.flags = 0;
+	dma.request_count = buf_count;
+	dma.request_size = RADEON_BUFFER_SIZE;
+	dma.request_list = /*&*/index;
+	dma.request_sizes = /*&*/size;
+	dma.granted_count = 0;
+
+	LOCK_HARDWARE(&rmesa->radeon);	/* no need to validate */
+
+	ret = drmDMA(fd, &dma);
+	if (ret != 0) {
+		/* Try to release some buffers and wait until we can't get any more */
+		if (rmesa->dma.nr_released_bufs) {
+			r300FlushCmdBufLocked(rmesa, __FUNCTION__);
+		}
+
+		if (RADEON_DEBUG & DEBUG_DMA)
+			fprintf(stderr, "Waiting for buffers\n");
+
+		radeonWaitForIdleLocked(&rmesa->radeon);
+		ret = drmDMA(fd, &dma);
+
+		if (ret != 0) {
+			UNLOCK_HARDWARE(&rmesa->radeon);
+			fprintf(stderr, "Error: Could not get dma buffer... exiting\n");
+			exit(-1);
+		}
+	}
+	UNLOCK_HARDWARE(&rmesa->radeon);
+	//fprintf(stderr, "a=%d, b=%d\n", a, b);
+	
+	rmesa->dma.current.bufs_used = buf_count;
+	for(i=0; i < buf_count; i++){
+		rmesa->dma.current.bufs[i] = CALLOC_STRUCT(r300_dma_buffer);
+		rmesa->dma.current.bufs[i]->buf = &rmesa->radeon.radeonScreen->buffers->list[index[i]];
+		rmesa->dma.current.bufs[i]->refcount = 1;
+	}
+	
+	buf = rmesa->dma.current.bufs[0]->buf;
+	rmesa->dma.current.address = buf->address;
+	rmesa->dma.current.start = 0;
+	rmesa->dma.current.ptr = bytes;
+	rmesa->dma.current.end  = buf_count * RADEON_BUFFER_SIZE;
+			
+	region->bufs_used = buf_count;
+	for(i=0; i < buf_count; i++)
+		region->bufs[i] = rmesa->dma.current.bufs[i];
+	/*for(; i < 10; i++)
+		region->bufs[i] = NULL;*/
+	
+	region->address = rmesa->dma.current.address;
+	region->start = rmesa->dma.current.start;
+	region->ptr = rmesa->dma.current.ptr;
+	region->end = rmesa->dma.current.end;
+	
+}
+
+#else
 void r300RefillCurrentDmaRegion(r300ContextPtr rmesa)
 {
 	struct r300_dma_buffer *dmabuf;
@@ -687,6 +887,26 @@
 	if (RADEON_DEBUG & DEBUG_IOCTL)
 		fprintf(stderr, "%s %d\n", __FUNCTION__, bytes);
 
+	if(1){
+		static struct timeval t;
+		struct timeval temp;
+		unsigned long msec;
+		static unsigned long _bytes=0;
+		
+		_bytes += bytes;
+				
+		gettimeofday(&temp, NULL);
+		msec = (temp.tv_sec - t.tv_sec) * 1000000 + temp.tv_usec - t.tv_usec;
+		if(msec > 1000000){
+			float f=msec/1000000.0;
+			f = _bytes / f;
+			
+			fprintf(stderr, "%.02f\n", f/1024.0/1024.0);
+			t = temp;
+			_bytes=0;
+		}
+		
+	}
 	if (rmesa->dma.flush)
 		rmesa->dma.flush(rmesa);
 
@@ -713,6 +933,7 @@
 
 	assert(rmesa->dma.current.ptr <= rmesa->dma.current.end);
 }
+#endif
 
 /* Called via glXGetMemoryOffsetMESA() */
 GLuint r300GetMemoryOffsetMESA(__DRInativeDisplay * dpy, int scrn,
