Расширенное использование таблиц дескрипторов
В следующих разделах содержатся сведения о расширенном использовании таблиц дескрипторов.
- Изменение записей таблицы дескриптора между вызовами отрисовки
- Индексирование за пределы границ
- Производные шейдеров и дивергентное индексирование
- Связанные темы
Изменение записей таблицы дескриптора между вызовами отрисовки
После отправки списков команд, задающих таблицы дескрипторов, в очередь для выполнения приложение не должно изменять с ЦП части кучи дескрипторов, на которые может ссылаться GPU, пока приложение не узнает, что GPU завершил использование ссылок.
Завершение работы можно определить на жестком уровне с помощью заборов API для отслеживания хода выполнения GPU или более грубых механизмов, таких как ожидание, чтобы увидеть, что отрисовка была отправлена на отображение - независимо от того, что подходит приложению. Если приложению известно, что будет доступен только подмножество региона, на которое указывает таблица дескриптора (например, из-за управления потоком в шейдере), другие дескрипторы без ссылок по-прежнему могут быть изменены. Если приложению требуется переключаться между разными таблицами дескрипторов между вызовами отрисовки, существует несколько подходов, которые приложение может выбрать:
- Управление версиями таблицы дескрипторов. Создайте (или повторно используйте) отдельную таблицу дескрипторов для каждой уникальной коллекции дескрипторов, на которую должен ссылаться список команд. При редактировании и повторном использовании ранее заполненных областей в кучах дескрипторов приложения должны сначала убедиться, что GPU завершил использование любой части кучи дескриптора, которая будет переработана.
- Динамическое индексирование. Приложения могут упорядочивать объекты, которые зависят от рисования и отправки (или даже в пределах отрисовки), в диапазоне кучи дескриптора, определить таблицу дескриптора, которая охватывает все из них, а также использовать динамическое индексирование таблицы во время выполнения шейдера, чтобы выбрать объект для использования.
- Размещение дескрипторов в корневой сигнатуре напрямую. Таким образом можно управлять только очень небольшим количеством дескрипторов, так как пространство корневой сигнатуры ограничено.
Использование управления версиями таблиц дескрипторов заключается в том, что память дескриптора из кучи дескриптора должна быть записана для каждого уникального набора дескрипторов, на которые ссылается графический конвейер, для каждого списка команд, который может выполняться, помещать в очередь для выполнения или записываться в любой момент времени.
D3D12 возлагает ответственность за управление версиями на приложение для типов объектов, управляемых с помощью кучи дескриптора и таблиц дескрипторов. Одним из преимуществ этого является то, что приложения могут использовать содержимое таблицы дескриптора как можно больше, а не всегда определять новую версию таблицы дескриптора для каждой отправки списка команд. Корневая сигнатура — это пространство, которое драйвер D3D12 автоматически обновляет.
Возможность одновременной привязки нескольких таблиц дескрипторов к корневой сигнатуре (и, следовательно, к конвейеру) позволяет приложениям группировать и переключать наборы ссылок на дескриптор с разной частотой. Например, приложение может использовать небольшое количество (возможно, только одну) больших таблиц статических дескрипторов, которые редко изменяются, или в которых области в базовой памяти кучи дескриптора заполняются по мере необходимости с использованием динамического индексирования из шейдера для выбора текстур. В то же время приложение может поддерживать другой класс ресурсов, где набор, на который ссылается каждый вызов draw, переключается с ЦП с помощью метода управления версиями таблицы дескриптора.
Индексирование за пределы границ
Вне пределов индексирования любой таблицы дескрипторов из шейдера приводит к в значительной степени неопределенному доступу к памяти, включая возможность считывания произвольной внутрипроцессной памяти, как если бы это дескриптор состояния оборудования, и жизнь с последствиями того, что оборудование делает с этим. Это может привести к сбросу устройства, но не приведет к аварийному сбою Windows.
Производные шейдеров и дивергентное индексирование
Если вызовы пиксельного шейдера, выполняемые в метке 2x2 (для поддержки производных вычислений), выбирают различные индексы текстуры для выборки из таблицы дескриптора, а для выбранной конфигурации и текстуры для любого заданного пикселя требуется вычисление LOD на основе производных от координат текстуры, то процесс вычисления и выборки текстуры выполняется оборудованием независимо для каждого поиска текстуры в метке 2x2. что повлияет на производительность.
Связанные темы