VirtualBox

Ignore:
Timestamp:
Jun 2, 2023 3:22:18 PM (21 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
157732
Message:

WDDM: check host capabilities. bugref:9845

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

Legend:

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

    r100010 r100053  
    223223}
    224224
     225static NTSTATUS svgaCreateMiniportMob(VBOXWDDM_EXT_VMSVGA *pSvga)
     226{
     227    NTSTATUS Status;
     228
     229    uint32_t const cbMiniportMob = RT_ALIGN_32(sizeof(VMSVGAMINIPORTMOB), PAGE_SIZE);
     230    RTR0MEMOBJ hMemObjMiniportMob;
     231    int rc = RTR0MemObjAllocPageTag(&hMemObjMiniportMob, cbMiniportMob,
     232                                    false /* executable R0 mapping */, "VMSVGAMOB0");
     233    if (RT_SUCCESS(rc))
     234    {
     235        Status = SvgaMobCreate(pSvga, &pSvga->pMiniportMob, cbMiniportMob / PAGE_SIZE, 0);
     236        if (NT_SUCCESS(Status))
     237        {
     238            Status = SvgaMobSetMemObj(pSvga->pMiniportMob, hMemObjMiniportMob);
     239            if (NT_SUCCESS(Status))
     240            {
     241                void *pvCmd = SvgaCmdBuf3dCmdReserve(pSvga, SVGA_3D_CMD_DEFINE_GB_MOB64, sizeof(SVGA3dCmdDefineGBMob64), SVGA3D_INVALID_ID);
     242                if (pvCmd)
     243                {
     244                    SVGA3dCmdDefineGBMob64 *pCmd = (SVGA3dCmdDefineGBMob64 *)pvCmd;
     245                    pCmd->mobid       = VMSVGAMOB_ID(pSvga->pMiniportMob);
     246                    pCmd->ptDepth     = pSvga->pMiniportMob->gbo.enmMobFormat;
     247                    pCmd->base        = pSvga->pMiniportMob->gbo.base;
     248                    pCmd->sizeInBytes = pSvga->pMiniportMob->gbo.cbGbo;
     249                    SvgaCmdBufCommit(pSvga, sizeof(*pCmd));
     250
     251                    pSvga->pMiniportMobData = (VMSVGAMINIPORTMOB volatile *)RTR0MemObjAddress(hMemObjMiniportMob);
     252                    memset((void *)pSvga->pMiniportMobData, 0, cbMiniportMob);
     253                    RTListInit(&pSvga->listMobDeferredDestruction);
     254                    //pSvga->u64MobFence = 0;
     255                }
     256                else
     257                    AssertFailedStmt(Status = STATUS_INSUFFICIENT_RESOURCES);
     258            }
     259        }
     260    }
     261    else
     262        AssertFailedStmt(Status = STATUS_INSUFFICIENT_RESOURCES);
     263
     264    return Status;
     265}
     266
    225267static void svgaHwStop(VBOXWDDM_EXT_VMSVGA *pSvga)
    226268{
     
    339381        }
    340382
    341         /* Free the miniport mob at last. Can't use SvgaMobDestroy here because it tells the host to write a fence
    342          * value to this mob. */
    343         void *pvCmd = SvgaCmdBuf3dCmdReserve(pSvga, SVGA_3D_CMD_DESTROY_GB_MOB, sizeof(SVGA3dCmdDestroyGBMob), SVGA3D_INVALID_ID);
    344         if (pvCmd)
    345         {
    346             SVGA3dCmdDestroyGBMob *pCmd = (SVGA3dCmdDestroyGBMob *)pvCmd;
    347             pCmd->mobid = VMSVGAMOB_ID(pSvga->pMiniportMob);
    348             SvgaCmdBufCommit(pSvga, sizeof(*pCmd));
    349         }
    350         else
    351             AssertFailed();
     383        if (RT_BOOL(pSvga->u32Caps & SVGA_CAP_DX))
     384        {
     385            /* Free the miniport mob at last. Can't use SvgaMobDestroy here because it tells the host to write a fence
     386             * value to this mob. */
     387            void *pvCmd = SvgaCmdBuf3dCmdReserve(pSvga, SVGA_3D_CMD_DESTROY_GB_MOB, sizeof(SVGA3dCmdDestroyGBMob), SVGA3D_INVALID_ID);
     388            if (pvCmd)
     389            {
     390                SVGA3dCmdDestroyGBMob *pCmd = (SVGA3dCmdDestroyGBMob *)pvCmd;
     391                pCmd->mobid = VMSVGAMOB_ID(pSvga->pMiniportMob);
     392                SvgaCmdBufCommit(pSvga, sizeof(*pCmd));
     393            }
     394            else
     395                AssertFailed();
     396        }
    352397
    353398        svgaHwStop(pSvga);
    354399
    355         SvgaMobFree(pSvga, pSvga->pMiniportMob); /* After svgaHwStop because it waits for command buffer completion. */
     400        if (RT_BOOL(pSvga->u32Caps & SVGA_CAP_DX))
     401            SvgaMobFree(pSvga, pSvga->pMiniportMob); /* After svgaHwStop because it waits for command buffer completion. */
    356402
    357403        Status = pDxgkInterface->DxgkCbUnmapMemory(pDxgkInterface->DeviceHandle,
     
    433479                if (NT_SUCCESS(Status))
    434480                {
    435                     uint32_t const cbMiniportMob = RT_ALIGN_32(sizeof(VMSVGAMINIPORTMOB), PAGE_SIZE);
    436                     RTR0MEMOBJ hMemObjMiniportMob;
    437                     int rc = RTR0MemObjAllocPageTag(&hMemObjMiniportMob, cbMiniportMob,
    438                                                     false /* executable R0 mapping */, "VMSVGAMOB0");
    439                     if (RT_SUCCESS(rc))
    440                     {
    441                         Status = SvgaMobCreate(pSvga, &pSvga->pMiniportMob, cbMiniportMob / PAGE_SIZE, 0);
    442                         if (NT_SUCCESS(Status))
    443                         {
    444                             Status = SvgaMobSetMemObj(pSvga->pMiniportMob, hMemObjMiniportMob);
    445                             if (NT_SUCCESS(Status))
    446                             {
    447                                 void *pvCmd = SvgaCmdBuf3dCmdReserve(pSvga, SVGA_3D_CMD_DEFINE_GB_MOB64, sizeof(SVGA3dCmdDefineGBMob64), SVGA3D_INVALID_ID);
    448                                 if (pvCmd)
    449                                 {
    450                                     SVGA3dCmdDefineGBMob64 *pCmd = (SVGA3dCmdDefineGBMob64 *)pvCmd;
    451                                     pCmd->mobid       = VMSVGAMOB_ID(pSvga->pMiniportMob);
    452                                     pCmd->ptDepth     = pSvga->pMiniportMob->gbo.enmMobFormat;
    453                                     pCmd->base        = pSvga->pMiniportMob->gbo.base;
    454                                     pCmd->sizeInBytes = pSvga->pMiniportMob->gbo.cbGbo;
    455                                     SvgaCmdBufCommit(pSvga, sizeof(*pCmd));
    456 
    457                                     pSvga->pMiniportMobData = (VMSVGAMINIPORTMOB volatile *)RTR0MemObjAddress(hMemObjMiniportMob);
    458                                     memset((void *)pSvga->pMiniportMobData, 0, cbMiniportMob);
    459                                     RTListInit(&pSvga->listMobDeferredDestruction);
    460                                     //pSvga->u64MobFence = 0;
    461                                 }
    462                                 else
    463                                     AssertFailedStmt(Status = STATUS_INSUFFICIENT_RESOURCES);
    464                             }
    465                         }
    466                     }
    467                     else
    468                        AssertFailedStmt(Status = STATUS_INSUFFICIENT_RESOURCES);
     481                    if (RT_BOOL(pSvga->u32Caps & SVGA_CAP_DX))
     482                        Status = svgaCreateMiniportMob(pSvga);
    469483                }
    470484            }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/VBoxMPDX.cpp

    r99998 r100053  
    985985NTSTATUS DxgkDdiDXBuildPagingBuffer(PVBOXMP_DEVEXT pDevExt, DXGKARG_BUILDPAGINGBUFFER *pBuildPagingBuffer)
    986986{
    987     AssertReturn(pBuildPagingBuffer->DmaBufferPrivateDataSize >= sizeof(GARENDERDATA), STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER);
     987    if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof(GARENDERDATA))
     988        return STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;
    988989
    989990    NTSTATUS Status = STATUS_SUCCESS;
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