Tempo (Elementos gráficos do Direct3D 12)
Esta seção aborda a consulta de carimbos de data/hora e a calibragem dos contadores de carimbo de data/hora da GPU e da CPU.
Seu aplicativo pode consultar a frequência de carimbo de data/hora da GPU por fila por comando (consulte o método ID3D12CommandQueue::GetTimestampFrequency ).
A frequência retornada é medida em Hz (tiques/s). Se a fila de comandos especificada não oferecer suporte a carimbos de data/hora (consulte a tabela na seção Consultas ), essa API falhará (e retornará E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE sempre dão suporte a carimbos de data/hora. D3D12_COMMAND_LIST_TYPE_COPY opcionalmente dá suporte a carimbos de data/hora se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported for TRUE.
O D3D12 permite que os aplicativos correlacionem os resultados obtidos de consultas de carimbo de data/hora com os resultados obtidos da chamada QueryPerformanceCounter
. Isso é habilitado pela chamada ID3D12CommandQueue::GetClockCalibration.
Um carimbo de data/hora é amostrado pela GPU no momento em que a GPU é concluída com toda a carga de trabalho anterior. É o mesmo comportamento adotado pelo Direct3D 11 (consulte D3D11_QUERY_TIMESTAMP na Especificação Funcional do Direct3D 11.3 no GitHub). Isso significa que as consultas de carimbo de data/hora são uma operação bop (inferior de pipe) no Direct3D 12.
GetClockCalibration amostra o contador de carimbo de data/hora de GPU para uma determinada fila de comandos e amostra o contador de CPU por meio QueryPerformanceCounter
de quase ao mesmo tempo. Novamente, essa API falhará (retornando E_FAIL) se a fila de comandos especificada não oferecer suporte a carimbos de data/hora (consulte a tabela no tópico Consultas ).
Observe que os contadores de carimbo de data/hora de GPU e CPU não estão necessariamente diretamente relacionados à velocidade do relógio desses processadores, mas funcionam com tiques de carimbo de data/hora.
Você pode obter carimbos de data/hora como parte de uma lista de comandos (em vez de uma chamada do lado da CPU em uma fila de comandos) por meio de consultas de carimbo de data/hora. (Consulte Consultas para obter mais informações sobre consultas em geral).
Todas as consultas de carimbo de data/hora usam o tipo D3D12_QUERY_TYPE_TIMESTAMP para a consulta real. No entanto, devido a limitações de hardware, D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE usam um D3D12_QUERY_HEAP_TYPE diferente daquele que D3D12_COMMAND_LIST_TYPE_COPY usa.
As filas diretas e de computação usam D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
As filas de cópia usam D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
As consultas de fila de cópia só têm suporte se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported for TRUE.
As consultas de carimbo de data/hora, uma vez resolvidas por meio de ID3D12GraphicsCommandList::ResolveQueryData, são um UINT64 que representa tiques, conforme retornado por ID3D12CommandQueue::GetClockCalibration e, como tal, devem ser divididas pela frequência da fila para obter o comprimento em segundos.
Importante
Para precisão, use aritmética de ponto flutuante ao calcular intervalos de segundo ou milissegundos de carimbos de data/hora. Por exemplo, use queriedTicks / (double)Frequency
ao invés de queriedTicks / Frequency
.