# HG changeset patch # User John Tsiombikas # Date 1506093183 -10800 # Node ID 1dd2c7398afc203ab4c383f011ec13042dc748aa # Parent cec4b0e7fce81cb19dc9210cd469c7aa411b0cf0 swapchain images and other tales of woe diff -r cec4b0e7fce8 -r 1dd2c7398afc src/vku.c --- a/src/vku.c Fri Sep 22 17:48:18 2017 +0300 +++ b/src/vku.c Fri Sep 22 18:13:03 2017 +0300 @@ -339,6 +339,49 @@ return sc; } +VkImage *vku_get_swapchain_images(VkSwapchainKHR sc, int *count) +{ + uint32_t nimg; + VkImage *images; + + if(vkGetSwapchainImagesKHR(vkdev, sc, &nimg, 0) != 0) { + return 0; + } + if(!(images = malloc(nimg * sizeof *images))) { + return 0; + } + vkGetSwapchainImagesKHR(vkdev, sc, &nimg, images); + + if(count) *count = (int)nimg; + return images; +} + +int vku_get_next_image(VkSwapchainKHR sc) +{ + uint32_t next; + + if(vkAcquireNextImageKHR(vkdev, sc, UINT64_MAX, 0, 0, &next) != 0) { + return -1; + } + return (int)next; +} + +void vku_present(VkSwapchainKHR sc, int img_idx) +{ + VkPresentInfoKHR inf; + VkResult res; + uint32_t index = img_idx; + + memset(&inf, 0, sizeof inf); + inf.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + inf.swapchainCount = 1; + inf.pSwapchains = ≻ + inf.pImageIndices = &index; + inf.pResults = &res; + + vkQueuePresentKHR(vkq, &inf); +} + struct vku_buffer *vku_create_buffer(int sz, unsigned int usage) { struct vku_buffer *buf; diff -r cec4b0e7fce8 -r 1dd2c7398afc src/vku.h --- a/src/vku.h Fri Sep 22 17:48:18 2017 +0300 +++ b/src/vku.h Fri Sep 22 18:13:03 2017 +0300 @@ -36,6 +36,9 @@ VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n, VkPresentModeKHR pmode, VkSwapchainKHR prev); +VkImage *vku_get_swapchain_images(VkSwapchainKHR sc, int *count); +int vku_get_next_image(VkSwapchainKHR sc); +void vku_present(VkSwapchainKHR sc, int img_idx); struct vku_buffer *vku_create_buffer(int sz, unsigned int usage); void vku_destroy_buffer(struct vku_buffer *buf); diff -r cec4b0e7fce8 -r 1dd2c7398afc src/wsys_x11.c --- a/src/wsys_x11.c Fri Sep 22 17:48:18 2017 +0300 +++ b/src/wsys_x11.c Fri Sep 22 18:13:03 2017 +0300 @@ -26,6 +26,8 @@ static Window win; static VkSurfaceKHR surf; static VkSwapchainKHR swapchain; +static VkImage *swapchain_images; +static int next_swapchain_image; static Atom xa_wm_delete; static int win_width, win_height; static int win_mapped; @@ -198,7 +200,8 @@ void wsys_swap_buffers(void) { - /* TODO */ + vku_present(swapchain, next_swapchain_image); + next_swapchain_image = vku_get_next_image(swapchain); } void wsys_redisplay(void) @@ -223,6 +226,10 @@ } swapchain = sc; + free(swapchain_images); + swapchain_images = vku_get_swapchain_images(sc, 0); + next_swapchain_image = vku_get_next_image(swapchain); + if(cb.reshape) { cb.reshape(win_width, win_height); }