Browse Source

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.
tags/mesa-7.11-rc1
Eric Anholt 15 years ago
parent
commit
23b6f9606d

+ 6
- 3
src/mesa/drivers/dri/intel/intel_batchbuffer.c View File

@@ -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);
}

+ 3
- 13
src/mesa/drivers/dri/intel/intel_context.c View File

@@ -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

+ 4
- 0
src/mesa/drivers/dri/intel/intel_context.h View File

@@ -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;

Loading…
Cancel
Save