SF: trace the render rate of an app
Add a trace point for both SF and apps when the render rate
is overridden.
Bug: 347314033
Test: manual
Change-Id: I87dc9b17a4c1f97fa43b025cfa684f43c20c5a25
diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp
index 2547297..9ef0eac 100644
--- a/libs/gui/Android.bp
+++ b/libs/gui/Android.bp
@@ -41,6 +41,11 @@
aconfig_declarations: "libgui_flags",
}
+cc_aconfig_library {
+ name: "libguiflags_no_apex",
+ aconfig_declarations: "libgui_flags",
+}
+
cc_library_headers {
name: "libgui_headers",
vendor_available: true,
diff --git a/libs/gui/DisplayEventDispatcher.cpp b/libs/gui/DisplayEventDispatcher.cpp
index f3de96d..c46f9c5 100644
--- a/libs/gui/DisplayEventDispatcher.cpp
+++ b/libs/gui/DisplayEventDispatcher.cpp
@@ -15,6 +15,7 @@
*/
#define LOG_TAG "DisplayEventDispatcher"
+#define ATRACE_TAG ATRACE_TAG_GRAPHICS
#include <cinttypes>
#include <cstdint>
@@ -23,10 +24,13 @@
#include <gui/DisplayEventReceiver.h>
#include <utils/Log.h>
#include <utils/Looper.h>
-
#include <utils/Timers.h>
+#include <utils/Trace.h>
+
+#include <com_android_graphics_libgui_flags.h>
namespace android {
+using namespace com::android::graphics::libgui;
// Number of events to read at a time from the DisplayEventDispatcher pipe.
// The value should be large enough that we can quickly drain the pipe
@@ -171,6 +175,13 @@
*outDisplayId = ev.header.displayId;
*outCount = ev.vsync.count;
*outVsyncEventData = ev.vsync.vsyncData;
+
+ // Trace the RenderRate for this app
+ if (ATRACE_ENABLED() && flags::trace_frame_rate_override()) {
+ const auto frameInterval = ev.vsync.vsyncData.frameInterval;
+ int fps = frameInterval > 0 ? 1e9f / frameInterval : 0;
+ ATRACE_INT("RenderRate", fps);
+ }
break;
case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG:
if (ev.hotplug.connectionError == 0) {
diff --git a/libs/gui/libgui_flags.aconfig b/libs/gui/libgui_flags.aconfig
index a902a8c..792966f 100644
--- a/libs/gui/libgui_flags.aconfig
+++ b/libs/gui/libgui_flags.aconfig
@@ -7,7 +7,7 @@
description: "This flag controls plumbing setFrameRate thru BufferQueue"
bug: "281695725"
is_fixed_read_only: true
-}
+} # bq_setframerate
flag {
name: "frametimestamps_previousrelease"
@@ -15,7 +15,7 @@
description: "Controls a fence fixup for timestamp apis"
bug: "310927247"
is_fixed_read_only: true
-}
+} # frametimestamps_previousrelease
flag {
name: "bq_extendedallocate"
@@ -23,4 +23,15 @@
description: "Add BQ support for allocate with extended options"
bug: "268382490"
is_fixed_read_only: true
-}
+} # bq_extendedallocate
+
+flag {
+ name: "trace_frame_rate_override"
+ namespace: "core_graphics"
+ description: "Trace FrameRateOverride fps"
+ bug: "347314033"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+} # trace_frame_rate_override
diff --git a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp
index 2c66492..846727b 100644
--- a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp
+++ b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp
@@ -1066,6 +1066,11 @@
ALOGV("%s: overriding to %s for uid=%d", __func__, to_string(overrideFps).c_str(), uid);
ATRACE_FORMAT_INSTANT("%s: overriding to %s for uid=%d", __func__,
to_string(overrideFps).c_str(), uid);
+ if (ATRACE_ENABLED() && FlagManager::getInstance().trace_frame_rate_override()) {
+ std::stringstream ss;
+ ss << "FrameRateOverride " << uid;
+ ATRACE_INT(ss.str().c_str(), overrideFps.getIntValue());
+ }
frameRateOverrides.emplace(uid, overrideFps);
}
diff --git a/services/surfaceflinger/common/Android.bp b/services/surfaceflinger/common/Android.bp
index c3594bc..bcf1886 100644
--- a/services/surfaceflinger/common/Android.bp
+++ b/services/surfaceflinger/common/Android.bp
@@ -38,6 +38,7 @@
"libsurfaceflingerflags",
"android.os.flags-aconfig-cc",
"android.server.display.flags-aconfig-cc",
+ "libguiflags_no_apex",
],
}
@@ -50,6 +51,7 @@
"libsurfaceflingerflags_test",
"android.os.flags-aconfig-cc-test",
"android.server.display.flags-aconfig-cc",
+ "libguiflags_no_apex",
],
}
@@ -64,6 +66,7 @@
"libsurfaceflingerflags",
"android.os.flags-aconfig-cc",
"android.server.display.flags-aconfig-cc",
+ "libguiflags_no_apex",
],
}
@@ -78,5 +81,6 @@
"libsurfaceflingerflags_test",
"android.os.flags-aconfig-cc-test",
"android.server.display.flags-aconfig-cc",
+ "libguiflags_no_apex",
],
}
diff --git a/services/surfaceflinger/common/FlagManager.cpp b/services/surfaceflinger/common/FlagManager.cpp
index 4216771..2e3273c 100644
--- a/services/surfaceflinger/common/FlagManager.cpp
+++ b/services/surfaceflinger/common/FlagManager.cpp
@@ -27,6 +27,7 @@
#include <cinttypes>
#include <android_os.h>
+#include <com_android_graphics_libgui_flags.h>
#include <com_android_graphics_surfaceflinger_flags.h>
#include <com_android_server_display_feature_flags.h>
@@ -151,6 +152,7 @@
DUMP_READ_ONLY_FLAG(flush_buffer_slots_to_uncache);
DUMP_READ_ONLY_FLAG(force_compile_graphite_renderengine);
DUMP_READ_ONLY_FLAG(single_hop_screenshot);
+ DUMP_READ_ONLY_FLAG(trace_frame_rate_override);
#undef DUMP_READ_ONLY_FLAG
#undef DUMP_SERVER_FLAG
@@ -264,5 +266,7 @@
FLAG_MANAGER_READ_ONLY_FLAG_IMPORTED(idle_screen_refresh_rate_timeout, "",
com::android::server::display::feature::flags)
FLAG_MANAGER_READ_ONLY_FLAG_IMPORTED(adpf_use_fmq_channel_fixed, "", android::os)
+FLAG_MANAGER_READ_ONLY_FLAG_IMPORTED(trace_frame_rate_override, "",
+ com::android::graphics::libgui::flags);
} // namespace android
diff --git a/services/surfaceflinger/common/include/common/FlagManager.h b/services/surfaceflinger/common/include/common/FlagManager.h
index 22118ab..ab7a474 100644
--- a/services/surfaceflinger/common/include/common/FlagManager.h
+++ b/services/surfaceflinger/common/include/common/FlagManager.h
@@ -90,6 +90,7 @@
bool flush_buffer_slots_to_uncache() const;
bool force_compile_graphite_renderengine() const;
bool single_hop_screenshot() const;
+ bool trace_frame_rate_override() const;
protected:
// overridden for unit tests