From 5a5a648b696fd3e5a73c0e950080ab3bb610b2be Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Wed, 19 Sep 2018 13:52:13 -0400 Subject: 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 --- libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp | 15 ++++++++++++++- libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h | 9 +++++++-- libs/hwui/renderstate/RenderState.cpp | 17 ++++++++--------- libs/hwui/renderstate/RenderState.h | 20 +++++++++++++++----- libs/hwui/renderthread/RenderThread.cpp | 4 ++-- libs/hwui/renderthread/VulkanManager.cpp | 3 --- libs/hwui/tests/unit/SkiaPipelineTests.cpp | 10 ++++++++++ 7 files changed, 56 insertions(+), 22 deletions(-) (limited to 'libs/hwui') diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 3b1ebd690465..e586be1d0708 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -43,7 +43,13 @@ namespace uirenderer { namespace skiapipeline { SkiaOpenGLPipeline::SkiaOpenGLPipeline(RenderThread& thread) - : SkiaPipeline(thread), mEglManager(thread.eglManager()) {} + : SkiaPipeline(thread), mEglManager(thread.eglManager()) { + thread.renderState().registerContextCallback(this); +} + +SkiaOpenGLPipeline::~SkiaOpenGLPipeline() { + mRenderThread.renderState().removeContextCallback(this); +} MakeCurrentResult SkiaOpenGLPipeline::makeCurrent() { // TODO: Figure out why this workaround is needed, see b/13913604 @@ -135,6 +141,13 @@ DeferredLayerUpdater* SkiaOpenGLPipeline::createTextureLayer() { return new DeferredLayerUpdater(mRenderThread.renderState()); } +void SkiaOpenGLPipeline::onContextDestroyed() { + if (mEglSurface != EGL_NO_SURFACE) { + mEglManager.destroySurface(mEglSurface); + mEglSurface = EGL_NO_SURFACE; + } +} + void SkiaOpenGLPipeline::onStop() { if (mEglManager.isCurrent(mEglSurface)) { mEglManager.makeCurrent(EGL_NO_SURFACE); diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h index fbdf3139dabd..086a76088a75 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h @@ -18,6 +18,8 @@ #include "SkiaPipeline.h" +#include "renderstate/RenderState.h" + namespace android { class Bitmap; @@ -25,10 +27,10 @@ class Bitmap; namespace uirenderer { namespace skiapipeline { -class SkiaOpenGLPipeline : public SkiaPipeline { +class SkiaOpenGLPipeline : public SkiaPipeline, public IGpuContextCallback { public: SkiaOpenGLPipeline(renderthread::RenderThread& thread); - virtual ~SkiaOpenGLPipeline() {} + virtual ~SkiaOpenGLPipeline(); renderthread::MakeCurrentResult makeCurrent() override; renderthread::Frame getFrame() override; @@ -50,6 +52,9 @@ public: static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor); +protected: + void onContextDestroyed() override; + private: renderthread::EglManager& mEglManager; EGLSurface mEglSurface = EGL_NO_SURFACE; 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); diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h index f39aa4b96547..dee02e9873d8 100644 --- a/libs/hwui/renderstate/RenderState.h +++ b/libs/hwui/renderstate/RenderState.h @@ -41,6 +41,13 @@ class CanvasContext; class RenderThread; } +class IGpuContextCallback { +public: + virtual void onContextDestroyed() = 0; +protected: + virtual ~IGpuContextCallback() {} +}; + // wrapper of Caches for users to migrate to. class RenderState { PREVENT_COPY_AND_ASSIGN(RenderState); @@ -48,9 +55,6 @@ class RenderState { friend class renderthread::CacheManager; public: - void onContextCreated(); - void onContextDestroyed(); - void onBitmapDestroyed(uint32_t pixelRefId); void setViewport(GLsizei width, GLsizei height); @@ -63,6 +67,9 @@ public: void debugOverdraw(bool enable, bool clear); + void registerContextCallback(IGpuContextCallback* cb) { mContextCallbacks.insert(cb); } + void removeContextCallback(IGpuContextCallback* cb) { mContextCallbacks.erase(cb); } + void registerLayer(Layer* layer) { mActiveLayers.insert(layer); } void unregisterLayer(Layer* layer) { mActiveLayers.erase(layer); } @@ -93,13 +100,16 @@ public: renderthread::RenderThread& getRenderThread(); private: - void destroyLayersInUpdater(); - explicit RenderState(renderthread::RenderThread& thread); ~RenderState(); + // Context notifications are only to be triggered by renderthread::RenderThread + void onContextCreated(); + void onContextDestroyed(); + renderthread::RenderThread& mRenderThread; + std::set mContextCallbacks; std::set mActiveLayers; std::set mActiveLayerUpdaters; std::set mRegisteredContexts; diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index a5dcc72636d1..207673c1c8dd 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -177,7 +177,6 @@ void RenderThread::requireGlContext() { return; } mEglManager->initialize(); - renderState().onContextCreated(); #ifdef HWUI_GLES_WRAP_ENABLED debug::GlesDriver* driver = debug::GlesDriver::get(); @@ -201,7 +200,6 @@ void RenderThread::requireGlContext() { void RenderThread::destroyGlContext() { if (mEglManager->hasEglContext()) { setGrContext(nullptr); - renderState().onContextDestroyed(); mEglManager->destroy(); } } @@ -243,10 +241,12 @@ Readback& RenderThread::readback() { void RenderThread::setGrContext(sk_sp context) { mCacheManager->reset(context); if (mGrContext) { + mRenderState->onContextDestroyed(); mGrContext->releaseResourcesAndAbandonContext(); } mGrContext = std::move(context); if (mGrContext) { + mRenderState->onContextCreated(); DeviceInfo::setMaxTextureSize(mGrContext->maxRenderTargetSize()); } } diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 488117253e7a..e60d43e4001e 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -39,7 +39,6 @@ namespace renderthread { VulkanManager::VulkanManager(RenderThread& thread) : mRenderThread(thread) {} void VulkanManager::destroy() { - mRenderThread.renderState().onContextDestroyed(); mRenderThread.setGrContext(nullptr); if (VK_NULL_HANDLE != mCommandPool) { @@ -401,8 +400,6 @@ void VulkanManager::initialize() { if (Properties::enablePartialUpdates && Properties::useBufferAge) { mSwapBehavior = SwapBehavior::BufferAge; } - - mRenderThread.renderState().onContextCreated(); } // Returns the next BackbufferInfo to use for the next draw. The function will make sure all diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp index 5e5d13485942..680fcb3a732b 100644 --- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp +++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp @@ -382,3 +382,13 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, clip_replace) { SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface); EXPECT_EQ(1, surface->canvas()->mDrawCounter); } + +RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, context_lost) { + auto pipeline = std::make_unique(renderThread); + EXPECT_FALSE(pipeline->isSurfaceReady()); + EXPECT_TRUE(pipeline->setSurface((Surface*)0x01, SwapBehavior::kSwap_default, ColorMode::Legacy)); + EXPECT_TRUE(pipeline->isSurfaceReady()); + renderThread.destroyGlContext(); + EXPECT_FALSE(pipeline->isSurfaceReady()); +} + -- cgit v1.2.3-59-g8ed1b From 28a4d9935c214374cbd487d3419abb80f57d6f80 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Thu, 20 Sep 2018 13:37:24 -0400 Subject: Refactor RenderState and remove unused functionality. Test: hwui_unit_tests still pass Change-Id: Ie943671535ab8c5da1bac05985e815e0cb842dc1 --- libs/hwui/DeferredLayerUpdater.cpp | 8 ++- libs/hwui/DeferredLayerUpdater.h | 6 +- libs/hwui/RenderNode.cpp | 6 +- libs/hwui/hwui/Bitmap.cpp | 2 - libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp | 1 + libs/hwui/pipeline/skia/SkiaPipeline.cpp | 4 -- libs/hwui/pipeline/skia/SkiaPipeline.h | 2 - libs/hwui/renderstate/RenderState.cpp | 76 +------------------------- libs/hwui/renderstate/RenderState.h | 55 +------------------ libs/hwui/renderthread/CanvasContext.cpp | 7 --- libs/hwui/renderthread/CanvasContext.h | 6 -- libs/hwui/renderthread/RenderProxy.cpp | 7 --- libs/hwui/renderthread/RenderProxy.h | 2 - libs/hwui/tests/common/TestUtils.h | 1 + 14 files changed, 22 insertions(+), 161 deletions(-) (limited to 'libs/hwui') diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 837d5461d2a8..b772e5b87f2a 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -29,12 +29,16 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState) , mGLContextAttached(false) , mUpdateTexImage(false) , mLayer(nullptr) { - renderState.registerDeferredLayerUpdater(this); + renderState.registerContextCallback(this); } DeferredLayerUpdater::~DeferredLayerUpdater() { setTransform(nullptr); - mRenderState.unregisterDeferredLayerUpdater(this); + mRenderState.removeContextCallback(this); + destroyLayer(); +} + +void DeferredLayerUpdater::onContextDestroyed() { destroyLayer(); } diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index 4c323b861002..b2c5131dd613 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -27,6 +27,7 @@ #include #include +#include "renderstate/RenderState.h" #include "surfacetexture/SurfaceTexture.h" #include "Layer.h" #include "Rect.h" @@ -38,7 +39,7 @@ class RenderState; // Container to hold the properties a layer should be set to at the start // of a render pass -class DeferredLayerUpdater : public VirtualLightRefBase { +class DeferredLayerUpdater : public VirtualLightRefBase, public IGpuContextCallback { public: // Note that DeferredLayerUpdater assumes it is taking ownership of the layer // and will not call incrementRef on it as a result. @@ -98,6 +99,9 @@ public: void destroyLayer(); +protected: + void onContextDestroyed() override; + private: RenderState& mRenderState; diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index d5afb2011429..896b4340f1b8 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -158,7 +158,7 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) { CC_UNLIKELY(properties().getWidth() == 0) || CC_UNLIKELY(properties().getHeight() == 0) || CC_UNLIKELY(!properties().fitsOnLayer())) { if (CC_UNLIKELY(hasLayer())) { - renderthread::CanvasContext::destroyLayer(this); + this->setLayerSurface(nullptr); } return; } @@ -313,7 +313,7 @@ void RenderNode::deleteDisplayList(TreeObserver& observer, TreeInfo* info) { void RenderNode::destroyHardwareResources(TreeInfo* info) { if (hasLayer()) { - renderthread::CanvasContext::destroyLayer(this); + this->setLayerSurface(nullptr); } setStagingDisplayList(nullptr); @@ -323,7 +323,7 @@ void RenderNode::destroyHardwareResources(TreeInfo* info) { void RenderNode::destroyLayers() { if (hasLayer()) { - renderthread::CanvasContext::destroyLayer(this); + this->setLayerSurface(nullptr); } if (mDisplayList) { mDisplayList->updateChildren([](RenderNode* child) { child->destroyLayers(); }); diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp index 440620a6a417..f1c10d1570a4 100644 --- a/libs/hwui/hwui/Bitmap.cpp +++ b/libs/hwui/hwui/Bitmap.cpp @@ -230,8 +230,6 @@ Bitmap::~Bitmap() { mPixelStorage.hardware.buffer = nullptr; break; } - - android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID()); } bool Bitmap::hasHardwareMipMap() const { diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index e586be1d0708..e8bf4922cd46 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -21,6 +21,7 @@ #include "SkiaPipeline.h" #include "SkiaProfileRenderer.h" #include "hwui/Bitmap.h" +#include "private/hwui/DrawGlInfo.h" #include "renderstate/RenderState.h" #include "renderthread/EglManager.h" #include "renderthread/Frame.h" diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 7f8abb8afa97..2dfe7c71ca1b 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -200,10 +200,6 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator return false; } -void SkiaPipeline::destroyLayer(RenderNode* node) { - node->setLayerSurface(nullptr); -} - void SkiaPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) { GrContext* context = thread.getGrContext(); if (context) { diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h index b78dea1a5c87..ee9158c5ffc1 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaPipeline.h @@ -54,8 +54,6 @@ public: std::vector* getVectorDrawables() { return &mVectorDrawables; } - static void destroyLayer(RenderNode* node); - static void prepareToDraw(const renderthread::RenderThread& thread, Bitmap* bitmap); void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque); diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index b595ab859a61..fad9440be73f 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -14,90 +14,28 @@ * limitations under the License. */ #include "renderstate/RenderState.h" -#include -#include "DeferredLayerUpdater.h" -#include "Snapshot.h" -#include "renderthread/CanvasContext.h" -#include "renderthread/EglManager.h" -#include "utils/GLUtils.h" - -#include - -#include +#include "renderthread/RenderThread.h" +#include "GpuMemoryTracker.h" namespace android { namespace uirenderer { -RenderState::RenderState(renderthread::RenderThread& thread) - : mRenderThread(thread), mViewportWidth(0), mViewportHeight(0), mFramebuffer(0) { +RenderState::RenderState(renderthread::RenderThread& thread) : mRenderThread(thread) { mThreadId = pthread_self(); } -RenderState::~RenderState() { -} - void RenderState::onContextCreated() { GpuMemoryTracker::onGpuContextCreated(); } -static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) { - layerUpdater->destroyLayer(); -} - void RenderState::onContextDestroyed() { - std::for_each(mActiveLayerUpdaters.begin(), mActiveLayerUpdaters.end(), destroyLayerInUpdater); for(auto callback : mContextCallbacks) { callback->onContextDestroyed(); } GpuMemoryTracker::onGpuContextDestroyed(); } -GrContext* RenderState::getGrContext() const { - return mRenderThread.getGrContext(); -} - -void RenderState::onBitmapDestroyed(uint32_t pixelRefId) { - // DEAD CODE -} - -void RenderState::setViewport(GLsizei width, GLsizei height) { - mViewportWidth = width; - mViewportHeight = height; - glViewport(0, 0, mViewportWidth, mViewportHeight); -} - -void RenderState::getViewport(GLsizei* outWidth, GLsizei* outHeight) { - *outWidth = mViewportWidth; - *outHeight = mViewportHeight; -} - -void RenderState::bindFramebuffer(GLuint fbo) { - if (mFramebuffer != fbo) { - mFramebuffer = fbo; - glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); - } -} - -GLuint RenderState::createFramebuffer() { - GLuint ret; - glGenFramebuffers(1, &ret); - return ret; -} - -void RenderState::deleteFramebuffer(GLuint fbo) { - if (mFramebuffer == fbo) { - // GL defines that deleting the currently bound FBO rebinds FBO 0. - // Reflect this in our cached value. - mFramebuffer = 0; - } - glDeleteFramebuffers(1, &fbo); -} - -void RenderState::debugOverdraw(bool enable, bool clear) { - // DEAD CODE -} - void RenderState::postDecStrong(VirtualLightRefBase* object) { if (pthread_equal(mThreadId, pthread_self())) { object->decStrong(nullptr); @@ -110,13 +48,5 @@ void RenderState::postDecStrong(VirtualLightRefBase* object) { // Render /////////////////////////////////////////////////////////////////////////////// -void RenderState::dump() { - // DEAD CODE -} - -renderthread::RenderThread& RenderState::getRenderThread() { - return mRenderThread; -} - } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h index dee02e9873d8..ff5d02fe359a 100644 --- a/libs/hwui/renderstate/RenderState.h +++ b/libs/hwui/renderstate/RenderState.h @@ -18,26 +18,16 @@ #include "utils/Macros.h" -#include -#include -#include -#include -#include -#include #include #include -class GrContext; - namespace android { namespace uirenderer { class Layer; -class DeferredLayerUpdater; namespace renderthread { class CacheManager; -class CanvasContext; class RenderThread; } @@ -55,69 +45,30 @@ class RenderState { friend class renderthread::CacheManager; public: - void onBitmapDestroyed(uint32_t pixelRefId); - - void setViewport(GLsizei width, GLsizei height); - void getViewport(GLsizei* outWidth, GLsizei* outHeight); - - void bindFramebuffer(GLuint fbo); - GLuint getFramebuffer() { return mFramebuffer; } - GLuint createFramebuffer(); - void deleteFramebuffer(GLuint fbo); - - void debugOverdraw(bool enable, bool clear); - void registerContextCallback(IGpuContextCallback* cb) { mContextCallbacks.insert(cb); } void removeContextCallback(IGpuContextCallback* cb) { mContextCallbacks.erase(cb); } void registerLayer(Layer* layer) { mActiveLayers.insert(layer); } void unregisterLayer(Layer* layer) { mActiveLayers.erase(layer); } - void registerCanvasContext(renderthread::CanvasContext* context) { - mRegisteredContexts.insert(context); - } - - void unregisterCanvasContext(renderthread::CanvasContext* context) { - mRegisteredContexts.erase(context); - } - - void registerDeferredLayerUpdater(DeferredLayerUpdater* layerUpdater) { - mActiveLayerUpdaters.insert(layerUpdater); - } - - void unregisterDeferredLayerUpdater(DeferredLayerUpdater* layerUpdater) { - mActiveLayerUpdaters.erase(layerUpdater); - } - // TODO: This system is a little clunky feeling, this could use some // more thinking... void postDecStrong(VirtualLightRefBase* object); - GrContext* getGrContext() const; - - void dump(); - - renderthread::RenderThread& getRenderThread(); + renderthread::RenderThread& getRenderThread() const { return mRenderThread; } private: explicit RenderState(renderthread::RenderThread& thread); - ~RenderState(); + ~RenderState() {} // Context notifications are only to be triggered by renderthread::RenderThread void onContextCreated(); void onContextDestroyed(); - renderthread::RenderThread& mRenderThread; - std::set mContextCallbacks; std::set mActiveLayers; - std::set mActiveLayerUpdaters; - std::set mRegisteredContexts; - - GLsizei mViewportWidth; - GLsizei mViewportHeight; - GLuint mFramebuffer; + renderthread::RenderThread& mRenderThread; pthread_t mThreadId; }; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index ea6a851419c0..c8c394a72541 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -27,7 +27,6 @@ #include "pipeline/skia/SkiaOpenGLPipeline.h" #include "pipeline/skia/SkiaPipeline.h" #include "pipeline/skia/SkiaVulkanPipeline.h" -#include "renderstate/RenderState.h" #include "utils/GLUtils.h" #include "utils/TimeUtils.h" #include "../Properties.h" @@ -76,10 +75,6 @@ CanvasContext* CanvasContext::create(RenderThread& thread, bool translucent, return nullptr; } -void CanvasContext::destroyLayer(RenderNode* node) { - skiapipeline::SkiaPipeline::destroyLayer(node); -} - void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor) { ATRACE_CALL(); auto renderType = Properties::getRenderPipelineType(); @@ -113,13 +108,11 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* , mRenderPipeline(std::move(renderPipeline)) { rootRenderNode->makeRoot(); mRenderNodes.emplace_back(rootRenderNode); - mRenderThread.renderState().registerCanvasContext(this); mProfiler.setDensity(mRenderThread.mainDisplayInfo().density); } CanvasContext::~CanvasContext() { destroy(); - mRenderThread.renderState().unregisterCanvasContext(this); for (auto& node : mRenderNodes) { node->clearRoot(); } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 8448788eb9a6..2315cb9c73f9 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -96,12 +96,6 @@ public: */ void unpinImages() { mRenderPipeline->unpinImages(); } - /** - * Destroy any layers that have been attached to the provided RenderNode removing - * any state that may have been set during createOrUpdateLayer(). - */ - static void destroyLayer(RenderNode* node); - static void invokeFunctor(const RenderThread& thread, Functor* functor); static void prepareToDraw(const RenderThread& thread, Bitmap* bitmap); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 7a5348ac85d9..6106e24c093b 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -345,13 +345,6 @@ int RenderProxy::copyHWBitmapInto(Bitmap* hwBitmap, SkBitmap* bitmap) { } } -void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) { - if (!RenderThread::hasInstance()) return; - RenderThread& thread = RenderThread::getInstance(); - thread.queue().post( - [&thread, pixelRefId]() { thread.renderState().onBitmapDestroyed(pixelRefId); }); -} - void RenderProxy::disableVsync() { Properties::disableVsync = true; } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 969ad00d7443..d22f56ef38fd 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -127,8 +127,6 @@ public: static int copyHWBitmapInto(Bitmap* hwBitmap, SkBitmap* bitmap); - static void onBitmapDestroyed(uint32_t pixelRefId); - ANDROID_API static void disableVsync(); static void repackVectorDrawableAtlas(); diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h index c35f512553d8..a00b8db3c617 100644 --- a/libs/hwui/tests/common/TestUtils.h +++ b/libs/hwui/tests/common/TestUtils.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include -- cgit v1.2.3-59-g8ed1b