diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index c0f30865d507f..13a695a1f0c5b 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -180,8 +180,6 @@ void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { ATRACE_CALL(); if (window) { - // Ensure the hint session is running here, away from any critical paths - mHintSessionWrapper.init(); mNativeSurface = std::make_unique(window); mNativeSurface->init(); if (enableTimeout) { @@ -1050,6 +1048,10 @@ void CanvasContext::setSyncDelayDuration(nsecs_t duration) { mSyncDelayDuration = duration; } +void CanvasContext::startHintSession() { + mHintSessionWrapper.init(); +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 0f6b736e7edfe..deb21093bb411 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -224,6 +224,8 @@ public: void setSyncDelayDuration(nsecs_t duration); + void startHintSession(); + private: CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory, std::unique_ptr renderPipeline, diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index f8e2deebc3c60..ce1a5511a8e2e 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -45,8 +45,12 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode, pid_t uiThreadId = pthread_gettid_np(pthread_self()); pid_t renderThreadId = getRenderThreadTid(); mContext = mRenderThread.queue().runSync([=, this]() -> CanvasContext* { - return CanvasContext::create(mRenderThread, translucent, rootRenderNode, contextFactory, - uiThreadId, renderThreadId); + CanvasContext* context = CanvasContext::create(mRenderThread, translucent, rootRenderNode, + contextFactory, uiThreadId, renderThreadId); + if (context != nullptr) { + mRenderThread.queue().post([=] { context->startHintSession(); }); + } + return context; }); mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode); }