[PATCH] DPMS: include GPU screens in DPMS code
Aaron Plattner
aplattner at nvidia.com
Mon Mar 4 08:24:12 PST 2013
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. :)
> 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;
>
--
Aaron
More information about the xorg-devel
mailing list