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

Weitere Informationen

ID3D12GraphicsCommandList