Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h	(revision 63823)
@@ -66,4 +66,5 @@
 
     BOOLEAN fAnyX;                      /* Unrestricted horizontal resolution flag. */
+    uint16_t u16SupportedScreenFlags;   /* VBVA_SCREEN_F_* flags supported by the host. */
 } VBOXMP_COMMON, *PVBOXMP_COMMON;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPHGSMI.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPHGSMI.cpp	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPHGSMI.cpp	(revision 63823)
@@ -127,4 +127,6 @@
                                         /* Query the configured number of displays. */
                                         pCommon->cDisplays = VBoxHGSMIGetMonitorCount(&pCommon->guestCtx);
+                                        /* Query supported VBVA_SCREEN_F_* flags. */
+                                        pCommon->u16SupportedScreenFlags = VBoxHGSMIGetScreenFlags(&pCommon->guestCtx);
                                         LOGF_LEAVE();
                                         return;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 63823)
@@ -129,4 +129,5 @@
     BOOLEAN fTargetsReported;
     BOOLEAN bVisible;
+    BOOLEAN bBlankedByPowerOff;
 #ifdef VBOX_WITH_CROGL
     /* specifies whether the source has 3D overlay data visible */
@@ -160,4 +161,5 @@
     bool fConnected;
     bool fConfigured;
+    bool fBlankedByPowerOff;
 } VBOXWDDM_TARGET, *PVBOXWDDM_TARGET;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 63823)
@@ -2327,5 +2327,5 @@
 NTSTATUS VBoxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
         PVBOXWDDM_ALLOCATION pAllocation,
