VirtualBox

Ignore:
Timestamp:
Jun 30, 2010 5:37:24 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: visible region tracking fixes

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r30515 r30536  
    328328}
    329329
     330DECLINLINE(bool) vboxWddmRectIsEqual(const RECT *pRect1, const RECT *pRect2)
     331{
     332    Assert(pRect1);
     333    Assert(pRect2);
     334    if (pRect1->left != pRect2->left)
     335        return false;
     336    if (pRect1->top != pRect2->top)
     337        return false;
     338    if (pRect1->right != pRect2->right)
     339        return false;
     340    if (pRect1->bottom != pRect2->bottom)
     341        return false;
     342    return true;
     343}
     344
    330345DECLINLINE(bool) vboxWddmRectIsCoveres(const RECT *pRect, const RECT *pCovered)
    331346{
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30515 r30536  
    14911491        {
    14921492            pAllocation->enmType = pAllocInfo->enmType;
     1493            pAllocation->fRcFlags = pAllocInfo->fFlags;
    14931494            pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
    14941495            pAllocation->SurfDesc = pAllocInfo->SurfDesc;
     
    19331934                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX);
    19341935                Assert(pPatchList->PatchOffset == 0);
    1935                 const DXGK_ALLOCATIONLIST *pAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    1936                 Assert(pAllocationList->SegmentId);
    1937                 pPrivateData->SrcAllocInfo.segmentIdAlloc = pAllocationList->SegmentId;
    1938                 pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pAllocationList->PhysicalAddress.QuadPart;
    1939 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    1940                 if (!pPrivateData->fFlags.bShadow2PrimaryUpdate)
    1941 #endif
    1942                 {
    1943                     pPatchList = &pPatch->pPatchLocationList[1];
    1944                     Assert(pPatchList->AllocationIndex == DXGK_PRESENT_DESTINATION_INDEX);
    1945                     Assert(pPatchList->PatchOffset == 4);
    1946                     const DXGK_ALLOCATIONLIST *pAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
    1947                     Assert(pAllocationList->SegmentId);
    1948                     pPrivateData->DstAllocInfo.segmentIdAlloc = pAllocationList->SegmentId;
    1949                     pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pAllocationList->PhysicalAddress.QuadPart;
    1950                 }
     1936                const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
     1937                Assert(pSrcAllocationList->SegmentId);
     1938                pPrivateData->SrcAllocInfo.segmentIdAlloc = pSrcAllocationList->SegmentId;
     1939                pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
     1940
     1941                pPatchList = &pPatch->pPatchLocationList[1];
     1942                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_DESTINATION_INDEX);
     1943                Assert(pPatchList->PatchOffset == 4);
     1944                const DXGK_ALLOCATIONLIST *pDstAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
     1945                Assert(pDstAllocationList->SegmentId);
     1946                pPrivateData->DstAllocInfo.segmentIdAlloc = pDstAllocationList->SegmentId;
     1947                pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
    19511948                break;
    19521949            }
     
    20212018#endif
    20222019
     2020static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
     2021{
     2022    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]));
     2023    Assert(pRectsCmd);
     2024    if (pRectsCmd)
     2025    {
     2026        pRectsCmd->pContext = pContext;
     2027        memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
     2028        NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
     2029        Assert(tmpStatus == STATUS_SUCCESS);
     2030        if (tmpStatus != STATUS_SUCCESS)
     2031            vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
     2032    }
     2033}
    20232034
    20242035NTSTATUS
     
    20792090        case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    20802091        {
     2092            PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
     2093            Assert(pContext);
     2094            Assert(pContext->pDevice);
     2095            Assert(pContext->pDevice->pAdapter == pDevExt);
    20812096            PVBOXWDDM_DMA_PRESENT_BLT pBlt = (PVBOXWDDM_DMA_PRESENT_BLT)pPrivateData;
     2097            PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
     2098            PVBOXWDDM_ALLOCATION pSrcAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    20822099            uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
    2083             if (cContexts3D)
    2084             {
    2085                 if (pPrivateData->fFlags.bShadow2PrimaryUpdate)
     2100            switch (pDstAlloc->enmType)
     2101            {
     2102                case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE:
    20862103                {
    2087                     RECT rect;
    2088                     if (pBlt->DstRects.UpdateRects.cRects)
     2104                    VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->DstAllocInfo.srcId];
     2105                    Assert(pSource->pPrimaryAllocation == pDstAlloc);
     2106                    switch (pSrcAlloc->enmType)
    20892107                    {
    2090                         rect = pBlt->DstRects.UpdateRects.aRects[0];
    2091                         for (UINT i = 1; i < pBlt->DstRects.UpdateRects.cRects; ++i)
     2108                        case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
    20922109                        {
    2093                             vboxWddmRectUnited(&rect, &rect, &pBlt->DstRects.UpdateRects.aRects[i]);
     2110                            RECT rect;
     2111                            Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
     2112                            vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
     2113                            if (pBlt->DstRects.UpdateRects.cRects)
     2114                            {
     2115                                rect = pBlt->DstRects.UpdateRects.aRects[0];
     2116                                for (UINT i = 1; i < pBlt->DstRects.UpdateRects.cRects; ++i)
     2117                                {
     2118                                    vboxWddmRectUnited(&rect, &rect, &pBlt->DstRects.UpdateRects.aRects[i]);
     2119                                }
     2120                            }
     2121                            else
     2122                                rect = pBlt->DstRects.ContextRect;
     2123
     2124                            VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2125                            vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
     2126                            break;
    20942127                        }
     2128                        case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
     2129                        {
     2130                            Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D);
     2131                            Assert(pSrcAlloc->fRcFlags.RenderTarget);
     2132                            if (pSrcAlloc->fRcFlags.RenderTarget)
     2133                            {
     2134                                vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
     2135                            }
     2136                            break;
     2137                        }
     2138                        default:
     2139                            AssertBreakpoint();
     2140                            break;
    20952141                    }
    2096                     else
    2097                         rect = pBlt->DstRects.ContextRect;
    2098 
    2099                     VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    2100                     VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2142                    break;
    21012143                }
    2102 
    2103                 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pSubmitCommand->hContext;
    2104                 Assert(pContext);
    2105                 Assert(pContext->pDevice);
    2106                 Assert(pContext->pDevice->pAdapter == pDevExt);
    2107                 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]));
    2108                 Assert(pRectsCmd);
    2109                 if (pRectsCmd)
     2144                case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE:
    21102145                {
    2111                     pRectsCmd->pContext = pContext;
    2112                     memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
    2113                     NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
    2114                     Assert(tmpStatus == STATUS_SUCCESS);
    2115                     if (tmpStatus != STATUS_SUCCESS)
    2116                         vboxVdmaGgCmdDestroy(&pRectsCmd->Hdr);
     2146                    Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D);
     2147                    Assert(pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC);
     2148                    Assert(pSrcAlloc->fRcFlags.RenderTarget);
     2149                    Assert(vboxWddmRectIsEqual(&pBlt->SrcRect, &pBlt->DstRects.ContextRect));
     2150                    Assert(pBlt->DstRects.UpdateRects.cRects == 1);
     2151                    Assert(vboxWddmRectIsEqual(&pBlt->SrcRect, pBlt->DstRects.UpdateRects.aRects));
     2152                    break;
    21172153                }
    2118             }
    2119             else
    2120                 Assert(!pPrivateData->fFlags.bShadow2PrimaryUpdate);
     2154                case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
     2155                {
     2156                    Assert(pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE);
     2157                    break;
     2158                }
     2159                default:
     2160                    AssertBreakpoint();
     2161                    break;
     2162            }
    21212163
    21222164            VBOXWDDM_SHADOW_UPDATE_COMPLETION context;
     
    21342176        default:
    21352177        {
     2178            AssertBreakpoint();
    21362179            PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate (&pDevExt->u.primary.Vdma, 0);
    21372180            if (!pDr)
     
    37223765
    37233766                                    /* we do not know the shadow address yet, perform dummy DMA cycle */
    3724                                     pPrivateData->fFlags.bShadow2PrimaryUpdate = 1;
    37253767                                    pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY;
    37263768                                    vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
     
    37463788                    pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
    37473789
    3748                     if (pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D)
    3749                     {
    3750                         vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
    3751 
    3752                         if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    3753                                 && pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE)
    3754                         {
    3755 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    3756                             Assert(cContexts3D);
    3757 #endif
    3758                             pPrivateData->fFlags.bShadow2PrimaryUpdate = 1;
    3759                             Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
    3760                         }
    3761 #ifdef VBOXWDDM_RENDER_FROM_SHADOW /* <- no need to fill dst surf info here */
    3762                         else
    3763 #endif
    3764                         {
    3765                             vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    3766                         }
    3767                     }
    3768                     /* else - no need to fill any surf info since we need this request for visible rects */
     3790                    vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
     3791                    vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    37693792
    37703793                    PVBOXWDDM_DMA_PRESENT_BLT pBlt = (PVBOXWDDM_DMA_PRESENT_BLT)pPrivateData;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h

    r30515 r30536  
    5454{
    5555    VBOXWDDM_ALLOC_TYPE enmType;
    56 //    D3DDDI_RESOURCEFLAGS fRcFlags;
     56    D3DDDI_RESOURCEFLAGS fRcFlags;
    5757    UINT SegmentId;
    5858    VBOXVIDEOOFFSET offVram;
     
    149149        {
    150150            UINT bCmdInDmaBuffer : 1;
    151             UINT bShadow2PrimaryUpdate : 1;
    152             UINT bSrcAllocValid : 1;
    153             UINT bDstAllocValid : 1;
    154             UINT bReserved : 28;
     151            UINT bReserved : 31;
    155152        };
    156153        uint32_t Value;
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