Hi,

  I believe there are other reasons for XaaNoOffscreenPixmaps,
but I suspect some of them are due to "unknown bugs", while
others may be just that offscreen memory management is not
done by the "xf86 fb manager".

  The attached patch is an example of a case that is probably
better corrected in the driver itself, and I think should not
be applied :-)

  Anyway, shouldn't it be corrected in another schema when
using an alternate memory manager for example? So that pixmaps
can reside in offscreen memory, instead of main memory...

Paulo
>From d9334dd8de72dae0d7185d19bfd5e7f4caf80f7a Mon Sep 17 00:00:00 2001
From: Paulo Cesar Pereira de Andrade <p...@mandriva.com.br>
Date: Thu, 8 Jan 2009 15:31:34 -0200
Subject: [PATCH] Add Xaa CopyAreaFlags SYNC_BEFORE_SCREEN_COPY

  This flag is intended for use with hardware that supports only either
positive X screen copy, or sign X == sign Y screen copy, and have a
limited fifo.
---
 hw/xfree86/xaa/XAA.HOWTO    |    5 +++++
 hw/xfree86/xaa/xaa.h        |    5 +++--
 hw/xfree86/xaa/xaaCpyArea.c |   29 ++++++++++++++++++++++++-----
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/hw/xfree86/xaa/XAA.HOWTO b/hw/xfree86/xaa/XAA.HOWTO
index cbd71c1..1d0b05c 100644
--- a/hw/xfree86/xaa/XAA.HOWTO
+++ b/hw/xfree86/xaa/XAA.HOWTO
@@ -185,6 +185,11 @@ descriptions of those primitives below.
       This indicates that the hardware can only cope with blitting when
       the direction of x is the same as the direction in y.
 
