VirtualBox

Ignore:
Timestamp:
Jul 10, 2013 7:30:18 AM (12 years ago)
Author:
vboxsync
Message:

wddm: more cleanup & generic way for handling 3D and 2D commands

File:
1 edited

Legend:

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

    r47059 r47063  
    29722972        vboxWddmModeRenderFromShadowDisableRegister(pDevExt, pContext);
    29732973
    2974     BOOLEAN fRenderFromSharedDisabled = pDevExt->fRenderToShadowDisabled;
    2975 
    29762974    switch (enmCmd)
    29772975    {
     
    29842982            vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc, pS2P->Shadow2Primary.ShadowAlloc.offAlloc);
    29852983            vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pS2P->Shadow2Primary.VidPnSourceId);
    2986             fRenderFromSharedDisabled = vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
     2984            vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
    29872985            vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource);
    29882986            if (pSrcAlloc->bVisible)
     
    30123010            vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pBlt->Blt.SrcAlloc.segmentIdAlloc, pBlt->Blt.SrcAlloc.offAlloc);
    30133011
    3014             uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
    3015 
    3016             VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags;
    3017             fBltFlags.Value = 0;
    3018 
    30193012            if (pDstAlloc->bAssigned &&
    30203013                    (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    3021                         || pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE)
     3014                        || pDstAlloc->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D)
    30223015                    )
    30233016            {
     
    30273020                if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE)
    30283021                    vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->AllocData.SurfDesc.VidPnSourceId);
    3029                 fRenderFromSharedDisabled = vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
     3022                vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
    30303023                if(pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D
    30313024                        || pDstAlloc->enmType !=VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC)
    30323025                    vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource);
    30333026            }
    3034             else if (pSrcAlloc->bAssigned &&
    3035                     (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    3036                         || pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE)
    3037                     )
    3038             {
    3039                 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId];
    3040                 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS);
    3041 
    3042                 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE)
    3043                     vboxWddmAssignShadow(pDevExt, pSource, pDstAlloc, pSrcAlloc->AllocData.SurfDesc.VidPnSourceId);
    3044                 fRenderFromSharedDisabled = vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
    3045                 if(pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D
    3046                         || pSrcAlloc->enmType !=VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC)
    3047                     vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource);
    3048             }
    3049 
    3050             if (pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D && fRenderFromSharedDisabled)
    3051                 fBltFlags.fRealOp = 1;
    3052 
    3053             switch (pDstAlloc->enmType)
    3054             {
    3055                 case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE:
    3056                 case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
    3057                 {
    3058                     if (pDstAlloc->bAssigned)
    3059                     {
    3060 //                        Assert(pSource->pPrimaryAllocation == pDstAlloc);
    3061 
    3062                         switch (pSrcAlloc->enmType)
    3063                         {
    3064                             case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
    3065                             {
    3066                                 fBltFlags.fVisibleRegions = !!cContexts3D;
    3067                                 Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
    3068                                 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId];
    3069                                 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS);
    3070 
    3071                                 if (pSource->fHas3DVrs)
    3072                                     fBltFlags.fVisibleRegions = 1;
    3073 
    3074                                 if (!fRenderFromSharedDisabled && pSource->bVisible)
    3075                                 {
    3076                                     RECT rect;
    3077                                     if (pBlt->Blt.DstRects.UpdateRects.cRects)
    3078                                     {
    3079                                         rect = pBlt->Blt.DstRects.UpdateRects.aRects[0];
    3080                                         for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i)
    3081                                         {
    3082                                             vboxWddmRectUnited(&rect, &rect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]);
    3083                                         }
    3084                                     }
    3085                                     else
    3086                                         rect = pBlt->Blt.DstRects.ContextRect;
    3087 
    3088                                     uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
    3089                                     if (!cUnlockedVBVADisabled)
    3090                                     {
    3091                                         VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &rect);
    3092                                     }
    3093                                     else
    3094                                     {
    3095                                         VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
    3096                                     }
    3097                                 }
    3098 
    3099                                 break;
    3100                             }
    3101                             case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
    3102                             {
    3103                                 if(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D)
    3104                                 {
    3105                                     Assert(pSrcAlloc->fRcFlags.RenderTarget);
    3106                                     if (pSrcAlloc->fRcFlags.RenderTarget)
    3107                                         fBltFlags.fVisibleRegions = 1;
    3108                                 }
    3109                                 break;
    3110                             }
    3111                             default:
    3112                             {
    3113                                 AssertBreakpoint();
    3114                                 break;
    3115                             }
    3116                         }
    3117                     }
    3118 
    3119                     break;
    3120                 }
    3121                 case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE:
    3122                 {
    3123 //                    Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D);
    3124                     Assert(pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC);
    3125                     Assert(pSrcAlloc->fRcFlags.RenderTarget);
    3126                     Assert(vboxWddmRectIsEqual(&pBlt->Blt.SrcRect, &pBlt->Blt.DstRects.ContextRect));
    3127                     Assert(pBlt->Blt.DstRects.UpdateRects.cRects == 1);
    3128                     Assert(vboxWddmRectIsEqual(&pBlt->Blt.SrcRect, pBlt->Blt.DstRects.UpdateRects.aRects));
    3129                     break;
    3130                 }
    3131                 case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
    3132                 {
    3133                     Assert(pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE);
    3134                     Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_SYSTEM);
    3135                     break;
    3136                 }
    3137                 default:
    3138                     AssertBreakpoint();
    3139                     break;
    3140             }
    3141 
    3142             if (fBltFlags.Value)
    3143                 Status = vboxVdmaProcessBltCmd(pDevExt, pContext, pBlt, fBltFlags);
     3027            else
     3028                vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);
     3029
     3030            Status = vboxVdmaProcessBltCmd(pDevExt, pContext, pBlt);
     3031            if (!NT_SUCCESS(Status))
     3032                WARN(("vboxVdmaProcessBltCmd failed, Status 0x%x", Status));
    31443033
    31453034            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     
    32043093            VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase;
    32053094            vboxWddmAddrSetVram(&pFlip->Flip.Alloc.pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc);
    3206             VBOXVDMAPIPE_FLAGS_DMACMD fFlags;
    3207             fFlags.Value = 0;
    3208 
    3209             if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D)
    3210                 fFlags.fVisibleRegions = 1;
    3211             else
    3212                 WARN(("unexpected flip cmd"));
    3213 
    3214             if (fFlags.Value)
    3215                 Status = vboxVdmaProcessFlipCmd(pDevExt, pContext, pFlip, fFlags);
     3095
     3096            Status = vboxVdmaProcessFlipCmd(pDevExt, pContext, pFlip);
     3097            if (!NT_SUCCESS(Status))
     3098                WARN(("vboxVdmaProcessFlipCmd failed, Status 0x%x", Status));
    32163099
    32173100            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     
    32233106            PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase;
    32243107            vboxWddmAddrSetVram(&pCF->ClrFill.Alloc.pAlloc->AllocData.Addr, pCF->ClrFill.Alloc.segmentIdAlloc, pCF->ClrFill.Alloc.offAlloc);
    3225             VBOXVDMAPIPE_FLAGS_DMACMD fFlags;
    3226             fFlags.Value = 0;
    3227             fFlags.fRealOp = 1;
    3228 
    3229             if (fFlags.Value)
    3230                 Status = vboxVdmaProcessClrFillCmd(pDevExt, pContext, pCF, fFlags);
     3108
     3109            Status = vboxVdmaProcessClrFillCmd(pDevExt, pContext, pCF);
     3110            if (!NT_SUCCESS(Status))
     3111                WARN(("vboxVdmaProcessClrFillCmd failed, Status 0x%x", Status));
    32313112
    32323113            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     
    55515432    PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR pPrivateData = (PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR)pPresent->pDmaBufferPrivateData;
    55525433    pPrivateData->BaseHdr.fFlags.Value = 0;
    5553     uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
    55545434    uint32_t cContexts2D = ASMAtomicReadU32(&pDevExt->cContexts2D);
    55555435#define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof(RECT)
     
    55845464                    }
    55855465#endif
    5586                     /* issue VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE ONLY in case there are no 3D contexts currently
     5466                    /* issue VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE ONLY in case there are no 3D Visible Regions currently
    55875467                     * otherwise we would need info about all rects being updated on primary for visible rect reporting */
    5588                     if (!cContexts3D && !cContexts2D && !pSource->fHas3DVrs)
     5468                    if (!cContexts2D && !pSource->fHas3DVrs)
    55895469                    {
    55905470                        if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
     
    58825762        if (pSrcAlloc)
    58835763        {
    5884             Assert(cContexts3D);
     5764            Assert(pDevExt->cContexts3D);
    58855765            pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
    58865766            PVBOXWDDM_DMA_PRIVATEDATA_FLIP pFlip = (PVBOXWDDM_DMA_PRIVATEDATA_FLIP)pPrivateData;
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