fix memory leaks

This commit is contained in:
Nomango 2020-05-29 12:02:04 +08:00
parent a25597223d
commit 04475c3c37
2 changed files with 48 additions and 25 deletions

View File

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

View File

@ -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,6 +144,8 @@ void RendererImpl::Destroy()
{
KGE_SYS_LOG("Destroying device resources");
if (d2d_res_)
{
d2d_res_->GetDWriteFactory()->UnregisterFontFileLoader(res_font_file_loader_.Get());
res_font_file_loader_.Reset();
@ -121,8 +153,14 @@ void RendererImpl::Destroy()
res_font_collection_loader_.Reset();
render_ctx_.Reset();
d2d_res_.Reset();
d2d_res_->DiscardResources();
}
if (d3d_res_)
{
d3d_res_->DiscardResources();
d3d_res_.Reset();
}
::CoUninitialize();
}