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,6 +40,7 @@ xglAreaMoveOut (xglAreaPtr pArea)
{ {
(*pArea->pRoot->funcs->MoveOut) (pArea, pArea->closure); (*pArea->pRoot->funcs->MoveOut) (pArea, pArea->closure);
pArea->closure = (pointer) 0;
pArea->state = xglAreaAvailable; pArea->state = xglAreaAvailable;
} }
@ -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]); tmp = xglAreaGetTopScoredSubArea (pArea->pArea[i]);
if (!tmp) if (tmp && top)
break; {
if ((*pArea->pRoot->funcs->CompareScore) (tmp,
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,6 +258,7 @@ xglAreaFind (xglAreaPtr pArea,
pArea->pArea[i] = NULL; pArea->pArea[i] = NULL;
} }
pArea->closure = (pointer) 0;
pArea->state = xglAreaAvailable; pArea->state = xglAreaAvailable;
if (xglFindArea (pArea, width, height, TRUE, closure)) if (xglFindArea (pArea, width, height, TRUE, closure))
return TRUE; return TRUE;