Lines Matching refs:area

46     ExaOffscreenArea *prev = 0, *area;
50 for (area = pExaScr->info->offScreenAreas; area; area = area->next)
52 assert (area->offset >= area->base_offset &&
53 area->offset < (area->base_offset + area->size));
55 assert (prev->base_offset + prev->size == area->base_offset);
56 prev = area;
65 ExaOffscreenKickOut (ScreenPtr pScreen, ExaOffscreenArea *area)
67 if (area->save)
68 (*area->save) (pScreen, area);
69 return exaOffscreenFree (pScreen, area);
73 exaUpdateEvictionCost(ExaOffscreenArea *area, unsigned offScreenCounter)
77 if (area->state == ExaOffscreenAvail)
80 age = offScreenCounter - area->last_use;
85 area->last_use = offScreenCounter - age;
88 area->eviction_cost = area->size / age;
113 /* adjust size needed to account for alignment loss for this area */
119 /* Can't more room here, restart after this locked area */
150 * @param align byte alignment requirement for the offset of the allocated area
151 * @param locked whether the allocated area is locked and can't be kicked out
152 * @param save callback for when the area is evicted from memory
156 * and align deteremine where and how large the allocated area is, and locked
158 * pointer for the save callback when the area is removed.
170 ExaOffscreenArea *area;
198 for (area = pExaScr->info->offScreenAreas; area; area = area->next)
201 if (area->state != ExaOffscreenAvail)
205 real_size = size + (area->base_offset + area->size - size) % align;
208 if (real_size <= area->size)
211 if (area->size > largest_avail)
212 largest_avail = area->size;
215 if (!area)
217 area = exaFindAreaToEvict(pExaScr, size, align);
219 if (!area)
227 /* adjust size needed to account for alignment loss for this area */
228 real_size = size + (area->base_offset + area->size - size) % align;
231 * Kick out first area if in use
233 if (area->state != ExaOffscreenAvail)
234 area = ExaOffscreenKickOut (pScreen, area);
238 while (area->size < real_size)
240 assert (area->next && area->next->state == ExaOffscreenRemovable);
241 (void) ExaOffscreenKickOut (pScreen, area->next);
245 /* save extra space in new area */
246 if (real_size < area->size)
251 new_area->base_offset = area->base_offset;
255 new_area->size = area->size - real_size;
260 new_area->next = area;
261 new_area->prev = area->prev;
262 if (area->prev->next)
263 area->prev->next = new_area;
266 area->prev = new_area;
267 area->base_offset = new_area->base_offset + new_area->size;
268 area->size = real_size;
273 * Mark this area as in use
276 area->state = ExaOffscreenLocked;
278 area->state = ExaOffscreenRemovable;
279 area->privData = privData;
280 area->save = save;
281 area->last_use = pExaScr->offScreenCounter++;
282 area->offset = (area->base_offset + align - 1);
283 area->offset -= area->offset % align;
284 area->align = align;
289 area->base_offset, area->offset));
290 return area;
302 /* loop until a single free area spans the space */
305 ExaOffscreenArea *area = pExaScr->info->offScreenAreas;
307 if (!area)
309 if (area->state == ExaOffscreenAvail)
311 area = area->next;
312 if (!area)
315 assert (area->state != ExaOffscreenAvail);
316 (void) ExaOffscreenKickOut (pScreen, area);
330 /* loop until a single free area spans the space */
333 ExaOffscreenArea *area;
335 for (area = pExaScr->info->offScreenAreas; area != NULL;
336 area = area->next)
338 if (area->state == ExaOffscreenRemovable &&
339 area->save == exaPixmapSave)
341 (void) ExaOffscreenKickOut (pScreen, area);
346 if (area == NULL)
397 /* merge the next free area into this one */
399 ExaOffscreenMerge (ExaScreenPrivPtr pExaScr, ExaOffscreenArea *area)
401 ExaOffscreenArea *next = area->next;
404 area->size += next->size;
406 area->next = next->next;
407 if (area->next)
408 area->next->prev = area;
410 pExaScr->info->offScreenAreas->prev = area;
420 * @param area offscreen area to free
423 * the save callback of the area is not called, and it is up to the driver to
426 * @return pointer to the newly freed area. This behavior should not be relied
430 exaOffscreenFree (ScreenPtr pScreen, ExaOffscreenArea *area)
433 ExaOffscreenArea *next = area->next;
436 DBG_OFFSCREEN (("Free 0x%x -> 0x%x (0x%x)\n", area->size,
437 area->base_offset, area->offset));
440 area->state = ExaOffscreenAvail;
441 area->save = NULL;
442 area->last_use = 0;
443 area->eviction_cost = 0;
445 * Find previous area
447 if (area == pExaScr->info->offScreenAreas)
450 prev = area->prev;
454 /* link with next area if free */
456 ExaOffscreenMerge (pExaScr, area);
458 /* link with prev area if free */
461 area = prev;
462 ExaOffscreenMerge (pExaScr, area);
467 return area;
476 if (!pExaPixmap || !pExaPixmap->area)
479 pExaPixmap->area->last_use = pExaScr->offScreenCounter++;
484 * leaving the total amount of memory available as a single area at the
491 ExaOffscreenArea *area, *largest_available = NULL;
504 for (area = pExaScr->info->offScreenAreas->prev;
505 area != pExaScr->info->offScreenAreas;
508 ExaOffscreenArea *prev = area->prev;
514 if (area->state != ExaOffscreenAvail ||
518 area = prev;
523 if (area == largest_available) {
527 area = prev;
528 ExaOffscreenMerge (pExaScr, area);
532 if (area->size > largest_size) {
533 largest_available = area;
534 largest_size = area->size;
541 area->base_offset + area->size - prev->size + prev->base_offset -
546 area = prev;
552 area = prev;
571 area = prev;
580 DBG_OFFSCREEN(("Before swap: prev=0x%08x-0x%08x-0x%08x area=0x%08x-0x%08x-0x%08x\n",
582 area->base_offset, area->offset, area->base_offset + area->size));
584 /* Calculate swapped area offsets and sizes */
585 area->base_offset = prev->base_offset;
586 area->offset = area->base_offset;
591 if (area->next)
592 prev->size = area->next->base_offset - prev->base_offset;
595 area->size = prev->base_offset - area->base_offset;
597 DBG_OFFSCREEN(("After swap: area=0x%08x-0x%08x-0x%08x prev=0x%08x-0x%08x-0x%08x\n",
598 area->base_offset, area->offset, area->base_offset + area->size,
602 if (area->next)
603 area->next->prev = prev;
607 prev->prev->next = area;
609 pExaScr->info->offScreenAreas = area;
610 prev->next = area->next;
611 area->next = prev;
612 area->prev = prev->prev;
613 prev->prev = area;
614 if (!area->prev->next)
615 pExaScr->info->offScreenAreas = area;
621 if (area->prev == area || area->next == area)
622 ErrorF("Whoops, area points to itself!\n");
637 if (area->state == ExaOffscreenAvail && area->size > largest_size)
638 return area;
655 ExaOffscreenArea *area;
657 /* Allocate a big free area */
658 area = malloc(sizeof (ExaOffscreenArea));
660 if (!area)
663 area->state = ExaOffscreenAvail;
664 area->base_offset = pExaScr->info->offScreenBase;
665 area->offset = area->base_offset;
666 area->align = 0;
667 area->size = pExaScr->info->memorySize - area->base_offset;
668 area->save = NULL;
669 area->next = NULL;
670 area->prev = area;
671 area->last_use = 0;
672 area->eviction_cost = 0;
675 pExaScr->info->offScreenAreas = area;
688 ExaOffscreenArea *area;
690 /* just free all of the area records */
691 while ((area = pExaScr->info->offScreenAreas))
693 pExaScr->info->offScreenAreas = area->next;
694 free(area);