diff options
| -rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 5 | ||||
| -rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.h | 2 | ||||
| -rw-r--r-- | 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 59c914f0198c..4ceb13eb0e75 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 d6fc292d5900..b135a215d180 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 a44b498c81c1..d9b650c1ff37 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() { |