summaryrefslogtreecommitdiff
path: root/src/vk/renderer.cpp
diff options
context:
space:
mode:
authorFrederico Linhares <fred@linhares.blue>2022-09-20 11:26:29 -0300
committerFrederico Linhares <fred@linhares.blue>2022-09-21 14:23:39 -0300
commitdafe4a4335f48ce4098935bdf0333beac2ded2ed (patch)
treeaebca9e2c4bbf07c796fdae3def4617690d71cf0 /src/vk/renderer.cpp
parent3d6ca447a7104c499e92fc954affdaf4bf011388 (diff)
refa All views in use shares the same descriptor pool
Diffstat (limited to 'src/vk/renderer.cpp')
-rw-r--r--src/vk/renderer.cpp71
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};