Я использую SDL-3 и vulkan 1.3.280.0.
У меня есть класс-оболочка для VkSwapchainKHR, содержащий все, что необходимо для моей цепочки обмена:
< pre class="lang-cpp Prettyprint-override">class VulkanSwapchain
{
private:
// external:
VulkanContext* context;
SDL_Window* window;
public:
// internal:
VkSwapchainKHR swapchain;
VkSurfaceKHR surface;
VkExtent2D imageExtent;
VkSurfaceFormatKHR surfaceFormat;
std::vector images;
std::vector imageViews;
// Constructor:
VulkanSwapchain(VulkanContext* context, SDL_Window* window, VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain = nullptr);
// Destructor:
~VulkanSwapchain();
private:
void CreateSurface();
void CreateSurfaceFormat();
void SetImageExtent();
void CreateSwapchain(VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain);
void CreateImages();
void CreateImageViews();
};
При изменении размера окна мне нужно создать новую цепочку буферов и уничтожить старую:
void Application::RecreateSwapchain()
{
...
std::unique_ptr newSwapchain = std::make_unique(context.get(), window, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, swapchain.get());
swapchain.swap(newSwapchain);
...
}
После завершения работы RecreateSwapchain() старая цепочка обмена (теперь на которую ссылается newSwapchain) выходит за пределы области видимости, и вызывается деструктор:
VulkanSwapchain::~VulkanSwapchain()
{
LOG_INFO("Destroying Swapchain.");
VKA(vkDeviceWaitIdle(context->device));
for (uint32_t i = 0; i < imageViews.size(); i++)
vkDestroyImageView(context->device, imageViews, nullptr);
vkDestroySwapchainKHR(context->device, swapchain, nullptr);
vkDestroySurfaceKHR(context->instance, surface, nullptr);
LOG_INFO("Swapchain Destroyed.");
}
Обратите внимание, как я вызываю vkDestroySwapchainKHR(...) ДО vkDestroySurfaceKHR(...).
Так почему же я получаю следующее сообщение от уровня проверки?
[22:06:49] VulkanTutorial: Destroying Swapchain.
VUID-vkDestroySurfaceKHR-surface-01266(ERROR / SPEC): msgNum: -1093400348 - Validation Error: [ VUID-vkDestroySurfaceKHR-surface-01266 ] Object 0: handle = 0x162793cff20, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0xbed408e4 | **vkDestroySurfaceKHR(): called before its associated VkSwapchainKHR was destroyed**. The Vulkan spec states: All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface (https://vulkan.lunarg.com/doc/view/1.3. ... face-01266)
Objects: 1
[0] 0x162793cff20, type: 1, name: NULL
[22:06:49] VulkanTutorial: Swapchain Destroyed.
Подробнее здесь: https://stackoverflow.com/questions/787 ... t-of-order
Цепочка обмена Vulkan и разрушение поверхности вышли из строя ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1720472475
Anonymous
Я использую SDL-3 и vulkan 1.3.280.0.
У меня есть класс-оболочка для VkSwapchainKHR, содержащий все, что необходимо для моей цепочки обмена:
< pre class="lang-cpp Prettyprint-override">class VulkanSwapchain
{
private:
// external:
VulkanContext* context;
SDL_Window* window;
public:
// internal:
VkSwapchainKHR swapchain;
VkSurfaceKHR surface;
VkExtent2D imageExtent;
VkSurfaceFormatKHR surfaceFormat;
std::vector images;
std::vector imageViews;
// Constructor:
VulkanSwapchain(VulkanContext* context, SDL_Window* window, VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain = nullptr);
// Destructor:
~VulkanSwapchain();
private:
void CreateSurface();
void CreateSurfaceFormat();
void SetImageExtent();
void CreateSwapchain(VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain);
void CreateImages();
void CreateImageViews();
};
При изменении размера окна мне нужно создать новую цепочку буферов и уничтожить старую:
void Application::RecreateSwapchain()
{
...
std::unique_ptr newSwapchain = std::make_unique(context.get(), window, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, swapchain.get());
swapchain.swap(newSwapchain);
...
}
После завершения работы RecreateSwapchain() старая цепочка обмена (теперь на которую ссылается newSwapchain) выходит за пределы области видимости, и вызывается деструктор:
VulkanSwapchain::~VulkanSwapchain()
{
LOG_INFO("Destroying Swapchain.");
VKA(vkDeviceWaitIdle(context->device));
for (uint32_t i = 0; i < imageViews.size(); i++)
vkDestroyImageView(context->device, imageViews[i], nullptr);
vkDestroySwapchainKHR(context->device, swapchain, nullptr);
vkDestroySurfaceKHR(context->instance, surface, nullptr);
LOG_INFO("Swapchain Destroyed.");
}
Обратите внимание, как я вызываю vkDestroySwapchainKHR(...) ДО vkDestroySurfaceKHR(...).
Так почему же я получаю следующее сообщение от уровня проверки?
[22:06:49] VulkanTutorial: Destroying Swapchain.
VUID-vkDestroySurfaceKHR-surface-01266(ERROR / SPEC): msgNum: -1093400348 - Validation Error: [ VUID-vkDestroySurfaceKHR-surface-01266 ] Object 0: handle = 0x162793cff20, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0xbed408e4 | **vkDestroySurfaceKHR(): called before its associated VkSwapchainKHR was destroyed**. The Vulkan spec states: All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface (https://vulkan.lunarg.com/doc/view/1.3.280.0/windows/1.3-extensions/vkspec.html#VUID-vkDestroySurfaceKHR-surface-01266)
Objects: 1
[0] 0x162793cff20, type: 1, name: NULL
[22:06:49] VulkanTutorial: Swapchain Destroyed.
Подробнее здесь: [url]https://stackoverflow.com/questions/78722723/vulkan-swapchain-and-surface-destruction-out-of-order[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия