Skip to content

Commit 3e1fa48

Browse files
bug fixes and perf improvement (#289)
1 parent 1a0d24a commit 3e1fa48

File tree

9 files changed

+233
-168
lines changed

9 files changed

+233
-168
lines changed

Tetragrama/src/Components/SceneViewportUIComponent.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,20 @@ namespace Tetragrama::Components
2424
if ((m_viewport_size.x != m_content_region_available_size.x) || (m_viewport_size.y != m_content_region_available_size.y))
2525
{
2626
m_viewport_size = m_content_region_available_size;
27+
m_request_renderer_resize = true;
28+
}
29+
else
30+
{
31+
if (m_request_renderer_resize)
32+
{
33+
GraphicRenderer::SetViewportSize(m_viewport_size.x, m_viewport_size.y);
34+
m_refresh_texture_handle = true;
2735

28-
GraphicRenderer::SetViewportSize(m_viewport_size.x, m_viewport_size.y);
29-
m_refresh_texture_handle = true;
36+
Messengers::IMessenger::SendAsync<ZEngine::Layers::Layer, Messengers::GenericMessage<std::pair<float, float>>>(
37+
EDITOR_RENDER_LAYER_SCENE_REQUEST_RESIZE, Messengers::GenericMessage<std::pair<float, float>>{{m_viewport_size.x, m_viewport_size.y}});
3038

31-
Messengers::IMessenger::SendAsync<ZEngine::Layers::Layer, Messengers::GenericMessage<std::pair<float, float>>>(
32-
EDITOR_RENDER_LAYER_SCENE_REQUEST_RESIZE, Messengers::GenericMessage<std::pair<float, float>>{{m_viewport_size.x, m_viewport_size.y}});
39+
m_request_renderer_resize = false;
40+
}
3341
}
3442

3543
if (m_is_window_hovered && m_is_window_focused)
@@ -82,9 +90,11 @@ namespace Tetragrama::Components
8290

8391
if (m_refresh_texture_handle)
8492
{
85-
VkDescriptorSet old_scene_texture = m_scene_texture;
86-
m_scene_texture = VK_NULL_HANDLE;
93+
VkDescriptorSet old_scene_texture = VK_NULL_HANDLE;
94+
std::swap(m_scene_texture, old_scene_texture);
8795
m_refresh_texture_handle = false;
96+
97+
VulkanDevice::EnqueueForDeletion(DeviceResourceType::DESCRIPTORSET, DirtyResource{.Handle = old_scene_texture, .Data1 = ImGUIRenderer::s_descriptor_pool});
8898
}
8999
auto texture_buffer = texture->GetImage2DBuffer();
90100
m_scene_texture = ImGui_ImplVulkan_AddTexture(texture_buffer->GetSampler(), texture_buffer->GetImageViewHandle(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

Tetragrama/src/Components/SceneViewportUIComponent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ namespace Tetragrama::Components
3333
bool m_is_window_hovered{false};
3434
bool m_is_window_clicked{false};
3535
bool m_refresh_texture_handle{false};
36+
bool m_request_renderer_resize{false};
3637
ImVec2 m_viewport_size{0.f, 0.f};
3738
ImVec2 m_content_region_available_size{0.f, 0.f};
3839
std::array<ImVec2, 2> m_viewport_bounds;

ZEngine/include/ZEngine/Hardwares/VulkanDevice.h

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,28 @@
1010
#include <GLFW/glfw3.h>
1111
#include <vk_mem_alloc.h>
1212

13+
#include <chrono>
14+
#include <thread>
15+
#include <condition_variable>
16+
1317
namespace ZEngine::Hardwares
1418
{
19+
20+
struct DirtyResource
21+
{
22+
void* Handle = nullptr;
23+
void* Data1 = nullptr;
24+
std::chrono::steady_clock::time_point MarkedAsDirtyTime;
25+
Rendering::DeviceResourceType Type;
26+
};
27+
1528
struct QueueView
1629
{
1730
uint32_t FamilyIndex{0xFFFFFFFF};
1831
VkQueue Handle{VK_NULL_HANDLE};
1932
};
2033

21-
struct BufferView
34+
struct BufferView : public DirtyResource
2235
{
2336
VkBuffer Handle{VK_NULL_HANDLE};
2437
VmaAllocation Allocation{nullptr};
@@ -29,7 +42,7 @@ namespace ZEngine::Hardwares
2942
}
3043
};
3144

32-
struct BufferImage
45+
struct BufferImage : public DirtyResource
3346
{
3447
VkImage Handle{VK_NULL_HANDLE};
3548
VkImageView ViewHandle{VK_NULL_HANDLE};
@@ -67,12 +80,11 @@ namespace ZEngine::Hardwares
6780
Rendering::Primitives::Fence* const fence);
6881

6982
static void EnqueueForDeletion(Rendering::DeviceResourceType resource_type, void* const resource_handle);
83+
static void EnqueueForDeletion(Rendering::DeviceResourceType resource_type, DirtyResource resource);
7084

7185
static void EnqueueBufferForDeletion(BufferView& buffer);
7286
static void EnqueueBufferImageForDeletion(BufferImage& buffer);
7387

74-
static void CleanupResource();
75-
static bool HasPendingCleanupResource();
7688
static void Present(VkSwapchainKHR swapchain, uint32_t* frame_image_index, const std::vector<Rendering::Primitives::Semaphore*>& wait_semaphore_collection);
7789

7890
static Rendering::Pools::CommandPool* CreateCommandPool(Rendering::QueueType queue_type, uint64_t swapchain_id, bool present_on_swapchain);
@@ -87,11 +99,8 @@ namespace ZEngine::Hardwares
8799
static VkSurfaceFormatKHR GetSurfaceFormat();
88100
static VkPresentModeKHR GetPresentMode();
89101

90-
static void MapAndCopyToMemory(BufferView& buffer, size_t data_size, const void* data);
91-
static BufferView CreateBuffer(
92-
VkDeviceSize byte_size,
93-
VkBufferUsageFlags buffer_usage,
94-
VmaAllocationCreateFlags vma_create_flags = 0);
102+
static void MapAndCopyToMemory(BufferView& buffer, size_t data_size, const void* data);
103+
static BufferView CreateBuffer(VkDeviceSize byte_size, VkBufferUsageFlags buffer_usage, VmaAllocationCreateFlags vma_create_flags = 0);
95104
static void CopyBuffer(const BufferView& source, const BufferView& destination, VkDeviceSize byte_size);
96105
static BufferImage CreateImage(
97106
uint32_t width,
@@ -144,9 +153,10 @@ namespace ZEngine::Hardwares
144153
static VkPhysicalDeviceFeatures m_physical_device_feature;
145154
static VkPhysicalDeviceMemoryProperties m_physical_device_memory_properties;
146155
static VkDebugUtilsMessengerEXT m_debug_messenger;
147-
static std::map<uint32_t, std::vector<void*>> m_deletion_resource_queue;
148-
static std::vector<BufferView> s_dirty_buffer_queue;
149-
static std::vector<BufferImage> s_dirty_buffer_image_queue;
156+
static std::map<uint32_t, std::vector<DirtyResource>> m_deletion_resource_queue;
157+
static std::queue<DirtyResource> s_dirty_resource_collection;
158+
static std::queue<BufferView> s_dirty_buffer_queue;
159+
static std::queue<BufferImage> s_dirty_buffer_image_queue;
150160
static std::vector<Ref<Rendering::Pools::CommandPool>> m_command_pool_collection;
151161
static PFN_vkCreateDebugUtilsMessengerEXT __createDebugMessengerPtr;
152162
static PFN_vkDestroyDebugUtilsMessengerEXT __destroyDebugMessengerPtr;
@@ -156,6 +166,9 @@ namespace ZEngine::Hardwares
156166
static VkPresentModeKHR m_present_mode;
157167
static VkDescriptorPool m_descriptor_pool;
158168
static VmaAllocator s_vma_allocator;
169+
static void __cleanupDirtyResource(std::chrono::steady_clock::time_point);
170+
static void __cleanupBufferDirtyResource(std::chrono::steady_clock::time_point);
171+
static void __cleanupBufferImageDirtyResource(std::chrono::steady_clock::time_point);
159172
static VKAPI_ATTR VkBool32 VKAPI_CALL __debugCallback(
160173
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
161174
VkDebugUtilsMessageTypeFlagsEXT messageType,
@@ -170,5 +183,11 @@ namespace ZEngine::Hardwares
170183
static std::condition_variable m_cond;
171184
static std::atomic_bool m_is_executing_instant_command;
172185
static std::mutex m_instant_command_mutex;
186+
187+
private:
188+
static std::jthread s_cleanup_thread;
189+
static std::condition_variable s_cleanup_cond;
190+
static std::atomic_bool s_cleanup_thread_shutdown;
191+
static std::chrono::seconds s_cleanup_timeout;
173192
};
174193
} // namespace ZEngine::Hardwares

ZEngine/include/ZEngine/Rendering/Renderers/ImGUIRenderer.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ namespace ZEngine::Rendering::Renderers
2222

2323
static void Initialize(void* window, const Ref<Swapchain>& swapchain);
2424
static void Deinitialize();
25-
static void EnqueueForDeletion(Rendering::DeviceResourceType resource_type, void* const resource_handle);
26-
static void CleanupResource();
27-
static bool HasPendingCleanupResource();
2825

2926
static void Tick();
3027
static void BeginFrame();
@@ -38,11 +35,10 @@ namespace ZEngine::Rendering::Renderers
3835
static void __ImGUICreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage);
3936
static void __ImGUIRenderDataChildViewport(void* data, void** user_data, VkCommandBuffer command_buffer, VkPipeline pipeline);
4037

41-
private:
42-
static Rendering::Buffers::CommandBuffer* s_command_buffer;
43-
static Rendering::Pools::CommandPool* s_ui_command_pool;
44-
static VkDescriptorPool s_descriptor_pool;
45-
static std::unordered_map<uint32_t, std::vector<void*>> s_deletion_resource_queue;
38+
public:
39+
static Rendering::Buffers::CommandBuffer* s_command_buffer;
40+
static Rendering::Pools::CommandPool* s_ui_command_pool;
41+
static VkDescriptorPool s_descriptor_pool;
4642
};
4743

4844
} // namespace ZEngine::Rendering::Renderers

