VirtualBox

Changeset 94449 in vbox


Ignore:
Timestamp:
Apr 2, 2022 2:09:02 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
150779
Message:

Devices/Graphics: implemented queries; fixed generation of GS attributes: bugref:9830

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

Legend:

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

    r94377 r94449  
    903903
    904904
     905int vmsvgaR3MobWrite(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob,
     906                     uint32_t off, void const *pvData, uint32_t cbData)
     907{
     908    return vmsvgaR3GboWrite(pSvgaR3State, &pMob->Gbo, off, pvData, cbData);
     909}
     910
     911
     912int vmsvgaR3MobRead(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob,
     913                    uint32_t off, void *pvData, uint32_t cbData)
     914{
     915    return vmsvgaR3GboWrite(pSvgaR3State, &pMob->Gbo, off, pvData, cbData);
     916}
     917
     918
    905919/** Create a host ring-3 pointer to the MOB data.
    906920 * Current approach is to allocate a host memory buffer and copy the guest MOB data if necessary.
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h

    r94377 r94449  
    629629
    630630PVMSVGAMOB vmsvgaR3MobGet(PVMSVGAR3STATE pSvgaR3State, SVGAMobId RT_UNTRUSTED_GUEST mobid);
     631int vmsvgaR3MobWrite(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t off, void const *pvData, uint32_t cbData);
     632int vmsvgaR3MobRead(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t off, void *pvData, uint32_t cbData);
    631633int vmsvgaR3MobBackingStoreCreate(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t cbValid);
    632634void vmsvgaR3MobBackingStoreDelete(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.cpp

    r94264 r94449  
    23492349
    23502350static char const *dxbcGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister, uint32_t u32BlobType,
    2351                                              uint32_t cSignature, SVGA3dDXSignatureEntry const *paSignature)
     2351                                             uint32_t cSignature, SVGA3dDXSignatureEntry const *paSignature,
     2352                                             SVGA3dDXSignatureSemanticName *pSemanticName)
    23522353{
    23532354    for (uint32_t i = 0; i < cSignature; ++i)
     
    23582359            AssertReturn(p->semanticName < SVGADX_SIGNATURE_SEMANTIC_NAME_MAX, NULL);
    23592360            VGPUSemanticInfo const *pSemanticInfo = dxbcSemanticInfo(pInfo, p->semanticName, u32BlobType);
     2361            *pSemanticName = p->semanticName;
    23602362            return pSemanticInfo->pszName;
    23612363        }
     
    23642366}
    23652367
    2366 char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister)
    2367 {
    2368     return dxbcGetOutputSemanticName(pInfo, idxRegister, DXBC_BLOB_TYPE_OSGN, pInfo->cOutputSignature, &pInfo->aOutputSignature[0]);
     2368char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister, SVGA3dDXSignatureSemanticName *pSemanticName)
     2369{
     2370    return dxbcGetOutputSemanticName(pInfo, idxRegister, DXBC_BLOB_TYPE_OSGN, pInfo->cOutputSignature, &pInfo->aOutputSignature[0], pSemanticName);
    23692371}
    23702372
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.h

    r94232 r94449  
    5454int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, VGPU10_RESOURCE_DIMENSION *paResourceType, uint32_t cResourceType);
    5555int DXShaderCreateDXBC(DXShaderInfo const *pInfo, void **ppvDXBC, uint32_t *pcbDXBC);
    56 char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister);
     56char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister, SVGA3dDXSignatureSemanticName *pSemanticName);
    5757
    5858#endif /* !VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_dx_shader_h */
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp

    r94265 r94449  
    4040
    4141
    42 static int dxReadbackQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry);
     42/*
     43 * Helpers.
     44 */
     45
     46static int dxMobWrite(PVMSVGAR3STATE pSvgaR3State, SVGAMobId mobid, uint32_t off, void const *pvData, uint32_t cbData)
     47{
     48    PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, mobid);
     49    ASSERT_GUEST_RETURN(pMob, VERR_INVALID_STATE);
     50
     51    return vmsvgaR3MobWrite(pSvgaR3State, pMob, off, pvData, cbData);
     52}
    4353
    4454
     
    10241034    int rc;
    10251035    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    1026     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindQuery, VERR_INVALID_STATE);
     1036    AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
    10271037    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    10281038    AssertReturn(p3dState, VERR_INVALID_STATE);
     
    10411051    pEntry->mobid = vmsvgaR3MobId(pMob);
    10421052
    1043     rc = pSvgaR3State->pFuncsDX->pfnDXBindQuery(pThisCC, pDXContext, queryId);
    10441053    return rc;
    10451054}
     
    10951104        rc = pSvgaR3State->pFuncsDX->pfnDXBeginQuery(pThisCC, pDXContext, queryId);
    10961105        if (RT_SUCCESS(rc))
     1106        {
    10971107            pEntry->state = SVGADX_QDSTATE_ACTIVE;
     1108
     1109            /* Update the guest status of the query. */
     1110            uint32_t const u32 = SVGA3D_QUERYSTATE_PENDING;
     1111            dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32, sizeof(u32));
     1112        }
     1113        else
     1114        {
     1115            uint32_t const u32 = SVGA3D_QUERYSTATE_FAILED;
     1116            dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32, sizeof(u32));
     1117        }
    10981118    }
    10991119    return rc;
     
    11011121
    11021122
    1103 int vmsvga3dDXEndQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXEndQuery const *pCmd)
    1104 {
    1105     int rc;
    1106     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    1107     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXEndQuery, VERR_INVALID_STATE);
    1108     PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    1109     AssertReturn(p3dState, VERR_INVALID_STATE);
    1110 
    1111     PVMSVGA3DDXCONTEXT pDXContext;
    1112     rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
    1113     AssertRCReturn(rc, rc);
    1114 
    1115     SVGA3dQueryId const queryId = pCmd->queryId;
    1116 
    1117     ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
    1118     ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
    1119     RT_UNTRUSTED_VALIDATED_FENCE();
    1120 
    1121     SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
     1123static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry)
     1124{
     1125    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     1126
     1127    int rc;
    11221128    Assert(pEntry->state == SVGADX_QDSTATE_ACTIVE);
    11231129    if (pEntry->state == SVGADX_QDSTATE_ACTIVE)
    11241130    {
    1125         rc = pSvgaR3State->pFuncsDX->pfnDXEndQuery(pThisCC, pDXContext, queryId);
     1131        pEntry->state = SVGADX_QDSTATE_PENDING;
     1132
     1133        uint32_t u32QueryState;
     1134        SVGADXQueryResultUnion queryResult;
     1135        uint32_t cbQuery = 0; /* Actual size of query data returned by backend. */
     1136        rc = pSvgaR3State->pFuncsDX->pfnDXEndQuery(pThisCC, pDXContext, queryId, &queryResult, &cbQuery);
    11261137        if (RT_SUCCESS(rc))
    1127             pEntry->state = SVGADX_QDSTATE_PENDING;
     1138        {
     1139            /* Write the result after SVGA3dQueryState. */
     1140            dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset + sizeof(uint32_t), &queryResult, cbQuery);
     1141
     1142            u32QueryState = SVGA3D_QUERYSTATE_SUCCEEDED;
     1143        }
     1144        else
     1145            u32QueryState = SVGA3D_QUERYSTATE_FAILED;
     1146
     1147        dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32QueryState, sizeof(u32QueryState));
     1148
     1149        if (RT_SUCCESS(rc))
     1150            pEntry->state = SVGADX_QDSTATE_FINISHED;
    11281151    }
    1129 
    1130     return rc;
    1131 }
    1132 
    1133 
    1134 int vmsvga3dDXReadbackQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackQuery const *pCmd)
    1135 {
    1136     int rc;
    1137     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    1138     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackQuery, VERR_INVALID_STATE);
     1152    else
     1153        rc = VERR_INVALID_STATE;
     1154
     1155    return rc;
     1156}
     1157
     1158
     1159int vmsvga3dDXEndQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXEndQuery const *pCmd)
     1160{
     1161    int rc;
     1162    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     1163    AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXEndQuery, VERR_INVALID_STATE);
    11391164    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    11401165    AssertReturn(p3dState, VERR_INVALID_STATE);
     
    11511176
    11521177    SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
    1153     Assert(pEntry->state == SVGADX_QDSTATE_PENDING);
    1154 
    1155     rc = dxReadbackQuery(pThisCC, pDXContext, queryId, pEntry);
     1178    rc = dxEndQuery(pThisCC, pDXContext, queryId, pEntry);
     1179    return rc;
     1180}
     1181
     1182
     1183int vmsvga3dDXReadbackQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackQuery const *pCmd)
     1184{
     1185    int rc;
     1186    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     1187    AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
     1188    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
     1189    AssertReturn(p3dState, VERR_INVALID_STATE);
     1190
     1191    PVMSVGA3DDXCONTEXT pDXContext;
     1192    rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
     1193    AssertRCReturn(rc, rc);
     1194
     1195    SVGA3dQueryId const queryId = pCmd->queryId;
     1196
     1197    ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
     1198    ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
     1199    RT_UNTRUSTED_VALIDATED_FENCE();
     1200
     1201    /* The device does not cache queries. So this is a NOP. */
     1202
    11561203    return rc;
    11571204}
     
    23562403    int rc;
    23572404    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2358     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindQuery, VERR_INVALID_STATE);
     2405    AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
    23592406    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    23602407    AssertReturn(p3dState, VERR_INVALID_STATE);
     
    23702417        SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[i];
    23712418        if (pEntry->type != SVGA3D_QUERYTYPE_INVALID)
    2372         {
    23732419            pEntry->mobid = pCmd->mobid;
    2374             pSvgaR3State->pFuncsDX->pfnDXBindQuery(pThisCC, pDXContext, i);
    2375         }
    23762420    }
    23772421
     
    23802424
    23812425
    2382 static int dxReadbackQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry)
    2383 {
    2384     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2385 
    2386     PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, pEntry->mobid);
    2387     ASSERT_GUEST_RETURN(pMob, VERR_INVALID_STATE); /* No MOB bound. */
    2388 
    2389     uint32_t const cbMob = vmsvgaR3MobSize(pMob);
    2390     ASSERT_GUEST_RETURN(cbMob > pEntry->offset, VERR_INVALID_PARAMETER);
    2391     uint32_t const cbAvail = cbMob - pEntry->offset;
    2392 
    2393     /* Create a memory pointer, which is accessible by host. */
    2394     int rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, cbMob);
    2395     AssertRCReturn(rc, rc);
    2396 
    2397     void *pvQuery = vmsvgaR3MobBackingStorePtr(pMob, pEntry->offset);
    2398     /** @todo Write the query data only. */
    2399     uint32_t cbQuery = 0; /* Actual size of query data returned by backend. */
    2400     rc = pSvgaR3State->pFuncsDX->pfnDXReadbackQuery(pThisCC, pDXContext, queryId, pvQuery, cbAvail, &cbQuery);
    2401     if (RT_SUCCESS(rc))
    2402         rc = vmsvgaR3MobBackingStoreWriteToGuest(pSvgaR3State, pMob);
    2403 
    2404     vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
    2405 
    2406     pEntry->state = SVGADX_QDSTATE_FINISHED;
    2407     return rc;
    2408 }
    2409 
    2410 
    24112426int vmsvga3dDXReadbackAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackAllQuery const *pCmd)
    24122427{
    24132428    int rc;
    24142429    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    2415     AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackQuery, VERR_INVALID_STATE);
     2430    AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
    24162431    PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
    24172432    AssertReturn(p3dState, VERR_INVALID_STATE);
     
    24232438    AssertRCReturn(rc, rc);
    24242439
    2425     for (uint32_t i = 0; i < pDXContext->cot.cQuery; ++i)
    2426     {
    2427         SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[i];
    2428         if (pEntry->state == SVGADX_QDSTATE_PENDING)
    2429         {
    2430             dxReadbackQuery(pThisCC, pDXContext, i, pEntry);
    2431         }
    2432     }
     2440    /* "Read back cached states from the device if they exist."
     2441     * The device does not cache queries. So this is a NOP.
     2442     */
     2443    RT_NOREF(pDXContext);
    24332444
    24342445    return rc;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r94377 r94449  
    17051705                    D3D11_SO_DECLARATION_ENTRY *p = &pDXStreamOutput->aDeclarationEntry[i];
    17061706                    SVGA3dStreamOutputDeclarationEntry const *decl = &pEntry->decl[i];
    1707                     p->SemanticName = DXShaderGetOutputSemanticName(&pDXShader->shaderInfo, decl->registerIndex);
    1708                     p->SemanticIndex = decl->registerIndex;
     1707                    SVGA3dDXSignatureSemanticName enmSemanticName;
     1708                    p->SemanticName = DXShaderGetOutputSemanticName(&pDXShader->shaderInfo, decl->registerIndex, &enmSemanticName);
     1709                    if (enmSemanticName == SVGADX_SIGNATURE_SEMANTIC_NAME_UNDEFINED)
     1710                        p->SemanticIndex = decl->registerIndex;
     1711                    else
     1712                        p->SemanticIndex = 0;
    17091713                }
    17101714
     
    60436047}
    60446048
    6045 static D3D11_QUERY dxQueryType(SVGA3dQueryType type)
    6046 {
    6047     switch (type)
    6048     {
    6049         case SVGA3D_QUERYTYPE_OCCLUSION:               return D3D11_QUERY_OCCLUSION;
    6050         case SVGA3D_QUERYTYPE_TIMESTAMP:               return D3D11_QUERY_TIMESTAMP;
    6051         case SVGA3D_QUERYTYPE_TIMESTAMPDISJOINT:       return D3D11_QUERY_TIMESTAMP_DISJOINT;
    6052         case SVGA3D_QUERYTYPE_PIPELINESTATS:           return D3D11_QUERY_PIPELINE_STATISTICS;
    6053         case SVGA3D_QUERYTYPE_OCCLUSIONPREDICATE:      return D3D11_QUERY_OCCLUSION_PREDICATE;
    6054         case SVGA3D_QUERYTYPE_STREAMOUTPUTSTATS:       return D3D11_QUERY_SO_STATISTICS;
    6055         case SVGA3D_QUERYTYPE_STREAMOVERFLOWPREDICATE: return D3D11_QUERY_SO_OVERFLOW_PREDICATE;
    6056         case SVGA3D_QUERYTYPE_OCCLUSION64:             return D3D11_QUERY_OCCLUSION;
    6057         case SVGA3D_QUERYTYPE_SOSTATS_STREAM0:         return D3D11_QUERY_SO_STATISTICS_STREAM0;
    6058         case SVGA3D_QUERYTYPE_SOSTATS_STREAM1:         return D3D11_QUERY_SO_STATISTICS_STREAM1;
    6059         case SVGA3D_QUERYTYPE_SOSTATS_STREAM2:         return D3D11_QUERY_SO_STATISTICS_STREAM2;
    6060         case SVGA3D_QUERYTYPE_SOSTATS_STREAM3:         return D3D11_QUERY_SO_STATISTICS_STREAM3;
    6061         case SVGA3D_QUERYTYPE_SOP_STREAM0:             return D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM0;
    6062         case SVGA3D_QUERYTYPE_SOP_STREAM1:             return D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM1;
    6063         case SVGA3D_QUERYTYPE_SOP_STREAM2:             return D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM2;
    6064         case SVGA3D_QUERYTYPE_SOP_STREAM3:             return D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM3;
    6065         default:
    6066             break;
    6067     }
    6068     return D3D11_QUERY_EVENT;
     6049
     6050typedef struct VGPU10QUERYINFO
     6051{
     6052    SVGA3dQueryType svgaQueryType;
     6053    uint32_t        cbDataVMSVGA;
     6054    D3D11_QUERY     dxQueryType;
     6055    uint32_t        cbDataD3D11;
     6056} VGPU10QUERYINFO;
     6057
     6058static VGPU10QUERYINFO const *dxQueryInfo(SVGA3dQueryType type)
     6059{
     6060    static VGPU10QUERYINFO const aQueryInfo[SVGA3D_QUERYTYPE_MAX] =
     6061    {
     6062        { SVGA3D_QUERYTYPE_OCCLUSION,                sizeof(SVGADXOcclusionQueryResult),
     6063          D3D11_QUERY_OCCLUSION,                     sizeof(UINT64) },
     6064        { SVGA3D_QUERYTYPE_TIMESTAMP,                sizeof(SVGADXTimestampQueryResult),
     6065          D3D11_QUERY_TIMESTAMP,                     sizeof(UINT64) },
     6066        { SVGA3D_QUERYTYPE_TIMESTAMPDISJOINT,        sizeof(SVGADXTimestampDisjointQueryResult),
     6067          D3D11_QUERY_TIMESTAMP_DISJOINT,            sizeof(D3D11_QUERY_DATA_TIMESTAMP_DISJOINT) },
     6068        { SVGA3D_QUERYTYPE_PIPELINESTATS,            sizeof(SVGADXPipelineStatisticsQueryResult),
     6069          D3D11_QUERY_PIPELINE_STATISTICS,           sizeof(D3D11_QUERY_DATA_PIPELINE_STATISTICS) },
     6070        { SVGA3D_QUERYTYPE_OCCLUSIONPREDICATE,       sizeof(SVGADXOcclusionPredicateQueryResult),
     6071          D3D11_QUERY_OCCLUSION_PREDICATE,           sizeof(BOOL) },
     6072        { SVGA3D_QUERYTYPE_STREAMOUTPUTSTATS,        sizeof(SVGADXStreamOutStatisticsQueryResult),
     6073          D3D11_QUERY_SO_STATISTICS,                 sizeof(D3D11_QUERY_DATA_SO_STATISTICS) },
     6074        { SVGA3D_QUERYTYPE_STREAMOVERFLOWPREDICATE,  sizeof(SVGADXStreamOutPredicateQueryResult),
     6075          D3D11_QUERY_SO_OVERFLOW_PREDICATE,         sizeof(BOOL) },
     6076        { SVGA3D_QUERYTYPE_OCCLUSION64,              sizeof(SVGADXOcclusion64QueryResult),
     6077          D3D11_QUERY_OCCLUSION,                     sizeof(UINT64) },
     6078        { SVGA3D_QUERYTYPE_SOSTATS_STREAM0,          sizeof(SVGADXStreamOutStatisticsQueryResult),
     6079          D3D11_QUERY_SO_STATISTICS_STREAM0,         sizeof(D3D11_QUERY_DATA_SO_STATISTICS) },
     6080        { SVGA3D_QUERYTYPE_SOSTATS_STREAM1,          sizeof(SVGADXStreamOutStatisticsQueryResult),
     6081          D3D11_QUERY_SO_STATISTICS_STREAM1,         sizeof(D3D11_QUERY_DATA_SO_STATISTICS) },
     6082        { SVGA3D_QUERYTYPE_SOSTATS_STREAM2,          sizeof(SVGADXStreamOutStatisticsQueryResult),
     6083          D3D11_QUERY_SO_STATISTICS_STREAM2,         sizeof(D3D11_QUERY_DATA_SO_STATISTICS) },
     6084        { SVGA3D_QUERYTYPE_SOSTATS_STREAM3,          sizeof(SVGADXStreamOutStatisticsQueryResult),
     6085          D3D11_QUERY_SO_STATISTICS_STREAM3,         sizeof(D3D11_QUERY_DATA_SO_STATISTICS) },
     6086        { SVGA3D_QUERYTYPE_SOP_STREAM0,              sizeof(SVGADXStreamOutPredicateQueryResult),
     6087          D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM0, sizeof(BOOL) },
     6088        { SVGA3D_QUERYTYPE_SOP_STREAM1,              sizeof(SVGADXStreamOutPredicateQueryResult),
     6089          D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM1, sizeof(BOOL) },
     6090        { SVGA3D_QUERYTYPE_SOP_STREAM2,              sizeof(SVGADXStreamOutPredicateQueryResult),
     6091          D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM2, sizeof(BOOL) },
     6092        { SVGA3D_QUERYTYPE_SOP_STREAM3,              sizeof(SVGADXStreamOutPredicateQueryResult),
     6093          D3D11_QUERY_SO_OVERFLOW_PREDICATE_STREAM3, sizeof(BOOL) },
     6094    };
     6095
     6096    ASSERT_GUEST_RETURN(type < RT_ELEMENTS(aQueryInfo), NULL);
     6097    return &aQueryInfo[type];
    60696098}
    60706099
     
    60756104
    60766105    DXQUERY *pDXQuery = &pDXContext->pBackendDXContext->paQuery[queryId];
     6106    VGPU10QUERYINFO const *pQueryInfo = dxQueryInfo((SVGA3dQueryType)pEntry->type);
     6107    if (!pQueryInfo)
     6108        return VERR_INVALID_PARAMETER;
    60776109
    60786110    D3D11_QUERY_DESC desc;
    6079     desc.Query     = dxQueryType((SVGA3dQueryType)pEntry->type);
     6111    desc.Query     = pQueryInfo->dxQueryType;
    60806112    desc.MiscFlags = 0;
    60816113    if (pEntry->flags & SVGA3D_DXQUERY_FLAG_PREDICATEHINT)
     
    61176149
    61186150
    6119 static DECLCALLBACK(int) vmsvga3dBackDXBindQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId)
    6120 {
    6121     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    6122     RT_NOREF(pBackend, pDXContext, queryId);
    6123 
    6124     return VINF_SUCCESS;
    6125 }
    6126 
    6127 
     6151/** @todo queryId makes pDXQuery redundant */
    61286152static int dxBeginQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, DXQUERY *pDXQuery)
    61296153{
     
    61356159    if (pEntry->type == SVGA3D_QUERYTYPE_TIMESTAMP)
    61366160        return VINF_SUCCESS;
     6161
    61376162    pDXDevice->pImmediateContext->Begin(pDXQuery->pQuery);
    61386163    return VINF_SUCCESS;
     
    61516176
    61526177
    6153 static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, DXQUERY *pDXQuery)
     6178static int dxGetQueryResult(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId,
     6179                            SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut)
    61546180{
    61556181    DXDEVICE *pDXDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext);
    61566182    AssertReturn(pDXDevice->pDevice, VERR_INVALID_STATE);
    61576183
    6158     pDXDevice->pImmediateContext->End(pDXQuery->pQuery);
    6159     return VINF_SUCCESS;
    6160 }
    6161 
    6162 
    6163 static DECLCALLBACK(int) vmsvga3dBackDXEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId)
    6164 {
    6165     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    6166     RT_NOREF(pBackend);
     6184    typedef union _DXQUERYRESULT
     6185    {
     6186        UINT64                               occlusion;
     6187        UINT64                               timestamp;
     6188        D3D11_QUERY_DATA_TIMESTAMP_DISJOINT  timestampDisjoint;
     6189        D3D11_QUERY_DATA_PIPELINE_STATISTICS pipelineStatistics;
     6190        BOOL                                 occlusionPredicate;
     6191        D3D11_QUERY_DATA_SO_STATISTICS       soStatistics;
     6192        BOOL                                 soOverflowPredicate;
     6193    } DXQUERYRESULT;
    61676194
    61686195    DXQUERY *pDXQuery = &pDXContext->pBackendDXContext->paQuery[queryId];
    6169     int rc = dxEndQuery(pThisCC, pDXContext, pDXQuery);
    6170     return rc;
    6171 }
    6172 
    6173 
    6174 static int dxReadbackQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, DXQUERY *pDXQuery,
    6175                            void *pvData, uint32_t cbData, uint32_t *pcbOut)
     6196    SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
     6197    VGPU10QUERYINFO const *pQueryInfo = dxQueryInfo((SVGA3dQueryType)pEntry->type);
     6198    if (!pQueryInfo)
     6199        return VERR_INVALID_PARAMETER;
     6200
     6201    DXQUERYRESULT dxQueryResult;
     6202    while (pDXDevice->pImmediateContext->GetData(pDXQuery->pQuery, &dxQueryResult, pQueryInfo->cbDataD3D11, 0) != S_OK)
     6203    {
     6204        RTThreadYield();
     6205    }
     6206
     6207    /* Copy back the result. */
     6208    switch (pEntry->type)
     6209    {
     6210        case SVGA3D_QUERYTYPE_OCCLUSION:
     6211            pQueryResult->occ.samplesRendered = (uint32_t)dxQueryResult.occlusion;
     6212            break;
     6213        case SVGA3D_QUERYTYPE_TIMESTAMP:
     6214            pQueryResult->ts.timestamp = dxQueryResult.timestamp;
     6215            break;
     6216        case SVGA3D_QUERYTYPE_TIMESTAMPDISJOINT:
     6217            pQueryResult->tsDisjoint.realFrequency = dxQueryResult.timestampDisjoint.Frequency;
     6218            pQueryResult->tsDisjoint.disjoint = dxQueryResult.timestampDisjoint.Disjoint;
     6219            break;
     6220        case SVGA3D_QUERYTYPE_PIPELINESTATS:
     6221            pQueryResult->pipelineStats.inputAssemblyVertices     = dxQueryResult.pipelineStatistics.IAVertices;
     6222            pQueryResult->pipelineStats.inputAssemblyPrimitives   = dxQueryResult.pipelineStatistics.IAPrimitives;
     6223            pQueryResult->pipelineStats.vertexShaderInvocations   = dxQueryResult.pipelineStatistics.VSInvocations;
     6224            pQueryResult->pipelineStats.geometryShaderInvocations = dxQueryResult.pipelineStatistics.GSInvocations;
     6225            pQueryResult->pipelineStats.geometryShaderPrimitives  = dxQueryResult.pipelineStatistics.GSPrimitives;
     6226            pQueryResult->pipelineStats.clipperInvocations        = dxQueryResult.pipelineStatistics.CInvocations;
     6227            pQueryResult->pipelineStats.clipperPrimitives         = dxQueryResult.pipelineStatistics.CPrimitives;
     6228            pQueryResult->pipelineStats.pixelShaderInvocations    = dxQueryResult.pipelineStatistics.PSInvocations;
     6229            pQueryResult->pipelineStats.hullShaderInvocations     = dxQueryResult.pipelineStatistics.HSInvocations;
     6230            pQueryResult->pipelineStats.domainShaderInvocations   = dxQueryResult.pipelineStatistics.DSInvocations;
     6231            pQueryResult->pipelineStats.computeShaderInvocations  = dxQueryResult.pipelineStatistics.CSInvocations;
     6232            break;
     6233        case SVGA3D_QUERYTYPE_OCCLUSIONPREDICATE:
     6234            pQueryResult->occPred.anySamplesRendered = dxQueryResult.occlusionPredicate;
     6235            break;
     6236        case SVGA3D_QUERYTYPE_STREAMOUTPUTSTATS:
     6237        case SVGA3D_QUERYTYPE_SOSTATS_STREAM0:
     6238        case SVGA3D_QUERYTYPE_SOSTATS_STREAM1:
     6239        case SVGA3D_QUERYTYPE_SOSTATS_STREAM2:
     6240        case SVGA3D_QUERYTYPE_SOSTATS_STREAM3:
     6241            pQueryResult->soStats.numPrimitivesWritten  = dxQueryResult.soStatistics.NumPrimitivesWritten;
     6242            pQueryResult->soStats.numPrimitivesRequired = dxQueryResult.soStatistics.PrimitivesStorageNeeded;
     6243            break;
     6244        case SVGA3D_QUERYTYPE_STREAMOVERFLOWPREDICATE:
     6245        case SVGA3D_QUERYTYPE_SOP_STREAM0:
     6246        case SVGA3D_QUERYTYPE_SOP_STREAM1:
     6247        case SVGA3D_QUERYTYPE_SOP_STREAM2:
     6248        case SVGA3D_QUERYTYPE_SOP_STREAM3:
     6249            pQueryResult->soPred.overflowed = dxQueryResult.soOverflowPredicate;
     6250            break;
     6251        case SVGA3D_QUERYTYPE_OCCLUSION64:
     6252            pQueryResult->occ64.samplesRendered = dxQueryResult.occlusion;
     6253            break;
     6254    }
     6255
     6256    *pcbOut = pQueryInfo->cbDataVMSVGA;
     6257    return VINF_SUCCESS;
     6258}
     6259
     6260static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId,
     6261                      SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut)
    61766262{
    61776263    DXDEVICE *pDXDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext);
    61786264    AssertReturn(pDXDevice->pDevice, VERR_INVALID_STATE);
    61796265
    6180     SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
    6181 
    6182     uint32_t cbRequired;
    6183     switch (pEntry->type)
    6184     {
    6185         case SVGA3D_QUERYTYPE_OCCLUSION:               cbRequired = sizeof(UINT64); break;
    6186         case SVGA3D_QUERYTYPE_TIMESTAMP:               cbRequired = sizeof(UINT64); break;
    6187         case SVGA3D_QUERYTYPE_TIMESTAMPDISJOINT:       cbRequired = sizeof(D3D11_QUERY_DATA_TIMESTAMP_DISJOINT); break;
    6188         case SVGA3D_QUERYTYPE_PIPELINESTATS:           cbRequired = sizeof(D3D11_QUERY_DATA_PIPELINE_STATISTICS); break;
    6189         case SVGA3D_QUERYTYPE_OCCLUSIONPREDICATE:      cbRequired = sizeof(BOOL); break;
    6190         case SVGA3D_QUERYTYPE_STREAMOUTPUTSTATS:       cbRequired = sizeof(D3D11_QUERY_DATA_SO_STATISTICS); break;
    6191         case SVGA3D_QUERYTYPE_STREAMOVERFLOWPREDICATE: cbRequired = sizeof(BOOL); break;
    6192         case SVGA3D_QUERYTYPE_OCCLUSION64:             cbRequired = sizeof(UINT64); break;
    6193         case SVGA3D_QUERYTYPE_SOSTATS_STREAM0:         cbRequired = sizeof(D3D11_QUERY_DATA_SO_STATISTICS); break;
    6194         case SVGA3D_QUERYTYPE_SOSTATS_STREAM1:         cbRequired = sizeof(D3D11_QUERY_DATA_SO_STATISTICS); break;
    6195         case SVGA3D_QUERYTYPE_SOSTATS_STREAM2:         cbRequired = sizeof(D3D11_QUERY_DATA_SO_STATISTICS); break;
    6196         case SVGA3D_QUERYTYPE_SOSTATS_STREAM3:         cbRequired = sizeof(D3D11_QUERY_DATA_SO_STATISTICS); break;
    6197         case SVGA3D_QUERYTYPE_SOP_STREAM0:             cbRequired = sizeof(BOOL); break;
    6198         case SVGA3D_QUERYTYPE_SOP_STREAM1:             cbRequired = sizeof(BOOL); break;
    6199         case SVGA3D_QUERYTYPE_SOP_STREAM2:             cbRequired = sizeof(BOOL); break;
    6200         case SVGA3D_QUERYTYPE_SOP_STREAM3:             cbRequired = sizeof(BOOL); break;
    6201         default:
    6202             AssertFailedReturn(VERR_INVALID_STATE);
    6203     }
    6204 
    6205     ASSERT_GUEST_RETURN(cbData > cbRequired, VERR_INVALID_PARAMETER);
    6206 
    6207     while (pDXDevice->pImmediateContext->GetData(pDXQuery->pQuery, pvData, cbRequired, 0) != S_OK)
    6208     {
    6209     }
    6210 
    6211     *pcbOut = cbRequired;
    6212     return VINF_SUCCESS;
    6213 }
    6214 
    6215 
    6216 static DECLCALLBACK(int) vmsvga3dBackDXReadbackQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext,
    6217                                                      SVGA3dQueryId queryId, void *pvData, uint32_t cbData, uint32_t *pcbOut)
     6266    DXQUERY *pDXQuery = &pDXContext->pBackendDXContext->paQuery[queryId];
     6267    pDXDevice->pImmediateContext->End(pDXQuery->pQuery);
     6268
     6269    /** @todo Consider issuing QueryEnd and getting data later in FIFO thread loop. */
     6270    return dxGetQueryResult(pThisCC, pDXContext, queryId, pQueryResult, pcbOut);
     6271}
     6272
     6273
     6274static DECLCALLBACK(int) vmsvga3dBackDXEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext,
     6275                                                SVGA3dQueryId queryId, SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut)
    62186276{
    62196277    PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    62206278    RT_NOREF(pBackend);
    62216279
    6222     DXQUERY *pDXQuery = &pDXContext->pBackendDXContext->paQuery[queryId];
    6223     int rc = dxReadbackQuery(pThisCC, pDXContext, queryId, pDXQuery, pvData, cbData, pcbOut);
     6280    int rc = dxEndQuery(pThisCC, pDXContext, queryId, pQueryResult, pcbOut);
    62246281    return rc;
    62256282}
     
    79518008                p->pfnDXDefineQuery               = vmsvga3dBackDXDefineQuery;
    79528009                p->pfnDXDestroyQuery              = vmsvga3dBackDXDestroyQuery;
    7953                 p->pfnDXBindQuery                 = vmsvga3dBackDXBindQuery;
    79548010                p->pfnDXBeginQuery                = vmsvga3dBackDXBeginQuery;
    79558011                p->pfnDXEndQuery                  = vmsvga3dBackDXEndQuery;
    7956                 p->pfnDXReadbackQuery             = vmsvga3dBackDXReadbackQuery;
    79578012                p->pfnDXSetPredication            = vmsvga3dBackDXSetPredication;
    79588013                p->pfnDXSetSOTargets              = vmsvga3dBackDXSetSOTargets;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r94377 r94449  
    447447    DECLCALLBACKMEMBER(int, pfnDXDefineQuery,               (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry const *pEntry));
    448448    DECLCALLBACKMEMBER(int, pfnDXDestroyQuery,              (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId));
    449     DECLCALLBACKMEMBER(int, pfnDXBindQuery,                 (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId));
    450449    DECLCALLBACKMEMBER(int, pfnDXBeginQuery,                (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId));
    451     DECLCALLBACKMEMBER(int, pfnDXEndQuery,                  (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId));
    452     DECLCALLBACKMEMBER(int, pfnDXReadbackQuery,             (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, void *pvData, uint32_t cbData, uint32_t *pcbOut));
     450    DECLCALLBACKMEMBER(int, pfnDXEndQuery,                  (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut));
    453451    DECLCALLBACKMEMBER(int, pfnDXSetPredication,            (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext));
    454452    DECLCALLBACKMEMBER(int, pfnDXSetSOTargets,              (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, uint32_t cSoTarget, SVGA3dSoTarget const *paSoTarget));
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