VirtualBox

Changeset 95016 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
May 15, 2022 6:18:16 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
151456
Message:

Devices/Graphics: shader signatures: bugref:9830

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

Legend:

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

    r95012 r95016  
    37653765{
    37663766#ifdef VMSVGA3D_DX
    3767     DEBUG_BREAKPOINT_TEST();
     3767    //DEBUG_BREAKPOINT_TEST();
    37683768    RT_NOREF(cbCmd);
    37693769    return vmsvga3dDXDestroyUAView(pThisCC, idDXContext, pCmd);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp

    r95015 r95016  
    20302030                ASSERT_GUEST_RETURN(cbSignaturesAvail >= cbSignature, VERR_INVALID_PARAMETER);
    20312031
    2032                 /* Keep the generated signatures if the guest did not provide any. */
    2033                 if (cSignature != 0)
    2034                 {
    2035                     /* Copy to DXShaderInfo. */
    2036                     uint8_t const *pu8Signatures = (uint8_t *)&pSignatureHeader[1];
    2037                     pShaderInfo->cInputSignature = pSignatureHeader->numInputSignatures;
    2038                     memcpy(pShaderInfo->aInputSignature, pu8Signatures, pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry));
    2039 
    2040                     pu8Signatures += pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry);
    2041                     pShaderInfo->cOutputSignature = pSignatureHeader->numOutputSignatures;
    2042                     memcpy(pShaderInfo->aOutputSignature, pu8Signatures, pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry));
    2043 
    2044                     pu8Signatures += pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry);
    2045                     pShaderInfo->cPatchConstantSignature = pSignatureHeader->numPatchConstantSignatures;
    2046                     memcpy(pShaderInfo->aPatchConstantSignature, pu8Signatures, pSignatureHeader->numPatchConstantSignatures * sizeof(SVGA3dDXSignatureEntry));
    2047 
    2048                     /* The shader does not need guesswork. */
    2049                     pShaderInfo->fGuestSignatures = true;
    2050                 }
     2032                /* The shader does not need guesswork. */
     2033                pShaderInfo->fGuestSignatures = true;
     2034
     2035                /* Copy to DXShaderInfo. */
     2036                uint8_t const *pu8Signatures = (uint8_t *)&pSignatureHeader[1];
     2037                pShaderInfo->cInputSignature = pSignatureHeader->numInputSignatures;
     2038                memcpy(pShaderInfo->aInputSignature, pu8Signatures, pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry));
     2039
     2040                pu8Signatures += pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry);
     2041                pShaderInfo->cOutputSignature = pSignatureHeader->numOutputSignatures;
     2042                memcpy(pShaderInfo->aOutputSignature, pu8Signatures, pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry));
     2043
     2044                pu8Signatures += pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry);
     2045                pShaderInfo->cPatchConstantSignature = pSignatureHeader->numPatchConstantSignatures;
     2046                memcpy(pShaderInfo->aPatchConstantSignature, pu8Signatures, pSignatureHeader->numPatchConstantSignatures * sizeof(SVGA3dDXSignatureEntry));
    20512047            }
    20522048        }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r95015 r95016  
    52795279
    52805280
     5281static void vboxDXMatchGuestShaderSignatures(PVMSVGA3DDXCONTEXT pDXContext, DXSHADER *pDXShader)
     5282{
     5283    if (pDXShader->enmShaderType == SVGA3D_SHADERTYPE_GS)
     5284    {
     5285        /* Output signature of a GS shader is the input of the pixel shader. */
     5286        SVGA3dShaderId const shaderIdPS = pDXContext->svgaDXContext.shaderState[SVGA3D_SHADERTYPE_PS - SVGA3D_SHADERTYPE_MIN].shaderId;
     5287        SVGA3dShaderId const shaderIdDS = pDXContext->svgaDXContext.shaderState[SVGA3D_SHADERTYPE_DS - SVGA3D_SHADERTYPE_MIN].shaderId;
     5288        SVGA3dShaderId const shaderIdVS = pDXContext->svgaDXContext.shaderState[SVGA3D_SHADERTYPE_VS - SVGA3D_SHADERTYPE_MIN].shaderId;
     5289
     5290        if (shaderIdPS != SVGA3D_INVALID_ID)
     5291        {
     5292            DXSHADER const *pDXShaderPS = &pDXContext->pBackendDXContext->paShader[shaderIdPS];
     5293            pDXShader->shaderInfo.cOutputSignature = pDXShaderPS->shaderInfo.cInputSignature;
     5294            memcpy(pDXShader->shaderInfo.aOutputSignature,
     5295                   pDXShaderPS->shaderInfo.aInputSignature,
     5296                   pDXShaderPS->shaderInfo.cInputSignature * sizeof(SVGA3dDXSignatureEntry));
     5297        }
     5298
     5299        /* Input signature of a GS shader is the output of DS or VS. */
     5300        if (shaderIdDS != SVGA3D_INVALID_ID)
     5301        {
     5302            DXSHADER *pDXShaderDS = &pDXContext->pBackendDXContext->paShader[shaderIdDS];
     5303            pDXShader->shaderInfo.cInputSignature = pDXShaderDS->shaderInfo.cOutputSignature;
     5304            memcpy(pDXShader->shaderInfo.aInputSignature,
     5305                   pDXShaderDS->shaderInfo.aOutputSignature,
     5306                   pDXShaderDS->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
     5307        }
     5308        else if (shaderIdVS != SVGA3D_INVALID_ID)
     5309        {
     5310            DXSHADER *pDXShaderVS = &pDXContext->pBackendDXContext->paShader[shaderIdVS];
     5311            pDXShader->shaderInfo.cInputSignature = pDXShaderVS->shaderInfo.cOutputSignature;
     5312            memcpy(pDXShader->shaderInfo.aInputSignature,
     5313                   pDXShaderVS->shaderInfo.aOutputSignature,
     5314                   pDXShaderVS->shaderInfo.cOutputSignature * sizeof(SVGA3dDXSignatureEntry));
     5315        }
     5316    }
     5317    Assert(   (pDXShader->enmShaderType == SVGA3D_SHADERTYPE_VS || pDXShader->enmShaderType == SVGA3D_SHADERTYPE_PS)
     5318           || (pDXShader->shaderInfo.cInputSignature && pDXShader->shaderInfo.cOutputSignature));
     5319}
     5320
     5321
    52815322static void dxCreateInputLayout(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dElementLayoutId elementLayoutId, DXSHADER *pDXShader)
    52825323{
     
    56245665                    AssertRC(rc); /* Ignore rc because the shader will most likely work anyway. */
    56255666                }
     5667
     5668                if (pDXShader->shaderInfo.fGuestSignatures)
     5669                    vboxDXMatchGuestShaderSignatures(pDXContext, pDXShader);
    56265670
    56275671                rc = DXShaderCreateDXBC(&pDXShader->shaderInfo, &pDXShader->pvDXBC, &pDXShader->cbDXBC);
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