Consultas
No Direct3D 12, as consultas são agrupadas em matrizes de consultas chamadas heap de consulta. Um heap de consulta tem um tipo que define os tipos válidos de consultas que podem ser usados com esse heap.
- Diferenças nas consultas do Direct3D 11 para o Direct3D 12
- Pilhas de consulta
- Criando heaps de consulta
- Extraindo dados de um de consulta
- Tópicos relacionados
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, sendo sua funcionalidade incorporada a outros processos:
- Consultas de eventos - o evento funcionalmente agora é tratado por cercas.
- Consultas de carimbo de data/hora separadas - os relógios GPU podem ser definidos para um estado estável no Direct3D 12 (consulte a seção de temporização). As comparações de clock da GPU não são significativas se a GPU estiver ociosa entre os carimbos de data/hora (conhecida como consulta separada). Com potência estável, duas consultas de carimbo de data/hora emitidas a partir de diferentes listas de comandos são comparáveis de forma confiável. Dois carimbos de data/hora dentro da mesma lista de comandos são sempre comparáveis de forma confiável.
- Consultas de estatísticas de saída de fluxo - no Direct3D 12 não há 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, em seguida, correlacionar os resultados.
- Predicado de estatísticas de saída de fluxo e consultas de predicado de oclusão - consultas (que gravam na memória) e de predicação (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 predicação que se importam apenas se um objeto foi totalmente ocluído ou não (em vez de quantos pixels foram ocluídos) para indicar isso ao dispositivo, que pode ser capaz de executar as consultas de forma mais eficiente.
Pilhas de consulta
As consultas podem ser 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 age como D3D12_QUERY_TYPE_OCCLUSION exceto que retorna um resultado binário 0/1: 0 indica que nenhuma amostra passou no teste de profundidade e estêncil, 1 indica que pelo menos uma amostra passou no teste de profundidade e estêncil. Isso permite que as consultas de oclusão não interfiram com nenhuma otimização de desempenho da GPU associada ao teste de profundidade/estêncil.
Criando pilhas de consulta
As APIs relevantes para a criação de heaps de consulta são o enum D3D12_QUERY_HEAP_TYPE, o struct D3D12_QUERY_HEAP_DESCe o método CreateQueryHeap.
O tempo de execução principal validará se o tipo de heap de consulta é um membro válido da enumeração D3D12_HEAP_TYPE e se a contagem é maior que 0.
Cada elemento de consulta individual dentro de um heap de consulta pode ser iniciado e interrompido separadamente.
As APIs para usar os heaps de consulta são o enum D3D12_QUERY_TYPEe os métodos BeginQuery e EndQuery.
D3D12_QUERY_TYPE_TIMESTAMP é a única consulta que suporta apenas EndQuery. Todos os outros tipos de consulta requerem BeginQuery e EndQuery.
A camada de depuração validará o seguinte:
- É ilegal iniciar uma consulta de carimbo de data/hora — você só pode terminá-la
- É ilegal iniciar uma consulta duas vezes sem terminá-la (para um determinado elemento). Para consultas que exigem início e fim, é ilegal 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 tempo de execução principal validará o seguinte:
BeginQuery não pode ser chamado em uma consulta de carimbo de data/hora.
Para os tipos de consulta que suportam BeginQuery e EndQuery (todos, exceto para 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 do D3D12_QUERY_TYPE enum.
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 pilha 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 é suportado pelo tipo de lista de comandos. A tabela a seguir mostra quais consultas são suportadas em quais tipos de lista de comandos.
Tipo de consulta Tipos de lista de comandos suportados D3D12_QUERY_TYPE_OCCLUSION Direto D3D12_QUERY_TYPE_BINARY_OCCLUSION Direto D3D12_QUERY_TYPE_TIMESTAMP Direto, Computação e, opcionalmente, Copiar 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 requer que o recurso de destino esteja em D3D12_RESOURCE_STATE_COPY_DEST.