Changeset 40785 in vbox for trunk/src/VBox/Additions/WINNT
- Timestamp:
- Apr 6, 2012 5:42:14 AM (13 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r40747 r40785 248 248 } 249 249 pHdr->enmType = enmType; 250 pHdr->cRefs = 1; 250 251 return pHdr; 251 252 } … … 280 281 } 281 282 282 DECLCALLBACK(VOID) vboxVdmaGgDdiCmd Destroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)283 { 284 vboxVdmaGgCmd Destroy(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext);283 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext) 284 { 285 vboxVdmaGgCmdRelease(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext); 285 286 } 286 287 … … 831 832 } 832 833 834 /* Corresponding Release is done by dma command completion handler */ 835 vboxVdmaGgCmdAddRef(&pDmaCmd->Hdr); 836 833 837 NTSTATUS tmpStatus = vboxVdmaGgCmdDmaNotifyCompleted(pDevExt, pDmaCmd, enmComplType); 834 Assert(tmpStatus == STATUS_SUCCESS); 835 if (Status != STATUS_MORE_PROCESSING_REQUIRED) 836 { 837 vboxVdmaGgCmdDestroy(pDevExt, &pDmaCmd->Hdr); 838 if (!NT_SUCCESS(tmpStatus)) 839 { 840 WARN(("vboxVdmaGgCmdDmaNotifyCompleted failed, Status 0x%x", tmpStatus)); 841 /* the command was NOT submitted, and thus will not be released, release it here */ 842 vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr); 843 Status = tmpStatus; 838 844 } 839 845 … … 930 936 } 931 937 932 vboxVdmaGgCmd Destroy(pDevExt, &pDmaCmd->Hdr);938 vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr); 933 939 934 940 return Status; … … 981 987 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pRects->pContext, pRects->pSwapchain, &pRects->ContextsRects); 982 988 Assert(Status == STATUS_SUCCESS); 983 vboxVdmaGgCmd Destroy(pDevExt, pDr);989 vboxVdmaGgCmdRelease(pDevExt, pDr); 984 990 break; 985 991 } … … 995 1001 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status)); 996 1002 } 997 vboxVdmaGgCmd Destroy(pDevExt, &pCmd->Hdr);1003 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 998 1004 break; 999 1005 } … … 1009 1015 Assert(pCmd->pEvent); 1010 1016 KeSetEvent(pCmd->pEvent, 0, FALSE); 1011 vboxVdmaGgCmd Destroy(pDevExt, &pCmd->Hdr);1017 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1012 1018 break; 1013 1019 } … … 1083 1089 break; 1084 1090 } 1091 /* correspondinf Release is done by the pipe command handler */ 1092 vboxVdmaGgCmdAddRef(pCmd); 1085 1093 return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr); 1086 1094 } … … 1142 1150 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1143 1151 } 1152 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1144 1153 } 1145 1154 else … … 1173 1182 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1174 1183 } 1184 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 1175 1185 } 1176 1186 else -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r40747 r40785 170 170 VBOXVDMAPIPE_CMD_HDR PipeHdr; 171 171 VBOXVDMAPIPE_CMD_TYPE enmType; 172 volatile uint32_t cRefs; 172 173 } VBOXVDMAPIPE_CMD_DR, *PVBOXVDMAPIPE_CMD_DR; 173 174 … … 329 330 NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd); 330 331 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd); 332 DECLINLINE(void) vboxVdmaGgCmdAddRef(PVBOXVDMAPIPE_CMD_DR pDr) 333 { 334 ASMAtomicIncU32(&pDr->cRefs); 335 } 331 336 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr); 337 DECLINLINE(void) vboxVdmaGgCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr) 338 { 339 uint32_t cRefs = ASMAtomicDecU32(&pDr->cRefs); 340 Assert(cRefs < UINT32_MAX/2); 341 if (!cRefs) 342 vboxVdmaGgCmdDestroy(pDevExt, pDr); 343 } 332 344 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent); 333 345 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain); … … 345 357 346 358 #define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd))) 347 DECLCALLBACK(VOID) vboxVdmaGgDdiCmd Destroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);359 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext); 348 360 #endif /* #ifndef ___VBoxMPVdma_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r40747 r40785 2685 2685 else 2686 2686 { 2687 vboxVdmaGgCmd Destroy(pDevExt, &pCmd->Hdr);2687 vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr); 2688 2688 } 2689 2689 return Status; … … 2698 2698 { 2699 2699 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Blt.DstAlloc.srcId]; 2700 vboxVdmaGgCmdDmaNotifyInit(&pBltCmd->Hdr, pContext->NodeOrdinal, u32FenceId, NULL, NULL);2700 vboxVdmaGgCmdDmaNotifyInit(&pBltCmd->Hdr, pContext->NodeOrdinal, u32FenceId, vboxVdmaGgDdiCmdRelease, pBltCmd); 2701 2701 pBltCmd->Hdr.fFlags = fBltFlags; 2702 2702 pBltCmd->Hdr.pContext = pContext; 2703 2703 pBltCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT; 2704 2704 memcpy(&pBltCmd->Blt, &pBlt->Blt, RT_OFFSETOF(VBOXVDMA_BLT, DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects])); 2705 vboxWddmSubmitCmd(pDevExt, &pBltCmd->Hdr); 2705 Status = vboxWddmSubmitCmd(pDevExt, &pBltCmd->Hdr); 2706 if (Status != STATUS_SUCCESS) 2707 { 2708 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status)); 2709 Status = STATUS_SUCCESS; 2710 } 2711 vboxVdmaGgCmdRelease(pDevExt, &pBltCmd->Hdr.Hdr); 2706 2712 } 2707 2713 else … … 3026 3032 { 3027 3033 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId]; 3028 vboxVdmaGgCmdDmaNotifyInit(&pFlipCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, NULL, NULL);3034 vboxVdmaGgCmdDmaNotifyInit(&pFlipCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pFlipCmd); 3029 3035 pFlipCmd->Hdr.fFlags.Value = 0; 3030 3036 pFlipCmd->Hdr.fFlags.fVisibleRegions = 1; … … 3033 3039 memcpy(&pFlipCmd->Flip, &pFlip->Flip, sizeof (pFlipCmd->Flip)); 3034 3040 Status = vboxWddmSubmitCmd(pDevExt, &pFlipCmd->Hdr); 3035 Assert(Status == STATUS_SUCCESS); 3041 if (Status != STATUS_SUCCESS) 3042 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status)); 3043 vboxVdmaGgCmdRelease(pDevExt, &pFlipCmd->Hdr.Hdr); 3036 3044 } 3037 3045 else … … 3050 3058 if (pCFCmd) 3051 3059 { 3052 // VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId]; 3053 vboxVdmaGgCmdDmaNotifyInit(&pCFCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, NULL, NULL); 3060 vboxVdmaGgCmdDmaNotifyInit(&pCFCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pCFCmd); 3054 3061 pCFCmd->Hdr.fFlags.Value = 0; 3055 3062 pCFCmd->Hdr.fFlags.fRealOp = 1; … … 3058 3065 memcpy(&pCFCmd->ClrFill, &pCF->ClrFill, RT_OFFSETOF(VBOXVDMA_CLRFILL, Rects.aRects[pCF->ClrFill.Rects.cRects])); 3059 3066 Status = vboxWddmSubmitCmd(pDevExt, &pCFCmd->Hdr); 3060 Assert(Status == STATUS_SUCCESS); 3067 if (Status != STATUS_SUCCESS) 3068 WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status)); 3069 vboxVdmaGgCmdRelease(pDevExt, &pCFCmd->Hdr.Hdr); 3070 3061 3071 } 3062 3072 else
Note:
See TracChangeset
for help on using the changeset viewer.