diff options
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffer_objects.c | 27 | 
1 files changed, 17 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 1e99f9040a..fea99b2ad6 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -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);        }     } | 
