[PATCH] DPMS: include GPU screens in DPMS code
Aaron Plattner
aplattner at nvidia.com
Thu Feb 7 09:16:04 PST 2013
Otherwise, displays driven by GPU screens remain on all the time.
Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
---
hw/xfree86/common/xf86DPMS.c | 45 ++++++++++++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 14 deletions(-)
diff --git a/hw/xfree86/common/xf86DPMS.c b/hw/xfree86/common/xf86DPMS.c
index ef4a2c1..3f1e142 100644
--- a/hw/xfree86/common/xf86DPMS.c
+++ b/hw/xfree86/common/xf86DPMS.c
@@ -130,6 +130,19 @@ DPMSClose(ScreenPtr pScreen)
return pScreen->CloseScreen(pScreen);
}
+static void
+DPMSSetScreen(ScrnInfoPtr pScrn, int level)
+{
+ ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
+ DPMSPtr pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
+
+ if (pDPMS && pScrn->DPMSSet && pDPMS->Enabled && pScrn->vtSema) {
+ xf86VGAarbiterLock(pScrn);
+ pScrn->DPMSSet(pScrn, level, 0);
+ xf86VGAarbiterUnlock(pScrn);
+ }
+}
+
/*
* DPMSSet --
* Device dependent DPMS mode setting hook. This is called whenever
@@ -139,8 +152,6 @@ int
DPMSSet(ClientPtr client, int level)
{
int rc, i;
- DPMSPtr pDPMS;
- ScrnInfoPtr pScrn;
DPMSPowerLevel = level;
@@ -155,17 +166,23 @@ DPMSSet(ClientPtr client, int level)
/* For each screen, set the DPMS level */
for (i = 0; i < xf86NumScreens; i++) {
- pScrn = xf86Screens[i];
- pDPMS = dixLookupPrivate(&screenInfo.screens[i]->devPrivates, DPMSKey);
- if (pDPMS && pScrn->DPMSSet && pDPMS->Enabled && pScrn->vtSema) {
- xf86VGAarbiterLock(pScrn);
- pScrn->DPMSSet(pScrn, level, 0);
- xf86VGAarbiterUnlock(pScrn);
- }
+ DPMSSetScreen(xf86Screens[i], level);
+ }
+ for (i = 0; i < xf86NumGPUScreens; i++) {
+ DPMSSetScreen(xf86GPUScreens[i], level);
}
return Success;
}
+static Bool
+DPMSSupportedOnScreen(ScrnInfoPtr pScrn)
+{
+ ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
+ DPMSPtr pDPMS = dixLookupPrivate(&pScreen->devPrivates, DPMSKey);
+
+ return pDPMS && pScrn->DPMSSet;
+}
+
/*
* DPMSSupported --
* Return TRUE if any screen supports DPMS.
@@ -174,8 +191,6 @@ Bool
DPMSSupported(void)
{
int i;
- DPMSPtr pDPMS;
- ScrnInfoPtr pScrn;
if (DPMSKey == NULL) {
return FALSE;
@@ -183,9 +198,11 @@ DPMSSupported(void)
/* For each screen, check if DPMS is supported */
for (i = 0; i < xf86NumScreens; i++) {
- pScrn = xf86Screens[i];
- pDPMS = dixLookupPrivate(&screenInfo.screens[i]->devPrivates, DPMSKey);
- if (pDPMS && pScrn->DPMSSet)
+ if (DPMSSupportedOnScreen(xf86Screens[i]))
+ return TRUE;
+ }
+ for (i = 0; i < xf86NumGPUScreens; i++) {
+ if (DPMSSupportedOnScreen(xf86GPUScreens[i]))
return TRUE;
}
return FALSE;
--
1.7.12
More information about the xorg-devel
mailing list