diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index db4d1dc5c1585..0d091b3224ddc 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -194,8 +194,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) { @@ -1033,6 +1031,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 a274d2f2377f2..d7fe0d635b485 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -227,6 +227,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 5edb0b1dd8185..353078d37a75e 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); }