[g3dvl] move z-coord generation for multiple render targets into vertex shader
[mesa.git] / src / mesa / drivers / dri / intel / intel_buffer_objects.c
index 1e99f9040af872aedf8bdf1e098f78c932d98e9a..87da60a771e86cb20b86a1e2c8afbff64c7e5504 100644 (file)
@@ -214,21 +214,28 @@ intel_bufferobj_subdata(struct gl_context * ctx,
       memcpy((char *)intel_obj->sys_buffer + offset, data, size);
    else {
       /* Flush any existing batchbuffer that might reference this data. */
-      if (drm_intel_bo_busy(intel_obj->buffer) ||
-         drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
-        drm_intel_bo *temp_bo;
+      if (intel->gen < 6) {
+        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);
+           temp_bo = drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64);
 
-        drm_intel_bo_subdata(temp_bo, 0, size, data);
+           drm_intel_bo_subdata(temp_bo, 0, size, data);
 
-        intel_emit_linear_blit(intel,
-                               intel_obj->buffer, offset,
-                               temp_bo, 0,
-                               size);
+           intel_emit_linear_blit(intel,
+                                  intel_obj->buffer, offset,
+                                  temp_bo, 0,
+                                  size);
 
-        drm_intel_bo_unreference(temp_bo);
+           drm_intel_bo_unreference(temp_bo);
+        } else {
+           drm_intel_bo_subdata(intel_obj->buffer, offset, size, data);
+        }
       } else {
+        if (drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
+           intel_batchbuffer_flush(intel->batch);
+        }
         drm_intel_bo_subdata(intel_obj->buffer, offset, size, data);
       }
    }
@@ -552,7 +559,7 @@ intel_bufferobj_copy_subdata(struct gl_context *ctx,
       return;
 
    /* If we're in system memory, just map and memcpy. */
-   if (intel_src->sys_buffer || intel_dst->sys_buffer) {
+   if (intel_src->sys_buffer || intel_dst->sys_buffer || intel->gen >= 6) {
       /* The same buffer may be used, but note that regions copied may
        * not overlap.
        */
@@ -575,6 +582,7 @@ intel_bufferobj_copy_subdata(struct gl_context *ctx,
         intel_bufferobj_unmap(ctx, GL_COPY_READ_BUFFER, src);
         intel_bufferobj_unmap(ctx, GL_COPY_WRITE_BUFFER, dst);
       }
+      return;
    }
 
    /* Otherwise, we have real BOs, so blit them. */