From: Eric Anholt Date: Tue, 31 May 2011 19:32:06 +0000 (-0700) Subject: intel: Implement glFinish() correctly by waiting on all previous rendering. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=23b6f9606dc247488835745668b3686218612536;p=mesa.git intel: Implement glFinish() correctly by waiting on all previous rendering. Before, we were waiting for (most of) the current framebuffer to be done, which is not quite the same thing. --- diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c index 377989bcc14..77edc3a6bfe 100644 --- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c @@ -55,10 +55,12 @@ static void clear_cache( struct intel_context *intel ) void intel_batchbuffer_reset(struct intel_context *intel) { - if (intel->batch.bo != NULL) { - drm_intel_bo_unreference(intel->batch.bo); - intel->batch.bo = NULL; + if (intel->batch.last_bo != NULL) { + drm_intel_bo_unreference(intel->batch.last_bo); + intel->batch.last_bo = NULL; } + intel->batch.last_bo = intel->batch.bo; + clear_cache(intel); intel->batch.bo = drm_intel_bo_alloc(intel->bufmgr, "batchbuffer", @@ -72,6 +74,7 @@ intel_batchbuffer_reset(struct intel_context *intel) void intel_batchbuffer_free(struct intel_context *intel) { + drm_intel_bo_unreference(intel->batch.last_bo); drm_intel_bo_unreference(intel->batch.bo); clear_cache(intel); } diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 2ea52c26106..b6a017a876c 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -579,23 +579,13 @@ intel_glFlush(struct gl_context *ctx) void intelFinish(struct gl_context * ctx) { - struct gl_framebuffer *fb = ctx->DrawBuffer; - int i; + struct intel_context *intel = intel_context(ctx); intel_flush(ctx); intel_flush_front(ctx); - for (i = 0; i < fb->_NumColorDrawBuffers; i++) { - struct intel_renderbuffer *irb; - - irb = intel_renderbuffer(fb->_ColorDrawBuffers[i]); - - if (irb && irb->region && irb->region->buffer) - drm_intel_bo_wait_rendering(irb->region->buffer); - } - if (fb->_DepthBuffer) { - /* XXX: Wait on buffer idle */ - } + if (intel->batch.last_bo) + drm_intel_bo_wait_rendering(intel->batch.last_bo); } void diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h index f599861cba8..80dee4ef38e 100644 --- a/src/mesa/drivers/dri/intel/intel_context.h +++ b/src/mesa/drivers/dri/intel/intel_context.h @@ -177,7 +177,11 @@ struct intel_context int urb_size; struct intel_batchbuffer { + /** Current batchbuffer being queued up. */ drm_intel_bo *bo; + /** Last BO submitted to the hardware. Used for glFinish(). */ + drm_intel_bo *last_bo; + struct cached_batch_item *cached_items; uint16_t emit, total;