Что такое DirectX 12 эквивалент «временного вложения» Вулкана? - PullRequest
2 голосов
/ 29 июня 2019

У меня есть вычислительный шейдер, который я хотел бы вывести в изображение / буфер, который предназначен для промежуточного хранения между двумя конвейерами: вычислительным конвейером и графическим конвейером.Графический конвейер на самом деле является «фиктивным», поскольку он не делает ничего, кроме копирования содержимого промежуточного буфера в образ свопчейна.Это обусловлено тем фактом, что DX12 устарела в способности вычислительных конвейеров использовать БПЛА для прямой записи в образы подкачки.

Я думаю, что промежуточное хранилище должно быть «временным» вложением, в смысле Вулкана:

VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT указывает, что память, привязанная к этому изображению, будет выделена с помощьюVK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT (см. Распределение памяти для более подробной информации).Этот бит можно установить для любого изображения, которое можно использовать для создания VkImageView, подходящего для использования в качестве цветового, разрешающего, глубинного / трафаретного или входного вложения.

Это объясняется в эта статья :

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

Имеет ли DirectX 12 аналогичную концепцию использования изображений?

1 Ответ

6 голосов
/ 29 июня 2019

Direct3D 12 не имеет этой концепции. И причина этого ограничения в конечном итоге сводится к тому, почему существует временное распределение. TL; DR: Это не для того, чтобы делать то, что вы пытаетесь сделать.

Система пропусков рендеринга Vulkan существует для одной цели: сделать рендеры на основе тайлов первоклассными гражданами системы рендеринга. TBR плохо вписываются в модель кадрового буфера OpenGL или D3D. В обоих API вы можете просто менять и добавлять кадровые буферы в любое время.

TBR не отображаются непосредственно в памяти. Они выполняют операции рендеринга во внутренние буферы, которые заполняются из памяти, а затем, возможно, записываются в память после завершения операции рендеринга. Переключение визуализированных изображений в любое время работает в соответствии с этой структурой, поэтому у поставщиков TBR есть список вещей, которые вы не должны делать , если вам нужна высокая производительность в вашем коде OpenGL ES.

Система визуализации пропусков Vulkan является абстракцией системы TBR. В абстрактной модели система проходов рендеринга потенциально считывает данные из изображений в буфере кадров, затем выполняет несколько подпроходов для копий этих данных и, в конце, потенциально записывает обновленные данные обратно в изображения. Таким образом, снаружи процесс выглядит так, будто вы рендеринге изображений, но это не так. Чтобы сохранить эту иллюзию, на время прохода рендеринга вы можете только использовать эти изображения кадрового буфера так, как модель прохода рендеринга допускает: в качестве вложений.

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

Но подумайте, как работает TBR. Это делает рендеринг в одну плитку; в оптимальных случаях он обрабатывает всех фрагментов для одной плитки одновременно. Это означает, что он проходит через геометрию и проходов освещения. Для TBR, g-буфер - это просто фрагмент памяти, который вы используете для получения окончательного ответа; его не нужно читать из памяти или копировать в память.

Короче говоря, ему не нужно память .

Введите лениво выделенную память и переходные изображения вложений. Они существуют, чтобы позволить TBR хранить g-буферы в памяти тайлов и никогда не выделять для них фактическое хранилище (или, по крайней мере, это происходит только в том случае, если возникает какое-то обстоятельство во время выполнения, которое вынуждает его, например, выталкивание слишком большого количества геометрии в GPU). И это работает только в пределах прохода рендеринга; если вы заканчиваете проход рендеринга и должны использовать один из g-буферов на другом проходе рендеринга, то магия должна исчезнуть, и данные должны коснуться фактического хранилища.

Vulkan API показывает, насколько специфичен этот вариант использования. Вы не можете привязать часть памяти, выделенной лениво, к изображению, для которого не установлен флаг USAGE_TRANSIENT_ATTACHMENT (или к буферу любого типа ). И вы заметите, что в нем написано «transient attachment », как в «render pass» attachments . Это объясняется тем, что вы также заметите, что временные вложения не могут использоваться для не-вложений использования (часть действительных тестов использования для VkImageCreateInfo). На всех.

То, что вы хотите сделать, - это не то, для чего предназначена лениво распределенная память. Это не может работать.

Что касается Direct3D 12, API не предназначен для работы на мобильных графических процессорах, и поскольку только мобильные графические процессоры являются средствами рендеринга на основе плиток (некоторые недавние настольные графические процессоры имеют сходство с TBR, но не являются полными TBR), в нем нет средств, предназначенных для этого. явно для них. И, таким образом, он не нуждается в лениво распределенной памяти или временных вложениях.

...