[Xorg-driver-geode] [PATCH 2/2] Fix rotation with newer Xserver versions (exaOffscreenAlloc)

Cui, Hunk Hunk.Cui at amd.com
Sun Jul 11 20:29:27 PDT 2010


From: Hunk Cui <Hunk.Cui at amd.com>

*Del for deduct the probable size of a shadow buffer.
*Use exaOffscreenAlloc allocate the shadow buffer.
*Rotateeddata has to be allocate in offscreen memory range.
*Ubuntu Bugzilla #377929

Signed-off-by: Hunk Cui <Hunk.Cui at amd.com>
---
 src/geode.h      |    2 ++
 src/lx_display.c |   46 ++++++++++++++++++++++++++++++++++++++--------
 src/lx_memory.c  |    8 ++++----
 3 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/src/geode.h b/src/geode.h
index 8fe67b5..ad94a02 100644
--- a/src/geode.h
+++ b/src/geode.h
@@ -210,6 +210,8 @@ typedef struct _geodeRec
     int Pitch;			       /* display FB pitch */
     int displaySize;		       /* The size of the visibile area
*/
 
+    ExaOffscreenArea *shadowArea;
+
     /* Framebuffer memory */
 
     unsigned char *FBBase;
diff --git a/src/lx_display.c b/src/lx_display.c
index 856ad95..4f7c4ed 100644
--- a/src/lx_display.c
+++ b/src/lx_display.c
@@ -363,20 +363,48 @@ lx_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red,
CARD16 * green,
     WRITE_VID32(DF_DISPLAY_CONFIG, dcfg);
 }
 
+    /* Allocates shadow memory, and allocating a new space for
Rotatation.
+     * The size is measured in bytes, and the offset from the beginning
+     * of card space is returned.
+     */
+
+Bool
+LXAllocShadow(ScrnInfoPtr pScrni, int size)
+{
+    GeodeRec *pGeode = GEODEPTR(pScrni);
+
+    if (pGeode->shadowArea) {
+	if (pGeode->shadowArea->size != size) {
+		exaOffscreenFree(pScrni->pScreen, pGeode->shadowArea);
+		pGeode->shadowArea = NULL;
+	}
+    }
+
+    if (pGeode->shadowArea == NULL) {
+	pGeode->shadowArea =
+		exaOffscreenAlloc(pScrni->pScreen, size, 4, TRUE,
+		NULL, NULL);
+
+	if (pGeode->shadowArea == NULL)
+		return FALSE;
+    }
+
+    pScrni->fbOffset = pGeode->shadowArea->offset;
+}
+
 static void *
 lx_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
 {
     ScrnInfoPtr pScrni = crtc->scrn;
     GeodePtr pGeode = GEODEPTR(pScrni);
-    LXCrtcPrivatePtr lx_crtc = crtc->driver_private;
     unsigned int rpitch, size;
 
     rpitch = pScrni->displayWidth * (pScrni->bitsPerPixel / 8);
     size = rpitch * height;
 
-    lx_crtc->rotate_mem = GeodeAllocOffscreen(pGeode, size, 4);
+    LXAllocShadow(pScrni, size); /* Allocate shadow memory */
 
-    if (lx_crtc->rotate_mem == NULL) {
+    if (pGeode->shadowArea->offset == NULL) {
 	xf86DrvMsg(pScrni->scrnIndex, X_ERROR,
 	    "Couldn't allocate the shadow memory for rotation\n");
 	xf86DrvMsg(pScrni->scrnIndex, X_ERROR,
@@ -386,8 +414,8 @@ lx_crtc_shadow_allocate(xf86CrtcPtr crtc, int width,
int height)
 	return NULL;
     }
 
-    memset(pGeode->FBBase + lx_crtc->rotate_mem->offset, 0, size);
-    return pGeode->FBBase + lx_crtc->rotate_mem->offset;
+    memset(pGeode->FBBase + pGeode->shadowArea->offset, 0, size);
+    return pGeode->FBBase + pGeode->shadowArea->offset;
 }
 
 static PixmapPtr
@@ -417,15 +445,17 @@ lx_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr
rpixmap, void *data)
 {
     ScrnInfoPtr pScrni = crtc->scrn;
     GeodeRec *pGeode = GEODEPTR(pScrni);
-    LXCrtcPrivatePtr lx_crtc = crtc->driver_private;
 
     if (rpixmap)
 	FreeScratchPixmapHeader(rpixmap);
 
+    /* Free shadow memory */
     if (data) {
 	gp_wait_until_idle();
-	GeodeFreeOffscreen(pGeode, lx_crtc->rotate_mem);
-	lx_crtc->rotate_mem = NULL;
+	if (pGeode->shadowArea != NULL) {
+	exaOffscreenFree(pScrni->pScreen, pGeode->shadowArea);
+	pGeode->shadowArea = NULL;
+	}
     }
 }
 
diff --git a/src/lx_memory.c b/src/lx_memory.c
index 3f853d4..2106526 100644
--- a/src/lx_memory.c
+++ b/src/lx_memory.c
@@ -249,10 +249,6 @@ LXInitOffscreen(ScrnInfoPtr pScrni)
 
 	/* Deduct the maxmimum size of a video overlay */
 	size -= 0x200000;	
-	
-	/* Deduct the probable size of a shadow buffer */
-	size -= pScrni->virtualX *
-	(pScrni->virtualY * (pScrni->bitsPerPixel >> 3));
 
 	/* Align the size to a K boundary */	
 	size &= ~1023;
@@ -287,6 +283,10 @@ LXInitOffscreen(ScrnInfoPtr pScrni)
 	xf86DrvMsg(pScrni->scrnIndex, X_INFO, " Cursor: 0x%x bytes\n",
 	    LX_CURSOR_HW_WIDTH * 4 * LX_CURSOR_HW_HEIGHT);
 
+    if (pGeode->exaBfrSz)
+	xf86DrvMsg(pScrni->scrnIndex, X_INFO, " ExaBfrSz: 0x%x bytes\n",
+	    pGeode->exaBfrSz);
+
     if (pGeode->pExa->offScreenBase)
 	xf86DrvMsg(pScrni->scrnIndex, X_INFO, " EXA: 0x%x bytes\n",
 	    (unsigned int)(pGeode->pExa->memorySize -
-- 
1.7.1




More information about the Xorg-driver-geode mailing list