diff --git a/src/mesa/drivers/dri/i915/i915_vtbl.c b/src/mesa/drivers/dri/i915/i915_vtbl.c index eb6af9056c3..4db38c00e01 100644 --- a/src/mesa/drivers/dri/i915/i915_vtbl.c +++ b/src/mesa/drivers/dri/i915/i915_vtbl.c @@ -360,14 +360,9 @@ static void i915_lost_hardware( struct intel_context *intel ) i915->state.emitted = 0; } -static void i915_emit_flush( struct intel_context *intel ) +static GLuint i915_flush_cmd( void ) { - BATCH_LOCALS; - - BEGIN_BATCH(2, 0); - OUT_BATCH( MI_FLUSH | FLUSH_MAP_CACHE | FLUSH_RENDER_CACHE ); - OUT_BATCH( 0 ); - ADVANCE_BATCH(); + return MI_FLUSH | FLUSH_MAP_CACHE | FLUSH_RENDER_CACHE; } @@ -382,6 +377,6 @@ void i915InitVtbl( struct i915_context *i915 ) i915->intel.vtbl.render_start = i915_render_start; i915->intel.vtbl.set_draw_region = i915_set_draw_region; i915->intel.vtbl.update_texture_state = i915UpdateTextureState; - i915->intel.vtbl.emit_flush = i915_emit_flush; + i915->intel.vtbl.flush_cmd = i915_flush_cmd; } diff --git a/src/mesa/drivers/dri/i915/intel_batchbuffer.c b/src/mesa/drivers/dri/i915/intel_batchbuffer.c index fd04b054abe..ae1dd3997cb 100644 --- a/src/mesa/drivers/dri/i915/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i915/intel_batchbuffer.c @@ -161,7 +161,7 @@ static void do_flush_locked( struct intel_batchbuffer *batch, ptr[r->offset/4] = batch->offset[r->elem] + r->delta; } - if (0) + if (INTEL_DEBUG & DEBUG_DMA) intel_dump_batchbuffer( 0, ptr, used ); @@ -189,14 +189,17 @@ GLuint intel_batchbuffer_flush( struct intel_batchbuffer *batch ) if (used == 0) return batch->last_fence; - /* Add the MI_BATCH_BUFFER_END: + /* Add the MI_BATCH_BUFFER_END. Always add an MI_FLUSH - this is a + * performance drain that we would like to avoid. */ - if (intel_batchbuffer_space(batch) & 4) { - ((int *)batch->ptr)[0] = MI_BATCH_BUFFER_END; - used += 4; + if (used & 4) { + ((int *)batch->ptr)[0] = intel->vtbl.flush_cmd(); + ((int *)batch->ptr)[1] = 0; + ((int *)batch->ptr)[2] = MI_BATCH_BUFFER_END; + used += 12; } else { - ((int *)batch->ptr)[0] = 0; + ((int *)batch->ptr)[0] = intel->vtbl.flush_cmd(); ((int *)batch->ptr)[1] = MI_BATCH_BUFFER_END; used += 8; } diff --git a/src/mesa/drivers/dri/i915/intel_batchbuffer.h b/src/mesa/drivers/dri/i915/intel_batchbuffer.h index e451a0e7284..cca9aab8464 100644 --- a/src/mesa/drivers/dri/i915/intel_batchbuffer.h +++ b/src/mesa/drivers/dri/i915/intel_batchbuffer.h @@ -7,6 +7,8 @@ struct intel_context; #define BATCH_SZ 4096 +#define BATCH_RESERVED 16 + #define MAX_RELOCS 100 #define INTEL_BATCH_NO_CLIPRECTS 0x1 @@ -72,7 +74,7 @@ GLboolean intel_batchbuffer_emit_reloc( struct intel_batchbuffer *batch, static inline GLuint intel_batchbuffer_space( struct intel_batchbuffer *batch ) { - return (BATCH_SZ - 8) - (batch->ptr - batch->map); + return (BATCH_SZ - BATCH_RESERVED) - (batch->ptr - batch->map); } diff --git a/src/mesa/drivers/dri/i915/intel_blit.c b/src/mesa/drivers/dri/i915/intel_blit.c index d915c8c77fd..db4f78a5470 100644 --- a/src/mesa/drivers/dri/i915/intel_blit.c +++ b/src/mesa/drivers/dri/i915/intel_blit.c @@ -51,8 +51,7 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv ) { struct intel_context *intel; - if (0) - fprintf(stderr, "%s\n", __FUNCTION__); + DBG(stderr, "%s\n", __FUNCTION__); assert(dPriv); assert(dPriv->driContextPriv); @@ -188,12 +187,11 @@ void intelEmitCopyBlit( struct intel_context *intel, BATCH_LOCALS; - if (1) - _mesa_printf("%s src:buf(%d)/%d %d,%d dst:buf(%d)/%d %d,%d sz:%dx%d\n", - __FUNCTION__, - src_buffer, src_pitch, src_x, src_y, - dst_buffer, dst_pitch, dst_x, dst_y, - w,h); + DBG("%s src:buf(%d)/%d %d,%d dst:buf(%d)/%d %d,%d sz:%dx%d\n", + __FUNCTION__, + src_buffer, src_pitch, src_x, src_y, + dst_buffer, dst_pitch, dst_x, dst_y, + w,h); src_pitch *= cpp; dst_pitch *= cpp; diff --git a/src/mesa/drivers/dri/i915/intel_context.h b/src/mesa/drivers/dri/i915/intel_context.h index 1c8eca2d6ca..db3f84dfb61 100644 --- a/src/mesa/drivers/dri/i915/intel_context.h +++ b/src/mesa/drivers/dri/i915/intel_context.h @@ -121,7 +121,8 @@ struct intel_context void (*set_draw_region)( struct intel_context *intel, struct intel_region *draw_region, struct intel_region *depth_region ); - void (*emit_flush)( struct intel_context *intel ); + + GLuint (*flush_cmd)( void ); void (*reduced_primitive_state)( struct intel_context *intel, GLenum rprim ); diff --git a/src/mesa/drivers/dri/i915/intel_ioctl.c b/src/mesa/drivers/dri/i915/intel_ioctl.c index 4569c57d9a4..4b2c2a71ac4 100644 --- a/src/mesa/drivers/dri/i915/intel_ioctl.c +++ b/src/mesa/drivers/dri/i915/intel_ioctl.c @@ -123,7 +123,7 @@ void intel_batch_ioctl( struct intel_context *intel, batch.DR4 = ((((GLuint)intel->drawX) & 0xffff) | (((GLuint)intel->drawY) << 16)); - if (0) + if (INTEL_DEBUG & DEBUG_DMA) fprintf(stderr, "%s: 0x%x..0x%x DR4: %x cliprects: %d\n", __FUNCTION__, batch.start,