VirtualBox

Changeset 95085 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
May 25, 2022 5:02:14 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
151557
Message:

Devices/Graphics: stream output; DrawAuto; Grow[C]OTables: bugref:9830

Location:
trunk/src/VBox/Devices/Graphics
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp

    r95062 r95085  
    420420#ifdef VBOX_WITH_VMSVGA3D
    421421
    422 static int vmsvgaR3GboCreate(PVMSVGAR3STATE pSvgaR3State, SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, bool fGCPhys64, bool fWriteProtected, PVMSVGAGBO pGbo)
     422static int vmsvgaR3GboCreate(PVMSVGAR3STATE pSvgaR3State, SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, bool fWriteProtected, PVMSVGAGBO pGbo)
    423423{
    424424    ASSERT_GUEST_RETURN(sizeInBytes <= _128M, VERR_INVALID_PARAMETER); /** @todo Less than SVGA_REG_MOB_MAX_SIZE */
     
    434434
    435435    /* Verify and normalize the ptDepth value. */
     436    bool fGCPhys64; /* Whether the page table contains 64 bit page numbers. */
    436437    if (RT_LIKELY(   ptDepth == SVGA3D_MOBFMT_PTDEPTH64_0
    437438                  || ptDepth == SVGA3D_MOBFMT_PTDEPTH64_1
    438439                  || ptDepth == SVGA3D_MOBFMT_PTDEPTH64_2))
    439         ASSERT_GUEST_RETURN(fGCPhys64, VERR_INVALID_PARAMETER);
     440        fGCPhys64 = true;
    440441    else if (   ptDepth == SVGA3D_MOBFMT_PTDEPTH_0
    441442             || ptDepth == SVGA3D_MOBFMT_PTDEPTH_1
    442443             || ptDepth == SVGA3D_MOBFMT_PTDEPTH_2)
    443444    {
    444         ASSERT_GUEST_RETURN(!fGCPhys64, VERR_INVALID_PARAMETER);
     445        fGCPhys64 = false;
    445446        /* Shift ptDepth to the SVGA3D_MOBFMT_PTDEPTH64_x range. */
    446447        ptDepth = (SVGAMobFormat)(ptDepth + SVGA3D_MOBFMT_PTDEPTH64_0 - SVGA3D_MOBFMT_PTDEPTH_0);
    447448    }
    448449    else if (ptDepth == SVGA3D_MOBFMT_RANGE)
    449     { }
     450        fGCPhys64 = false; /* Does not matter, there is no page table. */
    450451    else
    451452        ASSERT_GUEST_FAILED_RETURN(VERR_INVALID_PARAMETER);
     
    763764}
    764765
     766static int vmsvgaR3GboCopy(PVMSVGAR3STATE pSvgaR3State, PVMSVGAGBO pGboDst, uint32_t offDst,
     767                           PVMSVGAGBO pGboSrc, uint32_t offSrc, uint32_t cbCopy)
     768{
     769    uint32_t const cbTmpBuf = GUEST_PAGE_SIZE;
     770    void *pvTmpBuf = RTMemTmpAlloc(cbTmpBuf);
     771    AssertPtrReturn(pvTmpBuf, VERR_NO_MEMORY);
     772
     773    int  rc = VINF_SUCCESS;
     774    while (cbCopy > 0)
     775    {
     776        uint32_t const cbToCopy = RT_MIN(cbTmpBuf, cbCopy);
     777
     778        rc = vmsvgaR3GboRead(pSvgaR3State, pGboSrc, offSrc, pvTmpBuf, cbToCopy);
     779        AssertRCBreak(rc);
     780
     781        rc = vmsvgaR3GboWrite(pSvgaR3State, pGboDst, offDst, pvTmpBuf, cbToCopy);
     782        AssertRCBreak(rc);
     783
     784        offSrc += cbToCopy;
     785        offDst += cbToCopy;
     786        cbCopy -= cbToCopy;
     787    }
     788
     789    RTMemTmpFree(pvTmpBuf);
     790    return rc;
     791}
    765792
    766793
     
    771798 */
    772799
     800static int vmsvgaR3OTableSetOrGrow(PVMSVGAR3STATE pSvgaR3State, SVGAOTableType type, PPN64 baseAddress,
     801                                   uint32_t sizeInBytes, uint32 validSizeInBytes, SVGAMobFormat ptDepth, bool fGrow)
     802{
     803    ASSERT_GUEST_RETURN(type <= RT_ELEMENTS(pSvgaR3State->aGboOTables), VERR_INVALID_PARAMETER);
     804    ASSERT_GUEST_RETURN(sizeInBytes >= validSizeInBytes, VERR_INVALID_PARAMETER);
     805    RT_UNTRUSTED_VALIDATED_FENCE();
     806
     807    ASSERT_GUEST_RETURN(pSvgaR3State->aGboOTables[type].cbTotal >= validSizeInBytes, VERR_INVALID_PARAMETER);
     808
     809    if (sizeInBytes > 0)
     810    {
     811        /* Create a new guest backed object for the object table. */
     812        VMSVGAGBO gbo;
     813        int rc = vmsvgaR3GboCreate(pSvgaR3State, ptDepth, baseAddress, sizeInBytes, /* fWriteProtected = */ true, &gbo);
     814        AssertRCReturn(rc, rc);
     815
     816        if (fGrow && validSizeInBytes)
     817        {
     818            /* Copy data from old gbo to the new one. */
     819            rc = vmsvgaR3GboCopy(pSvgaR3State, &gbo, 0, &pSvgaR3State->aGboOTables[type], 0, validSizeInBytes);
     820            AssertRCReturnStmt(rc, vmsvgaR3GboDestroy(pSvgaR3State, &gbo), rc);
     821        }
     822
     823        vmsvgaR3GboDestroy(pSvgaR3State, &pSvgaR3State->aGboOTables[type]);
     824        pSvgaR3State->aGboOTables[type] = gbo;
     825
     826    }
     827    else
     828        vmsvgaR3GboDestroy(pSvgaR3State, &pSvgaR3State->aGboOTables[type]);
     829
     830    return VINF_SUCCESS;
     831}
     832
     833
    773834static int vmsvgaR3OTableVerifyIndex(PVMSVGAR3STATE pSvgaR3State, PVMSVGAGBO pGboOTable,
    774835                                     uint32_t idx, uint32_t cbEntry)
     
    830891static int vmsvgaR3MobCreate(PVMSVGAR3STATE pSvgaR3State,
    831892                             SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, SVGAMobId mobid,
    832                              bool fGCPhys64, PVMSVGAMOB pMob)
     893                             PVMSVGAMOB pMob)
    833894{
    834895    RT_ZERO(*pMob);
     
    844905    {
    845906        /* Create the corresponding GBO. */
    846         rc = vmsvgaR3GboCreate(pSvgaR3State, ptDepth, baseAddress, sizeInBytes, fGCPhys64, /* fWriteProtected = */ false, &pMob->Gbo);
     907        rc = vmsvgaR3GboCreate(pSvgaR3State, ptDepth, baseAddress, sizeInBytes, /* fWriteProtected = */ false, &pMob->Gbo);
    847908        if (RT_SUCCESS(rc))
    848909        {
    849             /* Add to the tree of known GBOs and the LRU list. */
     910            /* If a mob with this id already exists, then delete it. */
     911            PVMSVGAMOB pOldMob = (PVMSVGAMOB)RTAvlU32Remove(&pSvgaR3State->MOBTree, mobid);
     912            if (pOldMob)
     913            {
     914                /* This should not happen. */
     915                ASSERT_GUEST_FAILED();
     916                RTListNodeRemove(&pOldMob->nodeLRU);
     917                vmsvgaR3GboDestroy(pSvgaR3State, &pOldMob->Gbo);
     918                RTMemFree(pOldMob);
     919            }
     920
     921            /* Add to the tree of known MOBs and the LRU list. */
    850922            pMob->Core.Key = mobid;
    851923            if (RTAvlU32Insert(&pSvgaR3State->MOBTree, &pMob->Core))
     
    855927            }
    856928
     929            AssertFailedStmt(rc = VERR_INVALID_STATE);
    857930            vmsvgaR3GboDestroy(pSvgaR3State, &pMob->Gbo);
    858931        }
     
    12121285
    12131286
     1287/* SVGA_3D_CMD_SET_OTABLE_BASE 1091 */
     1288static void vmsvga3dCmdSetOTableBase(PVGASTATECC pThisCC, SVGA3dCmdSetOTableBase const *pCmd)
     1289{
     1290    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     1291    vmsvgaR3OTableSetOrGrow(pSvgaR3State, pCmd->type, pCmd->baseAddress,
     1292                            pCmd->sizeInBytes, pCmd->validSizeInBytes, pCmd->ptDepth, /*fGrow*/ false);
     1293}
     1294
     1295
    12141296/* SVGA_3D_CMD_DEFINE_GB_MOB 1093 */
    12151297static void vmsvga3dCmdDefineGBMob(PVGASTATECC pThisCC, SVGA3dCmdDefineGBMob const *pCmd)
     
    12251307    AssertPtrReturnVoid(pMob);
    12261308
    1227     int rc = vmsvgaR3MobCreate(pSvgaR3State, pCmd->ptDepth, pCmd->base, pCmd->sizeInBytes, pCmd->mobid, /*fGCPhys64=*/ false, pMob);
     1309    int rc = vmsvgaR3MobCreate(pSvgaR3State, pCmd->ptDepth, pCmd->base, pCmd->sizeInBytes, pCmd->mobid, pMob);
    12281310    if (RT_SUCCESS(rc))
    12291311    {
     
    16931775{
    16941776    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    1695 
    1696     /*
    1697      * Create a GBO for the table.
    1698      */
    1699     PVMSVGAGBO pGbo;
    1700     if (pCmd->type <= RT_ELEMENTS(pSvgaR3State->aGboOTables))
    1701     {
    1702         RT_UNTRUSTED_VALIDATED_FENCE();
    1703         pGbo = &pSvgaR3State->aGboOTables[pCmd->type];
    1704     }
    1705     else
    1706     {
    1707         ASSERT_GUEST_FAILED();
    1708         pGbo = NULL;
    1709     }
    1710 
    1711     if (pGbo)
    1712     {
    1713         /* Recreate. */
    1714         vmsvgaR3GboDestroy(pSvgaR3State, pGbo);
    1715         int rc = vmsvgaR3GboCreate(pSvgaR3State, pCmd->ptDepth, pCmd->baseAddress, pCmd->sizeInBytes, /*fGCPhys64=*/ true, /* fWriteProtected = */ true, pGbo);
    1716         AssertRC(rc);
    1717     }
     1777    vmsvgaR3OTableSetOrGrow(pSvgaR3State, pCmd->type, pCmd->baseAddress,
     1778                            pCmd->sizeInBytes, pCmd->validSizeInBytes, pCmd->ptDepth, /*fGrow*/ false);
    17181779}
    17191780
     
    19842045    AssertPtrReturnVoid(pMob);
    19852046
    1986     int rc = vmsvgaR3MobCreate(pSvgaR3State, pCmd->ptDepth, pCmd->base, pCmd->sizeInBytes, pCmd->mobid, /*fGCPhys64=*/ true, pMob);
     2047    int rc = vmsvgaR3MobCreate(pSvgaR3State, pCmd->ptDepth, pCmd->base, pCmd->sizeInBytes, pCmd->mobid, pMob);
    19872048    if (RT_SUCCESS(rc))
    19882049    {
     
    23082369{
    23092370#ifdef VMSVGA3D_DX
    2310     DEBUG_BREAKPOINT_TEST();
    2311     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2312     RT_NOREF(pSvgaR3State, pCmd, cbCmd);
     2371    //DEBUG_BREAKPOINT_TEST();
     2372    RT_NOREF(pCmd, cbCmd);
    23132373    return vmsvga3dDXDrawAuto(pThisCC, idDXContext);
    23142374#else
     
    35833643
    35843644/* SVGA_3D_CMD_GROW_OTABLE 1236 */
    3585 static int vmsvga3dCmdGrowOTable(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdGrowOTable const *pCmd, uint32_t cbCmd)
    3586 {
    3587 #ifdef VMSVGA3D_DX
    3588     DEBUG_BREAKPOINT_TEST();
    3589     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    3590     RT_NOREF(pSvgaR3State, pCmd, cbCmd);
    3591     return vmsvga3dGrowOTable(pThisCC, idDXContext);
    3592 #else
    3593     RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd);
     3645static int vmsvga3dCmdGrowOTable(PVGASTATECC pThisCC, SVGA3dCmdGrowOTable const *pCmd, uint32_t cbCmd)
     3646{
     3647#ifdef VMSVGA3D_DX
     3648    //DEBUG_BREAKPOINT_TEST();
     3649    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     3650    RT_NOREF(cbCmd);
     3651    return vmsvgaR3OTableSetOrGrow(pSvgaR3State, pCmd->type, pCmd->baseAddress,
     3652                                   pCmd->sizeInBytes, pCmd->validSizeInBytes, pCmd->ptDepth, /*fGrow*/ true);
     3653#else
     3654    RT_NOREF(pThisCC, pCmd, cbCmd);
    35943655    return VERR_NOT_SUPPORTED;
    35953656#endif
     
    35983659
    35993660/* SVGA_3D_CMD_DX_GROW_COTABLE 1237 */
    3600 static int vmsvga3dCmdDXGrowCOTable(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXGrowCOTable const *pCmd, uint32_t cbCmd)
    3601 {
    3602 #ifdef VMSVGA3D_DX
    3603     DEBUG_BREAKPOINT_TEST();
    3604     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    3605     RT_NOREF(pSvgaR3State, pCmd, cbCmd);
    3606     return vmsvga3dDXGrowCOTable(pThisCC, idDXContext);
     3661static int vmsvga3dCmdDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd, uint32_t cbCmd)
     3662{
     3663#ifdef VMSVGA3D_DX
     3664    //DEBUG_BREAKPOINT_TEST();
     3665    RT_NOREF(cbCmd);
     3666    return vmsvga3dDXGrowCOTable(pThisCC, pCmd);
    36073667#else
    36083668    RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd);
     
    46984758        SVGA3dCmdSetOTableBase *pCmd = (SVGA3dCmdSetOTableBase *)pvCmd;
    46994759        VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd));
    4700         VMSVGA_3D_CMD_NOTIMPL(); RT_NOREF(pCmd);
     4760        vmsvga3dCmdSetOTableBase(pThisCC, pCmd);
    47014761        break;
    47024762    }
     
    58335893        SVGA3dCmdGrowOTable *pCmd = (SVGA3dCmdGrowOTable *)pvCmd;
    58345894        VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd));
    5835         rcParse = vmsvga3dCmdGrowOTable(pThisCC, idDXContext, pCmd, cbCmd);
     5895        rcParse = vmsvga3dCmdGrowOTable(pThisCC, pCmd, cbCmd);
    58365896        break;
    58375897    }
     
    58415901        SVGA3dCmdDXGrowCOTable *pCmd = (SVGA3dCmdDXGrowCOTable *)pvCmd;
    58425902        VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd));
    5843         rcParse = vmsvga3dCmdDXGrowCOTable(pThisCC, idDXContext, pCmd, cbCmd);
     5903        rcParse = vmsvga3dCmdDXGrowCOTable(pThisCC, pCmd, cbCmd);
    58445904        break;
    58455905    }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp

    r95055 r95085  
    21992199    SVGA3dStreamOutputId const soid = pCmd->soid;
    22002200
    2201     ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
    22022201    ASSERT_GUEST_RETURN(   soid == SVGA_ID_INVALID
    22032202                        || soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
     
    22112210
    22122211
    2213 int vmsvga3dDXSetCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXSetCOTable const *pCmd, PVMSVGAMOB pMob)
    2214 {
    2215     int rc;
    2216     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2217     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
    2218     PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    2219     AssertReturn(p3dState, VERR_INVALID_STATE);
    2220 
    2221     PVMSVGA3DDXCONTEXT pDXContext;
    2222     rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
    2223     AssertRCReturn(rc, rc);
    2224     RT_UNTRUSTED_VALIDATED_FENCE();
    2225 
    2226     ASSERT_GUEST_RETURN(pCmd->type < RT_ELEMENTS(pDXContext->aCOTMobs), VERR_INVALID_PARAMETER);
    2227     RT_UNTRUSTED_VALIDATED_FENCE();
    2228 
    2229     uint32_t validSizeInBytes;
     2212static int dxSetOrGrowCOTable(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, PVMSVGAMOB pMob,
     2213                              SVGACOTableType type, uint32_t validSizeInBytes, bool fGrow)
     2214{
     2215    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     2216    int rc = VINF_SUCCESS;
     2217
     2218    ASSERT_GUEST_RETURN(type < RT_ELEMENTS(pDXContext->aCOTMobs), VERR_INVALID_PARAMETER);
     2219    RT_UNTRUSTED_VALIDATED_FENCE();
     2220
    22302221    uint32_t cbCOT;
    22312222    if (pMob)
    22322223    {
    2233         /* Bind a mob to the COTable. */
    2234         validSizeInBytes = pCmd->validSizeInBytes;
     2224        /* Bind a new mob to the COTable. */
    22352225        cbCOT = vmsvgaR3MobSize(pMob);
    22362226
     
    22462236        validSizeInBytes = 0;
    22472237        cbCOT = 0;
    2248         vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[pCmd->type]);
     2238        vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[type]);
    22492239    }
    22502240
     
    22692259        };
    22702260
    2271         cEntries = cbCOT / s_acbEntry[pCmd->type];
    2272         cValidEntries = validSizeInBytes / s_acbEntry[pCmd->type];
     2261        cEntries = cbCOT / s_acbEntry[type];
     2262        cValidEntries = validSizeInBytes / s_acbEntry[type];
    22732263    }
    22742264
    22752265    if (RT_SUCCESS(rc))
    22762266    {
    2277         pDXContext->aCOTMobs[pCmd->type] = pMob;
     2267        if (   fGrow
     2268            && pDXContext->aCOTMobs[type]
     2269            && cValidEntries)
     2270        {
     2271            /* Copy entries from the current mob to the new mob. */
     2272            void const *pvSrc = vmsvgaR3MobBackingStorePtr(pDXContext->aCOTMobs[type], 0);
     2273            void *pvDst = vmsvgaR3MobBackingStorePtr(pMob, 0);
     2274            if (pvSrc && pvDst)
     2275                memcpy(pvDst, pvSrc, validSizeInBytes);
     2276            else
     2277                AssertFailedStmt(rc = VERR_INVALID_STATE);
     2278        }
     2279    }
     2280
     2281    if (RT_SUCCESS(rc))
     2282    {
     2283        pDXContext->aCOTMobs[type] = pMob;
    22782284
    22792285        void *pvCOT = vmsvgaR3MobBackingStorePtr(pMob, 0);
    2280         switch (pCmd->type)
     2286        switch (type)
    22812287        {
    22822288            case SVGA_COTABLE_RTVIEW:
     
    23362342    /* Notify the backend. */
    23372343    if (RT_SUCCESS(rc))
    2338         rc = pSvgaR3State->pFuncsDX->pfnDXSetCOTable(pThisCC, pDXContext, pCmd->type, cValidEntries);
    2339 
    2340     return rc;
     2344        rc = pSvgaR3State->pFuncsDX->pfnDXSetCOTable(pThisCC, pDXContext, type, cValidEntries);
     2345
     2346    return rc;
     2347}
     2348
     2349
     2350int vmsvga3dDXSetCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXSetCOTable const *pCmd, PVMSVGAMOB pMob)
     2351{
     2352    int rc;
     2353    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     2354    AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
     2355    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
     2356    AssertReturn(p3dState, VERR_INVALID_STATE);
     2357
     2358    PVMSVGA3DDXCONTEXT pDXContext;
     2359    rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
     2360    AssertRCReturn(rc, rc);
     2361    RT_UNTRUSTED_VALIDATED_FENCE();
     2362
     2363    return dxSetOrGrowCOTable(pThisCC, pDXContext, pMob, pCmd->type, pCmd->validSizeInBytes, false);
    23412364}
    23422365
     
    26502673
    26512674
    2652 int vmsvga3dGrowOTable(PVGASTATECC pThisCC, uint32_t idDXContext)
    2653 {
    2654     int rc;
    2655     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2656     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnGrowOTable, VERR_INVALID_STATE);
    2657     PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    2658     AssertReturn(p3dState, VERR_INVALID_STATE);
    2659 
    2660     PVMSVGA3DDXCONTEXT pDXContext;
    2661     rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
    2662     AssertRCReturn(rc, rc);
    2663 
    2664     rc = pSvgaR3State->pFuncsDX->pfnGrowOTable(pThisCC, pDXContext);
    2665     return rc;
    2666 }
    2667 
    2668 
    2669 int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, uint32_t idDXContext)
    2670 {
    2671     int rc;
    2672     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2673     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXGrowCOTable, VERR_INVALID_STATE);
    2674     PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    2675     AssertReturn(p3dState, VERR_INVALID_STATE);
    2676 
    2677     PVMSVGA3DDXCONTEXT pDXContext;
    2678     rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
    2679     AssertRCReturn(rc, rc);
    2680 
    2681     rc = pSvgaR3State->pFuncsDX->pfnDXGrowCOTable(pThisCC, pDXContext);
    2682     return rc;
     2675int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd)
     2676{
     2677    int rc;
     2678    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     2679    AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
     2680    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
     2681    AssertReturn(p3dState, VERR_INVALID_STATE);
     2682
     2683    PVMSVGA3DDXCONTEXT pDXContext;
     2684    rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
     2685    AssertRCReturn(rc, rc);
     2686
     2687    PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, pCmd->mobid);
     2688    return dxSetOrGrowCOTable(pThisCC, pDXContext, pMob, pCmd->type, pCmd->validSizeInBytes, true);
    26832689}
    26842690
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r95055 r95085  
    12701270
    12711271
    1272 static int dxDefineStreamOutput(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dStreamOutputId soid, SVGACOTableDXStreamOutputEntry const *pEntry)
     1272static int dxDefineStreamOutput(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dStreamOutputId soid, SVGACOTableDXStreamOutputEntry const *pEntry, DXSHADER *pDXShader)
    12731273{
    12741274    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     
    13111311        pDst->ComponentCount = iFirstBit > 0 ? iLastBit - (iFirstBit - 1) : 0;
    13121312        pDst->OutputSlot     = pSrc->outputSlot;
     1313    }
     1314
     1315    for (uint32_t i = 0; i < pDXStreamOutput->cDeclarationEntry; ++i)
     1316    {
     1317        D3D11_SO_DECLARATION_ENTRY *pDeclarationEntry = &pDXStreamOutput->aDeclarationEntry[i];
     1318        SVGA3dStreamOutputDeclarationEntry const *decl = &paDecls[i];
     1319
     1320        /* Find the corresponding register and mask in the GS shader output. */
     1321        int idxFound = -1;
     1322        for (uint32_t iOutputEntry = 0; iOutputEntry < pDXShader->shaderInfo.cOutputSignature; ++iOutputEntry)
     1323        {
     1324            SVGA3dDXSignatureEntry const *pOutputEntry = &pDXShader->shaderInfo.aOutputSignature[iOutputEntry];
     1325            if (   pOutputEntry->registerIndex == decl->registerIndex
     1326                && (decl->registerMask & ~pOutputEntry->mask) == 0) /* SO decl mask is a subset of shader output mask. */
     1327            {
     1328                idxFound = iOutputEntry;
     1329                break;
     1330            }
     1331        }
     1332
     1333        if (idxFound >= 0)
     1334        {
     1335            DXShaderAttributeSemantic const *pOutputSemantic = &pDXShader->shaderInfo.aOutputSemantic[idxFound];
     1336            pDeclarationEntry->SemanticName = pOutputSemantic->pcszSemanticName;
     1337            pDeclarationEntry->SemanticIndex = pOutputSemantic->SemanticIndex;
     1338        }
     1339        else
     1340            AssertFailed();
    13131341    }
    13141342
     
    55065534                if (pDXStreamOutput->cDeclarationEntry == 0)
    55075535                {
    5508                     int rc = dxDefineStreamOutput(pThisCC, pDXContext, soid, pStreamOutputEntry);
     5536                    int rc = dxDefineStreamOutput(pThisCC, pDXContext, soid, pStreamOutputEntry, pDXShader);
    55095537                    AssertRCReturnVoid(rc);
    5510                 }
    5511 
    5512                 for (uint32_t i = 0; i < pDXStreamOutput->cDeclarationEntry; ++i)
    5513                 {
    5514                     D3D11_SO_DECLARATION_ENTRY *pDeclarationEntry = &pDXStreamOutput->aDeclarationEntry[i];
    5515                     SVGA3dStreamOutputDeclarationEntry const *decl = &pStreamOutputEntry->decl[i];
    5516 
    5517                     /* Find the corresponding register and mask in the GS shader output. */
    5518                     int idxFound = -1;
    5519                     for (uint32_t iOutputEntry = 0; iOutputEntry < pDXShader->shaderInfo.cOutputSignature; ++iOutputEntry)
    5520                     {
    5521                         SVGA3dDXSignatureEntry const *pOutputEntry = &pDXShader->shaderInfo.aOutputSignature[iOutputEntry];
    5522                         if (   pOutputEntry->registerIndex == decl->registerIndex
    5523                             && (decl->registerMask & ~pOutputEntry->mask) == 0) /* SO decl mask is a subset of shader output mask. */
    5524                         {
    5525                             idxFound = iOutputEntry;
    5526                             break;
    5527                         }
    5528                     }
    5529 
    5530                     if (idxFound >= 0)
    5531                     {
    5532                         DXShaderAttributeSemantic const *pOutputSemantic = &pDXShader->shaderInfo.aOutputSemantic[idxFound];
    5533                         pDeclarationEntry->SemanticName = pOutputSemantic->pcszSemanticName;
    5534                         pDeclarationEntry->SemanticIndex = pOutputSemantic->SemanticIndex;
    5535                     }
    5536                     else
    5537                         AssertFailed();
    55385538                }
    55395539            }
     
    63116311static DECLCALLBACK(int) vmsvga3dBackDXDrawAuto(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    63126312{
     6313    PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
     6314    RT_NOREF(pBackend);
     6315
     6316    DXDEVICE *pDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext);
     6317    AssertReturn(pDevice->pDevice, VERR_INVALID_STATE);
     6318
     6319    dxSetupPipeline(pThisCC, pDXContext);
     6320
    63136321    Assert(pDXContext->svgaDXContext.inputAssembly.topology != SVGA3D_PRIMITIVE_TRIANGLEFAN);
    6314     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    6315 
    6316     dxSetupPipeline(pThisCC, pDXContext);
    6317 
    6318     RT_NOREF(pBackend, pDXContext);
    6319     AssertFailed(); /** @todo Implement */
    6320     return VERR_NOT_IMPLEMENTED;
     6322
     6323    pDevice->pImmediateContext->DrawAuto();
     6324
     6325    /* Note which surfaces are being drawn. */
     6326    dxTrackRenderTargets(pThisCC, pDXContext);
     6327
     6328    return VINF_SUCCESS;
    63216329}
    63226330
     
    81668174
    81678175static DECLCALLBACK(int) vmsvga3dBackScreenCopy(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    8168 {
    8169     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    8170 
    8171     RT_NOREF(pBackend, pDXContext);
    8172     AssertFailed(); /** @todo Implement */
    8173     return VERR_NOT_IMPLEMENTED;
    8174 }
    8175 
    8176 
    8177 static DECLCALLBACK(int) vmsvga3dBackGrowOTable(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    8178 {
    8179     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    8180 
    8181     RT_NOREF(pBackend, pDXContext);
    8182     AssertFailed(); /** @todo Implement */
    8183     return VERR_NOT_IMPLEMENTED;
    8184 }
    8185 
    8186 
    8187 static DECLCALLBACK(int) vmsvga3dBackDXGrowCOTable(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    81888176{
    81898177    PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
     
    88948882                p->pfnDXCondBindAllShader         = vmsvga3dBackDXCondBindAllShader;
    88958883                p->pfnScreenCopy                  = vmsvga3dBackScreenCopy;
    8896                 p->pfnGrowOTable                  = vmsvga3dBackGrowOTable;
    8897                 p->pfnDXGrowCOTable               = vmsvga3dBackDXGrowCOTable;
    88988884                p->pfnIntraSurfaceCopy            = vmsvga3dBackIntraSurfaceCopy;
    88998885                p->pfnDXResolveCopy               = vmsvga3dBackDXResolveCopy;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r95055 r95085  
    496496    DECLCALLBACKMEMBER(int, pfnDXCondBindAllShader,         (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    497497    DECLCALLBACKMEMBER(int, pfnScreenCopy,                  (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    498     DECLCALLBACKMEMBER(int, pfnGrowOTable,                  (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    499     DECLCALLBACKMEMBER(int, pfnDXGrowCOTable,               (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    500498    DECLCALLBACKMEMBER(int, pfnIntraSurfaceCopy,            (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    501499    DECLCALLBACKMEMBER(int, pfnDXResolveCopy,               (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
     
    622620int vmsvga3dDXCondBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext);
    623621int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
    624 int vmsvga3dGrowOTable(PVGASTATECC pThisCC, uint32_t idDXContext);
    625 int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, uint32_t idDXContext);
     622int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd);
    626623int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
    627624int vmsvga3dDXResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
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