Changeset 47063 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
- Timestamp:
- Jul 10, 2013 7:30:18 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r47059 r47063 2972 2972 vboxWddmModeRenderFromShadowDisableRegister(pDevExt, pContext); 2973 2973 2974 BOOLEAN fRenderFromSharedDisabled = pDevExt->fRenderToShadowDisabled;2975 2976 2974 switch (enmCmd) 2977 2975 { … … 2984 2982 vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc, pS2P->Shadow2Primary.ShadowAlloc.offAlloc); 2985 2983 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pS2P->Shadow2Primary.VidPnSourceId); 2986 fRenderFromSharedDisabled =vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);2984 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 2987 2985 vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource); 2988 2986 if (pSrcAlloc->bVisible) … … 3012 3010 vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pBlt->Blt.SrcAlloc.segmentIdAlloc, pBlt->Blt.SrcAlloc.offAlloc); 3013 3011 3014 uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);3015 3016 VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags;3017 fBltFlags.Value = 0;3018 3019 3012 if (pDstAlloc->bAssigned && 3020 3013 (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE 3021 || pDstAlloc->enmType == VBOXWDDM_ ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE)3014 || pDstAlloc->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D) 3022 3015 ) 3023 3016 { … … 3027 3020 if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3028 3021 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->AllocData.SurfDesc.VidPnSourceId); 3029 fRenderFromSharedDisabled =vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL);3022 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3030 3023 if(pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D 3031 3024 || pDstAlloc->enmType !=VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC) 3032 3025 vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource); 3033 3026 } 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)); 3144 3033 3145 3034 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, … … 3204 3093 VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase; 3205 3094 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)); 3216 3099 3217 3100 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, … … 3223 3106 PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase; 3224 3107 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)); 3231 3112 3232 3113 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, … … 5551 5432 PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR pPrivateData = (PVBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR)pPresent->pDmaBufferPrivateData; 5552 5433 pPrivateData->BaseHdr.fFlags.Value = 0; 5553 uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);5554 5434 uint32_t cContexts2D = ASMAtomicReadU32(&pDevExt->cContexts2D); 5555 5435 #define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof(RECT) … … 5584 5464 } 5585 5465 #endif 5586 /* issue VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE ONLY in case there are no 3D contexts currently5466 /* issue VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE ONLY in case there are no 3D Visible Regions currently 5587 5467 * otherwise we would need info about all rects being updated on primary for visible rect reporting */ 5588 if (!cContexts 3D && !cContexts2D && !pSource->fHas3DVrs)5468 if (!cContexts2D && !pSource->fHas3DVrs) 5589 5469 { 5590 5470 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE … … 5882 5762 if (pSrcAlloc) 5883 5763 { 5884 Assert( cContexts3D);5764 Assert(pDevExt->cContexts3D); 5885 5765 pPrivateData->BaseHdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP; 5886 5766 PVBOXWDDM_DMA_PRIVATEDATA_FLIP pFlip = (PVBOXWDDM_DMA_PRIVATEDATA_FLIP)pPrivateData;
Note:
See TracChangeset
for help on using the changeset viewer.