On Mon, Mar 4, 2013 at 11:24 AM, Aaron Plattner <aplatt...@nvidia.com> wrote: > On 02/07/2013 09:16 AM, Aaron Plattner wrote: >> >> Otherwise, displays driven by GPU screens remain on all the time. > > > Ping? CRTs do make good space heaters, but that probably shouldn't be a > design goal of the X server. :)
Looks like the right thing to do. Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> > >> Signed-off-by: Aaron Plattner <aplatt...@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; >> > > -- > Aaron > _______________________________________________ > xorg-devel@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel