---
 src/nouveau_exa.c |   97 +++++++++++++++++++++++++++++-----------------------
 src/nv_driver.c   |    1 +
 src/nv_proto.h    |    1 +
 src/nv_type.h     |   11 ------
 4 files changed, 56 insertions(+), 54 deletions(-)

diff --git a/src/nouveau_exa.c b/src/nouveau_exa.c
index c44e882..2d748e1 100644
--- a/src/nouveau_exa.c
+++ b/src/nouveau_exa.c
@@ -711,7 +711,16 @@ nouveau_exa_wfb_write_memory_linear(void *dst, FbBits 
value, int size)
 #define LINEAR_PITCH (pPixmap->devKind)
 #define NUM_TILES_WIDTH (LINEAR_PITCH/TILE_PITCH)
 
-static NVPtr last_wfb_pNv = NULL;
+/* Wfb related data. */
+static struct {
+       PixmapPtr ppix;
+       bool used;
+       bool tiled;
+       unsigned long start;
+       unsigned long end;
+       uint64_t multiply_factor;
+       uint8_t cpp;
+} wfb_pixmaps[6];
 
 /* Note, we can only expose one read and write function, the linear versions 
are for internal consumption. */
 static FbBits
@@ -725,28 +734,25 @@ nouveau_exa_wfb_read_memory(const void *src, int size)
        FbBits bits = 0;
        void *new_src;
 
-       if (!last_wfb_pNv)
-               return nouveau_exa_wfb_read_memory_linear(src, size);
-
        /* Find the right pixmap. */
        for (i = 0; i < 6; i++)
