From cd00d8ca00e06d708fb19db3b23c8a8060ee4bd2 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 7 Aug 2025 08:56:59 +0200 Subject: [PATCH] Fix: Vulkan: Use after free when switching scenes Unreported issue introduced from recent changes. (memory leak in immediate mode) Pull Request: https://projects.blender.org/blender/blender/pulls/144116 --- source/blender/gpu/vulkan/vk_context.cc | 3 +-- source/blender/gpu/vulkan/vk_immediate.cc | 8 -------- source/blender/gpu/vulkan/vk_immediate.hh | 2 -- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/source/blender/gpu/vulkan/vk_context.cc b/source/blender/gpu/vulkan/vk_context.cc index 172d3d03698..6cf8b86a19d 100644 --- a/source/blender/gpu/vulkan/vk_context.cc +++ b/source/blender/gpu/vulkan/vk_context.cc @@ -48,10 +48,9 @@ VKContext::~VKContext() surface_texture_ = nullptr; } free_resources(); - VKDevice &device = VKBackend::get().device; - static_cast(imm)->deinit(device); delete imm; imm = nullptr; + VKDevice &device = VKBackend::get().device; device.context_unregister(*this); this->process_frame_timings(); diff --git a/source/blender/gpu/vulkan/vk_immediate.cc b/source/blender/gpu/vulkan/vk_immediate.cc index 5e8ad17aefb..80d18f59e20 100644 --- a/source/blender/gpu/vulkan/vk_immediate.cc +++ b/source/blender/gpu/vulkan/vk_immediate.cc @@ -23,14 +23,6 @@ namespace blender::gpu { static CLG_LogRef LOG = {"gpu.vulkan"}; -void VKImmediate::deinit(VKDevice &device) -{ - if (active_buffer_.has_value()) { - active_buffer_->free_immediately(device); - active_buffer_.reset(); - } -} - uchar *VKImmediate::begin() { uint add_vertex = prim_type == GPU_PRIM_LINE_LOOP ? 1 : 0; diff --git a/source/blender/gpu/vulkan/vk_immediate.hh b/source/blender/gpu/vulkan/vk_immediate.hh index 7fea5d24527..7ea834c2115 100644 --- a/source/blender/gpu/vulkan/vk_immediate.hh +++ b/source/blender/gpu/vulkan/vk_immediate.hh @@ -38,8 +38,6 @@ class VKImmediate : public Immediate { std::optional active_buffer_; public: - void deinit(VKDevice &device); - uchar *begin() override; void end() override;