Changeset 64878 in vbox
- Timestamp:
- Dec 15, 2016 10:51:08 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 112282
- 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 162 162 bool fConfigured; 163 163 bool fBlankedByPowerOff; 164 165 /* Whether the host has disabled the virtual screen. */ 166 /** @todo This should be merged with fConnected. */ 167 bool fDisabled; 164 168 } VBOXWDDM_TARGET, *PVBOXWDDM_TARGET; 165 169 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
r64085 r64878 1339 1339 } 1340 1340 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 1341 1349 /* 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 1346 1350 NTSTATUS Status = VBoxWddmChildStatusReportReconnected(pDevExt, u32TargetId); 1347 1351 LOG(("VBoxWddmChildStatusReportReconnected returned (%d)", Status)); … … 1351 1355 return Status; 1352 1356 } 1353 */ 1357 #endif 1358 1354 1359 LOGF(("LEAVE u32TargetId(%d)", u32TargetId)); 1355 1360 return STATUS_SUCCESS; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r64743 r64878 345 345 } 346 346 347 static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff )347 static uint16_t vboxWddmCalcScreenFlags(PVBOXMP_DEVEXT pDevExt, bool fValidAlloc, bool fPowerOff, bool fDisabled) 348 348 { 349 349 uint16_t u16Flags; … … 355 355 else 356 356 { 357 if ( fPowerOff 357 if ( !fDisabled 358 && fPowerOff 358 359 && RT_BOOL(VBoxCommonFromDeviceExt(pDevExt)->u16SupportedScreenFlags & VBVA_SCREEN_F_BLANK2)) 359 360 { … … 369 370 } 370 371 371 NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff )372 NTSTATUS vboxWddmGhDisplaySetInfoLegacy(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled) 372 373 { 373 374 NTSTATUS Status = STATUS_SUCCESS; 374 375 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); 376 377 377 378 if (fValidAlloc) … … 420 421 } 421 422 422 NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff )423 NTSTATUS vboxWddmGhDisplaySetInfoNew(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData, const uint32_t *pTargetMap, const POINT * pVScreenPos, uint8_t u8CurCyncState, bool fPowerOff, bool fDisabled) 423 424 { 424 425 NTSTATUS Status = STATUS_SUCCESS; 425 426 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); 427 428 428 429 if (fValidAlloc) … … 493 494 } 494 495 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); 496 497 if (NT_SUCCESS(Status)) 497 498 { … … 539 540 { 540 541 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); 542 543 if (NT_SUCCESS(Status)) 543 544 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; … … 584 585 } 585 586 586 if (pTarget->fBlankedByPowerOff) 587 /* Explicitely disabled targets must not be skipped. */ 588 if (pTarget->fBlankedByPowerOff && !pTarget->fDisabled) 587 589 { 588 590 LOG(("Skip doing DISABLED request for PowerOff tgt %d", pTarget->u32Id)); … … 603 605 VBOXWDDM_ALLOC_DATA AllocData; 604 606 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); 606 608 if (!NT_SUCCESS(Status)) 607 609 { … … 647 649 fFound = true; 648 650 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); 650 652 if (NT_SUCCESS(Status)) 651 653 pTarget->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; … … 4960 4962 break; 4961 4963 } 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 } 4962 4996 case VBOXESC_DBGPRINT: 4963 4997 { -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
r63566 r64878 1369 1369 } 1370 1370 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. */ 1372 1373 winEr = vboxDispIfWaitDisplayDataInited(pOp); 1373 1374 if (winEr != NO_ERROR) 1374 1375 WARN(("VBoxTray: (WDDM) Failed vboxDispIfWaitDisplayDataInited winEr %d\n", winEr)); 1375 */ 1376 #endif 1377 1376 1378 return winEr; 1379 } 1380 1381 static 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; 1377 1403 } 1378 1404 … … 1479 1505 LogFunc(("D3DKMTInvalidateActiveVidPn returned %d)\n", Status)); 1480 1506 } 1507 1508 vboxDispIfTargetConnectivityWDDM(&Op, iChangedMode, fEnable? 1: 0); 1481 1509 1482 1510 /* Resize displays always to keep the display layout because -
trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h
r63088 r64878 45 45 # define VBOXESC_UPDATEMODES 0xABCD9016 46 46 # define VBOXESC_GUEST_DISPLAYCHANGED 0xABCD9017 47 # define VBOXESC_TARGET_CONNECTIVITY 0xABCD9018 47 48 #endif /* #ifdef VBOX_WITH_WDDM */ 48 49 … … 77 78 #ifdef VBOX_WITH_WDDM 78 79 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 79 85 /* for VBOX_VIDEO_MAX_SCREENS definition */ 80 86 #include <VBox/Hardware/VBoxVideoVBE.h> … … 105 111 } VBOXDISPIFESCAPE_UPDATEMODES; 106 112 113 typedef struct VBOXDISPIFESCAPE_TARGETCONNECTIVITY 114 { 115 VBOXDISPIFESCAPE EscapeHdr; 116 uint32_t u32TargetId; 117 uint32_t fu32Connect; 118 } VBOXDISPIFESCAPE_TARGETCONNECTIVITY; 119 107 120 #endif /* VBOX_WITH_WDDM */ 108 121
Note:
See TracChangeset
for help on using the changeset viewer.