Compartilhar via


Método ID3D12GraphicsCommandList::ResolveQueryData (d3d12.h)

Extrai dados de uma consulta. ResolveQueryData funciona com todos os tipos de heap (padrão, upload e readback).

Sintaxe

void ResolveQueryData(
  [in] ID3D12QueryHeap  *pQueryHeap,
  [in] D3D12_QUERY_TYPE Type,
  [in] UINT             StartIndex,
  [in] UINT             NumQueries,
  [in] ID3D12Resource   *pDestinationBuffer,
  [in] UINT64           AlignedDestinationBufferOffset
);

Parâmetros

[in] pQueryHeap

Tipo: ID3D12QueryHeap*

Especifica a ID3D12QueryHeap que contém as consultas a resolve.

[in] Type

Tipo: D3D12_QUERY_TYPE

Especifica o tipo de consulta, um membro do D3D12_QUERY_TYPE.

[in] StartIndex

Tipo: UINT

Especifica um índice da primeira consulta a ser resolve.

[in] NumQueries

Tipo: UINT

Especifica o número de consultas a resolve.

[in] pDestinationBuffer

Tipo: ID3D12Resource*

Especifica um buffer de destino ID3D12Resource , que deve estar no estado D3D12_RESOURCE_STATE_COPY_DEST.

[in] AlignedDestinationBufferOffset

Tipo: UINT64

Especifica um deslocamento de alinhamento para o buffer de destino. Deve ser um múltiplo de 8 bytes.

Retornar valor

Nenhum

Comentários

ResolveQueryData executa uma operação em lote que grava dados de consulta em um buffer de destino. Os dados de consulta são gravados contíguamente no buffer de destino e no parâmetro .

ResolveQueryData transforma dados de consulta opacos do aplicativo em um heap de consulta opaco de aplicativo em valores independentes do adaptador utilizáveis pelo aplicativo. Resolver consultas em um heap que não foram concluídas (portanto, tiveram ID3D12GraphicsCommandList::BeginQuery chamado para elas, mas não ID3D12GraphicsCommandList::EndQuery) ou que foram não inicializadas, resulta em comportamento indefinido e pode causar travamentos ou remoção do dispositivo. A camada de depuração emitirá um erro se detectar que um aplicativo resolveu consultas incompletas ou não inicializadas.

Observação

Resolver consultas incompletas ou não inicializadas é um comportamento indefinido porque o driver pode armazenar internamente GPUVAs ou outros dados em consultas não resolvidas. E assim, tentar resolve essas consultas em dados não inicializados pode causar uma falha de página ou travamento do dispositivo. Versões mais antigas da camada de depuração não validaram esse comportamento.

As consultas de oclusão binárias gravam 64 bits por consulta. O bit menos significativo é 0 (o objeto foi totalmente ccluded) ou 1 (pelo menos 1 amostra do objeto teria sido desenhada). O restante dos bits são 0. As consultas de oclusão gravam 64 bits por consulta. O valor é o número de amostras que passaram no teste. As consultas de carimbo de data/hora gravam 64 bits por consulta, que é um valor de escala que deve ser comparado com a respectiva frequência de fila de comandos (consulte Timing).

As consultas de estatísticas de pipeline gravam uma estrutura de D3D12_QUERY_DATA_PIPELINE_STATISTICS por consulta. Todas as consultas de estatísticas de stream-out gravam uma estrutura de D3D12_QUERY_DATA_SO_STATISTICS por consulta.

O runtime principal validará o seguinte.

  • StartIndex e NumQueries estão dentro do intervalo.
  • AlignedDestinationBufferOffset é um múltiplo de 8 bytes.
  • DestinationBuffer é um buffer.
  • Os dados gravados não estourarão o buffer de saída.
  • O tipo de consulta deve ser compatível com o tipo de lista de comandos.
  • O tipo de consulta deve ser compatível com o heap de consulta.

A camada de depuração emitirá um aviso se o buffer de destino não estiver no estado D3D12_RESOURCE_STATE_COPY_DEST ou se alguma consulta que estiver sendo resolvida não tiver tido ID3D12GraphicsCommandList::EndQuery chamado neles.

Exemplos

O exemplo D3D12PredicationQueries usa ID3D12GraphicsCommandList::ResolveQueryData da seguinte maneira:

// 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());
}

Consulte Código de exemplo na referência D3D12.

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho d3d12.h
Biblioteca D3d12.lib
DLL D3d12.dll

Confira também

ID3D12GraphicsCommandList