Changeset 99535 in vbox
- Timestamp:
- Apr 26, 2023 4:52:49 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 157044
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp
r98103 r99535 3437 3437 { 3438 3438 #ifdef VMSVGA3D_DX 3439 DEBUG_BREAKPOINT_TEST(); 3440 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3441 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3442 return vmsvga3dDXSetVSConstantBufferOffset(pThisCC, idDXContext); 3439 //DEBUG_BREAKPOINT_TEST(); 3440 RT_NOREF(cbCmd); 3441 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_VS); 3443 3442 #else 3444 3443 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3452 3451 { 3453 3452 #ifdef VMSVGA3D_DX 3454 DEBUG_BREAKPOINT_TEST(); 3455 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3456 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3457 return vmsvga3dDXSetPSConstantBufferOffset(pThisCC, idDXContext); 3453 //DEBUG_BREAKPOINT_TEST(); 3454 RT_NOREF(cbCmd); 3455 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_PS); 3458 3456 #else 3459 3457 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3467 3465 { 3468 3466 #ifdef VMSVGA3D_DX 3469 DEBUG_BREAKPOINT_TEST(); 3470 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3471 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3472 return vmsvga3dDXSetGSConstantBufferOffset(pThisCC, idDXContext); 3467 //DEBUG_BREAKPOINT_TEST(); 3468 RT_NOREF(cbCmd); 3469 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_GS); 3473 3470 #else 3474 3471 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3482 3479 { 3483 3480 #ifdef VMSVGA3D_DX 3484 DEBUG_BREAKPOINT_TEST(); 3485 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3486 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3487 return vmsvga3dDXSetHSConstantBufferOffset(pThisCC, idDXContext); 3481 //DEBUG_BREAKPOINT_TEST(); 3482 RT_NOREF(cbCmd); 3483 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_HS); 3488 3484 #else 3489 3485 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3497 3493 { 3498 3494 #ifdef VMSVGA3D_DX 3499 DEBUG_BREAKPOINT_TEST(); 3500 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3501 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3502 return vmsvga3dDXSetDSConstantBufferOffset(pThisCC, idDXContext); 3495 //DEBUG_BREAKPOINT_TEST(); 3496 RT_NOREF(cbCmd); 3497 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_DS); 3503 3498 #else 3504 3499 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3512 3507 { 3513 3508 #ifdef VMSVGA3D_DX 3514 DEBUG_BREAKPOINT_TEST(); 3515 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3516 RT_NOREF(pSvgaR3State, pCmd, cbCmd); 3517 return vmsvga3dDXSetCSConstantBufferOffset(pThisCC, idDXContext); 3509 //DEBUG_BREAKPOINT_TEST(); 3510 RT_NOREF(cbCmd); 3511 return vmsvga3dDXSetConstantBufferOffset(pThisCC, idDXContext, pCmd, SVGA3D_SHADERTYPE_CS); 3518 3512 #else 3519 3513 RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd); … … 3602 3596 { 3603 3597 #ifdef VMSVGA3D_DX 3604 DEBUG_BREAKPOINT_TEST();3598 //DEBUG_BREAKPOINT_TEST(); 3605 3599 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 3606 3600 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
r99521 r99535 398 398 SSMFIELD_ENTRY( VMSVGAState, u32CurrentGMRId), 399 399 SSMFIELD_ENTRY( VMSVGAState, u32DeviceCaps), 400 SSMFIELD_ENTRY_VER( VMSVGAState, u32DeviceCaps2, VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2), 401 SSMFIELD_ENTRY_VER( VMSVGAState, u32GuestDriverId, VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2), 402 SSMFIELD_ENTRY_VER( VMSVGAState, u32GuestDriverVer1, VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2), 403 SSMFIELD_ENTRY_VER( VMSVGAState, u32GuestDriverVer2, VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2), 404 SSMFIELD_ENTRY_VER( VMSVGAState, u32GuestDriverVer3, VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2), 400 405 SSMFIELD_ENTRY( VMSVGAState, u32IndexReg), 401 406 SSMFIELD_ENTRY_IGNORE( VMSVGAState, hFIFORequestSem), … … 1520 1525 break; 1521 1526 1527 case SVGA_REG_BLANK_SCREEN_TARGETS: 1528 /// @todo STAM_REL_COUNTER_INC(&pThis->svga.aStatRegRd[idxReg]); 1529 *pu32 = 0; /* Not supported. */ 1530 break; 1531 1532 case SVGA_REG_CAP2: 1533 *pu32 = pThis->svga.u32DeviceCaps2; 1534 break; 1535 1536 case SVGA_REG_DEVEL_CAP: 1537 *pu32 = 0; /* Not supported. */ 1538 break; 1539 1540 /* 1541 * SVGA_REG_GUEST_DRIVER_* registers require SVGA_CAP2_DX2. 1542 */ 1543 case SVGA_REG_GUEST_DRIVER_ID: 1544 *pu32 = pThis->svga.u32GuestDriverId; 1545 break; 1546 1547 case SVGA_REG_GUEST_DRIVER_VERSION1: 1548 *pu32 = pThis->svga.u32GuestDriverVer1; 1549 break; 1550 1551 case SVGA_REG_GUEST_DRIVER_VERSION2: 1552 *pu32 = pThis->svga.u32GuestDriverVer2; 1553 break; 1554 1555 case SVGA_REG_GUEST_DRIVER_VERSION3: 1556 *pu32 = pThis->svga.u32GuestDriverVer3; 1557 break; 1558 1559 /* 1560 * SVGA_REG_CURSOR_ registers require SVGA_CAP2_CURSOR_MOB which the device does not support currently. 1561 */ 1562 case SVGA_REG_CURSOR_MOBID: 1563 *pu32 = SVGA_ID_INVALID; 1564 break; 1565 1566 case SVGA_REG_CURSOR_MAX_BYTE_SIZE: 1567 *pu32 = 0; 1568 break; 1569 1570 case SVGA_REG_CURSOR_MAX_DIMENSION: 1571 *pu32 = 0; 1572 break; 1573 1574 case SVGA_REG_FIFO_CAPS: 1575 case SVGA_REG_FENCE: /* Same as SVGA_FIFO_FENCE for PCI_ID_SVGA3. Our device is PCI_ID_SVGA2 so not supported. */ 1576 case SVGA_REG_RESERVED1: /* SVGA_REG_RESERVED* correspond to SVGA_REG_CURSOR4_*. Require SVGA_CAP2_EXTRA_REGS. */ 1577 case SVGA_REG_RESERVED2: 1578 case SVGA_REG_RESERVED3: 1579 case SVGA_REG_RESERVED4: 1580 case SVGA_REG_RESERVED5: 1581 case SVGA_REG_SCREENDMA: 1582 *pu32 = 0; /* Not supported. */ 1583 break; 1584 1585 case SVGA_REG_GBOBJECT_MEM_SIZE_KB: 1586 /** @todo "The maximum amount of guest-backed objects that the device can have resident at a time" */ 1587 *pu32 = _1G / _1K; 1588 break; 1589 1522 1590 default: 1523 1591 { … … 2259 2327 STAM_REL_COUNTER_INC(&pThis->svga.StatRegCmdPrependHighWr); 2260 2328 /* Not supported. */ 2329 break; 2330 2331 case SVGA_REG_GUEST_DRIVER_ID: 2332 if (u32 != SVGA_REG_GUEST_DRIVER_ID_SUBMIT) 2333 pThis->svga.u32GuestDriverId = u32; 2334 break; 2335 2336 case SVGA_REG_GUEST_DRIVER_VERSION1: 2337 pThis->svga.u32GuestDriverVer1 = u32; 2338 break; 2339 2340 case SVGA_REG_GUEST_DRIVER_VERSION2: 2341 pThis->svga.u32GuestDriverVer2 = u32; 2342 break; 2343 2344 case SVGA_REG_GUEST_DRIVER_VERSION3: 2345 pThis->svga.u32GuestDriverVer3 = u32; 2346 break; 2347 2348 case SVGA_REG_CURSOR_MOBID: 2349 /* Not supported, ignore. See correspondent comments in vmsvgaReadPort. */ 2261 2350 break; 2262 2351 … … 2286 2375 case SVGA_REG_SCREENTARGET_MAX_HEIGHT: 2287 2376 case SVGA_REG_MOB_MAX_SIZE: 2377 case SVGA_REG_BLANK_SCREEN_TARGETS: 2378 case SVGA_REG_CAP2: 2379 case SVGA_REG_DEVEL_CAP: 2380 case SVGA_REG_CURSOR_MAX_BYTE_SIZE: 2381 case SVGA_REG_CURSOR_MAX_DIMENSION: 2382 case SVGA_REG_FIFO_CAPS: 2383 case SVGA_REG_FENCE: 2384 case SVGA_REG_RESERVED1: 2385 case SVGA_REG_RESERVED2: 2386 case SVGA_REG_RESERVED3: 2387 case SVGA_REG_RESERVED4: 2388 case SVGA_REG_RESERVED5: 2389 case SVGA_REG_SCREENDMA: 2390 case SVGA_REG_GBOBJECT_MEM_SIZE_KB: 2288 2391 /* Read only - ignore. */ 2289 2392 Log(("Write to R/O register %x - val %x ignored\n", idxReg, u32)); … … 5411 5514 pHlp->pfnPrintf(pHlp, "Current GMR ID: %#x\n", pThis->svga.u32CurrentGMRId); 5412 5515 pHlp->pfnPrintf(pHlp, "Device Capabilites: %#x\n", pThis->svga.u32DeviceCaps); 5516 pHlp->pfnPrintf(pHlp, "Device Cap2: %#x\n", pThis->svga.u32DeviceCaps2); 5517 pHlp->pfnPrintf(pHlp, "Guest driver id: %#x\n", pThis->svga.u32GuestDriverId); 5518 pHlp->pfnPrintf(pHlp, "Guest driver ver1: %#x\n", pThis->svga.u32GuestDriverVer1); 5519 pHlp->pfnPrintf(pHlp, "Guest driver ver2: %#x\n", pThis->svga.u32GuestDriverVer2); 5520 pHlp->pfnPrintf(pHlp, "Guest driver ver3: %#x\n", pThis->svga.u32GuestDriverVer3); 5413 5521 pHlp->pfnPrintf(pHlp, "Index reg: %#x\n", pThis->svga.u32IndexReg); 5414 5522 pHlp->pfnPrintf(pHlp, "Action flags: %#x\n", pThis->svga.u32ActionFlags); … … 6306 6414 * @param pThisCC The VGA/VMSVGA state for ring-3. 6307 6415 * @param pu32DeviceCaps Device capabilities (SVGA_CAP_*). 6416 * @param pu32DeviceCaps2 Device capabilities (SVGA_CAP2_*). 6308 6417 * @param pu32FIFOCaps FIFO capabilities (SVGA_FIFO_CAPS_*). 6309 6418 */ 6310 static void vmsvgaR3GetCaps(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t *pu32DeviceCaps, uint32_t *pu32 FIFOCaps)6419 static void vmsvgaR3GetCaps(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t *pu32DeviceCaps, uint32_t *pu32DeviceCaps2, uint32_t *pu32FIFOCaps) 6311 6420 { 6312 6421 #ifndef VBOX_WITH_VMSVGA3D … … 6329 6438 6330 6439 *pu32DeviceCaps |= SVGA_CAP_COMMAND_BUFFERS /* Enable register based command buffer submission. */ 6331 // | SVGA_CAP_CMD_BUFFERS_2 /* Support for SVGA_REG_CMD_PREPEND_LOW/HIGH */6332 6440 ; 6441 6442 *pu32DeviceCaps2 = SVGA_CAP2_NONE; 6333 6443 6334 6444 /* VGPU10 capabilities. */ … … 6339 6449 *pu32DeviceCaps |= SVGA_CAP_GBOBJECTS; /* Enable guest-backed objects and surfaces. */ 6340 6450 if (pThisCC->svga.pSvgaR3State->pFuncsDX) 6341 *pu32DeviceCaps |= SVGA_CAP_DX; /* Enable support for DX commands, and command buffers in a mob. */ 6451 { 6452 *pu32DeviceCaps |= SVGA_CAP_DX /* DX commands, and command buffers in a mob. */ 6453 | SVGA_CAP_CAP2_REGISTER /* Extended capabilities. */ 6454 ; 6455 6456 if (*pu32DeviceCaps & SVGA_CAP_CAP2_REGISTER) 6457 *pu32DeviceCaps2 |= SVGA_CAP2_GROW_OTABLE /* "Allow the GrowOTable/DXGrowCOTable commands" */ 6458 | SVGA_CAP2_DX2 /* Shader Model 4.1. 6459 * "Allow the DefineGBSurface_v3, WholeSurfaceCopy, WriteZeroSurface, and 6460 * HintZeroSurface commands, and the SVGA_REG_GUEST_DRIVER_ID register." 6461 */ 6462 | SVGA_CAP2_GB_MEMSIZE_2 /* "Allow the SVGA_REG_GBOBJECT_MEM_SIZE_KB register" */ 6463 | SVGA_CAP2_OTABLE_PTDEPTH_2 6464 | SVGA_CAP2_DX3 /* Shader Model 5. 6465 * DefineGBSurface_v4, etc 6466 */ 6467 ; 6468 } 6342 6469 # endif 6343 6470 } … … 6485 6612 6486 6613 /* Initialize FIFO and register capabilities. */ 6487 vmsvgaR3GetCaps(pThis, pThisCC, &pThis->svga.u32DeviceCaps, &pThis CC->svga.pau32FIFO[SVGA_FIFO_CAPABILITIES]);6614 vmsvgaR3GetCaps(pThis, pThisCC, &pThis->svga.u32DeviceCaps, &pThis->svga.u32DeviceCaps2, &pThisCC->svga.pau32FIFO[SVGA_FIFO_CAPABILITIES]); 6488 6615 6489 6616 # ifdef VBOX_WITH_VMSVGA3D … … 6927 7054 { 6928 7055 vmsvgaR3InitFIFO(pThis, pThisCC); 6929 vmsvgaR3GetCaps(pThis, pThisCC, &pThis->svga.u32DeviceCaps, &pThis CC->svga.pau32FIFO[SVGA_FIFO_CAPABILITIES]);7056 vmsvgaR3GetCaps(pThis, pThisCC, &pThis->svga.u32DeviceCaps, &pThis->svga.u32DeviceCaps2, &pThisCC->svga.pau32FIFO[SVGA_FIFO_CAPABILITIES]); 6930 7057 } 6931 7058 # ifdef DEBUG … … 6934 7061 /* If saved state is being loaded then FIFO and caps are already restored. */ 6935 7062 uint32_t u32DeviceCaps = 0; 7063 uint32_t u32DeviceCaps2 = 0; 6936 7064 uint32_t u32FIFOCaps = 0; 6937 vmsvgaR3GetCaps(pThis, pThisCC, &u32DeviceCaps, &u32 FIFOCaps);7065 vmsvgaR3GetCaps(pThis, pThisCC, &u32DeviceCaps, &u32DeviceCaps2, &u32FIFOCaps); 6938 7066 6939 7067 /* Capabilities should not change normally. */ 6940 7068 Assert( pThis->svga.u32DeviceCaps == u32DeviceCaps 7069 && pThis->svga.u32DeviceCaps2 == u32DeviceCaps2 6941 7070 && pThisCC->svga.pau32FIFO[SVGA_FIFO_CAPABILITIES] == u32FIFOCaps); 6942 7071 } -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h
r98103 r99535 331 331 /** SVGA device capabilities. */ 332 332 uint32_t u32DeviceCaps; 333 uint32_t Padding0; /* Used to be I/O port base address. */ 333 uint32_t u32DeviceCaps2; /* Used to be I/O port base address and Padding0. */ 334 /** Guest driver information (SVGA_REG_GUEST_DRIVER_*). */ 335 uint32_t u32GuestDriverId; 336 uint32_t u32GuestDriverVer1; 337 uint32_t u32GuestDriverVer2; 338 uint32_t u32GuestDriverVer3; 334 339 /** Port io index register. */ 335 340 uint32_t u32IndexReg; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-dx11.cpp
r99521 r99535 4641 4641 4642 4642 case SVGA3D_DEVCAP_SM41: 4643 *pu32Val = 0; /* boolean */4643 *pu32Val = 1; /* boolean */ 4644 4644 break; 4645 4645 … … 4672 4672 4673 4673 case SVGA3D_DEVCAP_SM5: 4674 *pu32Val = 0; /* boolean */4674 *pu32Val = 1; /* boolean */ 4675 4675 break; 4676 4676 … … 9448 9448 9449 9449 static DECLCALLBACK(int) vmsvga3dBackDXBufferUpdate(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext) 9450 {9451 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9452 9453 RT_NOREF(pBackend, pDXContext);9454 AssertFailed(); /** @todo Implement */9455 return VERR_NOT_IMPLEMENTED;9456 }9457 9458 9459 static DECLCALLBACK(int) vmsvga3dBackDXSetVSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9460 {9461 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9462 9463 RT_NOREF(pBackend, pDXContext);9464 AssertFailed(); /** @todo Implement */9465 return VERR_NOT_IMPLEMENTED;9466 }9467 9468 9469 static DECLCALLBACK(int) vmsvga3dBackDXSetPSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9470 {9471 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9472 9473 RT_NOREF(pBackend, pDXContext);9474 AssertFailed(); /** @todo Implement */9475 return VERR_NOT_IMPLEMENTED;9476 }9477 9478 9479 static DECLCALLBACK(int) vmsvga3dBackDXSetGSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9480 {9481 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9482 9483 RT_NOREF(pBackend, pDXContext);9484 AssertFailed(); /** @todo Implement */9485 return VERR_NOT_IMPLEMENTED;9486 }9487 9488 9489 static DECLCALLBACK(int) vmsvga3dBackDXSetHSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9490 {9491 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9492 9493 RT_NOREF(pBackend, pDXContext);9494 AssertFailed(); /** @todo Implement */9495 return VERR_NOT_IMPLEMENTED;9496 }9497 9498 9499 static DECLCALLBACK(int) vmsvga3dBackDXSetDSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9500 {9501 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;9502 9503 RT_NOREF(pBackend, pDXContext);9504 AssertFailed(); /** @todo Implement */9505 return VERR_NOT_IMPLEMENTED;9506 }9507 9508 9509 static DECLCALLBACK(int) vmsvga3dBackDXSetCSConstantBufferOffset(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)9510 9450 { 9511 9451 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend; … … 10244 10184 p->pfnDXHint = vmsvga3dBackDXHint; 10245 10185 p->pfnDXBufferUpdate = vmsvga3dBackDXBufferUpdate; 10246 p->pfnDXSetVSConstantBufferOffset = vmsvga3dBackDXSetVSConstantBufferOffset;10247 p->pfnDXSetPSConstantBufferOffset = vmsvga3dBackDXSetPSConstantBufferOffset;10248 p->pfnDXSetGSConstantBufferOffset = vmsvga3dBackDXSetGSConstantBufferOffset;10249 p->pfnDXSetHSConstantBufferOffset = vmsvga3dBackDXSetHSConstantBufferOffset;10250 p->pfnDXSetDSConstantBufferOffset = vmsvga3dBackDXSetDSConstantBufferOffset;10251 p->pfnDXSetCSConstantBufferOffset = vmsvga3dBackDXSetCSConstantBufferOffset;10252 10186 p->pfnDXCondBindAllShader = vmsvga3dBackDXCondBindAllShader; 10253 10187 p->pfnScreenCopy = vmsvga3dBackScreenCopy; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.cpp
r98103 r99535 1783 1783 /* Integer divide. */ 1784 1784 pOpcode->cOperand = 4; /* dstQuit, dstRem, src0, src1. */ 1785 1786 /* Operands. */ 1787 uint32_t cOperandRemain = RT_ELEMENTS(pOpcode->aValOperand); 1788 for (uint32_t i = 0; i < pOpcode->cOperand; ++i) 1789 { 1790 Log6((" [operand %d]\n", i)); 1791 uint32_t const idxOperand = RT_ELEMENTS(pOpcode->aValOperand) - cOperandRemain; 1792 pOpcode->aIdxOperand[i] = idxOperand; 1793 int rc = dxbcParseOperand(r, &pOpcode->aValOperand[idxOperand], &cOperandRemain); 1794 ASSERT_GUEST_RETURN(RT_SUCCESS(rc), VERR_INVALID_PARAMETER); 1795 } 1796 } 1797 //else if (opcode.vmwareOpcodeType == VGPU10_VMWARE_OPCODE_DFRC) 1798 //else if (opcode.vmwareOpcodeType == VGPU10_VMWARE_OPCODE_DRSQ) 1785 } 1786 else if (opcode.vmwareOpcodeType == VGPU10_VMWARE_OPCODE_DFRC) 1787 { 1788 /* Double precision fraction. */ 1789 pOpcode->cOperand = 2; /* dst, src. */ 1790 } 1791 else if (opcode.vmwareOpcodeType == VGPU10_VMWARE_OPCODE_DRSQ) 1792 { 1793 /* Double precision reciprocal square root. */ 1794 pOpcode->cOperand = 2; /* dst, src. */ 1795 } 1799 1796 else 1800 1797 { 1801 /** @todo implement */1802 1798 ASSERT_GUEST_FAILED_RETURN(VERR_INVALID_PARAMETER); 1799 } 1800 1801 /* Operands. */ 1802 uint32_t cOperandRemain = RT_ELEMENTS(pOpcode->aValOperand); 1803 for (uint32_t i = 0; i < pOpcode->cOperand; ++i) 1804 { 1805 Log6((" [operand %d]\n", i)); 1806 uint32_t const idxOperand = RT_ELEMENTS(pOpcode->aValOperand) - cOperandRemain; 1807 pOpcode->aIdxOperand[i] = idxOperand; 1808 int rc = dxbcParseOperand(r, &pOpcode->aValOperand[idxOperand], &cOperandRemain); 1809 ASSERT_GUEST_RETURN(RT_SUCCESS(rc), VERR_INVALID_PARAMETER); 1803 1810 } 1804 1811 } … … 1832 1839 1833 1840 1834 static int dxbcEmitVmwareIDIV(DXBCOUTPUTCTX *pOutctx, DXBCByteWriter *w, VGPUOpcode *pOpcode) 1835 { 1836 /* Insert a call and append a subroutne. */ 1841 static void dxbcEmitCall(DXBCByteWriter *w, VGPUOpcode const *pOpcode, uint32_t label) 1842 { 1837 1843 VGPU10OpcodeToken0 opcode; 1838 1844 VGPU10OperandToken0 operand; 1839 1845 1840 uint32_t const label = (pOutctx->offSubroutine - dxbcByteWriterSize(w)) / 4;1841 1842 /*1843 * Call1844 */1845 1846 opcode.value = 0; 1846 1847 opcode.opcodeType = VGPU10_OPCODE_CALL; … … 1862 1863 for (unsigned i = 0; i < pOpcode->cOpcodeToken - 3; ++i) 1863 1864 dxbcByteWriterAddTokens(w, &opcode.value, 1); 1864 1865 /* 1866 * Subroutine. 1867 */ 1868 DXBCByteWriterState savedWriterState; 1869 if (!dxbcByteWriterSetOffset(w, pOutctx->offSubroutine, &savedWriterState)) 1870 return w->rc; 1871 1872 /* label */ 1865 } 1866 1867 1868 static void dxbcEmitLabel(DXBCByteWriter *w, uint32_t label) 1869 { 1870 VGPU10OpcodeToken0 opcode; 1871 VGPU10OperandToken0 operand; 1872 1873 1873 opcode.value = 0; 1874 1874 opcode.opcodeType = VGPU10_OPCODE_LABEL; … … 1883 1883 dxbcByteWriterAddTokens(w, &operand.value, 1); 1884 1884 dxbcByteWriterAddTokens(w, &label, 1); 1885 } 1886 1887 1888 static void dxbcEmitRet(DXBCByteWriter *w) 1889 { 1890 VGPU10OpcodeToken0 opcode; 1891 1892 opcode.value = 0; 1893 opcode.opcodeType = VGPU10_OPCODE_RET; 1894 opcode.instructionLength = 1; 1895 dxbcByteWriterAddTokens(w, &opcode.value, 1); 1896 } 1897 1898 1899 static int dxbcEmitVmwareIDIV(DXBCOUTPUTCTX *pOutctx, DXBCByteWriter *w, VGPUOpcode *pOpcode) 1900 { 1901 /* Insert a call and append a subroutne. */ 1902 VGPU10OpcodeToken0 opcode; 1903 1904 uint32_t const label = (pOutctx->offSubroutine - dxbcByteWriterSize(w)) / 4; 1905 1906 dxbcEmitCall(w, pOpcode, label); 1907 1908 /* 1909 * Subroutine. 1910 */ 1911 DXBCByteWriterState savedWriterState; 1912 if (!dxbcByteWriterSetOffset(w, pOutctx->offSubroutine, &savedWriterState)) 1913 return w->rc; 1914 1915 dxbcEmitLabel(w, label); 1885 1916 1886 1917 /* Just output UDIV for now. */ … … 1891 1922 dxbcByteWriterAddTokens(w, &pOpcode->paOpcodeToken[1], pOpcode->cOpcodeToken - 1); 1892 1923 1893 /* ret */ 1924 dxbcEmitRet(w); 1925 1926 pOutctx->offSubroutine = dxbcByteWriterSize(w); 1927 dxbcByteWriterRestore(w, &savedWriterState); 1928 1929 return w->rc; 1930 } 1931 1932 1933 static int dxbcEmitVmwareDFRC(DXBCOUTPUTCTX *pOutctx, DXBCByteWriter *w, VGPUOpcode *pOpcode) 1934 { 1935 /* Insert a call and append a subroutine. */ 1936 VGPU10OpcodeToken0 opcode; 1937 1938 uint32_t const label = (pOutctx->offSubroutine - dxbcByteWriterSize(w)) / 4; 1939 1940 dxbcEmitCall(w, pOpcode, label); 1941 1942 /* 1943 * Subroutine. 1944 */ 1945 DXBCByteWriterState savedWriterState; 1946 if (!dxbcByteWriterSetOffset(w, pOutctx->offSubroutine, &savedWriterState)) 1947 return w->rc; 1948 1949 dxbcEmitLabel(w, label); 1950 1951 /* Just output a MOV for now. */ 1894 1952 opcode.value = 0; 1895 opcode.opcodeType = VGPU10_OPCODE_ RET;1896 opcode.instructionLength = 1;1953 opcode.opcodeType = VGPU10_OPCODE_MOV; 1954 opcode.instructionLength = pOpcode->cOpcodeToken; 1897 1955 dxbcByteWriterAddTokens(w, &opcode.value, 1); 1956 dxbcByteWriterAddTokens(w, &pOpcode->paOpcodeToken[1], pOpcode->cOpcodeToken - 1); 1957 1958 dxbcEmitRet(w); 1959 1960 pOutctx->offSubroutine = dxbcByteWriterSize(w); 1961 dxbcByteWriterRestore(w, &savedWriterState); 1962 1963 return w->rc; 1964 } 1965 1966 1967 static int dxbcEmitVmwareDRSQ(DXBCOUTPUTCTX *pOutctx, DXBCByteWriter *w, VGPUOpcode *pOpcode) 1968 { 1969 /* Insert a call and append a subroutine. */ 1970 VGPU10OpcodeToken0 opcode; 1971 1972 uint32_t const label = (pOutctx->offSubroutine - dxbcByteWriterSize(w)) / 4; 1973 1974 dxbcEmitCall(w, pOpcode, label); 1975 1976 /* 1977 * Subroutine. 1978 */ 1979 DXBCByteWriterState savedWriterState; 1980 if (!dxbcByteWriterSetOffset(w, pOutctx->offSubroutine, &savedWriterState)) 1981 return w->rc; 1982 1983 dxbcEmitLabel(w, label); 1984 1985 /* Just output a MOV for now. */ 1986 opcode.value = 0; 1987 opcode.opcodeType = VGPU10_OPCODE_MOV; 1988 opcode.instructionLength = pOpcode->cOpcodeToken; 1989 dxbcByteWriterAddTokens(w, &opcode.value, 1); 1990 dxbcByteWriterAddTokens(w, &pOpcode->paOpcodeToken[1], pOpcode->cOpcodeToken - 1); 1991 1992 dxbcEmitRet(w); 1898 1993 1899 1994 pOutctx->offSubroutine = dxbcByteWriterSize(w); … … 1934 2029 { 1935 2030 if (pOpcode->opcodeSubtype == VGPU10_VMWARE_OPCODE_IDIV) 1936 {1937 2031 return dxbcEmitVmwareIDIV(pOutctx, w, pOpcode); 1938 } 2032 if (pOpcode->opcodeSubtype == VGPU10_VMWARE_OPCODE_DFRC) 2033 return dxbcEmitVmwareDFRC(pOutctx, w, pOpcode); 2034 if (pOpcode->opcodeSubtype == VGPU10_VMWARE_OPCODE_DRSQ) 2035 return dxbcEmitVmwareDRSQ(pOutctx, w, pOpcode); 1939 2036 1940 2037 ASSERT_GUEST_FAILED_RETURN(VERR_NOT_SUPPORTED); … … 2206 2303 } 2207 2304 2305 2208 2306 void DXShaderGenerateSemantics(DXShaderInfo *pInfo) 2209 2307 { … … 2221 2319 pInfo->aPatchConstantSemantic, DXBC_BLOB_TYPE_PCSG); 2222 2320 } 2321 2322 2323 void DXShaderSortSignatures(DXShaderInfo *pInfo) 2324 { 2325 /* Sort signatures by register index and mask because the host API need them to be sorted. */ 2326 if (pInfo->cInputSignature) 2327 { 2328 RTSortShell(pInfo->aInputSignature, pInfo->cInputSignature, sizeof(pInfo->aInputSignature[0]), 2329 signatureEntryCmp, NULL); 2330 } 2331 if (pInfo->cOutputSignature) 2332 { 2333 RTSortShell(pInfo->aOutputSignature, pInfo->cOutputSignature, sizeof(pInfo->aOutputSignature[0]), 2334 signatureEntryCmp, NULL); 2335 } 2336 if (pInfo->cPatchConstantSignature) 2337 { 2338 RTSortShell(pInfo->aPatchConstantSignature, pInfo->cPatchConstantSignature, sizeof(pInfo->aPatchConstantSignature[0]), 2339 signatureEntryCmp, NULL); 2340 } 2341 } 2342 2223 2343 2224 2344 void DXShaderFree(DXShaderInfo *pInfo) … … 2372 2492 pHdrISGN->offElement = RT_UOFFSETOF(DXBCBlobIOSGN, aElement[0]); 2373 2493 2494 #ifdef DEBUG 2495 /* Check that signatures are sorted by register index because the host API need them to be sorted. */ 2496 uint32_t idxRegisterLast = 0; 2497 #endif 2498 2374 2499 for (uint32_t iSignatureEntry = 0; iSignatureEntry < cSignature; ++iSignatureEntry) 2375 2500 { … … 2398 2523 iSignatureEntry, srcSemantic->pcszSemanticName, dst->idxSemantic, 2399 2524 dst->enmSystemValue, dst->enmComponentType, dst->idxRegister, dst->u.mask)); 2525 2526 #ifdef DEBUG 2527 Assert(idxRegisterLast <= dst->idxRegister); 2528 idxRegisterLast = dst->idxRegister; 2529 #endif 2400 2530 2401 2531 if (dst->offElementName == 0) -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.h
r98103 r99535 77 77 int DXShaderParse(void const *pvCode, uint32_t cbCode, DXShaderInfo *pInfo); 78 78 void DXShaderGenerateSemantics(DXShaderInfo *pInfo); 79 void DXShaderSortSignatures(DXShaderInfo *pInfo); 79 80 void DXShaderFree(DXShaderInfo *pInfo); 80 81 int DXShaderUpdateResources(DXShaderInfo const *pInfo, VGPU10_RESOURCE_DIMENSION *paResourceDimension, -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp
r98908 r99535 1990 1990 memcpy(pShaderInfo->aPatchConstantSignature, pu8Signatures, pSignatureHeader->numPatchConstantSignatures * sizeof(SVGA3dDXSignatureEntry)); 1991 1991 1992 /* Sort must be called before GenerateSemantics which assigns attribute indices 1993 * based on the order of attributes. 1994 */ 1995 DXShaderSortSignatures(pShaderInfo); 1992 1996 DXShaderGenerateSemantics(pShaderInfo); 1993 1997 } … … 2481 2485 2482 2486 2483 int vmsvga3dDXSetVSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2484 { 2485 int rc; 2486 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2487 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetVSConstantBufferOffset, VERR_INVALID_STATE); 2488 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2489 AssertReturn(p3dState, VERR_INVALID_STATE); 2490 2491 PVMSVGA3DDXCONTEXT pDXContext; 2492 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2493 AssertRCReturn(rc, rc); 2494 2495 rc = pSvgaR3State->pFuncsDX->pfnDXSetVSConstantBufferOffset(pThisCC, pDXContext); 2496 return rc; 2497 } 2498 2499 2500 int vmsvga3dDXSetPSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2501 { 2502 int rc; 2503 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2504 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetPSConstantBufferOffset, VERR_INVALID_STATE); 2505 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2506 AssertReturn(p3dState, VERR_INVALID_STATE); 2507 2508 PVMSVGA3DDXCONTEXT pDXContext; 2509 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2510 AssertRCReturn(rc, rc); 2511 2512 rc = pSvgaR3State->pFuncsDX->pfnDXSetPSConstantBufferOffset(pThisCC, pDXContext); 2513 return rc; 2514 } 2515 2516 2517 int vmsvga3dDXSetGSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2518 { 2519 int rc; 2520 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2521 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetGSConstantBufferOffset, VERR_INVALID_STATE); 2522 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2523 AssertReturn(p3dState, VERR_INVALID_STATE); 2524 2525 PVMSVGA3DDXCONTEXT pDXContext; 2526 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2527 AssertRCReturn(rc, rc); 2528 2529 rc = pSvgaR3State->pFuncsDX->pfnDXSetGSConstantBufferOffset(pThisCC, pDXContext); 2530 return rc; 2531 } 2532 2533 2534 int vmsvga3dDXSetHSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2535 { 2536 int rc; 2537 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2538 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetHSConstantBufferOffset, VERR_INVALID_STATE); 2539 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2540 AssertReturn(p3dState, VERR_INVALID_STATE); 2541 2542 PVMSVGA3DDXCONTEXT pDXContext; 2543 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2544 AssertRCReturn(rc, rc); 2545 2546 rc = pSvgaR3State->pFuncsDX->pfnDXSetHSConstantBufferOffset(pThisCC, pDXContext); 2547 return rc; 2548 } 2549 2550 2551 int vmsvga3dDXSetDSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2552 { 2553 int rc; 2554 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2555 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetDSConstantBufferOffset, VERR_INVALID_STATE); 2556 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2557 AssertReturn(p3dState, VERR_INVALID_STATE); 2558 2559 PVMSVGA3DDXCONTEXT pDXContext; 2560 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2561 AssertRCReturn(rc, rc); 2562 2563 rc = pSvgaR3State->pFuncsDX->pfnDXSetDSConstantBufferOffset(pThisCC, pDXContext); 2564 return rc; 2565 } 2566 2567 2568 int vmsvga3dDXSetCSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext) 2569 { 2570 int rc; 2571 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2572 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCSConstantBufferOffset, VERR_INVALID_STATE); 2573 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2574 AssertReturn(p3dState, VERR_INVALID_STATE); 2575 2576 PVMSVGA3DDXCONTEXT pDXContext; 2577 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2578 AssertRCReturn(rc, rc); 2579 2580 rc = pSvgaR3State->pFuncsDX->pfnDXSetCSConstantBufferOffset(pThisCC, pDXContext); 2487 int vmsvga3dDXSetConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetConstantBufferOffset const *pCmd, SVGA3dShaderType type) 2488 { 2489 int rc; 2490 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2491 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer, VERR_INVALID_STATE); 2492 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2493 AssertReturn(p3dState, VERR_INVALID_STATE); 2494 2495 PVMSVGA3DDXCONTEXT pDXContext; 2496 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext); 2497 AssertRCReturn(rc, rc); 2498 2499 ASSERT_GUEST_RETURN(pCmd->slot < SVGA3D_DX_MAX_CONSTBUFFERS, VERR_INVALID_PARAMETER); 2500 RT_UNTRUSTED_VALIDATED_FENCE(); 2501 2502 uint32_t const idxShaderState = type - SVGA3D_SHADERTYPE_MIN; 2503 SVGA3dConstantBufferBinding *pCBB = &pDXContext->svgaDXContext.shaderState[idxShaderState].constantBuffers[pCmd->slot]; 2504 2505 /* Only 'offsetInBytes' is updated. */ 2506 // pCBB->sid; 2507 pCBB->offsetInBytes = pCmd->offsetInBytes; 2508 // pCBB->sizeInBytes; 2509 2510 rc = pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer(pThisCC, pDXContext, pCmd->slot, type, pCBB->sid, pCBB->offsetInBytes, pCBB->sizeInBytes); 2581 2511 return rc; 2582 2512 } -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
r99521 r99535 513 513 DECLCALLBACKMEMBER(int, pfnDXHint, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 514 514 DECLCALLBACKMEMBER(int, pfnDXBufferUpdate, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 515 DECLCALLBACKMEMBER(int, pfnDXSetVSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));516 DECLCALLBACKMEMBER(int, pfnDXSetPSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));517 DECLCALLBACKMEMBER(int, pfnDXSetGSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));518 DECLCALLBACKMEMBER(int, pfnDXSetHSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));519 DECLCALLBACKMEMBER(int, pfnDXSetDSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));520 DECLCALLBACKMEMBER(int, pfnDXSetCSConstantBufferOffset, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));521 515 DECLCALLBACKMEMBER(int, pfnDXCondBindAllShader, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 522 516 DECLCALLBACKMEMBER(int, pfnScreenCopy, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); … … 637 631 int vmsvga3dDXHint(PVGASTATECC pThisCC, uint32_t idDXContext); 638 632 int vmsvga3dDXBufferUpdate(PVGASTATECC pThisCC, uint32_t idDXContext); 639 int vmsvga3dDXSetVSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 640 int vmsvga3dDXSetPSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 641 int vmsvga3dDXSetGSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 642 int vmsvga3dDXSetHSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 643 int vmsvga3dDXSetDSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 644 int vmsvga3dDXSetCSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext); 633 int vmsvga3dDXSetConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetConstantBufferOffset const *pCmd, SVGA3dShaderType type); 645 634 int vmsvga3dDXCondBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext); 646 635 int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext); -
trunk/src/VBox/Devices/Graphics/DevVGASavedState.h
r98103 r99535 57 57 } while (0) 58 58 59 #define VGA_SAVEDSTATE_VERSION 26 59 #define VGA_SAVEDSTATE_VERSION 27 60 #define VGA_SAVEDSTATE_VERSION_VMSVGA_REG_CAP2 27 /* SVGA_REG_CAP2. */ 60 61 #define VGA_SAVEDSTATE_VERSION_VMSVGA_DX_SFLAGS 26 /* SVGA3dSurfaceAllFlags. */ 61 62 #define VGA_SAVEDSTATE_VERSION_VMSVGA_DX_CMDBUF 25 /* Command buffers capability is not tied to VGPU10 setting. */
Note:
See TracChangeset
for help on using the changeset viewer.