summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2006-03-09 06:21:17 +0000
committerAapo Tahkola <aet@rasterburn.org>2006-03-09 06:21:17 +0000
commit12d51beb7e2fd3bd4b58c941db4d0188dca5973d (patch)
tree2c8c18b9b146e9335b5d82aff48311c7e6f163fe /src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
parente294d938f261527ba72f82fe3952ba261d131845 (diff)
Kick VBOs out of GART if nothing else helps.
Diffstat (limited to 'src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c')
-rw-r--r--src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c b/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
index 2269a8742a..bff64ac066 100644
--- a/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
+++ b/src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c
@@ -776,6 +776,38 @@ void r300DeleteBuffer(GLcontext *ctx, struct gl_buffer_object *obj)
_mesa_delete_buffer_object(ctx, obj);
}
+void r300_evict_vbos(GLcontext *ctx, int amount)
+{
+ r300ContextPtr rmesa = R300_CONTEXT(ctx);
+ const struct _mesa_HashTable *hash = ctx->Shared->BufferObjects;
+ GLuint k = _mesa_HashFirstEntry(hash);
+ struct gl_buffer_object *obj;
+ struct r300_buffer_object *r300_obj;
+ GLvoid *data;
+
+ while (amount > 0 && k) {
+ obj = (struct gl_buffer_object *) _mesa_HashLookup(hash, k);
+ r300_obj = (struct r300_buffer_object *) obj;
+
+ if (obj->OnCard && obj->Size) {
+ obj->Data = _mesa_malloc(obj->Size);
+
+ data = radeon_mm_map(rmesa, r300_obj->id, RADEON_MM_R);
+ _mesa_memcpy(obj->Data, data, obj->Size);
+ radeon_mm_unmap(rmesa, r300_obj->id);
+
+ radeon_mm_free(rmesa, r300_obj->id);
+ r300_obj->id = 0;
+ obj->OnCard = GL_FALSE;
+
+ amount -= obj->Size;
+ }
+
+ k = _mesa_HashNextEntry(hash, k);
+ }
+
+}
+
void r300_init_vbo_funcs(struct dd_function_table *functions)
{
functions->NewBufferObject = r300NewBufferObject;