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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 2061273002: cc: Make BackToBackBeginFrameSource a SyntheticBeginFrameSource. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: syntheticbeginframesource: delete-DEBUG_FRAMES Created 4 years, 6 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10 #include <unordered_set>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/android/jni_android.h" 13 #include "base/android/jni_android.h"
14 #include "base/android/scoped_java_ref.h" 14 #include "base/android/scoped_java_ref.h"
15 #include "base/auto_reset.h" 15 #include "base/auto_reset.h"
16 #include "base/bind.h" 16 #include "base/bind.h"
17 #include "base/cancelable_callback.h" 17 #include "base/cancelable_callback.h"
18 #include "base/command_line.h" 18 #include "base/command_line.h"
19 #include "base/containers/hash_tables.h" 19 #include "base/containers/hash_tables.h"
20 #include "base/lazy_instance.h" 20 #include "base/lazy_instance.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 namespace gpu { 74 namespace gpu {
75 struct GpuProcessHostedCALayerTreeParamsMac; 75 struct GpuProcessHostedCALayerTreeParamsMac;
76 } 76 }
77 77
78 namespace content { 78 namespace content {
79 79
80 namespace { 80 namespace {
81 81
82 const unsigned int kMaxDisplaySwapBuffers = 1U; 82 const unsigned int kMaxDisplaySwapBuffers = 1U;
83 83
84 class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, 84 class ExternalBeginFrameSource : public cc::BeginFrameSource,
85 public CompositorImpl::VSyncObserver { 85 public CompositorImpl::VSyncObserver {
86 public: 86 public:
87 ExternalBeginFrameSource(CompositorImpl* compositor) 87 explicit ExternalBeginFrameSource(CompositorImpl* compositor)
88 : compositor_(compositor) { 88 : compositor_(compositor) {
89 compositor_->AddObserver(this); 89 compositor_->AddObserver(this);
90 } 90 }
91
92 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } 91 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); }
93 92
94 // cc::BeginFrameSourceBase implementation: 93 // cc::BeginFrameSource implementation.
95 void AddObserver(cc::BeginFrameObserver* obs) override { 94 void AddObserver(cc::BeginFrameObserver* obs) override;
96 cc::BeginFrameSourceBase::AddObserver(obs); 95 void RemoveObserver(cc::BeginFrameObserver* obs) override;
97 DCHECK(needs_begin_frames()); 96 void DidFinishFrame(cc::BeginFrameObserver* obs,
98 if (!last_begin_frame_args_.IsValid()) 97 size_t remaining_frames) override {}
99 return;
100 98
99 // CompositorImpl::VSyncObserver implementation.
100 void OnVSync(base::TimeTicks frame_time,
101 base::TimeDelta vsync_period) override;
102
103 private:
104 CompositorImpl* const compositor_;
105 std::unordered_set<cc::BeginFrameObserver*> observers_;
106 cc::BeginFrameArgs last_begin_frame_args_;
107 };
108
109 void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) {
110 DCHECK(obs);
111 DCHECK(observers_.find(obs) == observers_.end());
112
113 observers_.insert(obs);
114 obs->OnBeginFrameSourcePausedChanged(false);
115 compositor_->OnNeedsBeginFramesChange(true);
116
117 if (last_begin_frame_args_.IsValid()) {
101 // Send a MISSED begin frame if necessary. 118 // Send a MISSED begin frame if necessary.
102 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); 119 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
103 if (!last_args.IsValid() || 120 if (!last_args.IsValid() ||
104 (last_begin_frame_args_.frame_time > last_args.frame_time)) { 121 (last_begin_frame_args_.frame_time > last_args.frame_time)) {
105 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; 122 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
106 // TODO(crbug.com/602485): A deadline doesn't make too much sense 123 // TODO(crbug.com/602485): A deadline doesn't make too much sense
107 // for a missed BeginFrame (the intention rather is 'immediately'), 124 // for a missed BeginFrame (the intention rather is 'immediately'),
108 // but currently the retro frame logic is very strict in discarding 125 // but currently the retro frame logic is very strict in discarding
109 // BeginFrames. 126 // BeginFrames.
110 last_begin_frame_args_.deadline = 127 last_begin_frame_args_.deadline =
111 base::TimeTicks::Now() + last_begin_frame_args_.interval; 128 base::TimeTicks::Now() + last_begin_frame_args_.interval;
112 obs->OnBeginFrame(last_begin_frame_args_); 129 obs->OnBeginFrame(last_begin_frame_args_);
113 } 130 }
114 } 131 }
132 }
115 133
116 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { 134 void ExternalBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) {
117 TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", 135 DCHECK(obs);
118 "needs_begin_frames", needs_begin_frames); 136 DCHECK(observers_.find(obs) != observers_.end());
119 compositor_->OnNeedsBeginFramesChange(needs_begin_frames);
120 }
121 137
122 // CompositorImpl::VSyncObserver implementation: 138 observers_.erase(obs);
123 void OnVSync(base::TimeTicks frame_time, 139 if (observers_.empty())
124 base::TimeDelta vsync_period) override { 140 compositor_->OnNeedsBeginFramesChange(false);
125 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); 141 }
126 last_begin_frame_args_ =
127 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
128 vsync_period, cc::BeginFrameArgs::NORMAL);
129 CallOnBeginFrame(last_begin_frame_args_);
130 }
131 142
132 private: 143 void ExternalBeginFrameSource::OnVSync(base::TimeTicks frame_time,
133 CompositorImpl* compositor_; 144 base::TimeDelta vsync_period) {
134 cc::BeginFrameArgs last_begin_frame_args_; 145 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time);
135 }; 146 last_begin_frame_args_ =
147 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
148 vsync_period, cc::BeginFrameArgs::NORMAL);
149 std::unordered_set<cc::BeginFrameObserver*> observers(observers_);
150 for (auto* obs : observers)
151 obs->OnBeginFrame(last_begin_frame_args_);
152 }
136 153
137 // Used to override capabilities_.adjust_deadline_for_parent to false 154 // Used to override capabilities_.adjust_deadline_for_parent to false
138 class OutputSurfaceWithoutParent : public cc::OutputSurface, 155 class OutputSurfaceWithoutParent : public cc::OutputSurface,
139 public CompositorImpl::VSyncObserver { 156 public CompositorImpl::VSyncObserver {
140 public: 157 public:
141 OutputSurfaceWithoutParent( 158 OutputSurfaceWithoutParent(
142 CompositorImpl* compositor, 159 CompositorImpl* compositor,
143 scoped_refptr<ContextProviderCommandBuffer> context_provider, 160 scoped_refptr<ContextProviderCommandBuffer> context_provider,
144 const base::Callback<void(gpu::Capabilities)>& 161 const base::Callback<void(gpu::Capabilities)>&
145 populate_gpu_capabilities_callback, 162 populate_gpu_capabilities_callback,
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 void CompositorImpl::SetNeedsAnimate() { 816 void CompositorImpl::SetNeedsAnimate() {
800 needs_animate_ = true; 817 needs_animate_ = true;
801 if (!host_->visible()) 818 if (!host_->visible())
802 return; 819 return;
803 820
804 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); 821 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate");
805 host_->SetNeedsAnimate(); 822 host_->SetNeedsAnimate();
806 } 823 }
807 824
808 } // namespace content 825 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698