intel: Use new drm_intel_bo_references() to avoid flushing.

This commit is contained in:
Eric Anholt 2009-10-01 17:53:12 -07:00
parent f49d53594c
commit 193dddb04e
2 changed files with 20 additions and 10 deletions

View File

@ -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) {

View 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 ||
@ -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 {