From 32feb79dc3b9ddeeab84a0329d53b8aaff86bb80 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Tue, 28 Nov 2017 11:46:49 +0200 Subject: [PATCH] backup - needs fixing --- src/gfxapi.cc | 3 + src/gfxapi.h | 3 + src/main.cc | 6 +- src/opengl/opengl.cc | 19 +++ src/vulkan/shader-vk.h | 10 +- src/vulkan/vk.cc | 190 ++++++++++++++++++++++++++---- src/vulkan/vkutil.cc | 303 +++++++----------------------------------------- src/vulkan/vkutil.h | 21 ++-- 8 files changed, 263 insertions(+), 292 deletions(-) diff --git a/src/gfxapi.cc b/src/gfxapi.cc index f17055f..2dead6f 100644 --- a/src/gfxapi.cc +++ b/src/gfxapi.cc @@ -19,6 +19,9 @@ void (*gfx_zbuffer)(bool enable); void (*gfx_cull_face)(Gfx_cull_face cf); void (*gfx_reshape)(int width, int height); void (*gfx_wireframe)(bool enable); +void (*gfx_swapbuffers)(); +void (*gfx_begin_drawing)(); +void (*gfx_end_drawing)(); bool gfx_init(Gfx_API api) { diff --git a/src/gfxapi.h b/src/gfxapi.h index d766021..80d996a 100644 --- a/src/gfxapi.h +++ b/src/gfxapi.h @@ -23,6 +23,9 @@ extern void (*gfx_zbuffer)(bool enable); extern void (*gfx_cull_face)(Gfx_cull_face cf); extern void (*gfx_reshape)(int width, int height); extern void (*gfx_wireframe)(bool enable); +extern void (*gfx_swapbuffers)(); +extern void (*gfx_begin_drawing)(); +extern void (*gfx_end_drawing)(); bool gfx_init(Gfx_API api); void gfx_cleanup(); diff --git a/src/main.cc b/src/main.cc index 4d0dd42..92dc433 100644 --- a/src/main.cc +++ b/src/main.cc @@ -115,7 +115,7 @@ int main(int argc, char **argv) while(!glfwWindowShouldClose(win)) { display(); - glfwSwapBuffers(win); + gfx_swapbuffers(); glfwPollEvents(); } @@ -367,10 +367,14 @@ static void display() camera->set_orbit_params(cam_theta, cam_phi, cam_dist); camera->set_position(cam_pos.x, cam_pos.y, cam_pos.z); + gfx_begin_drawing(); + gfx_clear(0.1, 0.1, 0.1); terrain_rend->draw(); cow_rend->draw(); + + gfx_end_drawing(); } static bool gen_poisson(std::vector &points, float min_dist, float radius) diff --git a/src/opengl/opengl.cc b/src/opengl/opengl.cc index 66dd002..00b42f5 100644 --- a/src/opengl/opengl.cc +++ b/src/opengl/opengl.cc @@ -15,6 +15,9 @@ static void zbuffer(bool enable); static void cull_face(Gfx_cull_face cf); static void reshape(int width, int height) {} static void wireframe(bool enable); +static void swapbuffers(); +static void begin_drawing(); +static void end_drawing(); bool init_opengl() { @@ -45,6 +48,9 @@ bool init_opengl() gfx_cull_face = cull_face; gfx_reshape = reshape; gfx_wireframe = wireframe; + gfx_swapbuffers = swapbuffers; + gfx_begin_drawing = begin_drawing; + gfx_end_drawing = end_drawing; // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); return true; @@ -101,3 +107,16 @@ static void wireframe(bool enabled) else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } + +static void swapbuffers() +{ + glfwSwapBuffers(win); +} + +static void begin_drawing() +{ +} + +static void end_drawing() +{ +} diff --git a/src/vulkan/shader-vk.h b/src/vulkan/shader-vk.h index 88e07bc..1914a4f 100644 --- a/src/vulkan/shader-vk.h +++ b/src/vulkan/shader-vk.h @@ -4,6 +4,13 @@ #include #include "shader.h" +/* each shader program will correspond to a pipeline. The pipeline + * must have the cull, zbuffer etc since they can't be dynamic states */ + +struct Pipeline { + +}; + class ShaderVK : public Shader { protected: @@ -23,6 +30,7 @@ public: class ShaderProgramVK : public ShaderProgram { protected: + Pipeline pipeline; /*ubo*/ public: @@ -49,4 +57,4 @@ public: virtual void set_uniform_matrix(int location, const Mat4 &mat) override; }; -#endif // SHADER_VK_H_ \ No newline at end of file +#endif // SHADER_VK_H_ 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 #include #include #include @@ -10,14 +11,9 @@ /* global variables */ -VkPipeline *vkgraphics_pipeline; +VkPipeline *vkgparent_pipeline; VkFramebuffer *vkfbufs; VkRenderPass vkrpass; -VkSwapchainKHR vkswapchain; -VkImage *vkswapchain_images; -VkImageView *vkswapchain_views; -int vknum_swapchain_images; -int vknext_swapchain_image; VkSurfaceKHR vksurface; VkInstance vkinst; VkPhysicalDevice vkpdev; @@ -27,6 +23,14 @@ VkCommandPool vkcmdpool; VkCommandBuffer vkcmdbuf; /* primary command buffer */ int vkqfamily; +VkSemaphore vk_img_avail_sema; +VkSemaphore vk_rend_done_sema; +VkSwapchainKHR vkswapchain; +VkImage *vkswapchain_images; +VkImageView *vkswapchain_views; +int vknum_swapchain_images; +int vk_curr_swapchain_image; + /* static functions */ static const char *get_device_name_str(VkPhysicalDeviceType type); static const char *get_memtype_flags_str(VkMemoryPropertyFlags flags); @@ -257,6 +261,10 @@ void vku_cleanup() if(vkinst) { vkDeviceWaitIdle(vkdev); vkDestroyCommandPool(vkdev, vkcmdpool, 0); + + vkDestroySemaphore(vkdev, vk_img_avail_sema, 0); + vkDestroySemaphore(vkdev, vk_rend_done_sema, 0); + vkDestroyDevice(vkdev, 0); vkDestroyInstance(vkinst, 0); vkinst = 0; @@ -266,6 +274,25 @@ void vku_cleanup() phys_devices = 0; } +bool vku_create_semaphores() +{ + VkSemaphoreCreateInfo sinf; + memset(&sinf, 0, sizeof sinf); + + sinf.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + if(vkCreateSemaphore(vkdev, &sinf, 0, &vk_img_avail_sema) != VK_SUCCESS) { + fprintf(stderr, "Failed to create semaphore\n"); + return false; + } + + if(vkCreateSemaphore(vkdev, &sinf, 0, &vk_rend_done_sema) != VK_SUCCESS) { + fprintf(stderr, "Failed to create semaphore\n"); + return false; + } + + return true; +} + VkCommandBuffer vku_alloc_cmdbuf(VkCommandPool pool, VkCommandBufferLevel level) { VkCommandBuffer cmdbuf; @@ -543,257 +570,6 @@ void vku_cmd_copybuf(VkCommandBuffer cmdbuf, VkBuffer dest, int doffs, vkCmdCopyBuffer(cmdbuf, src, dest, 1, ©); } -/* paste - -static bool create_instance() -{ - uint32_t layer_count = 0; - std::vector enabled_layers; - - if(vkEnumerateInstanceLayerProperties(&layer_count, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to query layer properties.\n"); - return false; - } - - if(layer_count > 0) { - VkLayerProperties *layers = (VkLayerProperties *)alloca(layer_count * sizeof *layers); - vkEnumerateInstanceLayerProperties(&layer_count, layers); - for(uint32_t i=0; i enabled_extensions; - - if(vkEnumerateInstanceExtensionProperties(0, &extensions_count, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to enumerate instance extension properties\n"); - return false; - } - - if(extensions_count > 0) { - VkExtensionProperties *extensions = (VkExtensionProperties *)alloca(extensions_count * sizeof *extensions); - vkEnumerateInstanceExtensionProperties(0, &extensions_count, extensions); - - for(uint32_t i=0; i 0) { - VkLayerProperties *layers = (VkLayerProperties*)alloca(layer_count * sizeof *layers); - vkEnumerateDeviceLayerProperties(pdev, &layer_count, layers); - printf("%u layers found.\n", layer_count); - for(uint32_t i=0; i #include -extern VkPipeline *vkgraphics_pipeline; +extern VkPipeline *vkgparent_pipeline; extern VkDescriptorSet *vkdescset; extern VkFramebuffer *vkfbufs; extern VkRenderPass vkrpass; -extern VkSwapchainKHR vkswapchain; -extern VkImage *vkswapchain_images; -extern VkImageView *vkswapchain_views; -extern int vknum_swapchain_images; -extern VkSurfaceKHR vksurface; extern VkInstance vkinst; extern VkPhysicalDevice vkpdev; extern VkDevice vkdev; @@ -20,7 +15,16 @@ extern VkQueue vkq; extern VkCommandPool vkcmdpool; extern VkCommandBuffer vkcmdbuf; /* primary command buffer */ extern int vkqfamily; -extern int vknext_swapchain_image; + +/* presentation */ +extern VkSurfaceKHR vksurface; +extern VkSwapchainKHR vkswapchain; +extern int vknum_swapchain_images; +extern VkImage *vkswapchain_images; +extern VkImageView *vkswapchain_views; +extern int vk_curr_swapchain_image; +extern VkSemaphore vk_img_avail_sema; +extern VkSemaphore vk_rend_done_sema; struct vku_buffer { VkBuffer buf; @@ -36,6 +40,9 @@ bool vku_have_device_extension(const char *name); bool vku_create_device(); void vku_cleanup(); +/* semaphores */ +bool vku_create_semaphores(); + /* command buffers */ VkCommandBuffer vku_alloc_cmdbuf(VkCommandPool pool, VkCommandBufferLevel level); void vku_free_cmdbuf(VkCommandPool pool, VkCommandBuffer buf); -- 1.7.10.4