summaryrefslogtreecommitdiff
path: root/libs/hwui/renderstate/RenderState.cpp
diff options
context:
space:
mode:
authorDerek Sollenberger <djsollen@google.com>2018-09-19 13:52:13 -0400
committerDerek Sollenberger <djsollen@google.com>2018-09-20 13:35:19 -0400
commit5a5a648b696fd3e5a73c0e950080ab3bb610b2be (patch)
treefd3bedc172e30275b16ca4d4819525a654b56a00 /libs/hwui/renderstate/RenderState.cpp
parentee233403579a7250b7a454da7b357f8928479527 (diff)
Fix crash when EGLSurface is no longer valid.
The EGLSurface stored in the pipeline can become obsolete if the EglManager/RenderThread has to destroy the context. This CL enables the RenderThread to notify all active pipelines that their surface is invalid. Bug: 115290937 Test: hwui_unit_tests Change-Id: Ib3054822273bc35406630b7442229a81b39a2c91
Diffstat (limited to 'libs/hwui/renderstate/RenderState.cpp')
-rw-r--r--libs/hwui/renderstate/RenderState.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index b524bcb096da..b595ab859a61 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -41,8 +41,15 @@ void RenderState::onContextCreated() {
GpuMemoryTracker::onGpuContextCreated();
}
+static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
+ layerUpdater->destroyLayer();
+}
+
void RenderState::onContextDestroyed() {
- destroyLayersInUpdater();
+ std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater);
+ for(auto callback : mContextCallbacks) {
+ callback->onContextDestroyed();
+ }
GpuMemoryTracker::onGpuContextDestroyed();
}
@@ -91,14 +98,6 @@ void RenderState::debugOverdraw(bool enable, bool clear) {
// DEAD CODE
}
-static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
- layerUpdater->destroyLayer();
-}
-
-void RenderState::destroyLayersInUpdater() {
- std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater);
-}
-
void RenderState::postDecStrong(VirtualLightRefBase* object) {
if (pthread_equal(mThreadId, pthread_self())) {
object->decStrong(nullptr);