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