i965: Use the blitter in intel_bufferobj_subdata for busy BOs on Gen6+.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 2 Jul 2012 22:04:00 +0000 (15:04 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 12 Jul 2012 20:35:46 +0000 (13:35 -0700)
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 <eric@anholt.net>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/intel/intel_buffer_objects.c

index ef511e6..37dc75c 100644 (file)
@@ -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);
    }
 }