OSDN Git Service

Make getFrameNumber lazy
authorJohn Reck <jreck@google.com>
Mon, 18 Apr 2016 21:34:18 +0000 (14:34 -0700)
committerJohn Reck <jreck@google.com>
Mon, 18 Apr 2016 21:34:18 +0000 (14:34 -0700)
Change-Id: I783de544ad9a3636ea90f1c8c4034738997bfbc8
Fixes: 28246085

core/jni/android_view_RenderNode.cpp
libs/hwui/TreeInfo.h
libs/hwui/renderthread/CanvasContext.cpp
libs/hwui/renderthread/CanvasContext.h

index 4459f32..d3e18ed 100644 (file)
@@ -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));
index a43e544..ac2bdcc 100644 (file)
@@ -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;
index 890d4a1..df5c8d9 100644 (file)
@@ -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<int64_t>(mNativeSurface->getNextFrameNumber());
-    }
-
     mAnimationContext->startFrame(info.mode);
     for (const sp<RenderNode>& 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<void()>&& 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<int64_t>(mNativeSurface->getNextFrameNumber());
+    }
+    return mFrameNumber;
+}
+
 } /* namespace renderthread */
 } /* namespace uirenderer */
 } /* namespace android */
index 52df3ab..e739b29 100644 (file)
@@ -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<void()>&& 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<SwapHistory, 3> mSwapHistory;
+    int64_t mFrameNumber = -1;
 
     bool mOpaque;
 #if HWUI_NEW_OPS