-        D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets)
+        D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets, BOOLEAN bPathPowerTransition)
 {
     D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
@@ -2333,4 +2333,6 @@
 
     PVBOXWDDM_SOURCE pSource = &paSources[VidPnSourceId];
+    pSource->bBlankedByPowerOff = bPathPowerTransition ? pAllocation == NULL : 0;
+
     VBOXWDDM_TARGET_ITER Iter;
     VBoxVidPnStTIterInit(pSource, paTargets, (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays, &Iter);
@@ -2342,4 +2344,5 @@
         pTarget->Size.cx = 0;
         pTarget->Size.cy = 0;
+        pTarget->fBlankedByPowerOff = RT_BOOL(pSource->bBlankedByPowerOff);
         pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_ALL;
     }
@@ -2456,5 +2459,5 @@
     {
         Status = VBoxVidPnCommitSourceModeForSrcId(pDevExt, hDesiredVidPn, pVidPnInterface, pAllocation,
-                    pPath->VidPnSourceId, paSources, paTargets);
+                    pPath->VidPnSourceId, paSources, paTargets, FALSE);
         if (Status != STATUS_SUCCESS)
         {
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h	(revision 63823)
@@ -74,5 +74,5 @@
 NTSTATUS VBoxVidPnCommitSourceModeForSrcId(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
         PVBOXWDDM_ALLOCATION pAllocation,
-        D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets);
+        D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId, VBOXWDDM_SOURCE *paSources, VBOXWDDM_TARGET *paTargets, BOOLEAN bPathPowerTransition);
 
 NTSTATUS VBoxVidPnCommitAll(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_HVIDPN hDesiredVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 63823)
@@ -280,5 +280,5 @@
     int rc;
 
-    if (!(fFlags & VBVA_SCREEN_F_DISABLED))
+    if (!(fFlags & (VBVA_SCREEN_F_DISABLED | VBVA_SCREEN_F_BLANK2)))
     {
         rc = vboxWddmGhDisplayPostInfoView(pDevExt, pAllocData);
@@ -345,10 +345,35 @@
 }
 
-NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState)
+static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff)
+{
+    uint16_t u16Flags;
+
+    if (fValidAlloc)
+    {
+        u16Flags = VBVA_SCREEN_F_ACTIVE;
+    }
+    else
+    {
+        if (   fPowerOff
+            && RT_BOOL(VBoxCommonFromDeviceExt(pDevExt)->u16SupportedScreenFlags & VBVA_SCREEN_F_BLANK2))
+        {
+            u16Flags = VBVA_SCREEN_F_ACTIVE | VBVA_SCREEN_F_BLANK2;
+        }
+        else
+        {
+            u16Flags = VBVA_SCREEN_F_DISABLED;
+        }
+    }
+
+    return u16Flags;
+}
+
+NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
 {
     NTSTATUS Status = STATUS_SUCCESS;
-    bool fEnabled = !!pAllocData->SurfDesc.width;
-    uint16_t fu16Flags = fEnabled ? VBVA_SCREEN_F_ACTIVE : VBVA_SCREEN_F_DISABLED;
-    if (fEnabled)
+    bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
+    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
+
+    if (fValidAlloc)
     {
 #ifdef VBOX_WITH_CROGL
@@ -374,5 +399,5 @@
         {
 #ifdef VBOX_WITH_CROGL
-            if (fEnabled && pDevExt->f3DEnabled)
+            if (fValidAlloc && pDevExt->f3DEnabled)
             {
                 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData);
@@ -395,10 +420,11 @@
 }
 
-NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState)
+NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
 {
     NTSTATUS Status = STATUS_SUCCESS;
-    bool fEnabled = !!pAllocData->SurfDesc.width;
-    uint16_t fu16Flags = fEnabled ? VBVA_SCREEN_F_ACTIVE : VBVA_SCREEN_F_DISABLED;
-    if (fEnabled)
+    bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
+    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
+
+    if (fValidAlloc)
     {
 #ifdef VBOX_WITH_CROGL
@@ -423,5 +449,5 @@
         {
 #ifdef VBOX_WITH_CROGL
-            if (fEnabled && pDevExt->f3DEnabled)
+            if (fValidAlloc && pDevExt->f3DEnabled)
             {
                 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pAllocData);
@@ -467,5 +493,5 @@
     }
 
-    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState);
+    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState, RT_BOOL(pSource->bBlankedByPowerOff));
     if (NT_SUCCESS(Status))
     {
@@ -513,5 +539,5 @@
     {
         AllocData.SurfDesc.VidPnSourceId = pTarget->u32Id;
-        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState);
+        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState, pTarget->fBlankedByPowerOff);
         if (NT_SUCCESS(Status))
             pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
@@ -548,4 +574,5 @@
 
     bool fFound = false;
+    bool fPowerOff = false;
     for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
     {
@@ -559,5 +586,9 @@
 
         if (pTarget->u8SyncState != VBOXWDDM_HGSYNC_F_SYNCED_ALL)
+        {
             fFound = true;
+            /* Assume that either all targets are powered off or all are disabled (usually true). */
+            fPowerOff = pTarget->fBlankedByPowerOff;
+        }
 
         ASMBitSet(aTargetMap, i);
@@ -570,5 +601,5 @@
     VBOXWDDM_ALLOC_DATA AllocData;
     VBoxVidPnAllocDataInit(&AllocData, D3DDDI_ID_UNINITIALIZED);
-    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0);
+    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0, fPowerOff);
     if (!NT_SUCCESS(Status))
     {
@@ -614,5 +645,5 @@
         fFound = true;
         AllocData.SurfDesc.VidPnSourceId = i;
-        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0);
+        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0, pTarget->fBlankedByPowerOff);
         if (NT_SUCCESS(Status))
             pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
@@ -5359,5 +5390,5 @@
                     pCommitVidPnArg->hFunctionalVidPn, pVidPnInterface,
                     (PVBOXWDDM_ALLOCATION)pCommitVidPnArg->hPrimaryAllocation,
-                    pCommitVidPnArg->AffectedVidPnSourceId, paSources, paTargets);
+                    pCommitVidPnArg->AffectedVidPnSourceId, paSources, paTargets, pCommitVidPnArg->Flags.PathPowerTransition);
             if (!NT_SUCCESS(Status))
             {
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h	(revision 63822)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h	(revision 63823)
@@ -171,5 +171,5 @@
 {
     VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr);
-    if (offVram == VBOXVIDEOOFFSET_VOID && !(fFlags & VBVA_SCREEN_F_DISABLED))
+    if (offVram == VBOXVIDEOOFFSET_VOID && !(fFlags & (VBVA_SCREEN_F_DISABLED | VBVA_SCREEN_F_BLANK2)))
     {
         WARN(("offVram == VBOXVIDEOOFFSET_VOID"));
