Make getFrameNumber lazy
Change-Id: I783de544ad9a3636ea90f1c8c4034738997bfbc8
Fixes: 28246085
diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h
index a43e544..ac2bdcc 100644
--- a/libs/hwui/TreeInfo.h
+++ b/libs/hwui/TreeInfo.h
@@ -102,8 +102,6 @@
// 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 890d4a1..df5c8d9 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -108,6 +108,8 @@
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 @@
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 @@
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 @@
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 */
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 52df3abe..e739b29 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -166,6 +166,8 @@
// 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 @@
};
RingBuffer<SwapHistory, 3> mSwapHistory;
+ int64_t mFrameNumber = -1;
bool mOpaque;
#if HWUI_NEW_OPS