A query interface queries information from the GPU.
interface ID3D11Query : public ID3D11Asynchronous
A query can be created with ID3D11Device::CreateQuery.
Query data is typically gathered by issuing an ID3D11DeviceContext::Begin command, issuing some graphics commands, issuing an ID3D11DeviceContext::End command, and then calling ID3D11DeviceContext::GetData to get data about what happened in between the Begin and End calls. The data returned by GetData will be different depending on the type of query.
There are, however, some queries that do not require calls to Begin. For a list of possible queries see D3D11_QUERY.
A query is typically executed as shown in the following code:
D3D11_QUERY_DESC queryDesc;
... // Fill out queryDesc structure
ID3D11Query * pQuery;
pDevice->CreateQuery(&queryDesc, &pQuery);
pDeviceContext->Begin(pQuery);
... // Issue graphics commands
pDeviceContext->End(pQuery);
UINT64 queryData; // This data type is different depending on the query type
while( S_OK != pDeviceContext->GetData(pQuery, &queryData, sizeof(UINT64), 0) )
{
}
When using a query that does not require a call to Begin, it still requires a call to End. The call to End causes the data returned by GetData to be accurate up until the last call to End.
In Xbox One, Direct3D causes a context roll whenever occlusion queries turn on and off. For example, a title might issue an occlusion query for every draw call in the gbuffer pass. The driver turns on PERFECT_ZPASS_COUNTS inside an occlusion query scope, and turns it off outside an occlusion query scope. This causes a context roll on every draw during the affected pass.
There are two possible workarounds to avoid the context roll: either call ID3D11DeviceContextX::SetPredicationFromQuery, or, encompass the draws in a dummy query, so that the nesting count remains at 1.
Header: Declared in d3d11_x.h (d3d11.h on other Windows platforms).
Library: Use d3d11_x.lib (d3d11.lib on other Windows platforms).