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


Ограничения корневых подписей

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

Ограничения и затраты на память

Максимальный размер корневой сигнатуры составляет 64 DWORD.

Этот максимальный размер выбирается, чтобы предотвратить злоупотребление корневой сигнатурой в качестве способа хранения массовых данных. Каждая запись в корневой сигнатуре имеет стоимость в 64 DWORD:

  • Стоимость таблиц дескриптора — 1 DWORD.
  • Корневые константы стоят 1 DWORD, так как они являются 32-разрядными значениями.
  • Корневые дескрипторы (64-разрядные виртуальные адреса GPU) стоят 2 DWORD каждый.

Размер корневой сигнатуры для статических выборок не требуется.

Затраты на производительность

Затраты на производительность (с точки зрения уровней косвенного обращения) равны нулю для корневой константы, 1 для корневого дескриптора и 2 для таблицы дескриптора. Если корневая сигнатура имеет большой размер и переполняется из самой быстрой памяти в немного медленную память (что может произойти на некотором оборудовании), добавьте 1 к затратам на производительность переполненных элементов в конце корневой сигнатуры.

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

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

Как правило, учитывайте следующие рекомендации.

  • При необходимости используйте небольшую корневую подпись, хотя и сбалансируйте это с гибкостью большей корневой сигнатуры.
  • Расположите параметры в крупной корневой сигнатуре, чтобы параметры, скорее всего, изменялись часто или если для заданного параметра важна низкая задержка доступа.
  • Если это удобно, используйте корневые константы или представления буфера корневой константы, чтобы поместить представления буфера констант в кучу дескриптора.

Статические выборки

Статические пробоотборщики (в которых состояние полностью определено и неизменяемо) являются частью корневых сигнатур, но не учитываются в ограничении DWORD 64. Если дискретизатор можно определить как статический, нет необходимости в том, чтобы он был частью кучи дескриптора.

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

Статические выборки могут быть написаны как часть корневой сигнатуры в шейдерах HLSL (см. раздел Указание корневых подписей в HLSL).

Корневые подписи