From d2317a49836f2ebe073010af2906b6ff1ec50e3d Mon Sep 17 00:00:00 2001 From: Greg Daniel Date: Thu, 8 Apr 2021 11:39:02 -0400 Subject: [PATCH] Make SkiaVulkanPipeline go through RenderThread to get VulkanManger. Previously the pipeline held a referance to the VulkanManager on the RenderThread. However if the RenderThread ever deleted or recreated its VulkanManager the pipline would not update its reference and cause crashes when accessed. This change makes it so the pipeline always goes through the RenderThread to get the VulkanManager. Test: Manual build and running on phone Bug: b/184287126, b/183289296 Change-Id: I52b37d0aa85b553e358285fa3654c2169971ffde --- .../hwui/pipeline/skia/SkiaVulkanPipeline.cpp | 23 +++++++++++-------- libs/hwui/pipeline/skia/SkiaVulkanPipeline.h | 3 ++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 1bd943f4c21db..30a3fc5ac93fa 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -43,8 +43,7 @@ namespace android { namespace uirenderer { namespace skiapipeline { -SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread) - : SkiaPipeline(thread), mVkManager(thread.vulkanManager()) { +SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread) : SkiaPipeline(thread) { thread.renderState().registerContextCallback(this); } @@ -52,13 +51,17 @@ SkiaVulkanPipeline::~SkiaVulkanPipeline() { mRenderThread.renderState().removeContextCallback(this); } +VulkanManager& SkiaVulkanPipeline::vulkanManager() { + return mRenderThread.vulkanManager(); +} + MakeCurrentResult SkiaVulkanPipeline::makeCurrent() { return MakeCurrentResult::AlreadyCurrent; } Frame SkiaVulkanPipeline::getFrame() { LOG_ALWAYS_FATAL_IF(mVkSurface == nullptr, "getFrame() called on a context with no surface!"); - return mVkManager.dequeueNextBuffer(mVkSurface); + return vulkanManager().dequeueNextBuffer(mVkSurface); } bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty, @@ -85,7 +88,7 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, con { ATRACE_NAME("flush commands"); - mVkManager.finishFrame(backBuffer.get()); + vulkanManager().finishFrame(backBuffer.get()); } layerUpdateQueue->clear(); @@ -106,7 +109,7 @@ bool SkiaVulkanPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect currentFrameInfo->markSwapBuffers(); if (*requireSwap) { - mVkManager.swapBuffers(mVkSurface, screenDirty); + vulkanManager().swapBuffers(mVkSurface, screenDirty); } return *requireSwap; @@ -122,15 +125,15 @@ void SkiaVulkanPipeline::onStop() {} bool SkiaVulkanPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior) { if (mVkSurface) { - mVkManager.destroySurface(mVkSurface); + vulkanManager().destroySurface(mVkSurface); mVkSurface = nullptr; } if (surface) { mRenderThread.requireVkContext(); mVkSurface = - mVkManager.createSurface(surface, mColorMode, mSurfaceColorSpace, mSurfaceColorType, - mRenderThread.getGrContext(), 0); + vulkanManager().createSurface(surface, mColorMode, mSurfaceColorSpace, + mSurfaceColorType, mRenderThread.getGrContext(), 0); } return mVkSurface != nullptr; @@ -141,7 +144,7 @@ bool SkiaVulkanPipeline::isSurfaceReady() { } bool SkiaVulkanPipeline::isContextReady() { - return CC_LIKELY(mVkManager.hasVkContext()); + return CC_LIKELY(vulkanManager().hasVkContext()); } void SkiaVulkanPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) { @@ -156,7 +159,7 @@ sk_sp SkiaVulkanPipeline::allocateHardwareBitmap(renderthread::RenderThr void SkiaVulkanPipeline::onContextDestroyed() { if (mVkSurface) { - mVkManager.destroySurface(mVkSurface); + vulkanManager().destroySurface(mVkSurface); mVkSurface = nullptr; } } diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h index 6268daa6213f3..56d42e013f312 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h @@ -55,7 +55,8 @@ protected: void onContextDestroyed() override; private: - renderthread::VulkanManager& mVkManager; + renderthread::VulkanManager& vulkanManager(); + renderthread::VulkanSurface* mVkSurface = nullptr; };