Changeset 102631 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDX.cpp
- Timestamp:
- Dec 18, 2023 12:01:14 PM (14 months ago)
- svn:sync-xref-src-repo-rev:
- 160788
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDX.cpp
r102591 r102631 1957 1957 } 1958 1958 1959 void vboxDXCreateQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery) 1960 { 1961 VMSVGAQUERYINFO const *pQueryInfo = getQueryInfo(pQuery->Query); 1959 1960 #ifdef DEBUG 1961 static bool isBeginDisabled(D3D10DDI_QUERY q) 1962 { 1963 return q == D3D10DDI_QUERY_EVENT 1964 || q == D3D10DDI_QUERY_TIMESTAMP; 1965 } 1966 #endif 1967 1968 1969 void vboxDXCreateQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery, D3D10DDI_QUERY Query, UINT MiscFlags) 1970 { 1971 VMSVGAQUERYINFO const *pQueryInfo = getQueryInfo(Query); 1962 1972 AssertReturnVoidStmt(pQueryInfo, vboxDXDeviceSetError(pDevice, E_INVALIDARG)); 1963 1973 1974 pQuery->Query = Query; 1964 1975 pQuery->svga.queryType = pQueryInfo->queryTypeSvga; 1976 pQuery->svga.flags = 0; 1977 if (MiscFlags & D3D10DDI_QUERY_MISCFLAG_PREDICATEHINT) 1978 pQuery->svga.flags |= SVGA3D_DXQUERY_FLAG_PREDICATEHINT; 1965 1979 pQuery->enmQueryState = VBOXDXQUERYSTATE_CREATED; 1980 pQuery->u64Value = 0; 1966 1981 1967 1982 int rc = RTHandleTableAlloc(pDevice->hHTQuery, pQuery, &pQuery->uQueryId); … … 1970 1985 /* Allocate mob space for this query. */ 1971 1986 pQuery->pCOAllocation = NULL; 1987 uint32_t const cbAlloc = (pQuery->Query != D3D10DDI_QUERY_EVENT ? sizeof(uint32_t) : 0) + pQueryInfo->cbDataSvga; 1972 1988 PVBOXDXCOALLOCATION pIter; 1973 1989 RTListForEach(&pDevice->listCOAQuery, pIter, VBOXDXCOALLOCATION, nodeAllocationsChain) 1974 1990 { 1975 if (vboxDXCOABlockAlloc(pIter, pQueryInfo->cbDataSvga, &pQuery->offQuery))1991 if (vboxDXCOABlockAlloc(pIter, cbAlloc, &pQuery->offQuery)) 1976 1992 { 1977 1993 pQuery->pCOAllocation = pIter; … … 1987 2003 vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY)); 1988 2004 1989 if (!vboxDXCOABlockAlloc(pQuery->pCOAllocation, pQueryInfo->cbDataSvga, &pQuery->offQuery))2005 if (!vboxDXCOABlockAlloc(pQuery->pCOAllocation, cbAlloc, &pQuery->offQuery)) 1990 2006 AssertFailedReturnVoidStmt(RTHandleTableFree(pDevice->hHTQuery, pQuery->uQueryId); 1991 2007 vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY)); … … 1993 2009 1994 2010 RTListAppend(&pDevice->listQueries, &pQuery->nodeQuery); 2011 2012 if (pQuery->Query != D3D10DDI_QUERY_EVENT) 2013 { 2014 D3DDDICB_LOCK ddiLock; 2015 RT_ZERO(ddiLock); 2016 ddiLock.hAllocation = pQuery->pCOAllocation->hCOAllocation; 2017 ddiLock.Flags.WriteOnly = 1; 2018 HRESULT hr = pDevice->pRTCallbacks->pfnLockCb(pDevice->hRTDevice.handle, &ddiLock); 2019 if (SUCCEEDED(hr)) 2020 { 2021 *(uint32_t *)((uint8_t *)ddiLock.pData + pQuery->offQuery) = SVGA3D_QUERYSTATE_PENDING; 2022 2023 D3DDDICB_UNLOCK ddiUnlock; 2024 ddiUnlock.NumAllocations = 1; 2025 ddiUnlock.phAllocations = &pQuery->pCOAllocation->hCOAllocation; 2026 hr = pDevice->pRTCallbacks->pfnUnlockCb(pDevice->hRTDevice.handle, &ddiUnlock); 2027 } 2028 AssertReturnVoidStmt(SUCCEEDED(hr), vboxDXDeviceSetError(pDevice, hr)); 2029 2030 vgpu10DefineQuery(pDevice, pQuery->uQueryId, pQuery->svga.queryType, pQuery->svga.flags); 2031 vgpu10BindQuery(pDevice, pQuery->uQueryId, pQuery->pCOAllocation->hCOAllocation); 2032 vgpu10SetQueryOffset(pDevice, pQuery->uQueryId, pQuery->offQuery); 2033 } 1995 2034 } 1996 2035 … … 1998 2037 void vboxDXDestroyQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery) 1999 2038 { 2039 if (pQuery->Query != D3D10DDI_QUERY_EVENT) 2040 vgpu10DestroyQuery(pDevice, pQuery->uQueryId); 2041 2000 2042 if (pQuery->pCOAllocation) 2001 2043 { … … 2011 2053 void vboxDXQueryBegin(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery) 2012 2054 { 2055 Assert(pQuery->enmQueryState == VBOXDXQUERYSTATE_CREATED || pQuery->enmQueryState == VBOXDXQUERYSTATE_SIGNALED); 2056 2057 pQuery->enmQueryState = VBOXDXQUERYSTATE_BUILDING; 2013 2058 if (pQuery->Query == D3D10DDI_QUERY_EVENT) 2014 {2015 pQuery->enmQueryState = VBOXDXQUERYSTATE_BUILDING;2016 2059 return; 2017 } 2018 2019 RT_NOREF(pDevice); 2020 DEBUG_BREAKPOINT_TEST(); 2060 2061 vgpu10BeginQuery(pDevice, pQuery->uQueryId); 2021 2062 } 2022 2063 … … 2024 2065 void vboxDXQueryEnd(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery) 2025 2066 { 2067 Assert( pQuery->enmQueryState == VBOXDXQUERYSTATE_BUILDING 2068 || ( isBeginDisabled(pQuery->Query) 2069 && ( pQuery->enmQueryState == VBOXDXQUERYSTATE_CREATED 2070 || pQuery->enmQueryState == VBOXDXQUERYSTATE_SIGNALED) 2071 ) 2072 ); 2073 2074 pQuery->enmQueryState = VBOXDXQUERYSTATE_ISSUED; 2075 2026 2076 if (pQuery->Query == D3D10DDI_QUERY_EVENT) 2027 2077 { 2028 2078 pQuery->u64Value = ASMAtomicIncU64(&pDevice->u64MobFenceValue); 2029 2079 vgpu10MobFence64(pDevice, pQuery->u64Value, pQuery->pCOAllocation->hCOAllocation, pQuery->offQuery); 2030 pQuery->enmQueryState = VBOXDXQUERYSTATE_ISSUED;2031 2080 return; 2032 2081 } 2033 2082 2034 Assert(pQuery->enmQueryState == VBOXDXQUERYSTATE_BUILDING); 2035 DEBUG_BREAKPOINT_TEST(); 2083 vgpu10EndQuery(pDevice, pQuery->uQueryId); 2036 2084 } 2037 2085 … … 2076 2124 } 2077 2125 2078 DEBUG_BREAKPOINT_TEST(); 2126 vgpu10ReadbackQuery(pDevice, pQuery->uQueryId); 2127 2128 VMSVGAQUERYINFO const *pQueryInfo = getQueryInfo(pQuery->Query); 2129 AssertReturnVoidStmt(pQueryInfo, vboxDXDeviceSetError(pDevice, E_INVALIDARG)); 2130 2131 void *pvResult = RTMemTmpAlloc(pQueryInfo->cbDataSvga); 2132 AssertReturnVoidStmt(pvResult, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY)); 2133 2134 uint32_t u32QueryStatus = SVGA3D_QUERYSTATE_PENDING; 2135 2136 D3DDDICB_LOCK ddiLock; 2137 RT_ZERO(ddiLock); 2138 ddiLock.hAllocation = pQuery->pCOAllocation->hCOAllocation; 2139 ddiLock.Flags.ReadOnly = 1; 2140 HRESULT hr = pDevice->pRTCallbacks->pfnLockCb(pDevice->hRTDevice.handle, &ddiLock); 2141 if (SUCCEEDED(hr)) 2142 { 2143 uint8_t *pu8 = (uint8_t *)ddiLock.pData + pQuery->offQuery; 2144 u32QueryStatus = *(uint32_t *)pu8; 2145 2146 memcpy(pvResult, pu8 + sizeof(uint32_t), pQueryInfo->cbDataSvga); 2147 2148 D3DDDICB_UNLOCK ddiUnlock; 2149 ddiUnlock.NumAllocations = 1; 2150 ddiUnlock.phAllocations = &pQuery->pCOAllocation->hCOAllocation; 2151 hr = pDevice->pRTCallbacks->pfnUnlockCb(pDevice->hRTDevice.handle, &ddiUnlock); 2152 } 2153 AssertReturnVoidStmt(SUCCEEDED(hr), RTMemTmpFree(pvResult); vboxDXDeviceSetError(pDevice, hr)); 2154 2155 if (u32QueryStatus != SVGA3D_QUERYSTATE_SUCCEEDED) 2156 vboxDXDeviceSetError(pDevice, DXGI_DDI_ERR_WASSTILLDRAWING); 2157 else 2158 { 2159 pQuery->enmQueryState = VBOXDXQUERYSTATE_SIGNALED; 2160 2161 if (pData && DataSize >= pQueryInfo->cbDataDDI) 2162 { 2163 typedef union DDIQUERYRESULT 2164 { 2165 UINT64 occlusion; /* D3D10DDI_QUERY_OCCLUSION */ 2166 UINT64 timestamp; /* D3D10DDI_QUERY_TIMESTAMP */ 2167 D3D10_DDI_QUERY_DATA_TIMESTAMP_DISJOINT timestampDisjoint; /* D3D10DDI_QUERY_TIMESTAMPDISJOINT */ 2168 D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS pipelineStatistics10; /* D3D10DDI_QUERY_PIPELINESTATS */ 2169 BOOL occlusionPredicate; /* D3D10DDI_QUERY_OCCLUSIONPREDICATE */ 2170 D3D10_DDI_QUERY_DATA_SO_STATISTICS soStatistics; /* D3D10DDI_QUERY_STREAMOUTPUTSTATS, D3D11DDI_QUERY_STREAMOUTPUTSTATS_STREAM[0-3] */ 2171 BOOL soOverflowPredicate; /* D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE, D3D11DDI_QUERY_STREAMOVERFLOWPREDICATE_STREAM[0-3] */ 2172 D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS pipelineStatistics11; /* D3D11DDI_QUERY_PIPELINESTATS */ 2173 } DDIQUERYRESULT; 2174 SVGADXQueryResultUnion const *pSvgaData = (SVGADXQueryResultUnion *)pvResult; 2175 DDIQUERYRESULT *pDDIData = (DDIQUERYRESULT *)pData; 2176 switch (pQuery->Query) 2177 { 2178 case D3D10DDI_QUERY_OCCLUSION: 2179 { 2180 pDDIData->occlusion = pSvgaData->occ.samplesRendered; 2181 break; 2182 } 2183 case D3D10DDI_QUERY_TIMESTAMP: 2184 { 2185 pDDIData->timestamp = pSvgaData->ts.timestamp; 2186 break; 2187 } 2188 case D3D10DDI_QUERY_TIMESTAMPDISJOINT: 2189 { 2190 pDDIData->timestampDisjoint.Frequency = pSvgaData->tsDisjoint.realFrequency; 2191 pDDIData->timestampDisjoint.Disjoint = pSvgaData->tsDisjoint.disjoint; 2192 break; 2193 } 2194 case D3D10DDI_QUERY_PIPELINESTATS: 2195 { 2196 pDDIData->pipelineStatistics10.IAVertices = pSvgaData->pipelineStats.inputAssemblyVertices; 2197 pDDIData->pipelineStatistics10.IAPrimitives = pSvgaData->pipelineStats.inputAssemblyPrimitives; 2198 pDDIData->pipelineStatistics10.VSInvocations = pSvgaData->pipelineStats.vertexShaderInvocations; 2199 pDDIData->pipelineStatistics10.GSInvocations = pSvgaData->pipelineStats.geometryShaderInvocations; 2200 pDDIData->pipelineStatistics10.GSPrimitives = pSvgaData->pipelineStats.geometryShaderPrimitives; 2201 pDDIData->pipelineStatistics10.CInvocations = pSvgaData->pipelineStats.clipperInvocations; 2202 pDDIData->pipelineStatistics10.CPrimitives = pSvgaData->pipelineStats.clipperPrimitives; 2203 pDDIData->pipelineStatistics10.PSInvocations = pSvgaData->pipelineStats.pixelShaderInvocations; 2204 break; 2205 } 2206 case D3D10DDI_QUERY_OCCLUSIONPREDICATE: 2207 { 2208 pDDIData->occlusionPredicate = pSvgaData->occPred.anySamplesRendered; 2209 break; 2210 } 2211 case D3D10DDI_QUERY_STREAMOUTPUTSTATS: 2212 case D3D11DDI_QUERY_STREAMOUTPUTSTATS_STREAM0: 2213 case D3D11DDI_QUERY_STREAMOUTPUTSTATS_STREAM1: 2214 case D3D11DDI_QUERY_STREAMOUTPUTSTATS_STREAM2: 2215 case D3D11DDI_QUERY_STREAMOUTPUTSTATS_STREAM3: 2216 { 2217 pDDIData->soStatistics.NumPrimitivesWritten = pSvgaData->soStats.numPrimitivesWritten; 2218 pDDIData->soStatistics.PrimitivesStorageNeeded = pSvgaData->soStats.numPrimitivesRequired; 2219 break; 2220 } 2221 case D3D11DDI_QUERY_STREAMOVERFLOWPREDICATE_STREAM0: 2222 case D3D11DDI_QUERY_STREAMOVERFLOWPREDICATE_STREAM1: 2223 case D3D11DDI_QUERY_STREAMOVERFLOWPREDICATE_STREAM2: 2224 case D3D11DDI_QUERY_STREAMOVERFLOWPREDICATE_STREAM3: 2225 case D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE: 2226 { 2227 pDDIData->soOverflowPredicate = pSvgaData->soPred.overflowed; 2228 break; 2229 } 2230 case D3D11DDI_QUERY_PIPELINESTATS: 2231 { 2232 pDDIData->pipelineStatistics11.IAVertices = pSvgaData->pipelineStats.inputAssemblyVertices; 2233 pDDIData->pipelineStatistics11.IAPrimitives = pSvgaData->pipelineStats.inputAssemblyPrimitives; 2234 pDDIData->pipelineStatistics11.VSInvocations = pSvgaData->pipelineStats.vertexShaderInvocations; 2235 pDDIData->pipelineStatistics11.GSInvocations = pSvgaData->pipelineStats.geometryShaderInvocations; 2236 pDDIData->pipelineStatistics11.GSPrimitives = pSvgaData->pipelineStats.geometryShaderPrimitives; 2237 pDDIData->pipelineStatistics11.CInvocations = pSvgaData->pipelineStats.clipperInvocations; 2238 pDDIData->pipelineStatistics11.CPrimitives = pSvgaData->pipelineStats.clipperPrimitives; 2239 pDDIData->pipelineStatistics11.PSInvocations = pSvgaData->pipelineStats.pixelShaderInvocations; 2240 pDDIData->pipelineStatistics11.HSInvocations = pSvgaData->pipelineStats.hullShaderInvocations; 2241 pDDIData->pipelineStatistics11.DSInvocations = pSvgaData->pipelineStats.domainShaderInvocations; 2242 pDDIData->pipelineStatistics11.CSInvocations = pSvgaData->pipelineStats.computeShaderInvocations; 2243 break; 2244 } 2245 default: 2246 break; 2247 } 2248 } 2249 } 2250 2251 RTMemTmpFree(pvResult); 2079 2252 } 2080 2253
Note:
See TracChangeset
for help on using the changeset viewer.