Mesa (r6xx-r7xx-support): R6xx: Fix memory free issue and correct clip rectangle
Cooper Yuan
cooperyuan at kemper.freedesktop.org
Wed Apr 22 07:39:20 UTC 2009
Module: Mesa
Branch: r6xx-r7xx-support
Commit: cccd7ae6e60c2454f9b68e03ec561e9b780a065c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cccd7ae6e60c2454f9b68e03ec561e9b780a065c
Author: Cooper Yuan <cooperyuan at gmail.com>
Date: Wed Apr 22 15:37:45 2009 +0800
R6xx: Fix memory free issue and correct clip rectangle
---
src/mesa/drivers/dri/r600/r600_cmdbuf.c | 15 ++++-----------
src/mesa/drivers/dri/r600/r600_mem.c | 30 +++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/src/mesa/drivers/dri/r600/r600_cmdbuf.c b/src/mesa/drivers/dri/r600/r600_cmdbuf.c
index 14b09d7..7b01ba1 100644
--- a/src/mesa/drivers/dri/r600/r600_cmdbuf.c
+++ b/src/mesa/drivers/dri/r600/r600_cmdbuf.c
@@ -110,17 +110,10 @@ int r600FlushCmdBuffer(context_t *context)
drmGetLock(context->fd, context->hwContext, DRM_LOCK_HELD);
- cmd.buf = (char *)(context->cmdbuf.cmd_buf + start);
- cmd.bufsz = (context->cmdbuf.count_used - start) * 4;
- cmd.nbox = 1;
- /*
- * TODO, temp allocate boxes here
- */
- cmd.boxes = (struct drm_clip_rect *)CALLOC(sizeof(struct drm_clip_rect));
- cmd.boxes->x1 = 102;
- cmd.boxes->y1 = 127;
- cmd.boxes->x2 = 352;
- cmd.boxes->y2 = 377;
+ cmd.buf = (char *)(context->cmdbuf.cmd_buf + start);
+ cmd.bufsz = (context->cmdbuf.count_used - start) * 4;
+ cmd.nbox = context->numClipRects;
+ cmd.boxes = context->pClipRects;
ret = drmCommandWrite(context->fd, DRM_RADEON_CMDBUF, &cmd, sizeof(cmd));
diff --git a/src/mesa/drivers/dri/r600/r600_mem.c b/src/mesa/drivers/dri/r600/r600_mem.c
index 374def6..055a794 100644
--- a/src/mesa/drivers/dri/r600/r600_mem.c
+++ b/src/mesa/drivers/dri/r600/r600_mem.c
@@ -293,7 +293,7 @@ int r600MemAlloc(context_t *context, int alignment, int size)
void r600MemFree(context_t *context, int id)
{
- fprintf(stderr, "%s: %d at age %x\n", __FUNCTION__, id,r600GetAge(context));
+ int ret;
assert(id <= context->memManager->u_last);
if (id == 0)
@@ -309,7 +309,31 @@ void r600MemFree(context_t *context, int id)
return;
}
- context->memManager->u_list[id].pending = 1;
+ /*
+ * Because there is no R600_MEM_SCRATCH now, just free dma buffer here.
+ */
+ drm_radeon_mem_free_t memfree;
+ memfree.region = RADEON_MEM_REGION_GART;
+ memfree.region_offset = (char *)context->memManager->u_list[id].ptr -
+ (char *)context->screen->gartTextures.cpu;
+ ret = drmCommandWrite(context->fd, DRM_RADEON_FREE, &memfree, sizeof(memfree));
+
+ if (ret)
+ {
+ WARN_ONCE("Failed to free at %p\n", context->memManager->u_list[id].ptr);
+ exit(1);
+ }
+ else
+ {
+ DEBUG_FUNCF ("freed %d at age %x\n", id, r600GetAge(context));
+ if (id == context->memManager->u_last)
+ {
+ context->memManager->u_last--;
+ }
+
+ context->memManager->u_list[id].pending = 0;
+ context->memManager->u_list[id].ptr = NULL;
+ }
}
void r600MemUse(context_t *context, int id)
@@ -434,7 +458,7 @@ static void r600RefillCurrentDmaRegion(context_t *context, int size)
dmabuf = CALLOC_STRUCT(r600_dma_buffer);
dmabuf->buf = (void *)1; /* hack */
- dmabuf->refcount = 1;
+ dmabuf->refcount = 0;
dmabuf->id = r600MemAlloc(context, 4, size);
if (dmabuf->id == 0)
More information about the mesa-commit
mailing list