Metodo ID3D12GraphicsCommandList::ResolveQueryData (d3d12.h)
Estrae i dati da una query. ResolveQueryData funziona con tutti i tipi heap (impostazione predefinita, caricamento e readback).
Sintassi
void ResolveQueryData(
[in] ID3D12QueryHeap *pQueryHeap,
[in] D3D12_QUERY_TYPE Type,
[in] UINT StartIndex,
[in] UINT NumQueries,
[in] ID3D12Resource *pDestinationBuffer,
[in] UINT64 AlignedDestinationBufferOffset
);
Parametri
[in] pQueryHeap
Tipo: ID3D12QueryHeap*
Specifica l'ID3D12QueryHeap contenente le query da risolvere.
[in] Type
Tipo: D3D12_QUERY_TYPE
Specifica il tipo di query, un membro di D3D12_QUERY_TYPE.
[in] StartIndex
Tipo: UINT
Specifica un indice della prima query da risolvere.
[in] NumQueries
Tipo: UINT
Specifica il numero di query da risolvere.
[in] pDestinationBuffer
Tipo: ID3D12Resource*
Specifica un buffer di destinazione ID3D12Resource , che deve trovarsi nello stato D3D12_RESOURCE_STATE_COPY_DEST.
[in] AlignedDestinationBufferOffset
Tipo: UINT64
Specifica un offset di allineamento nel buffer di destinazione. Deve essere un multiplo di 8 byte.
Valore restituito
nessuno
Osservazioni
ResolveQueryData esegue un'operazione in batch che scrive i dati di query in un buffer di destinazione. I dati di query sono scritti in modo contiguo al buffer di destinazione e al parametro .
ResolveQueryData trasforma i dati delle query opachi dell'applicazione in un heap di query opaca dell'applicazione in valori agnostici dell'adapter utilizzabili dall'applicazione. La risoluzione delle query all'interno di un heap che non è stata completata (in modo da avere ID3D12GraphicsCommandList::BeginQuery chiamata per loro, ma non ID3D12GraphicsCommandList::EndQuery) o non inizializzata, comporta un comportamento non definito e potrebbe causare blocchi o rimozione dei dispositivi. Il livello di debug genererà un errore se rileva che un'applicazione ha risolto query incomplete o non inizializzate.
Nota
La risoluzione di query incomplete o non inizializzate è un comportamento non definito perché il driver potrebbe archiviare internamente GPUVAs o altri dati all'interno di query non risolte. Quindi, il tentativo di risolvere queste query sui dati non inizializzati potrebbe causare un errore di pagina o un blocco del dispositivo. Le versioni precedenti del livello di debug non convalidano questo comportamento.
Le query di occlusione binarie scrivono 64 bit per query. Il bit meno significativo è 0 (l'oggetto era interamente occluso) o 1 (almeno 1 esempio dell'oggetto sarebbe stato disegnato). Il resto dei bit è 0. Le query di occlusione scrivono 64 bit per query. Il valore è il numero di campioni che hanno superato il test. Le query timestamp scrivono 64 bit per query, ovvero un valore di tick che deve essere confrontato con la rispettiva frequenza della coda dei comandi (vedere Intervallo).
Le query sulle statistiche della pipeline scrivono una struttura D3D12_QUERY_DATA_PIPELINE_STATISTICS per query. Tutte le query sulle statistiche di flusso scrivono una struttura D3D12_QUERY_DATA_SO_STATISTICS per ogni query.
Il runtime di base convalida il codice seguente.
- StartIndex e NumQueries si trovano all'interno dell'intervallo.
- AlignedDestinationBufferOffset è un multiplo di 8 byte.
- DestinationBuffer è un buffer.
- I dati scritti non sovraflowranno il buffer di output.
- Il tipo di query deve essere supportato dal tipo di elenco comandi.
- Il tipo di query deve essere supportato dall'heap della query.
Il livello di debug emetterà un avviso se il buffer di destinazione non si trova nello stato D3D12_RESOURCE_STATE_COPY_DEST o se le query risolte non avevano ID3D12GraphicsCommandList::EndQuery chiamate.
Esempio
L'esempio D3D12PredicationQueries usa ID3D12GraphicsCommandList::ResolveQueryData come indicato di seguito:
// Fill the command list with all the render commands and dependent state.
void D3D12PredicationQueries::PopulateCommandList()
{
// Command list allocators can only be reset when the associated
// command lists have finished execution on the GPU; apps should use
// fences to determine GPU execution progress.
ThrowIfFailed(m_commandAllocators[m_frameIndex]->Reset());
// However, when ExecuteCommandList() is called on a particular command
// list, that command list can then be reset at any time and must be before
// re-recording.
ThrowIfFailed(m_commandList->Reset(m_commandAllocators[m_frameIndex].Get(), m_pipelineState.Get()));
// Set necessary state.
m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
ID3D12DescriptorHeap* ppHeaps[] = { m_cbvHeap.Get() };
m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);
m_commandList->RSSetViewports(1, &m_viewport);
m_commandList->RSSetScissorRects(1, &m_scissorRect);
// Indicate that the back buffer will be used as a render target.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle);
// Record commands.
const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
m_commandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);
// Draw the quads and perform the occlusion query.
{
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvFarQuad(m_cbvHeap->GetGPUDescriptorHandleForHeapStart(), m_frameIndex * CbvCountPerFrame, m_cbvSrvDescriptorSize);
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvNearQuad(cbvFarQuad, m_cbvSrvDescriptorSize);
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
// Draw the far quad conditionally based on the result of the occlusion query
// from the previous frame.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPredication(m_queryResult.Get(), 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->DrawInstanced(4, 1, 0, 0);
// Disable predication and always draw the near quad.
m_commandList->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->SetGraphicsRootDescriptorTable(0, cbvNearQuad);
m_commandList->DrawInstanced(4, 1, 4, 0);
// Run the occlusion query with the bounding box quad.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPipelineState(m_queryState.Get());
m_commandList->BeginQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
m_commandList->DrawInstanced(4, 1, 8, 0);
m_commandList->EndQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
// Resolve the occlusion query and store the results in the query result buffer
// to be used on the subsequent frame.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_PREDICATION, D3D12_RESOURCE_STATE_COPY_DEST));
m_commandList->ResolveQueryData(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0, 1, m_queryResult.Get(), 0);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PREDICATION));
}
// Indicate that the back buffer will now be used to present.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
ThrowIfFailed(m_commandList->Close());
}
Vedere Codice di esempio nel riferimento D3D12.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Windows |
Intestazione | d3d12.h |
Libreria | D3d12.lib |
DLL | D3d12.dll |