Lines Matching refs:area
46 ExaOffscreenArea *prev = 0, *area;
50 for (area = pExaScr->info->offScreenAreas; area; area = area->next) {
51 assert(area->offset >= area->base_offset);
52 assert(area->offset < (area->base_offset + area->size));
54 assert(prev->base_offset + prev->size == area->base_offset);
55 prev = area;
64 ExaOffscreenKickOut(ScreenPtr pScreen, ExaOffscreenArea * area)
66 if (area->save)
67 (*area->save) (pScreen, area);
68 return exaOffscreenFree(pScreen, area);
72 exaUpdateEvictionCost(ExaOffscreenArea * area, unsigned offScreenCounter)
76 if (area->state == ExaOffscreenAvail)
79 age = offScreenCounter - area->last_use;
84 area->last_use = offScreenCounter - age;
87 area->eviction_cost = area->size / age;
111 /* adjust size needed to account for alignment loss for this area */
116 /* Can't more room here, restart after this locked area */
147 * @param align byte alignment requirement for the offset of the allocated area
148 * @param locked whether the allocated area is locked and can't be kicked out
149 * @param save callback for when the area is evicted from memory
153 * and align determine where and how large the allocated area is, and locked
155 * pointer for the save callback when the area is removed.
165 ExaOffscreenArea *area;
195 for (area = pExaScr->info->offScreenAreas; area; area = area->next) {
197 if (area->state != ExaOffscreenAvail)
201 real_size = size + (area->base_offset + area->size - size) % align;
204 if (real_size <= area->size)
207 if (area->size > largest_avail)
208 largest_avail = area->size;
211 if (!area) {
212 area = exaFindAreaToEvict(pExaScr, size, align);
214 if (!area) {
221 /* adjust size needed to account for alignment loss for this area */
222 real_size = size + (area->base_offset + area->size - size) % align;
225 * Kick out first area if in use
227 if (area->state != ExaOffscreenAvail)
228 area = ExaOffscreenKickOut(pScreen, area);
232 while (area->size < real_size) {
233 assert(area->next);
234 assert(area->next->state == ExaOffscreenRemovable);
235 (void) ExaOffscreenKickOut(pScreen, area->next);
239 /* save extra space in new area */
240 if (real_size < area->size) {
245 new_area->base_offset = area->base_offset;
249 new_area->size = area->size - real_size;
254 new_area->next = area;
255 new_area->prev = area->prev;
256 if (area->prev->next)
257 area->prev->next = new_area;
260 area->prev = new_area;
261 area->base_offset = new_area->base_offset + new_area->size;
262 area->size = real_size;
268 * Mark this area as in use
271 area->state = ExaOffscreenLocked;
273 area->state = ExaOffscreenRemovable;
274 area->privData = privData;
275 area->save = save;
276 area->last_use = pExaScr->offScreenCounter++;
277 area->offset = (area->base_offset + align - 1);
278 area->offset -= area->offset % align;
279 area->align = align;
284 area->base_offset, area->offset));
285 return area;
297 /* loop until a single free area spans the space */
299 ExaOffscreenArea *area = pExaScr->info->offScreenAreas;
301 if (!area)
303 if (area->state == ExaOffscreenAvail) {
304 area = area->next;
305 if (!area)
308 assert(area->state != ExaOffscreenAvail);
309 (void) ExaOffscreenKickOut(pScreen, area);
323 /* loop until a single free area spans the space */
325 ExaOffscreenArea *area;
327 for (area = pExaScr->info->offScreenAreas; area != NULL;
328 area = area->next) {
329 if (area->state == ExaOffscreenRemovable &&
330 area->save == exaPixmapSave) {
331 (void) ExaOffscreenKickOut(pScreen, area);
336 if (area == NULL)
386 /* merge the next free area into this one */
388 ExaOffscreenMerge(ExaScreenPrivPtr pExaScr, ExaOffscreenArea * area)
390 ExaOffscreenArea *next = area->next;
393 area->size += next->size;
395 area->next = next->next;
396 if (area->next)
397 area->next->prev = area;
399 pExaScr->info->offScreenAreas->prev = area;
409 * @param area offscreen area to free
412 * the save callback of the area is not called, and it is up to the driver to
415 * @return pointer to the newly freed area. This behavior should not be relied
419 exaOffscreenFree(ScreenPtr pScreen, ExaOffscreenArea * area)
422 ExaOffscreenArea *next = area->next;
425 DBG_OFFSCREEN(("Free 0x%x -> 0x%x (0x%x)\n", area->size,
426 area->base_offset, area->offset));
429 area->state = ExaOffscreenAvail;
430 area->save = NULL;
431 area->last_use = 0;
432 area->eviction_cost = 0;
434 * Find previous area
436 if (area == pExaScr->info->offScreenAreas)
439 prev = area->prev;
443 /* link with next area if free */
445 ExaOffscreenMerge(pExaScr, area);
447 /* link with prev area if free */
449 area = prev;
450 ExaOffscreenMerge(pExaScr, area);
455 return area;
464 if (!pExaPixmap || !pExaPixmap->area)
467 pExaPixmap->area->last_use = pExaScr->offScreenCounter++;
472 * leaving the total amount of memory available as a single area at the
479 ExaOffscreenArea *area, *largest_available = NULL;
492 for (area = pExaScr->info->offScreenAreas->prev;
493 area != pExaScr->info->offScreenAreas;) {
494 ExaOffscreenArea *prev = area->prev;
500 if (area->state != ExaOffscreenAvail ||
504 area = prev;
509 if (area == largest_available) {
513 area = prev;
514 ExaOffscreenMerge(pExaScr, area);
518 if (area->size > largest_size) {
519 largest_available = area;
520 largest_size = area->size;
527 area->base_offset + area->size - prev->size + prev->base_offset -
532 area = prev;
538 area = prev;
557 area = prev;
566 DBG_OFFSCREEN(("Before swap: prev=0x%08x-0x%08x-0x%08x area=0x%08x-0x%08x-0x%08x\n", prev->base_offset, prev->offset, prev->base_offset + prev->size, area->base_offset, area->offset, area->base_offset + area->size));
568 /* Calculate swapped area offsets and sizes */
569 area->base_offset = prev->base_offset;
570 area->offset = area->base_offset;
575 if (area->next)
576 prev->size = area->next->base_offset - prev->base_offset;
579 area->size = prev->base_offset - area->base_offset;
581 DBG_OFFSCREEN(("After swap: area=0x%08x-0x%08x-0x%08x prev=0x%08x-0x%08x-0x%08x\n", area->base_offset, area->offset, area->base_offset + area->size, prev->base_offset, prev->offset, prev->base_offset + prev->size));
584 if (area->next)
585 area->next->prev = prev;
589 prev->prev->next = area;
591 pExaScr->info->offScreenAreas = area;
592 prev->next = area->next;
593 area->next = prev;
594 area->prev = prev->prev;
595 prev->prev = area;
596 if (!area->prev->next)
597 pExaScr->info->offScreenAreas = area;
603 if (area->prev == area || area->next == area)
604 ErrorF("Whoops, area points to itself!\n");
619 if (area->state == ExaOffscreenAvail && area->size > largest_size)
620 return area;
637 ExaOffscreenArea *area;
639 /* Allocate a big free area */
640 area = malloc(sizeof(ExaOffscreenArea));
642 if (!area)
645 area->state = ExaOffscreenAvail;
646 area->base_offset = pExaScr->info->offScreenBase;
647 area->offset = area->base_offset;
648 area->align = 0;
649 area->size = pExaScr->info->memorySize - area->base_offset;
650 area->save = NULL;
651 area->next = NULL;
652 area->prev = area;
653 area->last_use = 0;
654 area->eviction_cost = 0;
657 pExaScr->info->offScreenAreas = area;
670 ExaOffscreenArea *area;
672 /* just free all of the area records */
673 while ((area = pExaScr->info->offScreenAreas)) {
674 pExaScr->info->offScreenAreas = area->next;
675 free(area);