diff options
author | Frederico Linhares <fred@linhares.blue> | 2022-09-20 11:26:29 -0300 |
---|---|---|
committer | Frederico Linhares <fred@linhares.blue> | 2022-09-21 14:23:39 -0300 |
commit | dafe4a4335f48ce4098935bdf0333beac2ded2ed (patch) | |
tree | aebca9e2c4bbf07c796fdae3def4617690d71cf0 /src/vk/renderer.cpp | |
parent | 3d6ca447a7104c499e92fc954affdaf4bf011388 (diff) |
refa All views in use shares the same descriptor pool
Diffstat (limited to 'src/vk/renderer.cpp')
-rw-r--r-- | src/vk/renderer.cpp | 71 |
1 files changed, 57 insertions, 14 deletions
diff --git a/src/vk/renderer.cpp b/src/vk/renderer.cpp index e806716..7531e19 100644 --- a/src/vk/renderer.cpp +++ b/src/vk/renderer.cpp @@ -24,6 +24,48 @@ namespace { void +load_descriptor_pool(void *obj) +{ + auto self = static_cast<VK::Renderer*>(obj); + + uint32_t uniform_buffer_count = 0; + for(auto &view : self->views) + uniform_buffer_count += (view->ub_3d.size() + view->ub_2d.size()); + + VkDescriptorPoolSize descriptor_pool_size{}; + descriptor_pool_size.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + descriptor_pool_size.descriptorCount = uniform_buffer_count; + + VkDescriptorPoolCreateInfo pool_info{}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.pNext = nullptr; + pool_info.flags = 0; + pool_info.maxSets = uniform_buffer_count; + pool_info.poolSizeCount = 1; + pool_info.pPoolSizes = &descriptor_pool_size; + + if(vkCreateDescriptorPool( + cg_core.vk_device_with_swapchain->device, &pool_info, nullptr, + &self->descriptor_pool) != VK_SUCCESS) + throw CommandError{"Failed to create a Vulkan descriptor pool."}; + + for(auto &view : self->views) + view->load_descriptor_sets(self->descriptor_pool); +} + +void +unload_descriptor_pool(void *obj) +{ + auto self = static_cast<VK::Renderer*>(obj); + + for(auto &view : self->views) view->unload_descriptor_sets(); + + vkDestroyDescriptorPool( + cg_core.vk_device_with_swapchain->device, self->descriptor_pool, + nullptr); +} + +void load_queue_family(void *obj) { auto self = static_cast<VK::Renderer*>(obj); @@ -54,9 +96,9 @@ unload_command_pool(void *obj) auto self = static_cast<VK::Renderer*>(obj); vkWaitForFences(cg_core.vk_device_with_swapchain->device, - VK::Swapchain::max_frames_in_flight, - cg_core.vk_swapchain->in_flight_fences.data(), VK_TRUE, - std::numeric_limits<uint64_t>::max()); + VK::Swapchain::max_frames_in_flight, + cg_core.vk_swapchain->in_flight_fences.data(), VK_TRUE, + std::numeric_limits<uint64_t>::max()); vkDestroyCommandPool( self->queue_family->device->device, self->command_pool, nullptr); } @@ -83,6 +125,7 @@ load_draw_command_buffer(void *obj) } const CommandChain loader{ + {&load_descriptor_pool, &unload_descriptor_pool}, {&load_queue_family, nullptr}, {&load_command_pool, &unload_command_pool}, {&load_draw_command_buffer, nullptr} @@ -114,19 +157,19 @@ void Renderer::draw() { vkWaitForFences(cg_core.vk_device_with_swapchain->device, 1, - &cg_core.vk_swapchain->in_flight_fences[ - cg_core.vk_swapchain->current_frame], VK_TRUE, - std::numeric_limits<uint64_t>::max()); + &cg_core.vk_swapchain->in_flight_fences[ + cg_core.vk_swapchain->current_frame], VK_TRUE, + std::numeric_limits<uint64_t>::max()); vkResetFences(cg_core.vk_device_with_swapchain->device, 1, &cg_core.vk_swapchain->in_flight_fences[ - cg_core.vk_swapchain->current_frame]); + cg_core.vk_swapchain->current_frame]); uint32_t image_index; vkAcquireNextImageKHR( cg_core.vk_device_with_swapchain->device, cg_core.vk_swapchain->swapchain, std::numeric_limits<uint64_t>::max(), cg_core.vk_swapchain->image_available_semaphores[ - cg_core.vk_swapchain->current_frame], VK_NULL_HANDLE, &image_index); + cg_core.vk_swapchain->current_frame], VK_NULL_HANDLE, &image_index); VkCommandBuffer draw_command_buffer = this->draw_command_buffers[cg_core.vk_swapchain->current_frame]; @@ -171,8 +214,8 @@ Renderer::draw() for(auto &view: this->views) cg_core.vk_graphics_pipeline_3d->draw( - view, draw_command_buffer, cg_core.vk_swapchain->current_frame, - image_index); + view, draw_command_buffer, cg_core.vk_swapchain->current_frame, + image_index); vkCmdEndRenderPass(draw_command_buffer); } @@ -214,12 +257,12 @@ Renderer::draw() VkSemaphore wait_semaphores[]{ cg_core.vk_swapchain->image_available_semaphores[ - cg_core.vk_swapchain->current_frame]}; + cg_core.vk_swapchain->current_frame]}; VkPipelineStageFlags wait_stages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; VkSemaphore signal_semaphores[]{ cg_core.vk_swapchain->render_finished_semaphores[ - cg_core.vk_swapchain->current_frame]}; + cg_core.vk_swapchain->current_frame]}; VkSubmitInfo submit_info{}; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; @@ -233,8 +276,8 @@ Renderer::draw() submit_info.pSignalSemaphores = signal_semaphores; if(vkQueueSubmit( - queue.queue, 1, &submit_info, cg_core.vk_swapchain->in_flight_fences[ - cg_core.vk_swapchain->current_frame]) != VK_SUCCESS) + queue.queue, 1, &submit_info, cg_core.vk_swapchain->in_flight_fences[ + cg_core.vk_swapchain->current_frame]) != VK_SUCCESS) throw std::runtime_error{"Failed to submit draw command buffer."}; VkSwapchainKHR swap_chains[]{cg_core.vk_swapchain->swapchain}; |