void kaaMoveInPixmap (PixmapPtr pPixmap) { ScreenPtr pScreen = pPixmap->drawable.pScreen; KaaScreenPriv (pScreen); KaaPixmapPriv (pPixmap); int dst_pitch, src_pitch, bytes; unsigned char *dst, *src; int i; DBG_MIGRATE (("-> 0x%08x (0x%x) (%dx%d)\n", pPixmap->drawable.id, KaaGetPixmapPriv(pPixmap)->area ? KaaGetPixmapPriv(pPixmap)->area->offset : -1, pPixmap->drawable.width, pPixmap->drawable.height)); src = pPixmap->devPrivate.ptr; src_pitch = pPixmap->devKind; if (!kaaPixmapAllocArea (pPixmap)) return; pKaaPixmap->dirty = FALSE; if (pKaaScr->info->UploadToScreen) { if (pKaaScr->info->UploadToScreen(pPixmap, (char *) src, src_pitch)) return; } dst = pPixmap->devPrivate.ptr; dst_pitch = pPixmap->devKind; bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch; kaaWaitSync (pPixmap->drawable.pScreen); i = pPixmap->drawable.height; while (i--) { memcpy (dst, src, bytes); dst += dst_pitch; src += src_pitch; } }
static void kaaMoveOutPixmap (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); KdOffscreenArea *area = pKaaPixmap->area; DBG_MIGRATE (("<- 0x%08x (0x%x) (%dx%d)\n", pPixmap->drawable.id, KaaGetPixmapPriv(pPixmap)->area ? KaaGetPixmapPriv(pPixmap)->area->offset : -1, pPixmap->drawable.width, pPixmap->drawable.height)); if (area) { kaaPixmapSave (pPixmap->drawable.pScreen, area); KdOffscreenFree (pPixmap->drawable.pScreen, area); } }
static void kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) { PixmapPtr pPixmap = area->privData; KaaPixmapPriv(pPixmap); int dst_pitch, src_pitch, bytes; unsigned char *dst, *src; int i; DBG_MIGRATE (("Save 0x%08x (0x%x) (%dx%d)\n", pPixmap->drawable.id, KaaGetPixmapPriv(pPixmap)->area ? KaaGetPixmapPriv(pPixmap)->area->offset : -1, pPixmap->drawable.width, pPixmap->drawable.height)); src_pitch = pPixmap->devKind; dst_pitch = pKaaPixmap->devKind; src = pPixmap->devPrivate.ptr; dst = pKaaPixmap->devPrivate.ptr; pPixmap->devKind = dst_pitch; pPixmap->devPrivate.ptr = dst; pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pKaaPixmap->area = NULL; #if 0 if (!pKaaPixmap->dirty) return; #endif kaaWaitSync (pPixmap->drawable.pScreen); bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch; i = pPixmap->drawable.height; while (i--) { memcpy (dst, src, bytes); dst += dst_pitch; src += src_pitch; } }
void kaaPixmapUseMemory (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); if (pKaaPixmap->score == KAA_PIXMAP_SCORE_PINNED) return; if (pKaaPixmap->score == KAA_PIXMAP_SCORE_INIT) pKaaPixmap->score = 0; if (pKaaPixmap->score > KAA_PIXMAP_SCORE_MIN) { pKaaPixmap->score--; if (pKaaPixmap->area && pKaaPixmap->score <= KAA_PIXMAP_SCORE_MOVE_OUT) kaaMoveOutPixmap (pPixmap); } }
static Bool kaaDestroyPixmap (PixmapPtr pPixmap) { if (pPixmap->refcnt == 1) { KaaPixmapPriv (pPixmap); if (pKaaPixmap->area) { DBG_PIXMAP(("-- 0x%08x (0x%x) (%dx%d)\n", pPixmap->drawable.id, KaaGetPixmapPriv(pPixmap)->area->offset, pPixmap->drawable.width, pPixmap->drawable.height)); /* Free the offscreen area */ KdOffscreenFree (pPixmap->drawable.pScreen, pKaaPixmap->area); pPixmap->devPrivate = pKaaPixmap->devPrivate; pPixmap->devKind = pKaaPixmap->devKind; } } return fbDestroyPixmap (pPixmap); }
void KdOffscreenMarkUsed (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); KdScreenPriv (pPixmap->drawable.pScreen); static int iter = 0; if (!pKaaPixmap->area) return; /* The numbers here are arbitrary. We may want to tune these. */ pKaaPixmap->area->score += 100; if (++iter == 10) { KdOffscreenArea *area; for (area = pScreenPriv->off_screen_areas; area != NULL; area = area->next) { if (area->state == KdOffscreenRemovable) area->score = (area->score * 7) / 8; } } }
void kaaPixmapUseScreen (PixmapPtr pPixmap) { KaaPixmapPriv (pPixmap); if (pKaaPixmap->score == KAA_PIXMAP_SCORE_PINNED) return; if (pKaaPixmap->score == KAA_PIXMAP_SCORE_INIT) { kaaMoveInPixmap(pPixmap); pKaaPixmap->score = 0; } if (pKaaPixmap->score < KAA_PIXMAP_SCORE_MAX) { pKaaPixmap->score++; if (!kaaPixmapIsOffscreen(pPixmap) && pKaaPixmap->score >= KAA_PIXMAP_SCORE_MOVE_IN) kaaMoveInPixmap (pPixmap); } KdOffscreenMarkUsed (pPixmap); }
static Bool kaaPixmapAllocArea (PixmapPtr pPixmap) { ScreenPtr pScreen = pPixmap->drawable.pScreen; KaaScreenPriv (pScreen); KaaPixmapPriv (pPixmap); KdScreenPriv (pScreen); int bpp = pPixmap->drawable.bitsPerPixel; CARD16 h = pPixmap->drawable.height; CARD16 w = pPixmap->drawable.width; int pitch; if (pKaaScr->info->flags & KAA_OFFSCREEN_ALIGN_POT && w != 1) w = 1 << (kaaLog2(w - 1) + 1); pitch = (w * bpp / 8 + pKaaScr->info->pitchAlign - 1) & ~(pKaaScr->info->pitchAlign - 1); pKaaPixmap->devKind = pPixmap->devKind; pKaaPixmap->devPrivate = pPixmap->devPrivate; pKaaPixmap->area = KdOffscreenAlloc (pScreen, pitch * h, pKaaScr->info->offsetAlign, FALSE, kaaPixmapSave, (pointer) pPixmap); if (!pKaaPixmap->area) return FALSE; DBG_PIXMAP(("++ 0x%08x (0x%x) (%dx%d)\n", pPixmap->drawable.id, KaaGetPixmapPriv(pPixmap)->area ? KaaGetPixmapPriv(pPixmap)->area->offset : -1, pPixmap->drawable.width, pPixmap->drawable.height)); pPixmap->devKind = pitch; pPixmap->devPrivate.ptr = (pointer) ((CARD8 *) pScreenPriv->screen->memory_base + pKaaPixmap->area->offset); pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; return TRUE; }