VirtualBox

Changeset 40785 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Apr 6, 2012 5:42:14 AM (13 years ago)
Author:
vboxsync
Message:

wddm: fix smp racing

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  
    248248    }
    249249    pHdr->enmType = enmType;
     250    pHdr->cRefs = 1;
    250251    return pHdr;
    251252}
     
    280281}
    281282
    282 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
    283 {
    284     vboxVdmaGgCmdDestroy(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext);
     283DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
     284{
     285    vboxVdmaGgCmdRelease(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext);
    285286}
    286287
     
    831832    }
    832833
     834    /* Corresponding Release is done by dma command completion handler */
     835    vboxVdmaGgCmdAddRef(&pDmaCmd->Hdr);
     836
    833837    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;
    838844    }
    839845
     
    930936    }
    931937
    932     vboxVdmaGgCmdDestroy(pDevExt, &pDmaCmd->Hdr);
     938    vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr);
    933939
    934940    return Status;
     
    981987                            Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pRects->pContext, pRects->pSwapchain, &pRects->ContextsRects);
    982988                            Assert(Status == STATUS_SUCCESS);
    983                             vboxVdmaGgCmdDestroy(pDevExt, pDr);
     989                            vboxVdmaGgCmdRelease(pDevExt, pDr);
    984990                            break;
    985991                        }
     
    9951001                                WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status));
    9961002                            }
    997                             vboxVdmaGgCmdDestroy(pDevExt, &pCmd->Hdr);
     1003                            vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    9981004                            break;
    9991005                        }
     
    10091015                            Assert(pCmd->pEvent);
    10101016                            KeSetEvent(pCmd->pEvent, 0, FALSE);
    1011                             vboxVdmaGgCmdDestroy(pDevExt, &pCmd->Hdr);
     1017                            vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    10121018                            break;
    10131019                        }
     
    10831089            break;
    10841090    }
     1091    /* correspondinf Release is done by the pipe command handler */
     1092    vboxVdmaGgCmdAddRef(pCmd);
    10851093    return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr);
    10861094}
     
    11421150            WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status));
    11431151        }
     1152        vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    11441153    }
    11451154    else
     
    11731182            WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status));
    11741183        }
     1184        vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    11751185    }
    11761186    else
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h

    r40747 r40785  
    170170    VBOXVDMAPIPE_CMD_HDR PipeHdr;
    171171    VBOXVDMAPIPE_CMD_TYPE enmType;
     172    volatile uint32_t cRefs;
    172173} VBOXVDMAPIPE_CMD_DR, *PVBOXVDMAPIPE_CMD_DR;
    173174
     
    329330NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd);
    330331PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd);
     332DECLINLINE(void) vboxVdmaGgCmdAddRef(PVBOXVDMAPIPE_CMD_DR pDr)
     333{
     334    ASMAtomicIncU32(&pDr->cRefs);
     335}
    331336void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr);
     337DECLINLINE(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}
    332344NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent);
    333345NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain);
     
    345357
    346358#define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd)))
    347 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
     359DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
    348360#endif /* #ifndef ___VBoxMPVdma_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r40747 r40785  
    26852685    else
    26862686    {
    2687         vboxVdmaGgCmdDestroy(pDevExt, &pCmd->Hdr);
     2687        vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    26882688    }
    26892689    return Status;
     
    26982698    {
    26992699        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);
    27012701        pBltCmd->Hdr.fFlags = fBltFlags;
    27022702        pBltCmd->Hdr.pContext = pContext;
    27032703        pBltCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
    27042704        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);
    27062712    }
    27072713    else
     
    30263032            {
    30273033                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);
    30293035                pFlipCmd->Hdr.fFlags.Value = 0;
    30303036                pFlipCmd->Hdr.fFlags.fVisibleRegions = 1;
     
    30333039                memcpy(&pFlipCmd->Flip, &pFlip->Flip, sizeof (pFlipCmd->Flip));
    30343040                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);
    30363044            }
    30373045            else
     
    30503058            if (pCFCmd)
    30513059            {
    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);
    30543061                pCFCmd->Hdr.fFlags.Value = 0;
    30553062                pCFCmd->Hdr.fFlags.fRealOp = 1;
     
    30583065                memcpy(&pCFCmd->ClrFill, &pCF->ClrFill, RT_OFFSETOF(VBOXVDMA_CLRFILL, Rects.aRects[pCF->ClrFill.Rects.cRects]));
    30593066                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
    30613071            }
    30623072            else
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