Kick VBOs out of GART if nothing else helps.

This commit is contained in:
Aapo Tahkola 2006-03-09 06:21:17 +00:00
parent e294d938f2
commit 12d51beb7e
5 changed files with 56 additions and 14 deletions

View file

@ -933,6 +933,7 @@ extern void radeon_init_vtxfmt_a(r300ContextPtr rmesa);
#ifdef HW_VBOS
extern void r300_init_vbo_funcs(struct dd_function_table *functions);
extern void r300_evict_vbos(GLcontext *ctx, int amount);
#endif
#define RADEON_D_CAPTURE 0

View file

@ -632,12 +632,19 @@ void r300RefillCurrentDmaRegion(r300ContextPtr rmesa)
radeonWaitForIdleLocked(&rmesa->radeon);
dmabuf->id = radeon_mm_alloc(rmesa, 4, RADEON_BUFFER_SIZE*16);
#ifdef HW_VBOS
if (dmabuf->id == 0) {
/* Just kick all */
r300_evict_vbos(rmesa->radeon.glCtx, /*RADEON_BUFFER_SIZE*16*/1<<30);
dmabuf->id = radeon_mm_alloc(rmesa, 4, RADEON_BUFFER_SIZE*16);
}
#endif
UNLOCK_HARDWARE(&rmesa->radeon);
if (dmabuf->id == 0) {
WARN_ONCE("Whops! Dont know how to evict VBOs yet.\n");
exit(1);
fprintf(stderr, "Error: Could not get dma buffer... exiting\n");
exit(-1);
}
}

View file

@ -97,7 +97,7 @@ int radeon_mm_alloc(r300ContextPtr rmesa, int alignment, int size)
again:
done_age = rmesa->radeon.radeonScreen->scratch[2];
done_age = rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH];
for (i = rmesa->rmm->u_last + 1; i > 0; i --) {
if (rmesa->rmm->u_list[i].ptr == NULL) {
@ -119,7 +119,7 @@ int radeon_mm_alloc(r300ContextPtr rmesa, int alignment, int size)
exit(1);
} else {
#ifdef MM_DEBUG
fprintf(stderr, "really freed %d at age %x\n", i, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "really freed %d at age %x\n", i, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
if (i == rmesa->rmm->u_last)
rmesa->rmm->u_last --;
@ -196,7 +196,7 @@ int radeon_mm_alloc(r300ContextPtr rmesa, int alignment, int size)
//fprintf(stderr, "alloc %p at id %d\n", rmesa->rmm->u_list[i].ptr, i);
#ifdef MM_DEBUG
fprintf(stderr, "allocated %d at age %x\n", i, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "allocated %d at age %x\n", i, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
return i;
@ -261,7 +261,7 @@ void radeon_mm_use(r300ContextPtr rmesa, int id)
{
unsigned long long ull;
#ifdef MM_DEBUG
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
drm_r300_cmd_header_t *cmd;
@ -303,7 +303,7 @@ void radeon_mm_use(r300ContextPtr rmesa, int id)
cmd = r300AllocCmdBuf(rmesa, 2 + sizeof(ull) / 4, __FUNCTION__);
cmd[0].scratch.cmd_type = R300_CMD_SCRATCH;
cmd[0].scratch.reg = 2;
cmd[0].scratch.reg = RADEON_MM_SCRATCH;
cmd[0].scratch.n_bufs = 1;
cmd[0].scratch.flags = 0;
cmd ++;
@ -345,7 +345,7 @@ int radeon_mm_on_card(r300ContextPtr rmesa, int id)
void *radeon_mm_map(r300ContextPtr rmesa, int id, int access)
{
#ifdef MM_DEBUG
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
void *ptr;
int tries = 0;
@ -385,12 +385,12 @@ void *radeon_mm_map(r300ContextPtr rmesa, int id, int access)
return NULL;
}
while(rmesa->rmm->u_list[id].age > rmesa->radeon.radeonScreen->scratch[2] && tries++ < 1000)
while(rmesa->rmm->u_list[id].age > rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH] && tries++ < 1000)
usleep(10);
if (tries >= 1000) {
fprintf(stderr, "Idling failed (%x vs %x)\n",
rmesa->rmm->u_list[id].age, rmesa->radeon.radeonScreen->scratch[2]);
rmesa->rmm->u_list[id].age, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
return NULL;
}
@ -406,7 +406,7 @@ void *radeon_mm_map(r300ContextPtr rmesa, int id, int access)
void radeon_mm_unmap(r300ContextPtr rmesa, int id)
{
#ifdef MM_DEBUG
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
if(rmesa->rmm->u_list[id].mapped == 0)
@ -423,7 +423,7 @@ void radeon_mm_unmap(r300ContextPtr rmesa, int id)
void radeon_mm_free(r300ContextPtr rmesa, int id)
{
#ifdef MM_DEBUG
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[2]);
fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id, rmesa->radeon.radeonScreen->scratch[RADEON_MM_SCRATCH]);
#endif
if(id == 0)

View file

@ -7,7 +7,9 @@
#define RADEON_MM_R 1
#define RADEON_MM_W 2
#define RADEON_MM_RW (RADEON_MM_R | RADEON_MM_W)
#define RADEON_MM_SCRATCH 2
struct radeon_memory_manager {
struct {
void *ptr;

View file

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