@@ -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