From 28912a508493e583c48772e2a234e0ed66849490 Mon Sep 17 00:00:00 2001 From: John Reck Date: Mon, 18 Apr 2016 14:34:18 -0700 Subject: [PATCH] Make getFrameNumber lazy Change-Id: I783de544ad9a3636ea90f1c8c4034738997bfbc8 Fixes: 28246085 --- core/jni/android_view_RenderNode.cpp | 3 ++- libs/hwui/TreeInfo.h | 2 -- libs/hwui/renderthread/CanvasContext.cpp | 15 +++++++++++---- libs/hwui/renderthread/CanvasContext.h | 3 +++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index 4459f324ff33d..d3e18edd6dbe3 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -564,7 +564,8 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, auto functor = std::bind( std::mem_fn(&SurfaceViewPositionUpdater::doUpdatePosition), this, - (jlong) info.frameNumber, (jint) bounds.left, (jint) bounds.top, + (jlong) info.canvasContext.getFrameNumber(), + (jint) bounds.left, (jint) bounds.top, (jint) bounds.right, (jint) bounds.bottom); info.canvasContext.enqueueFrameWork(std::move(functor)); diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index a43e544b45075..ac2bdccf52553 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -102,8 +102,6 @@ public: // tree state changes TreeObserver* observer = nullptr; - // Frame number for use with synchronized surfaceview position updating - int64_t frameNumber = -1; int32_t windowInsetLeft = 0; int32_t windowInsetTop = 0; bool updateWindowPositions = false; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 890d4a1ea2246..df5c8d93fb830 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -108,6 +108,8 @@ void CanvasContext::setSurface(Surface* surface) { mEglSurface = mEglManager.createSurface(surface); } + mFrameNumber = -1; + if (mEglSurface != EGL_NO_SURFACE) { const bool preserveBuffer = (mSwapBehavior != kSwap_discardBuffer); mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer); @@ -214,10 +216,6 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, info.renderer = mCanvas; #endif - if (CC_LIKELY(mNativeSurface.get())) { - info.frameNumber = static_cast(mNativeSurface->getNextFrameNumber()); - } - mAnimationContext->startFrame(info.mode); for (const sp& node : mRenderNodes) { // Only the primary target node will be drawn full - all other nodes would get drawn in @@ -511,6 +509,7 @@ void CanvasContext::draw() { swap.swapTime = systemTime(CLOCK_MONOTONIC); swap.vsyncTime = mRenderThread.timeLord().latestVsync(); mHaveNewSurface = false; + mFrameNumber = -1; } // TODO: Use a fence for real completion? @@ -779,6 +778,14 @@ void CanvasContext::enqueueFrameWork(std::function&& func) { mFrameWorkProcessor->add(task); } +int64_t CanvasContext::getFrameNumber() { + // mFrameNumber is reset to -1 when the surface changes or we swap buffers + if (mFrameNumber == -1 && mNativeSurface.get()) { + mFrameNumber = static_cast(mNativeSurface->getNextFrameNumber()); + } + return mFrameNumber; +} + } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 52df3abe2cae7..e739b2949cf94 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -166,6 +166,8 @@ public: // Used to queue up work that needs to be completed before this frame completes ANDROID_API void enqueueFrameWork(std::function&& func); + ANDROID_API int64_t getFrameNumber(); + private: friend class RegisterFrameCallbackTask; // TODO: Replace with something better for layer & other GL object @@ -195,6 +197,7 @@ private: }; RingBuffer mSwapHistory; + int64_t mFrameNumber = -1; bool mOpaque; #if HWUI_NEW_OPS