diff options
author | Aapo Tahkola <aet@rasterburn.org> | 2006-03-09 06:21:17 +0000 |
---|---|---|
committer | Aapo Tahkola <aet@rasterburn.org> | 2006-03-09 06:21:17 +0000 |
commit | 12d51beb7e2fd3bd4b58c941db4d0188dca5973d (patch) | |
tree | 2c8c18b9b146e9335b5d82aff48311c7e6f163fe /src/mesa/drivers/dri/r300/radeon_vtxfmt_a.c | |
parent | e294d938f261527ba72f82fe3952ba261d131845 (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.c | 32 |
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; |