Compartilhar via


Consultas

No Direct3D 12, as consultas são agrupadas em matrizes de consultas chamadas de heap de consulta. Um heap de consulta tem um tipo que define os tipos válidos de consultas que podem ser usadas com esse heap.

Diferenças nas consultas do Direct3D 11 para o Direct3D 12

Os seguintes tipos de consulta não estão mais presentes no Direct3D 12, sua funcionalidade sendo incorporada a outros processos:

  • Consultas de evento – o evento funcionalmente agora é tratado por cercas.
  • Consultas de carimbo de data/hora não contíguas – os relógios de GPU podem ser definidos como um estado estável no Direct3D 12 (consulte a seção Timing ). As comparações de relógio de GPU não serão significativas se a GPU estiver ociosa entre os carimbos de data/hora (conhecidos como uma consulta desarticulada). Com o poder estável, duas consultas de carimbo de data/hora emitidas de listas de comandos diferentes são confiáveis comparáveis. Dois carimbos de data/hora na mesma lista de comandos são sempre confiáveis comparáveis.
  • Consultas de estatísticas de saída de fluxo – no Direct3D 12 não há nenhuma consulta de estouro de saída de fluxo único (SO) para todos os fluxos de saída. Os aplicativos precisam emitir várias consultas de fluxo único e correlacionar os resultados.
  • As consultas de predicado de estatísticas de saída de fluxo e predicado de oclusão – consultas (que gravam na memória) e Predication (que lê da memória) não são mais acopladas e, portanto, esses tipos de consulta não são necessários.

Um novo tipo de consulta de oclusão binária foi adicionado ao Direct3D 12. Isso permite estratégias de precatório que se importam apenas se um objeto foi totalmente ocluído ou não (em vez de quantos pixels foram ccluded) para indicar isso para o dispositivo, o que pode ser capaz de executar as consultas com mais eficiência.

Heaps de consulta

As consultas podem ser uma de vários tipos (D3D12_QUERY_HEAP_TYPE) e são agrupadas em heaps de consulta antes de serem enviadas para a GPU.

Um novo tipo de consulta D3D12_QUERY_TYPE_BINARY_OCCLUSION está disponível e atua como D3D12_QUERY_TYPE_OCCLUSION exceto que retorna um resultado binário de 0/1: 0 indica que nenhuma amostra passou por testes de profundidade e estêncil, 1 indica que pelo menos uma amostra passou por testes de profundidade e estêncil. Isso permite que as consultas de oclusão não interfiram em nenhuma otimização de desempenho de GPU associada ao teste de profundidade/estêncil.

Criando heaps de consulta

As APIs relevantes para criar heaps de consulta são a enumeração D3D12_QUERY_HEAP_TYPE, o struct D3D12_QUERY_HEAP_DESC e o método CreateQueryHeap.

O runtime principal validará se o tipo de heap de consulta é um membro válido da enumeração D3D12_HEAP_TYPE e que a contagem é maior que 0.

Cada elemento de consulta individual em um heap de consulta pode ser iniciado e interrompido separadamente.

As APIs para usar os heaps de consulta são a enumeração D3D12_QUERY_TYPE e os métodos BeginQuery e EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP é a única consulta que dá suporte apenas ao EndQuery . Todos os outros tipos de consulta exigem BeginQuery e EndQuery.

A camada de depuração validará o seguinte:

  • É inválido iniciar uma consulta de carimbo de data/hora. Você só pode acabar com ela
  • É inválido iniciar uma consulta duas vezes sem encerrá-la (para um determinado elemento). Para consultas que exigem início e término, é inválido encerrar uma consulta antes do início correspondente (para um determinado elemento).
  • O tipo de consulta passado para BeginQuery deve corresponder ao tipo de consulta passado para EndQuery.

O runtime principal validará o seguinte:

  • BeginQuery não pode ser chamado em uma consulta de carimbo de data/hora.

  • Para os tipos de consulta que dão suporte a BeginQuery e EndQuery (todos com exceção do carimbo de data/hora), uma consulta para um determinado elemento não deve abranger os limites da lista de comandos.

  • ElementIndex deve estar dentro do intervalo.

  • O tipo de consulta é um membro válido da enumeração D3D12_QUERY_TYPE .

  • O tipo de consulta deve ser compatível com o heap de consulta. A tabela a seguir mostra o tipo de heap de consulta necessário para cada tipo de consulta:

    Tipo de consulta Tipo de heap de consulta
    D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS

     

  • O tipo de consulta é compatível com o tipo de lista de comandos. A tabela a seguir mostra quais consultas têm suporte em quais tipos de lista de comandos.

    Tipo de consulta Tipos de lista de comandos com suporte
    D3D12_QUERY_TYPE_OCCLUSION Direto
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Direto
    D3D12_QUERY_TYPE_TIMESTAMP Direct, Compute e, opcionalmente, Copy
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Direto
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Direto
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Direto
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Direto
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Direto

     

Extraindo dados de uma consulta

A maneira de extrair dados de uma consulta é usar o método ResolveQueryData . ResolveQueryData funciona com todos os tipos de memória (sejam eles memória do sistema ou memória local do dispositivo), mas exige que o recurso de destino esteja em D3D12_RESOURCE_STATE_COPY_DEST.