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

Side by Side Diff: cc/output/output_surface.cc

Issue 23498035: cc: Always use SetNeedsBeginFrame to request the next BeginFrame (Closed) Base URL: http://git.chromium.org/chromium/src.git@epenner23495022
Patch Set: Created 7 years, 3 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/output/output_surface.h" 5 #include "cc/output/output_surface.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 21 matching lines...) Expand all
32 32
33 OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider) 33 OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
34 : context_provider_(context_provider), 34 : context_provider_(context_provider),
35 has_gl_discard_backbuffer_(false), 35 has_gl_discard_backbuffer_(false),
36 has_swap_buffers_complete_callback_(false), 36 has_swap_buffers_complete_callback_(false),
37 device_scale_factor_(-1), 37 device_scale_factor_(-1),
38 weak_ptr_factory_(this), 38 weak_ptr_factory_(this),
39 max_frames_pending_(0), 39 max_frames_pending_(0),
40 pending_swap_buffers_(0), 40 pending_swap_buffers_(0),
41 needs_begin_frame_(false), 41 needs_begin_frame_(false),
42 begin_frame_pending_(false), 42 client_ready_for_begin_frame_(true),
43 client_(NULL), 43 client_(NULL),
44 check_for_retroactive_begin_frame_pending_(false), 44 check_for_retroactive_begin_frame_pending_(false),
45 external_stencil_test_enabled_(false) {} 45 external_stencil_test_enabled_(false) {}
46 46
47 OutputSurface::OutputSurface( 47 OutputSurface::OutputSurface(
48 scoped_ptr<cc::SoftwareOutputDevice> software_device) 48 scoped_ptr<cc::SoftwareOutputDevice> software_device)
49 : software_device_(software_device.Pass()), 49 : software_device_(software_device.Pass()),
50 has_gl_discard_backbuffer_(false), 50 has_gl_discard_backbuffer_(false),
51 has_swap_buffers_complete_callback_(false), 51 has_swap_buffers_complete_callback_(false),
52 device_scale_factor_(-1), 52 device_scale_factor_(-1),
53 weak_ptr_factory_(this), 53 weak_ptr_factory_(this),
54 max_frames_pending_(0), 54 max_frames_pending_(0),
55 pending_swap_buffers_(0), 55 pending_swap_buffers_(0),
56 needs_begin_frame_(false), 56 needs_begin_frame_(false),
57 begin_frame_pending_(false), 57 client_ready_for_begin_frame_(true),
58 client_(NULL), 58 client_(NULL),
59 check_for_retroactive_begin_frame_pending_(false), 59 check_for_retroactive_begin_frame_pending_(false),
60 external_stencil_test_enabled_(false) {} 60 external_stencil_test_enabled_(false) {}
61 61
62 OutputSurface::OutputSurface( 62 OutputSurface::OutputSurface(
63 scoped_refptr<ContextProvider> context_provider, 63 scoped_refptr<ContextProvider> context_provider,
64 scoped_ptr<cc::SoftwareOutputDevice> software_device) 64 scoped_ptr<cc::SoftwareOutputDevice> software_device)
65 : context_provider_(context_provider), 65 : context_provider_(context_provider),
66 software_device_(software_device.Pass()), 66 software_device_(software_device.Pass()),
67 has_gl_discard_backbuffer_(false), 67 has_gl_discard_backbuffer_(false),
68 has_swap_buffers_complete_callback_(false), 68 has_swap_buffers_complete_callback_(false),
69 device_scale_factor_(-1), 69 device_scale_factor_(-1),
70 weak_ptr_factory_(this), 70 weak_ptr_factory_(this),
71 max_frames_pending_(0), 71 max_frames_pending_(0),
72 pending_swap_buffers_(0), 72 pending_swap_buffers_(0),
73 needs_begin_frame_(false), 73 needs_begin_frame_(false),
74 begin_frame_pending_(false), 74 client_ready_for_begin_frame_(true),
75 client_(NULL), 75 client_(NULL),
76 check_for_retroactive_begin_frame_pending_(false), 76 check_for_retroactive_begin_frame_pending_(false),
77 external_stencil_test_enabled_(false) {} 77 external_stencil_test_enabled_(false) {}
78 78
79 void OutputSurface::InitializeBeginFrameEmulation( 79 void OutputSurface::InitializeBeginFrameEmulation(
80 base::SingleThreadTaskRunner* task_runner, 80 base::SingleThreadTaskRunner* task_runner,
81 bool throttle_frame_production, 81 bool throttle_frame_production,
82 base::TimeDelta interval) { 82 base::TimeDelta interval) {
83 if (throttle_frame_production) { 83 if (throttle_frame_production) {
84 frame_rate_controller_.reset( 84 frame_rate_controller_.reset(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 126
127 // Forwarded to OutputSurfaceClient 127 // Forwarded to OutputSurfaceClient
128 void OutputSurface::SetNeedsRedrawRect(gfx::Rect damage_rect) { 128 void OutputSurface::SetNeedsRedrawRect(gfx::Rect damage_rect) {
129 TRACE_EVENT0("cc", "OutputSurface::SetNeedsRedrawRect"); 129 TRACE_EVENT0("cc", "OutputSurface::SetNeedsRedrawRect");
130 client_->SetNeedsRedrawRect(damage_rect); 130 client_->SetNeedsRedrawRect(damage_rect);
131 } 131 }
132 132
133 void OutputSurface::SetNeedsBeginFrame(bool enable) { 133 void OutputSurface::SetNeedsBeginFrame(bool enable) {
134 TRACE_EVENT1("cc", "OutputSurface::SetNeedsBeginFrame", "enable", enable); 134 TRACE_EVENT1("cc", "OutputSurface::SetNeedsBeginFrame", "enable", enable);
135 needs_begin_frame_ = enable; 135 needs_begin_frame_ = enable;
136 begin_frame_pending_ = false; 136 client_ready_for_begin_frame_ = true;
137 if (frame_rate_controller_) { 137 if (frame_rate_controller_) {
138 BeginFrameArgs skipped = frame_rate_controller_->SetActive(enable); 138 BeginFrameArgs skipped = frame_rate_controller_->SetActive(enable);
139 if (skipped.IsValid()) 139 if (skipped.IsValid())
140 skipped_begin_frame_args_ = skipped; 140 skipped_begin_frame_args_ = skipped;
141 } 141 }
142 if (needs_begin_frame_) 142 if (needs_begin_frame_)
143 PostCheckForRetroactiveBeginFrame(); 143 PostCheckForRetroactiveBeginFrame();
144 } 144 }
145 145
146 void OutputSurface::BeginFrame(const BeginFrameArgs& args) { 146 void OutputSurface::BeginFrame(const BeginFrameArgs& args) {
147 TRACE_EVENT2("cc", "OutputSurface::BeginFrame", 147 TRACE_EVENT2("cc", "OutputSurface::BeginFrame",
148 "begin_frame_pending_", begin_frame_pending_, 148 "client_ready_for_begin_frame_", client_ready_for_begin_frame_,
149 "pending_swap_buffers_", pending_swap_buffers_); 149 "pending_swap_buffers_", pending_swap_buffers_);
150 if (!needs_begin_frame_ || begin_frame_pending_ || 150 if (!needs_begin_frame_ || !client_ready_for_begin_frame_ ||
151 (pending_swap_buffers_ >= max_frames_pending_ && 151 (pending_swap_buffers_ >= max_frames_pending_ &&
152 max_frames_pending_ > 0)) { 152 max_frames_pending_ > 0)) {
153 skipped_begin_frame_args_ = args; 153 skipped_begin_frame_args_ = args;
154 } else { 154 } else {
155 begin_frame_pending_ = true; 155 client_ready_for_begin_frame_ = false;
156 client_->BeginFrame(args); 156 client_->BeginFrame(args);
157 // args might be an alias for skipped_begin_frame_args_. 157 // args might be an alias for skipped_begin_frame_args_.
158 // Do not reset it before calling BeginFrame! 158 // Do not reset it before calling BeginFrame!
159 skipped_begin_frame_args_ = BeginFrameArgs(); 159 skipped_begin_frame_args_ = BeginFrameArgs();
160 } 160 }
161 } 161 }
162 162
163 base::TimeDelta OutputSurface::AlternateRetroactiveBeginFramePeriod() { 163 base::TimeDelta OutputSurface::AlternateRetroactiveBeginFramePeriod() {
164 return BeginFrameArgs::DefaultRetroactiveBeginFramePeriod(); 164 return BeginFrameArgs::DefaultRetroactiveBeginFramePeriod();
165 } 165 }
(...skipping 19 matching lines...) Expand all
185 base::TimeTicks alternative_deadline = 185 base::TimeTicks alternative_deadline =
186 skipped_begin_frame_args_.frame_time + 186 skipped_begin_frame_args_.frame_time +
187 AlternateRetroactiveBeginFramePeriod(); 187 AlternateRetroactiveBeginFramePeriod();
188 if (now < skipped_begin_frame_args_.deadline || 188 if (now < skipped_begin_frame_args_.deadline ||
189 now < alternative_deadline) { 189 now < alternative_deadline) {
190 BeginFrame(skipped_begin_frame_args_); 190 BeginFrame(skipped_begin_frame_args_);
191 } 191 }
192 } 192 }
193 193
194 void OutputSurface::DidSwapBuffers() { 194 void OutputSurface::DidSwapBuffers() {
195 begin_frame_pending_ = false;
196 pending_swap_buffers_++; 195 pending_swap_buffers_++;
197 TRACE_EVENT1("cc", "OutputSurface::DidSwapBuffers", 196 TRACE_EVENT1("cc", "OutputSurface::DidSwapBuffers",
198 "pending_swap_buffers_", pending_swap_buffers_); 197 "pending_swap_buffers_", pending_swap_buffers_);
199 if (frame_rate_controller_) 198 if (frame_rate_controller_)
200 frame_rate_controller_->DidSwapBuffers(); 199 frame_rate_controller_->DidSwapBuffers();
201 PostCheckForRetroactiveBeginFrame(); 200 PostCheckForRetroactiveBeginFrame();
202 } 201 }
203 202
204 void OutputSurface::OnSwapBuffersComplete(const CompositorFrameAck* ack) { 203 void OutputSurface::OnSwapBuffersComplete(const CompositorFrameAck* ack) {
205 pending_swap_buffers_--; 204 pending_swap_buffers_--;
206 TRACE_EVENT1("cc", "OutputSurface::OnSwapBuffersComplete", 205 TRACE_EVENT1("cc", "OutputSurface::OnSwapBuffersComplete",
207 "pending_swap_buffers_", pending_swap_buffers_); 206 "pending_swap_buffers_", pending_swap_buffers_);
208 client_->OnSwapBuffersComplete(ack); 207 client_->OnSwapBuffersComplete(ack);
209 if (frame_rate_controller_) 208 if (frame_rate_controller_)
210 frame_rate_controller_->DidSwapBuffersComplete(); 209 frame_rate_controller_->DidSwapBuffersComplete();
211 PostCheckForRetroactiveBeginFrame(); 210 PostCheckForRetroactiveBeginFrame();
212 } 211 }
213 212
214 void OutputSurface::DidLoseOutputSurface() { 213 void OutputSurface::DidLoseOutputSurface() {
215 TRACE_EVENT0("cc", "OutputSurface::DidLoseOutputSurface"); 214 TRACE_EVENT0("cc", "OutputSurface::DidLoseOutputSurface");
216 begin_frame_pending_ = false; 215 client_ready_for_begin_frame_ = true;
217 pending_swap_buffers_ = 0; 216 pending_swap_buffers_ = 0;
218 client_->DidLoseOutputSurface(); 217 client_->DidLoseOutputSurface();
219 } 218 }
220 219
221 void OutputSurface::SetExternalStencilTest(bool enabled) { 220 void OutputSurface::SetExternalStencilTest(bool enabled) {
222 external_stencil_test_enabled_ = enabled; 221 external_stencil_test_enabled_ = enabled;
223 } 222 }
224 223
225 void OutputSurface::SetExternalDrawConstraints(const gfx::Transform& transform, 224 void OutputSurface::SetExternalDrawConstraints(const gfx::Transform& transform,
226 gfx::Rect viewport, 225 gfx::Rect viewport,
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 "discard_backbuffer", discard_backbuffer); 398 "discard_backbuffer", discard_backbuffer);
400 // Just ignore the memory manager when it says to set the limit to zero 399 // Just ignore the memory manager when it says to set the limit to zero
401 // bytes. This will happen when the memory manager thinks that the renderer 400 // bytes. This will happen when the memory manager thinks that the renderer
402 // is not visible (which the renderer knows better). 401 // is not visible (which the renderer knows better).
403 if (policy.bytes_limit_when_visible) 402 if (policy.bytes_limit_when_visible)
404 client_->SetMemoryPolicy(policy); 403 client_->SetMemoryPolicy(policy);
405 client_->SetDiscardBackBufferWhenNotVisible(discard_backbuffer); 404 client_->SetDiscardBackBufferWhenNotVisible(discard_backbuffer);
406 } 405 }
407 406
408 } // namespace cc 407 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698