ZEngine/include/ZEngine/pch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
#include <unordered_set>
1818
#include <exception>
1919
#include <stack>
20+
#include <chrono>

ZEngine/src/GlfwWindow/VulkanWindow.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,6 @@ namespace ZEngine::Window::GLFWWindow
341341
}
342342

343343
m_swapchain->Present();
344-
345-
if (Hardwares::VulkanDevice::HasPendingCleanupResource())
346-
{
347-
Hardwares::VulkanDevice::CleanupResource();
348-
}
349344
}
350345

351346
Ref<Rendering::Swapchain> VulkanWindow::GetSwapchain() const

ZEngine/src/ImGUIRenderer.cpp

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ namespace ZEngine::Rendering::Renderers
1515
Pools::CommandPool* ImGUIRenderer::s_ui_command_pool = nullptr;
1616
Rendering::Buffers::CommandBuffer* ImGUIRenderer::s_command_buffer = nullptr;
1717
VkDescriptorPool ImGUIRenderer::s_descriptor_pool = VK_NULL_HANDLE;
18-
std::unordered_map<uint32_t, std::vector<void*>> ImGUIRenderer::s_deletion_resource_queue = {};
1918

2019
void ImGUIRenderer::Initialize(void* window, const Ref<Swapchain>& swapchain)
2120
{
@@ -24,11 +23,12 @@ namespace ZEngine::Rendering::Renderers
2423

2524
/*Create DescriptorPool*/
2625
auto device = Hardwares::VulkanDevice::GetNativeDeviceHandle();
26+
const auto& device_property = Hardwares::VulkanDevice::GetPhysicalDeviceProperties();
2727
std::vector<VkDescriptorPoolSize> pool_sizes = {{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1}};
2828
VkDescriptorPoolCreateInfo pool_info = {};
2929
pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3030
pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
31-
pool_info.maxSets = 100 * swapchain->GetImageCount();
31+
pool_info.maxSets = 2000 * swapchain->GetImageCount();
3232
pool_info.poolSizeCount = pool_sizes.size();
3333
pool_info.pPoolSizes = pool_sizes.data();
3434
ZENGINE_VALIDATE_ASSERT(vkCreateDescriptorPool(device, &pool_info, nullptr, &s_descriptor_pool) == VK_SUCCESS, "Failed to create DescriptorPool -- ImGuiLayer")
@@ -69,44 +69,6 @@ namespace ZEngine::Rendering::Renderers
6969
ZENGINE_DESTROY_VULKAN_HANDLE(device, vkDestroyDescriptorPool, s_descriptor_pool, nullptr)
7070
}
7171

