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