Использование дескрипторов непосредственно в корневой сигнатуре
Чтобы избежать необходимости пройти через кучу дескриптора, можно поместить дескриптор непосредственно в корневую подпись. Эти дескрипторы занимают много места в корневой сигнатуре (см. ограничения корневой подписи), поэтому рекомендуется использовать их экономно.
Одним из примеров использования может быть размещение представления константного буфера (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) предназначены для настройки дескрипторов непосредственно в корневой сигнатуре.
- SetComputeRootConstantBufferView
- SetGraphicsRootConstantBufferView
- SetComputeRootShaderResourceView
- SetGraphicsRootShaderResourceView
- SetComputeRootUnorderedAccessView
- SetGraphicsRootUnorderedAccessView
Заметка
В Direct3D 12 отсутствует концепция массива корневого дескриптора . Массивы дескрипторов поддерживаются только в кучах дескрипторов.