Skip to content

Commit

Permalink
ANGLE: clean up displays on dll unload
Browse files Browse the repository at this point in the history
If the displays are not cleaned up on dll unloading, profilers might
report memory leaks.

Change-Id: I04cbc3c2448bfb450f7d840e216827f86856e963
Reviewed-by: Friedemann Kleint <[email protected]>
Reviewed-by: Andre de la Rocha <[email protected]>
Reviewed-by: Andy Shaw <[email protected]>
  • Loading branch information
owolff committed Apr 16, 2019
1 parent 7c6b969 commit 0bd27f8
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/3rdparty/angle/src/libANGLE/Display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,23 @@ Display *Display::GetDisplayFromDevice(Device *device, const AttributeMap &attri
return display;
}

//static
void Display::CleanupDisplays()
{
// ~Display takes care of removing the entry from the according map
{
ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
while (!displays->empty())
delete displays->begin()->second;
}

{
DevicePlatformDisplayMap *displays = GetDevicePlatformDisplayMap();
while (!displays->empty())
delete displays->begin()->second;
}
}

Display::Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice)
: mImplementation(nullptr),
mDisplayId(displayId),
Expand Down
1 change: 1 addition & 0 deletions src/3rdparty/angle/src/libANGLE/Display.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class Display final : angle::NonCopyable
static Display *GetDisplayFromDevice(Device *device, const AttributeMap &attribMap);
static Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
const AttributeMap &attribMap);
static void CleanupDisplays();

static const ClientExtensions &GetClientExtensions();
static const std::string &GetClientExtensionString();
Expand Down
2 changes: 2 additions & 0 deletions src/3rdparty/angle/src/libGLESv2/global_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "common/tls.h"

#include "libANGLE/Thread.h"
#include "libANGLE/Display.h"

namespace gl
{
Expand Down Expand Up @@ -140,6 +141,7 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD reason, LPVOID)
return static_cast<BOOL>(egl::DeallocateCurrentThread());

case DLL_PROCESS_DETACH:
egl::Display::CleanupDisplays();
return static_cast<BOOL>(egl::TerminateProcess());
}

Expand Down
78 changes: 78 additions & 0 deletions src/angle/patches/0013-ANGLE-clean-up-displays-on-dll-unload.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
From d8ca4f6d0d8fffd8319f340685e03751049678ae Mon Sep 17 00:00:00 2001
From: Oliver Wolff <[email protected]>
Date: Tue, 16 Apr 2019 10:19:27 +0200
Subject: [PATCH] ANGLE: clean up displays on dll unload

If the displays are not cleaned up on dll unloading, profilers might
report memory leaks.

Change-Id: I04cbc3c2448bfb450f7d840e216827f86856e963
---
src/3rdparty/angle/src/libANGLE/Display.cpp | 17 +++++++++++++++++
src/3rdparty/angle/src/libANGLE/Display.h | 1 +
.../angle/src/libGLESv2/global_state.cpp | 2 ++
3 files changed, 20 insertions(+)

diff --git a/src/3rdparty/angle/src/libANGLE/Display.cpp b/src/3rdparty/angle/src/libANGLE/Display.cpp
index 735b472787..0bb0bb05b1 100644
--- a/src/3rdparty/angle/src/libANGLE/Display.cpp
+++ b/src/3rdparty/angle/src/libANGLE/Display.cpp
@@ -364,6 +364,23 @@ Display *Display::GetDisplayFromDevice(Device *device, const AttributeMap &attri
return display;
}

+//static
+void Display::CleanupDisplays()
+{
+ // ~Display takes care of removing the entry from the according map
+ {
+ ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
+ while (!displays->empty())
+ delete displays->begin()->second;
+ }
+
+ {
+ DevicePlatformDisplayMap *displays = GetDevicePlatformDisplayMap();
+ while (!displays->empty())
+ delete displays->begin()->second;
+ }
+}
+
Display::Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice)
: mImplementation(nullptr),
mDisplayId(displayId),
diff --git a/src/3rdparty/angle/src/libANGLE/Display.h b/src/3rdparty/angle/src/libANGLE/Display.h
index aa1d1c3b37..2a1c386d75 100644
--- a/src/3rdparty/angle/src/libANGLE/Display.h
+++ b/src/3rdparty/angle/src/libANGLE/Display.h
@@ -65,6 +65,7 @@ class Display final : angle::NonCopyable
static Display *GetDisplayFromDevice(Device *device, const AttributeMap &attribMap);
static Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
const AttributeMap &attribMap);
+ static void CleanupDisplays();

static const ClientExtensions &GetClientExtensions();
static const std::string &GetClientExtensionString();
diff --git a/src/3rdparty/angle/src/libGLESv2/global_state.cpp b/src/3rdparty/angle/src/libGLESv2/global_state.cpp
index c5f3dfe4e1..26045bf5b2 100644
--- a/src/3rdparty/angle/src/libGLESv2/global_state.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/global_state.cpp
@@ -13,6 +13,7 @@
#include "common/tls.h"

#include "libANGLE/Thread.h"
+#include "libANGLE/Display.h"

namespace gl
{
@@ -140,6 +141,7 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD reason, LPVOID)
return static_cast<BOOL>(egl::DeallocateCurrentThread());

case DLL_PROCESS_DETACH:
+ egl::Display::CleanupDisplays();
return static_cast<BOOL>(egl::TerminateProcess());
}

--
2.20.1.windows.1

0 comments on commit 0bd27f8

Please sign in to comment.