89 lines
3.1 KiB
C++
89 lines
3.1 KiB
C++
//
|
|
// Created by Vicente Ferrari Smith on 13.02.26.
|
|
//
|
|
|
|
#include "swapchain.h"
|
|
#include <print>
|
|
|
|
void createSwapchain(GLFWwindow* window) {
|
|
int fbWidth, fbHeight;
|
|
glfwGetFramebufferSize(window, &fbWidth, &fbHeight);
|
|
|
|
swapchain_extent = {
|
|
static_cast<uint32_t>(fbWidth),
|
|
static_cast<uint32_t>(fbHeight)
|
|
};
|
|
|
|
VkPhysicalDeviceSurfaceInfo2KHR surfaceInfo{
|
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR,
|
|
.pNext = nullptr,
|
|
.surface = surface,
|
|
};
|
|
|
|
VkSurfaceCapabilities2KHR surfCapabilities{
|
|
.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR,
|
|
};
|
|
|
|
vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, &surfaceInfo, &surfCapabilities);
|
|
|
|
MAX_FRAMES_IN_FLIGHT = std::min(surfCapabilities.surfaceCapabilities.minImageCount + 1, surfCapabilities.surfaceCapabilities.maxImageCount);
|
|
|
|
const VkSwapchainCreateInfoKHR sci{
|
|
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
|
|
.surface = surface,
|
|
.minImageCount = MAX_FRAMES_IN_FLIGHT,
|
|
.imageFormat = swapchain_format.format,
|
|
.imageColorSpace = swapchain_format.colorSpace,
|
|
.imageExtent = swapchain_extent,
|
|
.imageArrayLayers = 1,
|
|
.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
|
|
.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
|
.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
|
|
.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
|
|
.presentMode = VK_PRESENT_MODE_FIFO_KHR,
|
|
.clipped = VK_TRUE
|
|
};
|
|
|
|
vkCreateSwapchainKHR(device, &sci, nullptr, &swapchain);
|
|
|
|
uint32_t imgCount;
|
|
vkGetSwapchainImagesKHR(device, swapchain, &imgCount, nullptr);
|
|
std::print("imgCount: {}", imgCount);
|
|
images = std::vector<VkImage>(imgCount);
|
|
vkGetSwapchainImagesKHR(device, swapchain, &imgCount, images.data());
|
|
|
|
imageLayouts = std::vector<VkImageLayout>(
|
|
imgCount,
|
|
VK_IMAGE_LAYOUT_UNDEFINED
|
|
);
|
|
|
|
imageViews = std::vector<VkImageView>(imgCount);
|
|
|
|
const VkSemaphoreCreateInfo seci{
|
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
|
|
};
|
|
|
|
renderFinished.resize(imgCount);
|
|
|
|
for (uint32_t i = 0; i < imgCount; i++) {
|
|
VkImageViewCreateInfo ivci{};
|
|
ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
|
ivci.image = images[i];
|
|
ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
|
ivci.format = swapchain_format.format; // must match swapchain format
|
|
ivci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
|
|
ivci.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
|
|
ivci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
|
|
ivci.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
|
|
ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
ivci.subresourceRange.baseMipLevel = 0;
|
|
ivci.subresourceRange.levelCount = 1;
|
|
ivci.subresourceRange.baseArrayLayer = 0;
|
|
ivci.subresourceRange.layerCount = 1;
|
|
|
|
vkCreateImageView(device, &ivci, nullptr, &imageViews[i]);
|
|
|
|
vkCreateSemaphore(device, &seci, nullptr, &renderFinished[i]);
|
|
}
|
|
}
|