VirtualBox

Changeset 94106 in vbox


Ignore:
Timestamp:
Mar 7, 2022 10:45:58 AM (3 years ago)
Author:
vboxsync
Message:

Devices/Graphics: more for single device mode: bugref:9830

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

Legend:

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

    r94101 r94106  
    4040
    4141
     42/*
     43 *
     44 * 3D backend entry points. These functions are used from vmsvga3dDXSwitchContext and command handlers.
     45 *
     46 */
     47
     48static int dxSetShader(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext,
     49                       SVGA3dShaderType shaderType, SVGA3dShaderId shaderId)
     50{
     51    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     52
     53    PVMSVGA3DSHADER pShader;
     54    if (shaderId != SVGA_ID_INVALID)
     55    {
     56        SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
     57        ASSERT_GUEST_RETURN(pEntry->type == shaderType, VERR_INVALID_PARAMETER);
     58        RT_UNTRUSTED_VALIDATED_FENCE();
     59
     60        pShader = &pDXContext->paShader[shaderId];
     61    }
     62    else
     63        pShader = NULL;
     64
     65    return pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContext, shaderType, pShader);
     66}
     67
     68
     69/*
     70 *
     71 * Command handlers.
     72 *
     73 */
     74
    4275int vmsvga3dDXUnbindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext)
    4376{
     
    5992
    6093
    61 int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cidNew)
     94int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cid)
    6295{
    6396    int rc;
     
    67100    AssertReturn(p3dState, VERR_INVALID_STATE);
    68101
    69     PVMSVGA3DDXCONTEXT pDXContextNew;
    70     rc = vmsvga3dDXContextFromCid(p3dState, cidNew, &pDXContextNew);
     102    PVMSVGA3DDXCONTEXT pDXContext;
     103    rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
    71104    AssertRCReturn(rc, rc);
    72105
    73106    /* Notify the host backend that context is about to be switched. */
    74     rc = pSvgaR3State->pFuncsDX->pfnDXSwitchContext(pThisCC, pDXContextNew);
     107    rc = pSvgaR3State->pFuncsDX->pfnDXSwitchContext(pThisCC, pDXContext);
    75108    if (rc == VINF_NOT_IMPLEMENTED || RT_FAILURE(rc))
    76109        return rc;
     
    81114    #define DX_STATE_SAMPLERS          0x00000004
    82115    #define DX_STATE_INPUTLAYOUT       0x00000008
     116    #define DX_STATE_TOPOLOGY          0x00000010
     117    #define DX_STATE_VERTEXBUFFER      0x00000020
     118    #define DX_STATE_INDEXBUFFER       0x00000040
     119    #define DX_STATE_BLENDSTATE        0x00000080
     120    #define DX_STATE_DEPTHSTENCILSTATE 0x00000100
     121    #define DX_STATE_SOTARGETS         0x00000200
     122    #define DX_STATE_VIEWPORTS         0x00000400
     123    #define DX_STATE_SCISSORRECTS      0x00000800
    83124    uint32_t u32TrackedState = 0
    84125        | DX_STATE_VS
     
    86127        | DX_STATE_SAMPLERS
    87128        | DX_STATE_INPUTLAYOUT
     129        | DX_STATE_TOPOLOGY
     130        | DX_STATE_VERTEXBUFFER
     131        | DX_STATE_INDEXBUFFER
     132        | DX_STATE_BLENDSTATE
     133        | DX_STATE_DEPTHSTENCILSTATE
     134        | DX_STATE_SOTARGETS
     135        | DX_STATE_VIEWPORTS
     136        | DX_STATE_SCISSORRECTS
    88137        ;
    89138
     
    95144
    96145        uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
    97         SVGA3dShaderId shaderId = pDXContextNew->svgaDXContext.shaderState[idxShaderState].shaderId;
    98 
    99         /** @todo Same code as in DXSetShader, move to a static function with type and id as parms. */
    100         PVMSVGA3DSHADER pShader;
    101         if (shaderId != SVGA_ID_INVALID)
    102         {
    103             SVGACOTableDXShaderEntry *pEntry = &pDXContextNew->cot.paShader[shaderId];
    104             ASSERT_GUEST_RETURN(pEntry->type == shaderType, VERR_INVALID_PARAMETER);
    105             RT_UNTRUSTED_VALIDATED_FENCE();
    106 
    107             pShader = &pDXContextNew->paShader[shaderId];
    108         }
    109         else
    110             pShader = NULL;
    111 
    112         rc = pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContextNew, shaderType, pShader);
     146        SVGA3dShaderId shaderId = pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId;
     147
     148        rc = dxSetShader(pThisCC, pDXContext, shaderType, shaderId);
    113149        AssertRC(rc);
    114150    }
     
    121157
    122158        uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
    123         SVGA3dShaderId shaderId = pDXContextNew->svgaDXContext.shaderState[idxShaderState].shaderId;
    124 
    125         /** @todo Same code as in DXSetShader, move to a static function with type and id as parms. */
    126         PVMSVGA3DSHADER pShader;
    127         if (shaderId != SVGA_ID_INVALID)
    128         {
    129             SVGACOTableDXShaderEntry *pEntry = &pDXContextNew->cot.paShader[shaderId];
    130             ASSERT_GUEST_RETURN(pEntry->type == shaderType, VERR_INVALID_PARAMETER);
    131             RT_UNTRUSTED_VALIDATED_FENCE();
    132 
    133             pShader = &pDXContextNew->paShader[shaderId];
    134         }
    135         else
    136             pShader = NULL;
    137 
    138         rc = pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContextNew, shaderType, pShader);
     159        SVGA3dShaderId shaderId = pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId;
     160
     161        rc = dxSetShader(pThisCC, pDXContext, shaderType, shaderId);
    139162        AssertRC(rc);
    140163    }
     
    144167        u32TrackedState &= ~DX_STATE_SAMPLERS;
    145168
    146         for (int i = SVGA3D_SHADERTYPE_MIN; i < SVGA3D_SHADERTYPE_DX10_MAX; ++i) /** SVGA3D_SHADERTYPE_MAX */
     169        for (int i = SVGA3D_SHADERTYPE_MIN; i < SVGA3D_SHADERTYPE_DX10_MAX; ++i) /** @todo SVGA3D_SHADERTYPE_MAX */
    147170        {
    148171            SVGA3dShaderType const shaderType = (SVGA3dShaderType)i;
     
    151174            uint32_t startSampler = 0;
    152175            uint32_t cSamplerId = SVGA3D_DX_MAX_SAMPLERS;
    153             SVGA3dSamplerId *paSamplerId = &pDXContextNew->svgaDXContext.shaderState[idxShaderState].samplers[0];
    154 
    155             rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContextNew, startSampler, shaderType, cSamplerId, paSamplerId);
     176            SVGA3dSamplerId *paSamplerId = &pDXContext->svgaDXContext.shaderState[idxShaderState].samplers[0];
     177
     178            rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContext, startSampler, shaderType, cSamplerId, paSamplerId);
    156179            AssertRC(rc);
    157180        }
     
    163186        u32TrackedState &= ~DX_STATE_INPUTLAYOUT;
    164187
    165         SVGA3dElementLayoutId const elementLayoutId = pDXContextNew->svgaDXContext.inputAssembly.layoutId;
    166 
    167         rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContextNew, elementLayoutId);
     188        SVGA3dElementLayoutId const elementLayoutId = pDXContext->svgaDXContext.inputAssembly.layoutId;
     189
     190        rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContext, elementLayoutId);
     191        AssertRC(rc);
     192    }
     193
     194
     195    if (u32TrackedState & DX_STATE_TOPOLOGY)
     196    {
     197        u32TrackedState &= ~DX_STATE_TOPOLOGY;
     198
     199        SVGA3dPrimitiveType const topology = (SVGA3dPrimitiveType)pDXContext->svgaDXContext.inputAssembly.topology;
     200
     201        if (topology != SVGA3D_PRIMITIVE_INVALID)
     202            rc = pSvgaR3State->pFuncsDX->pfnDXSetTopology(pThisCC, pDXContext, topology);
     203        AssertRC(rc);
     204    }
     205
     206
     207    if (u32TrackedState & DX_STATE_VERTEXBUFFER)
     208    {
     209        u32TrackedState &= ~DX_STATE_VERTEXBUFFER;
     210
     211        /** @todo Track which vertex buffers were modified and update only the corresponding slots.
     212         * 32 bits mask is enough.
     213         */
     214        uint32_t startBuffer = 0;
     215        uint32_t cVertexBuffer = SVGA3D_DX_MAX_VERTEXBUFFERS;
     216        SVGA3dVertexBuffer aVertexBuffer[SVGA3D_DX_MAX_VERTEXBUFFERS];
     217        for (uint32_t i = 0; i < SVGA3D_DX_MAX_VERTEXBUFFERS; ++i)
     218        {
     219            aVertexBuffer[i].sid = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].bufferId;
     220            aVertexBuffer[i].stride = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].stride;
     221            aVertexBuffer[i].offset = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].offset;
     222        }
     223
     224        rc = pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers(pThisCC, pDXContext, startBuffer, cVertexBuffer, aVertexBuffer);
     225        AssertRC(rc);
     226    }
     227
     228
     229    if (u32TrackedState & DX_STATE_INDEXBUFFER)
     230    {
     231        u32TrackedState &= ~DX_STATE_INDEXBUFFER;
     232
     233        SVGA3dSurfaceId const sid = pDXContext->svgaDXContext.inputAssembly.indexBufferSid;
     234        SVGA3dSurfaceFormat const format = (SVGA3dSurfaceFormat)pDXContext->svgaDXContext.inputAssembly.indexBufferFormat;
     235        uint32_t const offset = pDXContext->svgaDXContext.inputAssembly.indexBufferOffset;
     236
     237        rc = pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer(pThisCC, pDXContext, sid, format, offset);
     238        AssertRC(rc);
     239    }
     240
     241
     242    if (u32TrackedState & DX_STATE_BLENDSTATE)
     243    {
     244        u32TrackedState &= ~DX_STATE_BLENDSTATE;
     245
     246        SVGA3dBlendStateId const blendId = pDXContext->svgaDXContext.renderState.blendStateId;
     247        /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
     248        float const *paBlendFactor = (float *)&pDXContext->svgaDXContext.renderState.blendFactor[0];
     249        uint32_t const sampleMask = pDXContext->svgaDXContext.renderState.sampleMask;
     250
     251        rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, paBlendFactor, sampleMask);
     252        AssertRC(rc);
     253    }
     254
     255
     256    if (u32TrackedState & DX_STATE_DEPTHSTENCILSTATE)
     257    {
     258        u32TrackedState &= ~DX_STATE_DEPTHSTENCILSTATE;
     259
     260        SVGA3dDepthStencilStateId const depthStencilId = pDXContext->svgaDXContext.renderState.depthStencilStateId;
     261        uint32_t const stencilRef = pDXContext->svgaDXContext.renderState.stencilRef;
     262
     263        rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, stencilRef);
     264        AssertRC(rc);
     265    }
     266
     267
     268    if (u32TrackedState & DX_STATE_SOTARGETS)
     269    {
     270        u32TrackedState &= ~DX_STATE_SOTARGETS;
     271
     272        uint32_t cSoTarget = SVGA3D_DX_MAX_SOTARGETS;
     273        SVGA3dSoTarget aSoTarget[SVGA3D_DX_MAX_SOTARGETS];
     274        for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
     275        {
     276            aSoTarget[i].sid = pDXContext->svgaDXContext.streamOut.targets[i];
     277            /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere by the host? */
     278            aSoTarget[i].offset = 0;
     279            aSoTarget[i].sizeInBytes = 0;
     280        }
     281
     282        rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, aSoTarget);
     283        AssertRC(rc);
     284    }
     285
     286
     287    if (u32TrackedState & DX_STATE_VIEWPORTS)
     288    {
     289        u32TrackedState &= ~DX_STATE_VIEWPORTS;
     290
     291        uint32_t const cViewport = pDXContext->svgaDXContext.numViewports;
     292        SVGA3dViewport const *paViewport = &pDXContext->svgaDXContext.viewports[0];
     293
     294        rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
     295        AssertRC(rc);
     296    }
     297
     298
     299    if (u32TrackedState & DX_STATE_SCISSORRECTS)
     300    {
     301        u32TrackedState &= ~DX_STATE_SCISSORRECTS;
     302
     303        uint32_t const cRect = pDXContext->svgaDXContext.numScissorRects;
     304        SVGASignedRect const *paRect = &pDXContext->svgaDXContext.scissorRects[0];
     305
     306        rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
    168307        AssertRC(rc);
    169308    }
     
    217356    pDXContext = p3dState->papDXContexts[cid];
    218357    memset(pDXContext, 0, sizeof(*pDXContext));
     358
    219359    /* 0xFFFFFFFF (SVGA_ID_INVALID) is a better initial value than 0 for most of svgaDXContext fields. */
    220360    memset(&pDXContext->svgaDXContext, 0xFF, sizeof(pDXContext->svgaDXContext));
     361    pDXContext->svgaDXContext.inputAssembly.topology = SVGA3D_PRIMITIVE_INVALID;
     362    pDXContext->svgaDXContext.numViewports = 0;
     363    pDXContext->svgaDXContext.numScissorRects = 0;
    221364    pDXContext->cid = cid;
    222365
     
    385528    pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId = pCmd->shaderId;
    386529
    387     PVMSVGA3DSHADER pShader;
    388     if (pCmd->shaderId != SVGA_ID_INVALID)
    389     {
    390         SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[pCmd->shaderId];
    391         ASSERT_GUEST_RETURN(pEntry->type == pCmd->type, VERR_INVALID_PARAMETER);
    392         RT_UNTRUSTED_VALIDATED_FENCE();
    393 
    394         pShader = &pDXContext->paShader[pCmd->shaderId];
    395     }
    396     else
    397         pShader = NULL;
    398 
    399     rc = pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContext, pCmd->type, pShader);
     530    rc = dxSetShader(pThisCC, pDXContext, pCmd->type, pCmd->shaderId);
    400531    return rc;
    401532}
     
    631762    RT_UNTRUSTED_VALIDATED_FENCE();
    632763
     764    for (uint32_t i = 0; i < cVertexBuffer; ++i)
     765    {
     766        uint32_t const idxVertexBuffer = startBuffer + i;
     767
     768        pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].bufferId = paVertexBuffer[i].sid;
     769        pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].stride = paVertexBuffer[i].stride;
     770        pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].offset = paVertexBuffer[i].offset;
     771    }
     772
    633773    rc = pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers(pThisCC, pDXContext, startBuffer, cVertexBuffer, paVertexBuffer);
    634774    return rc;
     
    725865    RT_UNTRUSTED_VALIDATED_FENCE();
    726866
     867    pDXContext->svgaDXContext.renderState.blendStateId = blendId;
     868    /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
     869    memcpy(pDXContext->svgaDXContext.renderState.blendFactor, pCmd->blendFactor, sizeof(pDXContext->svgaDXContext.renderState.blendFactor));
     870    pDXContext->svgaDXContext.renderState.sampleMask = pCmd->sampleMask;
     871
    727872    rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, pCmd->blendFactor, pCmd->sampleMask);
    728873    return rc;
     
    748893    RT_UNTRUSTED_VALIDATED_FENCE();
    749894
     895    pDXContext->svgaDXContext.renderState.depthStencilStateId = depthStencilId;
     896    pDXContext->svgaDXContext.renderState.stencilRef = pCmd->stencilRef;
     897
    750898    rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, pCmd->stencilRef);
    751899    return rc;
     
    9221070
    9231071    ASSERT_GUEST_RETURN(cSoTarget < SVGA3D_DX_MAX_SOTARGETS, VERR_INVALID_PARAMETER);
     1072    RT_UNTRUSTED_VALIDATED_FENCE();
     1073
     1074    /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere? */
     1075    for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
     1076        pDXContext->svgaDXContext.streamOut.targets[i] = i < cSoTarget ? paSoTarget[i].sid : SVGA3D_INVALID_ID;
    9241077
    9251078    rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, paSoTarget);
     
    9401093    AssertRCReturn(rc, rc);
    9411094
     1095    ASSERT_GUEST_RETURN(cViewport < SVGA3D_DX_MAX_VIEWPORTS, VERR_INVALID_PARAMETER);
     1096    RT_UNTRUSTED_VALIDATED_FENCE();
     1097
     1098    pDXContext->svgaDXContext.numViewports = (uint8_t)cViewport;
     1099    for (uint32_t i = 0; i < cViewport; ++i)
     1100        pDXContext->svgaDXContext.viewports[i] = paViewport[i];
     1101
    9421102    rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
    9431103    return rc;
     
    9561116    rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
    9571117    AssertRCReturn(rc, rc);
     1118
     1119    ASSERT_GUEST_RETURN(cRect < SVGA3D_DX_MAX_SCISSORRECTS, VERR_INVALID_PARAMETER);
     1120    RT_UNTRUSTED_VALIDATED_FENCE();
     1121
     1122    pDXContext->svgaDXContext.numScissorRects = (uint8_t)cRect;
     1123    for (uint32_t i = 0; i < cRect; ++i)
     1124        pDXContext->svgaDXContext.scissorRects[i] = paRect[i];
    9581125
    9591126    rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r94101 r94106  
    51375137
    51385138
    5139 static DECLCALLBACK(int) vmsvga3dBackDXSwitchContext(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContextNew)
     5139static DECLCALLBACK(int) vmsvga3dBackDXSwitchContext(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    51405140{
    51415141    PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
     
    51445144
    51455145    /* The new context state will be applied by the generic DX code. */
    5146     RT_NOREF(pDXContextNew);
     5146    RT_NOREF(pDXContext);
    51475147    return VINF_SUCCESS;
    51485148}
     
    53805380    AssertReturnVoid(pDevice->pDevice);
    53815381
    5382     /** @todo Make sure that the render target views exist. Similar to SRVs. */
     5382    /* Make sure that the render target views exist. Similar to SRVs. */
    53835383    if (pDXContext->svgaDXContext.renderState.depthStencilViewId != SVGA3D_INVALID_ID)
    53845384    {
     
    58745874            paOffset[idxVertexBuffer] = 0;
    58755875        }
    5876 
    5877         pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].bufferId = paVertexBuffer[i].sid;
    5878         pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].stride = paVertexBuffer[i].stride;
    5879         pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].offset = paVertexBuffer[i].offset;
    58805876    }
    58815877
     
    60666062    AssertReturn(pDevice->pDevice, VERR_INVALID_STATE);
    60676063
    6068     ID3D11BlendState *pBlendState = pDXContext->pBackendDXContext->papBlendState[blendId];
    6069     pDevice->pImmediateContext->OMSetBlendState(pBlendState, blendFactor, sampleMask);
    6070 
    6071     pDXContext->svgaDXContext.renderState.blendStateId = blendId;
    6072     pDXContext->svgaDXContext.renderState.blendFactor[0] = blendFactor[0];
    6073     pDXContext->svgaDXContext.renderState.blendFactor[1] = blendFactor[1];
    6074     pDXContext->svgaDXContext.renderState.blendFactor[2] = blendFactor[2];
    6075     pDXContext->svgaDXContext.renderState.blendFactor[3] = blendFactor[3];
    6076     pDXContext->svgaDXContext.renderState.sampleMask = sampleMask;
     6064    if (blendId != SVGA3D_INVALID_ID)
     6065    {
     6066        ID3D11BlendState *pBlendState = pDXContext->pBackendDXContext->papBlendState[blendId];
     6067        pDevice->pImmediateContext->OMSetBlendState(pBlendState, blendFactor, sampleMask);
     6068    }
     6069    else
     6070        pDevice->pImmediateContext->OMSetBlendState(NULL, NULL, 0);
    60776071
    60786072    return VINF_SUCCESS;
     
    60886082    AssertReturn(pDevice->pDevice, VERR_INVALID_STATE);
    60896083
    6090     ID3D11DepthStencilState *pDepthStencilState = pDXContext->pBackendDXContext->papDepthStencilState[depthStencilId];
    6091     pDevice->pImmediateContext->OMSetDepthStencilState(pDepthStencilState, stencilRef);
    6092 
    6093     pDXContext->svgaDXContext.renderState.depthStencilStateId = depthStencilId;
    6094     pDXContext->svgaDXContext.renderState.stencilRef = stencilRef;
     6084    if (depthStencilId != SVGA3D_INVALID_ID)
     6085    {
     6086        ID3D11DepthStencilState *pDepthStencilState = pDXContext->pBackendDXContext->papDepthStencilState[depthStencilId];
     6087        pDevice->pImmediateContext->OMSetDepthStencilState(pDepthStencilState, stencilRef);
     6088    }
     6089    else
     6090        pDevice->pImmediateContext->OMSetDepthStencilState(NULL, 0);
    60956091
    60966092    return VINF_SUCCESS;
     
    61066102    RT_NOREF(pBackend);
    61076103
    6108     pDevice->pImmediateContext->RSSetState(pDXContext->pBackendDXContext->papRasterizerState[rasterizerId]);
     6104    if (rasterizerId != SVGA3D_INVALID_ID)
     6105    {
     6106        ID3D11RasterizerState *pRasterizerState = pDXContext->pBackendDXContext->papRasterizerState[rasterizerId];
     6107        pDevice->pImmediateContext->RSSetState(pRasterizerState);
     6108    }
     6109    else
     6110        pDevice->pImmediateContext->RSSetState(NULL);
     6111
    61096112    return VINF_SUCCESS;
    61106113}
     
    62286231            paResource[i] = pSurface->pBackendSurface->u.pBuffer;
    62296232            paOffset[i] = paSoTarget[i].offset;
    6230 
    6231             /** @todo This should be in the caller. */
    6232             pDXContext->svgaDXContext.streamOut.targets[i] = paSoTarget[i].sid;
    62336233        }
    62346234        else
     
    62366236            paResource[i] = NULL;
    62376237            paOffset[i] = 0;
    6238 
    6239             /** @todo This should be in the caller. */
    6240             pDXContext->svgaDXContext.streamOut.targets[i] = SVGA_ID_INVALID;
    62416238        }
    62426239    }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r94101 r94106  
    396396    DECLCALLBACKMEMBER(int, pfnDXDestroyContext,            (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    397397    DECLCALLBACKMEMBER(int, pfnDXBindContext,               (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    398     DECLCALLBACKMEMBER(int, pfnDXSwitchContext,             (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContextNew));
     398    DECLCALLBACKMEMBER(int, pfnDXSwitchContext,             (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    399399    DECLCALLBACKMEMBER(int, pfnDXReadbackContext,           (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    400400    DECLCALLBACKMEMBER(int, pfnDXInvalidateContext,         (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
     
    521521/* Helpers. */
    522522int vmsvga3dDXUnbindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext);
    523 int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cidNew);
     523int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cid);
    524524
    525525/* Command handlers. */
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