summaryrefslogtreecommitdiff
path: root/driver/xf86-video-nv
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2013-11-18 19:45:42 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2013-11-18 19:45:42 +0000
commitba22d9638eea69c4f7f26310af27dbe0adda7662 (patch)
tree2e186523c71ed5640b1f3f415689a27eb66c1db8 /driver/xf86-video-nv
parentb34dd85ffe325ca5e44e1fffb15f6cd52f8b414e (diff)
Fix shadow framebuffer implementation.
Tested by Martijn van Duren and mpi@.
Diffstat (limited to 'driver/xf86-video-nv')
-rw-r--r--driver/xf86-video-nv/src/nv_driver.c44
-rw-r--r--driver/xf86-video-nv/src/nv_local.h1
-rw-r--r--driver/xf86-video-nv/src/nv_proto.h1
-rw-r--r--driver/xf86-video-nv/src/nv_shadow.c11
-rw-r--r--driver/xf86-video-nv/src/nv_type.h2
5 files changed, 56 insertions, 3 deletions
diff --git a/driver/xf86-video-nv/src/nv_driver.c b/driver/xf86-video-nv/src/nv_driver.c
index a8cf55510..2a4160efc 100644
--- a/driver/xf86-video-nv/src/nv_driver.c
+++ b/driver/xf86-video-nv/src/nv_driver.c
@@ -2070,7 +2070,7 @@ NVPreInit(ScrnInfoPtr pScrn, int flags)
/* 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 @@ NVDPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags)
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 @@ NVScreenInit(SCREEN_INIT_ARGS_DECL)
"Driver rotation enabled, RandR disabled\n");
}
}
-
- ShadowFBInit(pScreen, refreshArea);
+ pNv->refreshArea = refreshArea;
+ NVShadowInit(pScreen);
}
if(pNv->FlatPanel)
diff --git a/driver/xf86-video-nv/src/nv_local.h b/driver/xf86-video-nv/src/nv_local.h
index a0b5e41c1..8ff8aa157 100644
--- a/driver/xf86-video-nv/src/nv_local.h
+++ b/driver/xf86-video-nv/src/nv_local.h
@@ -32,6 +32,7 @@
#include "compiler.h"
#include "xf86_OSproc.h"
+#include "shadow.h"
/*
* Typedefs to force certain sized values.
*/
diff --git a/driver/xf86-video-nv/src/nv_proto.h b/driver/xf86-video-nv/src/nv_proto.h
index 0e9fdccf7..ff764cfa7 100644
--- a/driver/xf86-video-nv/src/nv_proto.h
+++ b/driver/xf86-video-nv/src/nv_proto.h
@@ -49,6 +49,7 @@ int NVShowHideCursor(NVPtr,int);
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);
diff --git a/driver/xf86-video-nv/src/nv_shadow.c b/driver/xf86-video-nv/src/nv_shadow.c
index 394644885..58db3319b 100644
--- a/driver/xf86-video-nv/src/nv_shadow.c
+++ b/driver/xf86-video-nv/src/nv_shadow.c
@@ -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)
diff --git a/driver/xf86-video-nv/src/nv_type.h b/driver/xf86-video-nv/src/nv_type.h
index 65a6a5548..e705d4c60 100644
--- a/driver/xf86-video-nv/src/nv_type.h
+++ b/driver/xf86-video-nv/src/nv_type.h
@@ -133,6 +133,8 @@ typedef struct {
int numDGAModes;
Bool DGAactive;
int DGAViewportStatus;
+ CreateScreenResourcesProcPtr CreateScreenResources;
+ RefreshAreaFuncPtr refreshArea;
void (*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y);
ScreenBlockHandlerProcPtr BlockHandler;
CloseScreenProcPtr CloseScreen;