| 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 |