diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index 76e587e162b64..47d01088f6f74 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -15,6 +15,8 @@ */ #include "JankTracker.h" +#include "Properties.h" + #include #include #include @@ -77,6 +79,11 @@ static const uint32_t kBucket2msIntervals = 32; // If a frame is > this, start counting in increments of 4ms static const uint32_t kBucket4msIntervals = 48; +// For testing purposes to try and eliminate test infra overhead we will +// consider any unknown delay of frame start as part of the test infrastructure +// and filter it out of the frame profile data +static FrameInfoIndex sFrameStart = FrameInfoIndex::IntendedVsync; + // This will be called every frame, performance sensitive // Uses bit twiddling to avoid branching while achieving the packing desired static uint32_t frameCountIndexForFrameTime(nsecs_t frameTime, uint32_t max) { @@ -242,7 +249,7 @@ void JankTracker::addFrame(const FrameInfo& frame) { mData->totalFrameCount++; // Fast-path for jank-free frames int64_t totalDuration = - frame[FrameInfoIndex::FrameCompleted] - frame[FrameInfoIndex::IntendedVsync]; + frame[FrameInfoIndex::FrameCompleted] - frame[sFrameStart]; uint32_t framebucket = frameCountIndexForFrameTime( totalDuration, mData->frameCounts.size() - 1); // Keep the fast path as fast as possible. @@ -280,6 +287,9 @@ void JankTracker::dumpBuffer(const void* buffer, size_t bufsize, int fd) { } void JankTracker::dumpData(const ProfileData* data, int fd) { + if (sFrameStart != FrameInfoIndex::IntendedVsync) { + dprintf(fd, "\nNote: Data has been filtered!"); + } dprintf(fd, "\nStats since: %" PRIu64 "ns", data->statStartTime); dprintf(fd, "\nTotal frames rendered: %u", data->totalFrameCount); dprintf(fd, "\nJanky frames: %u (%.2f%%)", data->jankFrameCount, @@ -305,6 +315,9 @@ void JankTracker::reset() { mData->totalFrameCount = 0; mData->jankFrameCount = 0; mData->statStartTime = systemTime(CLOCK_MONOTONIC); + sFrameStart = Properties::filterOutTestOverhead + ? FrameInfoIndex::HandleInputStart + : FrameInfoIndex::IntendedVsync; } uint32_t JankTracker::findPercentile(const ProfileData* data, int percentile) { diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index bbd8c7226ab22..6f68c2bdff802 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -66,6 +66,8 @@ bool Properties::sDisableProfileBars = false; bool Properties::waitForGpuCompletion = false; +bool Properties::filterOutTestOverhead = false; + static int property_get_int(const char* key, int defaultValue) { char buf[PROPERTY_VALUE_MAX] = {'\0',}; @@ -156,6 +158,8 @@ bool Properties::load() { textureCacheFlushRate = std::max(0.0f, std::min(1.0f, property_get_float(PROPERTY_TEXTURE_CACHE_FLUSH_RATE, DEFAULT_TEXTURE_CACHE_FLUSH_RATE))); + filterOutTestOverhead = property_get_bool(PROPERTY_FILTER_TEST_OVERHEAD, false); + return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw) || (prevDebugStencilClip != debugStencilClip); diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 249b5b07fa118..171873de1f9ab 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -151,6 +151,8 @@ enum DebugLevel { */ #define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.enable_partial_updates" +#define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead" + /////////////////////////////////////////////////////////////////////////////// // Runtime configuration properties /////////////////////////////////////////////////////////////////////////////// @@ -294,6 +296,10 @@ public: // Should be used only by test apps static bool waitForGpuCompletion; + // Should only be set by automated tests to try and filter out + // any overhead they add + static bool filterOutTestOverhead; + private: static ProfileType sProfileType; static bool sDisableProfileBars;