VirtualBox

Ignore:
Timestamp:
Jun 7, 2016 5:01:38 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107887
Message:

3D: Get rid of deprecated gdi32!D3DKMTInvalidateActiveVidPn for Win7 and up (bugref:8244).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp

    r61530 r61548  
    13411341    }
    13421342
     1343/*  The code below was commented out because VBOXESC_UPDATEMODES should not cause (un)plugging virtual displays.
    13431344    winEr =  vboxDispIfWaitDisplayDataInited(pOp);
    13441345    if (winEr != NO_ERROR)
    13451346        WARN(("VBoxTray: (WDDM) Failed vboxDispIfWaitDisplayDataInited winEr %d\n", winEr));
    1346 
     1347*/
    13471348    return winEr;
    13481349}
     
    13791380static DWORD vboxDispIfResizePerform(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes)
    13801381{
     1382    LogFunc((" ENTER"));
    13811383    DWORD winEr;
     1384
    13821385    if (pIf->enmMode > VBOXDISPIF_MODE_WDDM)
    13831386    {
     
    13921395            WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmResizeDisplayVista winEr %d\n", winEr));
    13931396    }
     1397
     1398    LogFunc((" LEAVE"));
    13941399    return winEr;
    13951400}
     
    13991404    DWORD winEr = NO_ERROR;
    14001405
    1401     Log(("VBoxTray: vboxDispIfResizeModesWDDM iChanged %d cDevModes %d\n", iChangedMode, cDevModes));
     1406    Log(("VBoxTray: vboxDispIfResizeModesWDDM iChanged %d cDevModes %d fEnable %d fExtDispSup %d\n", iChangedMode, cDevModes, fEnable, fExtDispSup));
    14021407    VBoxRrRetryStop();
    14031408
     
    14301435    }
    14311436
    1432     D3DKMT_INVALIDATEACTIVEVIDPN DdiData = {0};
    1433 
    1434     DdiData.hAdapter = Op.Adapter.hAdapter;
    1435     DdiData.pPrivateDriverData = &VidPnData;
    1436     DdiData.PrivateDriverDataSize = sizeof (VidPnData);
    1437 
    1438     NTSTATUS Status = Op.pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTInvalidateActiveVidPn(&DdiData);
    1439     LogFunc(("InvalidateActiveVidPn 0x%08x\n", Status));
     1437/*  The pfnD3DKMTInvalidateActiveVidPn was deprecated since Win7 and causes deadlocks since Win10 TH2.
     1438    Instead, the VidPn Manager can replace an old VidPn as soon as SetDisplayConfig or ChangeDisplaySettingsEx will try to set a new display mode.
     1439    On Vista D3DKMTInvalidateActiveVidPn is still required. TBD: Get rid of it. */ 
     1440    if (Op.pIf->enmMode < VBOXDISPIF_MODE_WDDM_W7)
     1441    {
     1442        D3DKMT_INVALIDATEACTIVEVIDPN DdiData = {0};
     1443
     1444        DdiData.hAdapter = Op.Adapter.hAdapter;
     1445        DdiData.pPrivateDriverData = &VidPnData;
     1446        DdiData.PrivateDriverDataSize = sizeof (VidPnData);
     1447
     1448        NTSTATUS Status;
     1449        Status = Op.pIf->modeData.wddm.KmtCallbacks.pfnD3DKMTInvalidateActiveVidPn(&DdiData);
     1450        LogFunc(("D3DKMTInvalidateActiveVidPn returned %d)\n", Status));
     1451    }
    14401452
    14411453    /* Resize displays always to keep the display layout because
     
    14511463            Size.cx = paDeviceModes[iChangedMode].dmPelsWidth;
    14521464            Size.cy = paDeviceModes[iChangedMode].dmPelsHeight;
     1465            LogFunc(("Calling vboxDispIfUpdateModesWDDM to change target %d mode to (%d x %d)\n", iChangedMode, Size.cx, Size.cy));
    14531466            winEr = vboxDispIfUpdateModesWDDM(&Op, iChangedMode, &Size);
     1467            LogFunc(("vboxDispIfUpdateModesWDDM returned %d\n", winEr));
     1468
    14541469            if (winEr != NO_ERROR)
    14551470                WARN(("vboxDispIfUpdateModesWDDM failed %d\n", winEr));
     
    14601475            winEr = vboxDispIfResizePerform(pIf, i, fEnable, fExtDispSup, paDisplayDevices, paDeviceModes, cDevModes);
    14611476
     1477            LogFunc(("vboxDispIfResizePerform returned %d\n", winEr));
     1478
    14621479            if (winEr == ERROR_RETRY)
    14631480            {
    14641481                VBoxRrRetrySchedule(pIf, i, fEnable, fExtDispSup, paDisplayDevices, paDeviceModes, cDevModes);
    1465                 /* just pretend everything is fine so far */
     1482
    14661483                winEr = NO_ERROR;
    14671484            }
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