Files
evk/evk/evkSwapChain.c
T
2026-05-01 20:32:57 +03:00

98 lines
3.5 KiB
C

#include "evkSwapChain.h"
#include "evk.h"
evkSwapChain evkCreateSwapChain(evkSwapChainCreateInfo createInfo)
{
evkSwapChain swapChain;
swapChain.surface = createInfo.surface;
VkSurfaceCapabilitiesKHR surfaceCaps;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(createInfo.device._physicalDevice, createInfo.surface, &surfaceCaps);
if(surfaceCaps.maxImageCount == 0)
surfaceCaps.maxImageCount = UInt32.MAX;
VkCompositeAlphaFlagBitsKHR compositeAlpha =
(surfaceCaps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)
? VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
: (surfaceCaps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR)
? VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR
: (surfaceCaps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR)
? VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR
: VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
u32 surfaceFormatCount = 0;
vkGetPhysicalDeviceSurfaceFormatsKHR(createInfo.device._physicalDevice, createInfo.surface, &surfaceFormatCount, NULL);
VkSurfaceFormatKHR surfaceFormats[surfaceFormatCount];
vkGetPhysicalDeviceSurfaceFormatsKHR(createInfo.device._physicalDevice, createInfo.surface, &surfaceFormatCount, surfaceFormats);
// TODO Add format picking logic
swapChain.surfaceFormat = surfaceFormats[0];
u32 buffering = min(max(createInfo.imageCount, surfaceCaps.minImageCount), surfaceCaps.maxImageCount);
VkExtent2D imageExtent = surfaceCaps.currentExtent;
if(imageExtent.width == UInt32.MAX)
imageExtent.width = createInfo.width;
if(imageExtent.height == UInt32.MAX)
imageExtent.height = createInfo.height;
VkSwapchainCreateInfoKHR swapChainCreateInfo = {
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
.surface = swapChain.surface,
.minImageCount = buffering,
.imageFormat = swapChain.surfaceFormat.format,
.imageColorSpace = swapChain.surfaceFormat.colorSpace,
.imageExtent = imageExtent,
.imageArrayLayers = 1,
.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
.preTransform = surfaceCaps.currentTransform,
.compositeAlpha = compositeAlpha,
.presentMode = VK_PRESENT_MODE_MAILBOX_KHR,
.clipped = VK_TRUE,
.oldSwapchain = VK_NULL_HANDLE,
};
EVK_ASSERT(vkCreateSwapchainKHR(createInfo.device.vk, &swapChainCreateInfo, NULL, &swapChain.vk));
vkGetSwapchainImagesKHR(createInfo.device.vk, swapChain.vk, &buffering, NULL);
VkImage swapChainVkImages[buffering];
vkGetSwapchainImagesKHR(createInfo.device.vk, swapChain.vk, &buffering, swapChainVkImages);
swapChain.images = vec_init(evkImage);
swapChain.imageViews = vec_init(evkImageView);
vec_setlen(&swapChain.images, buffering);
vec_setlen(&swapChain.imageViews, buffering);
for(u32 i = 0; i < buffering; i++)
{
swapChain.images[i] = (evkImage) {
.vk = swapChainVkImages[i],
.width = imageExtent.width,
.height = imageExtent.height,
.format = swapChain.surfaceFormat.format
};
swapChain.imageViews[i] = evkCreateImageView(createInfo.device, swapChain.images[i],
EV_DEFAULT(evkImageViewCreateInfo,
viewAspect = VK_IMAGE_ASPECT_COLOR_BIT
)
);
}
return swapChain;
}
void evkDestroySwapChain(evkDevice device, evkSwapChain swapChain)
{
for(i32 i = 0; i < vec_len(&swapChain.imageViews); i++)
{
vkDestroyImageView(device.vk, swapChain.imageViews[i].vk, NULL);
}
vec_fini(&swapChain.imageViews);
vec_fini(&swapChain.images);
vkDestroySwapchainKHR(device.vk, swapChain.vk, NULL);
}