Condividi tramite


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

Vedi anche

ID3D12GraphicsCommandList