Changeset 95085 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- May 25, 2022 5:02:14 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 151557
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp
r95062 r95085 420 420 #ifdef VBOX_WITH_VMSVGA3D 421 421 422 static int vmsvgaR3GboCreate(PVMSVGAR3STATE pSvgaR3State, SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, bool f GCPhys64, bool fWriteProtected, PVMSVGAGBO pGbo)422 static int vmsvgaR3GboCreate(PVMSVGAR3STATE pSvgaR3State, SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, bool fWriteProtected, PVMSVGAGBO pGbo) 423 423 { 424 424 ASSERT_GUEST_RETURN(sizeInBytes <= _128M, VERR_INVALID_PARAMETER); /** @todo Less than SVGA_REG_MOB_MAX_SIZE */ … … 434 434 435 435 /* Verify and normalize the ptDepth value. */ 436 bool fGCPhys64; /* Whether the page table contains 64 bit page numbers. */ 436 437 if (RT_LIKELY( ptDepth == SVGA3D_MOBFMT_PTDEPTH64_0 437 438 || ptDepth == SVGA3D_MOBFMT_PTDEPTH64_1 438 439 || ptDepth == SVGA3D_MOBFMT_PTDEPTH64_2)) 439 ASSERT_GUEST_RETURN(fGCPhys64, VERR_INVALID_PARAMETER);440 fGCPhys64 = true; 440 441 else if ( ptDepth == SVGA3D_MOBFMT_PTDEPTH_0 441 442 || ptDepth == SVGA3D_MOBFMT_PTDEPTH_1 442 443 || ptDepth == SVGA3D_MOBFMT_PTDEPTH_2) 443 444 { 444 ASSERT_GUEST_RETURN(!fGCPhys64, VERR_INVALID_PARAMETER);445 fGCPhys64 = false; 445 446 /* Shift ptDepth to the SVGA3D_MOBFMT_PTDEPTH64_x range. */ 446 447 ptDepth = (SVGAMobFormat)(ptDepth + SVGA3D_MOBFMT_PTDEPTH64_0 - SVGA3D_MOBFMT_PTDEPTH_0); 447 448 } 448 449 else if (ptDepth == SVGA3D_MOBFMT_RANGE) 449 { }450 fGCPhys64 = false; /* Does not matter, there is no page table. */ 450 451 else 451 452 ASSERT_GUEST_FAILED_RETURN(VERR_INVALID_PARAMETER); … … 763 764 } 764 765 766 static 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 } 765 792 766 793 … … 771 798 */ 772 799 800 static 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 773 834 static int vmsvgaR3OTableVerifyIndex(PVMSVGAR3STATE pSvgaR3State, PVMSVGAGBO pGboOTable, 774 835 uint32_t idx, uint32_t cbEntry) … … 830 891 static int vmsvgaR3MobCreate(PVMSVGAR3STATE pSvgaR3State, 831 892 SVGAMobFormat ptDepth, PPN64 baseAddress, uint32_t sizeInBytes, SVGAMobId mobid, 832 bool fGCPhys64,PVMSVGAMOB pMob)893 PVMSVGAMOB pMob) 833 894 { 834 895 RT_ZERO(*pMob); … … 844 905 { 845 906 /* 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); 847 908 if (RT_SUCCESS(rc)) 848 909 { 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. */ 850 922 pMob->Core.Key = mobid; 851 923 if (RTAvlU32Insert(&pSvgaR3State->MOBTree, &pMob->Core)) … … 855 927 } 856 928 929 AssertFailedStmt(rc = VERR_INVALID_STATE); 857 930 vmsvgaR3GboDestroy(pSvgaR3State, &pMob->Gbo); 858 931 } … … 1212 1285 1213 1286 1287 /* SVGA_3D_CMD_SET_OTABLE_BASE 1091 */ 1288 static 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 1214 1296 /* SVGA_3D_CMD_DEFINE_GB_MOB 1093 */ 1215 1297 static void vmsvga3dCmdDefineGBMob(PVGASTATECC pThisCC, SVGA3dCmdDefineGBMob const *pCmd) … … 1225 1307 AssertPtrReturnVoid(pMob); 1226 1308 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); 1228 1310 if (RT_SUCCESS(rc)) 1229 1311 { … … 1693 1775 { 1694 1776 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); 1718 1779 } 1719 1780 … … 1984 2045 AssertPtrReturnVoid(pMob); 1985 2046 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); 1987 2048 if (RT_SUCCESS(rc)) 1988 2049 { … … 2308 2369 { 2309 2370 #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); 2313 2373 return vmsvga3dDXDrawAuto(pThisCC, idDXContext); 2314 2374 #else … … 3583 3643 3584 3644 /* 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); 3645 static 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); 3594 3655 return VERR_NOT_SUPPORTED; 3595 3656 #endif … … 3598 3659 3599 3660 /* 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); 3661 static 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); 3607 3667 #else 3608 3668 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 4698 4758 SVGA3dCmdSetOTableBase *pCmd = (SVGA3dCmdSetOTableBase *)pvCmd; 4699 4759 VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd)); 4700 VMSVGA_3D_CMD_NOTIMPL(); RT_NOREF(pCmd);4760 vmsvga3dCmdSetOTableBase(pThisCC, pCmd); 4701 4761 break; 4702 4762 } … … 5833 5893 SVGA3dCmdGrowOTable *pCmd = (SVGA3dCmdGrowOTable *)pvCmd; 5834 5894 VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd)); 5835 rcParse = vmsvga3dCmdGrowOTable(pThisCC, idDXContext,pCmd, cbCmd);5895 rcParse = vmsvga3dCmdGrowOTable(pThisCC, pCmd, cbCmd); 5836 5896 break; 5837 5897 } … … 5841 5901 SVGA3dCmdDXGrowCOTable *pCmd = (SVGA3dCmdDXGrowCOTable *)pvCmd; 5842 5902 VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(sizeof(*pCmd)); 5843 rcParse = vmsvga3dCmdDXGrowCOTable(pThisCC, idDXContext,pCmd, cbCmd);5903 rcParse = vmsvga3dCmdDXGrowCOTable(pThisCC, pCmd, cbCmd); 5844 5904 break; 5845 5905 } -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp
r95055 r95085 2199 2199 SVGA3dStreamOutputId const soid = pCmd->soid; 2200 2200 2201 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);2202 2201 ASSERT_GUEST_RETURN( soid == SVGA_ID_INVALID 2203 2202 || soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER); … … 2211 2210 2212 2211 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; 2212 static 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 2230 2221 uint32_t cbCOT; 2231 2222 if (pMob) 2232 2223 { 2233 /* Bind a mob to the COTable. */ 2234 validSizeInBytes = pCmd->validSizeInBytes; 2224 /* Bind a new mob to the COTable. */ 2235 2225 cbCOT = vmsvgaR3MobSize(pMob); 2236 2226 … … 2246 2236 validSizeInBytes = 0; 2247 2237 cbCOT = 0; 2248 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[ pCmd->type]);2238 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[type]); 2249 2239 } 2250 2240 … … 2269 2259 }; 2270 2260 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]; 2273 2263 } 2274 2264 2275 2265 if (RT_SUCCESS(rc)) 2276 2266 { 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; 2278 2284 2279 2285 void *pvCOT = vmsvgaR3MobBackingStorePtr(pMob, 0); 2280 switch ( pCmd->type)2286 switch (type) 2281 2287 { 2282 2288 case SVGA_COTABLE_RTVIEW: … … 2336 2342 /* Notify the backend. */ 2337 2343 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 2350 int 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); 2341 2364 } 2342 2365 … … 2650 2673 2651 2674 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; 2675 int 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); 2683 2689 } 2684 2690 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp
r95055 r95085 1270 1270 1271 1271 1272 static int dxDefineStreamOutput(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dStreamOutputId soid, SVGACOTableDXStreamOutputEntry const *pEntry )1272 static int dxDefineStreamOutput(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dStreamOutputId soid, SVGACOTableDXStreamOutputEntry const *pEntry, DXSHADER *pDXShader) 1273 1273 { 1274 1274 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; … … 1311 1311 pDst->ComponentCount = iFirstBit > 0 ? iLastBit - (iFirstBit - 1) : 0; 1312 1312 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(); 1313 1341 } 1314 1342 … … 5506 5534 if (pDXStreamOutput->cDeclarationEntry == 0) 5507 5535 { 5508 int rc = dxDefineStreamOutput(pThisCC, pDXContext, soid, pStreamOutputEntry );5536 int rc = dxDefineStreamOutput(pThisCC, pDXContext, soid, pStreamOutputEntry, pDXShader); 5509 5537 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->registerIndex5523 && (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 else5537 AssertFailed();5538 5538 } 5539 5539 } … … 6311 6311 static DECLCALLBACK(int) vmsvga3dBackDXDrawAuto(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext) 6312 6312 { 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 6313 6321 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 V ERR_NOT_IMPLEMENTED;6322 6323 pDevice->pImmediateContext->DrawAuto(); 6324 6325 /* Note which surfaces are being drawn. */ 6326 dxTrackRenderTargets(pThisCC, pDXContext); 6327 6328 return VINF_SUCCESS; 6321 6329 } 6322 6330 … … 8166 8174 8167 8175 static 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)8188 8176 { 8189 8177 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend; … … 8894 8882 p->pfnDXCondBindAllShader = vmsvga3dBackDXCondBindAllShader; 8895 8883 p->pfnScreenCopy = vmsvga3dBackScreenCopy; 8896 p->pfnGrowOTable = vmsvga3dBackGrowOTable;8897 p->pfnDXGrowCOTable = vmsvga3dBackDXGrowCOTable;8898 8884 p->pfnIntraSurfaceCopy = vmsvga3dBackIntraSurfaceCopy; 8899 8885 p->pfnDXResolveCopy = vmsvga3dBackDXResolveCopy; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
r95055 r95085 496 496 DECLCALLBACKMEMBER(int, pfnDXCondBindAllShader, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 497 497 DECLCALLBACKMEMBER(int, pfnScreenCopy, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 498 DECLCALLBACKMEMBER(int, pfnGrowOTable, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));499 DECLCALLBACKMEMBER(int, pfnDXGrowCOTable, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));500 498 DECLCALLBACKMEMBER(int, pfnIntraSurfaceCopy, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 501 499 DECLCALLBACKMEMBER(int, pfnDXResolveCopy, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); … … 622 620 int vmsvga3dDXCondBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext); 623 621 int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext); 624 int vmsvga3dGrowOTable(PVGASTATECC pThisCC, uint32_t idDXContext); 625 int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, uint32_t idDXContext); 622 int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd); 626 623 int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext); 627 624 int vmsvga3dDXResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
Note:
See TracChangeset
for help on using the changeset viewer.