WIP create and destroy swapchain
[vkrt] / src / ui.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "ui.h"
5
6 bool
7 vk_create_swapchain(struct vk_ctx *ctx,
8                     int width, int height,
9                     int num_qfam,
10                     struct vk_swapchain *swapchain)
11 {
12     VkSwapchainCreateInfoKHR s_info;
13     VkExtent2D extent;
14
15     extent.width = width;
16     extent.height = height;
17
18     memset(&s_info, 0, sizeof s_info);
19
20     s_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
21     s_info.flags = 0;
22     s_info.surface = swapchain->surface;
23     s_info.minImageCount = 2;
24     s_info.imageFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
25     s_info.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
26     s_info.imageExtent = extent;
27     s_info.imageArrayLayers = 1;
28     s_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
29                         VK_IMAGE_USAGE_SAMPLED_BIT |
30                         VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
31                         VK_IMAGE_USAGE_TRANSFER_DST_BIT;
32
33     s_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
34     s_info.queueFamilyIndexCount = num_qfam; /* how many queue families */
35
36     s_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
37     s_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
38     s_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
39     s_info.clipped = VK_TRUE;
40     s_info.oldSwapchain = VK_NULL_HANDLE;
41
42     if (vkCreateSwapchainKHR(ctx->dev, &s_info, 0,
43                              &swapchain->swapchain) != VK_SUCCESS) {
44         fprintf(stderr, "Failed to create a swapchain.\n");
45         return false;
46     }
47
48     return true;
49 }
50
51 void
52 vk_destroy_swapchain(struct vk_ctx *ctx,
53                      struct vk_swapchain *swapchain)
54 {
55     vkDestroySwapchainKHR(ctx->dev, swapchain->swapchain, 0);
56     vkDestroySurfaceKHR(ctx->inst, swapchain->surface, 0);
57 }