From: Hunk Cui <[email protected]> 

*Del for deduct the probable size of a video overlay.
*Use exaOffscreenAlloc allocate the video overlay.
*Use exaOffscreenAlloc allocate the offscreen surface.
*XV-video data has to be allocate in offscreen memory range.

Signed-off-by: Hunk Cui <[email protected]>
---
 src/lx_memory.c |    3 ---
 src/lx_video.c  |   42 +++++++++++++++++++++++++-----------------
 2 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/src/lx_memory.c b/src/lx_memory.c
index 3de7886..d833caa 100644
--- a/src/lx_memory.c
+++ b/src/lx_memory.c
@@ -247,9 +247,6 @@ LXInitOffscreen(ScrnInfoPtr pScrni)
        /* Get the amount of offscreen memory still left */
        size = GeodeOffscreenFreeSize(pGeode);
 
-       /* Deduct the maxmimum size of a video overlay */
-       size -= 0x200000;       
-
        /* Align the size to a K boundary */    
        size &= ~1023;
 
diff --git a/src/lx_video.c b/src/lx_video.c
index 76c38ca..7b51c5b 100644
--- a/src/lx_video.c
+++ b/src/lx_video.c
@@ -99,7 +99,7 @@ static XF86ImageRec Images[] = {
 
 typedef struct
 {
-    GeodeMemPtr vidmem;
+    ExaOffscreenArea *vidmem;
     RegionRec clip;
     CARD32 filter;
     CARD32 colorKey;
@@ -188,13 +188,16 @@ struct
 /* Copy planar YUV data */
 
 static Bool
-LXAllocMem(GeodeRec *pGeode, GeodePortPrivRec *pPriv, int size)
+LXAllocateVidMem(ScrnInfoPtr pScrni, GeodePortPrivRec *pPriv, int size)
 {
     if (!pPriv->vidmem || pPriv->vidmem->size < size) { 
-       if (pPriv->vidmem) 
-               GeodeFreeOffscreen(pGeode, pPriv->vidmem);
+       if (pPriv->vidmem) {
+               exaOffscreenFree(pScrni->pScreen, pPriv->vidmem);
+               pPriv->vidmem = NULL;
+       }
 
-       pPriv->vidmem = GeodeAllocOffscreen(pGeode, size, 4);
+       pPriv->vidmem = exaOffscreenAlloc(pScrni->pScreen, size, 4,
+                       TRUE, NULL, NULL);
 
        if (pPriv->vidmem == NULL) {
                ErrorF("Could not allocate memory for the video\n");
@@ -236,8 +239,10 @@ LXCopyPlanar(ScrnInfoPtr pScrni, int id, unsigned
char *buf,
     size = YDstPitch * height;
     size += UVDstPitch * height;
 
-    if (LXAllocMem(pGeode, pPriv, size) == FALSE)
+    if (LXAllocateVidMem(pScrni, pPriv, size) == FALSE) {
+       ErrorF("Error allocating an offscreen Planar region.\n");
        return FALSE;
+    }
 
     /* The top of the source region we want to copy */
     top = y1 & ~1;
@@ -297,8 +302,10 @@ LXCopyPacked(ScrnInfoPtr pScrni, int id, unsigned
char *buf,
 
     lines = ((dstPitch * height) + pGeode->Pitch - 1) / pGeode->Pitch;
 
-    if (LXAllocMem(pGeode, pPriv, lines) == FALSE)
+    if (LXAllocateVidMem(pScrni, pPriv, lines) == FALSE) {
+       ErrorF("Error allocating an offscreen Packed region.\n");
        return FALSE;
+    }
 
     /* The top of the source region we want to copy */
     top = y1;
@@ -578,7 +585,6 @@ static void
 LXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool exit)
 {
     GeodePortPrivRec *pPriv = (GeodePortPrivRec *) data;
-    GeodeRec *pGeode = GEODEPTR(pScrni);
 
     if (pPriv->videoStatus == 0)
        return;
@@ -597,7 +603,7 @@ LXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool
exit)
        }
 
        if (pPriv->vidmem) {
-           GeodeFreeOffscreen(pGeode, pPriv->vidmem);
+           exaOffscreenFree(pScrni->pScreen, pPriv->vidmem);
            pPriv->vidmem = NULL;
        }
 
@@ -659,7 +665,7 @@ LXVidBlockHandler(int i, pointer blockData, pointer
pTimeout,
            if (pPriv->freeTime < now) {
 
                if (pPriv->vidmem) {
-                   GeodeFreeOffscreen(pGeode, pPriv->vidmem);
+                   exaOffscreenFree(pScrni->pScreen, pPriv->vidmem);
                    pPriv->vidmem = NULL;
                }
 
@@ -742,7 +748,7 @@ LXSetupImageVideo(ScreenPtr pScrn)
 
 struct OffscreenPrivRec
 {
-    GeodeMemPtr vidmem;
+    ExaOffscreenArea *vidmem;
     Bool isOn;
 };
 
@@ -800,7 +806,7 @@ LXAllocateSurface(ScrnInfoPtr pScrni, int id,
unsigned short w,
 {
     GeodeRec *pGeode = GEODEPTR(pScrni);
     int pitch, lines;
-    GeodeMemPtr vidmem;
+    ExaOffscreenArea *vidmem;
     struct OffscreenPrivRec *pPriv;
 
     if (w > 1024 || h > 1024)
@@ -812,7 +818,8 @@ LXAllocateSurface(ScrnInfoPtr pScrni, int id,
unsigned short w,
     pitch = ((w << 1) + 15) & ~15;
     lines = ((pitch * h) + (pGeode->Pitch - 1)) / pGeode->Pitch;
 
-    vidmem = GeodeAllocOffscreen(pGeode, lines, 4);
+    vidmem = exaOffscreenAlloc(pScrni->pScreen, lines, 4, TRUE,
+               NULL, NULL);
 
     if (vidmem == NULL) {
        ErrorF("Error while allocating an offscreen region.\n");
@@ -849,8 +856,10 @@ LXAllocateSurface(ScrnInfoPtr pScrni, int id,
unsigned short w,
     if (surface->pitches)
        free(surface->pitches);
 
-    if (vidmem)
-       GeodeFreeOffscreen(pGeode, vidmem);
+    if (vidmem) {
+       exaOffscreenFree(pScrni->pScreen, vidmem);
+       vidmem = NULL;
+    }
 
     return BadAlloc;
 }
@@ -871,13 +880,12 @@ LXFreeSurface(XF86SurfacePtr surface)
     struct OffscreenPrivRec *pPriv = (struct OffscreenPrivRec *)
        surface->devPrivate.ptr;
     ScrnInfoPtr pScrni = surface->pScrn;
-    GeodeRec *pGeode = GEODEPTR(pScrni);
 
     if (pPriv->isOn)
        LXStopSurface(surface);
 
     if (pPriv->vidmem) {
-       GeodeFreeOffscreen(pGeode, pPriv->vidmem);
+       exaOffscreenFree(pScrni->pScreen, pPriv->vidmem);
        pPriv->vidmem = NULL;
     }
 
-- 
1.7.2.3


_______________________________________________
Xorg-driver-geode mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-geode

Reply via email to