i915: Don't put VBOs in graphics memory unless required for an operation.

This saves doing swtnl from uncached memory, which is painful.  Improves
clutter test-text performance by 10% since it started using VBOs.
This commit is contained in:
Eric Anholt 2009-06-02 06:53:40 -07:00
parent 0ab8e2622e
commit a945e203d4
2 changed files with 40 additions and 1 deletions

View File

@ -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;
}

View File

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