X-Git-Url: http://git.mutantstargoat.com?p=demo;a=blobdiff_plain;f=src%2Fvulkan%2Fvk.cc;h=0e3725b32150a31678535480a9f9a5597a05974e;hp=b29c542da7b1a47de1e372a9d8b9f8fd6b234339;hb=32feb79dc3b9ddeeab84a0329d53b8aaff86bb80;hpb=72995482b98ff2a014ddd737131a0935ead89977 diff --git a/src/vulkan/vk.cc b/src/vulkan/vk.cc index b29c542..0e3725b 100644 --- a/src/vulkan/vk.cc +++ b/src/vulkan/vk.cc @@ -7,6 +7,8 @@ #include #include +#include + #include "gfxapi.h" #include "vkutil.h" @@ -15,6 +17,8 @@ extern GLFWwindow *win; extern int win_w; extern int win_h; +VkCommandBuffer *swapchain_cmd_bufs; + /* static functions */ static void error_callback(int error, const char *descr); static void clear(float r, float g, float b); @@ -22,9 +26,24 @@ static void viewport(int x, int y, int width, int height); static void zbuffer(bool enable); static void cull_face(Gfx_cull_face cf); static void reshape(int width, int height); +static void swapbuffers(); +static void begin_drawing(); +static void end_drawing(); + +static bool create_swapchain_cmd_bufs(VkCommandPool vkcmdpool); +static bool record_cmd_clear(float r, float g, float b); bool init_vulkan() { + gfx_clear = clear; + gfx_viewport = viewport; + gfx_zbuffer = zbuffer; + gfx_cull_face = cull_face; + gfx_reshape = reshape; + gfx_swapbuffers = swapbuffers; + gfx_begin_drawing = begin_drawing; + gfx_end_drawing = end_drawing; + if(!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW.\n"); return false; @@ -58,6 +77,9 @@ bool init_vulkan() return false; } + if(!vku_create_semaphores()) + return false; + if(!(vkswapchain = vku_create_swapchain(vksurface, win_w, win_h, 2, VK_PRESENT_MODE_FIFO_KHR, 0))) { fprintf(stderr, "Failed to create swapchain.\n"); @@ -70,34 +92,26 @@ bool init_vulkan() return false; } - vkswapchain_views = vku_create_image_views(vkswapchain_images, vknum_swapchain_images); - if(!vkswapchain_views) { - fprintf(stderr, "Failed to create swapchain image views.\n"); - delete [] vkswapchain_images; - return false; - } - - if(!vku_create_renderpass()) { - fprintf(stderr, "Failed to create renderpass'\n"); + /* vkswapchain_views = vku_create_image_views(vkswapchain_images, vknum_swapchain_images); + if(!vkswapchain_views) { + fprintf(stderr, "Failed to create swapchain image views.\n"); + delete [] vkswapchain_images; + return false; + } + */ + if(!create_swapchain_cmd_bufs(vkcmdpool)) { return false; } - if(!vku_create_framebuffers(vkswapchain_views, vknum_swapchain_images, win_w, win_h)) { - fprintf(stderr, "Failed to create framebuffers.\n"); + if(!record_cmd_clear(1.0, 0.1, 0.1)) return false; - } - - gfx_clear = clear; - gfx_viewport = viewport; - gfx_zbuffer = zbuffer; - gfx_cull_face = cull_face; - gfx_reshape = reshape; return true; } void cleanup_vulkan() { + vkFreeCommandBuffers(vkdev, vkcmdpool, vknum_swapchain_images, swapchain_cmd_bufs); if(win) { glfwDestroyWindow(win); } @@ -105,11 +119,6 @@ void cleanup_vulkan() //TODOs according to the book: // 1- make sure all threads have been terminated (when I add threads) - - // 2- destroy objects in *reverse* order - vkDestroyRenderPass(vkdev, vkrpass, 0); - vkDestroySurfaceKHR(vkinst, vksurface, 0); - vku_cleanup(); } @@ -130,7 +139,7 @@ static void reshape(int width, int height) delete [] vkswapchain_images; vkswapchain_images = vku_get_swapchain_images(sc, 0); - vknext_swapchain_image = vku_get_next_image(vkswapchain); + vk_curr_swapchain_image = vku_get_next_image(vkswapchain); } static void clear(float r, float g, float b) @@ -148,3 +157,136 @@ static void zbuffer(bool enable) static void cull_face(Gfx_cull_face cf) { } + +static void swapbuffers() +{ +} + +static void begin_drawing() +{ + if((vk_curr_swapchain_image = vku_get_next_image(vkswapchain)) == -1) { + fprintf(stderr, "Failed to get swapchain image. Exiting.\n"); + exit(1); + } +} + +static void end_drawing() +{ + /* submit queue */ + + VkSubmitInfo sinf; + memset(&sinf, 0, sizeof sinf); + sinf.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + sinf.waitSemaphoreCount = 1; + sinf.pWaitSemaphores = &vk_img_avail_sema; + sinf.signalSemaphoreCount = 1; + sinf.pSignalSemaphores = &vk_rend_done_sema; + + // the queue should wait on the semaphore + + VkPipelineStageFlags wait_flags = VK_PIPELINE_STAGE_TRANSFER_BIT; + sinf.pWaitDstStageMask = &wait_flags; + sinf.commandBufferCount = 1; + sinf.pCommandBuffers = &swapchain_cmd_bufs[vk_curr_swapchain_image]; + + if(vkQueueSubmit(vkq, 1, &sinf, VK_NULL_HANDLE) != VK_SUCCESS) { + fprintf(stderr, "Failed to submit drawing command buffer\n"); + exit(1); + } + + /* present drawn image */ + VkPresentInfoKHR pinf; + memset(&pinf, 0, sizeof pinf); + pinf.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + pinf.waitSemaphoreCount = 1; + pinf.pWaitSemaphores = &vk_rend_done_sema; + pinf.swapchainCount = 1; + pinf.pSwapchains = &vkswapchain; + pinf.pImageIndices = (uint32_t *)&vk_curr_swapchain_image; + + if(vkQueuePresentKHR(vkq, &pinf) != VK_SUCCESS) { + fprintf(stderr, "Failed to submit presentation command buffer.\n"); + exit(1); + } +} + +static bool record_cmd_clear(float r, float g, float b) +{ + VkCommandBufferBeginInfo binf; + binf.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + binf.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; + + /* this function must be called outside a renderpass instance */ + const VkClearColorValue pcolor[4] = {r, g, b, 1.0}; + + VkImageSubresourceRange range; + memset(&range, 0, sizeof range); + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.baseMipLevel = 0; + range.baseArrayLayer = 0; + range.layerCount = 1; + + for(int i=0; i