# HG changeset patch # User John Tsiombikas # Date 1530053875 -10800 # Node ID f8bd29f124a85612fc5f0d76684957ff2cf3df95 # Parent 236f923a00a34ce3e5a633c2fd8ec8f518893534 foo diff -r 236f923a00a3 -r f8bd29f124a8 sdr/pixel.glsl --- a/sdr/pixel.glsl Tue Jun 26 08:42:12 2018 +0300 +++ b/sdr/pixel.glsl Wed Jun 27 01:57:55 2018 +0300 @@ -5,5 +5,5 @@ void main() { - outcolor = vec4(1.0, 0.0, 0.0, 1.0); + outcolor = vec4(0.8, 0.2, 0.1, 1.0); } diff -r 236f923a00a3 -r f8bd29f124a8 sdr/vertex.glsl --- a/sdr/vertex.glsl Tue Jun 26 08:42:12 2018 +0300 +++ b/sdr/vertex.glsl Wed Jun 27 01:57:55 2018 +0300 @@ -1,8 +1,6 @@ #version 450 #extension GL_ARB_separate_shader_objects: enable -layout(location = 0) out vec4 outpos; - const vec3 vdata[] = vec3[]( vec3(-0.5, -0.5, 0.0), vec3(0.5, -0.5, 0.0), @@ -10,5 +8,5 @@ void main() { - outpos = vec4(vdata[gl_VertexIndex], 1.0); + gl_Position = vec4(vdata[gl_VertexIndex], 1.0); } diff -r 236f923a00a3 -r f8bd29f124a8 src/main.c --- a/src/main.c Tue Jun 26 08:42:12 2018 +0300 +++ b/src/main.c Wed Jun 27 01:57:55 2018 +0300 @@ -10,6 +10,8 @@ static struct vku_pipeline pipeline; static VkShaderModule vsdr, psdr; +static VkSemaphore sem_draw_done; +static VkFence fence_draw_done; int main(void) { @@ -26,8 +28,6 @@ wsys_reshape_callback(reshape); wsys_keyboard_callback(keyboard); - wsys_process_events(WSYS_NONBLOCK); - if(!(vsdr = vku_load_shader("sdr/vertex.spv")) || !(psdr = vku_load_shader("sdr/pixel.spv"))) { return 1; @@ -37,14 +37,23 @@ vku_pipeline_shader(&pipeline, vsdr, VK_SHADER_STAGE_VERTEX_BIT); vku_pipeline_shader(&pipeline, psdr, VK_SHADER_STAGE_FRAGMENT_BIT); vku_pipeline_viewport(&pipeline, 0, 0, 800, 600); + vku_pipeline_scissor(&pipeline, 0, 0, 800, 600); vku_pipeline_renderpass(&pipeline, vkrpass); if(!vku_create_pipeline(&pipeline)) { return 1; } + sem_draw_done = vku_create_semaphore(); + fence_draw_done = vku_create_fence(); while(wsys_process_events(WSYS_BLOCKING) != -1); + vku_destroy_fence(fence_draw_done); + vku_destroy_semaphore(sem_draw_done); + vku_destroy_pipeline(&pipeline); + vku_destroy_shader(vsdr); + vku_destroy_shader(psdr); + wsys_destroy_window(); vku_cleanup(); return 0; @@ -52,10 +61,10 @@ static void display(void) { - vkgl_clear_color(1, 0, 0, 1); + vku_begin_cmdbuf(vkcmdbuf, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); + vkgl_clear_color(0.2, 0.2, 0.3, 1); vkgl_clear(VKGL_COLOR_BUFFER_BIT); - vku_begin_cmdbuf(vkcmdbuf, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); vku_begin_renderpass(vkcmdbuf, vkrpass, swapchain_framebuf[next_swapchain_image], VK_SUBPASS_CONTENTS_INLINE); vkCmdBindPipeline(vkcmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline); @@ -63,9 +72,10 @@ vku_end_renderpass(vkcmdbuf); vku_end_cmdbuf(vkcmdbuf); - vku_submit_cmdbuf(vkq, vkcmdbuf, 0); + vku_submit_cmdbuf(vkq, vkcmdbuf, swapchain_getimg_sem, sem_draw_done, fence_draw_done); - wsys_swap_buffers(); + wsys_swap_buffers(sem_draw_done); + vku_wait_fence(fence_draw_done); } static void reshape(int x, int y) diff -r 236f923a00a3 -r f8bd29f124a8 src/vkgl.c --- a/src/vkgl.c Tue Jun 26 08:42:12 2018 +0300 +++ b/src/vkgl.c Wed Jun 27 01:57:55 2018 +0300 @@ -27,7 +27,7 @@ void vkgl_clear(unsigned int flags) { VkImageSubresourceRange wtf; - VkSubmitInfo si; + //VkSubmitInfo si; memset(&wtf, 0, sizeof wtf); @@ -43,7 +43,7 @@ wtf.levelCount = 1; wtf.layerCount = 1; - vku_begin_cmdbuf(vkcmdbuf, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); + //vku_begin_cmdbuf(vkcmdbuf, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); if(flags & VKGL_COLOR_BUFFER_BIT) { vkCmdClearColorImage(vkcmdbuf, swapchain_images[next_swapchain_image], VK_IMAGE_LAYOUT_GENERAL, &st.clear.color, 1, &wtf); @@ -52,12 +52,14 @@ vkCmdClearDepthStencilImage(vkcmdbuf, swapchain_images[next_swapchain_image], VK_IMAGE_LAYOUT_GENERAL, &st.clear.depthStencil, 1, &wtf); } - vku_end_cmdbuf(vkcmdbuf); + //vku_end_cmdbuf(vkcmdbuf); + /* memset(&si, 0, sizeof si); si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; si.commandBufferCount = 1; si.pCommandBuffers = &vkcmdbuf; vkQueueSubmit(vkq, 1, &si, 0); + */ } diff -r 236f923a00a3 -r f8bd29f124a8 src/vkpipe.c --- a/src/vkpipe.c Tue Jun 26 08:42:12 2018 +0300 +++ b/src/vkpipe.c Wed Jun 27 01:57:55 2018 +0300 @@ -30,6 +30,8 @@ st->vport_data.minDepth = 0.0f; st->vport_data.maxDepth = 1.0f; + st->msaa.rasterizationSamples = 1; + st->blend.logicOp = VK_LOGIC_OP_COPY; st->blend.attachmentCount = 1; st->blend.pAttachments = &st->atblend; diff -r 236f923a00a3 -r f8bd29f124a8 src/vku.c --- a/src/vku.c Tue Jun 26 08:42:12 2018 +0300 +++ b/src/vku.c Wed Jun 27 01:57:55 2018 +0300 @@ -27,9 +27,8 @@ static uint32_t vkext_count, vkdevext_count; static VkDebugReportCallbackEXT debug_callback_obj; -static VkResult (*vk_create_debug_report_callback)(VkInstance, - const VkDebugReportCallbackCreateInfoEXT*, const VkAllocationCallbacks*, - VkDebugReportCallbackEXT*); +static PFN_vkCreateDebugReportCallbackEXT vk_create_debug_report_callback; +static PFN_vkDestroyDebugReportCallbackEXT vk_destroy_debug_report_callback; static void (*user_dbg_callback)(const char*, void*); static void *user_dbg_callback_data; @@ -137,7 +136,8 @@ static const char *layer_names[] = { "VK_LAYER_LUNARG_standard_validation", "VK_LAYER_LUNARG_parameter_validation", - "VK_LAYER_LUNARG_core_validation" + "VK_LAYER_LUNARG_core_validation", + "VK_LAYER_LUNARG_image" }; sel_dev = -1; @@ -177,6 +177,7 @@ fprintf(stderr, "FUCK EVERYTHING\n"); return -1; } + vk_destroy_debug_report_callback = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(vk, "vkDestroyDebugReportCallbackEXT"); vku_set_debug_callback(user_dbg_callback, user_dbg_callback_data); /* set debug callback */ @@ -289,11 +290,20 @@ return -1; } - if(!(vkcmdbuf = vku_alloc_cmdbuf(vkcmdpool, VK_COMMAND_BUFFER_LEVEL_PRIMARY))) { - fprintf(stderr, "failed to create primary command buffer\n"); + /* XXX hardcoded 2 command buffers for a swapchain with 2 images */ + if(!(swapchain_cmdbuf = malloc(2 * sizeof *swapchain_cmdbuf))) { + fprintf(stderr, "failed to allocate command buffer array\n"); return -1; } + for(i=0; i<2; i++) { + if(!(swapchain_cmdbuf[i] = vku_alloc_cmdbuf(vkcmdpool, VK_COMMAND_BUFFER_LEVEL_PRIMARY))) { + fprintf(stderr, "failed to create primary command buffer\n"); + return -1; + } + } + vkcmdbuf = swapchain_cmdbuf[0]; + return 0; } @@ -303,6 +313,7 @@ vkDeviceWaitIdle(vkdev); vkDestroyCommandPool(vkdev, vkcmdpool, 0); vkDestroyDevice(vkdev, 0); + vk_destroy_debug_report_callback(vk, debug_callback_obj, 0); vkDestroyInstance(vk, 0); vk = 0; } @@ -355,7 +366,8 @@ vkResetCommandBuffer(buf, 0); } -void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkFence done_fence) +void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkSemaphore sem_wait, + VkSemaphore sem_done, VkFence done_fence) { VkSubmitInfo info; @@ -363,6 +375,14 @@ info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; info.commandBufferCount = 1; info.pCommandBuffers = &buf; + if(sem_wait) { + info.pWaitSemaphores = &sem_wait; + info.waitSemaphoreCount = 1; + } + if(sem_done) { + info.pSignalSemaphores = &sem_done; + info.signalSemaphoreCount = 1; + } vkQueueSubmit(q, 1, &info, done_fence); } @@ -412,13 +432,14 @@ return images; } -int vku_get_next_image(VkSwapchainKHR sc) +int vku_get_next_image(VkSwapchainKHR sc, VkSemaphore semdone) { uint32_t next; - if(vkAcquireNextImageKHR(vkdev, sc, UINT64_MAX, 0, 0, &next) != 0) { + if(vkAcquireNextImageKHR(vkdev, sc, UINT64_MAX, semdone, 0, &next) != 0) { return -1; } + vkcmdbuf = swapchain_cmdbuf[next]; return (int)next; } @@ -478,7 +499,7 @@ vkDestroyFramebuffer(vkdev, fb, 0); } -void vku_present(VkSwapchainKHR sc, int img_idx) +void vku_present(VkSwapchainKHR sc, int img_idx, VkSemaphore sem_wait) { VkPresentInfoKHR inf; VkResult res; @@ -490,6 +511,10 @@ inf.pSwapchains = ≻ inf.pImageIndices = &index; inf.pResults = &res; + if(sem_wait) { + inf.pWaitSemaphores = &sem_wait; + inf.waitSemaphoreCount = 1; + } vkQueuePresentKHR(vkq, &inf); } @@ -622,6 +647,53 @@ vkCmdEndRenderPass(cmdbuf); } +VkSemaphore vku_create_semaphore(void) +{ + VkSemaphore s; + VkSemaphoreCreateInfo sinf; + + memset(&sinf, 0, sizeof sinf); + sinf.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + + if(vkCreateSemaphore(vkdev, &sinf, 0, &s) != 0) { + fprintf(stderr, "vku_create_semaphore failed\n"); + return 0; + } + return s; +} + +void vku_destroy_semaphore(VkSemaphore s) +{ + vkDestroySemaphore(vkdev, s, 0); +} + +VkFence vku_create_fence(void) +{ + VkFence f; + VkFenceCreateInfo finf; + + memset(&finf, 0, sizeof finf); + finf.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + + if(vkCreateFence(vkdev, &finf, 0, &f) != 0) { + fprintf(stderr, "vku_create_fence failed\n"); + return 0; + } + return f; +} + +void vku_destroy_fence(VkFence f) +{ + vkDestroyFence(vkdev, f, 0); +} + +void vku_wait_fence(VkFence f) +{ + vkWaitForFences(vkdev, 1, &f, VK_TRUE, UINT64_MAX); + vkResetFences(vkdev, 1, &f); +} + + #ifdef VK_USE_PLATFORM_XLIB_KHR int vku_xlib_usable_visual(Display *dpy, VisualID vid) { diff -r 236f923a00a3 -r f8bd29f124a8 src/vku.h --- a/src/vku.h Tue Jun 26 08:42:12 2018 +0300 +++ b/src/vku.h Wed Jun 27 01:57:55 2018 +0300 @@ -19,6 +19,8 @@ VkImageView *swapchain_views; int next_swapchain_image; VkFramebuffer *swapchain_framebuf; +VkSemaphore swapchain_getimg_sem; +VkCommandBuffer *swapchain_cmdbuf; VkViewport vkvport; VkRenderPass vkrpass; @@ -45,13 +47,14 @@ void vku_end_cmdbuf(VkCommandBuffer buf); void vku_reset_cmdbuf(VkCommandBuffer buf); -void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkFence done_fence); +void vku_submit_cmdbuf(VkQueue q, VkCommandBuffer buf, VkSemaphore sem_wait, + VkSemaphore sem_done, VkFence done_fence); VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n, 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); +int vku_get_next_image(VkSwapchainKHR sc, VkSemaphore semdone); +void vku_present(VkSwapchainKHR sc, int img_idx, VkSemaphore sem_wait); VkImageView vku_create_view(VkImage img, VkFormat fmt); void vku_destroy_view(VkImageView view); @@ -71,6 +74,13 @@ VkSubpassContents cont); void vku_end_renderpass(VkCommandBuffer cmdbuf); +VkSemaphore vku_create_semaphore(void); +void vku_destroy_semaphore(VkSemaphore s); + +VkFence vku_create_fence(void); +void vku_destroy_fence(VkFence f); +void vku_wait_fence(VkFence f); + /* platform-specific */ #ifdef VK_USE_PLATFORM_XLIB_KHR #include diff -r 236f923a00a3 -r f8bd29f124a8 src/wsys.h --- a/src/wsys.h Tue Jun 26 08:42:12 2018 +0300 +++ b/src/wsys.h Wed Jun 27 01:57:55 2018 +0300 @@ -1,6 +1,8 @@ #ifndef WSYS_H_ #define WSYS_H_ +#include + /* pass to wsys_process_events */ enum { WSYS_BLOCKING = 0, @@ -20,7 +22,7 @@ void wsys_motion_callback(void (*func)(int, int)); void wsys_passive_motion_callback(void (*func)(int, int)); -void wsys_swap_buffers(void); +void wsys_swap_buffers(VkSemaphore sem_wait); void wsys_redisplay(void); void wsys_quit(void); diff -r 236f923a00a3 -r f8bd29f124a8 src/wsys_x11.c --- a/src/wsys_x11.c Tue Jun 26 08:42:12 2018 +0300 +++ b/src/wsys_x11.c Wed Jun 27 01:57:55 2018 +0300 @@ -20,6 +20,7 @@ REDISPLAY = 4 }; +static int reshape(int x, int y); static void proc_event(XEvent *ev); static Display *dpy; @@ -102,7 +103,14 @@ win_width = xsz; win_height = ysz; - pending = RESHAPE | REDISPLAY; + + if(reshape(xsz, ysz) == -1) { + XDestroyWindow(dpy, win); + XCloseDisplay(dpy); + return -1; + } + + pending = REDISPLAY; return 0; } @@ -196,10 +204,10 @@ } } -void wsys_swap_buffers(void) +void wsys_swap_buffers(VkSemaphore sem_wait) { - vku_present(swapchain, next_swapchain_image); - next_swapchain_image = vku_get_next_image(swapchain); + vku_present(swapchain, next_swapchain_image, sem_wait); + next_swapchain_image = vku_get_next_image(swapchain, swapchain_getimg_sem); } void wsys_redisplay(void) @@ -212,67 +220,74 @@ pending |= QUIT; } +static int reshape(int x, int y) +{ + int i; + VkSwapchainKHR sc; + 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, x, y, 2, fmt, + VK_PRESENT_MODE_FIFO_KHR, swapchain))) { + fprintf(stderr, "Failed to create %dx%d double-buffered swapchain\n", x, y); + 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, swapchain_getimg_sem); + + 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