From 7c1786beff6050b7f2a3448e56eb222dd6be8a69 Mon Sep 17 00:00:00 2001 From: Matt Buckley Date: Mon, 30 Jan 2023 23:36:56 +0000 Subject: [PATCH] Create HintSessionWrapper in RT right after CanvasContext Move the construction of the HintSessionWrapper to RT right after the creation of the CanvasContext to ensure enough time is provided to not block the critical path in most cases. Bug: 263755904 Test: manual Change-Id: Ibab98b811de9056c51092286398d5c41c4d1d86b Merged-In: I1a67b163acd9c41156d9b9e14e974c67b6ba6ed5 --- libs/hwui/renderthread/DrawFrameTask.cpp | 5 +++++ libs/hwui/renderthread/DrawFrameTask.h | 2 ++ libs/hwui/renderthread/RenderProxy.cpp | 15 +++++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 59c914f0198c7..4ceb13eb0e75e 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -278,6 +278,11 @@ void DrawFrameTask::unblockUiThread() { mSignal.signal(); } +void DrawFrameTask::createHintSession(pid_t uiThreadId, pid_t renderThreadId) { + if (mHintSessionWrapper) return; + mHintSessionWrapper.emplace(uiThreadId, renderThreadId); +} + DrawFrameTask::HintSessionWrapper::HintSessionWrapper(int32_t uiThreadId, int32_t renderThreadId) { if (!Properties::useHintManager) return; if (uiThreadId < 0 || renderThreadId < 0) return; diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index d6fc292d5900d..b135a215d180c 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -90,6 +90,8 @@ public: void forceDrawNextFrame() { mForceDrawFrame = true; } + void createHintSession(pid_t uiThreadId, pid_t renderThreadId); + private: class HintSessionWrapper { public: diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index a44b498c81c1a..d9b650c1ff376 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -38,11 +38,18 @@ namespace renderthread { RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) : mRenderThread(RenderThread::getInstance()), mContext(nullptr) { - mContext = mRenderThread.queue().runSync([&]() -> CanvasContext* { - return CanvasContext::create(mRenderThread, translucent, rootRenderNode, contextFactory); + pid_t uiThreadId = pthread_gettid_np(pthread_self()); + pid_t renderThreadId = getRenderThreadTid(); + mContext = mRenderThread.queue().runSync([=, this]() -> CanvasContext* { + CanvasContext* context = + CanvasContext::create(mRenderThread, translucent, rootRenderNode, contextFactory); + if (context != nullptr) { + mRenderThread.queue().post( + [=] { mDrawFrameTask.createHintSession(uiThreadId, renderThreadId); }); + } + return context; }); - mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode, - pthread_gettid_np(pthread_self()), getRenderThreadTid()); + mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode, uiThreadId, renderThreadId); } RenderProxy::~RenderProxy() {