VirtualBox

Changeset 108786 in vbox for trunk/src


Ignore:
Timestamp:
Mar 28, 2025 6:24:19 PM (3 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168221
Message:

WDDM: screen target commands. bugref:10885

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

Legend:

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

    r106061 r108786  
    573573
    574574
     575NTSTATUS Svga3dDefineGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     576                                    uint32_t stid,
     577                                    uint32_t width,
     578                                    uint32_t height,
     579                                    int32_t xRoot,
     580                                    int32_t yRoot,
     581                                    SVGAScreenTargetFlags flags,
     582                                    uint32_t dpi)
     583{
     584    NTSTATUS Status = STATUS_SUCCESS;
     585
     586    const uint32_t cbSubmit =   sizeof(SVGA3dCmdHeader)
     587                              + sizeof(SVGA3dCmdDefineGBScreenTarget);
     588
     589    void *pvCmd = SvgaReserve(pSvga, cbSubmit);
     590    if (pvCmd)
     591    {
     592        Svga3dCmdDefineGBScreenTarget(pvCmd, stid, width, height, xRoot, yRoot, flags, dpi);
     593        SvgaCommit(pSvga, cbSubmit);
     594    }
     595    else
     596    {
     597        Status = STATUS_INSUFFICIENT_RESOURCES;
     598    }
     599
     600    return Status;
     601}
     602
     603
     604NTSTATUS Svga3dDestroyGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     605                                     uint32_t stid)
     606{
     607    NTSTATUS Status = STATUS_SUCCESS;
     608
     609    const uint32_t cbSubmit =   sizeof(SVGA3dCmdHeader)
     610                              + sizeof(SVGA3dCmdDestroyGBScreenTarget);
     611
     612    void *pvCmd = SvgaReserve(pSvga, cbSubmit);
     613    if (pvCmd)
     614    {
     615        Svga3dCmdDestroyGBScreenTarget(pvCmd, stid);
     616        SvgaCommit(pSvga, cbSubmit);
     617    }
     618    else
     619    {
     620        Status = STATUS_INSUFFICIENT_RESOURCES;
     621    }
     622
     623    return Status;
     624}
     625
     626
     627NTSTATUS Svga3dBindGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     628                                  uint32_t stid,
     629                                  uint32_t sid)
     630{
     631    NTSTATUS Status = STATUS_SUCCESS;
     632
     633    const uint32_t cbSubmit =   sizeof(SVGA3dCmdHeader)
     634                              + sizeof(SVGA3dCmdBindGBScreenTarget);
     635
     636    void *pvCmd = SvgaReserve(pSvga, cbSubmit);
     637    if (pvCmd)
     638    {
     639        Svga3dCmdBindGBScreenTarget(pvCmd, stid, sid);
     640        SvgaCommit(pSvga, cbSubmit);
     641    }
     642    else
     643    {
     644        Status = STATUS_INSUFFICIENT_RESOURCES;
     645    }
     646
     647    return Status;
     648}
     649
     650
    575651DECLINLINE(NTSTATUS) svgaIdAlloc(PVBOXWDDM_EXT_VMSVGA pSvga,
    576652                                 uint32_t *pu32Bits,
     
    662738    return svgaOTableIdFree(pSvga, pSvga->au32MobBits, sizeof(pSvga->au32MobBits),
    663739                            SVGA_OTABLE_MOB, u32MobId);
     740}
     741
     742NTSTATUS SvgaScreenTargetIdAlloc(PVBOXWDDM_EXT_VMSVGA pSvga,
     743                                 uint32_t *pu32ScreenTargetId)
     744{
     745    return svgaOTableIdAlloc(pSvga, pSvga->au32ScreenTargetBits, sizeof(pSvga->au32ScreenTargetBits),
     746                             SVGA_OTABLE_SCREENTARGET, pu32ScreenTargetId);
     747}
     748
     749NTSTATUS SvgaScreenTargetIdFree(PVBOXWDDM_EXT_VMSVGA pSvga,
     750                                uint32_t u32ScreenTargetId)
     751{
     752    return svgaOTableIdFree(pSvga, pSvga->au32ScreenTargetBits, sizeof(pSvga->au32ScreenTargetBits),
     753                            SVGA_OTABLE_SCREENTARGET, u32ScreenTargetId);
    664754}
    665755
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/Svga.h

    r106061 r108786  
    290290    /** Bitmap of used MOB ids. Bit 0 - context id 0, etc. */
    291291    uint32_t au32MobBits[(SVGA3D_MAX_MOBS + 31) / 32];
     292
     293    /** Bitmap of used screen target ids. Bit 0 - stid 0, etc. */
     294    uint32_t au32ScreenTargetBits[(64 + 31) / 32]; /// @todo VBOX_VIDEO_MAX_SCREENS
    292295} VBOXWDDM_EXT_VMSVGA;
    293296typedef struct VBOXWDDM_EXT_VMSVGA *PVBOXWDDM_EXT_VMSVGA;
     
    406409NTSTATUS SvgaScreenDestroy(PVBOXWDDM_EXT_VMSVGA pSvga,
    407410                           uint32_t u32ScreenId);
     411
     412NTSTATUS Svga3dDefineGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     413                                    uint32_t stid,
     414                                    uint32_t width,
     415                                    uint32_t height,
     416                                    int32_t xRoot,
     417                                    int32_t yRoot,
     418                                    SVGAScreenTargetFlags flags,
     419                                    uint32_t dpi);
     420NTSTATUS Svga3dDestroyGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     421                                     uint32_t stid);
     422NTSTATUS Svga3dBindGBScreenTarget(PVBOXWDDM_EXT_VMSVGA pSvga,
     423                                  uint32_t stid,
     424                                  uint32_t sid);
    408425
    409426NTSTATUS SvgaContextCreate(PVBOXWDDM_EXT_VMSVGA pSvga,
     
    599616                       uint32_t u32MobId);
    600617
     618NTSTATUS SvgaScreenTargetIdAlloc(PVBOXWDDM_EXT_VMSVGA pSvga,
     619                                 uint32_t *pu32ScreenTargetId);
     620
     621NTSTATUS SvgaScreenTargetIdFree(PVBOXWDDM_EXT_VMSVGA pSvga,
     622                                uint32_t u32ScreenTargetId);
     623
    601624NTSTATUS SvgaDXContextCreate(PVBOXWDDM_EXT_VMSVGA pSvga,
    602625                             uint32_t u32Cid);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/SvgaCmd.cpp

    r106061 r108786  
    7070}
    7171
     72void Svga3dCmdDefineGBScreenTarget(void *pvCmd,
     73                                   uint32_t stid,
     74                                   uint32_t width,
     75                                   uint32_t height,
     76                                   int32_t xRoot,
     77                                   int32_t yRoot,
     78                                   SVGAScreenTargetFlags flags,
     79                                   uint32_t dpi)
     80{
     81    SVGA3dCmdHeader *pHeader = (SVGA3dCmdHeader *)pvCmd;
     82    SVGA3dCmdDefineGBScreenTarget *pCommand = (SVGA3dCmdDefineGBScreenTarget *)&pHeader[1];
     83
     84    uint32_t cbCommand = sizeof(SVGA3dCmdDefineGBScreenTarget);
     85    pHeader->id = SVGA_3D_CMD_DEFINE_GB_SCREENTARGET;
     86    pHeader->size = cbCommand;
     87
     88    pCommand->stid = stid;
     89    pCommand->width = width;
     90    pCommand->height = height;
     91    pCommand->xRoot = xRoot;
     92    pCommand->yRoot = yRoot;
     93    pCommand->flags = flags;
     94    pCommand->dpi = dpi;
     95}
     96
     97void Svga3dCmdDestroyGBScreenTarget(void *pvCmd,
     98                                    uint32_t stid)
     99{
     100    SVGA3dCmdHeader *pHeader = (SVGA3dCmdHeader *)pvCmd;
     101    SVGA3dCmdDestroyGBScreenTarget *pCommand = (SVGA3dCmdDestroyGBScreenTarget *)&pHeader[1];
     102
     103    uint32_t cbCommand = sizeof(SVGA3dCmdDestroyGBScreenTarget);
     104    pHeader->id = SVGA_3D_CMD_DESTROY_GB_SCREENTARGET;
     105    pHeader->size = cbCommand;
     106
     107    pCommand->stid = stid;
     108}
     109
     110void Svga3dCmdBindGBScreenTarget(void *pvCmd,
     111                                 uint32_t stid,
     112                                 uint32_t sid)
     113{
     114    SVGA3dCmdHeader *pHeader = (SVGA3dCmdHeader *)pvCmd;
     115    SVGA3dCmdBindGBScreenTarget *pCommand = (SVGA3dCmdBindGBScreenTarget *)&pHeader[1];
     116
     117    uint32_t cbCommand = sizeof(SVGA3dCmdBindGBScreenTarget);
     118    pHeader->id = SVGA_3D_CMD_BIND_GB_SCREENTARGET;
     119    pHeader->size = cbCommand;
     120
     121    pCommand->stid = stid;
     122    pCommand->image.sid = sid;
     123    pCommand->image.face = 0;
     124    pCommand->image.mipmap = 0;
     125}
     126
    72127void SvgaCmdUpdate(void *pvCmd, uint32_t u32X, uint32_t u32Y, uint32_t u32Width, uint32_t u32Height)
    73128{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/gallium/SvgaCmd.h

    r106061 r108786  
    3838                         bool fPrimary, uint32_t u32VRAMOffset, bool fBlank);
    3939void SvgaCmdDestroyScreen(void *pvCmd, uint32_t u32Id);
     40void Svga3dCmdDefineGBScreenTarget(void *pvCmd,
     41                                   uint32_t stid,
     42                                   uint32_t width,
     43                                   uint32_t height,
     44                                   int32_t xRoot,
     45                                   int32_t yRoot,
     46                                   SVGAScreenTargetFlags flags,
     47                                   uint32_t dpi);
     48void Svga3dCmdDestroyGBScreenTarget(void *pvCmd,
     49                                    uint32_t stid);
     50void Svga3dCmdBindGBScreenTarget(void *pvCmd,
     51                                 uint32_t stid,
     52                                 uint32_t sid);
    4053void SvgaCmdUpdate(void *pvCmd, uint32_t u32X, uint32_t u32Y, uint32_t u32Width, uint32_t u32Height);
    4154void SvgaCmdDefineCursor(void *pvCmd, uint32_t u32HotspotX, uint32_t u32HotspotY, uint32_t u32Width, uint32_t u32Height,
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