diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffer_objects.c | 39 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_buffer_objects.h | 2 | 
2 files changed, 40 insertions, 1 deletions
| diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index 0db1f392c0..23ba3b9ef6 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -111,6 +111,7 @@ intel_bufferobj_free(GLcontext * ctx, struct gl_buffer_object *obj)     if (obj->Pointer)        intel_bufferobj_unmap(ctx, 0, obj); +   _mesa_free(intel_obj->sys_buffer);     if (intel_obj->region) {        intel_bufferobj_release_region(intel, intel_obj);     } @@ -151,7 +152,23 @@ intel_bufferobj_data(GLcontext * ctx,        dri_bo_unreference(intel_obj->buffer);        intel_obj->buffer = NULL;     } +   _mesa_free(intel_obj->sys_buffer); +   intel_obj->sys_buffer = NULL; +     if (size != 0) { +#ifdef I915 +      /* On pre-965, stick VBOs in system memory, as we're always doing swtnl +       * with their contents anyway. +       */ +      if (target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER) { +	 intel_obj->sys_buffer = _mesa_malloc(size); +	 if (intel_obj->sys_buffer != NULL) { +	    if (data != NULL) +	       memcpy(intel_obj->sys_buffer, data, size); +	    return; +	 } +      } +#endif        intel_bufferobj_alloc_buffer(intel, intel_obj);        if (data != NULL) @@ -181,7 +198,10 @@ intel_bufferobj_subdata(GLcontext * ctx,     if (intel_obj->region)        intel_bufferobj_cow(intel, intel_obj); -   dri_bo_subdata(intel_obj->buffer, offset, size, data); +   if (intel_obj->sys_buffer) +      memcpy((char *)intel_obj->sys_buffer + offset, data, size); +   else +      dri_bo_subdata(intel_obj->buffer, offset, size, data);  } @@ -218,6 +238,11 @@ intel_bufferobj_map(GLcontext * ctx,     assert(intel_obj); +   if (intel_obj->sys_buffer) { +      obj->Pointer = intel_obj->sys_buffer; +      return obj->Pointer; +   } +     if (intel_obj->region)        intel_bufferobj_cow(intel, intel_obj); @@ -274,6 +299,18 @@ intel_bufferobj_buffer(struct intel_context *intel,        }     } +   if (intel_obj->buffer == NULL) { +      intel_bufferobj_alloc_buffer(intel, intel_obj); +      intel_bufferobj_subdata(&intel->ctx, +			      GL_ARRAY_BUFFER_ARB, +			      0, +			      intel_obj->Base.Size, +			      intel_obj->sys_buffer, +			      &intel_obj->Base); +      _mesa_free(intel_obj->sys_buffer); +      intel_obj->sys_buffer = NULL; +   } +     return intel_obj->buffer;  } diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.h b/src/mesa/drivers/dri/intel/intel_buffer_objects.h index 7ef723833c..0431015631 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.h +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.h @@ -42,6 +42,8 @@ struct intel_buffer_object  {     struct gl_buffer_object Base;     dri_bo *buffer;     /* the low-level buffer manager's buffer handle */ +   /** System memory buffer data, if not using a BO to store the data. */ +   void *sys_buffer;     struct intel_region *region; /* Is there a zero-copy texture                                     associated with this (pixel) | 
