| OLD | NEW |
| 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 "ui/compositor/compositor.h" | 5 #include "ui/compositor/compositor.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 if (root_layer_) | 196 if (root_layer_) |
| 197 root_layer_->SetCompositor(NULL); | 197 root_layer_->SetCompositor(NULL); |
| 198 | 198 |
| 199 // Stop all outstanding draws before telling the ContextFactory to tear | 199 // Stop all outstanding draws before telling the ContextFactory to tear |
| 200 // down any contexts that the |host_| may rely upon. | 200 // down any contexts that the |host_| may rely upon. |
| 201 host_.reset(); | 201 host_.reset(); |
| 202 | 202 |
| 203 context_factory_->RemoveCompositor(this); | 203 context_factory_->RemoveCompositor(this); |
| 204 } | 204 } |
| 205 | 205 |
| 206 void Compositor::SetOutputSurface(scoped_ptr<cc::OutputSurface> surface) { |
| 207 host_->SetOutputSurface(surface.Pass()); |
| 208 } |
| 209 |
| 206 void Compositor::ScheduleDraw() { | 210 void Compositor::ScheduleDraw() { |
| 207 if (compositor_thread_loop_.get()) { | 211 if (compositor_thread_loop_.get()) { |
| 208 host_->SetNeedsCommit(); | 212 host_->SetNeedsCommit(); |
| 209 } else if (!defer_draw_scheduling_) { | 213 } else if (!defer_draw_scheduling_) { |
| 210 defer_draw_scheduling_ = true; | 214 defer_draw_scheduling_ = true; |
| 211 task_runner_->PostTask( | 215 task_runner_->PostTask( |
| 212 FROM_HERE, | 216 FROM_HERE, |
| 213 base::Bind(&Compositor::Draw, weak_ptr_factory_.GetWeakPtr())); | 217 base::Bind(&Compositor::Draw, weak_ptr_factory_.GetWeakPtr())); |
| 214 } | 218 } |
| 215 } | 219 } |
| 216 | 220 |
| 217 void Compositor::DidInitializeOutputSurface() { | 221 void Compositor::DidInitializeOutputSurface() { |
| 218 num_failed_recreate_attempts_ = 0; | |
| 219 } | 222 } |
| 220 | 223 |
| 221 void Compositor::DidFailToInitializeOutputSurface() { | 224 void Compositor::DidFailToInitializeOutputSurface() { |
| 222 num_failed_recreate_attempts_++; | 225 NOTREACHED() << "We don't support fallback"; |
| 223 | |
| 224 // Tolerate a certain number of recreation failures to work around races | |
| 225 // in the output-surface-lost machinery. | |
| 226 if (num_failed_recreate_attempts_ >= MAX_OUTPUT_SURFACE_RETRIES) | |
| 227 LOG(FATAL) << "Failed to create a fallback OutputSurface."; | |
| 228 | |
| 229 base::MessageLoop::current()->PostTask( | |
| 230 FROM_HERE, base::Bind(&Compositor::RequestNewOutputSurface, | |
| 231 weak_ptr_factory_.GetWeakPtr())); | |
| 232 } | 226 } |
| 233 | 227 |
| 234 void Compositor::SetRootLayer(Layer* root_layer) { | 228 void Compositor::SetRootLayer(Layer* root_layer) { |
| 235 if (root_layer_ == root_layer) | 229 if (root_layer_ == root_layer) |
| 236 return; | 230 return; |
| 237 if (root_layer_) | 231 if (root_layer_) |
| 238 root_layer_->SetCompositor(NULL); | 232 root_layer_->SetCompositor(NULL); |
| 239 root_layer_ = root_layer; | 233 root_layer_ = root_layer; |
| 240 if (root_layer_ && !root_layer_->GetCompositor()) | 234 if (root_layer_ && !root_layer_->GetCompositor()) |
| 241 root_layer_->SetCompositor(this); | 235 root_layer_->SetCompositor(this); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 void Compositor::Layout() { | 372 void Compositor::Layout() { |
| 379 // We're sending damage that will be addressed during this composite | 373 // We're sending damage that will be addressed during this composite |
| 380 // cycle, so we don't need to schedule another composite to address it. | 374 // cycle, so we don't need to schedule another composite to address it. |
| 381 disable_schedule_composite_ = true; | 375 disable_schedule_composite_ = true; |
| 382 if (root_layer_) | 376 if (root_layer_) |
| 383 root_layer_->SendDamagedRects(); | 377 root_layer_->SendDamagedRects(); |
| 384 disable_schedule_composite_ = false; | 378 disable_schedule_composite_ = false; |
| 385 } | 379 } |
| 386 | 380 |
| 387 void Compositor::RequestNewOutputSurface() { | 381 void Compositor::RequestNewOutputSurface() { |
| 388 bool fallback = | 382 bool fallback = false; |
| 389 num_failed_recreate_attempts_ >= OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK; | 383 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr(), |
| 390 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr().get(), | |
| 391 fallback); | 384 fallback); |
| 392 } | 385 } |
| 393 | 386 |
| 394 void Compositor::DidCommit() { | 387 void Compositor::DidCommit() { |
| 395 DCHECK(!IsLocked()); | 388 DCHECK(!IsLocked()); |
| 396 FOR_EACH_OBSERVER(CompositorObserver, | 389 FOR_EACH_OBSERVER(CompositorObserver, |
| 397 observer_list_, | 390 observer_list_, |
| 398 OnCompositingDidCommit(this)); | 391 OnCompositingDidCommit(this)); |
| 399 } | 392 } |
| 400 | 393 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 // Call ScheduleDraw() instead of Draw() in order to allow other | 492 // Call ScheduleDraw() instead of Draw() in order to allow other |
| 500 // CompositorObservers to be notified before starting another | 493 // CompositorObservers to be notified before starting another |
| 501 // draw cycle. | 494 // draw cycle. |
| 502 ScheduleDraw(); | 495 ScheduleDraw(); |
| 503 } | 496 } |
| 504 FOR_EACH_OBSERVER( | 497 FOR_EACH_OBSERVER( |
| 505 CompositorObserver, observer_list_, OnCompositingEnded(this)); | 498 CompositorObserver, observer_list_, OnCompositingEnded(this)); |
| 506 } | 499 } |
| 507 | 500 |
| 508 } // namespace ui | 501 } // namespace ui |
| OLD | NEW |