72-
void ImGUIRenderer::EnqueueForDeletion(Rendering::DeviceResourceType resource_type, void* const resource_handle)
73-
{
74-
if (resource_handle)
75-
{
76-
s_deletion_resource_queue[static_cast<uint32_t>(resource_type)].emplace_back(resource_handle);
77-
}
78-
}
79-
80-
void ImGUIRenderer::CleanupResource()
81-
{
82-
auto device = Hardwares::VulkanDevice::GetNativeDeviceHandle();
83-
for (auto resource : s_deletion_resource_queue)
84-
{
85-
Rendering::DeviceResourceType resource_type = static_cast<Rendering::DeviceResourceType>(resource.first);
86-
for (void* handle : resource.second)
87-
{
88-
switch (resource_type)
89-
{
90-
case Rendering::DeviceResourceType::DESCRIPTORSET:
91-
auto set = reinterpret_cast<VkDescriptorSet>(handle);
92-
vkFreeDescriptorSets(device, s_descriptor_pool, 1, &set);
93-
break;
94-
}
95-
}
96-
}
97-
98-
s_deletion_resource_queue.clear();
99-
}
100-
101-
bool ImGUIRenderer::HasPendingCleanupResource()
102-
{
103-
if (s_deletion_resource_queue.empty())
104-
{
105-
return false;
106-
}
107-
return s_deletion_resource_queue.at(static_cast<uint32_t>(Rendering::DeviceResourceType::DESCRIPTORSET)).size() > 5;
108-
}
109-
11072
void ImGUIRenderer::Tick()
11173
{
11274
s_ui_command_pool->Tick();

ZEngine/src/ImguiLayer.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,11 @@ namespace ZEngine::Layers
111111
{
112112
io.DeltaTime = dt;
113113
}
114+
114115
for (const auto& component : m_ui_components)
115116
{
116117
component->Update(dt);
117118
}
118-
119-
if (ImGUIRenderer::HasPendingCleanupResource())
120-
{
121-
ImGUIRenderer::CleanupResource();
122-
}
123119
}
124120

125121
void ImguiLayer::AddUIComponent(const Ref<Components::UI::UIComponent>& component)
@@ -311,6 +307,7 @@ namespace ZEngine::Layers
311307
if (viewport->RendererUserData)
312308
{
313309
auto window_child = reinterpret_cast<ImguiViewPortWindowChild*>(viewport->RendererUserData);
310+
window_child->CommandPool->Tick();
314311
ImGUIRenderer::DrawChildWindow(viewport->Size.x, viewport->Size.y, &window_child, viewport->DrawData);
315312
}
316313
}

0 commit comments

Comments
 (0)