diff options
author | John Reck <jreck@google.com> | 2016-03-17 10:23:49 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2016-03-17 10:32:07 -0700 |
commit | 38f6c034d153bb648d45bce09d80a69ba3e03360 (patch) | |
tree | 00e1732da7ea4962b842536567f39a34140a54de /libs/hwui/renderthread/CanvasContext.cpp | |
parent | f068cff1761a2876587caa7ca6978a848198439a (diff) |
Move updating window position off RT
Bug: 27385141
Change-Id: I6c75b5f1d9ef55ef64dde050f71d0e28fb8714bf
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index a496b4966456..c539d63daed3 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -484,6 +484,8 @@ void CanvasContext::draw() { bool drew = mCanvas->finish(); #endif + waitOnFences(); + GL_CHECKPOINT(LOW); // Even if we decided to cancel the frame, from the perspective of jank @@ -726,6 +728,37 @@ void CanvasContext::serializeDisplayListTree() { #endif } +void CanvasContext::waitOnFences() { + if (mFrameFences.size()) { + ATRACE_CALL(); + for (auto& fence : mFrameFences) { + fence->getResult(); + } + mFrameFences.clear(); + } +} + +class CanvasContext::FuncTaskProcessor : public TaskProcessor<bool> { +public: + FuncTaskProcessor(Caches& caches) + : TaskProcessor<bool>(&caches.tasks) {} + + virtual void onProcess(const sp<Task<bool> >& task) override { + FuncTask* t = static_cast<FuncTask*>(task.get()); + t->func(); + task->setResult(true); + } +}; + +void CanvasContext::enqueueFrameWork(std::function<void()>&& func) { + if (!mFrameWorkProcessor.get()) { + mFrameWorkProcessor = new FuncTaskProcessor(Caches::getInstance()); + } + sp<FuncTask> task(new FuncTask()); + task->func = func; + mFrameWorkProcessor->add(task); +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ |