EXA: Allocate from the end of free offscreen memory rather than from the start.
This way we don't always need to scan over previously allocated areas when looking for an available one, and there might be less fragmentation. Signed-off-by: Michel Dänzer <daenzer@vmware.com>
This commit is contained in:
parent
510cbd43cd
commit
4addfcd633
|
@ -93,7 +93,7 @@ exaFindAreaToEvict(ExaScreenPrivPtr pExaScr, int size, int align)
|
||||||
{
|
{
|
||||||
ExaOffscreenArea *begin, *end, *best;
|
ExaOffscreenArea *begin, *end, *best;
|
||||||
unsigned cost, best_cost;
|
unsigned cost, best_cost;
|
||||||
int avail, real_size, tmp;
|
int avail, real_size;
|
||||||
|
|
||||||
best_cost = UINT_MAX;
|
best_cost = UINT_MAX;
|
||||||
begin = end = pExaScr->info->offScreenAreas;
|
begin = end = pExaScr->info->offScreenAreas;
|
||||||
|
@ -111,10 +111,7 @@ exaFindAreaToEvict(ExaScreenPrivPtr pExaScr, int size, int align)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* adjust size needed to account for alignment loss for this area */
|
/* adjust size needed to account for alignment loss for this area */
|
||||||
real_size = size;
|
real_size = size + (begin->base_offset + begin->size - size) % align;
|
||||||
tmp = begin->base_offset % align;
|
|
||||||
if (tmp)
|
|
||||||
real_size += (align - tmp);
|
|
||||||
|
|
||||||
while (avail < real_size && end != NULL)
|
while (avail < real_size && end != NULL)
|
||||||
{
|
{
|
||||||
|
@ -172,7 +169,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
{
|
{
|
||||||
ExaOffscreenArea *area;
|
ExaOffscreenArea *area;
|
||||||
ExaScreenPriv (pScreen);
|
ExaScreenPriv (pScreen);
|
||||||
int tmp, real_size = 0, free_total = 0, largest_avail = 0;
|
int real_size = 0, free_total = 0, largest_avail = 0;
|
||||||
#if DEBUG_OFFSCREEN
|
#if DEBUG_OFFSCREEN
|
||||||
static int number = 0;
|
static int number = 0;
|
||||||
ErrorF("================= ============ allocating a new pixmap %d\n", ++number);
|
ErrorF("================= ============ allocating a new pixmap %d\n", ++number);
|
||||||
|
@ -205,10 +202,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* adjust size to match alignment requirement */
|
/* adjust size to match alignment requirement */
|
||||||
real_size = size;
|
real_size = size + (area->base_offset + area->size - size) % align;
|
||||||
tmp = area->base_offset % align;
|
|
||||||
if (tmp)
|
|
||||||
real_size += (align - tmp);
|
|
||||||
|
|
||||||
/* does it fit? */
|
/* does it fit? */
|
||||||
if (real_size <= area->size)
|
if (real_size <= area->size)
|
||||||
|
@ -232,10 +226,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
|
|
||||||
if (area) {
|
if (area) {
|
||||||
/* adjust size to match alignment requirement */
|
/* adjust size to match alignment requirement */
|
||||||
real_size = size;
|
real_size = size + (area->base_offset + area->size - size) % align;
|
||||||
tmp = area->base_offset % align;
|
|
||||||
if (tmp)
|
|
||||||
real_size += (align - tmp);
|
|
||||||
|
|
||||||
/* does it fit? */
|
/* does it fit? */
|
||||||
if (real_size > area->size)
|
if (real_size > area->size)
|
||||||
|
@ -257,10 +248,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust size needed to account for alignment loss for this area */
|
/* adjust size needed to account for alignment loss for this area */
|
||||||
real_size = size;
|
real_size = size + (area->base_offset + area->size - size) % align;
|
||||||
tmp = area->base_offset % align;
|
|
||||||
if (tmp)
|
|
||||||
real_size += (align - tmp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kick out first area if in use
|
* Kick out first area if in use
|
||||||
|
@ -283,13 +271,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
ExaOffscreenArea *new_area = xalloc (sizeof (ExaOffscreenArea));
|
ExaOffscreenArea *new_area = xalloc (sizeof (ExaOffscreenArea));
|
||||||
if (!new_area)
|
if (!new_area)
|
||||||
return NULL;
|
return NULL;
|
||||||
new_area->base_offset = area->base_offset + real_size;
|
new_area->base_offset = area->base_offset;
|
||||||
|
|
||||||
#if DEBUG_OFFSCREEN
|
|
||||||
if (new_area->base_offset >= pExaScr->info->memorySize)
|
|
||||||
ErrorF("new_area->base_offset = 0x%08x >= memorySize!\n",
|
|
||||||
new_area->base_offset);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
new_area->offset = new_area->base_offset;
|
new_area->offset = new_area->base_offset;
|
||||||
new_area->align = 0;
|
new_area->align = 0;
|
||||||
|
@ -298,13 +280,14 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
|
||||||
new_area->save = NULL;
|
new_area->save = NULL;
|
||||||
new_area->last_use = 0;
|
new_area->last_use = 0;
|
||||||
new_area->eviction_cost = 0;
|
new_area->eviction_cost = 0;
|
||||||
new_area->next = area->next;
|
new_area->next = area;
|
||||||
if (area->next)
|
new_area->prev = area->prev;
|
||||||
area->next->prev = new_area;
|
if (area->prev->next)
|
||||||
|
area->prev->next = new_area;
|
||||||
else
|
else
|
||||||
pExaScr->info->offScreenAreas->prev = new_area;
|
pExaScr->info->offScreenAreas = new_area;
|
||||||
area->next = new_area;
|
area->prev = new_area;
|
||||||
new_area->prev = area;
|
area->base_offset = new_area->base_offset + new_area->size;
|
||||||
area->size = real_size;
|
area->size = real_size;
|
||||||
} else
|
} else
|
||||||
pExaScr->numOffscreenAvailable--;
|
pExaScr->numOffscreenAvailable--;
|
||||||
|
|
Loading…
Reference in New Issue