From 1d08855b15c048e3403054b13b7aba33698e6517 Mon Sep 17 00:00:00 2001 From: SaiyansKing <38609240+SaiyansKing@users.noreply.github.com> Date: Sat, 18 Sep 2021 19:47:14 +0200 Subject: [PATCH] Fix textures memory leak --- D3D11Engine/D3D7/FakeDirectDrawSurface7.cpp | 10 +++++++++- D3D11Engine/D3D7/FakeDirectDrawSurface7.h | 1 + D3D11Engine/D3D7/MyDirectDraw.h | 3 --- D3D11Engine/D3D7/MyDirectDrawSurface7.cpp | 5 +++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/D3D11Engine/D3D7/FakeDirectDrawSurface7.cpp b/D3D11Engine/D3D7/FakeDirectDrawSurface7.cpp index 3e28678b..e6f054bf 100644 --- a/D3D11Engine/D3D7/FakeDirectDrawSurface7.cpp +++ b/D3D11Engine/D3D7/FakeDirectDrawSurface7.cpp @@ -10,6 +10,15 @@ FakeDirectDrawSurface7::FakeDirectDrawSurface7() { Data = nullptr; } +FakeDirectDrawSurface7::~FakeDirectDrawSurface7() { + // Release mip-map chain first + for ( LPDIRECTDRAWSURFACE7 mipmap : AttachedSurfaces ) { + mipmap->Release(); + } + + delete[] Data; +} + void FakeDirectDrawSurface7::InitFakeSurface( const DDSURFACEDESC2* desc, MyDirectDrawSurface7* Resource, int mipLevel ) { OriginalDesc = *desc; this->Resource = Resource; @@ -33,7 +42,6 @@ ULONG FakeDirectDrawSurface7::Release() { RefCount--; if ( RefCount == 0 ) { - delete [] Data; delete this; return 0; } diff --git a/D3D11Engine/D3D7/FakeDirectDrawSurface7.h b/D3D11Engine/D3D7/FakeDirectDrawSurface7.h index 7dd37758..68f8bbae 100644 --- a/D3D11Engine/D3D7/FakeDirectDrawSurface7.h +++ b/D3D11Engine/D3D7/FakeDirectDrawSurface7.h @@ -11,6 +11,7 @@ class MyDirectDrawSurface7; class FakeDirectDrawSurface7 : public IDirectDrawSurface7 { public: FakeDirectDrawSurface7(); + ~FakeDirectDrawSurface7(); /*** IUnknown methods ***/ HRESULT __stdcall QueryInterface( REFIID riid, LPVOID* ppvObj ); diff --git a/D3D11Engine/D3D7/MyDirectDraw.h b/D3D11Engine/D3D7/MyDirectDraw.h index b82f38a8..9965ef27 100644 --- a/D3D11Engine/D3D7/MyDirectDraw.h +++ b/D3D11Engine/D3D7/MyDirectDraw.h @@ -225,7 +225,6 @@ class MyDirectDraw : public IDirectDraw7 { FakeDirectDrawSurface7* lastMip = nullptr; int level = 1; while ( desc.dwMipMapCount > 1 ) { - FakeDirectDrawSurface7* mip = new FakeDirectDrawSurface7; desc.dwMipMapCount--; //desc.dwHeight /= 2; @@ -241,8 +240,6 @@ class MyDirectDraw : public IDirectDraw7 { lastMip = mip; level++; } - - } *lplpDDSurface = mySurface; diff --git a/D3D11Engine/D3D7/MyDirectDrawSurface7.cpp b/D3D11Engine/D3D7/MyDirectDrawSurface7.cpp index 7173fbac..4a94038c 100644 --- a/D3D11Engine/D3D7/MyDirectDrawSurface7.cpp +++ b/D3D11Engine/D3D7/MyDirectDrawSurface7.cpp @@ -33,6 +33,11 @@ MyDirectDrawSurface7::MyDirectDrawSurface7() { MyDirectDrawSurface7::~MyDirectDrawSurface7() { Engine::GAPI->RemoveSurface( this ); + // Release mip-map chain first + for ( LPDIRECTDRAWSURFACE7 mipmap : attachedSurfaces ) { + mipmap->Release(); + } + // Sometimes gothic doesn't unlock a surface or this is a movie-buffer delete[] LockedData;