Я исследую DirectX 12, и мне интересно, насколько эффективно переключать объекты состояния конвейера. Я получаю противоречивые отчеты из источников, которые читаю, то есть некоторые говорят, что это очень медленно, а другие говорят, что это довольно быстро.
Используется «медленный» аргумент: GPU должен делать кучу вещей под капотом, таких как перекомпиляция и т. Д. Всякий раз, когда вы используете SetPipelineState()
,
Используется «быстрый» аргумент: все вычисления для состояния конвейера выполняются при создании объекта состояния конвейера, поэтому графический процессор может просто поменять местами некоторые указатели и все.
Что является правдой? Насколько исполнитель SetPipelineState()
и что я должен иметь в виду при его использовании?
Для быстрого ответа у вас, вероятно, никогда не возникнет проблем с производительностью при переключении PSO, как это было изначально задумано.
Для более длинного ответа стоимость изменения объекта состояния конвейера будет зависеть в основном от трех критериев:
PSO спроектирован так, чтобы максимально быстро переключаться, он самодостаточен, и, по крайней мере на nVidia и AMD, единственная компиляция шейдеров происходит при создании, а не при использовании. На AMD даже можно извлечь реальную сборку микрокода с небольшим взломом из результата ID3D12PipelineState::GetCachedBlob
, Одним из наблюдений было то, что они больше не используют систему извлечения шейдеров, как в DX11, для работы с различными входными раскладками, так как теперь это является частью описания PSO.
Следует отметить, что сильной стороной DX12 является также предоставление доступа к ресурсам без привязки. С помощью этой функции можно уменьшить количество промывок материала примерно в десять раз, используя умные экземпляры и ExecuteIndirect
Вы можете позволить графическому процессору решать материалы и геометрию без особого взаимодействия.
Потому что информация публичная как-то (http://www.wihlidal.ca/Presentations/GDC_2016_Compute.pdf).
В Xbox One у ExecuteIndirect есть несколько невероятных расширений, в которых PSO могут переключаться косвенными аргументами, что означает, что мы можем выпустить один ExecuteIndirect для всей нашей сцены, независимо от состояния или
изменения ресурса.
Изменение PSO на Xbox One практически бесплатно на процессоре, потому что они могут использовать их непосредственно из графического процессора. Печально, что это не доступно на ПК, но это должно помочь вам уменьшить вашу озабоченность по поводу переключателей PSO.
Реальный вопрос: для чего вы используете SetPipelineState ()? Вы не можете изменить шейдеры без этого. Вы можете изменить конфигурацию привязки ресурса. Вы не можете изменить топологию иначе. Теоретически в PipelineState есть все, что нужно для программирования GPU, и вы не можете поменять здесь блоки, так что вы застряли с тем, что имеете.
Теперь ответим: это зависит от GPU и драйвера. Да, кое-что сделано в фоновом режиме. Однако приличный графический драйвер должен оптимизировать и кэшировать то, что уже сделано. Смысл — если вы уже использовали данный PipelineState, использовать другой и вернуться к исходному должен быть быстрым.