Merge branch 'mesa_7_6_branch' into mesa_7_7_branch
[mesa.git] / src / mesa / drivers / dri / intel / intel_buffer_objects.c
index ccce9e712d84f3451b8bd17e2d63f6109ad10013..3b7015b5ad39a7842277046c48be24163ee0b5cd 100644 (file)
@@ -209,9 +209,23 @@ intel_bufferobj_subdata(GLcontext * ctx,
       memcpy((char *)intel_obj->sys_buffer + offset, data, size);
    else {
       /* Flush any existing batchbuffer that might reference this data. */
-      intelFlush(ctx);
+      if (drm_intel_bo_busy(intel_obj->buffer) ||
+         drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
+        drm_intel_bo *temp_bo;
+
+        temp_bo = drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64);
+
+        drm_intel_bo_subdata(temp_bo, 0, size, data);
 
-      dri_bo_subdata(intel_obj->buffer, offset, size, data);
+        intel_emit_linear_blit(intel,
+                               intel_obj->buffer, offset,
+                               temp_bo, 0,
+                               size);
+
+        drm_intel_bo_unreference(temp_bo);
+      } else {
+        dri_bo_subdata(intel_obj->buffer, offset, size, data);
+      }
    }
 }
 
@@ -259,10 +273,9 @@ intel_bufferobj_map(GLcontext * ctx,
       return obj->Pointer;
    }
 
-   /* Flush any existing batchbuffer that might have written to this
-    * buffer.
-    */
-   intelFlush(ctx);
+   /* Flush any existing batchbuffer that might reference this data. */
+   if (drm_intel_bo_references(intel->batch->buf, intel_obj->buffer))
+      intelFlush(ctx);
 
    if (intel_obj->region)
       intel_bufferobj_cow(intel, intel_obj);
@@ -332,7 +345,8 @@ intel_bufferobj_map_range(GLcontext * ctx,
     * the batchbuffer so that GEM knows about the buffer access for later
     * syncing.
     */
-   if (!(access & GL_MAP_UNSYNCHRONIZED_BIT))
+   if (!(access & GL_MAP_UNSYNCHRONIZED_BIT) &&
+       drm_intel_bo_references(intel->batch->buf, intel_obj->buffer))
       intelFlush(ctx);
 
    if (intel_obj->buffer == NULL) {