VirtualBox

Ignore:
Timestamp:
Sep 29, 2010 4:50:53 PM (14 years ago)
Author:
vboxsync
Message:

wddm/2d: 2D video accel support fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r32766 r32823  
    578578                    *NumberOfChildren = pContext->u.primary.cDisplays;
    579579                    dprintf(("VBoxVideoWddm: sources(%d), children(%d)\n", *NumberOfVideoPresentSources, *NumberOfChildren));
    580 #ifdef VBOX_WITH_VIDEOHWACCEL
    581                     vboxVhwaInit(pContext);
    582 #endif
     580
     581                    vboxVdmaDdiQueueInit(pContext, &pContext->DdiCmdQueue);
    583582                    vboxVideoCmInit(&pContext->CmMgr);
    584583                    InitializeListHead(&pContext->SwapchainList3D);
     
    586585                    ExInitializeFastMutex(&pContext->ContextMutex);
    587586                    KeInitializeSpinLock(&pContext->SynchLock);
     587
     588#ifdef VBOX_WITH_VIDEOHWACCEL
     589                    vboxVhwaInit(pContext);
     590#endif
    588591                }
    589592                else
     
    907910    VBOXSHGSMILIST VhwaCmdList;
    908911#endif
     912    LIST_ENTRY CompletedDdiCmdQueue;
    909913    BOOL bNotifyDpc;
    910914} VBOXWDDM_DPCDATA, *PVBOXWDDM_DPCDATA;
     
    927931    vboxSHGSMIListDetach2List(&pdc->pDevExt->VhwaCmdList, &pdc->data.VhwaCmdList);
    928932#endif
     933    vboxVdmaDdiCmdGetCompletedListIsr(&pdc->pDevExt->DdiCmdQueue, &pdc->data.CompletedDdiCmdQueue);
     934
    929935    pdc->data.bNotifyDpc = pdc->pDevExt->bNotifyDxDpc;
    930936    pdc->pDevExt->bNotifyDxDpc = FALSE;
     
    974980    }
    975981#endif
     982
     983    vboxVdmaDdiCmdHandleCompletedList(pDevExt, &pDevExt->DdiCmdQueue, &context.data.CompletedDdiCmdQueue);
    976984
    977985    if (context.data.bNotifyDpc)
     
    18871895        {
    18881896            case VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY:
    1889             case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    1890             {
    1891                 VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
     1897            {
     1898                PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY pS2P = (PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY)pPrivateDataBase;
    18921899                Assert(pPatch->PatchLocationListSubmissionLength == 2);
    18931900                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
     
    18961903                const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    18971904                Assert(pSrcAllocationList->SegmentId);
    1898                 pPrivateData->SrcAllocInfo.segmentIdAlloc = pSrcAllocationList->SegmentId;
    1899                 pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
     1905                pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc = pSrcAllocationList->SegmentId;
     1906                pS2P->Shadow2Primary.ShadowAlloc.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
     1907//
     1908//                pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart + 1];
     1909//                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_DESTINATION_INDEX);
     1910//                Assert(pPatchList->PatchOffset == 4);
     1911//                const DXGK_ALLOCATIONLIST *pDstAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
     1912//                Assert(pDstAllocationList->SegmentId);
     1913//                pPrivateData->DstAllocInfo.segmentIdAlloc = pDstAllocationList->SegmentId;
     1914//                pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
     1915                break;
     1916            }
     1917            case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
     1918            {
     1919                PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pPrivateDataBase;
     1920                Assert(pPatch->PatchLocationListSubmissionLength == 2);
     1921                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
     1922                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX);
     1923                Assert(pPatchList->PatchOffset == 0);
     1924                const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
     1925                Assert(pSrcAllocationList->SegmentId);
     1926                pBlt->Blt.SrcAlloc.segmentIdAlloc = pSrcAllocationList->SegmentId;
     1927                pBlt->Blt.SrcAlloc.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
    19001928
    19011929                pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart + 1];
     
    19041932                const DXGK_ALLOCATIONLIST *pDstAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    19051933                Assert(pDstAllocationList->SegmentId);
    1906                 pPrivateData->DstAllocInfo.segmentIdAlloc = pDstAllocationList->SegmentId;
    1907                 pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
     1934                pBlt->Blt.DstAlloc.segmentIdAlloc = pDstAllocationList->SegmentId;
     1935                pBlt->Blt.DstAlloc.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
    19081936                break;
    19091937            }
    19101938            case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
    19111939            {
    1912                 VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
     1940                PVBOXWDDM_DMA_PRIVATEDATA_FLIP pFlip = (PVBOXWDDM_DMA_PRIVATEDATA_FLIP)pPrivateDataBase;
    19131941                Assert(pPatch->PatchLocationListSubmissionLength == 1);
    19141942                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
     
    19171945                const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    19181946                Assert(pSrcAllocationList->SegmentId);
    1919                 pPrivateData->SrcAllocInfo.segmentIdAlloc = pSrcAllocationList->SegmentId;
    1920                 pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
     1947                pFlip->Flip.Alloc.segmentIdAlloc = pSrcAllocationList->SegmentId;
     1948                pFlip->Flip.Alloc.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
    19211949                break;
    19221950            }
    19231951            case VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL:
    19241952            {
    1925                 VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
     1953                PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase;
    19261954                Assert(pPatch->PatchLocationListSubmissionLength == 1);
    19271955                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
     
    19301958                const DXGK_ALLOCATIONLIST *pDstAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    19311959                Assert(pDstAllocationList->SegmentId);
    1932                 pPrivateData->DstAllocInfo.segmentIdAlloc = pDstAllocationList->SegmentId;
    1933                 pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
     1960                pCF->ClrFill.Alloc.segmentIdAlloc = pDstAllocationList->SegmentId;
     1961                pCF->ClrFill.Alloc.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
    19341962                break;
    19351963            }
     
    19752003}
    19762004
    1977 typedef struct VBOXWDDM_SHADOW_UPDATE_COMPLETION
    1978 {
    1979     PDEVICE_EXTENSION pDevExt;
    1980     PVBOXWDDM_CONTEXT pContext;
    1981     UINT SubmissionFenceId;
    1982 } VBOXWDDM_SHADOW_UPDATE_COMPLETION, *PVBOXWDDM_SHADOW_UPDATE_COMPLETION;
    1983 
    1984 BOOLEAN vboxWddmNotifyShadowUpdateCompletion(PVOID Context)
    1985 {
    1986     PVBOXWDDM_SHADOW_UPDATE_COMPLETION pdc = (PVBOXWDDM_SHADOW_UPDATE_COMPLETION)Context;
    1987     PDEVICE_EXTENSION pDevExt = pdc->pDevExt;
    1988     DXGKARGCB_NOTIFY_INTERRUPT_DATA notify;
    1989     memset(&notify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA));
    1990 
    1991     notify.InterruptType = DXGK_INTERRUPT_DMA_COMPLETED;
    1992     notify.DmaCompleted.SubmissionFenceId = pdc->SubmissionFenceId;
    1993     notify.DmaCompleted.NodeOrdinal = pdc->pContext->NodeOrdinal;
    1994     notify.DmaCompleted.EngineOrdinal = 0;
    1995 
    1996     pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, &notify);
    1997 
    1998     pDevExt->bNotifyDxDpc = TRUE;
    1999     BOOLEAN bDpcQueued = pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
    2000     Assert(bDpcQueued);
    2001 
    2002     return bDpcQueued;
    2003 }
    2004 
    2005 NTSTATUS vboxWddmDmaCmdNotifyCompletion(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, UINT SubmissionFenceId)
    2006 {
    2007     VBOXWDDM_SHADOW_UPDATE_COMPLETION context;
    2008     context.pDevExt = pDevExt;
    2009     context.pContext = pContext;
    2010     context.SubmissionFenceId = SubmissionFenceId;
    2011     BOOLEAN bRet;
    2012     NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution(
    2013             pDevExt->u.primary.DxgkInterface.DeviceHandle,
    2014             vboxWddmNotifyShadowUpdateCompletion,
    2015             &context,
    2016             0, /* IN ULONG MessageNumber */
    2017             &bRet);
    2018     Assert(Status == STATUS_SUCCESS);
    2019     return Status;
    2020 }
    2021 
    20222005typedef struct VBOXWDDM_CALL_ISR
    20232006{
     
    20482031}
    20492032
    2050 static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAlloc, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
    2051 {
    2052     PVBOXWDDM_SWAPCHAIN pSwapchain;
    2053     if (pAlloc)
    2054     {
    2055         pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc);
    2056         if (!pSwapchain)
    2057             return;
     2033static NTSTATUS vboxWddmSubmitCmd(PDEVICE_EXTENSION pDevExt, VBOXVDMAPIPE_CMD_DMACMD *pCmd)
     2034{
     2035    NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, &pDevExt->DdiCmdQueue, &pCmd->DdiCmd);
     2036    Assert(Status == STATUS_SUCCESS);
     2037    if (Status == STATUS_SUCCESS)
     2038    {
     2039        if (pCmd->fFlags.bDecVBVAUnlock)
     2040        {
     2041            uint32_t cNew = ASMAtomicIncU32(&pDevExt->cUnlockedVBVADisabled);
     2042            Assert(cNew < UINT32_MAX/2);
     2043        }
     2044        NTSTATUS submStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pCmd->Hdr);
     2045        Assert(submStatus == STATUS_SUCCESS);
     2046        if (submStatus != STATUS_SUCCESS)
     2047        {
     2048            if (pCmd->fFlags.bDecVBVAUnlock)
     2049            {
     2050                uint32_t cNew = ASMAtomicDecU32(&pDevExt->cUnlockedVBVADisabled);
     2051                Assert(cNew < UINT32_MAX/2);
     2052            }
     2053            vboxVdmaDdiCmdCompleted(pDevExt, &pDevExt->DdiCmdQueue, &pCmd->DdiCmd);
     2054        }
    20582055    }
    20592056    else
    20602057    {
    2061         pSwapchain = NULL;
    2062     }
    2063 
    2064     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]));
    2065     Assert(pRectsCmd);
    2066     if (pRectsCmd)
    2067     {
    2068         VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Hdr.DstAllocInfo.srcId];
    2069         VBOXWDDM_CONTEXT *pContext = pBlt->Hdr.pContext;
    2070         pRectsCmd->pContext = pContext;
    2071         pRectsCmd->pSwapchain = pSwapchain;
    2072         memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
    2073         vboxWddmRectTranslate(&pRectsCmd->ContextsRects.ContextRect, pSource->VScreenPos.x, pSource->VScreenPos.y);
    2074         for (UINT i = 0; i < pRectsCmd->ContextsRects.UpdateRects.cRects; ++i)
    2075         {
    2076             vboxWddmRectTranslate(&pRectsCmd->ContextsRects.UpdateRects.aRects[i], pSource->VScreenPos.x, pSource->VScreenPos.y);
    2077         }
    2078         NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
    2079         Assert(tmpStatus == STATUS_SUCCESS);
    2080         if (tmpStatus != STATUS_SUCCESS)
    2081             vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
    2082     }
     2058        vboxVdmaGgCmdDestroy(&pCmd->Hdr);
     2059    }
     2060    return Status;
     2061}
     2062
     2063static NTSTATUS vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, VBOXWDDM_CONTEXT *pContext, UINT u32FenceId, PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt, VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags)
     2064{
     2065    NTSTATUS Status = STATUS_SUCCESS;
     2066
     2067    PVBOXVDMAPIPE_CMD_DMACMD_BLT pBltCmd = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_DMACMD, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_BLT, Blt.DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));
     2068    Assert(pBltCmd);
     2069    if (pBltCmd)
     2070    {
     2071        VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Blt.DstAlloc.srcId];
     2072        vboxVdmaDdiCmdInit(&pBltCmd->Hdr.DdiCmd, u32FenceId, pContext, vboxVdmaGgDdiCmdDestroy, pBltCmd);
     2073        pBltCmd->Hdr.pDevExt = pDevExt;
     2074        pBltCmd->Hdr.fFlags = fBltFlags;
     2075        pBltCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
     2076        memcpy(&pBltCmd->Blt, &pBlt->Blt, RT_OFFSETOF(VBOXVDMA_BLT, DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));
     2077        vboxWddmSubmitCmd(pDevExt, &pBltCmd->Hdr);
     2078    }
     2079    else
     2080    {
     2081        Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, u32FenceId);
     2082    }
     2083
     2084    return Status;
    20832085}
    20842086
     
    20972099
    20982100    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
     2101    PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
     2102    Assert(pContext);
     2103    Assert(pContext->pDevice);
     2104    Assert(pContext->pDevice->pAdapter == pDevExt);
    20992105    Assert(!pSubmitCommand->DmaBufferSegmentId);
    21002106
     
    21182124        case VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY:
    21192125        {
    2120             VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
    2121             VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    2122             PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
    2123             PVBOXWDDM_ALLOCATION pSrcAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    2124             vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
    2125             vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pDstAlloc->SurfDesc.VidPnSourceId,
    2126                     pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    2127             PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
    2128             uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
    2129             if (!cDMACmdsOutstanding)
    2130                 VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &pRFS->rect);
     2126            PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY pS2P = (PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY)pPrivateDataBase;
     2127            VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pS2P->Shadow2Primary.VidPnSourceId];
     2128            PVBOXWDDM_ALLOCATION pSrcAlloc = pS2P->Shadow2Primary.ShadowAlloc.pAlloc;
     2129            vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pS2P->Shadow2Primary.VidPnSourceId);
     2130            vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pS2P->Shadow2Primary.VidPnSourceId,
     2131                    pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc, pS2P->Shadow2Primary.ShadowAlloc.offAlloc);
     2132            uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
     2133            if (!cUnlockedVBVADisabled)
     2134                VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &pS2P->Shadow2Primary.SrcRect);
    21312135            else
    21322136            {
    21332137                Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
    2134                 VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &pRFS->rect);
     2138                VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &pS2P->Shadow2Primary.SrcRect);
    21352139            }
    21362140            /* get DPC data at IRQL */
    21372141
    2138             Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pPrivateData->pContext, pSubmitCommand->SubmissionFenceId);
     2142            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
    21392143            break;
    21402144        }
     
    21432147        {
    21442148            VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
    2145             PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2146             Assert(pContext);
    2147             Assert(pContext->pDevice);
    2148             Assert(pContext->pDevice->pAdapter == pDevExt);
    2149             PVBOXWDDM_DMA_PRESENT_BLT pBlt = (PVBOXWDDM_DMA_PRESENT_BLT)pPrivateData;
    2150             PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
    2151             PVBOXWDDM_ALLOCATION pSrcAlloc = pPrivateData->SrcAllocInfo.pAlloc;
     2149            PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pPrivateData;
     2150            PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc;
     2151            PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc;
    21522152            uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
     2153            BOOLEAN bComplete = TRUE;
    21532154            switch (pDstAlloc->enmType)
    21542155            {
     
    21582159                    if (pDstAlloc->bAssigned)
    21592160                    {
    2160                         VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->DstAllocInfo.srcId];
     2161                        VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->SurfDesc.VidPnSourceId];
    21612162                        Assert(pSource->pPrimaryAllocation == pDstAlloc);
    21622163                        switch (pSrcAlloc->enmType)
     
    21642165                            case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
    21652166                            {
    2166                                 RECT rect;
     2167                                VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags;
     2168                                fBltFlags.Value = 0;
     2169                                fBltFlags.b3DRelated = !!cContexts3D;
    21672170                                Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
    21682171                                vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
    21692172                                vboxWddmCheckUpdateShadowAddress(pDevExt, pSource,
    2170                                         pDstAlloc->SurfDesc.VidPnSourceId, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    2171                                 if (pBlt->DstRects.UpdateRects.cRects)
     2173                                        pDstAlloc->SurfDesc.VidPnSourceId, pBlt->Blt.SrcAlloc.segmentIdAlloc, pBlt->Blt.SrcAlloc.offAlloc);
     2174                                if (vboxVhwaHlpOverlayListIsEmpty(pDevExt, pDstAlloc->SurfDesc.VidPnSourceId))
    21722175                                {
    2173                                     rect = pBlt->DstRects.UpdateRects.aRects[0];
    2174                                     for (UINT i = 1; i < pBlt->DstRects.UpdateRects.cRects; ++i)
     2176                                    RECT rect;
     2177                                    if (pBlt->Blt.DstRects.UpdateRects.cRects)
    21752178                                    {
    2176                                         vboxWddmRectUnited(&rect, &rect, &pBlt->DstRects.UpdateRects.aRects[i]);
     2179                                        rect = pBlt->Blt.DstRects.UpdateRects.aRects[0];
     2180                                        for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i)
     2181                                        {
     2182                                            vboxWddmRectUnited(&rect, &rect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]);
     2183                                        }
     2184                                    }
     2185                                    else
     2186                                        rect = pBlt->Blt.DstRects.ContextRect;
     2187
     2188                                    uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
     2189                                    if (!cUnlockedVBVADisabled)
     2190                                        VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &rect);
     2191                                    else
     2192                                    {
     2193                                        Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
     2194                                        VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
    21772195                                    }
    21782196                                }
    21792197                                else
    2180                                     rect = pBlt->DstRects.ContextRect;
    2181 
    2182                                 uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
    2183                                 if (!cDMACmdsOutstanding)
    2184                                     VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &rect);
    2185                                 else
    21862198                                {
    2187                                     Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
    2188                                     VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
     2199                                    fBltFlags.b2DRelated = 1;
     2200                                    fBltFlags.bDecVBVAUnlock = 1;
    21892201                                }
    2190                                 vboxWddmSubmitBltCmd(pDevExt, NULL, pBlt);
     2202
     2203                                if (fBltFlags.Value)
     2204                                {
     2205                                    Status = vboxWddmSubmitBltCmd(pDevExt, pContext, pSubmitCommand->SubmissionFenceId, pBlt, fBltFlags);
     2206                                    bComplete = FALSE;
     2207                                }
    21912208                                break;
    21922209                            }
     
    21972214                                if (pSrcAlloc->fRcFlags.RenderTarget)
    21982215                                {
    2199                                     vboxWddmSubmitBltCmd(pDevExt, pSrcAlloc, pBlt);
     2216                                    VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags;
     2217                                    fBltFlags.Value = 0;
     2218                                    fBltFlags.b3DRelated = 1;
     2219                                    Status = vboxWddmSubmitBltCmd(pDevExt, pContext, pSubmitCommand->SubmissionFenceId, pBlt, fBltFlags);
     2220                                    bComplete = FALSE;
    22002221                                }
    22012222                                break;
     
    22132234                    Assert(pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC);
    22142235                    Assert(pSrcAlloc->fRcFlags.RenderTarget);
    2215                     Assert(vboxWddmRectIsEqual(&pBlt->SrcRect, &pBlt->DstRects.ContextRect));
    2216                     Assert(pBlt->DstRects.UpdateRects.cRects == 1);
    2217                     Assert(vboxWddmRectIsEqual(&pBlt->SrcRect, pBlt->DstRects.UpdateRects.aRects));
     2236                    Assert(vboxWddmRectIsEqual(&pBlt->Blt.SrcRect, &pBlt->Blt.DstRects.ContextRect));
     2237                    Assert(pBlt->Blt.DstRects.UpdateRects.cRects == 1);
     2238                    Assert(vboxWddmRectIsEqual(&pBlt->Blt.SrcRect, pBlt->Blt.DstRects.UpdateRects.aRects));
    22182239                    break;
    22192240                }
     
    22282249            }
    22292250
    2230             Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pPrivateData->pContext, pSubmitCommand->SubmissionFenceId);
     2251            if (bComplete)
     2252            {
     2253                Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
     2254            }
    22312255            break;
    22322256        }
    22332257        case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
    22342258        {
    2235             VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
    2236             PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2237             PVBOXWDDM_ALLOCATION pAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    2238             PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc);
    2239             if (pSwapchain)
    2240             {
    2241                 do
    2242                 {
    2243                     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]));
    2244                     Assert(pRectsCmd);
    2245                     if (pRectsCmd)
    2246                     {
    2247 
    2248                         VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    2249                         pRectsCmd->pContext = pContext;
    2250                         pRectsCmd->pSwapchain = pSwapchain;
    2251                         RECT r;
    2252                         r.left = pSource->VScreenPos.x;
    2253                         r.top = pSource->VScreenPos.y;
    2254                         r.right = pAlloc->SurfDesc.width + pSource->VScreenPos.x;
    2255                         r.bottom = pAlloc->SurfDesc.height + pSource->VScreenPos.y;
    2256                         pRectsCmd->ContextsRects.ContextRect = r;
    2257                         pRectsCmd->ContextsRects.UpdateRects.cRects = 1;
    2258                         pRectsCmd->ContextsRects.UpdateRects.aRects[0] = r;
    2259                         NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
    2260                         Assert(tmpStatus == STATUS_SUCCESS);
    2261                         if (tmpStatus == STATUS_SUCCESS)
    2262                             break;
    2263                         vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
    2264                     }
    2265                     vboxWddmSwapchainRelease(pSwapchain);
    2266                 } while (0);
    2267             }
    2268             Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pPrivateData->pContext, pSubmitCommand->SubmissionFenceId);
     2259            VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase;
     2260            PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlipCmd = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)vboxVdmaGgCmdCreate(
     2261                    &pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_DMACMD, sizeof (VBOXVDMAPIPE_CMD_DMACMD_FLIP));
     2262            Assert(pFlipCmd);
     2263            if (pFlipCmd)
     2264            {
     2265                VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId];
     2266                vboxVdmaDdiCmdInit(&pFlipCmd->Hdr.DdiCmd, pSubmitCommand->SubmissionFenceId, pContext, vboxVdmaGgDdiCmdDestroy, pFlipCmd);
     2267                pFlipCmd->Hdr.pDevExt = pDevExt;
     2268                pFlipCmd->Hdr.fFlags.Value = 0;
     2269                pFlipCmd->Hdr.fFlags.b3DRelated = 1;
     2270                pFlipCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
     2271                memcpy(&pFlipCmd->Flip, &pFlip->Flip, sizeof (pFlipCmd->Flip));
     2272                Status = vboxWddmSubmitCmd(pDevExt, &pFlipCmd->Hdr);
     2273                Assert(Status == STATUS_SUCCESS);
     2274            }
     2275            else
     2276            {
     2277                Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
     2278                Assert(Status == STATUS_SUCCESS);
     2279            }
    22692280            break;
    22702281        }
    22712282        case VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL:
    22722283        {
    2273             VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
    2274             PVBOXWDDM_DMA_PRESENT_CLRFILL pCF = (PVBOXWDDM_DMA_PRESENT_CLRFILL)pPrivateData;
    2275             PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2276             PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCFCmd = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_DMACMD_CLRFILL, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_CLRFILL, Rects.aRects[pCF->Rects.cRects]));
    2277             NTSTATUS submStatus = STATUS_UNSUCCESSFUL;
     2284            PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase;
     2285            PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCFCmd = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)vboxVdmaGgCmdCreate(
     2286                    &pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_DMACMD,
     2287                    RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_CLRFILL, ClrFill.Rects.aRects[pCF->ClrFill.Rects.cRects]));
    22782288            Assert(pCFCmd);
    22792289            if (pCFCmd)
    22802290            {
    2281                 PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
    2282                 Assert(pDstAlloc);
    2283                 D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
    2284                 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    2285                         && pDstAlloc->bAssigned)
    2286                 {
    2287                     VidPnSourceId = pPrivateData->DstAllocInfo.srcId;
    2288 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    2289                     VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->DstAllocInfo.srcId];
    2290                     Assert(pSource->pPrimaryAllocation == pDstAlloc);
    2291 
    2292                     Assert(pSource->pShadowAllocation);
    2293                     if (pSource->pShadowAllocation)
    2294                         pDstAlloc = pSource->pShadowAllocation;
    2295 #endif
    2296                 }
    2297                 else
    2298                 {
    2299                     VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
    2300                 }
    2301                 pCFCmd->pContext = pContext;
    2302                 pCFCmd->pAllocation = pDstAlloc;
    2303                 pCFCmd->SubmissionFenceId = pSubmitCommand->SubmissionFenceId;
    2304                 pCFCmd->VidPnSourceId = VidPnSourceId;
    2305                 pCFCmd->Color = pCF->Color;
    2306                 memcpy(&pCFCmd->Rects, &pCF->Rects, RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[pCF->Rects.cRects]));
    2307                 ASMAtomicIncU32(&pDevExt->cDMACmdsOutstanding);
    2308                 submStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pCFCmd->Hdr);
    2309                 Assert(submStatus == STATUS_SUCCESS);
    2310                 if (submStatus != STATUS_SUCCESS)
    2311                 {
    2312                     uint32_t cNew = ASMAtomicDecU32(&pDevExt->cDMACmdsOutstanding);
    2313                     Assert(cNew < UINT32_MAX/2);
    2314                     vboxVdmaGgCmdDestroy(&pCFCmd->Hdr);
    2315                 }
    2316 
    2317             }
    2318 
    2319             Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pPrivateData->pContext, pSubmitCommand->SubmissionFenceId);
    2320             Assert(Status == STATUS_SUCCESS);
     2291//                VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId];
     2292                vboxVdmaDdiCmdInit(&pCFCmd->Hdr.DdiCmd, pSubmitCommand->SubmissionFenceId, pContext, vboxVdmaGgDdiCmdDestroy, pCFCmd);
     2293                pCFCmd->Hdr.pDevExt = pDevExt;
     2294                pCFCmd->Hdr.pDevExt = pDevExt;
     2295                pCFCmd->Hdr.fFlags.Value = 0;
     2296                pCFCmd->Hdr.fFlags.b2DRelated = 1;
     2297                pCFCmd->Hdr.fFlags.bDecVBVAUnlock = 1;
     2298                pCFCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL;
     2299                memcpy(&pCFCmd->ClrFill, &pCF->ClrFill, RT_OFFSETOF(VBOXVDMA_CLRFILL, Rects.aRects[pCF->ClrFill.Rects.cRects]));
     2300                Status = vboxWddmSubmitCmd(pDevExt, &pCFCmd->Hdr);
     2301                Assert(Status == STATUS_SUCCESS);
     2302            }
     2303            else
     2304            {
     2305                Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
     2306                Assert(Status == STATUS_SUCCESS);
     2307            }
    23212308
    23222309            break;
     
    23242311        case VBOXVDMACMD_TYPE_DMA_NOP:
    23252312        {
    2326             PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2327             Assert(pContext);
    2328             Status = vboxWddmDmaCmdNotifyCompletion(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
     2313            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext, pSubmitCommand->SubmissionFenceId);
    23292314            Assert(Status == STATUS_SUCCESS);
    23302315            break;
     
    33913376                        pSource->offVram = VBOXVIDEOOFFSET_VOID;
    33923377#endif
     3378#if 0 /* tmp */
    33933379                        Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceVisibility->VidPnSourceId);
    33943380                        Assert(Status == STATUS_SUCCESS);
    33953381                        if (Status != STATUS_SUCCESS)
    33963382                            drprintf((__FUNCTION__": vboxWddmGhDisplaySetInfo failed, Status (0x%x)\n", Status));
     3383#endif
    33973384                    }
    33983385                }
     
    36783665        if (RT_SUCCESS(rc))
    36793666        {
    3680             pCreateOverlay->hOverlay = pOverlay;;
     3667            vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay);
     3668#ifdef VBOXWDDM_RENDER_FROM_SHADOW
     3669            RECT DstRect;
     3670            vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect);
     3671            Status = vboxVdmaHlpUpdatePrimary(pDevExt, pCreateOverlay->VidPnSourceId, &DstRect);
     3672            Assert(Status == STATUS_SUCCESS);
     3673            /* ignore primary update failure */
     3674            Status = STATUS_SUCCESS;
     3675#endif
     3676            pCreateOverlay->hOverlay = pOverlay;
    36813677        }
    36823678        else
     
    39613957
    39623958    PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR pPrivateData = (PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR)pPresent->pDmaBufferPrivateData;
    3963     pPrivateData->pContext = pContext;
    39643959    pPrivateData->BaseHdr.fFlags.Value = 0;
    39653960    uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
     
    40074002                                    && pDstAlloc->bVisible)
    40084003                            {
    4009                                 Assert(pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW));
    4010                                 if (pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW))
     4004#ifdef VBOX_WITH_VIDEOHWACCEL
     4005                                if (vboxVhwaHlpOverlayListIsEmpty(pDevExt, pDstAlloc->SurfDesc.VidPnSourceId))
     4006#endif
    40114007                                {
    4012                                     VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->SurfDesc.VidPnSourceId];
    4013                                     vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
    4014                                     Assert(pPresent->SrcRect.left == pPresent->DstRect.left);
    4015                                     Assert(pPresent->SrcRect.right == pPresent->DstRect.right);
    4016                                     Assert(pPresent->SrcRect.top == pPresent->DstRect.top);
    4017                                     Assert(pPresent->SrcRect.bottom == pPresent->DstRect.bottom);
    4018                                     RECT rect;
    4019                                     if (pPresent->SubRectCnt)
     4008                                    Assert(pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY));
     4009                                    if (pPresent->DmaBufferPrivateDataSize >= sizeof (VBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY))
    40204010                                    {
    4021                                         rect = pPresent->pDstSubRects[0];
    4022                                         for (UINT i = 1; i < pPresent->SubRectCnt; ++i)
     4011                                        VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->SurfDesc.VidPnSourceId];
     4012                                        vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->SurfDesc.VidPnSourceId);
     4013                                        Assert(pPresent->SrcRect.left == pPresent->DstRect.left);
     4014                                        Assert(pPresent->SrcRect.right == pPresent->DstRect.right);
     4015                                        Assert(pPresent->SrcRect.top == pPresent->DstRect.top);
     4016                                        Assert(pPresent->SrcRect.bottom == pPresent->DstRect.bottom);
     4017                                        RECT rect;
     4018                                        if (pPresent->SubRectCnt)
    40234019                                        {
    4024                                             vboxWddmRectUnited(&rect, &rect, &pPresent->pDstSubRects[i]);
     4020                                            rect = pPresent->pDstSubRects[0];
     4021                                            for (UINT i = 1; i < pPresent->SubRectCnt; ++i)
     4022                                            {
     4023                                                vboxWddmRectUnited(&rect, &rect, &pPresent->pDstSubRects[i]);
     4024                                            }
    40254025                                        }
     4026                                        else
     4027                                            rect = pPresent->SrcRect;
     4028
     4029
     4030                                        pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + sizeof (VBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY);
     4031                                        pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     4032                                        Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE);
     4033                                        memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST));
     4034                                        pPresent->pPatchLocationListOut->PatchOffset = 0;
     4035                                        pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
     4036                                        ++pPresent->pPatchLocationListOut;
     4037                                        pPresent->pPatchLocationListOut->PatchOffset = 4;
     4038                                        pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX;
     4039                                        ++pPresent->pPatchLocationListOut;
     4040
     4041                                        pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY;
     4042                                        PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY pS2P = (PVBOXWDDM_DMA_PRIVATEDATA_SHADOW2PRIMARY)pPrivateData;
     4043                                        /* we do not know the shadow address yet, perform dummy DMA cycle */
     4044                                        vboxWddmPopulateDmaAllocInfo(&pS2P->Shadow2Primary.ShadowAlloc, pSrcAlloc, pSrc);
     4045//                                        vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
     4046                                        pS2P->Shadow2Primary.SrcRect = rect;
     4047                                        pS2P->Shadow2Primary.VidPnSourceId = pDstAlloc->SurfDesc.VidPnSourceId;
     4048                                        break;
    40264049                                    }
    40274050                                    else
    4028                                         rect = pPresent->SrcRect;
    4029 
    4030 
    4031                                     pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + sizeof (VBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW);
    4032                                     pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    4033                                     Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE);
    4034                                     memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST));
    4035                                     pPresent->pPatchLocationListOut->PatchOffset = 0;
    4036                                     pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
    4037                                     ++pPresent->pPatchLocationListOut;
    4038                                     pPresent->pPatchLocationListOut->PatchOffset = 4;
    4039                                     pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX;
    4040                                     ++pPresent->pPatchLocationListOut;
    4041 
    4042 
    4043                                     /* we do not know the shadow address yet, perform dummy DMA cycle */
    4044                                     pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY;
    4045                                     vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
    4046                                     vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    4047                                     PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
    4048                                     pRFS->rect = rect;
    4049                                     break;
    4050                                 }
    4051                                 else
    4052                                 {
    4053                                     Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
    4054                                     break;
     4051                                    {
     4052                                        Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
     4053                                        break;
     4054                                    }
    40554055                                }
    40564056                            }
     
    40594059
    40604060                    /* we're here because this is NOT a shadow->primary update
    4061                      * or because there are d3d contexts and we need to report visible rects */
     4061                     * or because there are d3d contexts and we need to report visible rects
     4062                     * or because we have overlays active and we need a special handling for primary */
    40624063#endif
    40634064                    UINT cbCmd = pPresent->DmaBufferPrivateDataSize;
    40644065                    pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
    40654066
    4066                     vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
    4067                     vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    4068 
    4069                     PVBOXWDDM_DMA_PRESENT_BLT pBlt = (PVBOXWDDM_DMA_PRESENT_BLT)pPrivateData;
    4070                     pBlt->SrcRect = pPresent->SrcRect;
    4071                     pBlt->DstRects.ContextRect = pPresent->DstRect;
    4072                     pBlt->DstRects.UpdateRects.cRects = 0;
    4073                     UINT cbHead = RT_OFFSETOF(VBOXWDDM_DMA_PRESENT_BLT, DstRects.UpdateRects.aRects[0]);
     4067                    PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pPrivateData;
     4068
     4069                    vboxWddmPopulateDmaAllocInfo(&pBlt->Blt.SrcAlloc, pSrcAlloc, pSrc);
     4070                    vboxWddmPopulateDmaAllocInfo(&pBlt->Blt.DstAlloc, pDstAlloc, pDst);
     4071
     4072                    pBlt->Blt.SrcRect = pPresent->SrcRect;
     4073                    pBlt->Blt.DstRects.ContextRect = pPresent->DstRect;
     4074                    pBlt->Blt.DstRects.UpdateRects.cRects = 0;
     4075                    UINT cbHead = RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_BLT, Blt.DstRects.UpdateRects.aRects[0]);
    40744076                    Assert(pPresent->SubRectCnt > pPresent->MultipassOffset);
    40754077                    UINT cbRects = (pPresent->SubRectCnt - pPresent->MultipassOffset) * sizeof (RECT);
     
    40834085                    {
    40844086                        cbCmd -= cbRects;
    4085                         memcpy(&pBlt->DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);
    4086                         pBlt->DstRects.UpdateRects.cRects += cbRects/sizeof (RECT);
     4087                        memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);
     4088                        pBlt->Blt.DstRects.UpdateRects.cRects += cbRects/sizeof (RECT);
    40874089                    }
    40884090                    else
     
    40904092                        UINT cbFitingRects = (cbCmd/sizeof (RECT)) * sizeof (RECT);
    40914093                        Assert(cbFitingRects);
    4092                         memcpy(&pBlt->DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);
     4094                        memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);
    40934095                        cbCmd -= cbFitingRects;
    40944096                        pPresent->MultipassOffset += cbFitingRects/sizeof (RECT);
    4095                         pBlt->DstRects.UpdateRects.cRects += cbFitingRects/sizeof (RECT);
     4097                        pBlt->Blt.DstRects.UpdateRects.cRects += cbFitingRects/sizeof (RECT);
    40964098                        Assert(pPresent->SubRectCnt > pPresent->MultipassOffset);
    40974099                        Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
     
    42894291            Assert(cContexts3D);
    42904292            pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
    4291 
    4292             vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
    4293 
    4294             UINT cbCmd = sizeof (VBOXVDMACMD_DMA_PRESENT_FLIP);
     4293            PVBOXWDDM_DMA_PRIVATEDATA_FLIP pFlip = (PVBOXWDDM_DMA_PRIVATEDATA_FLIP)pPrivateData;
     4294
     4295            vboxWddmPopulateDmaAllocInfo(&pFlip->Flip.Alloc, pSrcAlloc, pSrc);
     4296
     4297            UINT cbCmd = sizeof (VBOXWDDM_DMA_PRIVATEDATA_FLIP);
    42954298            pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + cbCmd;
    42964299            pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     
    43204323            UINT cbCmd = pPresent->DmaBufferPrivateDataSize;
    43214324            pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL;
    4322 
    4323             vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    4324 
    4325             PVBOXWDDM_DMA_PRESENT_CLRFILL pClrFill = (PVBOXWDDM_DMA_PRESENT_CLRFILL)pPrivateData;
    4326             pClrFill->Color = pPresent->Color;
    4327             pClrFill->Rects.cRects = 0;
    4328             UINT cbHead = RT_OFFSETOF(VBOXWDDM_DMA_PRESENT_CLRFILL, Rects.aRects[0]);
     4325            PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateData;
     4326
     4327            vboxWddmPopulateDmaAllocInfo(&pCF->ClrFill.Alloc, pDstAlloc, pDst);
     4328
     4329            pCF->ClrFill.Color = pPresent->Color;
     4330            pCF->ClrFill.Rects.cRects = 0;
     4331            UINT cbHead = RT_OFFSETOF(VBOXWDDM_DMA_PRIVATEDATA_CLRFILL, ClrFill.Rects.aRects[0]);
    43294332            Assert(pPresent->SubRectCnt > pPresent->MultipassOffset);
    43304333            UINT cbRects = (pPresent->SubRectCnt - pPresent->MultipassOffset) * sizeof (RECT);
     
    43384341            {
    43394342                cbCmd -= cbRects;
    4340                 memcpy(&pClrFill->Rects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);
    4341                 pClrFill->Rects.cRects += cbRects/sizeof (RECT);
     4343                memcpy(&pCF->ClrFill.Rects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);
     4344                pCF->ClrFill.Rects.cRects += cbRects/sizeof (RECT);
    43424345            }
    43434346            else
     
    43454348                UINT cbFitingRects = (cbCmd/sizeof (RECT)) * sizeof (RECT);
    43464349                Assert(cbFitingRects);
    4347                 memcpy(&pClrFill->Rects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);
     4350                memcpy(&pCF->ClrFill.Rects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);
    43484351                cbCmd -= cbFitingRects;
    43494352                pPresent->MultipassOffset += cbFitingRects/sizeof (RECT);
    4350                 pClrFill->Rects.cRects += cbFitingRects/sizeof (RECT);
     4353                pCF->ClrFill.Rects.cRects += cbFitingRects/sizeof (RECT);
    43514354                Assert(pPresent->SubRectCnt > pPresent->MultipassOffset);
    43524355                Status = STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
     
    44294432    PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;
    44304433    Assert(pOverlay);
     4434    vboxVhwaHlpOverlayListRemove(pOverlay->pDevExt, pOverlay);
    44314435    int rc = vboxVhwaHlpOverlayDestroy(pOverlay);
    44324436    AssertRC(rc);
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