Получение указателя на вектор объектов для vkGetSwapChainImagesKHR - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над объектом класса для своего приложения Vulkan, и теперь я изменяю код для объекта SwapChain. Я нахожусь в процессе добавления функциональности для DepthBuffer.

Изначально в пределах SwapChain::create(/*...*/) идет звонок на vkGetSwapChainImagesKHR(). Он вызывался так:

vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount_, nullptr);
images_.resize(imageCount);
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount, images_.data());

Где images_ объявлен как std::vector<VkImage> images_ в заголовке SwapChain.


Вместо того, чтобы писать мои объекты свои собственные функции createImage и createImageView ... Я решил сделать Image как отдельный объект класса. Я уже сделал это со многими несколькими объектами Vulkan, следуя аналогичному шаблону интерфейса для всех моих классов. Когда один объект класса Vulkan содержит другой вместо хранения raw типов Vulkan, теперь они хранят тип std::shared_ptr<class T> или std::vector<std::shared_ptr<class T>>.


Теперь вернемся к моему SwapChain классу. Его член images_ больше не: std::vector<VkImage>, теперь это std::vector<std::shared_ptr<Image>>, где Image - это класс, обернутый вокруг VkImage со всеми необходимыми функциями для создания и очистки ресурсов Vulkan.


Что касается моего вопроса: как мне теперь вызвать vkGetSwapChainImagesKHR()?

// this is straight forward...
std::vector<VkImage> images_;
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount, images_.data()); 

// this is where I'm stuck...
std::vector<std::shared_ptr<Image>> images_;
vkGetSwapChainImagesKHR(*device_, swapChain_, &imageCount_, ??? ); // &images_.data(), images_.get()...

Как мне получить соответствующий тип, который vkGetSwapChainImagesKHR() требует для своего последнего параметра?

1 Ответ

2 голосов
/ 08 мая 2020

Хорошо, я бы сказал вам, что вам нужно создать массив (какой-то) из VkImage s и передать его функции. Но тогда ваш код будет «работать», но не на самом деле . Почему?

Потому что ваш тип Image не может их хранить. Видите ли, изображения в свопчейне особенные; они не принадлежат вашему приложению. Вот почему вы не создаете их с помощью обычного вызова vkCreateImage. И именно поэтому вы не можете уничтожить их обычным вызовом vkDestroyImage.

Деструктор вашего типа Image без сомнения вызывает vkDestroyImage на изображении. Но вам не разрешено делать это для изображений подкачки, потому что они вам не принадлежат. VkImage и устанавливает некоторое состояние в Image, чтобы его деструктор не разрушал изображение.

Итак, после получения массива VkImage объектов из Vulkan, вы просто перебираете массив и строите ваши vector из выделенных в куче Image объектов, используя для них вышеупомянутый специализированный конструктор.

...