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


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

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

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

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

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

  • Представление буфера констант (CBV).
  • Представления ресурсов шейдера или неупорядоченные представления доступа (БПЛА) буферных ресурсов, в которых преобразование формата не требуется (нетипизированные буферы). Некоторые примеры нетипизированных буферов, которые можно связать с корневыми дескрипторами, включают 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 отсутствует концепция корневого массива дескрипторов . Массивы дескрипторов поддерживаются только в кучах дескрипторов.