diff options
author | Kai Koehne <kai.koehne@theqtcompany.com> | 2014-11-24 10:52:03 +0100 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@theqtcompany.com> | 2014-11-24 13:04:38 +0100 |
commit | 155306ffee1941194d44dd632a7993fce4a05606 (patch) | |
tree | 1c7dbbc0cd9cb83be16f0bc888c7ebe256ff343c /src | |
parent | f88ab80c8a7510ff01410631eeaec81d48365316 (diff) |
ANGLE: Fix releasing textures after we kill D3D11
Cherry-pick upstream commit cc4cd2925b9a4f1142a86df131345a861c9d7cd9
to fix crashes on exit.
Task-number: QTBUG-42772
Change-Id: Ib74be17f2b5fdd58f9e0568e1da74ba19e943019
Reviewed-by: Andrew Knight <andrew.knight@theqtcompany.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Diffstat (limited to 'src')
7 files changed, 117 insertions, 7 deletions
diff --git a/src/3rdparty/angle/src/libGLESv2/Context.cpp b/src/3rdparty/angle/src/libGLESv2/Context.cpp index b87689cd3f..3772da6f42 100644 --- a/src/3rdparty/angle/src/libGLESv2/Context.cpp +++ b/src/3rdparty/angle/src/libGLESv2/Context.cpp @@ -162,12 +162,6 @@ Context::~Context() deleteTransformFeedback(mTransformFeedbackMap.begin()->first); } - for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++) - { - i->second.set(NULL); - } - mIncompleteTextures.clear(); - for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++) { i->second.set(NULL); diff --git a/src/3rdparty/angle/src/libGLESv2/Context.h b/src/3rdparty/angle/src/libGLESv2/Context.h index 1e890de3ef..0699592d91 100644 --- a/src/3rdparty/angle/src/libGLESv2/Context.h +++ b/src/3rdparty/angle/src/libGLESv2/Context.h @@ -247,7 +247,6 @@ class Context int mClientVersion; TextureMap mZeroTextures; - TextureMap mIncompleteTextures; typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap; FramebufferMap mFramebufferMap; diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp index 97da6da7fd..5cddd8ab5e 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp @@ -27,6 +27,11 @@ RendererD3D::RendererD3D(egl::Display *display) RendererD3D::~RendererD3D() { + cleanup(); +} + +void RendererD3D::cleanup() +{ for (gl::TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); ++i) { i->second.set(NULL); diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h index 9919207667..a2f778763c 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h @@ -160,6 +160,8 @@ class RendererD3D : public Renderer const gl::Rectangle *scissor, bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter) = 0; + void cleanup(); + egl::Display *mDisplay; private: diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp index e6d7f3025b..777308e6cc 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp @@ -1870,6 +1870,8 @@ bool Renderer11::testDeviceResettable() void Renderer11::release() { + RendererD3D::cleanup(); + releaseShaderCompiler(); releaseDeviceResources(); diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index 601cd24b10..18e6e2d7f0 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -151,6 +151,8 @@ Renderer9::~Renderer9() void Renderer9::release() { + RendererD3D::cleanup(); + releaseShaderCompiler(); releaseDeviceResources(); diff --git a/src/angle/patches/0018-ANGLE-Fix-releasing-textures-after-we-kill-D3D11.patch b/src/angle/patches/0018-ANGLE-Fix-releasing-textures-after-we-kill-D3D11.patch new file mode 100644 index 0000000000..97847ad684 --- /dev/null +++ b/src/angle/patches/0018-ANGLE-Fix-releasing-textures-after-we-kill-D3D11.patch @@ -0,0 +1,106 @@ +From 014d3fcf6011109491b0489da9c1abb1fdc6dbdc Mon Sep 17 00:00:00 2001 +From: Kai Koehne <kai.koehne@theqtcompany.com> +Date: Mon, 24 Nov 2014 10:52:03 +0100 +Subject: [PATCH] ANGLE: Fix releasing textures after we kill D3D11 + +Cherry-pick upstream commit cc4cd2925b9a4f1142a86df131345a861c9d7cd9 +to fix crashes on exit. + +Task-number: QTBUG-42772 +Change-Id: Ib74be17f2b5fdd58f9e0568e1da74ba19e943019 +--- + src/3rdparty/angle/src/libGLESv2/Context.cpp | 6 ------ + src/3rdparty/angle/src/libGLESv2/Context.h | 1 - + src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp | 5 +++++ + src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h | 2 ++ + src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 2 ++ + src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 2 ++ + 6 files changed, 11 insertions(+), 7 deletions(-) + +diff --git a/src/3rdparty/angle/src/libGLESv2/Context.cpp b/src/3rdparty/angle/src/libGLESv2/Context.cpp +index b87689c..3772da6 100644 +--- a/src/3rdparty/angle/src/libGLESv2/Context.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/Context.cpp +@@ -162,12 +162,6 @@ Context::~Context() + deleteTransformFeedback(mTransformFeedbackMap.begin()->first); + } + +- for (TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); i++) +- { +- i->second.set(NULL); +- } +- mIncompleteTextures.clear(); +- + for (TextureMap::iterator i = mZeroTextures.begin(); i != mZeroTextures.end(); i++) + { + i->second.set(NULL); +diff --git a/src/3rdparty/angle/src/libGLESv2/Context.h b/src/3rdparty/angle/src/libGLESv2/Context.h +index 1e890de..0699592 100644 +--- a/src/3rdparty/angle/src/libGLESv2/Context.h ++++ b/src/3rdparty/angle/src/libGLESv2/Context.h +@@ -247,7 +247,6 @@ class Context + int mClientVersion; + + TextureMap mZeroTextures; +- TextureMap mIncompleteTextures; + + typedef std::unordered_map<GLuint, Framebuffer*> FramebufferMap; + FramebufferMap mFramebufferMap; +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp +index 97da6da..5cddd8a 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.cpp +@@ -27,6 +27,11 @@ RendererD3D::RendererD3D(egl::Display *display) + + RendererD3D::~RendererD3D() + { ++ cleanup(); ++} ++ ++void RendererD3D::cleanup() ++{ + for (gl::TextureMap::iterator i = mIncompleteTextures.begin(); i != mIncompleteTextures.end(); ++i) + { + i->second.set(NULL); +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h +index 9919207..a2f7787 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/RendererD3D.h +@@ -160,6 +160,8 @@ class RendererD3D : public Renderer + const gl::Rectangle *scissor, bool blitRenderTarget, + bool blitDepth, bool blitStencil, GLenum filter) = 0; + ++ void cleanup(); ++ + egl::Display *mDisplay; + + private: +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +index e6d7f30..777308e 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +@@ -1870,6 +1870,8 @@ bool Renderer11::testDeviceResettable() + + void Renderer11::release() + { ++ RendererD3D::cleanup(); ++ + releaseShaderCompiler(); + releaseDeviceResources(); + +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +index 601cd24..18e6e2d 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +@@ -151,6 +151,8 @@ Renderer9::~Renderer9() + + void Renderer9::release() + { ++ RendererD3D::cleanup(); ++ + releaseShaderCompiler(); + releaseDeviceResources(); + +-- +1.9.4.msysgit.0 + |