Общие сведения о кучах дескрипторов
Кучи дескриптора содержат множество типов объектов, которые не являются частью объекта состояния конвейера (PSO), такие как представления ресурсов шейдера (SRV), неупорядоченные представления доступа (UAV), представления буфера констант (CBV) и выборки.
- Назначение кучи дескриптора
- Синхронизация
- Привязка
- Переключение кучи
- Пакеты
- Управление
- Связанные темы
Назначение кучи дескриптора
Основная цель кучи дескрипторов заключается в том, чтобы охватить большую часть памяти, необходимую для хранения спецификаций дескриптора типов объектов, которые шейдеры ссылают на как можно большую часть окна отрисовки (в идеале — весь кадр отрисовки или более). Если приложение переключает текстуры, которые конвейер быстро видит из API, в куче дескрипторов должно быть место для определения таблиц дескрипторов на лету для каждого необходимого набора состояний. Приложение может повторно использовать определения, если ресурсы снова используются в другом объекте, например, или просто назначить пространство кучи последовательно при переключениях различных типов объектов.
Кучи дескрипторов также позволяют отдельным программным компонентам управлять хранилищем дескрипторов отдельно друг от друга.
Все кучи видны ЦП. Приложение также может запрашивать свойства доступа к ЦП, которые должны иметь куча дескриптора (если таковые имеются) — запись в сочетании, обратная запись и т. д. Приложения могут создавать любое количество кучи дескрипторов с любыми нужными свойствами. Приложения всегда могут создавать кучи дескрипторов, предназначенные исключительно для промежуточных целей, размер которых не ограничен, и копирование в кучи дескриптора, которые используются для отрисовки при необходимости.
Существуют некоторые ограничения в том, что может происходить в той же куче дескрипторов. Записи CBV, UAV и SRV могут находиться в одной куче дескрипторов. Однако записи выборки не могут совместно использовать кучу с записями CBV, UAV или SRV. Как правило, существует два набора кучи дескриптора: один для общих ресурсов, а второй — для образцов.
Использование кучи дескриптора в Direct3D 12 отражает то, что делает большинство оборудования GPU, то есть требует, чтобы дескрипторы работали только в кучах дескрипторов, или просто требуется меньше битов адресации, если используются эти кучи. Direct3D 12 требует использования кучи дескриптора, нет возможности разместить дескрипторы в любом месте в памяти.
Кучи дескрипторов могут быть отредактированы только ЦП немедленно. Нет возможности изменить кучу дескрипторов с помощью GPU.
Синхронизация
Содержимое кучи дескрипторов можно изменять до, во время и после записи списков команд, ссылающихся на него. Однако дескрипторы нельзя изменить, а список команд, отправленный для выполнения, может ссылаться на это расположение, так как это может вызвать состояние гонки.
Привязка
Не более одной объединенной кучи CBV/SRV/UAV и одной кучи Sampler можно привязать в любой момент времени. Эти кучи совместно используются как графическими, так и вычислительными конвейерами (описанными в их ППО).
Переключение кучи
Приложение может переключать кучи в одном или разных списках команд с помощью API SetDescriptorHeaps и Reset . На некоторых оборудованиях это может быть дорогостоящей операцией, требующей остановки GPU для очистки всех работ, которые зависят от текущей связанной кучи дескриптора. В результате, если необходимо изменить кучу дескриптора, приложения должны попытаться сделать это, если рабочая нагрузка GPU относительно легкая, возможно, ограничивает изменения в начале списка команд.
Пакеты
При использовании пакетов может быть только один вызов метода SetDescriptorHeaps , и набор кучи дескриптора должен точно соответствовать набору команд, вызывающих пакет. Если пакет не изменяет таблицы дескрипторов, ему не нужно задавать кучи дескриптора.
Список вызовов API, которые нельзя использовать с пакетами, см. в статье Создание и запись списков команд и пакетов.
Управление
Для отрисовки всех объектов в сцене потребуется много дескрипторов, и существуют различные стратегии управления, которые можно использовать.
Основная стратегия заключается в заполнении новой области кучи дескриптора всеми требованиями для следующего вызова draw. Таким образом, непосредственно перед вызовом draw в списке команд указатель таблицы дескриптора будет установлен в начало только что заполненной таблицы. Недостатком является то, что нет необходимости регистрировать, где какой-либо конкретный дескриптор находится в куче.
Недостаток этой стратегии заключается в том, что в куче дескрипторов может быть много повторений дескрипторов, особенно при отрисовке очень похожей сцены, и это пространство кучи дескриптора будет использовано быстро. Чтобы избежать конфликтов, вероятно, потребуется отдельная куча дескрипторов для тех, которые отрисовываются на GPU, и для тех, которые записываются ЦП. Кроме того, можно использовать систему подраспредела.
Кроме того, базовую систему можно дополнительно оптимизировать путем тщательного использования перекрывающихся таблиц дескрипторов от одного вызова draw к следующему, чтобы добавлять только новые необходимые дескрипторы.
Более эффективная стратегия, чем базовая, заключается в предварительном заполнении кучи дескрипторов дескрипторов, необходимых для объектов (или материалов), которые, как известно, являются частью сцены. Идея заключается в том, что необходимо задать таблицу дескриптора только во время рисования, так как куча дескриптора заполняется заранее.
Вариант стратегии предварительного заполнения заключается в том, чтобы рассматривать кучу дескриптора как один огромный массив, содержащий все необходимые дескрипторы в фиксированных известных расположениях. Затем вызов draw должен только получить набор констант, которые являются индексами в массиве , где необходимо использовать дескрипторы.
Дальнейшая оптимизация заключается в том, чтобы корневые константы и дескрипторы содержали те, которые чаще всего изменяются, а не помещают константы в кучу дескриптора. Для большинства оборудования это эффективный способ обработки констант.
На практике графический обработчик может использовать другую стратегию в разных ситуациях и объединять элементы каждой стратегии в соответствии с конкретными требованиями к рисованию.
Связанные темы