首页 > 解决方案 > 为什么 ID3D11DeviceContext::Flush() 方法在查询 GPU 状态期间被调用两次

问题描述

假设已经创建了一个 d3d 11 设备,然后创建一个查询:

ID3D11Query*    m_pQuery

...

HRESULT hr = S_OK;

D3D11_QUERY_DESC queryDesc;
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
//pd3dDevice has been created beforehand.
hr = pd3dDevice->CreateQuery(&queryDesc, &m_pQuery);

现在,定义一个函数来等待 GPU 返回它的查询结果:

void GlobalAppState::WaitForGPU()
{
    DXUTGetD3D11DeviceContext()->Flush();
    DXUTGetD3D11DeviceContext()->End(m_pQuery);
    DXUTGetD3D11DeviceContext()->Flush();

    while (S_OK != DXUTGetD3D11DeviceContext()->GetData(m_pQuery, NULL, 0, 0));
}

我的问题是为什么flush在查询结束之前和之后调用两次?第一次刷新后命令缓冲区被清除,那么第二次“刷新”是否有意义?

原始代码来自VoxelHashing/DepthSensingCUDA/Source/GlobalAppState.cpp

标签: c++graphicsdirect3d11

解决方案


推荐阅读