diff options
author | Eric Anholt <[email protected]> | 2011-05-31 12:32:06 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2011-06-07 10:46:04 -0700 |
commit | 23b6f9606dc247488835745668b3686218612536 (patch) | |
tree | 84015ff713dda5604978d4093c9587ccf6019f1b /src/mesa/drivers/dri | |
parent | 6ea70600b9dc76662360eddb41ff658e8ee1aaff (diff) |
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.
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_batchbuffer.c | 9 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.c | 16 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.h | 4 |
3 files changed, 13 insertions, 16 deletions
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; |