VirtualBox

Changeset 81609 in vbox for trunk


Ignore:
Timestamp:
Oct 31, 2019 3:44:04 PM (5 years ago)
Author:
vboxsync
Message:

Devices/Graphics: use the source context in vmsvga3dSurfaceCopy in D3D backend; cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r81599 r81609  
    15051505        && RT_BOOL(pSurfaceDest->surfaceFlags & SVGA3D_SURFACE_HINT_TEXTURE))
    15061506    {
    1507         const uint32_t cid = pSurfaceSrc->idAssociatedContext;
    1508 
    1509         PVMSVGA3DCONTEXT pContext;
    1510         rc = vmsvga3dContextFromCid(pState, cid, &pContext);
     1507        /* Create the destination texture in the same context as the source texture. */
     1508        uint32_t const cidSrc = pSurfaceSrc->idAssociatedContext;
     1509
     1510        PVMSVGA3DCONTEXT pContextSrc;
     1511        rc = vmsvga3dContextFromCid(pState, cidSrc, &pContextSrc);
    15111512        AssertRCReturn(rc, rc);
    15121513
    1513         LogFunc(("sid=%x type=%x format=%d -> create texture\n", sidDest, pSurfaceDest->surfaceFlags, pSurfaceDest->format));
    1514         rc = vmsvga3dBackCreateTexture(pState, pContext, cid, pSurfaceDest);
     1514        LogFunc(("sid=%x type=%x format=%d -> create dest texture\n", sidDest, pSurfaceDest->surfaceFlags, pSurfaceDest->format));
     1515        rc = vmsvga3dBackCreateTexture(pState, pContextSrc, cidSrc, pSurfaceDest);
    15151516        AssertRCReturn(rc, rc);
    15161517    }
     
    15221523        && pSurfaceDest->u.pSurface)
    15231524    {
    1524         /// @todo should use the src context because only the shared hardware surface is required from the dst context,
    1525         //        while the src context may be also needed to copy data to the source bounce texture.
    1526         const uint32_t cidDst = pSurfaceDest->idAssociatedContext;
    1527 
    1528         PVMSVGA3DCONTEXT pContextDst;
    1529         rc = vmsvga3dContextFromCid(pState, cidDst, &pContextDst);
     1525        /* Both surfaces in hardware. Use the src context to copy one to another, because the src context may be needed
     1526         * to copy data from source texture to the source bounce texture. while only the shared hardware surface is required
     1527         * from the dst context.
     1528         */
     1529        uint32_t const cidSrc = pSurfaceSrc->idAssociatedContext;
     1530
     1531        PVMSVGA3DCONTEXT pContextSrc;
     1532        rc = vmsvga3dContextFromCid(pState, cidSrc, &pContextSrc);
    15301533        AssertRCReturn(rc, rc);
    15311534
     
    15351538
    15361539        IDirect3DSurface9 *pSrc;
    1537         rc = vmsvga3dGetD3DSurface(pState, pContextDst, pSurfaceSrc, src.face, src.mipmap, false, &pSrc);
     1540        rc = vmsvga3dGetD3DSurface(pState, pContextSrc, pSurfaceSrc, src.face, src.mipmap, false, &pSrc);
    15381541        AssertRCReturn(rc, rc);
    15391542
    15401543        IDirect3DSurface9 *pDest;
    1541         rc = vmsvga3dGetD3DSurface(pState, pContextDst, pSurfaceDest, dest.face, dest.mipmap, false, &pDest);
     1544        rc = vmsvga3dGetD3DSurface(pState, pContextSrc, pSurfaceDest, dest.face, dest.mipmap, false, &pDest);
    15421545        AssertRCReturnStmt(rc, D3D_RELEASE(pSrc), rc);
    15431546
    15441547        for (uint32_t i = 0; i < cCopyBoxes; ++i)
    15451548        {
    1546             HRESULT hr;
    1547 
    15481549            SVGA3dCopyBox clipBox = pBox[i];
    15491550            vmsvgaClipCopyBox(&pMipmapLevelSrc->mipmapSize, &pMipmapLevelDest->mipmapSize, &clipBox);
     
    15801581            Assert(!clipBox.srcz && !clipBox.z);
    15811582
    1582             hr = pContextDst->pDevice->StretchRect(pSrc, &RectSrc, pDest, &RectDest, D3DTEXF_NONE);
     1583            HRESULT hr = pContextSrc->pDevice->StretchRect(pSrc, &RectSrc, pDest, &RectDest, D3DTEXF_NONE);
    15831584            if (hr != D3D_OK)
    15841585            {
    1585                 /* This can happen for compressed texture formats. */
     1586                /* This can happen for compressed texture formats for example. */
    15861587                LogFunc(("StretchRect failed with %x. Try a slow path.\n", hr));
    15871588                if (   pSurfaceSrc->bounce.pTexture
    15881589                    && (pSurfaceSrc->fUsageD3D & D3DUSAGE_RENDERTARGET))
    15891590                {
    1590 #if 1
    1591                     /* Copy the source texture mipmap level to the bounce texture.
    1592                      * Get the data using the surface associated context.
    1593                      */
    1594                     PVMSVGA3DCONTEXT pContextSrc;
    1595                     rc = vmsvga3dContextFromCid(pState, pSurfaceSrc->idAssociatedContext, &pContextSrc);
    1596                     if (RT_SUCCESS(rc))
     1591                    /* Copy the source texture mipmap level to the source bounce texture. */
     1592                    hr = D3D9GetRenderTargetData(pContextSrc, pSurfaceSrc, src.face, src.mipmap);
     1593                    AssertMsg(hr == D3D_OK, ("D3D9GetRenderTargetData failed with %x\n", hr));
     1594                    if (hr == D3D_OK)
    15971595                    {
    1598                         hr = D3D9GetRenderTargetData(pContextSrc, pSurfaceSrc, src.face, src.mipmap);
    1599                         AssertMsg(hr == D3D_OK, ("D3D9GetRenderTargetData failed with %x\n", hr));
    1600                         if (hr == D3D_OK)
    1601                         {
    1602                             /* Copy the source bounce texture to the destination surface. */
    1603                             IDirect3DSurface9 *pBounceSurf;
    1604                             rc = vmsvga3dGetD3DSurface(pState, pContextDst, pSurfaceSrc, src.face, src.mipmap, true, &pBounceSurf);
    1605                             if (RT_SUCCESS(rc))
    1606                             {
    1607                                 POINT pointDest;
    1608                                 pointDest.x = clipBox.x;
    1609                                 pointDest.y = clipBox.y;
    1610 
    1611                                 hr = pContextDst->pDevice->UpdateSurface(pBounceSurf, &RectSrc, pDest, &pointDest);
    1612                                 Assert(hr == D3D_OK);
    1613 
    1614                                 D3D_RELEASE(pBounceSurf);
    1615                             }
    1616                             else
    1617                             {
    1618                                 AssertRC(rc);
    1619                                 hr = E_INVALIDARG;
    1620                             }
    1621                         }
    1622                     }
    1623                     else
    1624                     {
    1625                         AssertRC(rc);
    1626                         hr = E_INVALIDARG;
    1627                     }
    1628 #else
    1629                     /* Copy the texture mipmap level to the bounce texture. */
    1630 
    1631                     /* Source is the texture, destination is the corresponding bounce texture. */
    1632                     IDirect3DSurface9 *pBounceSurf;
    1633                     rc = vmsvga3dGetD3DSurface(pState, pContextDst, pSurfaceSrc, src.face, src.mipmap, true, &pBounceSurf);
    1634                     AssertRC(rc);
    1635                     if (RT_SUCCESS(rc))
    1636                     {
    1637                         Assert(pSrc != pBounceSurf);
    1638 
    1639                         hr = pContextDst->pDevice->GetRenderTargetData(pSrc, pBounceSurf);
    1640                         Assert(hr == D3D_OK);
    1641                         if (SUCCEEDED(hr))
     1596                        /* Copy the source bounce texture to the destination surface. */
     1597                        IDirect3DSurface9 *pSrcBounce;
     1598                        rc = vmsvga3dGetD3DSurface(pState, pContextSrc, pSurfaceSrc, src.face, src.mipmap, true, &pSrcBounce);
     1599                        if (RT_SUCCESS(rc))
    16421600                        {
    16431601                            POINT pointDest;
     
    16451603                            pointDest.y = clipBox.y;
    16461604
    1647                             hr = pContextDst->pDevice->UpdateSurface(pBounceSurf, &RectSrc, pDest, &pointDest);
     1605                            hr = pContextSrc->pDevice->UpdateSurface(pSrcBounce, &RectSrc, pDest, &pointDest);
    16481606                            Assert(hr == D3D_OK);
     1607
     1608                            D3D_RELEASE(pSrcBounce);
    16491609                        }
    1650 
    1651                         D3D_RELEASE(pBounceSurf);
     1610                        else
     1611                        {
     1612                            AssertRC(rc);
     1613                            hr = E_INVALIDARG;
     1614                        }
    16521615                    }
    1653 #endif
    16541616                }
    16551617                else if (   (pSurfaceSrc->fUsageD3D & D3DUSAGE_RENDERTARGET) == 0
     
    16571619                {
    16581620                    /* Can lock both. */
    1659                     vmsvga3dSurfaceFlush(pSurfaceSrc);
    1660                     vmsvga3dSurfaceFlush(pSurfaceDest);
    1661 
    16621621                    D3DLOCKED_RECT LockedSrcRect;
    16631622                    hr = pSrc->LockRect(&LockedSrcRect, &RectSrc, D3DLOCK_READONLY);
     
    17051664
    17061665        /* Track the StretchRect operation. */
    1707         vmsvga3dSurfaceTrackUsage(pState, pContextDst, pSurfaceSrc);
    1708         vmsvga3dSurfaceTrackUsage(pState, pContextDst, pSurfaceDest);
     1666        vmsvga3dSurfaceTrackUsage(pState, pContextSrc, pSurfaceSrc);
     1667        vmsvga3dSurfaceTrackUsage(pState, pContextSrc, pSurfaceDest);
    17091668    }
    17101669    else
    17111670    {
    1712         /*
    1713          * Copy from/to memory to/from a surface. Or mem->mem.
    1714          * Use the context of existing HW surface, if any.
     1671        /* One of the surfaces is in memory.
     1672         *
     1673         * Copy from/to memory to/from a HW surface. Or mem->mem.
     1674         * Use the context of the HW surface, if any.
    17151675         */
    17161676        PVMSVGA3DCONTEXT pContext = NULL;
     
    18311791            {
    18321792                hr = pD3DSurf->UnlockRect();
    1833                 AssertMsgReturn(hr == D3D_OK, ("Unlock failed with %x\n", hr), VERR_INTERNAL_ERROR);
     1793                AssertMsgReturnStmt(hr == D3D_OK, ("Unlock failed with %x\n", hr), D3D_RELEASE(pD3DSurf), VERR_INTERNAL_ERROR);
    18341794            }
    18351795        }
    18361796
    1837         /* If the destination bounce texture has been used, then update the actual texture. */
     1797        D3D_RELEASE(pD3DSurf);
     1798
     1799        /* If the destination bounce texture has been used, then update the actual destination texture. */
    18381800        if (   pSurfaceDest->u.pTexture
    18391801            && pSurfaceDest->bounce.pTexture
     
    18441806
    18451807            /* Copy the new content to the actual texture object. */
    1846 #if 1
    18471808            HRESULT hr2 = D3D9UpdateTexture(pContext, pSurfaceDest);
    1848 #else
    1849             IDirect3DBaseTexture9 *pSourceTexture;
    1850             IDirect3DBaseTexture9 *pDestinationTexture;
    1851             if (pSurfaceDest->enmD3DResType == VMSVGA3D_D3DRESTYPE_CUBE_TEXTURE)
    1852             {
    1853                 pSourceTexture = pSurfaceDest->bounce.pCubeTexture;
    1854                 pDestinationTexture = pSurfaceDest->u.pCubeTexture;
    1855             }
    1856             else
    1857             {
    1858                 pSourceTexture = pSurfaceDest->bounce.pTexture;
    1859                 pDestinationTexture = pSurfaceDest->u.pTexture;
    1860             }
    1861             HRESULT hr2 = pContext->pDevice->UpdateTexture(pSourceTexture, pDestinationTexture);
    1862 #endif
    18631809            AssertMsg(hr2 == D3D_OK, ("UpdateTexture failed with %x\n", hr2)); RT_NOREF(hr2);
    18641810
     
    18661812            vmsvga3dSurfaceTrackUsage(pState, pContext, pSurfaceDest);
    18671813        }
    1868 
    1869         D3D_RELEASE(pD3DSurf);
    18701814    }
    18711815
     
    57295673            {
    57305674                float *pValuesF = (float *)pValues;
    5731                 Log(("ConstantF %d: value=%d, %d, %d, %d\n", reg + i, (int)(pValuesF[i*4 + 0] * 100.0f), (int)(pValuesF[i*4 + 1] * 100.0f), (int)(pValuesF[i*4 + 2] * 100.0f), (int)(pValuesF[i*4 + 3] * 100.0f)));
     5675                Log(("ConstantF %d: value=%d, %d, %d, %d\n", reg + i, (int)(pValuesF[i*4 + 0] * 10000.0f), (int)(pValuesF[i*4 + 1] * 10000.0f), (int)(pValuesF[i*4 + 2] * 10000.0f), (int)(pValuesF[i*4 + 3] * 10000.0f)));
    57325676                break;
    57335677            }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette