Lines Matching full:area

46     ExaOffscreenArea *prev = 0, *area;  in ExaOffscreenValidate()  local
50 for (area = pExaScr->info->offScreenAreas; area; area = area->next) { in ExaOffscreenValidate()
51 assert(area->offset >= area->base_offset && in ExaOffscreenValidate()
52 area->offset < (area->base_offset + area->size)); in ExaOffscreenValidate()
54 assert(prev->base_offset + prev->size == area->base_offset); in ExaOffscreenValidate()
55 prev = area; in ExaOffscreenValidate()
64 ExaOffscreenKickOut(ScreenPtr pScreen, ExaOffscreenArea * area) in ExaOffscreenKickOut() argument
66 if (area->save) in ExaOffscreenKickOut()
67 (*area->save) (pScreen, area); in ExaOffscreenKickOut()
68 return exaOffscreenFree(pScreen, area); in ExaOffscreenKickOut()
72 exaUpdateEvictionCost(ExaOffscreenArea * area, unsigned offScreenCounter) in exaUpdateEvictionCost() argument
76 if (area->state == ExaOffscreenAvail) in exaUpdateEvictionCost()
79 age = offScreenCounter - area->last_use; in exaUpdateEvictionCost()
84 area->last_use = offScreenCounter - age; in exaUpdateEvictionCost()
87 area->eviction_cost = area->size / age; in exaUpdateEvictionCost()
111 /* adjust size needed to account for alignment loss for this area */ in exaFindAreaToEvict()
116 /* Can't more room here, restart after this locked area */ in exaFindAreaToEvict()
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 deteremine where and how large the allocated area is, and locked
155 * pointer for the save callback when the area is removed.
165 ExaOffscreenArea *area; in exaOffscreenAlloc() local
195 for (area = pExaScr->info->offScreenAreas; area; area = area->next) { in exaOffscreenAlloc()
197 if (area->state != ExaOffscreenAvail) in exaOffscreenAlloc()
201 real_size = size + (area->base_offset + area->size - size) % align; in exaOffscreenAlloc()
204 if (real_size <= area->size) in exaOffscreenAlloc()
207 if (area->size > largest_avail) in exaOffscreenAlloc()
208 largest_avail = area->size; in exaOffscreenAlloc()
211 if (!area) { in exaOffscreenAlloc()
212 area = exaFindAreaToEvict(pExaScr, size, align); in exaOffscreenAlloc()
214 if (!area) { in exaOffscreenAlloc()
221 /* adjust size needed to account for alignment loss for this area */ in exaOffscreenAlloc()
222 real_size = size + (area->base_offset + area->size - size) % align; in exaOffscreenAlloc()
225 * Kick out first area if in use in exaOffscreenAlloc()
227 if (area->state != ExaOffscreenAvail) in exaOffscreenAlloc()
228 area = ExaOffscreenKickOut(pScreen, area); in exaOffscreenAlloc()
232 while (area->size < real_size) { in exaOffscreenAlloc()
233 assert(area->next && area->next->state == ExaOffscreenRemovable); in exaOffscreenAlloc()
234 (void) ExaOffscreenKickOut(pScreen, area->next); in exaOffscreenAlloc()
238 /* save extra space in new area */ in exaOffscreenAlloc()
239 if (real_size < area->size) { in exaOffscreenAlloc()
244 new_area->base_offset = area->base_offset; in exaOffscreenAlloc()
248 new_area->size = area->size - real_size; in exaOffscreenAlloc()
253 new_area->next = area; in exaOffscreenAlloc()
254 new_area->prev = area->prev; in exaOffscreenAlloc()
255 if (area->prev->next) in exaOffscreenAlloc()
256 area->prev->next = new_area; in exaOffscreenAlloc()
259 area->prev = new_area; in exaOffscreenAlloc()
260 area->base_offset = new_area->base_offset + new_area->size; in exaOffscreenAlloc()
261 area->size = real_size; in exaOffscreenAlloc()
267 * Mark this area as in use in exaOffscreenAlloc()
270 area->state = ExaOffscreenLocked; in exaOffscreenAlloc()
272 area->state = ExaOffscreenRemovable; in exaOffscreenAlloc()
273 area->privData = privData; in exaOffscreenAlloc()
274 area->save = save; in exaOffscreenAlloc()
275 area->last_use = pExaScr->offScreenCounter++; in exaOffscreenAlloc()
276 area->offset = (area->base_offset + align - 1); in exaOffscreenAlloc()
277 area->offset -= area->offset % align; in exaOffscreenAlloc()
278 area->align = align; in exaOffscreenAlloc()
283 area->base_offset, area->offset)); in exaOffscreenAlloc()
284 return area; in exaOffscreenAlloc()
296 /* loop until a single free area spans the space */ in ExaOffscreenSwapOut()
298 ExaOffscreenArea *area = pExaScr->info->offScreenAreas; in ExaOffscreenSwapOut() local
300 if (!area) in ExaOffscreenSwapOut()
302 if (area->state == ExaOffscreenAvail) { in ExaOffscreenSwapOut()
303 area = area->next; in ExaOffscreenSwapOut()
304 if (!area) in ExaOffscreenSwapOut()
307 assert(area->state != ExaOffscreenAvail); in ExaOffscreenSwapOut()
308 (void) ExaOffscreenKickOut(pScreen, area); in ExaOffscreenSwapOut()
322 /* loop until a single free area spans the space */ in ExaOffscreenEjectPixmaps()
324 ExaOffscreenArea *area; in ExaOffscreenEjectPixmaps() local
326 for (area = pExaScr->info->offScreenAreas; area != NULL; in ExaOffscreenEjectPixmaps()
327 area = area->next) { in ExaOffscreenEjectPixmaps()
328 if (area->state == ExaOffscreenRemovable && in ExaOffscreenEjectPixmaps()
329 area->save == exaPixmapSave) { in ExaOffscreenEjectPixmaps()
330 (void) ExaOffscreenKickOut(pScreen, area); in ExaOffscreenEjectPixmaps()
335 if (area == NULL) in ExaOffscreenEjectPixmaps()
385 /* merge the next free area into this one */
387 ExaOffscreenMerge(ExaScreenPrivPtr pExaScr, ExaOffscreenArea * area) in ExaOffscreenMerge() argument
389 ExaOffscreenArea *next = area->next; in ExaOffscreenMerge()
392 area->size += next->size; in ExaOffscreenMerge()
394 area->next = next->next; in ExaOffscreenMerge()
395 if (area->next) in ExaOffscreenMerge()
396 area->next->prev = area; in ExaOffscreenMerge()
398 pExaScr->info->offScreenAreas->prev = area; in ExaOffscreenMerge()
408 * @param area offscreen area to free
411 * the save callback of the area is not called, and it is up to the driver to
414 * @return pointer to the newly freed area. This behavior should not be relied
418 exaOffscreenFree(ScreenPtr pScreen, ExaOffscreenArea * area) in exaOffscreenFree() argument
421 ExaOffscreenArea *next = area->next; in exaOffscreenFree()
424 DBG_OFFSCREEN(("Free 0x%x -> 0x%x (0x%x)\n", area->size, in exaOffscreenFree()
425 area->base_offset, area->offset)); in exaOffscreenFree()
428 area->state = ExaOffscreenAvail; in exaOffscreenFree()
429 area->save = NULL; in exaOffscreenFree()
430 area->last_use = 0; in exaOffscreenFree()
431 area->eviction_cost = 0; in exaOffscreenFree()
433 * Find previous area in exaOffscreenFree()
435 if (area == pExaScr->info->offScreenAreas) in exaOffscreenFree()
438 prev = area->prev; in exaOffscreenFree()
442 /* link with next area if free */ in exaOffscreenFree()
444 ExaOffscreenMerge(pExaScr, area); in exaOffscreenFree()
446 /* link with prev area if free */ in exaOffscreenFree()
448 area = prev; in exaOffscreenFree()
449 ExaOffscreenMerge(pExaScr, area); in exaOffscreenFree()
454 return area; in exaOffscreenFree()
463 if (!pExaPixmap || !pExaPixmap->area) in ExaOffscreenMarkUsed()
466 pExaPixmap->area->last_use = pExaScr->offScreenCounter++; in ExaOffscreenMarkUsed()
471 * leaving the total amount of memory available as a single area at the
478 ExaOffscreenArea *area, *largest_available = NULL; in ExaOffscreenDefragment() local
491 for (area = pExaScr->info->offScreenAreas->prev; in ExaOffscreenDefragment()
492 area != pExaScr->info->offScreenAreas;) { in ExaOffscreenDefragment()
493 ExaOffscreenArea *prev = area->prev; in ExaOffscreenDefragment()
499 if (area->state != ExaOffscreenAvail || in ExaOffscreenDefragment()
503 area = prev; in ExaOffscreenDefragment()
508 if (area == largest_available) { in ExaOffscreenDefragment()
512 area = prev; in ExaOffscreenDefragment()
513 ExaOffscreenMerge(pExaScr, area); in ExaOffscreenDefragment()
517 if (area->size > largest_size) { in ExaOffscreenDefragment()
518 largest_available = area; in ExaOffscreenDefragment()
519 largest_size = area->size; in ExaOffscreenDefragment()
526 area->base_offset + area->size - prev->size + prev->base_offset - in ExaOffscreenDefragment()
531 area = prev; in ExaOffscreenDefragment()
537 area = prev; in ExaOffscreenDefragment()
556 area = prev; in ExaOffscreenDefragment()
565area=0x%08x-0x%08x-0x%08x\n", prev->base_offset, prev->offset, prev->base_offset + prev->size, are… in ExaOffscreenDefragment()
567 /* Calculate swapped area offsets and sizes */ in ExaOffscreenDefragment()
568 area->base_offset = prev->base_offset; in ExaOffscreenDefragment()
569 area->offset = area->base_offset; in ExaOffscreenDefragment()
574 if (area->next) in ExaOffscreenDefragment()
575 prev->size = area->next->base_offset - prev->base_offset; in ExaOffscreenDefragment()
578 area->size = prev->base_offset - area->base_offset; in ExaOffscreenDefragment()
580 …CREEN(("After swap: area=0x%08x-0x%08x-0x%08x prev=0x%08x-0x%08x-0x%08x\n", area->base_offset, are… in ExaOffscreenDefragment()
583 if (area->next) in ExaOffscreenDefragment()
584 area->next->prev = prev; in ExaOffscreenDefragment()
588 prev->prev->next = area; in ExaOffscreenDefragment()
590 pExaScr->info->offScreenAreas = area; in ExaOffscreenDefragment()
591 prev->next = area->next; in ExaOffscreenDefragment()
592 area->next = prev; in ExaOffscreenDefragment()
593 area->prev = prev->prev; in ExaOffscreenDefragment()
594 prev->prev = area; in ExaOffscreenDefragment()
595 if (!area->prev->next) in ExaOffscreenDefragment()
596 pExaScr->info->offScreenAreas = area; in ExaOffscreenDefragment()
602 if (area->prev == area || area->next == area) in ExaOffscreenDefragment()
603 ErrorF("Whoops, area points to itself!\n"); in ExaOffscreenDefragment()
618 if (area->state == ExaOffscreenAvail && area->size > largest_size) in ExaOffscreenDefragment()
619 return area; in ExaOffscreenDefragment()
636 ExaOffscreenArea *area; in exaOffscreenInit() local
638 /* Allocate a big free area */ in exaOffscreenInit()
639 area = malloc(sizeof(ExaOffscreenArea)); in exaOffscreenInit()
641 if (!area) in exaOffscreenInit()
644 area->state = ExaOffscreenAvail; in exaOffscreenInit()
645 area->base_offset = pExaScr->info->offScreenBase; in exaOffscreenInit()
646 area->offset = area->base_offset; in exaOffscreenInit()
647 area->align = 0; in exaOffscreenInit()
648 area->size = pExaScr->info->memorySize - area->base_offset; in exaOffscreenInit()
649 area->save = NULL; in exaOffscreenInit()
650 area->next = NULL; in exaOffscreenInit()
651 area->prev = area; in exaOffscreenInit()
652 area->last_use = 0; in exaOffscreenInit()
653 area->eviction_cost = 0; in exaOffscreenInit()
656 pExaScr->info->offScreenAreas = area; in exaOffscreenInit()
669 ExaOffscreenArea *area; in ExaOffscreenFini() local
671 /* just free all of the area records */ in ExaOffscreenFini()
672 while ((area = pExaScr->info->offScreenAreas)) { in ExaOffscreenFini()
673 pExaScr->info->offScreenAreas = area->next; in ExaOffscreenFini()
674 free(area); in ExaOffscreenFini()