diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffer_objects.c | 13 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_tex_image.c | 17 | 
2 files changed, 20 insertions, 10 deletions
| diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index a0225936c8..ea9d5a6276 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -209,7 +209,8 @@ 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_references(intel->batch->buf, intel_obj->buffer)) +	 intelFlush(ctx);        dri_bo_subdata(intel_obj->buffer, offset, size, data);     } @@ -257,10 +258,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); @@ -330,7 +330,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) { diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index 66201b1f46..5c915178e7 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -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 || @@ -223,7 +226,8 @@ try_pbo_upload(struct intel_context *intel,     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); @@ -316,8 +320,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 +480,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 { | 
