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


Использование дескрипторов непосредственно в корневой сигнатуре

Чтобы избежать необходимости пройти через кучу дескриптора, можно поместить дескриптор непосредственно в корневую подпись. Эти дескрипторы занимают много места в корневой сигнатуре (см. ограничения корневой подписи), поэтому рекомендуется использовать их экономно.

Одним из примеров использования может быть размещение представления константного буфера (CBV) в корневом макете, которое изменяется при каждом рендере. Это необходимо, чтобы пространство кучи дескрипторов не выделялось приложением для каждого вызова отрисовки, и чтобы не требовалось указывать таблицу дескрипторов на новое место в куче. Перенося управление версиями в корневую сигнатуру, приложение просто передает эту ответственность драйверу; но у драйвера уже есть необходимая инфраструктура для этого.

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

Это только типы дескрипторов, поддерживаемых в корневой сигнатуре.

  • Представление буфера констант (CBV).
  • Представления ресурсов шейдера (SRVs) / неупорядоченные представления доступа (UAVs) буферных ресурсов, для которых преобразование формата не требуется (нетипизированные буферы). Некоторые примеры нетипизированных буферов, которые можно связать с корневыми дескрипторами, включают StructuredBuffer<type>, RWStructuredBuffer<type>, ByteAddressBuffer и RWByteAddressBuffer. Типизированные буферы, такие как Buffer<uint> и Buffer<float2>, не могут.
  • SRV структур ускорения трассировки лучей в локальных или глобальных корневых сигнатурах.

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

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

В приведенном выше примере mySceneData нельзя объявить как массив, как в cbuffer mySceneData[2], если он будет сопоставлен с дескриптором в корневой сигнатуре. Это связано с тем, что индексирование между дескрипторами не поддерживается в корневой сигнатуре. При необходимости можно определить отдельные буферы констант и определить их как отдельную запись в корневой сигнатуре. Обратите внимание, что в mySceneData выше существует массив bar[2]. Динамическое индексирование в буфере констант является допустимым. Дескриптор в корневой сигнатуре ведет себя так же, как и тот же дескриптор, если доступ к нему осуществляется через кучу дескриптора. Это отличается от встраивания констант непосредственно в корневую сигнатуру, которая также выглядит как буфер констант, за исключением того, что динамическое индексирование внутри встроенных констант запрещено, поэтому bar[2] там не будет разрешено.

Эти API -интерфейсы (из интерфейса ID3D12GraphicsCommandList) предназначены для настройки дескрипторов непосредственно в корневой сигнатуре.

Заметка

В Direct3D 12 отсутствует концепция массива корневого дескриптора . Массивы дескрипторов поддерживаются только в кучах дескрипторов.