Am Dienstag, 21. September 2004 00:00 schrieb Roland Scheidegger:
> Eric Anholt wrote:
> > The attached patch removes the mandatory emits of all state which were
> > happening after each cmdbuf flush. Instead, we set a flag after a
> > cmdbuf flush saying "save the state at the next unlock," which means
> > memcpying the state atoms off. When we actually see the context get
> > lost, then we "back up" and restore state -- make a new cmdbuf, dirty
> > all state, emit it, flush it, then put the old cmdbuf back.
>
> I like it ;-). I thought the locking really to be inefficient (but never
> did anything against it...).
>
> > I also
> > removed the dirty/clean state lists and made a single one. The
> > reasoning was that we have to walk the entire list on emit (and twice
> > when the all-dirty is set) anyway, and I felt that this was cleaner.
>
> It was not always that inefficient in r200EmitState, only since the
> fixed emit order was introduced (and still no one understands why the
> fixed order is needed). Didn't seem to make a performance difference
> though (profiling showed it really didn't use much cpu time).
>
> > This gets about a 5% speedup for me in ipers (which I wish was more
> > accurate in its reporting), and doesn't touch glxgears. I didn't have
> > any interesting apps besides glxgears handy to benchmark with. Any
> > thoughts on this? If people think it's a good idea, I'll do it for
> > radeon as well.
>
> I certainly think it's a good idea.
> However, I still think it should be possible to lock across multiple
> buffers, to make it possible to emit larger numbers of vertices at once
> (for instance for things like glDrawElements), which, as far as I
> understand, just cannot work if you're restricted to one buffer.
Is this related?
http://marc.theaimsgroup.com/?l=dri-devel&m=108350714917936&w=2
-Dieter
? depend
Index: r200_pixel.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r200/r200_pixel.c,v
retrieving revision 1.6
diff -u -r1.6 r200_pixel.c
--- r200_pixel.c 27 Apr 2004 18:37:13 -0000 1.6
+++ r200_pixel.c 2 May 2004 14:01:47 -0000
@@ -287,7 +287,7 @@
static void do_draw_pix( GLcontext *ctx,
GLint x, GLint y, GLsizei width, GLsizei height,
GLint pitch,
- const void *pixels,
+ int src_offset,
GLuint planemask)
{
r200ContextPtr rmesa = R200_CONTEXT(ctx);
@@ -297,7 +297,6 @@
int i;
int blit_format;
int size;
- int src_offset = r200GartOffsetFromVirtual( rmesa, pixels );
int src_pitch = pitch * rmesa->r200Screen->cpp;
if (R200_DEBUG & DEBUG_PIXEL)
@@ -429,14 +428,20 @@
do_draw_pix( ctx, x, y, width, height, pitch, pixels, planemask );
return GL_TRUE;
}
- else if (0)
+ else
{
/* Pixels is in regular memory -- get dma buffers and perform
* upload through them.
*/
+ struct r200_dma_region region;
+ memset(®ion, 0, sizeof(region));
+ r200AllocDmaRegion( rmesa, ®ion, size, 1024 );
+ memcpy(region.address + region.start, pixels, size);
+
+ do_draw_pix( ctx, x, y, width, height, pitch, GET_START(®ion), planemask );
+
+ r200ReleaseDmaRegion(rmesa,®ion,__FUNCTION__);
}
- else
- return GL_FALSE;
}
static void