Merge branch 'mesa_7_6_branch'
[mesa.git] / src / mesa / drivers / dri / intel / intel_tex_image.c
index 66201b1f465f82bf7d284b1c24fb6d8d3e056ec3..dcc613449f01a1e8c35da1ad332d52c53a4a9055 100644 (file)
@@ -201,6 +201,9 @@ try_pbo_upload(struct intel_context *intel,
    struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj);
    GLuint src_offset, src_stride;
    GLuint dst_offset, dst_stride;
+   dri_bo *dst_buffer = intel_region_buffer(intel,
+                                           intelImage->mt->region,
+                                           INTEL_WRITE_FULL);
 
    if (!_mesa_is_bufferobj(unpack->BufferObj) ||
        intel->ctx._ImageTransferState ||
@@ -219,11 +222,13 @@ try_pbo_upload(struct intel_context *intel,
 
    dst_offset = intel_miptree_image_offset(intelImage->mt,
                                            intelImage->face,
-                                           intelImage->level);
+                                           intelImage->level,
+                                           0 /* zslice */);
 
    dst_stride = intelImage->mt->pitch;
 
-   intelFlush(&intel->ctx);
+   if (drm_intel_bo_references(intel->batch->buf, dst_buffer))
+      intelFlush(&intel->ctx);
    LOCK_HARDWARE(intel);
    {
       dri_bo *src_buffer = intel_bufferobj_buffer(intel, pbo, INTEL_READ);
@@ -277,8 +282,8 @@ try_pbo_zcopy(struct intel_context *intel,
 
    dst_offset = intel_miptree_image_offset(intelImage->mt,
                                            intelImage->face,
-                                           intelImage->level);
-
+                                           intelImage->level,
+                                           0 /* zslice */);
    dst_stride = intelImage->mt->pitch;
 
    if (src_stride != dst_stride || dst_offset != 0 || src_offset != 0) {
@@ -316,8 +321,6 @@ intelTexImage(GLcontext * ctx,
    DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__,
        _mesa_lookup_enum_by_nr(target), level, width, height, depth, border);
 
-   intelFlush(ctx);
-
    intelImage->face = target_to_face(target);
    intelImage->level = level;
 
@@ -478,13 +481,20 @@ intelTexImage(GLcontext * ctx,
    LOCK_HARDWARE(intel);
 
    if (intelImage->mt) {
-      if (pixels != NULL)
+      if (pixels != NULL) {
+        /* Flush any queued rendering with the texture before mapping. */
+        if (drm_intel_bo_references(intel->batch->buf,
+                                    intelImage->mt->region->buffer)) {
+           intelFlush(ctx);
+        }
          texImage->Data = intel_miptree_image_map(intel,
                                                   intelImage->mt,
                                                   intelImage->face,
                                                   intelImage->level,
                                                   &dstRowStride,
                                                   intelImage->base.ImageOffsets);
+      }
+
       texImage->RowStride = dstRowStride / intelImage->mt->cpp;
    }
    else {