Преглед изворни кода

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)
tags/mesa_7_5_rc4
Eric Anholt пре 17 година
родитељ
комит
ff3da0966f

+ 38
- 1
src/mesa/drivers/dri/intel/intel_buffer_objects.c Прегледај датотеку

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


+ 2
- 0
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)

Loading…
Откажи
Сачувај