fix shadowfb in xf86-video-nv

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

fix shadowfb in xf86-video-nv

Matthieu Herrb
Hi,

the patch below fixes shadowfb in the xf86-video-nv driver. It should
be useable without an xorg.conf to disable shadowfb now.
Those who are stuck to using nVidia cards with -current, please test.

Apply in /usr/xenocara/driver/xf86-video-nv then rebuid using
make -f Makefile.bsd-wrapper obj
make -f Makefile.bsd-wrapper build

and restart X.

Index: src/nv_driver.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-nv/src/nv_driver.c,v
retrieving revision 1.15
diff -u -r1.15 nv_driver.c
--- src/nv_driver.c 12 May 2013 13:06:25 -0000 1.15
+++ src/nv_driver.c 17 Nov 2013 18:28:05 -0000
@@ -2070,7 +2070,7 @@
 
     /* Load shadowfb if needed */
     if (pNv->ShadowFB) {
- if (!xf86LoadSubModule(pScrn, "shadowfb")) {
+ if (!xf86LoadSubModule(pScrn, "shadow")) {
     xf86FreeInt10(pNv->pInt);
     NVFreeRec(pScrn);
     return FALSE;
@@ -2378,6 +2378,44 @@
   hwp->writeCrtc(hwp, 0x1A, crtc1A);
 }
 
+static Bool
+NVCreateScreenResources(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+ NVPtr pNv = NVPTR(pScrn);
+ PixmapPtr pPixmap;
+ Bool ret;
+
+ pScreen->CreateScreenResources = pNv->CreateScreenResources;
+ ret = pScreen->CreateScreenResources(pScreen);
+ pScreen->CreateScreenResources = NVCreateScreenResources;
+
+ if (!ret)
+ return FALSE;
+
+ pPixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (!shadowAdd(pScreen, pPixmap, NVShadowUpdate,
+ NULL, 0, NULL)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static Bool
+NVShadowInit(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+ NVPtr pNv = NVPTR(pScrn);
+
+ if (!shadowSetup(pScreen))
+ return FALSE;
+ pNv->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = NVCreateScreenResources;
+
+ return TRUE;
+}
+
 
 /* Mandatory */
 
@@ -2599,8 +2637,8 @@
                           "Driver rotation enabled, RandR disabled\n");
            }
  }
-
- ShadowFBInit(pScreen, refreshArea);
+        pNv->refreshArea = refreshArea;
+ NVShadowInit(pScreen);
     }
 
     if(pNv->FlatPanel)
Index: src/nv_local.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-nv/src/nv_local.h,v
retrieving revision 1.2
diff -u -r1.2 nv_local.h
--- src/nv_local.h 29 Jul 2008 20:04:57 -0000 1.2
+++ src/nv_local.h 17 Nov 2013 18:28:05 -0000
@@ -32,6 +32,7 @@
 #include "compiler.h"
 #include "xf86_OSproc.h"
 
+#include "shadow.h"
 /*
  * Typedefs to force certain sized values.
  */
Index: src/nv_proto.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-nv/src/nv_proto.h,v
retrieving revision 1.2
diff -u -r1.2 nv_proto.h
--- src/nv_proto.h 16 Aug 2012 16:35:27 -0000 1.2
+++ src/nv_proto.h 17 Nov 2013 18:28:05 -0000
@@ -49,6 +49,7 @@
 void NVLockUnlock(NVPtr,int);
 
 /* in nv_shadow.c */
+void NVShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
 void NVRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
 void NVRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
 void NVRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
Index: src/nv_shadow.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-nv/src/nv_shadow.c,v
retrieving revision 1.2
diff -u -r1.2 nv_shadow.c
--- src/nv_shadow.c 16 Aug 2012 16:35:27 -0000 1.2
+++ src/nv_shadow.c 17 Nov 2013 18:28:05 -0000
@@ -13,6 +13,17 @@
 #include "shadowfb.h"
 #include "servermd.h"
 
+void
+NVShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+    RegionPtr damage = DamageRegion(pBuf->pDamage);
+    ScrnInfoPtr pScrn;
+    pScrn = xf86ScreenToScrn(pScreen);
+
+    (NVPTR(pScrn))->refreshArea (pScrn, REGION_NUM_RECTS(damage),
+ REGION_RECTS(damage));
+}
+
 
 void
 NVRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
Index: src/nv_type.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-nv/src/nv_type.h,v
retrieving revision 1.3
diff -u -r1.3 nv_type.h
--- src/nv_type.h 16 Aug 2012 16:35:27 -0000 1.3
+++ src/nv_type.h 17 Nov 2013 18:28:05 -0000
@@ -133,6 +133,8 @@
     int                 numDGAModes;
     Bool                DGAactive;
     int                 DGAViewportStatus;
+    CreateScreenResourcesProcPtr CreateScreenResources;
+    RefreshAreaFuncPtr refreshArea;
     void (*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y);
     ScreenBlockHandlerProcPtr BlockHandler;
     CloseScreenProcPtr  CloseScreen;

--
Matthieu Herrb