Вулкан: лениво выделял память?

У меня есть ситуация, в которой мне может потребоваться буфер трафарета в проходе рендеринга, но я не буду «знать» до середины выполнения прохода рендеринга. К сожалению, в Vulkan нет возможности изменять вложения к фреймбуферу, если этап рендеринга уже выполняется (как в D3D12). Однако в спецификации я обнаружил, что существует концепция "ленивое выделение памяти" с использованием VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT при распределении памяти и VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT для поверхности.

К сожалению, похоже, что ни одна из записей VkMemoryType в VkPhysicalDeviceMemoryProperties (возвращенных из vkGetPhysicalDeviceMemoryProperties) на самом деле не имеет установленного бита возможности. Более того, похоже, что ни один из примеров API не использует эти биты. Является ли это просто нереализованной функцией на уровне драйвера, и часто ли драйверы не поддерживают эту функцию?

Я использую Vulkan SDK 1.0.5, драйвер Nvidia 356.45.


person MuertoExcobito    schedule 14.04.2016    source источник
comment
У меня есть ситуация, в которой мне может потребоваться буфер трафарета в проходе рендеринга, но я не буду «знать» до середины выполнения прохода рендеринга. Как вы не < / i> знаете? Не имеет смысла визуализировать сцену, не зная, что в ней.   -  person Nicol Bolas    schedule 14.04.2016
comment
Да, конечно, объекты в сцене известны, но нет «глобального списка» методов, используемых для их рендеринга. Для разных методов могут потребоваться разные ресурсы, в этом случае для некоторых может потребоваться буфер трафарета. Я мог «просканировать» сцену и определить, нужен ли буфер трафарета (или нет), прежде чем начинать проход рендеринга. Однако в этом нет необходимости с любыми другими API-интерфейсами рендеринга, для которых я реализовал свой модуль рендеринга, и это снизит производительность.   -  person MuertoExcobito    schedule 14.04.2016
comment
Однако в этом нет необходимости для каких-либо других API рендеринга, для которых я реализовал свой модуль рендеринга, и это снизило бы производительность. Как узнать, снизит ли это производительность? На каком оборудовании неиспользуемый буфер трафарета снизит производительность? Мне кажется, что на TBR неиспользованный буфер трафарета стоит очень мало. Не говоря уже о том, что некоторое оборудование (например, TBR) может нуждаться в исправлении вашего шейдера, если возможна трафаретная обработка, поскольку они могут использовать логику фрагментного шейдера для выполнения операции трафарета.   -  person Nicol Bolas    schedule 14.04.2016
comment
Это снизило бы производительность, потому что мне пришлось бы тратить время на выполнение кода, сканирующего сцену. Кроме того, поверхность в других API-интерфейсах может выделяться по запросу, тогда как с Vulkan (без отложенного выделения памяти) ее необходимо выделять заранее, что потребляет больше видеопамяти.   -  person MuertoExcobito    schedule 14.04.2016
comment
Это снизило бы производительность, потому что мне пришлось бы тратить время выполнения в моем коде на сканирование сцены. Или вы могли бы просто объявить в своем проходе рендеринга, что у вас есть буфер трафарета. Кроме того, поверхность в других API может быть выделена по запросу. Вы говорите так, как будто драйвер не прыгает через те же самые препятствия за вас.   -  person Nicol Bolas    schedule 14.04.2016
comment
Без итерации моей сцены (или, точнее, подсцены - это относится к целям вне экрана), я не знаю, действительно ли мне нужен буфер трафарета или нет. Очевидно, я не могу заявить, что у меня есть один, хотя на самом деле его нет. Это означает, что всегда нужно выделять один. Если на самом деле необходимость в этом возникает редко, это довольно расточительно.   -  person MuertoExcobito    schedule 14.04.2016
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Nicol Bolas    schedule 14.04.2016


Ответы (1)


Ленивое выделение памяти вам не поможет. Или, по крайней мере, вероятно, нет, в зависимости от вашей сцены. Причины двоякие. Во-первых, если вы не выполняете рендеринг с глубиной, вы должны использовать упакованное изображение глубины / трафарета (поскольку вам не разрешено иметь отдельные буферы глубины и трафарета). И поскольку вы (предположительно) не хотите, чтобы часть глубины выделялась лениво, у вас нет другого выхода, кроме как использовать фактическую память, а не лениво выделенную память.

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

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

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

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

Буферы глубины и буферы глубины / трафарета также могут быть отложены, если вам не нужен доступ к ним, как к обычным изображениям. Но даже в этом случае речь не идет о том, чтобы сделать трафарет или проверку глубины необязательными. Речь идет о том, чтобы сделать их резервное хранилище эфемерным, памятью, которая может жить в тайле TBR и нигде больше. Вы все еще делаете операции; это просто не занимает реальную память.

person Nicol Bolas    schedule 14.04.2016
comment
Я не использую буфер глубины, я пытаюсь сделать выделение буфера трафарета необязательным. Но, похоже, в Vulkan это просто невозможно, если драйверы (в настоящее время нет) реализуют эту функцию. - person MuertoExcobito; 14.04.2016
comment
Знаете ли вы, что драйверы не реализуют это, потому что доступное в настоящее время оборудование еще не поддерживает ленивое выделение памяти или потому, что драйверы просто еще не дошли до его реализации? - person Colonel Thirty Two; 16.04.2016
comment
@ColonelThirtyTwo: Понятия не имею. Я не уверен, какое именно оборудование потребуется для его реализации. В основном это вопрос осознания того, что вы собираетесь использовать VkImage таким образом, который потребует резервного хранилища для памяти, а затем выделения этой памяти. - person Nicol Bolas; 16.04.2016