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


Общие сведения о дескрипторных кучах

Кучи дескрипторов содержат множество типов объектов, которые не являются частью объекта состояния конвейера (PSO), таких как представления ресурсов шейдера (SRVs), неупорядоченные представления доступа (UAVs), константные буферные представления (CBVs) и сэмплеры.

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

Основная цель кучи дескрипторов заключается в управлении значительными объемами памяти, необходимыми для хранения спецификаций дескрипторов типов объектов, на которые шейдеры ссылаются в течение максимально возможного времени отрисовки (в идеале для целого кадра или более). Если приложение быстро переключает видимые API текстуры конвейера, необходимо иметь место в дескрипторной куче, чтобы динамически определять таблицы дескрипторов для каждого необходимого состояния. Приложение может повторно использовать определения, если, например, ресурсы снова применяются в другом объекте, или просто последовательно назначать пространство кучи по мере переключения различных типов объектов.

Кучи дескриптора также позволяют отдельным компонентам программного обеспечения управлять хранилищем дескрипторов отдельно друг от друга.

Все кучы видны ЦП. Приложение также может запросить, какие свойства доступа к ЦП должна иметь куча дескрипторов (если они есть) — объединённая запись, запись с обратной записью и т. д. Приложения могут создавать столько кучи дескрипторов, сколько угодно, с любыми нужными свойствами. Приложения всегда могут создавать кучи дескрипторов, предназначенные исключительно для промежуточных стадий, не ограниченные размером, и при необходимости копировать в кучи дескрипторов, используемые для отрисовки.

Есть некоторые ограничения на то, что может включаться в тот же дескрипторный куч. Записи CBV, UAV и SRV могут находиться в одной куче дескриптора. Однако записи самплеров не могут использовать одну кучу вместе с записями CBV, UAV или SRV. Как правило, существует два набора куч дескрипторов: один для общих ресурсов и второй для сэмплеров.

Использование куч дескрипторов в Direct3D 12 похоже на то, что делает большинство оборудования GPU, то есть, чтобы дескрипторы находились только в кучах дескрипторов, или лишь меньше битов адресации требуется, если эти кучи используются. Direct3D 12 требует использования куч дескрипторов, что исключает возможность размещения дескрипторов в произвольном месте памяти.

Кучи дескрипторов могут изменяться только с помощью ЦП, у ГП нет возможности их редактировать.

Синхронизация

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

Связывание

Не более одной объединённой кучи CBV/SRV/UAV и одной кучи сэмплеров может быть привязано в любой момент времени. Эти кучи ресурсов используются как графическим, так и вычислительным конвейером, описанным в их PSOs.

Переключение куч

Приложение может переключать кучи в одном списке команд или в разных списках с помощью SetDescriptorHeaps и Reset API. На некотором оборудовании это может быть дорогостоящая операция, требующая остановки GPU для сброса всех операций, зависящих от в настоящее время используемой кучи дескрипторов. Таким образом, если необходимо изменить кучи дескрипторов, приложения должны попытаться сделать это, когда рабочая нагрузка на GPU относительно небольшая, возможно, ограничив изменения началом списка команд.

Пакеты

При использовании пакетов может быть только один вызов метода SetDescriptorHeaps, а набор кучи дескрипторов должны совпадать с набором команд, вызывающим пакет. Если пакет не изменяет таблицы дескрипторов, не нужно задавать кучи дескрипторов.

Список вызовов API, которые нельзя использовать с пакетами, смотрите в разделе Создание и запись списков команд и пакетов.

Управление

Для отрисовки всех объектов в сцене потребуется множество дескрипторов, и есть несколько различных стратегий управления, которые можно использовать.

Самая простая стратегия заключается в том, чтобы заполнить новую область кучи дескрипторов всеми требованиями для следующего вызова рисования. Таким образом, незадолго до выдачи вызова рисования в списке команд указатель таблицы дескриптора будет установлен в начало новой заполненной таблицы. Преимущество заключается в том, что нет необходимости фиксировать, где находится какой-либо конкретный дескриптор в куче.

Недостатком этой стратегии является то, что может быть много повторений дескрипторов в дескрипторной куче, особенно когда рендерится очень похожая сцена, и пространство дескрипторной кучи быстро истощается. Отдельные кучи дескрипторов для тех, что рендерятся на GPU, и для тех, которые записываются на ЦП, вероятно, потребуются, чтобы избежать конфликтов. Кроме того, можно использовать систему субраспределения.

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

Более эффективная стратегия, чем базовая, заключается в том, чтобы предварительно заполнить кучи дескриптора с дескрипторами, необходимыми для объектов (или материалов), которые, как известно, являются частью сцены. Идея заключается в том, что необходимо задать только таблицу дескриптора во время рисования, так как куча дескриптора заполняется заранее.

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

Дальнейшая оптимизация заключается в том, чтобы корневые константы и корневые дескрипторы содержали те, которые чаще всего изменяются, а не помещают константы в кучу дескриптора. Для большинства оборудования это эффективный способ обработки констант.

На практике графический механизм может использовать другую стратегию в разных ситуациях и объединять элементы каждой стратегии в соответствии с конкретными требованиями к рисованию.

кучи дескрипторов