OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |