- I'm surprised we didn't get serious complaints about not being able to render 
to the frontbuffer.
---
 src/nouveau_exa.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/nouveau_exa.c b/src/nouveau_exa.c
index 20ad380..4b21e80 100644
--- a/src/nouveau_exa.c
+++ b/src/nouveau_exa.c
@@ -265,12 +265,14 @@ nouveau_exa_wait_marker(ScreenPtr pScreen, int marker)
 static Bool
 nouveau_exa_prepare_access(PixmapPtr ppix, int index)
 {
-       ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+       ScreenPtr pScreen = ppix->drawable.pScreen;
+       ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
        NVPtr pNv = NVPTR(pScrn);
 
-       if (pNv->exa_driver_pixmaps) {
+       if (pNv->exa_driver_pixmaps || pScreen->GetScreenPixmap(pScreen) == 
ppix) {
                void *map = nouveau_exa_pixmap_map(ppix);
 
+               /* Really bad if this is the frontbuffer. */
                if (!map)
                        return FALSE;
 
@@ -284,10 +286,11 @@ nouveau_exa_prepare_access(PixmapPtr ppix, int index)
 static void
 nouveau_exa_finish_access(PixmapPtr ppix, int index)
 {
-       ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+       ScreenPtr pScreen = ppix->drawable.pScreen;
+       ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
        NVPtr pNv = NVPTR(pScrn);
 
-       if (pNv->exa_driver_pixmaps)
+       if (pNv->exa_driver_pixmaps || pScreen->GetScreenPixmap(pScreen) == 
ppix)
                nouveau_exa_pixmap_unmap(ppix);
 }
 
@@ -553,8 +556,6 @@ nouveau_exa_init(ScreenPtr pScreen)
                exa->pixmapPitchAlign = 64;
 
                exa->PixmapIsOffscreen = nouveau_exa_pixmap_is_offscreen;
-               exa->PrepareAccess = nouveau_exa_prepare_access;
-               exa->FinishAccess = nouveau_exa_finish_access;
                exa->CreatePixmap = nouveau_exa_create_pixmap;
                exa->DestroyPixmap = nouveau_exa_destroy_pixmap;
                exa->ModifyPixmapHeader = nouveau_exa_modify_pixmap_header;
@@ -604,6 +605,9 @@ nouveau_exa_init(ScreenPtr pScreen)
                exa->maxY = 2048;
        }
 
+       exa->PrepareAccess = nouveau_exa_prepare_access;
+       exa->FinishAccess = nouveau_exa_finish_access;
+
        exa->MarkSync = nouveau_exa_mark_sync;
        exa->WaitMarker = nouveau_exa_wait_marker;
 
-- 
1.6.1.3

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

Reply via email to