mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 09:18:04 +02:00
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.
(cherry picked from commit a945e203d4)
This commit is contained in:
parent
1b8e4dd2c8
commit
ff3da0966f
2 changed files with 40 additions and 1 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue