Changeset 94449 in vbox
- Timestamp:
- Apr 2, 2022 2:09:02 PM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 150779
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp
r94377 r94449 903 903 904 904 905 int 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 912 int 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 905 919 /** Create a host ring-3 pointer to the MOB data. 906 920 * 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 629 629 630 630 PVMSVGAMOB vmsvgaR3MobGet(PVMSVGAR3STATE pSvgaR3State, SVGAMobId RT_UNTRUSTED_GUEST mobid); 631 int vmsvgaR3MobWrite(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t off, void const *pvData, uint32_t cbData); 632 int vmsvgaR3MobRead(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t off, void *pvData, uint32_t cbData); 631 633 int vmsvgaR3MobBackingStoreCreate(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob, uint32_t cbValid); 632 634 void vmsvgaR3MobBackingStoreDelete(PVMSVGAR3STATE pSvgaR3State, PVMSVGAMOB pMob); -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.cpp
r94264 r94449 2349 2349 2350 2350 static 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) 2352 2353 { 2353 2354 for (uint32_t i = 0; i < cSignature; ++i) … … 2358 2359 AssertReturn(p->semanticName < SVGADX_SIGNATURE_SEMANTIC_NAME_MAX, NULL); 2359 2360 VGPUSemanticInfo const *pSemanticInfo = dxbcSemanticInfo(pInfo, p->semanticName, u32BlobType); 2361 *pSemanticName = p->semanticName; 2360 2362 return pSemanticInfo->pszName; 2361 2363 } … … 2364 2366 } 2365 2367 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] );2368 char 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); 2369 2371 } 2370 2372 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.h
r94232 r94449 54 54 int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, VGPU10_RESOURCE_DIMENSION *paResourceType, uint32_t cResourceType); 55 55 int DXShaderCreateDXBC(DXShaderInfo const *pInfo, void **ppvDXBC, uint32_t *pcbDXBC); 56 char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister );56 char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister, SVGA3dDXSignatureSemanticName *pSemanticName); 57 57 58 58 #endif /* !VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_dx_shader_h */ -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp
r94265 r94449 40 40 41 41 42 static int dxReadbackQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry); 42 /* 43 * Helpers. 44 */ 45 46 static 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 } 43 53 44 54 … … 1024 1034 int rc; 1025 1035 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 1026 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindQuery, VERR_INVALID_STATE);1036 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE); 1027 1037 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 1028 1038 AssertReturn(p3dState, VERR_INVALID_STATE); … … 1041 1051 pEntry->mobid = vmsvgaR3MobId(pMob); 1042 1052 1043 rc = pSvgaR3State->pFuncsDX->pfnDXBindQuery(pThisCC, pDXContext, queryId);1044 1053 return rc; 1045 1054 } … … 1095 1104 rc = pSvgaR3State->pFuncsDX->pfnDXBeginQuery(pThisCC, pDXContext, queryId); 1096 1105 if (RT_SUCCESS(rc)) 1106 { 1097 1107 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 } 1098 1118 } 1099 1119 return rc; … … 1101 1121 1102 1122 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]; 1123 static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry) 1124 { 1125 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 1126 1127 int rc; 1122 1128 Assert(pEntry->state == SVGADX_QDSTATE_ACTIVE); 1123 1129 if (pEntry->state == SVGADX_QDSTATE_ACTIVE) 1124 1130 { 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); 1126 1137 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; 1128 1151 } 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 1159 int 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); 1139 1164 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 1140 1165 AssertReturn(p3dState, VERR_INVALID_STATE); … … 1151 1176 1152 1177 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 1183 int 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 1156 1203 return rc; 1157 1204 } … … 2356 2403 int rc; 2357 2404 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2358 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindQuery, VERR_INVALID_STATE);2405 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE); 2359 2406 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2360 2407 AssertReturn(p3dState, VERR_INVALID_STATE); … … 2370 2417 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[i]; 2371 2418 if (pEntry->type != SVGA3D_QUERYTYPE_INVALID) 2372 {2373 2419 pEntry->mobid = pCmd->mobid; 2374 pSvgaR3State->pFuncsDX->pfnDXBindQuery(pThisCC, pDXContext, i);2375 }2376 2420 } 2377 2421 … … 2380 2424 2381 2425 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 2411 2426 int vmsvga3dDXReadbackAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackAllQuery const *pCmd) 2412 2427 { 2413 2428 int rc; 2414 2429 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State; 2415 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackQuery, VERR_INVALID_STATE);2430 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE); 2416 2431 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState; 2417 2432 AssertReturn(p3dState, VERR_INVALID_STATE); … … 2423 2438 AssertRCReturn(rc, rc); 2424 2439 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); 2433 2444 2434 2445 return rc; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp
r94377 r94449 1705 1705 D3D11_SO_DECLARATION_ENTRY *p = &pDXStreamOutput->aDeclarationEntry[i]; 1706 1706 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; 1709 1713 } 1710 1714 … … 6043 6047 } 6044 6048 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 6050 typedef struct VGPU10QUERYINFO 6051 { 6052 SVGA3dQueryType svgaQueryType; 6053 uint32_t cbDataVMSVGA; 6054 D3D11_QUERY dxQueryType; 6055 uint32_t cbDataD3D11; 6056 } VGPU10QUERYINFO; 6057 6058 static 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]; 6069 6098 } 6070 6099 … … 6075 6104 6076 6105 DXQUERY *pDXQuery = &pDXContext->pBackendDXContext->paQuery[queryId]; 6106 VGPU10QUERYINFO const *pQueryInfo = dxQueryInfo((SVGA3dQueryType)pEntry->type); 6107 if (!pQueryInfo) 6108 return VERR_INVALID_PARAMETER; 6077 6109 6078 6110 D3D11_QUERY_DESC desc; 6079 desc.Query = dxQueryType((SVGA3dQueryType)pEntry->type);6111 desc.Query = pQueryInfo->dxQueryType; 6080 6112 desc.MiscFlags = 0; 6081 6113 if (pEntry->flags & SVGA3D_DXQUERY_FLAG_PREDICATEHINT) … … 6117 6149 6118 6150 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 */ 6128 6152 static int dxBeginQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, DXQUERY *pDXQuery) 6129 6153 { … … 6135 6159 if (pEntry->type == SVGA3D_QUERYTYPE_TIMESTAMP) 6136 6160 return VINF_SUCCESS; 6161 6137 6162 pDXDevice->pImmediateContext->Begin(pDXQuery->pQuery); 6138 6163 return VINF_SUCCESS; … … 6151 6176 6152 6177 6153 static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, DXQUERY *pDXQuery) 6178 static int dxGetQueryResult(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, 6179 SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut) 6154 6180 { 6155 6181 DXDEVICE *pDXDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext); 6156 6182 AssertReturn(pDXDevice->pDevice, VERR_INVALID_STATE); 6157 6183 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; 6167 6194 6168 6195 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 6260 static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, 6261 SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut) 6176 6262 { 6177 6263 DXDEVICE *pDXDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext); 6178 6264 AssertReturn(pDXDevice->pDevice, VERR_INVALID_STATE); 6179 6265 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 6274 static DECLCALLBACK(int) vmsvga3dBackDXEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, 6275 SVGA3dQueryId queryId, SVGADXQueryResultUnion *pQueryResult, uint32_t *pcbOut) 6218 6276 { 6219 6277 PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend; 6220 6278 RT_NOREF(pBackend); 6221 6279 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); 6224 6281 return rc; 6225 6282 } … … 7951 8008 p->pfnDXDefineQuery = vmsvga3dBackDXDefineQuery; 7952 8009 p->pfnDXDestroyQuery = vmsvga3dBackDXDestroyQuery; 7953 p->pfnDXBindQuery = vmsvga3dBackDXBindQuery;7954 8010 p->pfnDXBeginQuery = vmsvga3dBackDXBeginQuery; 7955 8011 p->pfnDXEndQuery = vmsvga3dBackDXEndQuery; 7956 p->pfnDXReadbackQuery = vmsvga3dBackDXReadbackQuery;7957 8012 p->pfnDXSetPredication = vmsvga3dBackDXSetPredication; 7958 8013 p->pfnDXSetSOTargets = vmsvga3dBackDXSetSOTargets; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
r94377 r94449 447 447 DECLCALLBACKMEMBER(int, pfnDXDefineQuery, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry const *pEntry)); 448 448 DECLCALLBACKMEMBER(int, pfnDXDestroyQuery, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId)); 449 DECLCALLBACKMEMBER(int, pfnDXBindQuery, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId));450 449 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)); 453 451 DECLCALLBACKMEMBER(int, pfnDXSetPredication, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)); 454 452 DECLCALLBACKMEMBER(int, pfnDXSetSOTargets, (PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, uint32_t cSoTarget, SVGA3dSoTarget const *paSoTarget));
Note:
See TracChangeset
for help on using the changeset viewer.