From fd4c8c38051f9dad028e4e43e0eb39ba412b2c0a Mon Sep 17 00:00:00 2001 From: Matthew Bouyack Date: Fri, 7 Oct 2016 14:26:47 -0700 Subject: [PATCH] Use snprintf for SurfaceFlinger fence name snprintf is significantly faster than String8::format This change saves ~50us per frame on Android Wear Change-Id: I6ac47c2434662ca561208daae232f02a9f136aaf --- include/ui/Fence.h | 3 +++ libs/gui/ConsumerBase.cpp | 5 +++-- libs/ui/Fence.cpp | 15 ++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/ui/Fence.h b/include/ui/Fence.h index b431bd52aa..23a8658f51 100644 --- a/include/ui/Fence.h +++ b/include/ui/Fence.h @@ -79,6 +79,9 @@ public: // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is // destroyed before it becomes signaled). The name argument specifies the // human-readable name to associated with the new Fence object. + static sp merge(const char* name, const sp& f1, + const sp& f2); + static sp merge(const String8& name, const sp& f1, const sp& f2); diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index a1bdf4a4a1..e7bc7dc73d 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -315,9 +315,10 @@ status_t ConsumerBase::addReleaseFenceLocked(int slot, if (!mSlots[slot].mFence.get()) { mSlots[slot].mFence = fence; } else { + char fenceName[32] = {}; + snprintf(fenceName, 32, "%.28s:%d", mName.string(), slot); sp mergedFence = Fence::merge( - String8::format("%.28s:%d", mName.string(), slot), - mSlots[slot].mFence, fence); + fenceName, mSlots[slot].mFence, fence); if (!mergedFence.get()) { CB_LOGE("failed to merge release fences"); // synchronization is broken, the best we can do is hope fences diff --git a/libs/ui/Fence.cpp b/libs/ui/Fence.cpp index bf24ffb7e0..7cf8233820 100644 --- a/libs/ui/Fence.cpp +++ b/libs/ui/Fence.cpp @@ -72,7 +72,7 @@ status_t Fence::waitForever(const char* logname) { return err < 0 ? -errno : status_t(NO_ERROR); } -sp Fence::merge(const String8& name, const sp& f1, +sp Fence::merge(const char* name, const sp& f1, const sp& f2) { ATRACE_CALL(); int result; @@ -80,24 +80,29 @@ sp Fence::merge(const String8& name, const sp& f1, // valid fence (e.g. NO_FENCE) we merge the one valid fence with itself so // that a new fence with the given name is created. if (f1->isValid() && f2->isValid()) { - result = sync_merge(name.string(), f1->mFenceFd, f2->mFenceFd); + result = sync_merge(name, f1->mFenceFd, f2->mFenceFd); } else if (f1->isValid()) { - result = sync_merge(name.string(), f1->mFenceFd, f1->mFenceFd); + result = sync_merge(name, f1->mFenceFd, f1->mFenceFd); } else if (f2->isValid()) { - result = sync_merge(name.string(), f2->mFenceFd, f2->mFenceFd); + result = sync_merge(name, f2->mFenceFd, f2->mFenceFd); } else { return NO_FENCE; } if (result == -1) { status_t err = -errno; ALOGE("merge: sync_merge(\"%s\", %d, %d) returned an error: %s (%d)", - name.string(), f1->mFenceFd, f2->mFenceFd, + name, f1->mFenceFd, f2->mFenceFd, strerror(-err), err); return NO_FENCE; } return sp(new Fence(result)); } +sp Fence::merge(const String8& name, const sp& f1, + const sp& f2) { + return merge(name.string(), f1, f2); +} + int Fence::dup() const { return ::dup(mFenceFd); } -- 2.11.0