VirtualBox

Changeset 60588 in vbox


Ignore:
Timestamp:
Apr 20, 2016 9:49:24 AM (8 years ago)
Author:
vboxsync
Message:

Additions/WDDM: Improve the scan line and VBlank reporting, 10% of one frame period are reserved for the VBlank. Fixes performance issues with PowerPoint if Aero is disabled

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp

    r60289 r60588  
    19541954    if (pTarget->Size.cy)
    19551955    {
    1956         uint32_t curScanLine;
    1957         BOOL bVBlank;
     1956        uint32_t curScanLine = 0;
     1957        BOOL bVBlank = FALSE;
    19581958        LARGE_INTEGER DevVSyncTime;
    19591959        DevVSyncTime.QuadPart =  ASMAtomicReadU64((volatile uint64_t*)&pDevExt->VSyncTime.QuadPart);
     
    19641964        {
    19651965            WARN(("vsync time is less than the one stored in device"));
    1966             curScanLine = 0;
     1966            bVBlank = TRUE;
    19671967        }
    19681968        else
    19691969        {
    19701970            VSyncTime.QuadPart = VSyncTime.QuadPart - DevVSyncTime.QuadPart;
    1971             /* time is in 100ns, */
    1972             curScanLine = (uint32_t)((pTarget->Size.cy * VSyncTime.QuadPart) / 166666LL); /* ASSUMES 60Hz*/
    1973             if (pDevExt->bVSyncTimerEnabled)
    1974             {
    1975                 if (curScanLine >= pTarget->Size.cy)
    1976                     curScanLine = 0;
    1977             }
     1971            /* Check whether we are in VBlank state or actively drawing a scan line
     1972             * 10% of the 60Hz are dedicated to VBlank.
     1973             */
     1974            LARGE_INTEGER VSyncPeriod;
     1975            VSyncPeriod.QuadPart = VSyncTime.QuadPart % 166666LL; /* ASSUMES 60Hz*/
     1976            if (VSyncPeriod.QuadPart > 150000LL)
     1977                bVBlank = TRUE;
    19781978            else
    19791979            {
    1980                 curScanLine %= pTarget->Size.cy;
    1981             }
    1982         }
    1983 
    1984         bVBlank = (!curScanLine || curScanLine > pTarget->Size.cy);
     1980                /* time is in 100ns, */
     1981                curScanLine = (uint32_t)((pTarget->Size.cy * VSyncPeriod.QuadPart) / 150000LL);
     1982                if (pDevExt->bVSyncTimerEnabled)
     1983                {
     1984                    if (curScanLine > pTarget->Size.cy)
     1985                        curScanLine = pTarget->Size.cy;
     1986                }
     1987                else
     1988                    curScanLine %= pTarget->Size.cy;
     1989            }
     1990        }
     1991
    19851992        pGetScanLine->ScanLine = curScanLine;
    19861993        pGetScanLine->InVerticalBlank = bVBlank;
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