From cd61de3745d7ead98e6a9cfdeab457740c5323bb Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 18 Feb 2022 15:33:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B1=20=D0=B8=D0=B7=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=D1=85=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 1 + src/vk.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/vk.h b/include/vk.h index a95e74a..e09ae03 100644 --- a/include/vk.h +++ b/include/vk.h @@ -21,6 +21,7 @@ class Vulkan Surface surface; // Поверхность окна VkSwapchainKHR swapChain; // Список показа std::vector swapChainImages; // Изображения из списка показа + std::vector swapChainImageViews; // Информация об изображениях из списка показа // Структура для хранения флагов struct diff --git a/src/vk.cpp b/src/vk.cpp index 49b670d..e939c8c 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -21,6 +21,12 @@ void Vulkan::init(GLFWwindow* window) // завершение работы void Vulkan::destroy() { + // Уничтожение информации о изображениях списка показа + for (auto & imageView : swapChainImageViews) + { + vkDestroyImageView(logicalDevice, imageView, nullptr); + } + vkDestroySwapchainKHR(logicalDevice, swapChain, nullptr); // уничтожение цепочки показа vkDestroySurfaceKHR(instance, surface.surface, nullptr); // уничтожение поверхности vkDestroyDevice(logicalDevice, nullptr); // Уничтожение логического устройства @@ -425,4 +431,32 @@ void Vulkan::createSwapchain(GLFWwindow* window) vkGetSwapchainImagesKHR(logicalDevice, swapChain, &surface.imageCount, nullptr); swapChainImages.resize(surface.imageCount); vkGetSwapchainImagesKHR(logicalDevice, swapChain, &surface.imageCount, swapChainImages.data()); + + // Зададим размер массива в соответствии с количеством изображений + swapChainImageViews.resize(swapChainImages.size()); + // Для каждого изображения из списка показа + for (int i = 0; i < swapChainImages.size(); i++) + { + // Заполним данные о создаваемом объекте VkImageView + VkImageViewCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + createInfo.image = swapChainImages[i]; + createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; + createInfo.format = surface.selectedFormat.format; + createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; + createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; + createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; + createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; + createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + createInfo.subresourceRange.baseMipLevel = 0; + createInfo.subresourceRange.levelCount = 1; + createInfo.subresourceRange.baseArrayLayer = 0; + createInfo.subresourceRange.layerCount = 1; + + // Создание VkImageView + if (vkCreateImageView(logicalDevice, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) + { + throw std::runtime_error("Unable to create image views"); + } + } }