Как скопировать образ цепочки подкачки в буфер VkBuffer в Vulkan?

В настоящее время я модифицирую Adreno SDK Vulkan, пример Triangle. Я хочу прочитать значения цвета визуализированного изображения Swap Chain. Я следовал следующему процессу:

  1. Я создаю VkBuffer с шириной и высотой изображения Swap Chain. Его детали:

    VkBufferCreateInfo outputinfo = {};
    outputinfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
    outputinfo.size = m_width * m_height * 3 * sizeof(int8_t);
    outputinfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
    outputinfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;`
    

    Int, потому что формат изображения VK_FORMAT_R8G8B8_SINT Затем выделите память и привяжите ее к буферу с типом VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT

  2. Вызов vkCmdCopyImageToBuffer в буфере команд после vkCmdDraw, vkCmdEndRenderPass.

  3. Затем сделайте vkQueueSubmit и vkQueueWaitIdle. Вызовите vkMapMemory для буферной памяти и прочтите данные, но они являются значениями мусора. Для malloc я сохраняю формат данных как int.


person abhijit jagdale    schedule 16.08.2016    source источник
comment
Int, потому что формат изображения - VK_FORMAT_R8G8B8_SINT Две проблемы. Во-первых, я был бы шокирован, если бы изображение цепочки подкачки использовало 24-битный цветовой формат. Особенно ненормализованный формат. И, кроме того, подписал. Во-вторых, даже если это действительно формат изображения, SINT означает, что это целое число со знаком. 8s говорят вам, сколько битов используется на канал. Это 24 бита на пиксель, а не 3 * sizeof(int) на пиксель. Я хочу увидеть код, в котором вы запрашиваете этот формат изображения. Кроме того, вы проверяли, можно ли использовать изображение в качестве источника для операции передачи?   -  person Nicol Bolas    schedule 17.08.2016
comment
@NicolBolas Я изменил int на int8_t. Во-вторых, так как это образ цепочки подкачки, поэтому я не знаю, где установить его использование для типа передачи. Мы можем установить использование через VkImageCreateInfo, но не знаем для образа цепочки подкачки.   -  person abhijit jagdale    schedule 17.08.2016
comment
@abhijitjagdale: вы устанавливаете флаг использования в структуре VkSwapchainCreateInfoKHR, которая передается в vkCreateSwapchainKHR. Таким образом, в дополнение к VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT вам нужно будет установить VK_IMAGE_USAGE_TRANSFER_SRC_BIT перед созданием цепочки подкачки, если вы хотите читать из нее и если это поддерживается (см. Ответ Николая). Также обратите внимание, что Vulkan не выполняет за вас никаких преобразований формата изображения, поэтому вы должны сопоставить фактический формат цепочки подкачки перед копированием из него.   -  person Sascha Willems    schedule 17.08.2016
comment
@SaschaWillems Настройка swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT сработал. Спасибо.   -  person abhijit jagdale    schedule 17.08.2016


Ответы (1)


Образы подкачки в Vulkan не принадлежат вашему коду; они принадлежат платформе. Таким образом, вы не можете контролировать большинство их аспектов. Вместо этого вы запрашиваете их аспекты через vkGetPhysicalDeviceSurfaceCapabilitiesKHR. Особое значение имеет VkSurfaceCapabilitiesKHR::supportedUsageFlags.

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

Если VK_IMAGE_USAGE_TRANSFER_SRC_BIT не установлен в этом флаге, вы не можете копировать из образа цепочки подкачки вообще. Таким образом, вам нужно будет отрендерить то, что вам нужно, в другое изображение, а затем скопировать в изображение цепочки подкачки. Если, конечно, у него есть TRANSFER_DST_BIT; в противном случае вам придется выполнить рендеринг.

Предположим, вы убедились, что с поверхности вообще можно читать:

Вызов vkCmdCopyImageToBuffer в буфере команд после vkCmdDraw, vkCmdEndRenderPass.

Вашему проходу рендеринга потребуется зависимость выполнения между записью в изображение и этапом передачи.

person Nicol Bolas    schedule 16.08.2016
comment
У меня проблемы с копированием изображений цепочки подкачки в буфер. Я попытался настроить его, а затем как можно лучше проследил за выводом ошибки и получил то, что кажется близким. Ошибки говорят мне, что мне не разрешено создавать изображения цепочки подкачки с установленным VK_IMAGE_USAGE_TRANSFER_SRC_BIT, однако при проверке supportedUsageFlags они имеют значение 31, что означает, что установлены все первые 5 бит, включая VK_IMAGE_USAGE_TRANSFER_SRC_BIT. Есть ли какие-то очевидные ошибки, которых я могу упустить? - person Iron Attorney; 06.01.2021