hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/platform/vulkan/vulkan_device.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/vulkan/vulkan_device.cpp')
-rw-r--r--src/platform/vulkan/vulkan_device.cpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/platform/vulkan/vulkan_device.cpp b/src/platform/vulkan/vulkan_device.cpp
index d744883..b4c2630 100644
--- a/src/platform/vulkan/vulkan_device.cpp
+++ b/src/platform/vulkan/vulkan_device.cpp
@@ -119,7 +119,18 @@ namespace Donut::RHI
auto VulkanDevice::run_offscreen(const std::function<void(CommandList&)>& record) -> void
{
vkDeviceWaitIdle(m_device);
- vkResetDescriptorPool(m_device, m_frame_pools[0], 0);
+
+ if (m_offscreen_pool == VK_NULL_HANDLE)
+ {
+ VkDescriptorPoolSize sizes[2] = {
+ { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 32 },
+ { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 32 },
+ };
+ VkDescriptorPoolCreateInfo dpci{ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO };
+ dpci.maxSets = 16; dpci.poolSizeCount = 2; dpci.pPoolSizes = sizes;
+ vkCreateDescriptorPool(m_device, &dpci, nullptr, &m_offscreen_pool);
+ }
+ vkResetDescriptorPool(m_device, m_offscreen_pool, 0);
VkCommandBufferAllocateInfo cbai{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };
cbai.commandPool = m_command_pool; cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; cbai.commandBufferCount = 1;
@@ -127,10 +138,11 @@ namespace Donut::RHI
VkCommandBufferBeginInfo bi{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; bi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
vkBeginCommandBuffer(cmd, &bi);
- m_cmds.m_device = m_device; m_cmds.m_cmd = cmd;
- m_cmds.m_swapchain_rp = m_swapchain_rp; m_cmds.m_swapchain_fb = VK_NULL_HANDLE; m_cmds.m_extent = m_extent;
- m_cmds.m_frame_pool = m_frame_pools[0]; m_cmds.m_pipe = nullptr;
- record(m_cmds);
+ VkCommandListR ocmds;
+ ocmds.m_device = m_device; ocmds.m_cmd = cmd;
+ ocmds.m_swapchain_rp = m_swapchain_rp; ocmds.m_swapchain_fb = VK_NULL_HANDLE; ocmds.m_extent = m_extent;
+ ocmds.m_frame_pool = m_offscreen_pool; ocmds.m_pipe = nullptr;
+ record(ocmds);
vkEndCommandBuffer(cmd);
VkSubmitInfo si{ VK_STRUCTURE_TYPE_SUBMIT_INFO }; si.commandBufferCount = 1; si.pCommandBuffers = &cmd;
@@ -262,6 +274,7 @@ namespace Donut::RHI
if (m_imgui_pool) vkDestroyDescriptorPool(m_device, m_imgui_pool, nullptr);
for (auto p : m_frame_pools) vkDestroyDescriptorPool(m_device, p, nullptr);
m_frame_pools.clear();
+ if (m_offscreen_pool) { vkDestroyDescriptorPool(m_device, m_offscreen_pool, nullptr); m_offscreen_pool = VK_NULL_HANDLE; }
for (auto s : m_render_finished) vkDestroySemaphore(m_device, s, nullptr);
for (auto s : m_image_available) vkDestroySemaphore(m_device, s, nullptr);
for (auto f : m_in_flight) vkDestroyFence(m_device, f, nullptr);