VirtualBox

Ignore:
Timestamp:
May 5, 2025 6:17:33 PM (4 days ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168723
Message:

WDDM: Miniport: unify handling of guest backing memory for surfaces, object tables, etc. bugref:10885

File:
1 edited

Legend:

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

    r108786 r109165  
    55
    66/*
    7  * Copyright (C) 2016-2024 Oracle and/or its affiliates.
     7 * Copyright (C) 2016-2025 Oracle and/or its affiliates.
    88 *
    99 * This file is part of VirtualBox base platform packages, as
     
    3434#include "VBoxMPGaUtils.h"
    3535
     36#include <iprt/asm.h>
    3637#include <iprt/assert.h>
    3738#include <iprt/avl.h>
     
    164165typedef struct VMSVGAGBO
    165166{
     167    int32_t volatile            cRefs;                      /* Reference count */
     168    struct
     169    {
     170        uint32_t                fMdl : 1;
     171        uint32_t                reserved : 31;
     172    }                           flags;
    166173    uint32_t                    cbGbo;                      /* Size of gbo in bytes. */
    167174    uint32_t                    cPTPages;                   /* How many pages are required to hold PPN64 page table. */
    168175    SVGAMobFormat               enmMobFormat;               /* Page table format. */
     176    union                                                   /* Backing memory. */
     177    {
     178        PMDL                    pMdl;
     179        RTR0MEMOBJ              hMemObj;
     180    };
    169181    PPN64                       base;                       /* Page which contains the page table. */
    170182    RTR0MEMOBJ                  hMemObjPT;                  /* Page table pages. */
     
    174186#define SVGA3D_MAX_MOBS (SVGA3D_MAX_CONTEXT_IDS + SVGA3D_MAX_CONTEXT_IDS + SVGA3D_MAX_SURFACE_IDS)
    175187
    176 /* Memory OBject: a gbo with an id, possibly bound to an allocation. */
    177 typedef struct VMSVGAMOB
    178 {
    179     AVLU32NODECORE              core;                       /* AVL entry. Key is mobid, allocated by the miniport. */
    180     HANDLE                      hAllocation;                /* Allocation which is bound to the mob. */
    181     VMSVGAGBO                   gbo;                        /* Gbo for this mob. */
    182     RTR0MEMOBJ                  hMemObj;                    /* The guest memory if allocated by miniport. */
    183     uint32_t                    u64MobFence;                /* Free by the guest when the host reports this fence value. */
    184     RTLISTNODE                  node;                       /* VBOXWDDM_EXT_VMSVGA::listMobDeferredDestruction */
    185 } VMSVGAMOB, *PVMSVGAMOB;
    186 
    187 #define VMSVGAMOB_ID(a_pMob) ((a_pMob)->core.Key)
    188 
    189188typedef struct VMSVGAOT
    190189{
    191     VMSVGAGBO                   gbo;
    192     RTR0MEMOBJ                  hMemObj;
     190    PVMSVGAGBO                  pGbo;
    193191    uint32_t                    cEntries;                   /* How many objects can be stored in the OTable. */
    194192} VMSVGAOT, *PVMSVGAOT;
     
    213211    uint32_t u32GmrMaxPages;  /** SVGA_REG_GMRS_MAX_PAGES */
    214212    uint32_t u32MemorySize;   /** SVGA_REG_MEMORY_SIZE */
     213    uint32_t u32MaxMobSize;   /** SVGA_REG_MOB_MAX_SIZE */
    215214    uint32_t u32MaxTextureWidth;  /** SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH */
    216215    uint32_t u32MaxTextureHeight; /** SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT */
     
    261260    VMSVGAOT aOT[SVGA_OTABLE_DX_MAX];
    262261
    263     PVMSVGAMOB pMiniportMob; /* Used by miniport to communicate with the device. */
     262    /* Used by miniport to communicate with the device. */
     263    PVMSVGAGBO pMiniportGbo;
     264    SVGAMobId mobidMiniport;
    264265    struct VMSVGAMINIPORTMOB volatile *pMiniportMobData; /* Pointer to the miniport mob content. */
    265266
    266267    uint64_t volatile u64MobFence;
    267268    RTLISTANCHOR listMobDeferredDestruction; /* Mob to be deleted after. */
     269    int32_t volatile cQueuedWorkItems;
    268270
    269271#ifdef DEBUG
    270272    /* Statistics. */
     273    uint32_t volatile cAllocatedGbos;
    271274    uint32_t volatile cAllocatedMobs;
    272     uint32_t volatile cAllocatedMobPages;
    273275    uint32_t volatile cAllocatedGmrs;
    274276    uint32_t volatile cAllocatedGmrPages;
     
    303305typedef struct VMSVGACOT
    304306{
    305     PVMSVGAMOB              pMob;                       /* COTable mob. */
     307    SVGAMobId               mobid;                      /* COTable mob. */
    306308    uint32_t                cEntries;                   /* How many objects can be stored in the COTable. */
    307309} VMSVGACOT, *PVMSVGACOT;
     
    644646#endif
    645647
    646 NTSTATUS SvgaGboInit(VMSVGAGBO *pGbo, uint32_t cPages);
    647 void SvgaGboFree(VMSVGAGBO *pGbo);
    648 NTSTATUS SvgaGboFillPageTableForMDL(PVMSVGAGBO pGbo,
    649                                     PMDL pMdl,
    650                                     uint32_t MdlOffset);
    651 NTSTATUS SvgaGboFillPageTableForMemObj(PVMSVGAGBO pGbo,
    652                                        RTR0MEMOBJ hMemObj);
     648NTSTATUS SvgaGboCreate(VBOXWDDM_EXT_VMSVGA *pSvga,
     649                       PVMSVGAGBO *ppGbo,
     650                       uint32_t cbGbo,
     651                       const char *pszTag);
     652NTSTATUS SvgaGboCreateForMdl(VBOXWDDM_EXT_VMSVGA *pSvga,
     653                             PVMSVGAGBO *ppGbo,
     654                             SIZE_T NumberOfPages,
     655                             PMDL pMdl,
     656                             ULONG MdlOffset);
     657void SvgaGboFree(VBOXWDDM_EXT_VMSVGA *pSvga,
     658                 VMSVGAGBO *pGbo);
     659
     660DECLINLINE(void) SvgaGboReference(PVMSVGAGBO pGbo)
     661{
     662    if (pGbo)
     663    {
     664        int32_t const c = ASMAtomicIncS32(&pGbo->cRefs);
     665        Assert(c > 0); RT_NOREF(c);
     666    }
     667}
     668
     669DECLINLINE(void) SvgaGboUnreference(VBOXWDDM_EXT_VMSVGA *pSvga,
     670                                    PVMSVGAGBO *ppGbo)
     671{
     672    if (*ppGbo)
     673    {
     674        int32_t const c = ASMAtomicDecS32(&(*ppGbo)->cRefs);
     675        Assert(c >= 0);
     676        if (c == 0)
     677            SvgaGboFree(pSvga, *ppGbo);
     678        *ppGbo = NULL;
     679    }
     680}
    653681
    654682void SvgaMobFree(VBOXWDDM_EXT_VMSVGA *pSvga,
    655                  PVMSVGAMOB pMob);
    656 PVMSVGAMOB SvgaMobQuery(VBOXWDDM_EXT_VMSVGA *pSvga,
    657                         uint32_t mobid);
    658 NTSTATUS SvgaMobCreate(VBOXWDDM_EXT_VMSVGA *pSvga,
    659                        PVMSVGAMOB *ppMob,
    660                        uint32_t cMobPages,
    661                        HANDLE hAllocation);
    662 NTSTATUS SvgaMobSetMemObj(PVMSVGAMOB pMob,
    663                           RTR0MEMOBJ hMemObj);
     683                 SVGAMobId *pMobid);
     684NTSTATUS SvgaMobAlloc(VBOXWDDM_EXT_VMSVGA *pSvga,
     685                      SVGAMobId *pMobid,
     686                      PVMSVGAGBO pGbo);
     687void *SvgaMobAddress(VBOXWDDM_EXT_VMSVGA *pSvga,
     688                     SVGAMobId mobid);
     689NTSTATUS SvgaMobDefine(VBOXWDDM_EXT_VMSVGA *pSvga,
     690                       SVGAMobId mobid,
     691                       void *pvCmd,
     692                       uint32_t cbReserved,
     693                       uint32_t *pcbCmd);
    664694NTSTATUS SvgaMobDestroy(VBOXWDDM_EXT_VMSVGA *pSvga,
    665                         PVMSVGAMOB pMob,
     695                        SVGAMobId mobid,
    666696                        void *pvCmd,
    667697                        uint32_t cbReserved,
    668698                        uint32_t *pcbCmd);
     699void SvgaDeferredMobDestruction(PVBOXWDDM_EXT_VMSVGA pSvga);
    669700
    670701NTSTATUS SvgaCOTNotifyId(VBOXWDDM_EXT_VMSVGA *pSvga,
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