OSDN Git Service

Wait on frame work fences when frames are dropped
authorChris Craik <ccraik@google.com>
Thu, 1 Sep 2016 00:32:46 +0000 (17:32 -0700)
committerChris Craik <ccraik@google.com>
Thu, 1 Sep 2016 00:32:47 +0000 (17:32 -0700)
bug:30895941

Prevents a race where frame work could interleave between frames,
causing SurfaceView position updates to be delivered out of order.

Change-Id: I01e4cc557b69dcf33e877a0e16c0d115ec95e4cc

libs/hwui/renderthread/CanvasContext.cpp
libs/hwui/renderthread/CanvasContext.h
libs/hwui/renderthread/DrawFrameTask.cpp

index dcaec42..70b9a43 100644 (file)
@@ -633,6 +633,9 @@ void CanvasContext::prepareAndDraw(RenderNode* node) {
     prepareTree(info, frameInfo, systemTime(CLOCK_MONOTONIC), node);
     if (info.out.canDrawThisFrame) {
         draw();
+    } else {
+        // wait on fences so tasks don't overlap next frame
+        waitOnFences();
     }
 }
 
index 3eef29b..e182175 100644 (file)
@@ -168,6 +168,8 @@ public:
 
     ANDROID_API int64_t getFrameNumber();
 
+    void waitOnFences();
+
 private:
     friend class RegisterFrameCallbackTask;
     // TODO: Replace with something better for layer & other GL object
@@ -178,8 +180,6 @@ private:
 
     void freePrefetchedLayers(TreeObserver* observer);
 
-    void waitOnFences();
-
     bool isSwapChainStuffed();
 
     EGLint mLastFrameWidth = 0;
index c9c07b3..e3b6dc6 100644 (file)
@@ -104,6 +104,9 @@ void DrawFrameTask::run() {
 
     if (CC_LIKELY(canDrawThisFrame)) {
         context->draw();
+    } else {
+        // wait on fences so tasks don't overlap next frame
+        context->waitOnFences();
     }
 
     if (!canUnblockUiThread) {