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


Запросов

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

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

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

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

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

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

Запросы могут быть одним из нескольких типов (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.