From 377c2033750ad2a47e5c560f982a0242ea7dc79e Mon Sep 17 00:00:00 2001 From: Matthew Bouyack Date: Fri, 7 Oct 2016 15:06:15 -0700 Subject: In SurfaceFlinger, test fence before merging 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 | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'libs/gui/ConsumerBase.cpp') diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index e7bc7dc73d..65e4feefde 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -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); -- cgit v1.2.3-59-g8ed1b