+    SYNC_AFTER_SUBSEQUENT_SCREEN_COPY
+
+      This indicates that the hardware must be sync'ed before subsequent
+      screen copies.
+
 
 void SetupForScreenToScreenCopy( ScrnInfoPtr pScrn,
 			int xdir, int ydir,
diff --git a/hw/xfree86/xaa/xaa.h b/hw/xfree86/xaa/xaa.h
index 7db6b95..a83f6eb 100644
--- a/hw/xfree86/xaa/xaa.h
+++ b/hw/xfree86/xaa/xaa.h
@@ -3,7 +3,7 @@
 #define _XAA_H
 
 #define XAA_VERSION_MAJOR   1
-#define XAA_VERSION_MINOR   2
+#define XAA_VERSION_MINOR   3
 #define XAA_VERSION_RELEASE 1
 
 /*
@@ -28,7 +28,7 @@
 ---------               --------
 23           ONLY_LEFT_TO_RIGHT_BITBLT
 22           ONLY_TWO_BITBLT_DIRECTIONS
-21                         .
+21           SYNC_BEFORE_SCREEN_COPY
 20                         .
 19                         .
 18                         .
@@ -159,6 +159,7 @@
 /* copyarea flags */
 #define ONLY_TWO_BITBLT_DIRECTIONS	0x00400000
 #define ONLY_LEFT_TO_RIGHT_BITBLT	0x00800000
+#define SYNC_BEFORE_SCREEN_COPY		0x00200000
 
 /* line flags */
 #define LINE_PATTERN_LSBFIRST_MSBJUSTIFIED	0x00800000
diff --git a/hw/xfree86/xaa/xaaCpyArea.c b/hw/xfree86/xaa/xaaCpyArea.c
index 6a898cd..b7cf2f2 100644
--- a/hw/xfree86/xaa/xaaCpyArea.c
+++ b/hw/xfree86/xaa/xaaCpyArea.c
@@ -286,11 +286,14 @@ XAAScreenToScreenBitBlt(
         (*infoRec->SetupForScreenToScreenCopy)(pScrn,
             1, ydir, alu, planemask, -1);
         for (; nbox; pbox++, pptSrc++, nbox--)
-            if (pptSrc->y != pbox->y1 || pptSrc->x >= pbox->x1)
+            if (pptSrc->y != pbox->y1 || pptSrc->x >= pbox->x1) {
                 /* No problem. Do a xdir = 1 blit instead. */
+		if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+		    (*infoRec->Sync)(infoRec->pScrn);
                 (*infoRec->SubsequentScreenToScreenCopy)(pScrn,
                     pptSrc->x, pptSrc->y, pbox->x1, pbox->y1,
                     pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
+	    }
             else 
             {
                 /*
@@ -306,18 +309,24 @@ XAAScreenToScreenBitBlt(
                 extra = w % stripeWidth;
 
                 /* First, take care of the little bit on the far right */
-                if (extra)
+                if (extra) {
+		    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+			(*infoRec->Sync)(infoRec->pScrn);
                     (*infoRec->SubsequentScreenToScreenCopy)(pScrn,
                         pptSrc->x + fullStripes * stripeWidth, pptSrc->y,
                         pbox->x1 + fullStripes * stripeWidth, pbox->y1,
                         extra, pbox->y2 - pbox->y1);
+		}
 
                 /* Now, take care of the rest of the blit */
-                for (i = fullStripes - 1; i >= 0; i--)
+                for (i = fullStripes - 1; i >= 0; i--) {
+		    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+			(*infoRec->Sync)(infoRec->pScrn);
                     (*infoRec->SubsequentScreenToScreenCopy)(pScrn,
                         pptSrc->x + i * stripeWidth, pptSrc->y,
                         pbox->x1 + i * stripeWidth, pbox->y1,
                         stripeWidth, pbox->y2 - pbox->y1);
+		}
             }
         SET_SYNC_FLAG(infoRec);
         return;
@@ -336,6 +345,8 @@ XAAScreenToScreenBitBlt(
                     -1, -1, alu, planemask, -1);
                 dirsetup = -1;
             }
+	    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+		(*infoRec->Sync)(infoRec->pScrn);
             (*infoRec->SubsequentScreenToScreenCopy)(pScrn,pptSrc->x, pptSrc->y,
                 pbox->x1, pbox->y1, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
         }
@@ -346,6 +357,8 @@ XAAScreenToScreenBitBlt(
                     1, 1, alu, planemask, -1);
                 dirsetup = 1;
             }
+	    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+		(*infoRec->Sync)(infoRec->pScrn);
             (*infoRec->SubsequentScreenToScreenCopy)(pScrn,pptSrc->x, pptSrc->y,
                 pbox->x1, pbox->y1, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
         }
@@ -361,10 +374,13 @@ XAAScreenToScreenBitBlt(
                         1, 1, alu, planemask, -1);
                     dirsetup = 1;
                 }
-                for (i = pbox->y2 - pbox->y1 - 1; i >= 0; i--)
+                for (i = pbox->y2 - pbox->y1 - 1; i >= 0; i--) {
+		    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+			(*infoRec->Sync)(infoRec->pScrn);
                     (*infoRec->SubsequentScreenToScreenCopy)(pScrn,
                         pptSrc->x, pptSrc->y + i, pbox->x1, pbox->y1 + i,
                         pbox->x2 - pbox->x1, 1);
+		}
             }
             else {
                 /*
@@ -377,10 +393,13 @@ XAAScreenToScreenBitBlt(
                         -1, -1, alu, planemask, -1);
                     dirsetup = -1;
                 }
-                for (i = 0; i < pbox->y2 - pbox->y1; i++)
+                for (i = 0; i < pbox->y2 - pbox->y1; i++) {
+		    if (infoRec->CopyAreaFlags & SYNC_BEFORE_SCREEN_COPY)
+			(*infoRec->Sync)(infoRec->pScrn);
                     (*infoRec->SubsequentScreenToScreenCopy)(pScrn,
                         pptSrc->x, pptSrc->y + i, pbox->x1, pbox->y1 + i,
                         pbox->x2 - pbox->x1, 1);
+		}
             }
     } /* next box */
     SET_SYNC_FLAG(infoRec);
-- 
1.6.0.5
_______________________________________________
xorg mailing list
xorg@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to