VirtualBox

Ignore:
Timestamp:
Sep 14, 2010 10:14:46 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
65872
Message:

wddm/3d: multi-swapchain fixes (for win7 & multi-monitor)

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r32444 r32496  
    13841384}
    13851385
     1386static HRESULT vboxWddmSwapchainKmSynch(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
     1387{
     1388    struct
     1389    {
     1390        VBOXDISPIFESCAPE_SWAPCHAININFO SwapchainInfo;
     1391        D3DKMT_HANDLE ahAllocs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE];
     1392    } Buf;
     1393
     1394    memset(&Buf.SwapchainInfo, 0, sizeof (Buf.SwapchainInfo));
     1395    Buf.SwapchainInfo.EscapeHdr.escapeCode = VBOXESC_SWAPCHAININFO;
     1396    Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm;
     1397    Buf.SwapchainInfo.SwapchainInfo.hSwapchainUm = (VBOXDISP_UMHANDLE)pSwapchain;
     1398//    Buf.SwapchainInfo.SwapchainInfo.Rect;
     1399//    Buf.SwapchainInfo.SwapchainInfo.u32Reserved;
     1400    Buf.SwapchainInfo.SwapchainInfo.cAllocs = pSwapchain->cRTs;
     1401    for (UINT i = 0; i < Buf.SwapchainInfo.SwapchainInfo.cAllocs; ++i)
     1402    {
     1403        Assert(pSwapchain->aRTs[i].pAlloc->hAllocation);
     1404        Buf.SwapchainInfo.SwapchainInfo.ahAllocs[i] = pSwapchain->aRTs[i].pAlloc->hAllocation;
     1405    }
     1406
     1407    D3DDDICB_ESCAPE DdiEscape = {0};
     1408    DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext;
     1409    DdiEscape.hDevice = pDevice->hDevice;
     1410//    DdiEscape.Flags.Value = 0;
     1411    DdiEscape.pPrivateDriverData = &Buf.SwapchainInfo;
     1412    DdiEscape.PrivateDriverDataSize = RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[Buf.SwapchainInfo.SwapchainInfo.cAllocs]);
     1413    HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);
     1414    Assert(hr == S_OK);
     1415    if (hr == S_OK)
     1416    {
     1417        pSwapchain->hSwapchainKm = Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm;
     1418    }
     1419
     1420    return hr;
     1421}
     1422
     1423static HRESULT vboxWddmSwapchainKmDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
     1424{
     1425    HRESULT hr = S_OK;
     1426    if (pSwapchain->hSwapchainKm)
     1427    {
     1428        /* submit empty swapchain to destroy the KM one */
     1429        UINT cOldRTc = pSwapchain->cRTs;
     1430        pSwapchain->cRTs = 0;
     1431        hr = vboxWddmSwapchainKmSynch(pDevice, pSwapchain);
     1432        Assert(hr == S_OK);
     1433        Assert(!pSwapchain->hSwapchainKm);
     1434        pSwapchain->cRTs = cOldRTc;
     1435    }
     1436    return hr;
     1437}
    13861438static HRESULT vboxWddmSwapchainDestroyIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
    13871439{
     
    14101462    }
    14111463    vboxWddmSwapchainDestroyIf(pDevice, pSwapchain);
     1464    vboxWddmSwapchainKmDestroy(pDevice, pSwapchain);
    14121465    vboxWddmSwapchainInit(pSwapchain);
    14131466}
     
    18031856    return hr;
    18041857}
     1858
    18051859static HRESULT vboxWddmSwapchainSynch(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
    18061860{
     1861    HRESULT hr = S_OK;
    18071862    for (int iBb = -1; iBb < int(pSwapchain->cRTs - 1); ++iBb)
    18081863    {
    1809         HRESULT hr = vboxWddmSwapchainRtSynch(pDevice, pSwapchain, (UINT)iBb);
     1864        hr = vboxWddmSwapchainRtSynch(pDevice, pSwapchain, (UINT)iBb);
    18101865        Assert(hr == S_OK);
    18111866    }
    1812     pSwapchain->fFlags.bChanged = 0;
    1813     return S_OK;
     1867
     1868    if (pSwapchain->fFlags.bChanged)
     1869    {
     1870        hr = vboxWddmSwapchainKmSynch(pDevice, pSwapchain);
     1871        if (hr == S_OK)
     1872        {
     1873            pSwapchain->fFlags.bChanged = 0;
     1874        }
     1875    }
     1876    return hr;
    18141877}
    18151878
     
    43734436    {
    43744437        bool bIssueCreateResource = false;
     4438        bool bCreateSwapchain = false;
    43754439        bool bCreateKMResource = false;
    43764440
     
    46494713                if (RTListIsEmpty(&pDevice->SwapchainList))
    46504714                {
    4651                     PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
    4652                     hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain);
    4653                     Assert(hr == S_OK);
     4715                    bCreateSwapchain = true;
     4716                    Assert(bIssueCreateResource);
    46544717                }
    46554718                else
     
    48254888                        pAllocation->pvMem = (void*)pSurf->pSysMem;
    48264889                        pAllocation->SurfDesc = pAllocInfo->SurfDesc;
     4890                    }
     4891
     4892                    if(bCreateSwapchain)
     4893                    {
     4894                        PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
     4895                        hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain);
     4896                        Assert(hr == S_OK);
    48274897                    }
    48284898                }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r32444 r32496  
    139139    IDirect3DSwapChain9 *pSwapChainIf;
    140140    HWND hWnd;
     141    VBOXDISP_KMHANDLE hSwapchainKm;
    141142    VBOXWDDMDISP_RENDERTGT aRTs[VBOXWDDMDISP_MAX_SWAPCHAIN_SIZE];
    142143} VBOXWDDMDISP_SWAPCHAIN, *PVBOXWDDMDISP_SWAPCHAIN;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMp.cpp

    r32425 r32496  
    139139        VBOXWDDMDISP_CONTEXT *pContext = (VBOXWDDMDISP_CONTEXT*)pHdr->u64UmData;
    140140        PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)(((uint8_t*)pHdr) + sizeof (VBOXVIDEOCM_CMD_HDR));
    141 //        UINT iScreen = pContext->pDevice->cScreens == 1 ? pContext->pDevice->iPrimaryScreen : pCmdInternal->VidPnSourceId;
    142 //        PVBOXWDDMDISP_SCREEN pScreen = &pContext->pDevice->aScreens[iScreen];
    143 //        Assert(pScreen->hWnd);
    144 //        Assert(pScreen->pDevice9If);
    145 //        pRegions->hWnd = pScreen->hWnd;
    146         PVBOXWDDMDISP_SWAPCHAIN pSwapchain = RTListNodeGetLast(&pContext->pDevice->SwapchainList, VBOXWDDMDISP_SWAPCHAIN, ListEntry);
     141        PVBOXWDDMDISP_SWAPCHAIN pSwapchain = (PVBOXWDDMDISP_SWAPCHAIN)pCmdInternal->hSwapchainUm;
     142        /* todo: synchronization */
    147143        Assert(pSwapchain);
    148144        pRegions->hWnd = pSwapchain->hWnd;
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