Skip to content

Commit 8480b62

Browse files
committed
Merge pull request godotengine#113000 from brycehutchings/d3d12_descriptor_heap_pool_corruption_fix
Fix corruption of D3D12 CPU descriptor heap free blocks
2 parents efa1056 + 17703ab commit 8480b62

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/d3d12/rendering_device_driver_d3d12.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -491,13 +491,15 @@ Error RenderingDeviceDriverD3D12::CPUDescriptorsHeapPool::release(const CPUDescr
491491
} else if (next != free_blocks_by_offset.end()) {
492492
// Connects to the next block.
493493
remove_from_size_map(next->value);
494-
free_blocks_by_offset.erase(next->value.global_offset);
495494

496-
next->value.global_offset -= p_result.count;
497-
next->value.size += p_result.count;
495+
FreeBlockInfo merged_block = next->value;
496+
merged_block.global_offset -= p_result.count;
497+
merged_block.size += p_result.count;
498498

499-
DEV_ASSERT(!free_blocks_by_offset.has(next->value.global_offset));
500-
new_block = free_blocks_by_offset.insert(next->value.global_offset, next->value);
499+
// Replace with the merged block.
500+
free_blocks_by_offset.erase(next->value.global_offset);
501+
DEV_ASSERT(!free_blocks_by_offset.has(merged_block.global_offset));
502+
new_block = free_blocks_by_offset.insert(merged_block.global_offset, merged_block);
501503
} else {
502504
// Connects to no block.
503505
new_block = free_blocks_by_offset.insert(global_offset, FreeBlockInfo{ p_result.heap, global_offset, p_result.base_offset, p_result.count });

0 commit comments

Comments
 (0)