summaryrefslogtreecommitdiff
path: root/hw/kdrive/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2004-05-20 02:42:20 +0000
committerKeith Packard <keithp@keithp.com>2004-05-20 02:42:20 +0000
commit94648799c82e59166155ca5abf22a9391693e6a1 (patch)
tree78881555935204ee16bccb4e589f07fd8255b393 /hw/kdrive/src
parentcade317d31dddab61199d5e90bcff36fb12f3cd1 (diff)
Pin header-only pixmaps in memory.
Off-screen reallocation could have used a stale pointer. Separate framebuffer mapping computation from actual frame buffer mapping. Now map the frame buffer from vesaEnable so that VT switch shares the same mapping code. This makes sure any shadow framebuffer is allocated again.
Diffstat (limited to 'hw/kdrive/src')
-rw-r--r--hw/kdrive/src/kaa.c17
-rw-r--r--hw/kdrive/src/kdrive.h2
-rw-r--r--hw/kdrive/src/koffscreen.c18
3 files changed, 27 insertions, 10 deletions
diff --git a/hw/kdrive/src/kaa.c b/hw/kdrive/src/kaa.c
index 4d33d5619..616c0ef91 100644
--- a/hw/kdrive/src/kaa.c
+++ b/hw/kdrive/src/kaa.c
@@ -51,8 +51,10 @@ int kaaPixmapPrivateIndex;
#define KAA_PIXMAP_SCORE_MOVE_IN 10
#define KAA_PIXMAP_SCORE_MAX 20
+#define KAA_PIXMAP_SCORE_INIT 0
#define KAA_PIXMAP_SCORE_MOVE_OUT -10
#define KAA_PIXMAP_SCORE_MIN -20
+#define KAA_PIXMAP_SCORE_PINNED 1000
#define MIN_OFFPIX_SIZE (4096)
@@ -212,6 +214,9 @@ kaaPixmapUseScreen (PixmapPtr pPixmap)
{
KaaPixmapPriv (pPixmap);
+ if (pKaaPixmap->score == KAA_PIXMAP_SCORE_PINNED)
+ return;
+
if (pKaaPixmap->score < KAA_PIXMAP_SCORE_MAX)
{
pKaaPixmap->score++;
@@ -226,6 +231,9 @@ kaaPixmapUseMemory (PixmapPtr pPixmap)
{
KaaPixmapPriv (pPixmap);
+ if (pKaaPixmap->score == KAA_PIXMAP_SCORE_PINNED)
+ return;
+
if (pKaaPixmap->score > KAA_PIXMAP_SCORE_MIN)
{
pKaaPixmap->score--;
@@ -282,10 +290,15 @@ kaaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
if (!pPixmap)
return NULL;
pKaaPixmap = KaaGetPixmapPriv(pPixmap);
- pKaaPixmap->score = 0;
+ if (!w || !h)
+ pKaaPixmap->score == KAA_PIXMAP_SCORE_PINNED;
+ else
+ pKaaPixmap->score = KAA_PIXMAP_SCORE_INIT;
+
pKaaPixmap->area = NULL;
- if ((pPixmap->devKind * h) >= MIN_OFFPIX_SIZE)
+ if (pKaaPixmap->score != KAA_PIXMAP_SCORE_PINNED &&
+ (pPixmap->devKind * h) >= MIN_OFFPIX_SIZE)
kaaPixmapAllocArea (pPixmap);
return pPixmap;
}
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 8dc6606ef..c0fae276e 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -882,7 +882,7 @@ KdOffscreenAlloc (ScreenPtr pScreen, int size, int align,
KdOffscreenSaveProc save,
pointer privData);
-void
+KdOffscreenArea *
KdOffscreenFree (ScreenPtr pScreen, KdOffscreenArea *area);
void
diff --git a/hw/kdrive/src/koffscreen.c b/hw/kdrive/src/koffscreen.c
index 41f0a29e5..09e7273d0 100644
--- a/hw/kdrive/src/koffscreen.c
+++ b/hw/kdrive/src/koffscreen.c
@@ -55,12 +55,12 @@ KdOffscreenValidate (ScreenPtr pScreen)
#define KdOffscreenValidate(s)
#endif
-static void
+static KdOffscreenArea *
KdOffscreenKickOut (ScreenPtr pScreen, KdOffscreenArea *area)
{
if (area->save)
(*area->save) (pScreen, area);
- KdOffscreenFree (pScreen, area);
+ return KdOffscreenFree (pScreen, area);
}
KdOffscreenArea *
@@ -161,14 +161,14 @@ KdOffscreenAlloc (ScreenPtr pScreen, int size, int align,
* Kick out first area if in use
*/
if (area->state != KdOffscreenAvail)
- KdOffscreenKickOut (pScreen, area);
+ area = KdOffscreenKickOut (pScreen, area);
/*
* Now get the system to merge the other needed areas together
*/
while (area->size < real_size)
{
assert (area->next && area->next->state == KdOffscreenRemovable);
- KdOffscreenKickOut (pScreen, area->next);
+ (void) KdOffscreenKickOut (pScreen, area->next);
}
}
@@ -225,7 +225,7 @@ KdOffscreenSwapOut (ScreenPtr pScreen)
break;
}
assert (area->state != KdOffscreenAvail);
- KdOffscreenKickOut (pScreen, area);
+ (void) KdOffscreenKickOut (pScreen, area);
KdOffscreenValidate (pScreen);
}
KdOffscreenValidate (pScreen);
@@ -251,7 +251,7 @@ KdOffscreenMerge (KdOffscreenArea *area)
xfree (next);
}
-void
+KdOffscreenArea *
KdOffscreenFree (ScreenPtr pScreen, KdOffscreenArea *area)
{
KdScreenPriv(pScreen);
@@ -281,9 +281,13 @@ KdOffscreenFree (ScreenPtr pScreen, KdOffscreenArea *area)
/* link with prev area if free */
if (prev && prev->state == KdOffscreenAvail)
- KdOffscreenMerge (prev);
+ {
+ area = prev;
+ KdOffscreenMerge (area);
+ }
KdOffscreenValidate (pScreen);
+ return area;
}
Bool