diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-04-21 16:38:22 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-04-22 09:53:57 +0200 |
commit | d0241ea85b6836d2ffa3c00d5e01e7b5ff9b3c15 (patch) | |
tree | 21dc322537a2107bf821eed64bb031f5422edebd /vcl/opengl | |
parent | 93b500ee7c1cbb141bb77b94054f3bee9c3b510a (diff) |
Don't keep gGlobalGlyphCache, gTextureCache around until exit
Those static variables had been introduced with
56c5a0ba7781a325123852737970fa7f0179ff7f "tdf#94682 limit the number of textures
for the glyph texture atlas" and dea885f80a80c6a5839ee5dbf8521487186a9522
"opengl: cache native widget textures also for Windows", but at least the
clang-cl build crashed on exit from soffice.bin with
> Exception thrown at 0x00007FFF3906AA84 (opengl32.dll) in soffice.bin: 0xC0000005: Access violation reading location 0x0000000000000898.
> opengl32.dll!glGetString() Unknown
> epoxy.dll!epoxy_glGetString_dispatch_table_rewrite_ptr(unsigned int name) Line 46456 C
> epoxy.dll!epoxy_glGetString_dispatch_table_thunk(unsigned int name) Line 46456 C
> epoxy.dll!epoxy_is_desktop_gl() Line 299 C
> epoxy.dll!gl_provider_resolver(const char * name, const gl_provider * providers, const unsigned short * entrypoints) Line 7323 C
> epoxy.dll!epoxy_glDeleteTextures_resolver() Line 14646 C
> epoxy.dll!epoxy_glDeleteTextures_dispatch_table_rewrite_ptr(int n, const unsigned int * textures) Line 45813 C
> epoxy.dll!epoxy_glDeleteTextures_dispatch_table_thunk(int n, const unsigned int * textures) Line 45813 C
> vcllo.dll!TextureState::unbindAndDelete(unsigned int nTexture) Line 59 C++
> vcllo.dll!ImplOpenGLTexture::~ImplOpenGLTexture() Line 182 C++
> [External Code]
> vcllo.dll!PackedTextureAtlasManager::~PackedTextureAtlasManager() Line 129 C++
> vcllo.dll!GlobalGlyphCache::~GlobalGlyphCache() Line 67 C++
> [External Code]
> vcllo.dll!??__FgGlobalGlyphCache@GlyphCache@@0V?$unique_ptr@UGlobalGlyphCache@@U?$default_delete@UGlobalGlyphCache@@@std@@@std@@A@YAXXZ() Line 48 C++
> [External Code]
resp.
> Exception thrown at 0x00007FFF3A5AAA84 (opengl32.dll) in soffice.bin: 0xC0000005: Access violation reading location 0x0000000000000898.
> opengl32.dll!glGetString() Unknown
> epoxy.dll!epoxy_glGetString_dispatch_table_rewrite_ptr(unsigned int name) Line 46456 C
> epoxy.dll!epoxy_glGetString_dispatch_table_thunk(unsigned int name) Line 46456 C
> epoxy.dll!epoxy_is_desktop_gl() Line 299 C
> epoxy.dll!gl_provider_resolver(const char * name, const gl_provider * providers, const unsigned short * entrypoints) Line 7323 C
> epoxy.dll!epoxy_glDeleteTextures_resolver() Line 14646 C
> epoxy.dll!epoxy_glDeleteTextures_dispatch_table_rewrite_ptr(int n, const unsigned int * textures) Line 45813 C
> epoxy.dll!epoxy_glDeleteTextures_dispatch_table_thunk(int n, const unsigned int * textures) Line 45813 C
> vcllo.dll!TextureState::unbindAndDelete(unsigned int nTexture) Line 59 C++
> vcllo.dll!ImplOpenGLTexture::~ImplOpenGLTexture() Line 182 C++
> [External Code]
> vcllo.dll!OpenGLTexture::~OpenGLTexture() Line 313 C++
> [External Code]
> vcllo.dll!TextureCombo::~TextureCombo() Line 51 C++
> [External Code]
> vcllo.dll!std::pair<ControlCacheKey, std::unique_ptr<TextureCombo, std::default_delete<TextureCombo> > >::~pair() Line 145 C++
> [External Code]
> vcllo.dll!o3tl::lru_map<ControlCacheKey, std::unique_ptr<TextureCombo, std::default_delete<TextureCombo> >, ControlCacheHashFunction>::~lru_map() Line 34 C++
> vcllo.dll!??__FgTextureCache@?A@@YAXXZ() Line 738 C++
> [External Code]
Change-Id: I0198f657f5d59314c5f662c214504ed3e1523567
Reviewed-on: https://gerrit.libreoffice.org/36801
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'vcl/opengl')
-rw-r--r-- | vcl/opengl/win/gdiimpl.cxx | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx index 5a5516db63de..ec2ca14ed816 100644 --- a/vcl/opengl/win/gdiimpl.cxx +++ b/vcl/opengl/win/gdiimpl.cxx @@ -11,7 +11,6 @@ #include <comphelper/windowserrorstring.hxx> #include <opengl/zone.hxx> -#include <o3tl/lru_map.hxx> #include <win/wincomp.hxx> #include <win/saldata.hxx> #include <win/salframe.h> @@ -729,14 +728,14 @@ void WinOpenGLSalGraphicsImpl::Init() OpenGLSalGraphicsImpl::Init(); } -namespace -{ - -typedef std::pair<ControlCacheKey, std::unique_ptr<TextureCombo>> ControlCachePair; -typedef o3tl::lru_map<ControlCacheKey, std::unique_ptr<TextureCombo>, ControlCacheHashFunction> ControlCacheType; - -ControlCacheType gTextureCache(200); +TheTextureCache::TheTextureCache(): cache(200) {} +ControlCacheType & TheTextureCache::get() { + SalData * data = GetSalData(); + if (!data->m_pTextureCache) { + data->m_pTextureCache.reset(new TheTextureCache); + } + return data->m_pTextureCache->cache; } bool WinOpenGLSalGraphicsImpl::TryRenderCachedNativeControl(ControlCacheKey& rControlCacheKey, int nX, int nY) @@ -746,6 +745,7 @@ bool WinOpenGLSalGraphicsImpl::TryRenderCachedNativeControl(ControlCacheKey& rCo if (!gbCacheEnabled) return false; + auto & gTextureCache = TheTextureCache::get(); ControlCacheType::const_iterator iterator = gTextureCache.find(rControlCacheKey); if (iterator == gTextureCache.end()) @@ -805,7 +805,7 @@ bool WinOpenGLSalGraphicsImpl::RenderAndCacheNativeControl(OpenGLCompatibleDC& r return true; ControlCachePair pair(aControlCacheKey, std::move(pCombo)); - gTextureCache.insert(std::move(pair)); + TheTextureCache::get().insert(std::move(pair)); return bResult; } |