98 lines
3.5 KiB
C
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);
|
|
}
|