aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-05-31 12:32:06 -0700
committerEric Anholt <[email protected]>2011-06-07 10:46:04 -0700
commit23b6f9606dc247488835745668b3686218612536 (patch)
tree84015ff713dda5604978d4093c9587ccf6019f1b
parent6ea70600b9dc76662360eddb41ff658e8ee1aaff (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.
-rw-r--r--src/mesa/drivers/dri/intel/intel_batchbuffer.c9
-rw-r--r--src/mesa/drivers/dri/intel/intel_context.c16
-rw-r--r--src/mesa/drivers/dri/intel/intel_context.h4
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;