summaryrefslogtreecommitdiffstats
path: root/src/angle/patches/0013-ANGLE-clean-up-displays-on-dll-unload.patch
blob: fce3fd76b226b0f7cf9ff5647f2b65d4593b5f7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From d8ca4f6d0d8fffd8319f340685e03751049678ae Mon Sep 17 00:00:00 2001
From: Oliver Wolff <oliver.wolff@qt.io>
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