Browse Source

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.
tags/mesa_7_3_rc1
Eric Anholt 17 years ago
parent
commit
fc19536aa9
1 changed files with 22 additions and 6 deletions
  1. 22
    6
      src/mesa/drivers/dri/intel/intel_buffers.c

+ 22
- 6
src/mesa/drivers/dri/intel/intel_buffers.c View File

static void static void
intelSetRenderbufferClipRects(struct intel_context *intel) 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->Width > 0);
assert(intel->ctx.DrawBuffer->Height > 0); assert(intel->ctx.DrawBuffer->Height > 0);
intel->fboRect.x1 = 0; intel->fboRect.x1 = 0;
if (!dPriv) if (!dPriv)
return; 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->numClipRects = dPriv->numClipRects;
intel->pClipRects = dPriv->pClipRects; intel->pClipRects = dPriv->pClipRects;
intel->drawX = dPriv->x; intel->drawX = dPriv->x;


if (intel_fb->pf_active || dPriv->numBackClipRects == 0) { if (intel_fb->pf_active || dPriv->numBackClipRects == 0) {
/* use the front clip rects */ /* 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->numClipRects = dPriv->numClipRects;
intel->pClipRects = dPriv->pClipRects; intel->pClipRects = dPriv->pClipRects;
intel->drawX = dPriv->x; intel->drawX = dPriv->x;
} }
else { else {
/* use the back clip rects */ /* 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->numClipRects = dPriv->numBackClipRects;
intel->pClipRects = dPriv->pBackClipRects; intel->pClipRects = dPriv->pBackClipRects;
intel->drawX = dPriv->backX; intel->drawX = dPriv->backX;
if (fb->Name) if (fb->Name)
intel_validate_paired_depth_stencil(ctx, fb); 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? * How many color buffers are we drawing into?
*/ */

Loading…
Cancel
Save