Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(757)

Side by Side Diff: content/browser/compositor/gpu_vsync_begin_frame_source.cc

Issue 2555173003: [Do not submit] D3DKMTWaitForVerticalBlankEvent VSync prototype (Closed)
Patch Set: Added command line switch and experiment support Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/compositor/gpu_vsync_begin_frame_source.h"
6
7 namespace content {
8
9 GpuVSyncBeginFrameSource::GpuVSyncBeginFrameSource(
10 GpuVSyncControl* vsync_control)
11 : vsync_control_(vsync_control),
12 enabled_(false),
13 next_sequence_number_(cc::BeginFrameArgs::kStartingFrameNumber) {
14 DCHECK(vsync_control);
15 }
16
17 GpuVSyncBeginFrameSource::~GpuVSyncBeginFrameSource() = default;
18
19 void GpuVSyncBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) {
20 DCHECK(obs);
21 DCHECK(observers_.find(obs) == observers_.end());
22
23 obs->OnBeginFrameSourcePausedChanged(false);
24
25 bool observers_was_empty = observers_.empty();
26 observers_.insert(obs);
27 if (observers_was_empty)
28 EnableVSync(true);
29
30 // Send a MISSED begin frame if necessary.
31 if (previous_begin_frame_args_.IsValid()) {
32 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
33 if (!last_args.IsValid() ||
34 (previous_begin_frame_args_.frame_time > last_args.frame_time)) {
35 DCHECK((previous_begin_frame_args_.source_id != last_args.source_id) ||
36 (previous_begin_frame_args_.sequence_number >
37 last_args.sequence_number));
38
39 previous_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
40 OnBeginFrame(obs, previous_begin_frame_args_);
41 }
42 }
43 }
44
45 void GpuVSyncBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) {
46 DCHECK(obs);
47 DCHECK(observers_.find(obs) != observers_.end());
48
49 observers_.erase(obs);
50 if (observers_.empty()) {
51 previous_begin_frame_args_ = cc::BeginFrameArgs();
52 EnableVSync(false);
53 }
54 }
55
56 void GpuVSyncBeginFrameSource::DidFinishFrame(cc::BeginFrameObserver* obs,
57 const cc::BeginFrameAck& ack) {}
58
59 bool GpuVSyncBeginFrameSource::IsThrottled() const {
60 return true;
61 }
62
63 void GpuVSyncBeginFrameSource::OnUpdateVSyncParameters(
64 base::TimeTicks timebase,
65 base::TimeDelta interval) {
66 if (!enabled_)
67 return;
68
69 base::TimeTicks now = base::TimeTicks::Now();
70 base::TimeTicks deadline = now.SnappedToNextTick(timebase, interval);
71
72 TRACE_EVENT1("cc", "GpuVSyncBeginFrameSource::OnUpdateVSyncParameters",
73 "vsync_delay", (now - timebase).ToInternalValue());
74
75 next_sequence_number_++;
76 OnBeginFrame(cc::BeginFrameArgs::Create(
77 BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, timebase,
78 deadline, interval, cc::BeginFrameArgs::NORMAL));
79 }
80
81 void GpuVSyncBeginFrameSource::SetAuthoritativeVSyncInterval(
82 base::TimeDelta interval) {
83 NOTREACHED();
84 }
85
86 void GpuVSyncBeginFrameSource::OnBeginFrame(const cc::BeginFrameArgs& args) {
87 previous_begin_frame_args_ = args;
88 std::unordered_set<cc::BeginFrameObserver*> observers(observers_);
89 for (auto* obs : observers)
90 OnBeginFrame(obs, args);
91 }
92
93 /* static */
94 void GpuVSyncBeginFrameSource::OnBeginFrame(cc::BeginFrameObserver* obs,
95 const cc::BeginFrameArgs& args) {
96 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
97
98 if (last_args.IsValid()) {
99 base::TimeDelta delta = args.frame_time - last_args.frame_time;
100 if (delta < args.interval / 2.0) {
stanisc 2017/01/12 00:52:50 TODO: this needs logic similar to DelayBasedBeginF
101 TRACE_EVENT1("cc", "GpuVSyncBeginFrameSource::OnBeginFrame", "delta",
102 delta.ToInternalValue());
103 }
104 }
105
106 obs->OnBeginFrame(args);
107 }
108
109 void GpuVSyncBeginFrameSource::EnableVSync(bool enabled) {
110 enabled_ = enabled;
111 vsync_control_->EnableVSync(enabled);
112 }
113
114 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698