From 17703ab0fb6f0a5d096403e7fbc54145259acc3c Mon Sep 17 00:00:00 2001 From: Bryce Hutchings Date: Thu, 20 Nov 2025 15:51:12 -0800 Subject: [PATCH] Fix corruption of cpu descriptor heap free blocks --- drivers/d3d12/rendering_device_driver_d3d12.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/d3d12/rendering_device_driver_d3d12.cpp b/drivers/d3d12/rendering_device_driver_d3d12.cpp index 6865ae0bc97..969cb9ab119 100644 --- a/drivers/d3d12/rendering_device_driver_d3d12.cpp +++ b/drivers/d3d12/rendering_device_driver_d3d12.cpp @@ -489,13 +489,15 @@ Error RenderingDeviceDriverD3D12::CPUDescriptorsHeapPool::release(const CPUDescr } else if (next != free_blocks_by_offset.end()) { // Connects to the next block. remove_from_size_map(next->value); + + FreeBlockInfo merged_block = next->value; + merged_block.global_offset -= p_result.count; + merged_block.size += p_result.count; + + // Replace with the merged block. free_blocks_by_offset.erase(next->value.global_offset); - - next->value.global_offset -= p_result.count; - next->value.size += p_result.count; - - DEV_ASSERT(!free_blocks_by_offset.has(next->value.global_offset)); - new_block = free_blocks_by_offset.insert(next->value.global_offset, next->value); + DEV_ASSERT(!free_blocks_by_offset.has(merged_block.global_offset)); + new_block = free_blocks_by_offset.insert(merged_block.global_offset, merged_block); } else { // Connects to no block. new_block = free_blocks_by_offset.insert(global_offset, FreeBlockInfo{ p_result.heap, global_offset, p_result.base_offset, p_result.count });