ID3D12GraphicsCommandList::ResolveQueryData-Methode (d3d12.h)
Extrahiert Daten aus einer Abfrage. ResolveQueryData funktioniert mit allen Heaptypen (Standard, Upload und Readback).
Syntax
void ResolveQueryData(
[in] ID3D12QueryHeap *pQueryHeap,
[in] D3D12_QUERY_TYPE Type,
[in] UINT StartIndex,
[in] UINT NumQueries,
[in] ID3D12Resource *pDestinationBuffer,
[in] UINT64 AlignedDestinationBufferOffset
);
Parameter
[in] pQueryHeap
Typ: ID3D12QueryHeap*
Gibt den ID3D12QueryHeap an, der die aufzulösden Abfragen enthält.
[in] Type
Typ: D3D12_QUERY_TYPE
Gibt den Typ der Abfrage an, ein Member von D3D12_QUERY_TYPE.
[in] StartIndex
Typ: UINT
Gibt einen Index der ersten aufzulösden Abfrage an.
[in] NumQueries
Typ: UINT
Gibt die Anzahl der aufzulösden Abfragen an.
[in] pDestinationBuffer
Typ: ID3D12Resource*
Gibt einen ID3D12Resource-Zielpuffer an, der sich im Zustand D3D12_RESOURCE_STATE_COPY_DEST befinden muss.
[in] AlignedDestinationBufferOffset
Typ: UINT64
Gibt einen Ausrichtungsoffset in den Zielpuffer an. Muss ein Vielfaches von 8 Bytes sein.
Rückgabewert
Keine
Bemerkungen
ResolveQueryData führt einen Batchvorgang aus, der Abfragedaten in einen Zielpuffer schreibt. Abfragedaten werden zusammenhängend in den Zielpuffer und den Parameter geschrieben.
ResolveQueryData wandelt anwendungsopake Abfragedaten in einem anwendungstransparenten Abfrageheap in adapterunabhängige Werte um, die von Ihrer Anwendung verwendet werden können. Das Auflösen von Abfragen innerhalb eines Heaps, die nicht abgeschlossen wurden (also ID3D12GraphicsCommandList::BeginQuery aufgerufen wurde, aber nicht ID3D12GraphicsCommandList::EndQuery), oder die nicht initialisiert wurden, führt zu einem nicht definierten Verhalten und kann zu Hängen oder Entfernen von Geräten führen. Die Debugebene gibt einen Fehler aus, wenn sie erkennt, dass eine Anwendung unvollständige oder nicht initialisierte Abfragen aufgelöst hat.
Hinweis
Das Auflösen unvollständiger oder nicht initialisierter Abfragen ist ein undefiniertes Verhalten, da der Treiber GPUVAs oder andere Daten in nicht aufgelösten Abfragen intern speichert. Daher kann der Versuch, diese Abfragen für nicht initialisierte Daten aufzulösen, zu einem Seitenfehler oder einem Gerätefehler führen. Ältere Versionen der Debugebene haben dieses Verhalten nicht überprüft.
Binäre Okklusionsabfragen schreiben 64 Bits pro Abfrage. Das am wenigsten signifikante Bit ist entweder 0 (das Objekt wurde vollständig verdeckt) oder 1 (mindestens eine Stichprobe des Objekts wäre gezeichnet worden). Die restlichen Bits sind 0. Occlusionsabfragen schreiben 64 Bits pro Abfrage. Der Wert ist die Anzahl der Stichproben, die tests bestanden haben. Zeitstempelabfragen schreiben 64 Bit pro Abfrage, was ein Tickwert ist, der mit der jeweiligen Befehlswarteschlangenhäufigkeit verglichen werden muss (siehe Timing).
Pipelinestatistikabfragen schreiben eine D3D12_QUERY_DATA_PIPELINE_STATISTICS-Struktur pro Abfrage. Alle Streamout-Statistikabfragen schreiben eine D3D12_QUERY_DATA_SO_STATISTICS-Struktur pro Abfrage.
Die Core Runtime überprüft Folgendes.
- StartIndex und NumQueries liegen innerhalb des Bereichs.
- AlignedDestinationBufferOffset ist ein Vielfaches von 8 Bytes.
- DestinationBuffer ist ein Puffer.
- Die geschriebenen Daten überlaufen den Ausgabepuffer nicht.
- Der Abfragetyp muss vom Befehlslistentyp unterstützt werden.
- Der Abfragetyp muss vom Abfrageheap unterstützt werden.
Die Debugebene gibt eine Warnung aus, wenn sich der Zielpuffer nicht im D3D12_RESOURCE_STATE_COPY_DEST Zustand befindet oder wenn für alle aufgelösten Abfragen nicht ID3D12GraphicsCommandList::EndQuery aufgerufen wurde.
Beispiele
Im D3D12PredicationQueries-Beispiel wird ID3D12GraphicsCommandList::ResolveQueryData wie folgt verwendet:
// 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());
}
Weitere Informationen finden Sie unter Beispielcode in der D3D12-Referenz.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Windows |
Kopfzeile | d3d12.h |
Bibliothek | D3d12.lib |
DLL | D3d12.dll |