Improve Xgl offscreen memory manager

This commit is contained in:
David Reveman 2005-03-08 08:48:22 +00:00
parent e26a096cb6
commit 51155ca68b

View File

@ -40,7 +40,8 @@ xglAreaMoveOut (xglAreaPtr pArea)
{ {
(*pArea->pRoot->funcs->MoveOut) (pArea, pArea->closure); (*pArea->pRoot->funcs->MoveOut) (pArea, pArea->closure);
pArea->state = xglAreaAvailable; pArea->closure = (pointer) 0;
pArea->state = xglAreaAvailable;
} }
static xglAreaPtr static xglAreaPtr
@ -58,14 +59,14 @@ xglAreaCreate (xglRootAreaPtr pRoot,
if (!pArea) if (!pArea)
return NULL; return NULL;
pArea->level = level; pArea->level = level;
pArea->x = x; pArea->x = x;
pArea->y = y; pArea->y = y;
pArea->width = width; pArea->width = width;
pArea->height = height; pArea->height = height;
pArea->pRoot = pRoot; pArea->pRoot = pRoot;
pArea->closure = (pointer) 0; pArea->closure = (pointer) 0;
pArea->state = xglAreaAvailable; pArea->state = xglAreaAvailable;
while (n--) while (n--)
pArea->pArea[n] = NULL; pArea->pArea[n] = NULL;
@ -108,34 +109,37 @@ xglAreaDestroy (xglAreaPtr pArea)
static xglAreaPtr static xglAreaPtr
xglAreaGetTopScoredSubArea (xglAreaPtr pArea) xglAreaGetTopScoredSubArea (xglAreaPtr pArea)
{ {
if (!pArea)
return NULL;
switch (pArea->state) { switch (pArea->state) {
case xglAreaOccupied: case xglAreaOccupied:
return pArea; return pArea;
case xglAreaAvailable: case xglAreaAvailable:
break; break;
case xglAreaDivided: case xglAreaDivided: {
{
xglAreaPtr tmp, top = NULL; xglAreaPtr tmp, top = NULL;
int i; int i;
for (i = 0; i < 4; 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 ((*pArea->pRoot->funcs->CompareScore) (tmp,
if (!tmp)
break;
if ((!top) ||
(*pArea->pRoot->funcs->CompareScore) (tmp,
tmp->closure, tmp->closure,
top->closure) > 0) top->closure) > 0)
top = tmp; top = tmp;
} }
else if (tmp)
{
top = tmp;
}
} }
return top; return top;
} }
} }
return NULL; return NULL;
} }
@ -254,7 +258,8 @@ xglAreaFind (xglAreaPtr pArea,
pArea->pArea[i] = NULL; pArea->pArea[i] = NULL;
} }
pArea->state = xglAreaAvailable; pArea->closure = (pointer) 0;
pArea->state = xglAreaAvailable;
if (xglFindArea (pArea, width, height, TRUE, closure)) if (xglFindArea (pArea, width, height, TRUE, closure))
return TRUE; return TRUE;