From 51155ca68bf7539bd3ace2ac068a2be1fbcf400c Mon Sep 17 00:00:00 2001 From: David Reveman Date: Tue, 8 Mar 2005 08:48:22 +0000 Subject: [PATCH] Improve Xgl offscreen memory manager --- hw/xgl/xglarea.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/hw/xgl/xglarea.c b/hw/xgl/xglarea.c index b09e454ba..849f1a72e 100644 --- a/hw/xgl/xglarea.c +++ b/hw/xgl/xglarea.c @@ -40,7 +40,8 @@ xglAreaMoveOut (xglAreaPtr pArea) { (*pArea->pRoot->funcs->MoveOut) (pArea, pArea->closure); - pArea->state = xglAreaAvailable; + pArea->closure = (pointer) 0; + pArea->state = xglAreaAvailable; } static xglAreaPtr @@ -58,14 +59,14 @@ xglAreaCreate (xglRootAreaPtr pRoot, if (!pArea) return NULL; - pArea->level = level; - pArea->x = x; - pArea->y = y; - pArea->width = width; - pArea->height = height; - pArea->pRoot = pRoot; - pArea->closure = (pointer) 0; - pArea->state = xglAreaAvailable; + pArea->level = level; + pArea->x = x; + pArea->y = y; + pArea->width = width; + pArea->height = height; + pArea->pRoot = pRoot; + pArea->closure = (pointer) 0; + pArea->state = xglAreaAvailable; while (n--) pArea->pArea[n] = NULL; @@ -108,34 +109,37 @@ xglAreaDestroy (xglAreaPtr pArea) static xglAreaPtr xglAreaGetTopScoredSubArea (xglAreaPtr pArea) { + if (!pArea) + return NULL; + switch (pArea->state) { case xglAreaOccupied: return pArea; case xglAreaAvailable: break; - case xglAreaDivided: - { + case xglAreaDivided: { xglAreaPtr tmp, top = NULL; int i; for (i = 0; i < 4; i++) { - if (pArea->pArea[i]) + tmp = xglAreaGetTopScoredSubArea (pArea->pArea[i]); + if (tmp && top) { - tmp = xglAreaGetTopScoredSubArea (pArea->pArea[i]); - if (!tmp) - break; - - if ((!top) || - (*pArea->pRoot->funcs->CompareScore) (tmp, + if ((*pArea->pRoot->funcs->CompareScore) (tmp, tmp->closure, top->closure) > 0) top = tmp; } + else if (tmp) + { + top = tmp; + } } return top; } } + return NULL; } @@ -254,7 +258,8 @@ xglAreaFind (xglAreaPtr pArea, pArea->pArea[i] = NULL; } - pArea->state = xglAreaAvailable; + pArea->closure = (pointer) 0; + pArea->state = xglAreaAvailable; if (xglFindArea (pArea, width, height, TRUE, closure)) return TRUE;