VirtualBox

Ignore:
Timestamp:
Jun 1, 2011 7:45:51 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
72046
Message:

wddm: memory leaks fixes, some cleanup

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

Legend:

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

    r36867 r37300  
    2121#include <stdio.h>
    2222
     23/* simple handle -> value table API */
    2324NTSTATUS vboxWddmHTableCreate(PVBOXWDDM_HTABLE pTbl, uint32_t cSize)
    2425{
     
    3536VOID vboxWddmHTableDestroy(PVBOXWDDM_HTABLE pTbl)
    3637{
     38    if (!pTbl->paData)
     39        return;
     40
    3741    vboxWddmMemFree(pTbl->paData);
    3842}
     
    5458    {
    5559        PVOID *pvNewData = (PVOID*)vboxWddmMemAllocZero(sizeof (pTbl->paData[0]) * cNewSize);
     60        if (!pvNewData)
     61        {
     62            WARN(("vboxWddmMemAllocZero failed for size (%d)", sizeof (pTbl->paData[0]) * cNewSize));
     63            return STATUS_NO_MEMORY;
     64        }
    5665        memcpy(pvNewData, pTbl->paData, sizeof (pTbl->paData[0]) * pTbl->cSize);
     66        vboxWddmMemFree(pTbl->paData);
    5767        pTbl->iNext2Search = pTbl->cSize;
    5868        pTbl->cSize = cNewSize;
     
    6171    }
    6272    else if (cNewSize >= pTbl->cData)
     73    {
     74        AssertFailed();
    6375        return STATUS_NOT_IMPLEMENTED;
     76    }
    6477    return STATUS_INVALID_PARAMETER;
    6578
     
    324337    Assert(pTst == pSwapchain);
    325338    RemoveEntryList(&pSwapchain->DevExtListEntry);
    326 //    pSwapchain->pContext = NULL;
    327339    pSwapchain->hSwapchainKm = NULL;
    328340    if (pSwapchain->pLastReportedRects)
     
    334346}
    335347
     348/* adds the given swapchain to the context's swapchain list
     349 * @return true on success */
    336350BOOLEAN vboxWddmSwapchainCtxAdd(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain)
    337351{
     
    343357}
    344358
     359/* removes the given swapchain from the context's swapchain list
     360 * */
    345361VOID vboxWddmSwapchainCtxRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain)
    346362{
     
    350366}
    351367
     368/* destroys all swapchains for the given context
     369 * */
    352370VOID vboxWddmSwapchainCtxDestroyAll(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext)
    353371{
     
    370388}
    371389
     390/* process the swapchain info passed from user-mode display driver & synchronizes the driver state with it */
    372391NTSTATUS vboxWddmSwapchainCtxEscape(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize)
    373392{
     
    403422    if (pSwapchainInfo->SwapchainInfo.hSwapchainKm)
    404423    {
    405 //            ExAcquireFastMutex(&pContext->SwapchainMutex);
    406424        ExAcquireFastMutex(&pDevExt->ContextMutex);
    407425        pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableGet(&pContext->Swapchains, (VBOXWDDM_HANDLE)pSwapchainInfo->SwapchainInfo.hSwapchainKm);
     
    455473    }
    456474
    457 //    ExReleaseFastMutex(&pContext->SwapchainMutex);
    458475    ExReleaseFastMutex(&pDevExt->ContextMutex);
    459476
     
    471488
    472489    return STATUS_SUCCESS;
     490}
     491
     492NTSTATUS vboxWddmSwapchainCtxInit(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext)
     493{
     494    NTSTATUS Status = vboxWddmHTableCreate(&pContext->Swapchains, 4);
     495    if (!NT_SUCCESS(Status))
     496    {
     497        WARN(("vboxWddmHTableCreate failes, Status (x%x)", Status));
     498        return Status;
     499    }
     500
     501    return STATUS_SUCCESS;
     502}
     503
     504VOID vboxWddmSwapchainCtxTerm(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext)
     505{
     506    vboxWddmSwapchainCtxDestroyAll(pDevExt, pContext);
     507    vboxWddmHTableDestroy(&pContext->Swapchains);
    473508}
    474509
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h

    r36867 r37300  
    7979VOID vboxWddmSwapchainCtxDestroyAll(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
    8080NTSTATUS vboxWddmSwapchainCtxEscape(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize);
     81NTSTATUS vboxWddmSwapchainCtxInit(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
     82VOID vboxWddmSwapchainCtxTerm(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext);
    8183
    8284
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r36867 r37300  
    197197    UINT  EngineAffinity;
    198198//    UINT uLastCompletedCmdFenceId;
    199     FAST_MUTEX SwapchainMutex;
    200199    VBOXWDDM_HTABLE Swapchains;
    201200    VBOXVIDEOCM_CTX CmContext;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r37207 r37300  
    12281228    /* DxgkDdiUnload should be made pageable. */
    12291229    PAGED_CODE();
    1230     LOGF(("ENTER"));
     1230    LOGF((": unloading"));
    12311231
    12321232    vboxVDbgBreakFv();
    12331233
    1234     LOGF(("LEAVE"));
     1234    PRTLOGGER pLogger = RTLogRelSetDefaultInstance(NULL);
     1235    if (pLogger)
     1236    {
     1237        RTLogDestroy(pLogger);
     1238    }
     1239    pLogger = RTLogSetDefaultInstance(NULL);
     1240    if (pLogger)
     1241    {
     1242        RTLogDestroy(pLogger);
     1243    }
    12351244}
    12361245
     
    35863595        {
    35873596            /* @todo: check that we actually need the current source->target */
    3588             D3DKMDT_2DREGION Resolution;
    35893597            PVBOXWDDM_VIDEOMODES_INFO pInfo = &pInfos[i];
    35903598            VIDEO_MODE_INFORMATION *pModeInfo = &pInfo->aModes[pInfo->iPreferredMode];
     3599#if 1
     3600            D3DKMDT_2DREGION Resolution;
    35913601            Resolution.cx = pModeInfo->VisScreenWidth;
    35923602            Resolution.cy = pModeInfo->VisScreenHeight;
    35933603            Status = vboxVidPnCheckAddMonitorModes(pDevExt, i, D3DKMDT_MCO_DRIVER, &Resolution, 1);
     3604#else
     3605            Status = vboxVidPnCheckAddMonitorModes(pDevExt, i, D3DKMDT_MCO_DRIVER, pInfo->aResolutions, pInfo->cResolutions);
     3606#endif
    35943607            Assert(Status == STATUS_SUCCESS);
    35953608            if (Status != STATUS_SUCCESS)
     
    50535066                        if (Status == STATUS_SUCCESS)
    50545067                        {
    5055                             ExInitializeFastMutex(&pContext->SwapchainMutex);
    5056                             Status = vboxWddmHTableCreate(&pContext->Swapchains, 4);
     5068                            Status = vboxWddmSwapchainCtxInit(pDevExt, pContext);
    50575069                            Assert(Status == STATUS_SUCCESS);
    50585070                            if (Status == STATUS_SUCCESS)
     
    50695081                                    break;
    50705082                                }
    5071                                 vboxWddmHTableDestroy(&pContext->Swapchains);
     5083
     5084                                vboxWddmSwapchainCtxTerm(pDevExt, pContext);
    50725085                            }
    50735086                        }
     
    51495162        if (Status == STATUS_SUCCESS)
    51505163        {
    5151             vboxWddmSwapchainCtxDestroyAll(pDevExt, pContext);
     5164            vboxWddmSwapchainCtxTerm(pDevExt, pContext);
    51525165            vboxWddmMemFree(pContext);
    51535166        }
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