- Timestamp:
- Jul 10, 2012 4:16:18 PM (13 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp
r42081 r42098 493 493 return (pExt->CurrentMode == 0); 494 494 #else 495 return (!VBoxCommonFromDeviceExt(pExt)->cDisplays || !pExt->aSources[iDisplay].pPrimaryAllocation); 495 return (!VBoxCommonFromDeviceExt(pExt)->cDisplays 496 # ifndef VBOX_WDDM_MINIPORT 497 || !pExt->aSources[iDisplay].pPrimaryAllocation 498 # endif 499 ); 496 500 #endif 497 501 } … … 520 524 bpp = bpp ? bpp :pExt->CurrentModeBPP; 521 525 #else 522 xres = xres ? xres:pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.width; 523 yres = yres ? yres:pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.height; 524 bpp = bpp ? bpp :pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.bpp; 526 PVBOXWDDM_ALLOC_DATA pAllocData = pExt->aSources[iDisplay].pPrimaryAllocation ? 527 &pExt->aSources[iDisplay].pPrimaryAllocation->AllocData 528 : &pExt->aSources[iDisplay].AllocData; 529 xres = xres ? xres:pAllocData->SurfDesc.width; 530 yres = yres ? yres:pAllocData->SurfDesc.height; 531 bpp = bpp ? bpp :pAllocData->SurfDesc.bpp; 525 532 #endif 526 533 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r42092 r42098 510 510 } 511 511 512 typedef struct VBOXWDDMCHILDSTATUSCB 513 { 514 PVBOXVDMACBUF_DR pDr; 515 PKEVENT pEvent; 516 } VBOXWDDMCHILDSTATUSCB, *PVBOXWDDMCHILDSTATUSCB; 517 518 static DECLCALLBACK(VOID) vboxWddmChildStatusReportCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext) 519 { 520 /* we should be called from our DPC routine */ 521 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 522 523 PVBOXWDDMCHILDSTATUSCB pCtx = (PVBOXWDDMCHILDSTATUSCB)pvContext; 524 PVBOXVDMACBUF_DR pDr = pCtx->pDr; 525 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 526 VBOXVDMACMD_CHILD_STATUS_IRQ *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHILD_STATUS_IRQ); 512 static NTSTATUS vboxWddmChildStatusDoReportReconnected(PVBOXMP_DEVEXT pDevExt, VBOXVDMACMD_CHILD_STATUS_IRQ *pBody) 513 { 514 NTSTATUS Status = STATUS_SUCCESS; 527 515 528 516 for (UINT i = 0; i < pBody->cInfos; ++i) … … 533 521 for (D3DDDI_VIDEO_PRESENT_TARGET_ID iChild = 0; iChild < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++iChild) 534 522 { 535 NTSTATUSStatus = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild);523 Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild); 536 524 if (!NT_SUCCESS(Status)) 537 525 { … … 543 531 else 544 532 { 545 NTSTATUSStatus = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED);533 Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED); 546 534 if (!NT_SUCCESS(Status)) 547 535 { … … 552 540 } 553 541 542 return Status; 543 } 544 545 typedef struct VBOXWDDMCHILDSTATUSCB 546 { 547 PVBOXVDMACBUF_DR pDr; 548 PKEVENT pEvent; 549 } VBOXWDDMCHILDSTATUSCB, *PVBOXWDDMCHILDSTATUSCB; 550 551 static DECLCALLBACK(VOID) vboxWddmChildStatusReportCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext) 552 { 553 /* we should be called from our DPC routine */ 554 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 555 556 PVBOXWDDMCHILDSTATUSCB pCtx = (PVBOXWDDMCHILDSTATUSCB)pvContext; 557 PVBOXVDMACBUF_DR pDr = pCtx->pDr; 558 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 559 VBOXVDMACMD_CHILD_STATUS_IRQ *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHILD_STATUS_IRQ); 560 561 vboxWddmChildStatusDoReportReconnected(pDevExt, pBody); 562 554 563 vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr); 555 564 … … 562 571 static NTSTATUS vboxWddmChildStatusReportReconnected(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID idTarget) 563 572 { 573 #ifdef VBOX_WDDM_MONITOR_REPLUG_IRQ 564 574 NTSTATUS Status = STATUS_UNSUCCESSFUL; 565 575 UINT cbCmd = VBOXVDMACMD_SIZE_FROMBODYSIZE(sizeof (VBOXVDMACMD_CHILD_STATUS_IRQ)); … … 585 595 pBody->aInfos[0].iChild = idTarget; 586 596 pBody->aInfos[0].fFlags = VBOXVDMA_CHILD_STATUS_F_DISCONNECTED | VBOXVDMA_CHILD_STATUS_F_CONNECTED; 587 588 597 /* we're going to KeWaitForSingleObject */ 589 598 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); … … 620 629 621 630 return Status; 631 #else 632 VBOXVDMACMD_CHILD_STATUS_IRQ Body = {0}; 633 Body.cInfos = 1; 634 if (idTarget == D3DDDI_ID_ALL) 635 { 636 Body.fFlags |= VBOXVDMACMD_CHILD_STATUS_IRQ_F_APPLY_TO_ALL; 637 } 638 Body.aInfos[0].iChild = idTarget; 639 Body.aInfos[0].fFlags = VBOXVDMA_CHILD_STATUS_F_DISCONNECTED | VBOXVDMA_CHILD_STATUS_F_CONNECTED; 640 Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); 641 return vboxWddmChildStatusDoReportReconnected(pDevExt, &Body); 642 #endif 622 643 } 623 644 … … 629 650 630 651 Assert(!bChanged[0]); 631 for (i = 1; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)652 for (i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 632 653 { 633 654 /* @todo: check that we actually need the current source->target */ … … 4083 4104 case VBOXESC_REINITVIDEOMODES: 4084 4105 { 4085 /* clear driver's internal videomodes cache */ 4086 VBoxWddmInvalidateVideoModesInfo(pDevExt); 4087 Status = STATUS_SUCCESS; 4106 PVBOXWDDM_VIDEOMODES_INFO pInfo = VBoxWddmUpdateVideoModesInfo(pDevExt, NULL); 4107 Status = vboxWddmChildStatusCheck(pDevExt, pInfo); 4108 if (!NT_SUCCESS(Status)) 4109 { 4110 WARN(("vboxWddmChildStatusCheck failed, Status 0x%x", Status)); 4111 } 4088 4112 break; 4089 4113 } … … 6175 6199 LOGF(("ENTER, hAdapter(0x%x)", hAdapter)); 6176 6200 vboxVDbgBreakF(); 6177 AssertBreakpoint();6178 6201 6179 6202 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; … … 6577 6600 } 6578 6601 6579 //#ifdef VBOX_WDDM_WIN8 6580 // LOGREL(("Current win8 video driver only supports display-only mode no matter whether or not host 3D is enabled!")); 6581 // g_VBoxDisplayOnly = 1; 6582 //#endif 6602 #ifdef DEBUG_misha 6603 /* force g_VBoxDisplayOnly for debugging purposes */ 6604 LOGREL(("Current win8 video driver only supports display-only mode no matter whether or not host 3D is enabled!")); 6605 g_VBoxDisplayOnly = 1; 6606 #endif 6583 6607 6584 6608 if (NT_SUCCESS(Status)) -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
r37630 r42098 211 211 PVBOXDISPIFESCAPE pEscape; 212 212 int cbData; 213 D3DDDI_ESCAPEFLAGS EscapeFlags; 213 214 } VBOXDISPIFWDDM_ESCAPEOP_CONTEXT, *PVBOXDISPIFWDDM_ESCAPEOP_CONTEXT; 214 215 … … 221 222 //EscapeData.hDevice = NULL; 222 223 EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; 223 EscapeData.Flags .HardwareAccess = 1;224 EscapeData.Flags = pCtx->EscapeFlags; 224 225 EscapeData.pPrivateDriverData = pCtx->pEscape; 225 226 EscapeData.PrivateDriverDataSize = VBOXDISPIFESCAPE_SIZE(pCtx->cbData); … … 231 232 } 232 233 233 static DWORD vboxDispIfEscapeWDDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData )234 static DWORD vboxDispIfEscapeWDDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData, BOOL fHwAccess) 234 235 { 235 236 VBOXDISPIFWDDM_ESCAPEOP_CONTEXT Ctx = {0}; 236 237 Ctx.pEscape = pEscape; 237 238 Ctx.cbData = cbData; 239 if (fHwAccess) 240 Ctx.EscapeFlags.HardwareAccess = 1; 238 241 DWORD err = vboxDispIfWDDMAdapterOp(pIf, -1 /* iDisplay, -1 means primary */, vboxDispIfEscapeWDDMOp, &Ctx); 239 242 if (err == NO_ERROR) … … 332 335 #ifdef VBOX_WITH_WDDM 333 336 case VBOXDISPIF_MODE_WDDM: 334 return vboxDispIfEscapeWDDM(pIf, pEscape, cbData );337 return vboxDispIfEscapeWDDM(pIf, pEscape, cbData, TRUE /* BOOL fHwAccess */); 335 338 #endif 336 339 default: … … 461 464 462 465 #ifdef VBOX_WITH_WDDM 466 static DWORD vboxDispIfReinitVideoModes(PCVBOXDISPIF const pIf) 467 { 468 VBOXDISPIFESCAPE escape = {0}; 469 escape.escapeCode = VBOXESC_REINITVIDEOMODES; 470 DWORD err = vboxDispIfEscapeWDDM(pIf, &escape, 0, FALSE /* hw access must be false here, 471 * otherwise the miniport driver would fail 472 * request to prevent a deadlock */); 473 if (err != NO_ERROR) 474 { 475 Log((__FUNCTION__": VBoxDispIfEscape failed with err (%d)\n", err)); 476 } 477 return err; 478 } 479 463 480 DWORD vboxDispIfResizeModesWDDM(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes) 464 481 { … … 510 527 } 511 528 529 BOOL fAbleToInvalidateVidPn = FALSE; 530 512 531 if (winEr == NO_ERROR) 513 532 { … … 527 546 winEr = ERROR_GEN_FAILURE; 528 547 } 548 else 549 { 550 fAbleToInvalidateVidPn = TRUE; 551 } 529 552 } 530 553 … … 535 558 Status = pIf->modeData.wddm.pfnD3DKMTCloseAdapter(&ClosaAdapterData); 536 559 Assert(!Status); 560 } 561 562 if (!fAbleToInvalidateVidPn) 563 { 564 /* fallback impl: make the driver invalidate VidPn, 565 * which is done by emulating a monitor re-plug currently */ 566 vboxDispIfReinitVideoModes(pIf); 567 568 /* sleep 2 seconds: dirty hack to wait for the new monitor info to be picked up, 569 * @todo: implement it properly by monitoring monitor device arrival/removal */ 570 Sleep(2 * 1000); 537 571 } 538 572 … … 556 590 paDeviceModes[i].dmPosition.x, 557 591 paDeviceModes[i].dmPosition.y)); 592 593 if (!fAbleToInvalidateVidPn) 594 { 595 /* @todo: the miniport might have been adjusted the display mode stuff, 596 * adjust the paDeviceModes[i] by picking the closest available one */ 597 } 558 598 559 599 LONG status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)paDisplayDevices[i].DeviceName, -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp
r40672 r42098 41 41 42 42 #ifdef VBOX_WITH_WDDM 43 static bool vboxWddmReinitVideoModes(VBOXDISPLAYCONTEXT *pCtx)44 {45 VBOXDISPIFESCAPE escape = {0};46 escape.escapeCode = VBOXESC_REINITVIDEOMODES;47 DWORD err = VBoxDispIfEscape(&pCtx->pEnv->dispIf, &escape, 0);48 if (err != NO_ERROR)49 {50 Log((__FUNCTION__": VBoxDispIfEscape failed with err (%d)\n", err));51 return false;52 }53 return true;54 }55 56 43 typedef enum 57 44 { … … 173 160 #else 174 161 enmType = VBOXDISPLAY_DRIVER_TYPE_XPDM; 175 else if (strcmp(&dispDevice.DeviceString[0], "VirtualBox Graphics Adapter (Microsoft Corporation - WDDM)") == 0) 162 /* WDDM driver can now have multiple incarnations, 163 * if the driver name contains VirtualBox, and does NOT match the XPDM name, 164 * assume it to be WDDM */ 165 else if (strstr(&dispDevice.DeviceString[0], "VirtualBox")) 176 166 enmType = VBOXDISPLAY_DRIVER_TYPE_WDDM; 177 167 #endif
Note:
See TracChangeset
for help on using the changeset viewer.