VirtualBox

Changeset 94215 in vbox for trunk


Ignore:
Timestamp:
Mar 14, 2022 6:22:15 AM (3 years ago)
Author:
vboxsync
Message:

Devices/Graphics: saved state fixes: bugref:9830

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

Legend:

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

    r94205 r94215  
    54545454}
    54555455
    5456 static int vmsvgaR3LoadBufCtx(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PVMSVGACMDBUFCTX pBufCtx)
     5456static int vmsvgaR3LoadBufCtx(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, PSSMHANDLE pSSM, PVMSVGACMDBUFCTX pBufCtx, SVGACBContext CBCtx)
    54575457{
    54585458    PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3;
    5459 
    5460     int rc = pHlp->pfnSSMGetU32(pSSM, &pBufCtx->cSubmitted);
     5459    PVMSVGAR3STATE pSvgaR3State = pThisCC->svga.pSvgaR3State;
     5460
     5461    uint32_t cSubmitted;
     5462    int rc = pHlp->pfnSSMGetU32(pSSM, &cSubmitted);
    54615463    AssertLogRelRCReturn(rc, rc);
    54625464
    5463     for (uint32_t i = 0; i < pBufCtx->cSubmitted; ++i)
     5465    for (uint32_t i = 0; i < cSubmitted; ++i)
    54645466    {
    54655467        PVMSVGACMDBUF pCmdBuf = vmsvgaR3CmdBufAlloc(pBufCtx);
     
    54785480        AssertReturn(u32 == pCmdBuf->hdr.length, VERR_INVALID_STATE);
    54795481
    5480         pCmdBuf->pvCommands = RTMemAlloc(pCmdBuf->hdr.length);
    5481         AssertPtrReturn(pCmdBuf->pvCommands, VERR_NO_MEMORY);
    5482 
    5483         rc = pHlp->pfnSSMGetMem(pSSM, pCmdBuf->pvCommands, pCmdBuf->hdr.length);
    5484         AssertRCReturn(rc, rc);
     5482        if (pCmdBuf->hdr.length)
     5483        {
     5484            pCmdBuf->pvCommands = RTMemAlloc(pCmdBuf->hdr.length);
     5485            AssertPtrReturn(pCmdBuf->pvCommands, VERR_NO_MEMORY);
     5486
     5487            rc = pHlp->pfnSSMGetMem(pSSM, pCmdBuf->pvCommands, pCmdBuf->hdr.length);
     5488            AssertRCReturn(rc, rc);
     5489        }
     5490
     5491        if (RT_LIKELY(CBCtx < RT_ELEMENTS(pSvgaR3State->apCmdBufCtxs)))
     5492        {
     5493            vmsvgaR3CmdBufSubmitCtx(pDevIns, pThis, pThisCC, &pCmdBuf);
     5494        }
     5495        else
     5496        {
     5497            uint32_t offNextCmd = 0;
     5498            vmsvgaR3CmdBufSubmitDC(pDevIns, pThisCC, &pCmdBuf, &offNextCmd);
     5499        }
     5500
     5501        /* Free the buffer if CmdBufSubmit* did not consume it. */
     5502        vmsvgaR3CmdBufFree(pCmdBuf);
    54855503    }
    54865504    return rc;
     
    57005718        {
    57015719            /* Device context command buffers. */
    5702             rc = vmsvgaR3LoadBufCtx(pDevIns, pSSM, &pSVGAState->CmdBufCtxDC);
     5720            rc = vmsvgaR3LoadBufCtx(pDevIns, pThis, pThisCC, pSSM, &pSVGAState->CmdBufCtxDC, SVGA_CB_CONTEXT_MAX);
    57035721            AssertLogRelRCReturn(rc, rc);
    57045722
     
    57185736                    vmsvgaR3CmdBufCtxInit(pSVGAState->apCmdBufCtxs[j]);
    57195737
    5720                     rc = vmsvgaR3LoadBufCtx(pDevIns, pSSM, pSVGAState->apCmdBufCtxs[j]);
     5738                    rc = vmsvgaR3LoadBufCtx(pDevIns, pThis, pThisCC, pSSM, pSVGAState->apCmdBufCtxs[j], (SVGACBContext)j);
    57215739                    AssertLogRelRCReturn(rc, rc);
    57225740                }
     
    58545872            pHlp->pfnSSMPutMem(pSSM, &pIter->hdr, sizeof(SVGACBHeader));
    58555873            pHlp->pfnSSMPutU32(pSSM, pIter->hdr.length);
    5856             rc = pHlp->pfnSSMPutMem(pSSM, pIter->pvCommands, pIter->hdr.length);
     5874            if (pIter->hdr.length)
     5875                rc = pHlp->pfnSSMPutMem(pSSM, pIter->pvCommands, pIter->hdr.length);
    58575876            AssertLogRelRCReturn(rc, rc);
    58585877        }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-savedstate.cpp

    r94205 r94215  
    277277            if (!VMSVGA3DSURFACE_HAS_HW_SURFACE(pSurface))
    278278            {
    279                 if (pMipmapLevel->fDirty && pMipmapLevel->pSurfaceData)
     279                if (pMipmapLevel->pSurfaceData)
    280280                {
    281281                    /* Data follows */
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r94205 r94215  
    24522452            td.MiscFlags          = 0;
    24532453
    2454             hr = pDXDevice->pDevice->CreateTexture2D(&td, 0, &pBackendSurface->u.pTexture2D);
     2454            hr = pDXDevice->pDevice->CreateTexture2D(&td, paInitialData, &pBackendSurface->u.pTexture2D);
    24552455            Assert(SUCCEEDED(hr));
    24562456            if (SUCCEEDED(hr))
     
    25292529    rc = dxBackendSurfaceAlloc(&pBackendSurface);
    25302530    AssertRCReturn(rc, rc);
     2531
     2532    LogFunc(("sid = %u, size = %u\n", pSurface->id, pMipLevel->cbSurface));
    25312533
    25322534    /* Upload the current data, if any. */
     
    47004702    {
    47014703        Assert(uFace == 0 && uMipmap == 0); /* The caller ensures this. */
    4702         vmsvga3dBackSurfaceDestroy(pThisCC, pSurface);
     4704        /** @todo This causes flickering when a buffer is invalidated and re-created right before a draw call. */
     4705        //vmsvga3dBackSurfaceDestroy(pThisCC, pSurface);
    47034706    }
    47044707    else
     
    53845387                    AssertContinue(RT_SUCCESS(rc));
    53855388                }
     5389
     5390                LogFunc(("srv[%d][%d] sid = %u, srvid = %u\n", idxShaderState, idxSR, sid, shaderResourceViewId));
    53865391            }
    53875392        }
     
    78497854        AssertLogRelReturn(pDXShader->shaderInfo.cbBytecode <= 2 * SVGA3D_MAX_SHADER_MEMORY_BYTES, VERR_INVALID_STATE);
    78507855
    7851         pDXShader->shaderInfo.pvBytecode = RTMemAlloc(pDXShader->shaderInfo.cbBytecode);
    7852         AssertPtrReturn(pDXShader->shaderInfo.pvBytecode, VERR_NO_MEMORY);
    7853         pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.pvBytecode, pDXShader->shaderInfo.cbBytecode);
     7856        if (pDXShader->shaderInfo.cbBytecode)
     7857        {
     7858            pDXShader->shaderInfo.pvBytecode = RTMemAlloc(pDXShader->shaderInfo.cbBytecode);
     7859            AssertPtrReturn(pDXShader->shaderInfo.pvBytecode, VERR_NO_MEMORY);
     7860            pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.pvBytecode, pDXShader->shaderInfo.cbBytecode);
     7861        }
    78547862
    78557863        rc = pHlp->pfnSSMGetU32(pSSM, &pDXShader->shaderInfo.cInputSignature);
    78567864        AssertLogRelRCReturn(rc, rc);
    78577865        AssertLogRelReturn(pDXShader->shaderInfo.cInputSignature <= 32, VERR_INVALID_STATE);
    7858         pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aInputSignature, pDXShader->shaderInfo.cInputSignature * sizeof(SVGA3dDXSignatureEntry));
     7866        if (pDXShader->shaderInfo.cInputSignature)
     7867            pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aInputSignature, pDXShader->shaderInfo.cInputSignature * sizeof(SVGA3dDXSignatureEntry));
    78597868
    78607869        rc = pHlp->pfnSSMGetU32(pSSM, &pDXShader->shaderInfo.cOutputSignature);
    78617870        AssertLogRelRCReturn(rc, rc);
    78627871        AssertLogRelReturn(pDXShader->shaderInfo.cOutputSignature <= 32, VERR_INVALID_STATE);
    7863         pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aOutputSignature, pDXShader->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
     7872        if (pDXShader->shaderInfo.cOutputSignature)
     7873            pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aOutputSignature, pDXShader->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
    78647874
    78657875        rc = pHlp->pfnSSMGetU32(pSSM, &pDXShader->shaderInfo.cPatchConstantSignature);
    78667876        AssertLogRelRCReturn(rc, rc);
    78677877        AssertLogRelReturn(pDXShader->shaderInfo.cPatchConstantSignature <= 32, VERR_INVALID_STATE);
    7868         pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aPatchConstantSignature, pDXShader->shaderInfo.cPatchConstantSignature * sizeof(SVGA3dDXSignatureEntry));
     7878        if (pDXShader->shaderInfo.cPatchConstantSignature)
     7879            pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aPatchConstantSignature, pDXShader->shaderInfo.cPatchConstantSignature * sizeof(SVGA3dDXSignatureEntry));
    78697880
    78707881        rc = pHlp->pfnSSMGetU32(pSSM, &pDXShader->shaderInfo.cDclResource);
    78717882        AssertLogRelRCReturn(rc, rc);
    78727883        AssertLogRelReturn(pDXShader->shaderInfo.cDclResource <= SVGA3D_DX_MAX_SRVIEWS, VERR_INVALID_STATE);
    7873         pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aOffDclResource, pDXShader->shaderInfo.cDclResource * sizeof(uint32_t));
     7884        if (pDXShader->shaderInfo.cDclResource)
     7885            pHlp->pfnSSMGetMem(pSSM, pDXShader->shaderInfo.aOffDclResource, pDXShader->shaderInfo.cDclResource * sizeof(uint32_t));
    78747886    }
    78757887
     
    78987910
    78997911        pHlp->pfnSSMPutU32(pSSM, (uint32_t)pDXShader->shaderInfo.enmProgramType);
     7912
    79007913        pHlp->pfnSSMPutU32(pSSM, pDXShader->shaderInfo.cbBytecode);
    7901         pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.pvBytecode, pDXShader->shaderInfo.cbBytecode);
     7914        if (pDXShader->shaderInfo.cbBytecode)
     7915            pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.pvBytecode, pDXShader->shaderInfo.cbBytecode);
     7916
    79027917        pHlp->pfnSSMPutU32(pSSM, pDXShader->shaderInfo.cInputSignature);
    7903         pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aInputSignature, pDXShader->shaderInfo.cInputSignature * sizeof(SVGA3dDXSignatureEntry));
     7918        if (pDXShader->shaderInfo.cInputSignature)
     7919            pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aInputSignature, pDXShader->shaderInfo.cInputSignature * sizeof(SVGA3dDXSignatureEntry));
     7920
    79047921        pHlp->pfnSSMPutU32(pSSM, pDXShader->shaderInfo.cOutputSignature);
    7905         pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aOutputSignature, pDXShader->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
     7922        if (pDXShader->shaderInfo.cOutputSignature)
     7923            pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aOutputSignature, pDXShader->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
     7924
    79067925        pHlp->pfnSSMPutU32(pSSM, pDXShader->shaderInfo.cPatchConstantSignature);
    7907         pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aPatchConstantSignature, pDXShader->shaderInfo.cPatchConstantSignature * sizeof(SVGA3dDXSignatureEntry));
     7926        if (pDXShader->shaderInfo.cPatchConstantSignature)
     7927            pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aPatchConstantSignature, pDXShader->shaderInfo.cPatchConstantSignature * sizeof(SVGA3dDXSignatureEntry));
     7928
    79087929        pHlp->pfnSSMPutU32(pSSM, pDXShader->shaderInfo.cDclResource);
    7909         pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aOffDclResource, pDXShader->shaderInfo.cDclResource * sizeof(uint32_t));
     7930        if (pDXShader->shaderInfo.cDclResource)
     7931            pHlp->pfnSSMPutMem(pSSM, pDXShader->shaderInfo.aOffDclResource, pDXShader->shaderInfo.cDclResource * sizeof(uint32_t));
    79107932    }
    79117933    rc = pHlp->pfnSSMPutU32(pSSM, pDXContext->pBackendDXContext->cSOTarget);
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