VirtualBox

Changeset 99589 in vbox


Ignore:
Timestamp:
May 3, 2023 3:56:34 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
157106
Message:

Devices/Graphics: SVGA_3D_CMD_INTRA_SURFACE_COPY. bugref:9830

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

Legend:

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

    r99535 r99589  
    35813581{
    35823582#ifdef VMSVGA3D_DX
    3583     DEBUG_BREAKPOINT_TEST();
    3584     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    3585     RT_NOREF(pSvgaR3State, pCmd, cbCmd);
    3586     return vmsvga3dIntraSurfaceCopy(pThisCC, idDXContext);
     3583    //DEBUG_BREAKPOINT_TEST();
     3584    RT_NOREF(cbCmd);
     3585    return vmsvga3dIntraSurfaceCopy(pThisCC, idDXContext, pCmd);
    35873586#else
    35883587    RT_NOREF(pThisCC, idDXContext, pCmd, cbCmd);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r99535 r99589  
    64566456           if (*pu32DeviceCaps & SVGA_CAP_CAP2_REGISTER)
    64576457               *pu32DeviceCaps2 |= SVGA_CAP2_GROW_OTABLE  /* "Allow the GrowOTable/DXGrowCOTable commands" */
     6458                                |  SVGA_CAP2_INTRA_SURFACE_COPY /* "IntraSurfaceCopy command" */
    64586459                                |  SVGA_CAP2_DX2          /* Shader Model 4.1.
    64596460                                                           * "Allow the DefineGBSurface_v3, WholeSurfaceCopy, WriteZeroSurface, and
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-dx11.cpp

    r99535 r99589  
    94779477
    94789478
    9479 static DECLCALLBACK(int) vmsvga3dBackIntraSurfaceCopy(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;
     9479static DECLCALLBACK(int) vmsvga3dBackIntraSurfaceCopy(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dSurfaceImageId const &surface, SVGA3dCopyBox const &box)
     9480{
     9481    RT_NOREF(pDXContext);
     9482
     9483    LogFunc(("sid %u\n", surface.sid));
     9484
     9485    PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
     9486    AssertReturn(pState, VERR_INVALID_STATE);
     9487
     9488    PVMSVGA3DBACKEND pBackend = pState->pBackend;
     9489
     9490    PVMSVGA3DSURFACE pSurface;
     9491    int rc = vmsvga3dSurfaceFromSid(pThisCC->svga.p3dState, surface.sid, &pSurface);
     9492    AssertRCReturn(rc, rc);
     9493
     9494    PVMSVGA3DMIPMAPLEVEL pMipLevel;
     9495    rc = vmsvga3dMipmapLevel(pSurface, surface.face, surface.mipmap, &pMipLevel);
     9496    ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc);
     9497
     9498    /* Clip the box. */
     9499    SVGA3dCopyBox clipBox = box;
     9500    vmsvgaR3ClipCopyBox(&pMipLevel->mipmapSize, &pMipLevel->mipmapSize, &clipBox);
     9501
     9502    LogFunc(("surface%s cid %d\n",
     9503             pSurface->pBackendSurface ? "" : " sysmem",
     9504             pSurface ? pSurface->idAssociatedContext : SVGA_ID_INVALID));
     9505
     9506    if (pSurface->pBackendSurface)
     9507    {
     9508        /* Surface -> Surface. */
     9509        DXDEVICE *pDXDevice = &pBackend->dxDevice;
     9510
     9511        UINT DstSubresource = vmsvga3dCalcSubresource(surface.mipmap, surface.face, pSurface->cLevels);
     9512        UINT DstX = clipBox.x;
     9513        UINT DstY = clipBox.y;
     9514        UINT DstZ = clipBox.z;
     9515
     9516        UINT SrcSubresource = DstSubresource;
     9517        D3D11_BOX SrcBox;
     9518        SrcBox.left   = clipBox.srcx;
     9519        SrcBox.top    = clipBox.srcy;
     9520        SrcBox.front  = clipBox.srcz;
     9521        SrcBox.right  = clipBox.srcx + clipBox.w;
     9522        SrcBox.bottom = clipBox.srcy + clipBox.h;
     9523        SrcBox.back   = clipBox.srcz + clipBox.d;
     9524
     9525        ID3D11Resource *pDstResource;
     9526        ID3D11Resource *pSrcResource;
     9527        pDstResource = dxResource(pState, pSurface, NULL);
     9528        pSrcResource = pDstResource;
     9529
     9530        pDXDevice->pImmediateContext->CopySubresourceRegion1(pDstResource, DstSubresource, DstX, DstY, DstZ,
     9531                                                             pSrcResource, SrcSubresource, &SrcBox, 0);
     9532    }
     9533    else
     9534    {
     9535        /* Memory -> Memory. */
     9536        uint32_t const cxBlocks = (clipBox.w + pSurface->cxBlock - 1) / pSurface->cxBlock;
     9537        uint32_t const cyBlocks = (clipBox.h + pSurface->cyBlock - 1) / pSurface->cyBlock;
     9538        uint32_t const cbRow = cxBlocks * pSurface->cbBlock;
     9539
     9540        uint8_t const *pu8Src = (uint8_t *)pMipLevel->pSurfaceData
     9541                        + (clipBox.srcx / pSurface->cxBlock) * pSurface->cbBlock
     9542                        + (clipBox.srcy / pSurface->cyBlock) * pMipLevel->cbSurfacePitch
     9543                        + clipBox.srcz * pMipLevel->cbSurfacePlane;
     9544
     9545        uint8_t *pu8Dst = (uint8_t *)pMipLevel->pSurfaceData
     9546                        + (clipBox.x / pSurface->cxBlock) * pSurface->cbBlock
     9547                        + (clipBox.y / pSurface->cyBlock) * pMipLevel->cbSurfacePitch
     9548                        + clipBox.z * pMipLevel->cbSurfacePlane;
     9549
     9550        for (uint32_t z = 0; z < clipBox.d; ++z)
     9551        {
     9552            uint8_t const *pu8PlaneSrc = pu8Src;
     9553            uint8_t *pu8PlaneDst = pu8Dst;
     9554
     9555            for (uint32_t y = 0; y < clipBox.h; ++y)
     9556            {
     9557                memmove(pu8PlaneDst, pu8PlaneSrc, cbRow);
     9558                pu8PlaneDst += pMipLevel->cbSurfacePitch;
     9559                pu8PlaneSrc += pMipLevel->cbSurfacePitch;
     9560            }
     9561
     9562            pu8Src += pMipLevel->cbSurfacePlane;
     9563            pu8Dst += pMipLevel->cbSurfacePlane;
     9564        }
     9565    }
     9566
     9567    return rc;
    94869568}
    94879569
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp

    r99535 r99589  
    25642564
    25652565
    2566 int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
     2566int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdIntraSurfaceCopy const *pCmd)
    25672567{
    25682568    int rc;
     
    25762576    AssertRCReturn(rc, rc);
    25772577
    2578     rc = pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy(pThisCC, pDXContext);
     2578    rc = pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy(pThisCC, pDXContext, pCmd->surface, pCmd->box);
    25792579    return rc;
    25802580}
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r99535 r99589  
    515515    DECLCALLBACKMEMBER(int, pfnDXCondBindAllShader,         (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    516516    DECLCALLBACKMEMBER(int, pfnScreenCopy,                  (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    517     DECLCALLBACKMEMBER(int, pfnIntraSurfaceCopy,            (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
     517    DECLCALLBACKMEMBER(int, pfnIntraSurfaceCopy,            (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dSurfaceImageId const &surface, SVGA3dCopyBox const &box));
    518518    DECLCALLBACKMEMBER(int, pfnDXResolveCopy,               (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    519519    DECLCALLBACKMEMBER(int, pfnDXPredResolveCopy,           (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
     
    635635int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
    636636int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd);
    637 int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
     637int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdIntraSurfaceCopy const *pCmd);
    638638int vmsvga3dDXResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext);
    639639int vmsvga3dDXPredResolveCopy(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