From 04475c3c37f9ede06b24384df58e081e15333256 Mon Sep 17 00:00:00 2001 From: Nomango Date: Fri, 29 May 2020 12:02:04 +0800 Subject: [PATCH] fix memory leaks --- src/kiwano/platform/win32/WindowImpl.cpp | 15 ------ src/kiwano/render/DirectX/RendererImpl.cpp | 58 ++++++++++++++++++---- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/kiwano/platform/win32/WindowImpl.cpp b/src/kiwano/platform/win32/WindowImpl.cpp index 1aba29ef..6cba0482 100644 --- a/src/kiwano/platform/win32/WindowImpl.cpp +++ b/src/kiwano/platform/win32/WindowImpl.cpp @@ -269,21 +269,6 @@ void WindowWin32Impl::Init(const String& title, uint32_t width, uint32_t height, ::ShowWindow(handle_, SW_SHOWNORMAL); ::UpdateWindow(handle_); - - // Initialize Direct3D resources - auto d3d_res = graphics::directx::GetD3DDeviceResources(); - - HRESULT hr = d3d_res->Initialize(handle_); - - // Initialize Direct2D resources - if (SUCCEEDED(hr)) - { - auto d2d_res = graphics::directx::GetD2DDeviceResources(); - - hr = d2d_res->Initialize(d3d_res->GetDXGIDevice(), d3d_res->GetDXGISwapChain()); - } - - KGE_THROW_IF_FAILED(hr, "Create DirectX resources failed"); } void WindowWin32Impl::PumpEvents() diff --git a/src/kiwano/render/DirectX/RendererImpl.cpp b/src/kiwano/render/DirectX/RendererImpl.cpp index 49f496d8..571f9213 100644 --- a/src/kiwano/render/DirectX/RendererImpl.cpp +++ b/src/kiwano/render/DirectX/RendererImpl.cpp @@ -58,11 +58,41 @@ void RendererImpl::MakeContextForWindow(WindowPtr window) HWND target_window = window->GetHandle(); output_size_ = window->GetSize(); - d2d_res_ = graphics::directx::GetD2DDeviceResources(); - d3d_res_ = graphics::directx::GetD3DDeviceResources(); - HRESULT hr = target_window ? S_OK : E_FAIL; + // Initialize Direct3D resources + if (SUCCEEDED(hr)) + { + auto d3d_res = graphics::directx::GetD3DDeviceResources(); + + hr = d3d_res->Initialize(target_window); + if (FAILED(hr)) + { + d3d_res->DiscardResources(); + } + else + { + d3d_res_ = d3d_res; + } + } + + // Initialize Direct2D resources + if (SUCCEEDED(hr)) + { + auto d2d_res = graphics::directx::GetD2DDeviceResources(); + + hr = d2d_res->Initialize(d3d_res_->GetDXGIDevice(), d3d_res_->GetDXGISwapChain()); + if (FAILED(hr)) + { + d2d_res->DiscardResources(); + } + else + { + d2d_res_ = d2d_res; + } + } + + // Initialize other device resources if (SUCCEEDED(hr)) { @@ -114,15 +144,23 @@ void RendererImpl::Destroy() { KGE_SYS_LOG("Destroying device resources"); - d2d_res_->GetDWriteFactory()->UnregisterFontFileLoader(res_font_file_loader_.Get()); - res_font_file_loader_.Reset(); + if (d2d_res_) + { + d2d_res_->GetDWriteFactory()->UnregisterFontFileLoader(res_font_file_loader_.Get()); + res_font_file_loader_.Reset(); - d2d_res_->GetDWriteFactory()->UnregisterFontCollectionLoader(res_font_collection_loader_.Get()); - res_font_collection_loader_.Reset(); + d2d_res_->GetDWriteFactory()->UnregisterFontCollectionLoader(res_font_collection_loader_.Get()); + res_font_collection_loader_.Reset(); - render_ctx_.Reset(); - d2d_res_.Reset(); - d3d_res_.Reset(); + render_ctx_.Reset(); + d2d_res_->DiscardResources(); + } + + if (d3d_res_) + { + d3d_res_->DiscardResources(); + d3d_res_.Reset(); + } ::CoUninitialize(); }