VirtualBox

Ignore:
Timestamp:
Oct 12, 2011 8:20:21 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74369
Message:

wddm: proper ie rendering under win8 (shared resource open & destroy fixes, zero-init resources on creaate, etc.)

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm
Files:
5 edited

Legend:

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

    r38930 r38982  
    14731473    }
    14741474}
     1475
     1476#if 0
     1477VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt)
     1478{
     1479    ExInitializeFastMutex(&pDevExt->ShRcTreeMutex);
     1480    pDevExt->ShRcTree = NULL;
     1481}
     1482
     1483VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt)
     1484{
     1485    Assert(!pDevExt->ShRcTree);
     1486    pDevExt->ShRcTree = NULL;
     1487}
     1488
     1489BOOLEAN vboxShRcTreePut(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc)
     1490{
     1491    HANDLE hSharedRc = pAlloc->hSharedHandle;
     1492    if (!hSharedRc)
     1493    {
     1494        WARN(("invalid call with zero shared handle!"));
     1495        return FALSE;
     1496    }
     1497    pAlloc->ShRcTreeEntry.Key = (AVLPVKEY)hSharedRc;
     1498    ExAcquireFastMutex(&pDevExt->ShRcTreeMutex);
     1499    bool bRc = RTAvlPVInsert(&pDevExt->ShRcTree, &pAlloc->ShRcTreeEntry);
     1500    ExReleaseFastMutex(&pDevExt->ShRcTreeMutex);
     1501    Assert(bRc);
     1502    return (BOOLEAN)bRc;
     1503}
     1504
     1505#define PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(_p) ((PVBOXWDDM_ALLOCATION)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXWDDM_ALLOCATION, ShRcTreeEntry)))
     1506PVBOXWDDM_ALLOCATION vboxShRcTreeGet(PVBOXMP_DEVEXT pDevExt, HANDLE hSharedRc)
     1507{
     1508    ExAcquireFastMutex(&pDevExt->ShRcTreeMutex);
     1509    PAVLPVNODECORE pNode = RTAvlPVGet(&pDevExt->ShRcTree, (AVLPVKEY)hSharedRc);
     1510    ExReleaseFastMutex(&pDevExt->ShRcTreeMutex);
     1511    if (!pNode)
     1512        return NULL;
     1513    PVBOXWDDM_ALLOCATION pAlloc = PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(pNode);
     1514    return pAlloc;
     1515}
     1516
     1517BOOLEAN vboxShRcTreeRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc)
     1518{
     1519    HANDLE hSharedRc = pAlloc->hSharedHandle;
     1520    if (!hSharedRc)
     1521    {
     1522        WARN(("invalid call with zero shared handle!"));
     1523        return FALSE;
     1524    }
     1525    ExAcquireFastMutex(&pDevExt->ShRcTreeMutex);
     1526    PAVLPVNODECORE pNode = RTAvlPVRemove(&pDevExt->ShRcTree, (AVLPVKEY)hSharedRc);
     1527    ExReleaseFastMutex(&pDevExt->ShRcTreeMutex);
     1528    if (!pNode)
     1529        return NULL;
     1530    PVBOXWDDM_ALLOCATION pRetAlloc = PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(pNode);
     1531    Assert(pRetAlloc == pAlloc);
     1532    return !!pRetAlloc;
     1533}
     1534#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h

    r37734 r38982  
    151151VOID vboxWddmCounterU32Wait(uint32_t volatile * pu32, uint32_t u32Val);
    152152
     153#if 0
     154/* wine shrc handle -> allocation map */
     155VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt);
     156VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt);
     157BOOLEAN vboxShRcTreePut(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc);
     158PVBOXWDDM_ALLOCATION vboxShRcTreeGet(PVBOXMP_DEVEXT pDevExt, HANDLE hSharedRc);
     159BOOLEAN vboxShRcTreeRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc);
     160#endif
     161
    153162#endif /* #ifndef ___VBoxMPMisc_h__ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r37889 r38982  
    3232#include "VBoxMPVbva.h"
    3333
     34#if 0
     35#include <iprt/avl.h>
     36#endif
     37
    3438/* one page size */
    3539#define VBOXWDDM_C_DMA_BUFFER_SIZE         0x1000
     
    118122    VBOXWDDM_ALLOC_TYPE enmType;
    119123    volatile uint32_t cRefs;
    120 //    VBOXWDDM_ALLOCUSAGE_TYPE enmCurrentUsage;
    121124    D3DDDI_RESOURCEFLAGS fRcFlags;
    122125    UINT SegmentId;
     
    128131    BOOLEAN bVisible;
    129132    BOOLEAN bAssigned;
     133#ifdef DEBUG
     134    /* current for shared rc handling assumes that once resource has no opens, it can not be openned agaion */
     135    BOOLEAN fAssumedDeletion;
     136#endif
    130137    VBOXWDDM_SURFACE_DESC SurfDesc;
    131138    struct VBOXWDDM_RESOURCE *pResource;
     
    133140    DXGK_ALLOCATIONUSAGEHINT UsageHint;
    134141    uint32_t iIndex;
     142    uint32_t cOpens;
     143    LIST_ENTRY OpenList;
     144    /* helps tracking when to release wine shared resource */
     145    uint32_t cShRcRefs;
     146    HANDLE hSharedHandle;
     147#if 0
     148    AVLPVNODECORE ShRcTreeEntry;
     149#endif
    135150    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
    136151    union
     
    143158typedef struct VBOXWDDM_RESOURCE
    144159{
    145     uint32_t fFlags;
     160    VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
    146161    volatile uint32_t cRefs;
    147162    VBOXWDDM_RC_DESC RcDesc;
     
    251266} VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD, *PVBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD;
    252267
     268typedef struct VBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT
     269{
     270    VBOXWDDM_DMA_PRIVATEDATA_BASEHDR Base;
     271    VBOXWDDM_DMA_ALLOCINFO aInfos[1];
     272} VBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT, *PVBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT;
     273
    253274typedef struct VBOXWDDM_OPENALLOCATION
    254275{
     276    LIST_ENTRY ListEntry;
    255277    D3DKMT_HANDLE  hAllocation;
     278    PVBOXWDDM_ALLOCATION pAllocation;
     279    PVBOXWDDM_DEVICE pDevice;
     280    uint32_t cShRcRefs;
    256281} VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION;
    257282
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h

    r38112 r38982  
    178178    PVBOXWDDM_ALLOCATION pAlloc;
    179179    VBOXVIDEOOFFSET offAlloc;
    180     UINT segmentIdAlloc;
     180    UINT segmentIdAlloc : 31;
     181    UINT fWriteOp : 1;
    181182    D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId;
    182183} VBOXWDDM_DMA_ALLOCINFO, *PVBOXWDDM_DMA_ALLOCINFO;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r38660 r38982  
    5151}
    5252
    53 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
     53DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromHandle(PVBOXMP_DEVEXT pDevExt, D3DKMT_HANDLE hAllocation)
    5454{
    5555    DXGKARGCB_GETHANDLEDATA GhData;
    56     GhData.hObject = pOa->hAllocation;
     56    GhData.hObject = hAllocation;
    5757    GhData.Type = DXGK_HANDLE_ALLOCATION;
    5858    GhData.Flags.Value = 0;
     
    6262DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromAllocList(PVBOXMP_DEVEXT pDevExt, DXGK_ALLOCATIONLIST *pAllocList)
    6363{
    64     return vboxWddmGetAllocationFromOpenData(pDevExt, (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation);
     64    PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation;
     65    return pOa->pAllocation;
    6566}
    6667
     
    955956                    VBoxMPCmnInitCustomVideoModes(pContext);
    956957                    VBoxWddmInvalidateVideoModesInfo(pContext);
     958#if 0
     959                    vboxShRcTreeInit(pContext);
     960#endif
    957961
    958962#ifdef VBOX_WITH_VIDEOHWACCEL
     
    10101014#ifdef VBOX_WITH_VIDEOHWACCEL
    10111015    vboxVhwaFree(pDevExt);
     1016#endif
     1017#if 0
     1018    vboxShRcTreeTerm(pDevExt);
    10121019#endif
    10131020
     
    17941801                vboxWddmAssignPrimary(pDevExt, &pDevExt->aSources[pAllocation->SurfDesc.VidPnSourceId], NULL, pAllocation->SurfDesc.VidPnSourceId);
    17951802            }
     1803
     1804#if 0
     1805            if (pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC)
     1806            {
     1807                if (pAllocation->hSharedHandle)
     1808                {
     1809                    vboxShRcTreeRemove(pDevExt, pAllocation);
     1810                }
     1811            }
     1812#endif
    17961813            break;
    17971814        }
     
    19031920            pAllocation->bVisible = FALSE;
    19041921            pAllocation->bAssigned = FALSE;
     1922            InitializeListHead(&pAllocation->OpenList);
    19051923
    19061924            switch (pAllocInfo->enmType)
     
    19571975                                {
    19581976                                    pAllocationInfo->Flags.CpuVisible = 1;
     1977                                }
     1978                                else
     1979                                {
     1980                                    pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle;
     1981#if 0
     1982                                    if (pAllocation->hSharedHandle)
     1983                                    {
     1984                                        vboxShRcTreePut(pDevExt, pAllocation);
     1985                                    }
     1986#endif
    19591987                                }
    19601988                            }
     
    32123240        case DXGK_OPERATION_FILL:
    32133241        {
     3242            Assert(pBuildPagingBuffer->Fill.FillPattern == 0);
     3243            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Fill.hAllocation;
    32143244//            pBuildPagingBuffer->pDmaBuffer = (uint8_t*)pBuildPagingBuffer->pDmaBuffer + VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_BPB_FILL);
    32153245            break;
     
    35563586            case VBOXESC_UHGSMI_SUBMIT:
    35573587            {
     3588                /* submit UHGSMI command */
    35583589                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35593590                PVBOXDISPIFESCAPE_UHGSMI_SUBMIT pSubmit = (PVBOXDISPIFESCAPE_UHGSMI_SUBMIT)pEscapeHdr;
     
    35743605            case VBOXESC_UHGSMI_ALLOCATE:
    35753606            {
     3607                /* allocate UHGSMI buffer */
    35763608                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35773609                PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE pAlocate = (PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE)pEscapeHdr;
     
    35893621            case VBOXESC_UHGSMI_DEALLOCATE:
    35903622            {
     3623                /* deallocate UHGSMI buffer */
    35913624                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35923625                PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE pDealocate = (PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE)pEscapeHdr;
     
    36043637            case VBOXESC_GETVBOXVIDEOCMCMD:
    36053638            {
     3639                /* get the list of r0->r3 commands (d3d window visible regions reporting )*/
    36063640                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    36073641                PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pRegions = (PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD)pEscapeHdr;
     
    36193653            case VBOXESC_SETVISIBLEREGION:
    36203654            {
     3655                /* visible regions for seamless */
    36213656                LPRGNDATA lpRgnData = VBOXDISPIFESCAPE_DATA(pEscapeHdr, RGNDATA);
    36223657                uint32_t cbData = VBOXDISPIFESCAPE_DATA_SIZE(pEscape->PrivateDriverDataSize);
     
    36823717            case VBOXESC_SCREENLAYOUT:
    36833718            {
     3719                /* set screen layout (unused currently) */
    36843720                Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT));
    36853721                if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT))
     
    37113747            case VBOXESC_SWAPCHAININFO:
    37123748            {
     3749                /* set swapchain information */
    37133750                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    37143751                Status = vboxWddmSwapchainCtxEscape(pDevExt, pContext, (PVBOXDISPIFESCAPE_SWAPCHAININFO)pEscapeHdr, pEscape->PrivateDriverDataSize);
     
    37173754            }
    37183755            case VBOXESC_REINITVIDEOMODES:
     3756            {
     3757                /* clear driver's internal videomodes cache */
    37193758                VBoxWddmInvalidateVideoModesInfo(pDevExt);
    37203759                Status = STATUS_SUCCESS;
    37213760                break;
     3761            }
     3762            case VBOXESC_SHRC_ADDREF:
     3763            case VBOXESC_SHRC_RELEASE:
     3764            {
     3765                PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)pEscape->hDevice;
     3766                /* query whether the allocation represanted by the given [wine-generated] shared resource handle still exists */
     3767                if (pEscape->PrivateDriverDataSize != sizeof (VBOXDISPIFESCAPE_SHRC_REF))
     3768                {
     3769                    WARN(("invalid buffer size for VBOXDISPIFESCAPE_SHRC_REF, was(%d), but expected (%d)",
     3770                            pEscape->PrivateDriverDataSize, sizeof (VBOXDISPIFESCAPE_SHRC_REF)));
     3771                    Status = STATUS_INVALID_PARAMETER;
     3772                    break;
     3773                }
     3774
     3775                PVBOXDISPIFESCAPE_SHRC_REF pShRcRef = (PVBOXDISPIFESCAPE_SHRC_REF)pEscapeHdr;
     3776                PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromHandle(pDevExt, (D3DKMT_HANDLE)pShRcRef->hAlloc);
     3777                if (!pAlloc)
     3778                {
     3779                    WARN(("failed to get allocation from handle"));
     3780                    Status = STATUS_INVALID_PARAMETER;
     3781                    break;
     3782                }
     3783
     3784                PVBOXWDDM_OPENALLOCATION pOa = NULL;
     3785                for (PLIST_ENTRY pCur = pAlloc->OpenList.Flink; pCur != &pAlloc->OpenList; pCur = pCur->Flink)
     3786                {
     3787                    PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);
     3788                    if (pCurOa->pDevice == pDevice)
     3789                    {
     3790                        pOa = pCurOa;
     3791                        break;
     3792                    }
     3793                }
     3794
     3795                if (!pOa)
     3796                {
     3797                    WARN(("failed to get open allocation from alloc"));
     3798                    Status = STATUS_INVALID_PARAMETER;
     3799                    break;
     3800                }
     3801
     3802                Assert(pAlloc->cShRcRefs >= pOa->cShRcRefs);
     3803
     3804                if (pEscapeHdr->escapeCode == VBOXESC_SHRC_ADDREF)
     3805                {
     3806#ifdef DEBUG
     3807                    Assert(!pAlloc->fAssumedDeletion);
     3808#endif
     3809                    ++pAlloc->cShRcRefs;
     3810                    ++pOa->cShRcRefs;
     3811                }
     3812                else
     3813                {
     3814                    Assert(pAlloc->cShRcRefs);
     3815                    Assert(pOa->cShRcRefs);
     3816                    --pAlloc->cShRcRefs;
     3817                    --pOa->cShRcRefs;
     3818#ifdef DEBUG
     3819                    Assert(!pAlloc->fAssumedDeletion);
     3820                    if (!pAlloc->cShRcRefs)
     3821                    {
     3822                        pAlloc->fAssumedDeletion = TRUE;
     3823                    }
     3824#endif
     3825                }
     3826
     3827                pShRcRef->EscapeHdr.u32CmdSpecific = pAlloc->cShRcRefs;
     3828                Status = STATUS_SUCCESS;
     3829                break;
     3830            }
    37223831            case VBOXESC_DBGPRINT:
    37233832            {
     
    45804689    if (Status == STATUS_SUCCESS)
    45814690    {
    4582         for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
     4691        UINT i = 0;
     4692        for (; i < pOpenAllocation->NumAllocations; ++i)
    45834693        {
    45844694            DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
    45854695            Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
    45864696            Assert(pInfo->pPrivateDriverData);
     4697            PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromHandle(pDevExt, pInfo->hAllocation);
     4698            if (!pAllocation)
     4699            {
     4700                WARN(("invalid handle"));
     4701                Status = STATUS_INVALID_PARAMETER;
     4702                break;
     4703            }
     4704
    45874705            PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
     4706            if (!pOa)
     4707            {
     4708                WARN(("failed to allocation alloc info"));
     4709                Status = STATUS_INSUFFICIENT_RESOURCES;
     4710                break;
     4711            }
     4712
     4713#ifdef DEBUG
     4714            for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink)
     4715            {
     4716                PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);
     4717                if (pCurOa->pDevice == pDevice)
     4718                {
     4719                    /* should not happen */
     4720                    Assert(0);
     4721                    break;
     4722                }
     4723            }
     4724            Assert(!pAllocation->fAssumedDeletion);
     4725#endif
     4726            InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry);
    45884727            pOa->hAllocation = pInfo->hAllocation;
     4728            pOa->pAllocation = pAllocation;
     4729            pOa->pDevice = pDevice;
    45894730            pInfo->hDeviceSpecificAllocation = pOa;
    45904731
     4732
    45914733            if (pRcInfo)
    45924734            {
     4735                Assert(pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC);
     4736
     4737                if (pInfo->PrivateDriverDataSize < sizeof (VBOXWDDM_ALLOCINFO)
     4738                        || !pInfo->pPrivateDriverData)
     4739                {
     4740                    WARN(("invalid data size"));
     4741                    vboxWddmMemFree(pOa);
     4742                    Status = STATUS_INVALID_PARAMETER;
     4743                    break;
     4744                }
     4745                PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;
     4746
    45934747#ifdef VBOX_WITH_VIDEOHWACCEL
    45944748                if (pRcInfo->RcDesc.fFlags.Overlay)
    45954749                {
    4596                     if (pInfo->PrivateDriverDataSize >= sizeof (VBOXWDDM_ALLOCINFO))
    4597                     {
    4598                         PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;
    4599                         PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromOpenData(pDevExt, pOa);
    4600                         Assert(pAllocation);
    4601                         if (pAllocation)
    4602                         {
    4603                             /* we have queried host for some surface info, like pitch & size,
    4604                              * need to return it back to the UMD (User Mode Drive) */
    4605                             pAllocInfo->SurfDesc = pAllocation->SurfDesc;
    4606                             /* success, just continue */
    4607                             continue;
    4608                         }
    4609                         else
    4610                             Status = STATUS_INVALID_PARAMETER;
    4611                     }
    4612                     else
    4613                         Status = STATUS_INVALID_PARAMETER;
    4614 
    4615                     /* we are here in case of error */
    4616                     AssertBreakpoint();
    4617 
    4618                     for (UINT j = 0; j < i; ++j)
    4619                     {
    4620                         DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j];
    4621                         PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation;
    4622                         vboxWddmMemFree(pOa2Free);
    4623                     }
     4750                    /* we have queried host for some surface info, like pitch & size,
     4751                     * need to return it back to the UMD (User Mode Drive) */
     4752                    pAllocInfo->SurfDesc = pAllocation->SurfDesc;
     4753                    /* success, just continue */
    46244754                }
    46254755#endif
     4756            }
     4757
     4758            ++pAllocation->cOpens;
     4759        }
     4760
     4761        if (Status != STATUS_SUCCESS)
     4762        {
     4763            for (UINT j = 0; j < i; ++j)
     4764            {
     4765                DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j];
     4766                PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation;
     4767                PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation;
     4768                RemoveEntryList(&pOa2Free->ListEntry);
     4769                Assert(pAllocation->cOpens);
     4770                --pAllocation->cOpens;
     4771                vboxWddmMemFree(pOa2Free);
    46264772            }
    46274773        }
     
    46454791    vboxVDbgBreakFv();
    46464792
     4793    PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice;
     4794    PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter;
     4795
    46474796    for (UINT i = 0; i < pCloseAllocation->NumAllocations; ++i)
    46484797    {
    4649         vboxWddmMemFree(pCloseAllocation->pOpenHandleList[i]);
     4798        PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pCloseAllocation->pOpenHandleList[i];
     4799        PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation;
     4800        RemoveEntryList(&pOa2Free->ListEntry);
     4801        Assert(pAllocation->cShRcRefs >= pOa2Free->cShRcRefs);
     4802        pAllocation->cShRcRefs -= pOa2Free->cShRcRefs;
     4803        Assert(pAllocation->cOpens);
     4804        --pAllocation->cOpens;
     4805        vboxWddmMemFree(pOa2Free);
    46504806    }
    46514807
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette