VirtualBox

Ignore:
Timestamp:
Dec 18, 2023 12:01:14 PM (14 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
160788
Message:

WDDM: VGPU queries

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDX.cpp

    r102591 r102631  
    19571957}
    19581958
    1959 void vboxDXCreateQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery)
    1960 {
    1961     VMSVGAQUERYINFO const *pQueryInfo = getQueryInfo(pQuery->Query);
     1959
     1960#ifdef DEBUG
     1961static bool isBeginDisabled(D3D10DDI_QUERY q)
     1962{
     1963    return q == D3D10DDI_QUERY_EVENT
     1964        || q == D3D10DDI_QUERY_TIMESTAMP;
     1965}
     1966#endif
     1967
     1968
     1969void vboxDXCreateQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery, D3D10DDI_QUERY Query, UINT MiscFlags)
     1970{
     1971    VMSVGAQUERYINFO const *pQueryInfo = getQueryInfo(Query);
    19621972    AssertReturnVoidStmt(pQueryInfo, vboxDXDeviceSetError(pDevice, E_INVALIDARG));
    19631973
     1974    pQuery->Query = Query;
    19641975    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;
    19651979    pQuery->enmQueryState = VBOXDXQUERYSTATE_CREATED;
     1980    pQuery->u64Value = 0;
    19661981
    19671982    int rc = RTHandleTableAlloc(pDevice->hHTQuery, pQuery, &pQuery->uQueryId);
     
    19701985    /* Allocate mob space for this query. */
    19711986    pQuery->pCOAllocation = NULL;
     1987    uint32_t const cbAlloc = (pQuery->Query != D3D10DDI_QUERY_EVENT ? sizeof(uint32_t) : 0) + pQueryInfo->cbDataSvga;
    19721988    PVBOXDXCOALLOCATION pIter;
    19731989    RTListForEach(&pDevice->listCOAQuery, pIter, VBOXDXCOALLOCATION, nodeAllocationsChain)
    19741990    {
    1975         if (vboxDXCOABlockAlloc(pIter, pQueryInfo->cbDataSvga, &pQuery->offQuery))
     1991        if (vboxDXCOABlockAlloc(pIter, cbAlloc, &pQuery->offQuery))
    19761992        {
    19771993            pQuery->pCOAllocation = pIter;
     
    19872003                                       vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY));
    19882004
    1989         if (!vboxDXCOABlockAlloc(pQuery->pCOAllocation, pQueryInfo->cbDataSvga, &pQuery->offQuery))
     2005        if (!vboxDXCOABlockAlloc(pQuery->pCOAllocation, cbAlloc, &pQuery->offQuery))
    19902006            AssertFailedReturnVoidStmt(RTHandleTableFree(pDevice->hHTQuery, pQuery->uQueryId);
    19912007                                       vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY));
     
    19932009
    19942010    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    }
    19952034}
    19962035
     
    19982037void vboxDXDestroyQuery(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery)
    19992038{
     2039    if (pQuery->Query != D3D10DDI_QUERY_EVENT)
     2040        vgpu10DestroyQuery(pDevice, pQuery->uQueryId);
     2041
    20002042    if (pQuery->pCOAllocation)
    20012043    {
     
    20112053void vboxDXQueryBegin(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery)
    20122054{
     2055    Assert(pQuery->enmQueryState == VBOXDXQUERYSTATE_CREATED || pQuery->enmQueryState == VBOXDXQUERYSTATE_SIGNALED);
     2056
     2057    pQuery->enmQueryState = VBOXDXQUERYSTATE_BUILDING;
    20132058    if (pQuery->Query == D3D10DDI_QUERY_EVENT)
    2014     {
    2015         pQuery->enmQueryState = VBOXDXQUERYSTATE_BUILDING;
    20162059        return;
    2017     }
    2018 
    2019     RT_NOREF(pDevice);
    2020     DEBUG_BREAKPOINT_TEST();
     2060
     2061    vgpu10BeginQuery(pDevice, pQuery->uQueryId);
    20212062}
    20222063
     
    20242065void vboxDXQueryEnd(PVBOXDX_DEVICE pDevice, PVBOXDXQUERY pQuery)
    20252066{
     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
    20262076    if (pQuery->Query == D3D10DDI_QUERY_EVENT)
    20272077    {
    20282078        pQuery->u64Value = ASMAtomicIncU64(&pDevice->u64MobFenceValue);
    20292079        vgpu10MobFence64(pDevice, pQuery->u64Value, pQuery->pCOAllocation->hCOAllocation, pQuery->offQuery);
    2030         pQuery->enmQueryState = VBOXDXQUERYSTATE_ISSUED;
    20312080        return;
    20322081    }
    20332082
    2034     Assert(pQuery->enmQueryState == VBOXDXQUERYSTATE_BUILDING);
    2035     DEBUG_BREAKPOINT_TEST();
     2083    vgpu10EndQuery(pDevice, pQuery->uQueryId);
    20362084}
    20372085
     
    20762124    }
    20772125
    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);
    20792252}
    20802253
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