VirtualBox

Changeset 64878 in vbox


Ignore:
Timestamp:
Dec 15, 2016 10:51:08 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
112282
Message:

WDDM: pass the display enabled flag to the driver to be able to disable powered off screens. Clearly mark some disabled code.

Location:
trunk/src/VBox/Additions/WINNT
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r63823 r64878  
    162162    bool fConfigured;
    163163    bool fBlankedByPowerOff;
     164
     165    /* Whether the host has disabled the virtual screen. */
     166    /** @todo This should be merged with fConnected. */
     167    bool fDisabled;
    164168} VBOXWDDM_TARGET, *PVBOXWDDM_TARGET;
    165169
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp

    r64085 r64878  
    13391339    }
    13401340
     1341#ifdef VBOX_WDDM_REPLUG_ON_MODE_CHANGE
     1342    /* The VBOXESC_UPDATEMODES is a hint for VBoxVideoW8.sys to use new display mode as soon as VidPn
     1343     * manager will ask for it.
     1344     * Probably, some new interface is required to plug/unplug displays by calling
     1345     * VBoxWddmChildStatusReportReconnected.
     1346     * But it is a bad idea to mix sending a display mode hint and (un)plug displays in VBOXESC_UPDATEMODES.
     1347     */
     1348
    13411349    /* modes have changed, need to replug */
    1342 /*  The VBOXESC_UPDATEMODES is a hint for VBoxVideoW8.sys to use new display mode as soon as VidPn manager will ask for it.
    1343     Probably, some new interface is required to plug/unplug displays by calling VBoxWddmChildStatusReportReconnected.
    1344     But it is a bad idea to mix sending a display mode hint and (un)plug displays in VBOXESC_UPDATEMODES.
    1345 
    13461350    NTSTATUS Status = VBoxWddmChildStatusReportReconnected(pDevExt, u32TargetId);
    13471351    LOG(("VBoxWddmChildStatusReportReconnected returned (%d)", Status));
     
    13511355        return Status;
    13521356    }
    1353 */
     1357#endif
     1358
    13541359    LOGF(("LEAVE u32TargetId(%d)", u32TargetId));
    13551360    return STATUS_SUCCESS;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r64743 r64878  
    345345}
    346346
    347 static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff)
     347static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff, bool fDisabled)
    348348{
    349349    uint16_t u16Flags;
     
    355355    else
    356356    {
    357         if (   fPowerOff
     357        if (   !fDisabled
     358            && fPowerOff
    358359            && RT_BOOL(VBoxCommonFromDeviceExt(pDevExt)->u16SupportedScreenFlags & VBVA_SCREEN_F_BLANK2))
    359360        {
     
    369370}
    370371
    371 NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
     372NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled)
    372373{
    373374    NTSTATUS Status = STATUS_SUCCESS;
    374375    bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
    375     uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
     376    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff, fDisabled);
    376377
    377378    if (fValidAlloc)
     
    420421}
    421422
    422 NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff)
     423NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled)
    423424{
    424425    NTSTATUS Status = STATUS_SUCCESS;
    425426    bool fValidAlloc = pAllocData->SurfDesc.width > 0 && pAllocData->SurfDesc.height > 0;
    426     uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff);
     427    uint16_t fu16Flags = vboxWddmCalcScreenFlags(pDevExt, fValidAlloc, fPowerOff, fDisabled);
    427428
    428429    if (fValidAlloc)
     
    493494    }
    494495
    495     NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState, RT_BOOL(pSource->bBlankedByPowerOff));
     496    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &pSource->AllocData, pTargetMap, &pSource->VScreenPos, pSource->u8SyncState, RT_BOOL(pSource->bBlankedByPowerOff), false);
    496497    if (NT_SUCCESS(Status))
    497498    {
     
    539540    {
    540541        AllocData.SurfDesc.VidPnSourceId = pTarget->u32Id;
    541         NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState, pTarget->fBlankedByPowerOff);
     542        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &pSource->VScreenPos, pSource->u8SyncState | pTarget->u8SyncState, pTarget->fBlankedByPowerOff, pTarget->fDisabled);
    542543        if (NT_SUCCESS(Status))
    543544            pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
     
    584585        }
    585586
    586         if (pTarget->fBlankedByPowerOff)
     587        /* Explicitely disabled targets must not be skipped. */
     588        if (pTarget->fBlankedByPowerOff && !pTarget->fDisabled)
    587589        {
    588590            LOG(("Skip doing DISABLED request for PowerOff tgt %d", pTarget->u32Id));
     
    603605    VBOXWDDM_ALLOC_DATA AllocData;
    604606    VBoxVidPnAllocDataInit(&AllocData, D3DDDI_ID_UNINITIALIZED);
    605     NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0, false);
     607    NTSTATUS Status = vboxWddmGhDisplaySetInfoNew(pDevExt, &AllocData, aTargetMap, &VScreenPos, 0, false, true);
    606608    if (!NT_SUCCESS(Status))
    607609    {
     
    647649        fFound = true;
    648650        AllocData.SurfDesc.VidPnSourceId = i;
    649         NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0, pTarget->fBlankedByPowerOff);
     651        NTSTATUS Status = vboxWddmGhDisplaySetInfoLegacy(pDevExt, &AllocData, &VScreenPos, 0, pTarget->fBlankedByPowerOff, pTarget->fDisabled);
    650652        if (NT_SUCCESS(Status))
    651653            pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL;
     
    49604962                break;
    49614963            }
     4964            case VBOXESC_TARGET_CONNECTIVITY:
     4965            {
     4966                if (!pEscape->Flags.HardwareAccess)
     4967                {
     4968                    WARN(("VBOXESC_TARGET_CONNECTIVITY called without HardwareAccess flag set, failing"));
     4969                    Status = STATUS_INVALID_PARAMETER;
     4970                    break;
     4971                }
     4972
     4973                if (pEscape->PrivateDriverDataSize != sizeof(VBOXDISPIFESCAPE_TARGETCONNECTIVITY))
     4974                {
     4975                    WARN(("VBOXESC_TARGET_CONNECTIVITY invalid private driver size %d", pEscape->PrivateDriverDataSize));
     4976                    Status = STATUS_INVALID_PARAMETER;
     4977                    break;
     4978                }
     4979
     4980                VBOXDISPIFESCAPE_TARGETCONNECTIVITY *pData = (VBOXDISPIFESCAPE_TARGETCONNECTIVITY *)pEscapeHdr;
     4981                LOG(("=> VBOXESC_TARGET_CONNECTIVITY[%d] 0x%08X", pData->u32TargetId, pData->fu32Connect));
     4982
     4983                if (pData->u32TargetId >= (uint32_t)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
     4984                {
     4985                    WARN(("VBOXESC_TARGET_CONNECTIVITY invalid screen index 0x%x", pData->u32TargetId));
     4986                    Status = STATUS_INVALID_PARAMETER;
     4987                    break;
     4988                }
     4989
     4990                PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[pData->u32TargetId];
     4991                pTarget->fDisabled = !RT_BOOL(pData->fu32Connect & 1);
     4992                pTarget->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_TOPOLOGY;
     4993
     4994                break;
     4995            }
    49624996            case VBOXESC_DBGPRINT:
    49634997            {
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp

    r63566 r64878  
    13691369    }
    13701370
    1371 /*  The code below was commented out because VBOXESC_UPDATEMODES should not cause (un)plugging virtual displays.
     1371#ifdef VBOX_WDDM_REPLUG_ON_MODE_CHANGE
     1372    /* The code was disabled because VBOXESC_UPDATEMODES should not cause (un)plugging virtual displays. */
    13721373    winEr =  vboxDispIfWaitDisplayDataInited(pOp);
    13731374    if (winEr != NO_ERROR)
    13741375        WARN(("VBoxTray: (WDDM) Failed vboxDispIfWaitDisplayDataInited winEr %d\n", winEr));
    1375 */
     1376#endif
     1377
    13761378    return winEr;
     1379}
     1380
     1381static DWORD vboxDispIfTargetConnectivityWDDM(VBOXDISPIF_OP *pOp, uint32_t u32TargetId, uint32_t fu32Connect)
     1382{
     1383    VBOXDISPIFESCAPE_TARGETCONNECTIVITY PrivateData;
     1384    RT_ZERO(PrivateData);
     1385    PrivateData.EscapeHdr.escapeCode = VBOXESC_TARGET_CONNECTIVITY;
     1386    PrivateData.u32TargetId = u32TargetId;
     1387    PrivateData.fu32Connect = fu32Connect;
     1388
     1389    D3DKMT_ESCAPE EscapeData;
     1390    RT_ZERO(EscapeData);
     1391    EscapeData.hAdapter = pOp->Adapter.hAdapter;
     1392    EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
     1393    EscapeData.Flags.HardwareAccess = 1;
     1394    EscapeData.pPrivateDriverData = &PrivateData;
     1395    EscapeData.PrivateDriverDataSize = sizeof(PrivateData);
     1396
     1397    NTSTATUS Status = pOp->pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
     1398    if (NT_SUCCESS(Status))
     1399        return ERROR_SUCCESS;
     1400
     1401    WARN(("VBoxTray: pfnD3DKMTEscape VBOXESC_TARGETCONNECTIVITY failed Status 0x%x\n", Status));
     1402    return ERROR_GEN_FAILURE;
    13771403}
    13781404
     
    14791505        LogFunc(("D3DKMTInvalidateActiveVidPn returned %d)\n", Status));
    14801506    }
     1507
     1508    vboxDispIfTargetConnectivityWDDM(&Op, iChangedMode, fEnable? 1: 0);
    14811509
    14821510    /* Resize displays always to keep the display layout because
  • trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h

    r63088 r64878  
    4545# define VBOXESC_UPDATEMODES                0xABCD9016
    4646# define VBOXESC_GUEST_DISPLAYCHANGED       0xABCD9017
     47# define VBOXESC_TARGET_CONNECTIVITY        0xABCD9018
    4748#endif /* #ifdef VBOX_WITH_WDDM */
    4849
     
    7778#ifdef VBOX_WITH_WDDM
    7879
     80/* Enables code which performs (un)plugging of virtual displays in VBOXESC_UPDATEMODES.
     81 * The code has been disabled as part of #8244.
     82 */
     83//#define VBOX_WDDM_REPLUG_ON_MODE_CHANGE
     84
    7985/* for VBOX_VIDEO_MAX_SCREENS definition */
    8086#include <VBox/Hardware/VBoxVideoVBE.h>
     
    105111} VBOXDISPIFESCAPE_UPDATEMODES;
    106112
     113typedef struct VBOXDISPIFESCAPE_TARGETCONNECTIVITY
     114{
     115    VBOXDISPIFESCAPE EscapeHdr;
     116    uint32_t u32TargetId;
     117    uint32_t fu32Connect;
     118} VBOXDISPIFESCAPE_TARGETCONNECTIVITY;
     119
    107120#endif /* VBOX_WITH_WDDM */
    108121
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette