Loading libs/hwui/JankTracker.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ #include "JankTracker.h" #include "Properties.h" #include <algorithm> #include <cutils/ashmem.h> #include <cutils/log.h> Loading Loading @@ -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) { Loading Loading @@ -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. Loading Loading @@ -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, Loading @@ -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) { Loading libs/hwui/Properties.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -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',}; Loading Loading @@ -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); Loading libs/hwui/Properties.h +6 −0 Original line number Diff line number Diff line Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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; Loading Loading
libs/hwui/JankTracker.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ #include "JankTracker.h" #include "Properties.h" #include <algorithm> #include <cutils/ashmem.h> #include <cutils/log.h> Loading Loading @@ -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) { Loading Loading @@ -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. Loading Loading @@ -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, Loading @@ -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) { Loading
libs/hwui/Properties.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -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',}; Loading Loading @@ -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); Loading
libs/hwui/Properties.h +6 −0 Original line number Diff line number Diff line Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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; Loading