VirtualBox

Changeset 42098 in vbox for trunk


Ignore:
Timestamp:
Jul 10, 2012 4:16:18 PM (13 years ago)
Author:
vboxsync
Message:

wddm: new autoresize mechanism basics

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  
    493493    return (pExt->CurrentMode == 0);
    494494#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                    );
    496500#endif
    497501}
     
    520524        bpp  = bpp  ? bpp :pExt->CurrentModeBPP;
    521525#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;
    525532#endif
    526533    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r42092 r42098  
    510510}
    511511
    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);
     512static NTSTATUS vboxWddmChildStatusDoReportReconnected(PVBOXMP_DEVEXT pDevExt, VBOXVDMACMD_CHILD_STATUS_IRQ *pBody)
     513{
     514    NTSTATUS Status = STATUS_SUCCESS;
    527515
    528516    for (UINT i = 0; i < pBody->cInfos; ++i)
     
    533521            for (D3DDDI_VIDEO_PRESENT_TARGET_ID iChild = 0; iChild < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++iChild)
    534522            {
    535                 NTSTATUS Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild);
     523                Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild);
    536524                if (!NT_SUCCESS(Status))
    537525                {
     
    543531        else
    544532        {
    545             NTSTATUS Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED);
     533            Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED);
    546534            if (!NT_SUCCESS(Status))
    547535            {
     
    552540    }
    553541
     542    return Status;
     543}
     544
     545typedef struct VBOXWDDMCHILDSTATUSCB
     546{
     547    PVBOXVDMACBUF_DR pDr;
     548    PKEVENT pEvent;
     549} VBOXWDDMCHILDSTATUSCB, *PVBOXWDDMCHILDSTATUSCB;
     550
     551static 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
    554563    vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr);
    555564
     
    562571static NTSTATUS vboxWddmChildStatusReportReconnected(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID idTarget)
    563572{
     573#ifdef VBOX_WDDM_MONITOR_REPLUG_IRQ
    564574    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    565575    UINT cbCmd = VBOXVDMACMD_SIZE_FROMBODYSIZE(sizeof (VBOXVDMACMD_CHILD_STATUS_IRQ));
     
    585595        pBody->aInfos[0].iChild = idTarget;
    586596        pBody->aInfos[0].fFlags = VBOXVDMA_CHILD_STATUS_F_DISCONNECTED | VBOXVDMA_CHILD_STATUS_F_CONNECTED;
    587 
    588597        /* we're going to KeWaitForSingleObject */
    589598        Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
     
    620629
    621630    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
    622643}
    623644
     
    629650
    630651    Assert(!bChanged[0]);
    631     for (i = 1; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
     652    for (i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
    632653    {
    633654        /* @todo: check that we actually need the current source->target */
     
    40834104            case VBOXESC_REINITVIDEOMODES:
    40844105            {
    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                }
    40884112                break;
    40894113            }
     
    61756199    LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
    61766200    vboxVDbgBreakF();
    6177     AssertBreakpoint();
    61786201
    61796202    PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
     
    65776600        }
    65786601
    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
    65836607
    65846608        if (NT_SUCCESS(Status))
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp

    r37630 r42098  
    211211    PVBOXDISPIFESCAPE pEscape;
    212212    int cbData;
     213    D3DDDI_ESCAPEFLAGS EscapeFlags;
    213214} VBOXDISPIFWDDM_ESCAPEOP_CONTEXT, *PVBOXDISPIFWDDM_ESCAPEOP_CONTEXT;
    214215
     
    221222    //EscapeData.hDevice = NULL;
    222223    EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
    223     EscapeData.Flags.HardwareAccess = 1;
     224    EscapeData.Flags = pCtx->EscapeFlags;
    224225    EscapeData.pPrivateDriverData = pCtx->pEscape;
    225226    EscapeData.PrivateDriverDataSize = VBOXDISPIFESCAPE_SIZE(pCtx->cbData);
     
    231232}
    232233
    233 static DWORD vboxDispIfEscapeWDDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData)
     234static DWORD vboxDispIfEscapeWDDM(PCVBOXDISPIF pIf, PVBOXDISPIFESCAPE pEscape, int cbData, BOOL fHwAccess)
    234235{
    235236    VBOXDISPIFWDDM_ESCAPEOP_CONTEXT Ctx = {0};
    236237    Ctx.pEscape = pEscape;
    237238    Ctx.cbData = cbData;
     239    if (fHwAccess)
     240        Ctx.EscapeFlags.HardwareAccess = 1;
    238241    DWORD err = vboxDispIfWDDMAdapterOp(pIf, -1 /* iDisplay, -1 means primary */, vboxDispIfEscapeWDDMOp, &Ctx);
    239242    if (err == NO_ERROR)
     
    332335#ifdef VBOX_WITH_WDDM
    333336        case VBOXDISPIF_MODE_WDDM:
    334             return vboxDispIfEscapeWDDM(pIf, pEscape, cbData);
     337            return vboxDispIfEscapeWDDM(pIf, pEscape, cbData, TRUE /* BOOL fHwAccess */);
    335338#endif
    336339        default:
     
    461464
    462465#ifdef VBOX_WITH_WDDM
     466static 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
    463480DWORD vboxDispIfResizeModesWDDM(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
    464481{
     
    510527    }
    511528
     529    BOOL fAbleToInvalidateVidPn = FALSE;
     530
    512531    if (winEr == NO_ERROR)
    513532    {
     
    527546            winEr = ERROR_GEN_FAILURE;
    528547        }
     548        else
     549        {
     550            fAbleToInvalidateVidPn = TRUE;
     551        }
    529552    }
    530553
     
    535558        Status = pIf->modeData.wddm.pfnD3DKMTCloseAdapter(&ClosaAdapterData);
    536559        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);
    537571    }
    538572
     
    556590                  paDeviceModes[i].dmPosition.x,
    557591                  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            }
    558598
    559599            LONG status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)paDisplayDevices[i].DeviceName,
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDisplay.cpp

    r40672 r42098  
    4141
    4242#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 
    5643typedef enum
    5744{
     
    173160#else
    174161                    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"))
    176166                    enmType = VBOXDISPLAY_DRIVER_TYPE_WDDM;
    177167#endif
Note: See TracChangeset for help on using the changeset viewer.

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