Интервал времени (графика Direct3D 12)
В этом разделе рассматриваются запросы меток времени и калибровка счетчиков меток времени GPU и ЦП.
Частота метки времени
Приложение может запрашивать частоту метки времени GPU для каждой очереди команд (см. метод ID3D12CommandQueue::GetTimestampFrequency ).
Возвращаемая частота измеряется в Гц (тактов/с). Если указанная очередь команд не поддерживает метки времени (см. таблицу в разделе Запросы ), этот API завершается ошибкой (и возвращает E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT и D3D12_COMMAND_LIST_TYPE_COMPUTE всегда поддерживают метки времени. D3D12_COMMAND_LIST_TYPE_COPY при необходимости поддерживает метки времени, если элемент D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported имеет значение TRUE.
Калибровка метки времени
D3D12 позволяет приложениям сопоставлять результаты, полученные из запросов меток времени, с результатами, полученными при вызове QueryPerformanceCounter
. Это включается вызовом ID3D12CommandQueue::GetClockCalibration.
Выборка метки времени выполняется gpuом в момент завершения работы gpu со всеми предыдущими рабочими нагрузками. Это то же поведение, что и Direct3D 11 (см. D3D11_QUERY_TIMESTAMP в функциональной спецификации Direct3D 11.3 на GitHub). Это означает, что запросы меток времени являются операцией BOP в Direct3D 12.
GetClockCalibration выполняет выборку счетчика меток времени GPU для заданной очереди команд и выполняет выборку счетчика QueryPerformanceCounter
ЦП практически в одно и то же время. Снова этот API завершается ошибкой (возвращает E_FAIL), если указанная очередь команд не поддерживает метки времени (см. таблицу в разделе Запросы ).
Обратите внимание, что счетчики меток времени GPU и ЦП не обязательно напрямую связаны с тактовой частотой этих процессоров, а работают на основе меток времени.
Запросы меток времени
Метки времени можно получить как часть списка команд (а не вызова на стороне ЦП в очереди команд) с помощью запросов меток времени. (Дополнительные сведения о запросах в целом см. в разделе Запросы .
Все запросы меток времени используют тип D3D12_QUERY_TYPE_TIMESTAMP для фактического запроса. Однако из-за аппаратных ограничений D3D12_COMMAND_LIST_TYPE_DIRECT и D3D12_COMMAND_LIST_TYPE_COMPUTE использовать D3D12_QUERY_HEAP_TYPE, отличные от D3D12_COMMAND_LIST_TYPE_COPY.
Прямые и вычислительные очереди используют D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
Очереди копирования используют D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
Запросы очереди копирования поддерживаются, только если элемент D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported имеет значение TRUE.
Запросы меток времени, после разрешения с помощью ID3D12GraphicsCommandList::ResolveQueryData, представляют собой такты, возвращаемые ID3D12CommandQueue::GetClockCalibration, и поэтому они должны быть разделены на частоту очереди, чтобы получить длину в секундах.
Важно!
Для точности используйте арифметику с плавающей запятой при вычислении интервалов секунд или миллисекунд меток времени. Например, используйте queriedTicks / (double)Frequency
вместо queriedTicks / Frequency
.