xo-imgui: refactor ex4a: create_swapchain() -> .cpp
This commit is contained in:
parent
9e10535fe6
commit
08257f19fd
2 changed files with 70 additions and 60 deletions
|
|
@ -165,4 +165,54 @@ MinimalImGuiVulkan::create_logical_device()
|
|||
vkGetDeviceQueue(device_, graphics_queue_family_, 0, &graphics_queue_);
|
||||
}
|
||||
|
||||
void
|
||||
MinimalImGuiVulkan::create_swapchain()
|
||||
{
|
||||
VkSurfaceCapabilitiesKHR capabilities;
|
||||
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device_, surface_, &capabilities);
|
||||
|
||||
uint32_t n_format;
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &n_format, nullptr);
|
||||
std::vector<VkSurfaceFormatKHR> formats(n_format);
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &n_format, formats.data());
|
||||
|
||||
VkSurfaceFormatKHR surface_format = formats[0];
|
||||
this->swapchain_image_format_ = surface_format.format;
|
||||
|
||||
int width, height;
|
||||
SDL_Vulkan_GetDrawableSize(window_, &width, &height);
|
||||
this->swapchain_extent_ = {
|
||||
static_cast<uint32_t>(width),
|
||||
static_cast<uint32_t>(height)
|
||||
};
|
||||
|
||||
uint32_t n_image = capabilities.minImageCount + 1;
|
||||
if (capabilities.maxImageCount > 0 && n_image > capabilities.maxImageCount) {
|
||||
n_image = capabilities.maxImageCount;
|
||||
}
|
||||
|
||||
VkSwapchainCreateInfoKHR create_info{};
|
||||
create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||
create_info.surface = surface_;
|
||||
create_info.minImageCount = n_image;
|
||||
create_info.imageFormat = surface_format.format;
|
||||
create_info.imageColorSpace = surface_format.colorSpace;
|
||||
create_info.imageExtent = swapchain_extent_;
|
||||
create_info.imageArrayLayers = 1;
|
||||
create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||
create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||
create_info.preTransform = capabilities.currentTransform;
|
||||
create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
||||
create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
|
||||
create_info.clipped = VK_TRUE;
|
||||
|
||||
if (vkCreateSwapchainKHR(device_, &create_info, nullptr, &(this->swapchain_)) != VK_SUCCESS) {
|
||||
throw std::runtime_error("Failed to create swap chain!");
|
||||
}
|
||||
|
||||
vkGetSwapchainImagesKHR(device_, swapchain_, &n_image, nullptr);
|
||||
this->swapchain_images_.resize(n_image);
|
||||
vkGetSwapchainImagesKHR(device_, swapchain_, &n_image, this->swapchain_images_.data());
|
||||
}
|
||||
|
||||
/* end VulkanApp.cpp */
|
||||
|
|
|
|||
|
|
@ -47,60 +47,20 @@ private:
|
|||
*/
|
||||
void create_logical_device();
|
||||
|
||||
void create_swapchain() {
|
||||
VkSurfaceCapabilitiesKHR capabilities;
|
||||
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device_, surface_, &capabilities);
|
||||
|
||||
uint32_t formatCount;
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &formatCount, nullptr);
|
||||
std::vector<VkSurfaceFormatKHR> formats(formatCount);
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device_, surface_, &formatCount, formats.data());
|
||||
|
||||
VkSurfaceFormatKHR surfaceFormat = formats[0];
|
||||
swapchainImageFormat = surfaceFormat.format;
|
||||
|
||||
int width, height;
|
||||
SDL_Vulkan_GetDrawableSize(window_, &width, &height);
|
||||
swapchainExtent = {static_cast<uint32_t>(width), static_cast<uint32_t>(height)};
|
||||
|
||||
uint32_t imageCount = capabilities.minImageCount + 1;
|
||||
if (capabilities.maxImageCount > 0 && imageCount > capabilities.maxImageCount) {
|
||||
imageCount = capabilities.maxImageCount;
|
||||
}
|
||||
|
||||
VkSwapchainCreateInfoKHR createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||
createInfo.surface = surface_;
|
||||
createInfo.minImageCount = imageCount;
|
||||
createInfo.imageFormat = surfaceFormat.format;
|
||||
createInfo.imageColorSpace = surfaceFormat.colorSpace;
|
||||
createInfo.imageExtent = swapchainExtent;
|
||||
createInfo.imageArrayLayers = 1;
|
||||
createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||
createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||
createInfo.preTransform = capabilities.currentTransform;
|
||||
createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
||||
createInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR;
|
||||
createInfo.clipped = VK_TRUE;
|
||||
|
||||
if (vkCreateSwapchainKHR(device_, &createInfo, nullptr, &swapchain) != VK_SUCCESS) {
|
||||
throw std::runtime_error("Failed to create swap chain!");
|
||||
}
|
||||
|
||||
vkGetSwapchainImagesKHR(device_, swapchain, &imageCount, nullptr);
|
||||
swapchainImages.resize(imageCount);
|
||||
vkGetSwapchainImagesKHR(device_, swapchain, &imageCount, swapchainImages.data());
|
||||
}
|
||||
/*
|
||||
* populates @ref swapchain_, @ref swapchain_images_
|
||||
*/
|
||||
void create_swapchain();
|
||||
|
||||
void create_image_views() {
|
||||
swapchainImageViews.resize(swapchainImages.size());
|
||||
swapchainImageViews.resize(swapchain_images_.size());
|
||||
|
||||
for (size_t i = 0; i < swapchainImages.size(); i++) {
|
||||
for (size_t i = 0; i < swapchain_images_.size(); i++) {
|
||||
VkImageViewCreateInfo createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||
createInfo.image = swapchainImages[i];
|
||||
createInfo.image = swapchain_images_[i];
|
||||
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
createInfo.format = swapchainImageFormat;
|
||||
createInfo.format = swapchain_image_format_;
|
||||
createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
|
|
@ -119,7 +79,7 @@ private:
|
|||
|
||||
void create_render_pass() {
|
||||
VkAttachmentDescription colorAttachment{};
|
||||
colorAttachment.format = swapchainImageFormat;
|
||||
colorAttachment.format = swapchain_image_format_;
|
||||
colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
|
|
@ -170,8 +130,8 @@ private:
|
|||
framebufferInfo.renderPass = renderPass;
|
||||
framebufferInfo.attachmentCount = 1;
|
||||
framebufferInfo.pAttachments = attachments;
|
||||
framebufferInfo.width = swapchainExtent.width;
|
||||
framebufferInfo.height = swapchainExtent.height;
|
||||
framebufferInfo.width = swapchain_extent_.width;
|
||||
framebufferInfo.height = swapchain_extent_.height;
|
||||
framebufferInfo.layers = 1;
|
||||
|
||||
if (vkCreateFramebuffer(device_, &framebufferInfo, nullptr, &framebuffers[i]) != VK_SUCCESS) {
|
||||
|
|
@ -275,7 +235,7 @@ private:
|
|||
init_info.RenderPass = renderPass;
|
||||
init_info.Subpass = 0;
|
||||
init_info.MinImageCount = MAX_FRAMES_IN_FLIGHT;
|
||||
init_info.ImageCount = static_cast<uint32_t>(swapchainImages.size());
|
||||
init_info.ImageCount = static_cast<uint32_t>(swapchain_images_.size());
|
||||
init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT;
|
||||
init_info.Allocator = nullptr;
|
||||
init_info.CheckVkResultFn = nullptr;
|
||||
|
|
@ -345,7 +305,7 @@ private:
|
|||
vkWaitForFences(device_, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX);
|
||||
|
||||
uint32_t imageIndex;
|
||||
VkResult result = vkAcquireNextImageKHR(device_, swapchain, UINT64_MAX,
|
||||
VkResult result = vkAcquireNextImageKHR(device_, swapchain_, UINT64_MAX,
|
||||
imageAvailableSemaphores[currentFrame],
|
||||
VK_NULL_HANDLE, &imageIndex);
|
||||
|
||||
|
|
@ -393,7 +353,7 @@ private:
|
|||
presentInfo.waitSemaphoreCount = 1;
|
||||
presentInfo.pWaitSemaphores = signalSemaphores;
|
||||
|
||||
VkSwapchainKHR swapChains[] = {swapchain};
|
||||
VkSwapchainKHR swapChains[] = {swapchain_};
|
||||
presentInfo.swapchainCount = 1;
|
||||
presentInfo.pSwapchains = swapChains;
|
||||
|
||||
|
|
@ -432,7 +392,7 @@ private:
|
|||
renderPassInfo.renderPass = renderPass;
|
||||
renderPassInfo.framebuffer = framebuffers[imageIndex];
|
||||
renderPassInfo.renderArea.offset = {0, 0};
|
||||
renderPassInfo.renderArea.extent = swapchainExtent;
|
||||
renderPassInfo.renderArea.extent = swapchain_extent_;
|
||||
|
||||
VkClearValue clearColor = {{{0.0f, 0.0f, 0.0f, 1.0f}}};
|
||||
renderPassInfo.clearValueCount = 1;
|
||||
|
|
@ -509,7 +469,7 @@ private:
|
|||
}
|
||||
|
||||
void cleanupSwapchain() {
|
||||
vkDestroySwapchainKHR(device_, swapchain, nullptr);
|
||||
vkDestroySwapchainKHR(device_, this->swapchain_, nullptr);
|
||||
}
|
||||
|
||||
void cleanup() {
|
||||
|
|
@ -558,10 +518,10 @@ private:
|
|||
VkDevice device_;
|
||||
VkQueue graphics_queue_;
|
||||
|
||||
VkSwapchainKHR swapchain;
|
||||
VkFormat swapchainImageFormat;
|
||||
VkExtent2D swapchainExtent;
|
||||
std::vector<VkImage> swapchainImages;
|
||||
VkSwapchainKHR swapchain_;
|
||||
VkFormat swapchain_image_format_;
|
||||
VkExtent2D swapchain_extent_;
|
||||
std::vector<VkImage> swapchain_images_;
|
||||
std::vector<VkImageView> swapchainImageViews;
|
||||
VkRenderPass renderPass;
|
||||
std::vector<VkFramebuffer> framebuffers;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue