Skip to content

Commit e2e03f3

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

File tree

8 files changed

+246
-183
lines changed

8 files changed

+246
-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: 107 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ namespace ZEngine::Hardwares
848848
{
849849
auto ds = reinterpret_cast<VkDescriptorSet>(res_handle.Handle);
850850
vkFreeDescriptorSets(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Data1), 1, &ds);
851+
break;
851852
}
852853
case DeviceResourceType::RESOURCE_COUNT:
853854
break;
@@ -1204,144 +1205,137 @@ namespace ZEngine::Hardwares
12041205
}
12051206

12061207
void VulkanDevice::DirtyCollector()
1207-
{
1208+
{
12081209
RunningDirtyCollector.store(true, std::memory_order_release);
1209-
1210+
12101211
ZENGINE_CORE_INFO("[*] Dirty Resource Collector started...")
1211-
1212+
12121213
while (RunningDirtyCollector.load(std::memory_order_acquire))
12131214
{
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)
1215+
uint32_t idle_count = SwapchainPtr->IdleFrameCount.value.load(std::memory_order_acquire);
1216+
1217+
if (idle_count < SwapchainPtr->IdleFrameThreshold)
12181218
{
12191219
std::this_thread::sleep_for(std::chrono::milliseconds(50));
12201220
continue;
12211221
}
1222-
1223-
if (DirtyResources.CanRemove())
1222+
1223+
1224+
uint32_t dirty_resource_count = DirtyResources.Size();
1225+
for (uint32_t i = 0; i < dirty_resource_count; ++i)
12241226
{
1225-
uint32_t dirty_resource_count = DirtyResources.Head();
1226-
for (uint32_t i = 0; i < dirty_resource_count; ++i)
1227+
auto handle = DirtyResources.ToHandle(i);
1228+
1229+
if (!handle)
12271230
{
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)
1231+
continue;
1232+
}
1233+
1234+
DirtyResource& res_handle = DirtyResources[handle];
1235+
if (res_handle.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1236+
{
1237+
switch (res_handle.Type)
12371238
{
1238-
switch (res_handle.Type)
1239+
case Rendering::DeviceResourceType::SAMPLER:
1240+
// vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
1241+
break;
1242+
case Rendering::DeviceResourceType::FRAMEBUFFER:
1243+
vkDestroyFramebuffer(LogicalDevice, reinterpret_cast<VkFramebuffer>(res_handle.Handle), nullptr);
1244+
break;
1245+
case Rendering::DeviceResourceType::IMAGEVIEW:
1246+
vkDestroyImageView(LogicalDevice, reinterpret_cast<VkImageView>(res_handle.Handle), nullptr);
1247+
break;
1248+
case Rendering::DeviceResourceType::IMAGE:
1249+
vkDestroyImage(LogicalDevice, reinterpret_cast<VkImage>(res_handle.Handle), nullptr);
1250+
break;
1251+
case Rendering::DeviceResourceType::RENDERPASS:
1252+
vkDestroyRenderPass(LogicalDevice, reinterpret_cast<VkRenderPass>(res_handle.Handle), nullptr);
1253+
break;
1254+
case Rendering::DeviceResourceType::BUFFERMEMORY:
1255+
vkFreeMemory(LogicalDevice, reinterpret_cast<VkDeviceMemory>(res_handle.Handle), nullptr);
1256+
break;
1257+
case Rendering::DeviceResourceType::BUFFER:
1258+
vkDestroyBuffer(LogicalDevice, reinterpret_cast<VkBuffer>(res_handle.Handle), nullptr);
1259+
break;
1260+
case Rendering::DeviceResourceType::PIPELINE_LAYOUT:
1261+
vkDestroyPipelineLayout(LogicalDevice, reinterpret_cast<VkPipelineLayout>(res_handle.Handle), nullptr);
1262+
break;
1263+
case Rendering::DeviceResourceType::PIPELINE:
1264+
vkDestroyPipeline(LogicalDevice, reinterpret_cast<VkPipeline>(res_handle.Handle), nullptr);
1265+
break;
1266+
case Rendering::DeviceResourceType::DESCRIPTORSETLAYOUT:
1267+
vkDestroyDescriptorSetLayout(LogicalDevice, reinterpret_cast<VkDescriptorSetLayout>(res_handle.Handle), nullptr);
1268+
break;
1269+
case Rendering::DeviceResourceType::DESCRIPTORPOOL:
1270+
vkDestroyDescriptorPool(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Handle), nullptr);
1271+
break;
1272+
case Rendering::DeviceResourceType::SEMAPHORE:
1273+
vkDestroySemaphore(LogicalDevice, reinterpret_cast<VkSemaphore>(res_handle.Handle), nullptr);
1274+
break;
1275+
case Rendering::DeviceResourceType::FENCE:
1276+
vkDestroyFence(LogicalDevice, reinterpret_cast<VkFence>(res_handle.Handle), nullptr);
1277+
break;
1278+
case Rendering::DeviceResourceType::DESCRIPTORSET:
12391279
{
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;
1280+
auto ds = reinterpret_cast<VkDescriptorSet>(res_handle.Handle);
1281+
vkFreeDescriptorSets(LogicalDevice, reinterpret_cast<VkDescriptorPool>(res_handle.Data1), 1, &ds);
1282+
break;
12871283
}
1288-
1289-
DirtyResources.Remove(handle);
1284+
case DeviceResourceType::RESOURCE_COUNT:
1285+
break;
12901286
}
1287+
1288+
DirtyResources.Remove(handle);
12911289
}
12921290
}
1293-
1294-
if (DirtyBuffers.CanRemove())
1291+
1292+
uint32_t dirty_buffer_count = DirtyBuffers.Size();
1293+
for (uint32_t i = 0; i < dirty_buffer_count; ++i)
12951294
{
1296-
uint32_t dirty_buffer_count = DirtyBuffers.Head();
1297-
for (uint32_t i = 0; i < dirty_buffer_count; ++i)
1295+
auto handle = DirtyBuffers.ToHandle(i);
1296+
1297+
if (!handle)
12981298
{
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-
}
1299+
continue;
1300+
}
1301+
1302+
BufferView& buffer = DirtyBuffers[handle];
1303+
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1304+
{
1305+
vmaDestroyBuffer(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1306+
buffer.Handle = VK_NULL_HANDLE;
1307+
buffer.Allocation = VK_NULL_HANDLE;
1308+
DirtyBuffers.Remove(handle);
13141309
}
13151310
}
1316-
1317-
if (DirtyBufferImages.CanRemove())
1311+
1312+
1313+
uint32_t dirty_buffer_image_count = DirtyBufferImages.Size();
1314+
for (uint32_t i = 0; i < dirty_buffer_image_count; ++i)
13181315
{
1319-
uint32_t dirty_buffer_image_count = DirtyBufferImages.Head();
1320-
for (uint32_t i = 0; i < dirty_buffer_image_count; ++i)
1316+
auto handle = DirtyBufferImages.ToHandle(i);
1317+
1318+
if (!handle)
13211319
{
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-
}
1320+
continue;
1321+
}
1322+
1323+
BufferImage& buffer = DirtyBufferImages[handle];
1324+
1325+
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
1326+
{
1327+
vkDestroyImageView(LogicalDevice, buffer.ViewHandle, nullptr);
1328+
// vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
1329+
vmaDestroyImage(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
1330+
buffer.Handle = VK_NULL_HANDLE;
1331+
buffer.Allocation = VK_NULL_HANDLE;
1332+
DirtyBufferImages.Remove(handle);
13401333
}
13411334
}
1342-
SwapchainPtr->IdleFrameCount.store(0, std::memory_order_release);
1335+
1336+
SwapchainPtr->IdleFrameCount.value.store(0, std::memory_order_release);
13431337
}
1344-
1338+
13451339
ZENGINE_CORE_INFO("[*] Dirty Resource Collector stopped...")
13461340
}
13471341

0 commit comments

Comments
 (0)