diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 559ac875c2f89..125f1099b0569 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -89,7 +89,7 @@ public: * If Properties::isSkiaEnabled() is true then this will return the Skia * grContext associated with the current RenderPipeline. */ - GrContext* getGrContext() const { return mRenderPipeline->getGrContext(); } + GrContext* getGrContext() const { return mRenderThread.getGrContext(); } // Won't take effect until next EGLSurface creation void setSwapBehavior(SwapBehavior swapBehavior); diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index beda0455c1453..ce48bc094b097 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #define GLES_VERSION 2 @@ -126,6 +128,17 @@ void EglManager::initialize() { makeCurrent(mPBufferSurface); DeviceInfo::initialize(); mRenderThread.renderState().onGLContextCreated(); + + if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) { + sk_sp glInterface(GrGLCreateNativeInterface()); + LOG_ALWAYS_FATAL_IF(!glInterface.get()); + + GrContextOptions options; + options.fDisableDistanceFieldPaths = true; + options.fAllowPathMaskCaching = true; + mRenderThread.setGrContext(GrContext::Create(GrBackend::kOpenGL_GrBackend, + (GrBackendContext)glInterface.get(), options)); + } } void EglManager::initExtensions() { @@ -235,6 +248,7 @@ void EglManager::destroySurface(EGLSurface surface) { void EglManager::destroy() { if (mEglDisplay == EGL_NO_DISPLAY) return; + mRenderThread.setGrContext(nullptr); mRenderThread.renderState().onGLContextDestroyed(); eglDestroyContext(mEglDisplay, mEglContext); eglDestroySurface(mEglDisplay, mPBufferSurface); diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index f96c2fdcfc42c..52894adf987bf 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -73,7 +73,6 @@ public: virtual TaskManager* getTaskManager() = 0; virtual bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator) = 0; - virtual GrContext* getGrContext() = 0; virtual ~IRenderPipeline() {} }; diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h index d024aecec2491..2f661dcfec2f1 100644 --- a/libs/hwui/renderthread/OpenGLPipeline.h +++ b/libs/hwui/renderthread/OpenGLPipeline.h @@ -56,7 +56,6 @@ public: bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator) override; static void destroyLayer(RenderNode* node); - GrContext* getGrContext() override { return nullptr; } private: EglManager& mEglManager; diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index 076e3d43a2c9b..c914098b0ea19 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -22,6 +22,7 @@ #include "../JankTracker.h" #include "TimeLord.h" +#include #include #include #include @@ -94,6 +95,9 @@ public: const DisplayInfo& mainDisplayInfo() { return mDisplayInfo; } + GrContext* getGrContext() const { return mGrContext.get(); } + void setGrContext(GrContext* cxt) { mGrContext.reset(cxt); } + protected: virtual bool threadLoop() override; @@ -144,6 +148,8 @@ private: EglManager* mEglManager; JankTracker* mJankTracker = nullptr; + + sk_sp mGrContext; }; } /* namespace renderthread */