В Vulkan как я должен знать, нужно ли использовать флаг использования буфера TRANSFER_SOURCE?

#vulkan

Вопрос:

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

 auto bufferUsageBits = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT /* | VK_BUFFER_USAGE_TRANSFER_DST_BIT*/;
// The second flag should be set only if the memory requirements queries later
// tell me there's no device-local AND host-visible memory types
VkBuffer vkBufferHandle;
VK::createBuffer(size, bufferUsageBits, VK_SHARING_MODE_EXCLUSIVE, amp;vkBufferHandle);

vkGetBufferMemoryRequirements();
// Only know do I now if I need a staging buffer and the buffer I'm creating needs to be transfered to.
 

Насколько я могу судить, я мог бы сделать две вещи:

  1. Если устройство интегрировано или тип процессора, то предположим, что буферу не потребуется устанавливать флаг передачи.
  2. Установите флаг в любом случае, независимо от того, является ли он интегрированным/процессорным или дискретным.

Как я должен с этим справляться?

Ответ №1:

Если вы создаете a VkBuffer и требования к памяти для него таковы, что он должен быть местом назначения операции передачи, то… создайте новый VkBuffer с установленным битом использования передачи назначения (и удалите старый).

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

Комментарии:

1. Но если я установлю только VERTEX_BUFFER_BIT, то memRequirements вернет, что для него подходят некоторые типы памяти. Я обнаружил, что ни один из них не виден хосту, поэтому я удаляю буфер и создаю другой с помощью VERTEX_BUFFER_BIT и TRANSFER_DESTINATION_BIT, затем мне нужно снова запросить memRequirements для этого буфера, верно? И я могу получить разные типы памяти?

2. @Zebrafish: Да, вам нужно снова запросить требования к памяти.