Commit 83481367 authored by Khushal Sagar's avatar Khushal Sagar Committed by Commit Bot

viz: Remove perfect cadence restriction for display frequency.

We enforce that the display frequency chosen must be in perfect cadence
with the video playback rate. This doesn't allow the display to run at
30Hz with videos updating at 24Hz. Remove this restriction and choose
the display frequency closest to the desired playback rate.

R=dalecurtis@chromium.org

Bug: 976583, 1069662
Change-Id: Icaaf87f4164c198b5b8ab6e900eaaaf21d229951
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2143534
Commit-Queue: Khushal <khushalsagar@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Auto-Submit: Khushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758061}
parent 94590fd0
...@@ -116,6 +116,11 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() { ...@@ -116,6 +116,11 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() {
} }
if (num_of_frame_sinks_with_fixed_interval < 2) { if (num_of_frame_sinks_with_fixed_interval < 2) {
TRACE_EVENT_INSTANT0(
"viz",
"FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded - not enough "
"frame sinks to toggle",
TRACE_EVENT_SCOPE_THREAD);
SetPreferredInterval(UnspecifiedFrameInterval()); SetPreferredInterval(UnspecifiedFrameInterval());
return; return;
} }
...@@ -136,25 +141,20 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() { ...@@ -136,25 +141,20 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() {
min_frame_sink_interval, min_frame_sink_interval,
client_->GetPreferredFrameIntervalForFrameSinkId(frame_sink_id)); client_->GetPreferredFrameIntervalForFrameSinkId(frame_sink_id));
} }
TRACE_EVENT_INSTANT1("viz",
"FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded",
TRACE_EVENT_SCOPE_THREAD, "min_frame_sink_interval",
min_frame_sink_interval.InMillisecondsF());
// If we don't have an explicit preference from the active frame sinks, then // If we don't have an explicit preference from the active frame sinks, then
// we use a 0 value for preferred frame interval to let the framework pick the // we use a 0 value for preferred frame interval to let the framework pick the
// ideal refresh rate. // ideal refresh rate.
base::TimeDelta new_preferred_interval = UnspecifiedFrameInterval(); base::TimeDelta new_preferred_interval = UnspecifiedFrameInterval();
if (min_frame_sink_interval != BeginFrameArgs::MinInterval()) { if (min_frame_sink_interval != BeginFrameArgs::MinInterval()) {
constexpr float kMaxIntervalDelta = 0.05;
for (auto supported_interval : supported_intervals_) { for (auto supported_interval : supported_intervals_) {
// We only use a supported interval if it is in perfect cadence with the // Pick the display interval which is closest to the preferred interval.
// desired interval. if ((min_frame_sink_interval - supported_interval).magnitude() <
float delta_int = 0; (min_frame_sink_interval - new_preferred_interval).magnitude()) {
float delta = std::modf(min_frame_sink_interval.InMicrosecondsF() /
supported_interval.InMicrosecondsF(),
&delta_int);
bool in_perfect_cadence =
delta < kMaxIntervalDelta || delta > (1 - kMaxIntervalDelta);
if (in_perfect_cadence && supported_interval > new_preferred_interval) {
// Make sure that we select the largest one in the
// |supported_intervals_| that meets the requirements
new_preferred_interval = supported_interval; new_preferred_interval = supported_interval;
} }
} }
...@@ -165,6 +165,10 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() { ...@@ -165,6 +165,10 @@ void FrameRateDecider::UpdatePreferredFrameIntervalIfNeeded() {
void FrameRateDecider::SetPreferredInterval( void FrameRateDecider::SetPreferredInterval(
base::TimeDelta new_preferred_interval) { base::TimeDelta new_preferred_interval) {
TRACE_EVENT_INSTANT1("viz", "FrameRateDecider::SetPreferredInterval",
TRACE_EVENT_SCOPE_THREAD, "new_preferred_interval",
new_preferred_interval.InMillisecondsF());
if (new_preferred_interval == last_computed_preferred_frame_interval_) { if (new_preferred_interval == last_computed_preferred_frame_interval_) {
num_of_frames_since_preferred_interval_changed_++; num_of_frames_since_preferred_interval_changed_++;
} else { } else {
......
...@@ -222,7 +222,7 @@ TEST_F(FrameRateDeciderTest, OptimalFrameSinkIntervelIsPicked) { ...@@ -222,7 +222,7 @@ TEST_F(FrameRateDeciderTest, OptimalFrameSinkIntervelIsPicked) {
FrameRateDecider::ScopedAggregate scope(frame_rate_decider_.get()); FrameRateDecider::ScopedAggregate scope(frame_rate_decider_.get());
frame_rate_decider_->OnSurfaceWillBeDrawn(surface1); frame_rate_decider_->OnSurfaceWillBeDrawn(surface1);
} }
EXPECT_EQ(display_interval_, FrameRateDecider::UnspecifiedFrameInterval()); EXPECT_EQ(display_interval_, min_supported_interval * 2);
UpdateFrame(surface2); UpdateFrame(surface2);
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment