Запросов
В Direct3D 12 запросы группируются в массивы запросов, называемых кучей запросов. Куча запросов имеет тип, определяющий допустимые типы запросов, которые можно использовать с этой кучей.
- различия в запросах от Direct3D 11 до 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.
Связанные разделы
- счетчики и запросы
- запросы предикаций пошаговые