#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:
Если вы создаете a VkBuffer
и требования к памяти для него таковы, что он должен быть местом назначения операции передачи, то… создайте новый VkBuffer
с установленным битом использования передачи назначения (и удалите старый).
Это просто VkBuffer
. На самом деле он ничего не делает, пока не привязан к памяти. Действительно, в реальном приложении неплохо создать несколько спекулятивных буферов, чтобы выяснить, где вы собираетесь организовать использование буферной памяти.
Комментарии:
1. Но если я установлю только VERTEX_BUFFER_BIT, то memRequirements вернет, что для него подходят некоторые типы памяти. Я обнаружил, что ни один из них не виден хосту, поэтому я удаляю буфер и создаю другой с помощью VERTEX_BUFFER_BIT и TRANSFER_DESTINATION_BIT, затем мне нужно снова запросить memRequirements для этого буфера, верно? И я могу получить разные типы памяти?
2. @Zebrafish: Да, вам нужно снова запросить требования к памяти.