X-Git-Url: https://eleni.mutantstargoat.com/git/?p=demo;a=blobdiff_plain;f=src%2Fvulkan%2Fvk.cc;fp=src%2Fvulkan%2Fvk.cc;h=9297e6358326d30907cc7f4c6784c8c84e4e2131;hp=f5829ab13c53e95de8179357f3e2a5358cb973c4;hb=9d97500df375665ce6757c1341373cdd34fd9235;hpb=8fb0cca684e078cd2537070c53ad970ebbc2e9a7 diff --git a/src/vulkan/vk.cc b/src/vulkan/vk.cc index f5829ab..9297e63 100644 --- a/src/vulkan/vk.cc +++ b/src/vulkan/vk.cc @@ -21,20 +21,28 @@ extern GLFWwindow *win; extern int win_w; extern int win_h; -static VkCommandBuffer cmd_buf; // command buffer used at zbuffer creation +//command buffers +static VkCommandBuffer init_buf; +static VkCommandBuffer rbufs[2]; //depth buffer static VkImage dimg; static VkImageView dview; +static const VkFormat dformat = VK_FORMAT_D32_SFLOAT_S8_UINT; //swapchain static VkImage *images; static VkImageView *iviews; static uint32_t num_images; +//renderpass +static VkRenderPass rpass; +static VkFramebuffer fbs[2]; +//semaphores-drawing-presentation +static uint32_t curr_img; // current sc image +static VkSemaphore psema; + /* static variables */ static VkDeviceMemory gpu_mem; // to be replaced when I fix the allocator -// zbuffer image, view: - -VkCommandBuffer *swapchain_cmd_bufs; +static Vec4 clear_color(1, 0.1, 0.1, 1.0); /* static functions */ static void error_callback(int error, const char *descr); @@ -47,13 +55,15 @@ static void swapbuffers(); static void begin_drawing(); static void end_drawing(); -static bool create_swapchain(); -static bool begin_command_buffer(); -static bool create_swapchain_image_views(VkFormat format); +static bool create_swapchain(VkSwapchainKHR *sc); +static bool begin_init_command_buffer(VkCommandBuffer *cb); static bool create_zbuffer(); - -static bool create_swapchain_cmd_bufs(VkCommandPool vk_pool); -static bool record_cmd_clear(float r, float g, float b); +static bool create_renderpass(); +static bool create_framebuffers(VkFramebuffer *fb, VkImageView *views); +static bool end_init_command_buffer(VkCommandBuffer *cb); +static bool allocate_rendering_command_buffers(VkCommandBuffer *bufs); +static void free_rendering_command_buffers(VkCommandBuffer *bufs, int count); +static bool begin_rendering_command_buffers(VkCommandBuffer *bufs, int count); bool init_vulkan() { @@ -93,13 +103,13 @@ bool init_vulkan() return false; } - if(!create_swapchain()) { + if(!create_swapchain(&vk_swapchain)) { fprintf(stderr, "Failed to create swapchain.\n"); return false; } - cmd_buf = VK_NULL_HANDLE; - if(!begin_command_buffer()) { + init_buf = VK_NULL_HANDLE; + if(!begin_init_command_buffer(&init_buf)) { fprintf(stderr, "Failed to start VK_NULL_HANDLE command buffer.\n"); return false; } @@ -109,51 +119,45 @@ bool init_vulkan() return false; } - 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(!vku_create_semaphores()) + if(!create_renderpass()) { + fprintf(stderr, "Failed to create the renderpass.\n"); return false; + } - if(!(vk_swapchain = vku_create_swapchain(vk_surface, win_w, win_h, 2, - VK_PRESENT_MODE_IMMEDIATE_KHR, 0))) { - fprintf(stderr, "Failed to create swapchain.\n"); + if(!create_framebuffers(fbs, iviews)) { + fprintf(stderr, "Failed to create the framebuffer.\n"); return false; } - vkswapchain_images = vku_get_swapchain_images(vk_swapchain, &vknum_swapchain_images); - if(!vkswapchain_images) { - fprintf(stderr, "Failed to get swapchain images.\n"); + if(!end_init_command_buffer(&init_buf)) { + fprintf(stderr, "Failed to end the command buffer.\n"); 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(!create_swapchain_cmd_bufs(vk_pool)) { + /* rendering command buffers */ + if(!allocate_rendering_command_buffers(rbufs)) { + fprintf(stderr, "Failed to allocate rendering command buffers.\n"); return false; } - if(!record_cmd_clear(1.0, 0.1, 0.1)) + if(!begin_rendering_command_buffers(rbufs, 2)) { + fprintf(stderr, "Failed to begin rendering command buffers.\n"); return false; - */ + } + + 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; return true; } -static bool create_swapchain() +static bool create_swapchain(VkSwapchainKHR *sc) { /* surface capabilities */ VkSurfaceCapabilitiesKHR scap; @@ -188,8 +192,8 @@ static bool create_swapchain() break; } if((scmode != VK_PRESENT_MODE_MAILBOX_KHR) && (modes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR)) { - //fallback - scmode = VK_PRESENT_MODE_IMMEDIATE_KHR; + //fallback + scmode = VK_PRESENT_MODE_IMMEDIATE_KHR; } } @@ -214,36 +218,25 @@ static bool create_swapchain() printf("num_images : %u\n", num_images); assert(num_images > 0); + images = new VkImage[num_images]; + iviews = new VkImageView[num_images]; + /* transform flags */ VkSurfaceTransformFlagBitsKHR pre_transf = scap.currentTransform; if(scap.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) pre_transf = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; /* find suitable colorspace, format */ - uint32_t fcount; - if(vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical, vk_surface, &fcount, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to get format count for physical device.\n"); - return false; - } - if(fcount == 0) { - fprintf(stderr, "No color formats were found.\n"); - return false; - } - VkFormat format; VkColorSpaceKHR colorspace; - VkSurfaceFormatKHR *formats = new VkSurfaceFormatKHR[fcount]; - if(vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical, vk_surface, &fcount, formats) != VK_SUCCESS) { - fprintf(stderr, "Failed to get surface formats.\n"); + VkSurfaceFormatKHR sformat; + if(!vku_get_surface_format(vk_physical, vk_surface, &sformat)) { return false; } - if((fcount == 1) && (formats[0].format == VK_FORMAT_UNDEFINED)) { - format = VK_FORMAT_B8G8R8_UNORM; - } else { - format = formats[0].format; - } - colorspace = formats[0].colorSpace; + + format = sformat.format; + colorspace = sformat.colorSpace; /* creating the swapchain */ VkSwapchainCreateInfoKHR sinfo; @@ -264,39 +257,23 @@ static bool create_swapchain() sinfo.oldSwapchain = VK_NULL_HANDLE; //TODO sinfo.clipped = VK_TRUE; //TODO - if(vkCreateSwapchainKHR(vk_device, &sinfo, 0, &vk_swapchain) != VK_SUCCESS) { + if(vkCreateSwapchainKHR(vk_device, &sinfo, 0, sc) != VK_SUCCESS) { fprintf(stderr, "Failed to create swapchain.\n"); return false; } - if(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &num_images, 0) != VK_SUCCESS) { + if(vkGetSwapchainImagesKHR(vk_device, *sc, &num_images, 0) != VK_SUCCESS) { fprintf(stderr, "Failed to get the number of the swapchain images.\n"); return false; } - images = new VkImage[num_images]; - if(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &num_images, images) != VK_SUCCESS) { + if(vkGetSwapchainImagesKHR(vk_device, *sc, &num_images, images) != VK_SUCCESS) { fprintf(stderr, "Failed to get the swapchain images.\n"); return false; } - assert(images); - if(!create_swapchain_image_views(format)) { - fprintf(stderr, "Failed to create image views for the swapchain images.\n"); - return false; - } - - // create renderpass - - - return true; -} - -static bool create_swapchain_image_views(VkFormat format) -{ VkImageViewCreateInfo ivinf; memset(&ivinf, 0, sizeof ivinf); - ivinf.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; ivinf.format = format; ivinf.components = { @@ -310,21 +287,23 @@ static bool create_swapchain_image_views(VkFormat format) ivinf.subresourceRange.layerCount = 1; ivinf.viewType = VK_IMAGE_VIEW_TYPE_2D; - iviews = new VkImageView[num_images]; for(uint32_t i=0; i