OSDN Git Service

In SurfaceFlinger, test fence before merging
authorMatthew Bouyack <mbouyack@google.com>
Fri, 7 Oct 2016 22:06:15 +0000 (15:06 -0700)
committerMatthew Bouyack <mbouyack@google.com>
Mon, 17 Oct 2016 19:47:33 +0000 (12:47 -0700)
If the old fence for a given layer has already expired, we can replace
it with the new fence rather than merging the two.

This saves 300-400us per frame on Android Wear

Change-Id: I5d907c336c7383ae4e2e0f71e42f23749494a359

libs/gui/ConsumerBase.cpp

index e7bc7dc..65e4fee 100644 (file)
@@ -314,6 +314,18 @@ status_t ConsumerBase::addReleaseFenceLocked(int slot,
 
     if (!mSlots[slot].mFence.get()) {
         mSlots[slot].mFence = fence;
+        return OK;
+    }
+
+    auto signaled = mSlots[slot].mFence->hasSignaled();
+
+    if (!signaled) {
+        CB_LOGE("fence has invalid state");
+        return BAD_VALUE;
+    }
+
+    if (*signaled) {
+        mSlots[slot].mFence = fence;
     } else {
         char fenceName[32] = {};
         snprintf(fenceName, 32, "%.28s:%d", mName.string(), slot);