Меня немного смущает существование ID3D12GraphicsCommandList::SetGraphicsRootSignature
. метод. Насколько я понимаю этой страницы MSDN, кажется, единственно допустимое его использование — всегда вызывать его после SetPipelineState
, давая ему ту же корневую подпись, которая была предоставлена при создании объекта состояния конвейера. Если это так, то какая польза в том, что это не подразумевается? Существуют ли другие способы использования этого метода?
В чем смысл SetGraphicsRootSignature D3D12?
Ответы (3)
Это оптимизация ЦП, внутренне можно подготовить часть отображения из слотов корневой подписи в фактическую привязку. Если вы используете общую корневую подпись для разных объектов состояния конвейера, то эту работу можно выполнить один раз для каждой корневой подписи, а не один раз для объекта состояния конвейера.
Скорее всего, вы будете звонить SetGraphicsRootSignature
реже, чем SetGraphicPipelineState
. Вот почему.
«Корневая подпись» в DirectX 12 предоставляет общую информацию о макете для обмена данными между структурами данных ЦП и выполнением языка шейдеров графического процессора. DirectX 12 заставляет программиста решать, сколько корневых подписей они хотят использовать, когда их использовать и какие объекты состояния конвейера нуждаются в какой корневой подписи. В Direct3D 11, по сути, постоянно активна одна «корневая подпись», которая довольно велика.
Корневые подписи можно довольно часто менять без серьезных последствий, но предполагается, что у вас будет несколько корневых подписей и много PSO, а не соответствие 1:1.
Для простоты в наборе инструментов DirectX для DirectX 12 мы устанавливаем корневую подпись каждый раз, когда устанавливаем PSO в
IEffect::Apply
, несмотря на то, что мы используем только несколько разных корневых подписей.
@Чак Уолборн
«Корневые подписи можно менять довольно часто без серьезных последствий»
https://developer.nvidia.com/dx12-dos-and-donts#roots
- Minimize the number of Root Signature changes
- The problem is not the change of the RS but there is usually a follow up cost of initializing the root signature entries after such a change
SetGraphicsRootSignature
вызывается передSetPipelineState
. - person Matthias   schedule 03.10.2020