diff options
author | Eric Anholt <[email protected]> | 2008-10-03 16:20:00 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2008-10-07 18:52:12 -0700 |
commit | fc19536aa989ad61e95c281883d32860d767f8ef (patch) | |
tree | ff3cb0a8a7c4fd113dfc8dfbdbae64f8e49238f4 | |
parent | 94d3a30df759bb7c2724fdcee9e89a350d3a4d8b (diff) |
intel: Push flushing for cliprects changes down into the cliprects changes.
This lets us short-circuit when we're leaving the same cliprects in place,
which becomes quite common with metaops clears, and may be useful for some of
our FBO paths.
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffers.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_buffers.c b/src/mesa/drivers/dri/intel/intel_buffers.c index defa5b173d9..f5eaf765f38 100644 --- a/src/mesa/drivers/dri/intel/intel_buffers.c +++ b/src/mesa/drivers/dri/intel/intel_buffers.c @@ -135,6 +135,14 @@ intel_readbuf_region(struct intel_context *intel) static void intelSetRenderbufferClipRects(struct intel_context *intel) { + /* If the batch contents require looping over cliprects, flush them before + * we go changing which cliprects get referenced when that happens. + */ + if (intel->batch->cliprect_mode == LOOP_CLIPRECTS && + (intel->fboRect.x2 != intel->ctx.DrawBuffer->Width || + intel->fboRect.x2 != intel->ctx.DrawBuffer->Height)) + intel_batchbuffer_flush(intel->batch); + assert(intel->ctx.DrawBuffer->Width > 0); assert(intel->ctx.DrawBuffer->Height > 0); intel->fboRect.x1 = 0; @@ -160,6 +168,12 @@ intelSetFrontClipRects(struct intel_context *intel) if (!dPriv) return; + /* If the batch contents require looping over cliprects, flush them before + * we go changing which cliprects get referenced when that happens. + */ + if (intel->batch->cliprect_mode == LOOP_CLIPRECTS && + intel->pClipRects != dPriv->pClipRects) + intel_batchbuffer_flush(intel->batch); intel->numClipRects = dPriv->numClipRects; intel->pClipRects = dPriv->pClipRects; intel->drawX = dPriv->x; @@ -183,6 +197,10 @@ intelSetBackClipRects(struct intel_context *intel) if (intel_fb->pf_active || dPriv->numBackClipRects == 0) { /* use the front clip rects */ + if (intel->batch->cliprect_mode == LOOP_CLIPRECTS && + intel->pClipRects != dPriv->pClipRects) + intel_batchbuffer_flush(intel->batch); + intel->numClipRects = dPriv->numClipRects; intel->pClipRects = dPriv->pClipRects; intel->drawX = dPriv->x; @@ -190,6 +208,10 @@ intelSetBackClipRects(struct intel_context *intel) } else { /* use the back clip rects */ + if (intel->batch->cliprect_mode == LOOP_CLIPRECTS && + intel->pClipRects != dPriv->pBackClipRects) + intel_batchbuffer_flush(intel->batch); + intel->numClipRects = dPriv->numBackClipRects; intel->pClipRects = dPriv->pBackClipRects; intel->drawX = dPriv->backX; @@ -900,12 +922,6 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb) if (fb->Name) intel_validate_paired_depth_stencil(ctx, fb); - /* If the batch contents require looping over cliprects, flush them before - * we go changing which cliprects get referenced when that happens. - */ - if (intel->batch->cliprect_mode == LOOP_CLIPRECTS) - intel_batchbuffer_flush(intel->batch); - /* * How many color buffers are we drawing into? */ |