# HG changeset patch # User John Tsiombikas # Date 1529986803 -10800 # Node ID 9fb6c24691ea774b2042cf0b78f0be21e68efbfa # Parent d34f84bede17c98825889fc0b8d36e02c48b4146 this shit never ends... diff -r d34f84bede17 -r 9fb6c24691ea src/vku.c --- a/src/vku.c Mon Jun 25 08:00:57 2018 +0300 +++ b/src/vku.c Tue Jun 26 07:20:03 2018 +0300 @@ -312,7 +312,7 @@ } VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n, - VkPresentModeKHR pmode, VkSwapchainKHR prev) + VkFormat fmt, VkPresentModeKHR pmode, VkSwapchainKHR prev) { VkSwapchainKHR sc; VkSwapchainCreateInfoKHR inf; @@ -321,7 +321,7 @@ inf.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; inf.surface = surf; inf.minImageCount = n; - inf.imageFormat = VK_FORMAT_B8G8R8A8_UNORM; /* TODO enumerate and choose */ + inf.imageFormat = fmt; inf.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; inf.imageExtent.width = xsz; inf.imageExtent.height = ysz; @@ -366,6 +366,62 @@ return (int)next; } +VkImageView vku_create_view(VkImage img, VkFormat fmt) +{ + VkImageView view; + VkImageViewCreateInfo iv; + + memset(&iv, 0, sizeof iv); + iv.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + iv.image = img; + iv.viewType = VK_IMAGE_VIEW_TYPE_2D; + iv.format = fmt; + iv.components.r = iv.components.g = iv.components.b = iv.components.a = + VK_COMPONENT_SWIZZLE_IDENTITY; + iv.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + iv.subresourceRange.baseMipLevel = 0; + iv.subresourceRange.levelCount = 1; + iv.subresourceRange.baseArrayLayer = 0; + iv.subresourceRange.layerCount = 1; + + if(vkCreateImageView(vkdev, &iv, 0, &view) != 0) { + fprintf(stderr, "vku_create_view failed\n"); + return 0; + } + return view; +} + +void vku_destroy_view(VkImageView view) +{ + vkDestroyImageView(vkdev, view, 0); +} + +VkFramebuffer vku_create_framebuffer(VkImageView view, int width, int height, VkRenderPass rpass) +{ + VkFramebuffer fb; + VkFramebufferCreateInfo fbinf; + + memset(&fbinf, 0, sizeof fbinf); + fbinf.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + fbinf.renderPass = rpass; + fbinf.attachmentCount = 1; + fbinf.pAttachments = &view; + fbinf.width = width; + fbinf.height = height; + fbinf.layers = 1; + + if(vkCreateFramebuffer(vkdev, &fbinf, 0, &fb) != 0) { + fprintf(stderr, "vku_create_framebuffer failed\n"); + return 0; + } + return fb; +} + +void vku_destroy_framebuffer(VkFramebuffer fb) +{ + vkDestroyFramebuffer(vkdev, fb, 0); +} + void vku_present(VkSwapchainKHR sc, int img_idx) { VkPresentInfoKHR inf; diff -r d34f84bede17 -r 9fb6c24691ea src/vku.h --- a/src/vku.h Mon Jun 25 08:00:57 2018 +0300 +++ b/src/vku.h Tue Jun 26 07:20:03 2018 +0300 @@ -13,8 +13,12 @@ VkCommandPool vkcmdpool; VkCommandBuffer vkcmdbuf; /* primary command buffer */ +int swapchain_size; VkImage *swapchain_images; +VkFormat swapchain_image_fmt; +VkImageView *swapchain_views; int next_swapchain_image; +VkFramebuffer *swapchain_framebuf; VkViewport vkvport; VkRenderPass vkrpass; @@ -42,11 +46,17 @@ void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkFence done_fence); VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n, - VkPresentModeKHR pmode, VkSwapchainKHR prev); + VkFormat fmt, 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); +VkImageView vku_create_view(VkImage img, VkFormat fmt); +void vku_destroy_view(VkImageView view); + +VkFramebuffer vku_create_framebuffer(VkImageView view, int width, int height, VkRenderPass rpass); +void vku_destroy_framebuffer(VkFramebuffer fb); + struct vku_buffer *vku_create_buffer(int sz, unsigned int usage); void vku_destroy_buffer(struct vku_buffer *buf); diff -r d34f84bede17 -r 9fb6c24691ea src/wsys_x11.c --- a/src/wsys_x11.c Mon Jun 25 08:00:57 2018 +0300 +++ b/src/wsys_x11.c Tue Jun 26 07:20:03 2018 +0300 @@ -214,26 +214,62 @@ int wsys_process_events(int mode) { + int i; XEvent xev; if(pending & RESHAPE) { VkSwapchainKHR sc; - if(!(sc = vku_create_swapchain(surf, win_width, win_height, 2, VK_PRESENT_MODE_FIFO_KHR, swapchain))) { + VkFormat fmt = VK_FORMAT_B8G8R8A8_UNORM; /* TODO enumerate and choose */ + + printf("DBG reshape\n"); + + if(!vkrpass) { + if(!(vkrpass = vku_create_renderpass(fmt, VK_FORMAT_UNDEFINED))) { + abort(); + } + } + + if(!(sc = vku_create_swapchain(surf, win_width, win_height, 2, fmt, + VK_PRESENT_MODE_FIFO_KHR, swapchain))) { fprintf(stderr, "Failed to create %dx%d double-buffered swapchain\n", win_width, win_height); return -1; } swapchain = sc; free(swapchain_images); + swapchain_size = 2; swapchain_images = vku_get_swapchain_images(sc, 0); next_swapchain_image = vku_get_next_image(swapchain); - if(!vkrpass) { - if(!(vkrpass = vku_create_renderpass(VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_UNDEFINED))) { - abort(); + if(!swapchain_views) { + if(!(swapchain_views = calloc(swapchain_size, sizeof *swapchain_views))) { + fprintf(stderr, "Failed to allocate image views\n"); + return -1; } } + for(i=0; i