Поделиться через


Запросы

В Direct3D 12 запросы группируются в массивы запросов, которые называются кучей запросов. Куча запросов имеет тип, определяющий допустимые типы запросов, которые можно использовать с этой кучей.

Различия в запросах от Direct3D 11 до Direct3D 12

Следующие типы запросов больше не присутствуют в Direct3D 12, их функциональные возможности включены в другие процессы:

  • Запросы событий — функциональное событие теперь обрабатывается ограждениями.
  • Несвязанные запросы меток времени — часы GPU могут быть установлены в стабильном состоянии в Direct3D 12 (см. раздел "Время "). Сравнение часов GPU не имеет смысла, если GPU бездействует между метками времени (это называется несвязанным запросом). При стабильной мощности два запроса метки времени, выданные из разных списков команд, надежно сопоставимы. Две метки времени в одном списке команд всегда надежно сопоставимы.
  • Запросы потоковой статистики выходных данных . В Direct3D 12 нет запроса на переполнение одного потока (SO) для всех потоков вывода. Приложения должны выдавать несколько однопоточных запросов, а затем сопоставлять результаты.
  • Запросы предиката выходной статистики потоковой передачи и предиката окклюзии . Запросы (которые записывают в память) и Предикат (который считывает из памяти) больше не связаны, поэтому эти типы запросов не требуются.

В Direct3D 12 добавлен новый тип запроса двоичной окклюзии. Это позволяет стратегиям предикации, которые заботятся только о том, был ли объект полностью или нет окклюдирован (а не сколько пикселей было закреплено), указывать на это устройство, которое может быть в состоянии более эффективно выполнять запросы.

Кучи запросов

Запросы могут быть одним из нескольких типов (D3D12_QUERY_HEAP_TYPE) и группироваться в кучу запросов перед отправкой в GPU.

Новый тип запроса D3D12_QUERY_TYPE_BINARY_OCCLUSION доступен и действует как D3D12_QUERY_TYPE_OCCLUSION за исключением того, что он возвращает двоичный результат 0/1: 0 указывает, что ни один пример не прошел проверку глубины и набора элементов, 1 указывает, что по крайней мере один пример прошел проверку глубины и набора элементов. Это позволяет запросам occlusion не мешать оптимизации производительности GPU, связанной с тестированием глубины или набора элементов.

Создание кучи запросов

API, относящиеся к созданию кучи запросов, — это D3D12_QUERY_HEAP_TYPE перечисления, D3D12_QUERY_HEAP_DESC структуры и метод CreateQueryHeap.

Базовая среда выполнения проверит, что тип кучи запроса является допустимым членом перечисления D3D12_HEAP_TYPE и что счетчик больше 0.

Каждый отдельный элемент запроса в куче запросов можно запускать и останавливать отдельно.

Api для использования кучи запросов — это D3D12_QUERY_TYPE перечисления и методы BeginQuery и EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP — единственный запрос, поддерживающий только EndQuery . Для всех остальных типов запросов требуются BeginQuery и EndQuery.

Уровень отладки проверит следующее:

  • Запуск запроса метки времени является недопустимым— его можно только завершить.
  • Недопустимо начинать запрос дважды, не завершая его (для заданного элемента). Для запросов, требующих как начала, так и завершения, невозможно завершить запрос до соответствующего начала (для заданного элемента).
  • Тип запроса, передаваемый в BeginQuery, должен соответствовать типу запроса, переданного в EndQuery.

Базовая среда выполнения проверит следующее:

  • Метод BeginQuery не может быть вызван в запросе метки времени.

  • Для типов запросов, поддерживающих beginQuery и EndQuery (все, кроме метки времени), запрос для заданного элемента не должен охватывать границы списка команд.

  • ElementIndex должен находиться в пределах диапазона.

  • Тип запроса является допустимым членом перечисления D3D12_QUERY_TYPE .

  • Тип запроса должен быть совместим с кучей запросов. В следующей таблице показан тип кучи запроса, необходимый для каждого типа запроса:

    Тип запроса Тип кучи запроса
    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

     

  • Тип запроса поддерживается типом списка команд. В следующей таблице показано, какие запросы поддерживаются для типов списков команд.

    Тип запроса Поддерживаемые типы списков команд
    D3D12_QUERY_TYPE_OCCLUSION Прямой доступ
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Прямой доступ
    D3D12_QUERY_TYPE_TIMESTAMP Прямая, вычислительная и при необходимости копирование
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Прямой доступ
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Прямой доступ
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Прямой доступ
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Прямой доступ
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Прямой доступ

     

Извлечение данных из запроса

Для извлечения данных из запроса используется метод ResolveQueryData . ResolveQueryData работает со всеми типами памяти (системной или локальной памятью устройства), но требует, чтобы целевой ресурс был в D3D12_RESOURCE_STATE_COPY_DEST.