Skip to content

Commit 277911a

Browse files
fix: improved HandleManager threading mgmt support
1 parent 65d4471 commit 277911a

File tree

8 files changed

+245
-183
lines changed

8 files changed

+245
-183
lines changed

Tetragrama/Components/SceneViewportUIComponent.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ namespace Tetragrama::Components
3232

3333
void SceneViewportUIComponent::Update(ZEngine::Core::TimeStep dt)
3434
{
35+
auto app = reinterpret_cast<EditorPtr>(ParentLayer->CurrentApp);
36+
3537
if ((m_viewport_size.x != m_content_region_available_size.x) || (m_viewport_size.y != m_content_region_available_size.y))
3638
{
3739
if (!m_is_resizing)
@@ -45,14 +47,13 @@ namespace Tetragrama::Components
4547
else if (m_is_resizing)
4648
{
4749
m_idle_frame_count++;
48-
if (m_idle_frame_count >= m_idle_frame_threshold)
50+
if (m_idle_frame_count >= app->RenderPipeline->Device->SwapchainPtr->IdleFrameThreshold)
4951
{
5052
m_is_resizing = false;
5153
m_request_renderer_resize = true;
5254
}
5355
}
5456

55-
auto app = reinterpret_cast<EditorPtr>(ParentLayer->CurrentApp);
5657
auto camera_controller = reinterpret_cast<Controllers::EditorCameraControllerPtr>(app->CameraController);
5758

5859
if (m_request_renderer_resize)
@@ -101,7 +102,10 @@ namespace Tetragrama::Components
101102
m_refresh_texture_handle = false;
102103
}
103104

104-
ImGui::Image((ImTextureID) m_scene_texture.Index, m_viewport_size, ImVec2(0, 1), ImVec2(1, 0));
105+
if (m_scene_texture.Valid())
106+
{
107+
ImGui::Image((ImTextureID) m_scene_texture.Index, m_viewport_size, ImVec2(0, 1), ImVec2(1, 0));
108+
}
105109
// ViewPort bound computation
106110
ImVec2 viewport_windows_size = ImGui::GetWindowSize();
107111
ImVec2 minimum_bound = ImGui::GetWindowPos();

Tetragrama/Components/SceneViewportUIComponent.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ namespace Tetragrama::Components
3232
bool m_refresh_texture_handle{false};
3333
bool m_request_renderer_resize{false};
3434
bool m_is_resizing{false};
35-
int m_idle_frame_count = 0;
36-
int m_idle_frame_threshold = 9; // SwapchainImageCount * 3
35+
int m_idle_frame_count = 0;
3736
ImVec2 m_viewport_size{0.f, 0.f};
3837
ImVec2 m_content_region_available_size{0.f, 0.f};
3938
std::array<ImVec2, 2> m_viewport_bounds;

ZEngine/ZEngine/Hardwares/DeviceSwapchain.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace ZEngine::Hardwares
3434
attachment_specification.ColorsMap[0].ReferenceLayout = ImageLayout::COLOR_ATTACHMENT_OPTIMAL;
3535
SwapchainAttachment = ZPushStructCtorArgs(&Arena, RenderPasses::Attachment, Device, attachment_specification);
3636

37-
IdleFrameThreshold.store(BufferredFrameCount * 3 * 3 * 3, std::memory_order_release);
37+
IdleFrameThreshold = (BufferredFrameCount * 3 * 3 * 3);
3838
FrameContexts.init(&Arena, FrameContextPoolSize, FrameContextPoolSize);
3939

4040
for (uint32_t i = 0; i < FrameContextPoolSize; ++i)
@@ -268,7 +268,7 @@ namespace ZEngine::Hardwares
268268
{
269269
if (HasRecreationPending)
270270
{
271-
IdleFrameCount.fetch_add(1);
271+
IdleFrameCount.value.fetch_add(1, std::memory_order_acq_rel);
272272
Device->CommandBufferMgr->ResetEnqueuedBufferIndex();
273273
return;
274274
}
@@ -493,7 +493,7 @@ namespace ZEngine::Hardwares
493493
};
494494
VkResult present_result = vkQueuePresentKHR(queue.Handle, &present_info);
495495

496-
IdleFrameCount.fetch_add(1);
496+
IdleFrameCount.value.fetch_add(1, std::memory_order_acq_rel);
497497

498498
if (present_result == VK_ERROR_OUT_OF_DATE_KHR || present_result == VK_SUBOPTIMAL_KHR)
499499
{

ZEngine/ZEngine/Hardwares/DeviceSwapchain.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ namespace ZEngine::Hardwares
3636
uint32_t FrameContextOffset = 0;
3737
uint32_t FrameContextPoolSize = 0;
3838
const uint32_t FrameContextPoolSizeFactor = 4;
39-
// Todo Convert atomic_uint as PaddedAtomic..
40-
std::atomic_uint IdleFrameCount = 0;
41-
std::atomic_uint IdleFrameThreshold = std::numeric_limits<uint32_t>::max();
39+
uint64_t IdleFrameThreshold = 0;
40+
PaddedAtomic<uint64_t> IdleFrameCount = {.value = 0};
4241
uint64_t RenderTimelineNextValue = 0;
4342
VkSwapchainKHR SwapchainHandle = VK_NULL_HANDLE;
4443
FrameContextPtr CurrentFrame = nullptr;

ZEngine/ZEngine/Hardwares/VulkanDevice.cpp

Lines changed: 106 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,144 +1204,137 @@ namespace ZEngine::Hardwares
12041204
}
12051205

12061206
void VulkanDevice::DirtyCollector()
1207-
{
1207+
{
12081208
RunningDirtyCollector.store(true, std::memory_order_release);
1209-
1209+
12101210
ZENGINE_CORE_INFO("[*] Dirty Resource Collector started...")
1211-
1211+
12121212
while (RunningDirtyCollector.load(std::memory_order_acquire))
12131213
{
1214-
uint32_t idle_count = SwapchainPtr->IdleFrameCount.load(std::memory_order_acquire);
1215-
uint32_t threshold = SwapchainPtr->IdleFrameThreshold.load(std::memory_order_acquire);
1216-
1217-
if (idle_count < threshold)
1214+
uint32_t idle_count = SwapchainPtr->IdleFrameCount.value.load(std::memory_order_acquire);
1215+
1216+
if (idle_count < SwapchainPtr->IdleFrameThreshold)
12181217
{
12191218
std::this_thread::sleep_for(std::chrono::milliseconds(50));
12201219
continue;
12211220
}
1222-
1223-
if (DirtyResources.CanRemove())
1221+
1222+
1223+
uint32_t dirty_resource_count = DirtyResources.Size();
1224+
for (uint32_t i = 0; i < dirty_resource_count; ++i)
12241225
{
1225-
uint32_t dirty_resource_count = DirtyResources.Head();
1226-
for (uint32_t i = 0; i < dirty_resource_count; ++i)
1226+
auto handle = DirtyResources.ToHandle(i);
1227+
1228+
if (!handle)
12271229
{
1228-
auto handle = DirtyResources.ToHandle(i);
1229-
1230-
if (!handle)
1231-
{
1232-
continue;
1233-
}
1234-
1235-
DirtyResource& res_handle = DirtyResources[handle];
1236-
if (res_handle.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1230+
continue;
1231+
}
1232+
1233+
DirtyResource& res_handle = DirtyResources[handle];
1234+
if (res_handle.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1235+
{
1236+
switch (res_handle.Type)
12371237
{
1238-
switch (res_handle.Type)
1238+
case Rendering::DeviceResourceType::SAMPLER:
1239+
// vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
1240+
break;
1241+
case Rendering::DeviceResourceType::FRAMEBUFFER:
1242+
vkDestroyFramebuffer(LogicalDevice, reinterpret_cast<VkFramebuffer>(res_handle.Handle), nullptr);
1243+
break;
1244+
case Rendering::DeviceResourceType::IMAGEVIEW:
1245+
vkDestroyImageView(LogicalDevice, reinterpret_cast<VkImageView>(res_handle.Handle), nullptr);
1246+
break;
1247+
case Rendering::DeviceResourceType::IMAGE:
1248+
vkDestroyImage(LogicalDevice, reinterpret_cast<VkImage>(res_handle.Handle), nullptr);
1249+
break;
1250+
case Rendering::DeviceResourceType::RENDERPASS:
1251+
vkDestroyRenderPass(LogicalDevice, reinterpret_cast<VkRenderPass>(res_handle.Handle), nullptr);
1252+
break;
1253+
case Rendering::DeviceResourceType::BUFFERMEMORY:
1254+
vkFreeMemory(LogicalDevice, reinterpret_cast<VkDeviceMemory>(res_handle.Handle), nullptr);
1255+
break;
1256+
case Rendering::DeviceResourceType::BUFFER:
1257+
vkDestroyBuffer(LogicalDevice, reinterpret_cast<VkBuffer>(res_handle.Handle), nullptr);
1258+
break;
1259+
case Rendering::DeviceResourceType::PIPELINE_LAYOUT:
1260+
vkDestroyPipelineLayout(LogicalDevice, reinterpret_cast<VkPipelineLayout>(res_handle.Handle), nullptr);
1261+
break;
1262+
case Rendering::DeviceResourceType::PIPELINE:
1263+
vkDestroyPipeline(LogicalDevice, reinterpret_cast<VkPipeline>(res_handle.Handle), nullptr);
1264+
break;
1265+
case Rendering::DeviceResourceType::DESCRIPTORSETLAYOUT:
1266+
vkDestroyDescriptorSetLayout(LogicalDevice, reinterpret_cast<VkDescriptorSetLayout>(res_handle.Handle), nullptr);
1267+
break;
1268+
case Rendering::DeviceResourceType::DESCRIPTORPOOL:
1269+
vkDestroyDescriptorPool(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Handle), nullptr);
1270+
break;
1271+
case Rendering::DeviceResourceType::SEMAPHORE:
1272+
vkDestroySemaphore(LogicalDevice, reinterpret_cast<VkSemaphore>(res_handle.Handle), nullptr);
1273+
break;
1274+
case Rendering::DeviceResourceType::FENCE:
1275+
vkDestroyFence(LogicalDevice, reinterpret_cast<VkFence>(res_handle.Handle), nullptr);
1276+
break;
1277+
case Rendering::DeviceResourceType::DESCRIPTORSET:
12391278
{
1240-
case Rendering::DeviceResourceType::SAMPLER:
1241-
// vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
1242-
break;
1243-
case Rendering::DeviceResourceType::FRAMEBUFFER:
1244-
vkDestroyFramebuffer(LogicalDevice, reinterpret_cast<VkFramebuffer>(res_handle.Handle), nullptr);
1245-
break;
1246-
case Rendering::DeviceResourceType::IMAGEVIEW:
1247-
vkDestroyImageView(LogicalDevice, reinterpret_cast<VkImageView>(res_handle.Handle), nullptr);
1248-
break;
1249-
case Rendering::DeviceResourceType::IMAGE:
1250-
vkDestroyImage(LogicalDevice, reinterpret_cast<VkImage>(res_handle.Handle), nullptr);
1251-
break;
1252-
case Rendering::DeviceResourceType::RENDERPASS:
1253-
vkDestroyRenderPass(LogicalDevice, reinterpret_cast<VkRenderPass>(res_handle.Handle), nullptr);
1254-
break;
1255-
case Rendering::DeviceResourceType::BUFFERMEMORY:
1256-
vkFreeMemory(LogicalDevice, reinterpret_cast<VkDeviceMemory>(res_handle.Handle), nullptr);
1257-
break;
1258-
case Rendering::DeviceResourceType::BUFFER:
1259-
vkDestroyBuffer(LogicalDevice, reinterpret_cast<VkBuffer>(res_handle.Handle), nullptr);
1260-
break;
1261-
case Rendering::DeviceResourceType::PIPELINE_LAYOUT:
1262-
vkDestroyPipelineLayout(LogicalDevice, reinterpret_cast<VkPipelineLayout>(res_handle.Handle), nullptr);
1263-
break;
1264-
case Rendering::DeviceResourceType::PIPELINE:
1265-
vkDestroyPipeline(LogicalDevice, reinterpret_cast<VkPipeline>(res_handle.Handle), nullptr);
1266-
break;
1267-
case Rendering::DeviceResourceType::DESCRIPTORSETLAYOUT:
1268-
vkDestroyDescriptorSetLayout(LogicalDevice, reinterpret_cast<VkDescriptorSetLayout>(res_handle.Handle), nullptr);
1269-
break;
1270-
case Rendering::DeviceResourceType::DESCRIPTORPOOL:
1271-
vkDestroyDescriptorPool(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Handle), nullptr);
1272-
break;
1273-
case Rendering::DeviceResourceType::SEMAPHORE:
1274-
vkDestroySemaphore(LogicalDevice, reinterpret_cast<VkSemaphore>(res_handle.Handle), nullptr);
1275-
break;
1276-
case Rendering::DeviceResourceType::FENCE:
1277-
vkDestroyFence(LogicalDevice, reinterpret_cast<VkFence>(res_handle.Handle), nullptr);
1278-
break;
1279-
case Rendering::DeviceResourceType::DESCRIPTORSET:
1280-
{
1281-
auto ds = reinterpret_cast<VkDescriptorSet>(res_handle.Handle);
1282-
vkFreeDescriptorSets(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Data1), 1, &ds);
1283-
break;
1284-
}
1285-
case DeviceResourceType::RESOURCE_COUNT:
1286-
break;
1279+
auto ds = reinterpret_cast<VkDescriptorSet>(res_handle.Handle);
1280+
vkFreeDescriptorSets(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Data1), 1, &ds);
1281+
break;
12871282
}
1288-
1289-
DirtyResources.Remove(handle);
1283+
case DeviceResourceType::RESOURCE_COUNT:
1284+
break;
12901285
}
1286+
1287+
DirtyResources.Remove(handle);
12911288
}
12921289
}
1293-
1294-
if (DirtyBuffers.CanRemove())
1290+
1291+
uint32_t dirty_buffer_count = DirtyBuffers.Size();
1292+
for (uint32_t i = 0; i < dirty_buffer_count; ++i)
12951293
{
1296-
uint32_t dirty_buffer_count = DirtyBuffers.Head();
1297-
for (uint32_t i = 0; i < dirty_buffer_count; ++i)
1294+
auto handle = DirtyBuffers.ToHandle(i);
1295+
1296+
if (!handle)
12981297
{
1299-
auto handle = DirtyBuffers.ToHandle(i);
1300-
1301-
if (!handle)
1302-
{
1303-
continue;
1304-
}
1305-
1306-
BufferView& buffer = DirtyBuffers[handle];
1307-
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1308-
{
1309-
vmaDestroyBuffer(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1310-
buffer.Handle = VK_NULL_HANDLE;
1311-
buffer.Allocation = VK_NULL_HANDLE;
1312-
DirtyBuffers.Remove(handle);
1313-
}
1298+
continue;
1299+
}
1300+
1301+
BufferView& buffer = DirtyBuffers[handle];
1302+
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1303+
{
1304+
vmaDestroyBuffer(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1305+
buffer.Handle = VK_NULL_HANDLE;
1306+
buffer.Allocation = VK_NULL_HANDLE;
1307+
DirtyBuffers.Remove(handle);
13141308
}
13151309
}
1316-
1317-
if (DirtyBufferImages.CanRemove())
1310+
1311+
1312+
uint32_t dirty_buffer_image_count = DirtyBufferImages.Size();
1313+
for (uint32_t i = 0; i < dirty_buffer_image_count; ++i)
13181314
{
1319-
uint32_t dirty_buffer_image_count = DirtyBufferImages.Head();
1320-
for (uint32_t i = 0; i < dirty_buffer_image_count; ++i)
1315+
auto handle = DirtyBufferImages.ToHandle(i);
1316+
1317+
if (!handle)
13211318
{
1322-
auto handle = DirtyBufferImages.ToHandle(i);
1323-
1324-
if (!handle)
1325-
{
1326-
continue;
1327-
}
1328-
1329-
BufferImage& buffer = DirtyBufferImages[handle];
1330-
1331-
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1332-
{
1333-
vkDestroyImageView(LogicalDevice, buffer.ViewHandle, nullptr);
1334-
// vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
1335-
vmaDestroyImage(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1336-
buffer.Handle = VK_NULL_HANDLE;
1337-
buffer.Allocation = VK_NULL_HANDLE;
1338-
DirtyBufferImages.Remove(handle);
1339-
}
1319+
continue;
1320+
}
1321+
1322+
BufferImage& buffer = DirtyBufferImages[handle];
1323+
1324+
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1325+
{
1326+
vkDestroyImageView(LogicalDevice, buffer.ViewHandle, nullptr);
1327+
// vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
1328+
vmaDestroyImage(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1329+
buffer.Handle = VK_NULL_HANDLE;
1330+
buffer.Allocation = VK_NULL_HANDLE;
1331+
DirtyBufferImages.Remove(handle);
13401332
}
13411333
}
1342-
SwapchainPtr->IdleFrameCount.store(0, std::memory_order_release);
1334+
1335+
SwapchainPtr->IdleFrameCount.value.store(0, std::memory_order_release);
13431336
}
1344-
1337+
13451338
ZENGINE_CORE_INFO("[*] Dirty Resource Collector stopped...")
13461339
}
13471340

0 commit comments

Comments
 (0)