|
|
|
@@ -102,6 +102,7 @@ intel_bufferobj_free(GLcontext * ctx, struct gl_buffer_object *obj) |
|
|
|
assert(intel_obj); |
|
|
|
assert(!obj->Pointer); /* Mesa should have unmapped it */ |
|
|
|
|
|
|
|
_mesa_free(intel_obj->sys_buffer); |
|
|
|
if (intel_obj->region) { |
|
|
|
intel_bufferobj_release_region(intel, intel_obj); |
|
|
|
} |
|
|
|
@@ -142,7 +143,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) |
|
|
|
@@ -172,7 +189,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); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@@ -209,6 +229,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); |
|
|
|
|
|
|
|
@@ -265,6 +290,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; |
|
|
|
} |
|
|
|
|