OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/test/fake_external_begin_frame_source.h" | 5 #include "cc/test/fake_external_begin_frame_source.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "cc/test/begin_frame_args_test.h" | 11 #include "cc/test/begin_frame_args_test.h" |
12 | 12 |
13 namespace cc { | 13 namespace cc { |
14 | 14 |
15 FakeExternalBeginFrameSource::FakeExternalBeginFrameSource(double refresh_rate) | 15 FakeExternalBeginFrameSource::FakeExternalBeginFrameSource(double refresh_rate) |
16 : milliseconds_per_frame_(1000.0 / refresh_rate), | 16 : milliseconds_per_frame_(1000.0 / refresh_rate), |
17 weak_ptr_factory_(this) { | 17 weak_ptr_factory_(this) { |
18 DetachFromThread(); | 18 DetachFromThread(); |
19 } | 19 } |
20 | 20 |
21 FakeExternalBeginFrameSource::~FakeExternalBeginFrameSource() { | 21 FakeExternalBeginFrameSource::~FakeExternalBeginFrameSource() { |
22 DCHECK(CalledOnValidThread()); | 22 DCHECK(CalledOnValidThread()); |
23 } | 23 } |
24 | 24 |
| 25 void FakeExternalBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs) { |
| 26 DCHECK(CalledOnValidThread()); |
| 27 // Send a MISSED begin frame if necessary. |
| 28 if (missed_begin_frame_args_.IsValid()) { |
| 29 BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
| 30 if (!last_args.IsValid() || |
| 31 (missed_begin_frame_args_.frame_time > last_args.frame_time)) { |
| 32 obs->OnBeginFrame(missed_begin_frame_args_); |
| 33 } |
| 34 } |
| 35 } |
| 36 |
25 void FakeExternalBeginFrameSource::OnNeedsBeginFramesChanged( | 37 void FakeExternalBeginFrameSource::OnNeedsBeginFramesChanged( |
26 bool needs_begin_frames) { | 38 bool needs_begin_frames) { |
27 DCHECK(CalledOnValidThread()); | 39 DCHECK(CalledOnValidThread()); |
28 if (needs_begin_frames) { | 40 if (needs_begin_frames) { |
29 PostTestOnBeginFrame(); | 41 PostTestOnBeginFrame(); |
30 } else { | 42 } else { |
31 begin_frame_task_.Cancel(); | 43 begin_frame_task_.Cancel(); |
32 } | 44 } |
33 } | 45 } |
34 | 46 |
35 void FakeExternalBeginFrameSource::TestOnBeginFrame() { | 47 void FakeExternalBeginFrameSource::TestOnBeginFrame() { |
36 DCHECK(CalledOnValidThread()); | 48 DCHECK(CalledOnValidThread()); |
37 CallOnBeginFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE)); | 49 BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); |
| 50 missed_begin_frame_args_ = args; |
| 51 missed_begin_frame_args_.type = BeginFrameArgs::MISSED; |
| 52 CallOnBeginFrame(args); |
38 PostTestOnBeginFrame(); | 53 PostTestOnBeginFrame(); |
39 } | 54 } |
40 | 55 |
41 void FakeExternalBeginFrameSource::PostTestOnBeginFrame() { | 56 void FakeExternalBeginFrameSource::PostTestOnBeginFrame() { |
42 begin_frame_task_.Reset( | 57 begin_frame_task_.Reset( |
43 base::Bind(&FakeExternalBeginFrameSource::TestOnBeginFrame, | 58 base::Bind(&FakeExternalBeginFrameSource::TestOnBeginFrame, |
44 weak_ptr_factory_.GetWeakPtr())); | 59 weak_ptr_factory_.GetWeakPtr())); |
45 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 60 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
46 FROM_HERE, begin_frame_task_.callback(), | 61 FROM_HERE, begin_frame_task_.callback(), |
47 base::TimeDelta::FromMilliseconds(milliseconds_per_frame_)); | 62 base::TimeDelta::FromMilliseconds(milliseconds_per_frame_)); |
48 } | 63 } |
49 | 64 |
50 } // namespace cc | 65 } // namespace cc |
OLD | NEW |