From: Kenneth Graunke Date: Mon, 2 Jul 2012 22:04:00 +0000 (-0700) Subject: i965: Use the blitter in intel_bufferobj_subdata for busy BOs on Gen6+. X-Git-Tag: mesa-9.0~1183 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=16060531baa837304eb7a427d0cdbeccd95cf09a;p=platform%2Fupstream%2Fmesa.git i965: Use the blitter in intel_bufferobj_subdata for busy BOs on Gen6+. Previously we only did this pre-Gen6, and used pwrite on Gen6+. In one workload, this cuts significant amount of overhead. v2: Simplify the function based on Eric's suggestions. Reviewed-by: Eric Anholt Signed-off-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index ef511e6..37dc75c 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -205,16 +205,16 @@ intel_bufferobj_subdata(struct gl_context * ctx, drm_intel_bo_busy(intel_obj->buffer) || drm_intel_bo_references(intel->batch.bo, intel_obj->buffer); - /* replace the current busy bo with fresh data */ - if (busy && size == intel_obj->Base.Size) { - drm_intel_bo_unreference(intel_obj->buffer); - intel_bufferobj_alloc_buffer(intel, intel_obj); - drm_intel_bo_subdata(intel_obj->buffer, 0, size, data); - } else if (intel->gen < 6) { - if (busy) { - drm_intel_bo *temp_bo; - - temp_bo = drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64); + if (busy) { + if (size == intel_obj->Base.Size) { + /* Replace the current busy bo with fresh data. */ + drm_intel_bo_unreference(intel_obj->buffer); + intel_bufferobj_alloc_buffer(intel, intel_obj); + drm_intel_bo_subdata(intel_obj->buffer, 0, size, data); + } else { + /* Use the blitter to upload the new data. */ + drm_intel_bo *temp_bo = + drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64); drm_intel_bo_subdata(temp_bo, 0, size, data); @@ -224,14 +224,8 @@ intel_bufferobj_subdata(struct gl_context * ctx, size); drm_intel_bo_unreference(temp_bo); - } else { - drm_intel_bo_subdata(intel_obj->buffer, offset, size, data); } } else { - /* Can't use the blit to modify the buffer in the middle of batch. */ - if (drm_intel_bo_references(intel->batch.bo, intel_obj->buffer)) { - intel_batchbuffer_flush(intel); - } drm_intel_bo_subdata(intel_obj->buffer, offset, size, data); } }