-               if (offset >= last_wfb_pNv->wfb_pixmaps[i].start && offset < 
last_wfb_pNv->wfb_pixmaps[i].end) {
-                       pPixmap = last_wfb_pNv->wfb_pixmaps[i].ppix;
+               if (offset >= wfb_pixmaps[i].start && offset < 
wfb_pixmaps[i].end) {
+                       pPixmap = wfb_pixmaps[i].ppix;
                        break;
                }
 
-       if (!pPixmap || !last_wfb_pNv->wfb_pixmaps[i].tiled)
+       if (!pPixmap || !wfb_pixmaps[i].tiled)
                return nouveau_exa_wfb_read_memory_linear(src, size);
 
        /* Now comes the decoding. */
        offset -= (unsigned long) pPixmap->devPrivate.ptr;
        /* Assuming dword alligned offsets. */
-       subpixel_offset = offset & (last_wfb_pNv->wfb_pixmaps[i].cpp - 1);
-       offset &= ~(last_wfb_pNv->wfb_pixmaps[i].cpp - 1);
+       subpixel_offset = offset & (wfb_pixmaps[i].cpp - 1);
+       offset &= ~(wfb_pixmaps[i].cpp - 1);
 
        /* Determine the coordinate first. */
        /* Division is too expensive for large numbers, so we precalculate a 
multiplication factor. */
-       line_y = (offset * last_wfb_pNv->wfb_pixmaps[i].multiply_factor) >> 32;
+       line_y = (offset * wfb_pixmaps[i].multiply_factor) >> 32;
        line_x = offset - line_y * LINEAR_PITCH;
        tile_x = line_x/TILE_PITCH;
        tile_y = line_y/TILE_HEIGHT;
@@ -775,19 +781,14 @@ nouveau_exa_wfb_write_memory(void *dst, FbBits value, int 
size)
        PixmapPtr pPixmap = NULL;
        void *new_dst;
 
-       if (!last_wfb_pNv) {
-               nouveau_exa_wfb_write_memory_linear(dst, value, size);
-               return;
-       }
-
        /* Find the right pixmap. */
        for (i = 0; i < 6; i++)
-               if (offset >= last_wfb_pNv->wfb_pixmaps[i].start && offset < 
last_wfb_pNv->wfb_pixmaps[i].end) {
-                       pPixmap = last_wfb_pNv->wfb_pixmaps[i].ppix;
+               if (offset >= wfb_pixmaps[i].start && offset < 
wfb_pixmaps[i].end) {
+                       pPixmap = wfb_pixmaps[i].ppix;
                        break;
                }
 
-       if (!pPixmap || !last_wfb_pNv->wfb_pixmaps[i].tiled) {
+       if (!pPixmap || !wfb_pixmaps[i].tiled) {
                nouveau_exa_wfb_write_memory_linear(dst, value, size);
                return;
        }
@@ -795,12 +796,12 @@ nouveau_exa_wfb_write_memory(void *dst, FbBits value, int 
size)
        /* Now comes the decoding. */
        offset -= (unsigned long) pPixmap->devPrivate.ptr;
        /* Assuming dword alligned offsets. */
-       subpixel_offset = offset & (last_wfb_pNv->wfb_pixmaps[i].cpp - 1);
-       offset &= ~(last_wfb_pNv->wfb_pixmaps[i].cpp - 1);
+       subpixel_offset = offset & (wfb_pixmaps[i].cpp - 1);
+       offset &= ~(wfb_pixmaps[i].cpp - 1);
 
        /* Determine the coordinate first. */
        /* Division is too expensive for large numbers, so we precalculate a 
multiplication factor. */
-       line_y = (offset * last_wfb_pNv->wfb_pixmaps[i].multiply_factor) >> 32;
+       line_y = (offset * wfb_pixmaps[i].multiply_factor) >> 32;
        line_x = offset - line_y * LINEAR_PITCH;
        tile_x = line_x/TILE_PITCH;
        tile_y = line_y/TILE_HEIGHT;
@@ -822,8 +823,6 @@ nouveau_exa_wfb_setup_wrap(ReadMemoryProcPtr *pRead,
                                WriteMemoryProcPtr *pWrite,
                                DrawablePtr pDraw)
 {
-       ScrnInfoPtr pScrn = xf86Screens[pDraw->pScreen->myNum];
-       NVPtr pNv = NVPTR(pScrn);
        PixmapPtr pPixmap;
 
        if (!pRead || !pWrite)
@@ -835,7 +834,7 @@ nouveau_exa_wfb_setup_wrap(ReadMemoryProcPtr *pRead,
 
        int i;
        for (i = 0; i < 6; i++)
-               if (!pNv->wfb_pixmaps[i].used)
+               if (!wfb_pixmaps[i].used)
                        break;
 
        if (i == 6) {
@@ -847,26 +846,22 @@ nouveau_exa_wfb_setup_wrap(ReadMemoryProcPtr *pRead,
 
        /* We will get a pointer, somewhere in the range of this pixmap. */
        /* Based on linear representation ofcource. */
-       pNv->wfb_pixmaps[i].ppix = pPixmap;
-       pNv->wfb_pixmaps[i].start = (unsigned long) pPixmap->devPrivate.ptr;
-       pNv->wfb_pixmaps[i].end = pNv->wfb_pixmaps[i].start + 
exaGetPixmapPitch(pPixmap) * ((pPixmap->drawable.height + 3) & ~3);
-       pNv->wfb_pixmaps[i].used = true;
-       pNv->wfb_pixmaps[i].tiled = nouveau_exa_pixmap_is_tiled(pPixmap);
+       wfb_pixmaps[i].ppix = pPixmap;
+       wfb_pixmaps[i].start = (unsigned long) pPixmap->devPrivate.ptr;
+       wfb_pixmaps[i].end = wfb_pixmaps[i].start + exaGetPixmapPitch(pPixmap) 
* ((pPixmap->drawable.height + 3) & ~3);
+       wfb_pixmaps[i].used = true;
+       wfb_pixmaps[i].tiled = nouveau_exa_pixmap_is_tiled(pPixmap);
        /* Division is too expensive for large numbers, so we precalculate a 
multiplication factor. */
-       pNv->wfb_pixmaps[i].multiply_factor = 
(0xFFFFFFFF/exaGetPixmapPitch(pPixmap)) + 1;
-       pNv->wfb_pixmaps[i].cpp = (pPixmap->drawable.bitsPerPixel >> 3);
+       wfb_pixmaps[i].multiply_factor = 
(0xFFFFFFFF/exaGetPixmapPitch(pPixmap)) + 1;
+       wfb_pixmaps[i].cpp = (pPixmap->drawable.bitsPerPixel >> 3);
 
        *pRead = nouveau_exa_wfb_read_memory;
        *pWrite = nouveau_exa_wfb_write_memory;
-
-       last_wfb_pNv = pNv;
 }
 
 void
 nouveau_exa_wfb_finish_wrap(DrawablePtr pDraw)
 {
-       ScrnInfoPtr pScrn = xf86Screens[pDraw->pScreen->myNum];
-       NVPtr pNv = NVPTR(pScrn);
        PixmapPtr pPixmap;
        int i;
 
@@ -875,14 +870,30 @@ nouveau_exa_wfb_finish_wrap(DrawablePtr pDraw)
                return;
 
        for (i = 0; i < 6; i++)
-               if (pNv->wfb_pixmaps[i].ppix == pPixmap) {
-                       pNv->wfb_pixmaps[i].ppix = NULL;
-                       pNv->wfb_pixmaps[i].start = 0;
-                       pNv->wfb_pixmaps[i].end = 0;
-                       pNv->wfb_pixmaps[i].used = false;
-                       pNv->wfb_pixmaps[i].tiled = false;
-                       pNv->wfb_pixmaps[i].multiply_factor = 0;
-                       pNv->wfb_pixmaps[i].cpp = 0;
+               if (wfb_pixmaps[i].ppix == pPixmap) {
+                       wfb_pixmaps[i].ppix = NULL;
+                       wfb_pixmaps[i].start = 0;
+                       wfb_pixmaps[i].end = 0;
+                       wfb_pixmaps[i].used = false;
+                       wfb_pixmaps[i].tiled = false;
+                       wfb_pixmaps[i].multiply_factor = 0;
+                       wfb_pixmaps[i].cpp = 0;
                        break;
                }
 }
+
+void
+nouveau_exa_wfb_init()
+{
+       int i;
+
+       for (i = 0; i < 6; i++) {
+               wfb_pixmaps[i].ppix = NULL;
+               wfb_pixmaps[i].start = 0;
+               wfb_pixmaps[i].end = 0;
+               wfb_pixmaps[i].used = false;
+               wfb_pixmaps[i].tiled = false;
+               wfb_pixmaps[i].multiply_factor = 0;
+               wfb_pixmaps[i].cpp = 0;
+       }
+}
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 4c6b691..d7cdbab 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -1519,6 +1519,7 @@ NVPreInit(ScrnInfoPtr pScrn, int flags)
 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,6,99,0,0)
        if (!pNv->NoAccel && pNv->exa_driver_pixmaps && pNv->Architecture == 
NV_ARCH_50) {
                pNv->wfb_enabled = true;
+               nouveau_exa_wfb_init();
                if (xf86LoadSubModule(pScrn, "wfb") == NULL)
                        NVPreInitFail("\n");
 
diff --git a/src/nv_proto.h b/src/nv_proto.h
index 5933ddd..472634c 100644
--- a/src/nv_proto.h
+++ b/src/nv_proto.h
@@ -69,6 +69,7 @@ void nouveau_exa_wfb_setup_wrap(ReadMemoryProcPtr *pRead,
                                WriteMemoryProcPtr *pWrite,
                                DrawablePtr pDraw);
 void nouveau_exa_wfb_finish_wrap(DrawablePtr pDraw);
+void nouveau_exa_wfb_init();
 
 /* in nv_hw.c */
 void NVCalcStateExt(ScrnInfoPtr,struct _riva_hw_state 
*,int,int,int,int,int,int);
diff --git a/src/nv_type.h b/src/nv_type.h
index 78ec614..0cf042a 100644
--- a/src/nv_type.h
+++ b/src/nv_type.h
@@ -405,17 +405,6 @@ typedef struct _NVRec {
        unsigned point_x, point_y;
        unsigned width_in, width_out;
        unsigned height_in, height_out;
-
-       /* Wfb related data. */
-       struct {
-               PixmapPtr ppix;
-               bool used;
-               bool tiled;
-               unsigned long start;
-               unsigned long end;
-               uint64_t multiply_factor;
-               uint8_t cpp;
-       } wfb_pixmaps[6];
 } NVRec;
 
 #define NVPTR(p) ((NVPtr)((p)->driverPrivate))
-- 
1.6.2

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to