VirtualBox

Ignore:
Timestamp:
Sep 14, 2010 10:14:46 PM (14 years ago)
Author:
vboxsync
Message:

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

Location:
trunk/src/VBox/Additions/WINNT/Graphics
Files:
2 added
12 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;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk

    r32241 r32496  
    103103        wddm/VBoxVideoShgsmi.cpp \
    104104        wddm/VBoxVideoCm.cpp \
     105        wddm/VBoxVideoMisc.cpp \
    105106        wddm/VBoxVideoWddm.rc
    106107 ifdef VBOXWDDM_WITH_VBVA
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r31873 r32496  
    118118#include <VBox/VBoxVideo.h>
    119119#include "wddm/VBoxVideoIf.h"
     120#include "wddm/VBoxVideoMisc.h"
    120121#include "wddm/VBoxVideoShgsmi.h"
    121122#include "wddm/VBoxVideoCm.h"
     
    308309
    309310   VBOXVIDEOCM_MGR CmMgr;
    310    LIST_ENTRY ContextList3D;
     311   LIST_ENTRY SwapchainList3D;
    311312   /* mutex for context list operations */
    312313   FAST_MUTEX ContextMutex;
     314   KSPIN_LOCK SynchLock;
    313315   volatile uint32_t cContexts3D;
    314316   volatile uint32_t cDMACmdsOutstanding;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoCm.cpp

    r30925 r32496  
    156156    PVBOXVIDEOCM_CMD_DR pHdr = VBOXVIDEOCM_HEAD(pvCmd);
    157157    vboxVideoCmCmdPostByHdr(pHdr->pContext->pSession, pHdr, cbSize);
     158}
     159
     160NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOL bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor)
     161{
     162    PVBOXVIDEOCM_SESSION pSession = pContext->pSession;
     163    PLIST_ENTRY pCurEntry = NULL;
     164    PVBOXVIDEOCM_CMD_DR pHdr;
     165
     166    ExAcquireFastMutex(&pSession->Mutex);
     167
     168    pCurEntry = pSession->CommandsList.Blink;
     169    do
     170    {
     171        if (pCurEntry != &pSession->CommandsList)
     172        {
     173            pHdr = VBOXCMENTRY_2_CMD(pCurEntry);
     174            pCurEntry = pHdr->QueueList.Blink;
     175            if (bEntireSession || pHdr->pContext == pContext)
     176            {
     177                void * pvBody = VBOXVIDEOCM_BODY(pHdr, void);
     178                UINT fRet = pfnVisitor(pHdr->pContext, pvBody, pHdr->CmdHdr.cbCmd, pvVisitor);
     179                if (fRet & VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD)
     180                {
     181                    RemoveEntryList(&pHdr->QueueList);
     182                }
     183                if (!(fRet & VBOXVIDEOCMCMDVISITOR_RETURN_CONTINUE))
     184                    break;
     185            }
     186        }
     187        else
     188        {
     189            break;
     190        }
     191    } while (1);
     192
     193
     194    ExReleaseFastMutex(&pSession->Mutex);
     195
     196    return STATUS_SUCCESS;
    158197}
    159198
     
    447486    return STATUS_SUCCESS;
    448487}
     488
     489VOID vboxVideoCmLock(PVBOXVIDEOCM_CTX pContext)
     490{
     491    ExAcquireFastMutex(&pContext->pSession->Mutex);
     492}
     493
     494VOID vboxVideoCmUnlock(PVBOXVIDEOCM_CTX pContext)
     495{
     496    ExReleaseFastMutex(&pContext->pSession->Mutex);
     497}
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoCm.h

    r30462 r32496  
    4141void vboxVideoCmCmdSubmit(void *pvCmd, uint32_t cbSize);
    4242
     43#define VBOXVIDEOCMCMDVISITOR_RETURN_CONTINUE 0x00000001
     44#define VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD    0x00000002
     45typedef DECLCALLBACK(UINT) FNVBOXVIDEOCMCMDVISITOR(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor);
     46typedef FNVBOXVIDEOCMCMDVISITOR *PFNVBOXVIDEOCMCMDVISITOR;
     47NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOL bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor);
     48
    4349NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd);
     50VOID vboxVideoCmLock(PVBOXVIDEOCM_CTX pContext);
     51VOID vboxVideoCmUnlock(PVBOXVIDEOCM_CTX pContext);
    4452
    4553#endif /* #ifndef ___VBoxVideoCm_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r32425 r32496  
    168168} VBOXWDDM_CREATECONTEXT_INFO, *PVBOXWDDM_CREATECONTEXT_INFO;
    169169
     170typedef void *VBOXDISP_UMHANDLE;
     171typedef uint32_t VBOXDISP_KMHANDLE;
    170172
    171173typedef struct VBOXWDDM_RECTS_FLAFS
     
    214216typedef struct VBOXVIDEOCM_CMD_RECTS_INTERNAL
    215217{
    216     D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
    217     UINT u32Reserved;
     218    union
     219    {
     220        VBOXDISP_UMHANDLE hSwapchainUm;
     221        uint64_t u64Alignment;
     222    };
    218223    VBOXVIDEOCM_CMD_RECTS Cmd;
    219224} VBOXVIDEOCM_CMD_RECTS_INTERNAL, *PVBOXVIDEOCM_CMD_RECTS_INTERNAL;
     
    265270} VBOXDISPIFESCAPE_SCREENLAYOUT, *PVBOXDISPIFESCAPE_SCREENLAYOUT;
    266271
     272typedef struct VBOXSWAPCHAININFO
     273{
     274    VBOXDISP_KMHANDLE hSwapchainKm; /* in, NULL if new is being created */
     275    VBOXDISP_UMHANDLE hSwapchainUm; /* in, UMD private data */
     276    RECT Rect;
     277    UINT u32Reserved;
     278    UINT cAllocs;
     279    D3DKMT_HANDLE ahAllocs[1];
     280}VBOXSWAPCHAININFO, *PVBOXSWAPCHAININFO;
    267281typedef struct VBOXDISPIFESCAPE_SWAPCHAININFO
    268282{
    269283    VBOXDISPIFESCAPE EscapeHdr;
     284    VBOXSWAPCHAININFO SwapchainInfo;
    270285} VBOXDISPIFESCAPE_SWAPCHAININFO, *PVBOXDISPIFESCAPE_SWAPCHAININFO;
    271286
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp

    r32241 r32496  
    307307{
    308308    PVBOXWDDM_CONTEXT pContext = pRectsInfo->pContext;
     309    PVBOXWDDM_SWAPCHAIN pSwapchain = pRectsInfo->pSwapchain;
    309310    PDEVICE_EXTENSION pDevExt = pContext->pDevice->pAdapter;
    310311    PVBOXWDDM_RECTS_INFO pRects = &pRectsInfo->ContextsRects.UpdateRects;
     
    314315    Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
    315316    ExAcquireFastMutex(&pDevExt->ContextMutex);
    316     for (PLIST_ENTRY pCur = pDevExt->ContextList3D.Flink; pCur != &pDevExt->ContextList3D; pCur = pCur->Flink)
    317     {
    318         if (pCur != &pContext->ListEntry)
    319         {
    320             PVBOXWDDM_CONTEXT pCurContext = VBOXWDDMENTRY_2_CONTEXT(pCur);
     317    for (PLIST_ENTRY pCur = pDevExt->SwapchainList3D.Flink; pCur != &pDevExt->SwapchainList3D; pCur = pCur->Flink)
     318    {
     319        if (pCur != &pSwapchain->DevExtListEntry)
     320        {
     321            PVBOXWDDM_SWAPCHAIN pCurSwapchain = VBOXWDDMENTRY_2_SWAPCHAIN(pCur);
    321322            if (!pCmdInternal)
    322323            {
    323                 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pCurContext->CmContext, cbCmdInternal);
     324                pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pCurSwapchain->pContext->CmContext, cbCmdInternal);
    324325                Assert(pCmdInternal);
    325326                if (!pCmdInternal)
     
    331332            else
    332333            {
    333                 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pCurContext->CmContext);
     334                pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pCurSwapchain->pContext->CmContext);
    334335            }
    335336
    336             vboxVdmaDirtyRectsCalcIntersection(&pCurContext->ViewRect, pRects, &pCmdInternal->Cmd.RectsInfo);
     337            vboxVdmaDirtyRectsCalcIntersection(&pCurSwapchain->ViewRect, pRects, &pCmdInternal->Cmd.RectsInfo);
    337338            if (pCmdInternal->Cmd.RectsInfo.cRects)
    338339            {
     
    340341                pCmdInternal->Cmd.fFlags.Value = 0;
    341342                pCmdInternal->Cmd.fFlags.bAddHiddenRects = 1;
    342                 if (pCurContext->pLastReportedRects)
    343                 {
    344                     if (pCurContext->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
     343                if (pCurSwapchain->pLastReportedRects)
     344                {
     345                    if (pCurSwapchain->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
    345346                    {
    346347                        RECT *paPrevRects;
    347348                        uint32_t cPrevRects;
    348                         if (pCurContext->pLastReportedRects->Cmd.fFlags.bSetViewRect)
     349                        if (pCurSwapchain->pLastReportedRects->Cmd.fFlags.bSetViewRect)
    349350                        {
    350                             paPrevRects = &pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects[1];
    351                             cPrevRects = pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
     351                            paPrevRects = &pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.aRects[1];
     352                            cPrevRects = pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
    352353                        }
    353354                        else
    354355                        {
    355                             paPrevRects = &pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects[0];
    356                             cPrevRects = pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects;
     356                            paPrevRects = &pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.aRects[0];
     357                            cPrevRects = pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.cRects;
    357358                        }
    358359
     
    365366                    else
    366367                    {
    367                         Assert(pCurContext->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
    368                         if (!vboxVdmaDirtyRectsIsCover(pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects,
    369                                 pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects,
     368                        Assert(pCurSwapchain->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
     369                        if (!vboxVdmaDirtyRectsIsCover(pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.aRects,
     370                                pCurSwapchain->pLastReportedRects->Cmd.RectsInfo.cRects,
    370371                                pCmdInternal->Cmd.RectsInfo.aRects, pCmdInternal->Cmd.RectsInfo.cRects))
    371372                        {
     
    379380                if (bSend)
    380381                {
    381                     if (pCurContext->pLastReportedRects)
    382                         vboxVideoCmCmdRelease(pCurContext->pLastReportedRects);
    383 
    384                     pCmdInternal->VidPnSourceId = pRectsInfo->VidPnSourceId;
     382                    if (pCurSwapchain->pLastReportedRects)
     383                        vboxVideoCmCmdRelease(pCurSwapchain->pLastReportedRects);
     384
     385                    pCmdInternal->hSwapchainUm = pCurSwapchain->hSwapchainUm;
    385386
    386387                    vboxVideoCmCmdRetain(pCmdInternal);
    387                     pCurContext->pLastReportedRects = pCmdInternal;
     388                    pCurSwapchain->pLastReportedRects = pCmdInternal;
    388389                    vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects));
    389390                    pCmdInternal = NULL;
     
    394395        {
    395396            RECT * pContextRect = &pRectsInfo->ContextsRects.ContextRect;
    396             bool bRectShanged = (pContext->ViewRect.left != pContextRect->left
    397                     || pContext->ViewRect.top != pContextRect->top
    398                     || pContext->ViewRect.right != pContextRect->right
    399                     || pContext->ViewRect.bottom != pContextRect->bottom);
     397            bool bRectShanged = (pSwapchain->ViewRect.left != pContextRect->left
     398                    || pSwapchain->ViewRect.top != pContextRect->top
     399                    || pSwapchain->ViewRect.right != pContextRect->right
     400                    || pSwapchain->ViewRect.bottom != pContextRect->bottom);
    400401            PVBOXVIDEOCM_CMD_RECTS_INTERNAL pDrCmdInternal;
    401402
     
    416417                pDrCmdInternal->Cmd.fFlags.bSetViewRect = 1;
    417418                pDrCmdInternal->Cmd.RectsInfo.aRects[0] = *pContextRect;
    418                 pContext->ViewRect = *pContextRect;
     419                pSwapchain->ViewRect = *pContextRect;
    419420                memcpy(&pDrCmdInternal->Cmd.RectsInfo.aRects[1], pRects->aRects, sizeof (RECT) * pRects->cRects);
    420421                bSend = true;
     
    441442                memcpy(&pDrCmdInternal->Cmd.RectsInfo.aRects[0], pRects->aRects, sizeof (RECT) * pRects->cRects);
    442443
    443                 if (pContext->pLastReportedRects)
    444                 {
    445                     if (pContext->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
     444                if (pSwapchain->pLastReportedRects)
     445                {
     446                    if (pSwapchain->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
    446447                    {
    447448                        RECT *paRects;
    448449                        uint32_t cRects;
    449                         if (pContext->pLastReportedRects->Cmd.fFlags.bSetViewRect)
     450                        if (pSwapchain->pLastReportedRects->Cmd.fFlags.bSetViewRect)
    450451                        {
    451                             paRects = &pContext->pLastReportedRects->Cmd.RectsInfo.aRects[1];
    452                             cRects = pContext->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
     452                            paRects = &pSwapchain->pLastReportedRects->Cmd.RectsInfo.aRects[1];
     453                            cRects = pSwapchain->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
    453454                        }
    454455                        else
    455456                        {
    456                             paRects = &pContext->pLastReportedRects->Cmd.RectsInfo.aRects[0];
    457                             cRects = pContext->pLastReportedRects->Cmd.RectsInfo.cRects;
     457                            paRects = &pSwapchain->pLastReportedRects->Cmd.RectsInfo.aRects[0];
     458                            cRects = pSwapchain->pLastReportedRects->Cmd.RectsInfo.cRects;
    458459                        }
    459460                        bSend = (pDrCmdInternal->Cmd.RectsInfo.cRects != cRects)
     
    462463                    else
    463464                    {
    464                         Assert(pContext->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
     465                        Assert(pSwapchain->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
    465466                        bSend = true;
    466467                    }
     
    474475            if (bSend)
    475476            {
    476                 if (pContext->pLastReportedRects)
    477                     vboxVideoCmCmdRelease(pContext->pLastReportedRects);
     477                if (pSwapchain->pLastReportedRects)
     478                    vboxVideoCmCmdRelease(pSwapchain->pLastReportedRects);
    478479
    479480                pDrCmdInternal->Cmd.fFlags.bSetVisibleRects = 1;
    480                 pDrCmdInternal->VidPnSourceId = pRectsInfo->VidPnSourceId;
     481                pDrCmdInternal->hSwapchainUm = pSwapchain->hSwapchainUm;
    481482
    482483                vboxVideoCmCmdRetain(pDrCmdInternal);
    483                 pContext->pLastReportedRects = pDrCmdInternal;
     484                pSwapchain->pLastReportedRects = pDrCmdInternal;
    484485                vboxVideoCmCmdSubmit(pDrCmdInternal, VBOXVIDEOCM_SUBMITSIZE_DEFAULT);
    485486            }
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h

    r32241 r32496  
    7979    VBOXVDMAPIPE_CMD_DR Hdr;
    8080    struct VBOXWDDM_CONTEXT *pContext;
    81     D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     81    struct VBOXWDDM_SWAPCHAIN *pSwapchain;
    8282    VBOXVDMAPIPE_RECTS ContextsRects;
    8383} VBOXVDMAPIPE_CMD_RECTSINFO, *PVBOXVDMAPIPE_CMD_RECTSINFO;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r32325 r32496  
    635635#endif
    636636                    vboxVideoCmInit(&pContext->CmMgr);
    637                     InitializeListHead(&pContext->ContextList3D);
     637                    InitializeListHead(&pContext->SwapchainList3D);
    638638                    pContext->cContexts3D = 0;
    639639                    ExInitializeFastMutex(&pContext->ContextMutex);
     640                    KeInitializeSpinLock(&pContext->SynchLock);
    640641                }
    641642                else
     
    14721473    }
    14731474
     1475    PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAllocation);
     1476    if (pSwapchain)
     1477    {
     1478        vboxWddmSwapchainAllocRemove(pDevExt, pSwapchain, pAllocation);
     1479        vboxWddmSwapchainRelease(pSwapchain);
     1480    }
     1481
    14741482    vboxWddmAllocationDeleteFromResource(pAllocation->pResource, pAllocation);
    14751483
     
    20932101}
    20942102
    2095 static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
    2096 {
     2103static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAlloc, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
     2104{
     2105    PVBOXWDDM_SWAPCHAIN pSwapchain;
     2106    if (pAlloc)
     2107    {
     2108        pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc);
     2109        if (!pSwapchain)
     2110            return;
     2111    }
     2112    else
     2113    {
     2114        pSwapchain = NULL;
     2115    }
     2116
    20972117    PVBOXVDMAPIPE_CMD_RECTSINFO pRectsCmd = (PVBOXVDMAPIPE_CMD_RECTSINFO)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_RECTSINFO, RT_OFFSETOF(VBOXVDMAPIPE_CMD_RECTSINFO, ContextsRects.UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
    20982118    Assert(pRectsCmd);
     
    21022122        VBOXWDDM_CONTEXT *pContext = pBlt->Hdr.pContext;
    21032123        pRectsCmd->pContext = pContext;
    2104         pRectsCmd->VidPnSourceId = pBlt->Hdr.SrcAllocInfo.srcId;
     2124        pRectsCmd->pSwapchain = pSwapchain;
    21052125        memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
    21062126        vboxWddmRectTranslate(&pRectsCmd->ContextsRects.ContextRect, pSource->VScreenPos.x, pSource->VScreenPos.y);
     
    22162236                                    VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
    22172237                                }
    2218                                 vboxWddmSubmitBltCmd(pDevExt, pBlt);
     2238                                vboxWddmSubmitBltCmd(pDevExt, NULL, pBlt);
    22192239                                break;
    22202240                            }
     
    22252245                                if (pSrcAlloc->fRcFlags.RenderTarget)
    22262246                                {
    2227                                     vboxWddmSubmitBltCmd(pDevExt, pBlt);
     2247                                    vboxWddmSubmitBltCmd(pDevExt, pSrcAlloc, pBlt);
    22282248                                }
    22292249                                break;
     
    22632283            VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
    22642284            PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2265             PVBOXVDMAPIPE_CMD_RECTSINFO pRectsCmd = (PVBOXVDMAPIPE_CMD_RECTSINFO)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_RECTSINFO, RT_OFFSETOF(VBOXVDMAPIPE_CMD_RECTSINFO, ContextsRects.UpdateRects.aRects[1]));
    2266             Assert(pRectsCmd);
    2267             if (pRectsCmd)
    2268             {
    2269                 PVBOXWDDM_ALLOCATION pAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    2270                 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    2271                 pRectsCmd->pContext = pContext;
    2272                 pRectsCmd->VidPnSourceId = pPrivateData->SrcAllocInfo.srcId;
    2273                 RECT r;
    2274                 r.left = pSource->VScreenPos.x;
    2275                 r.top = pSource->VScreenPos.y;
    2276                 r.right = pAlloc->SurfDesc.width + pSource->VScreenPos.x;
    2277                 r.bottom = pAlloc->SurfDesc.height + pSource->VScreenPos.y;
    2278                 pRectsCmd->ContextsRects.ContextRect = r;
    2279                 pRectsCmd->ContextsRects.UpdateRects.cRects = 1;
    2280                 pRectsCmd->ContextsRects.UpdateRects.aRects[0] = r;
    2281                 NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
    2282                 Assert(tmpStatus == STATUS_SUCCESS);
    2283                 if (tmpStatus != STATUS_SUCCESS)
    2284                     vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
    2285             }
    2286 
     2285            PVBOXWDDM_ALLOCATION pAlloc = pPrivateData->SrcAllocInfo.pAlloc;
     2286            PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc);
     2287            if (pSwapchain)
     2288            {
     2289                do
     2290                {
     2291                    PVBOXVDMAPIPE_CMD_RECTSINFO pRectsCmd = (PVBOXVDMAPIPE_CMD_RECTSINFO)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_RECTSINFO, RT_OFFSETOF(VBOXVDMAPIPE_CMD_RECTSINFO, ContextsRects.UpdateRects.aRects[1]));
     2292                    Assert(pRectsCmd);
     2293                    if (pRectsCmd)
     2294                    {
     2295
     2296                        VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
     2297                        pRectsCmd->pContext = pContext;
     2298                        pRectsCmd->pSwapchain = pSwapchain;
     2299                        RECT r;
     2300                        r.left = pSource->VScreenPos.x;
     2301                        r.top = pSource->VScreenPos.y;
     2302                        r.right = pAlloc->SurfDesc.width + pSource->VScreenPos.x;
     2303                        r.bottom = pAlloc->SurfDesc.height + pSource->VScreenPos.y;
     2304                        pRectsCmd->ContextsRects.ContextRect = r;
     2305                        pRectsCmd->ContextsRects.UpdateRects.cRects = 1;
     2306                        pRectsCmd->ContextsRects.UpdateRects.aRects[0] = r;
     2307                        NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
     2308                        Assert(tmpStatus == STATUS_SUCCESS);
     2309                        if (tmpStatus == STATUS_SUCCESS)
     2310                            break;
     2311                        vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
     2312                    }
     2313                    vboxWddmSwapchainRelease(pSwapchain);
     2314                } while (0);
     2315            }
    22872316            Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pPrivateData->pContext, pSubmitCommand->SubmissionFenceId);
    22882317            break;
     
    29412970                    Status = STATUS_INVALID_PARAMETER;
    29422971                }
     2972            }
     2973            case VBOXESC_SWAPCHAININFO:
     2974            {
     2975                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
     2976                Status = vboxWddmSwapchainCtxEscape(pDevExt, pContext, (PVBOXDISPIFESCAPE_SWAPCHAININFO)pEscapeHdr, pEscape->PrivateDriverDataSize);
     2977                Assert(Status == STATUS_SUCCESS);
     2978                break;
    29432979            }
    29442980            case VBOXESC_REINITVIDEOMODES:
     
    44554491    if (pContext)
    44564492    {
    4457         InitializeListHead(&pContext->ListEntry);
    44584493        pContext->pDevice = pDevice;
    44594494        pContext->hContext = pCreateContext->hContext;
     
    44784513                if (pInfo->u32IsD3D)
    44794514                {
    4480                     pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D;
    4481                     Status = vboxVideoCmCtxAdd(&pDevice->pAdapter->CmMgr, &pContext->CmContext, (HANDLE)pInfo->hUmEvent, pInfo->u64UmInfo);
     4515                    ExInitializeFastMutex(&pContext->SwapchainMutex);
     4516                    Status = vboxWddmHTableCreate(&pContext->Swapchains, 4);
    44824517                    Assert(Status == STATUS_SUCCESS);
    44834518                    if (Status == STATUS_SUCCESS)
    44844519                    {
    4485                         Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
    4486                         ExAcquireFastMutex(&pDevExt->ContextMutex);
    4487                         InsertHeadList(&pDevExt->ContextList3D, &pContext->ListEntry);
    4488                         ASMAtomicIncU32(&pDevExt->cContexts3D);
    4489                         ExReleaseFastMutex(&pDevExt->ContextMutex);
     4520                        pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D;
     4521                        Status = vboxVideoCmCtxAdd(&pDevice->pAdapter->CmMgr, &pContext->CmContext, (HANDLE)pInfo->hUmEvent, pInfo->u64UmInfo);
     4522                        Assert(Status == STATUS_SUCCESS);
     4523                        if (Status == STATUS_SUCCESS)
     4524                        {
     4525//                            Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
     4526//                            ExAcquireFastMutex(&pDevExt->ContextMutex);
     4527                            ASMAtomicIncU32(&pDevExt->cContexts3D);
     4528//                            ExReleaseFastMutex(&pDevExt->ContextMutex);
     4529                        }
     4530                        else
     4531                        {
     4532                            vboxWddmHTableDestroy(&pContext->Swapchains);
     4533                        }
    44904534                    }
    44914535                }
     
    45334577    {
    45344578        Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
    4535         ExAcquireFastMutex(&pDevExt->ContextMutex);
    4536         RemoveEntryList(&pContext->ListEntry);
     4579//        ExAcquireFastMutex(&pDevExt->ContextMutex);
     4580//        RemoveEntryList(&pContext->ListEntry);
    45374581        uint32_t cContexts = ASMAtomicDecU32(&pDevExt->cContexts3D);
    4538         ExReleaseFastMutex(&pDevExt->ContextMutex);
     4582//        ExReleaseFastMutex(&pDevExt->ContextMutex);
    45394583        Assert(cContexts < UINT32_MAX/2);
    4540     }
    4541 
    4542     if (pContext->pLastReportedRects)
    4543     {
    4544         vboxVideoCmCmdRelease(pContext->pLastReportedRects);
    4545         pContext->pLastReportedRects = NULL;
    45464584    }
    45474585
     
    45494587    Assert(Status == STATUS_SUCCESS);
    45504588    if (Status == STATUS_SUCCESS)
     4589    {
     4590        vboxWddmSwapchainCtxDestroyAll(pDevExt, pContext);
    45514591        vboxWddmMemFree(pContext);
     4592    }
    45524593
    45534594    dfprintf(("<== "__FUNCTION__ ", hContext(0x%x)\n", hContext));
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h

    r32241 r32496  
    6464typedef struct VBOXWDDM_ALLOCATION
    6565{
     66    LIST_ENTRY SwapchainEntry;
     67    struct VBOXWDDM_SWAPCHAIN *pSwapchain;
    6668    VBOXWDDM_ALLOC_TYPE enmType;
    6769//    VBOXWDDM_ALLOCUSAGE_TYPE enmCurrentUsage;
     
    124126typedef enum
    125127{
     128    VBOXWDDM_OBJSTATE_TYPE_UNKNOWN = 0,
     129    VBOXWDDM_OBJSTATE_TYPE_INITIALIZED,
     130    VBOXWDDM_OBJSTATE_TYPE_TERMINATED
     131} VBOXWDDM_OBJSTATE_TYPE;
     132typedef struct VBOXWDDM_SWAPCHAIN
     133{
     134    LIST_ENTRY DevExtListEntry;
     135    LIST_ENTRY AllocList;
     136    struct VBOXWDDM_CONTEXT *pContext;
     137    RECT ViewRect;
     138    VBOXWDDM_OBJSTATE_TYPE enmState;
     139    volatile uint32_t cRefs;
     140    VBOXDISP_UMHANDLE hSwapchainUm;
     141    VBOXDISP_KMHANDLE hSwapchainKm;
     142    PVBOXVIDEOCM_CMD_RECTS_INTERNAL pLastReportedRects;
     143}VBOXWDDM_SWAPCHAIN, *PVBOXWDDM_SWAPCHAIN;
     144
     145typedef enum
     146{
    126147    VBOXWDDM_CONTEXT_TYPE_UNDEFINED = 0,
    127148    VBOXWDDM_CONTEXT_TYPE_SYSTEM,
     
    132153typedef struct VBOXWDDM_CONTEXT
    133154{
    134     LIST_ENTRY ListEntry;
     155//    LIST_ENTRY ListEntry;
    135156    struct VBOXWDDM_DEVICE * pDevice;
    136157    HANDLE hContext;
     
    139160    UINT  EngineAffinity;
    140161    UINT uLastCompletedCmdFenceId;
    141     RECT ViewRect;
    142     PVBOXVIDEOCM_CMD_RECTS_INTERNAL pLastReportedRects;
     162    FAST_MUTEX SwapchainMutex;
     163    VBOXWDDM_HTABLE Swapchains;
    143164    VBOXVIDEOCM_CTX CmContext;
    144165} VBOXWDDM_CONTEXT, *PVBOXWDDM_CONTEXT;
    145166
    146 #define VBOXWDDMENTRY_2_CONTEXT(_pE) ((PVBOXWDDM_CONTEXT)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_CONTEXT, ListEntry)))
     167#define VBOXWDDMENTRY_2_SWAPCHAIN(_pE) ((PVBOXWDDM_SWAPCHAIN)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXWDDM_SWAPCHAIN, DevExtListEntry)))
    147168
    148169typedef struct VBOXWDDM_DMA_ALLOCINFO
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