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

Side by Side Diff: ui/compositor/compositor.cc

Issue 2270573002: cc: Get rid of LayerTreeHost::output_surface_lost_ state. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@renderer-caps
Patch Set: lth-outputsurface-lost: android-build-and-earlyout-sooner Created 4 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
« no previous file with comments | « ui/compositor/compositor.h ('k') | ui/compositor/compositor_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "ui/compositor/compositor.h" 5 #include "ui/compositor/compositor.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <deque> 10 #include <deque>
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 output_surface_requested_(false), 82 output_surface_requested_(false),
83 surface_id_allocator_(new cc::SurfaceIdAllocator( 83 surface_id_allocator_(new cc::SurfaceIdAllocator(
84 context_factory->AllocateSurfaceClientId())), 84 context_factory->AllocateSurfaceClientId())),
85 task_runner_(task_runner), 85 task_runner_(task_runner),
86 vsync_manager_(new CompositorVSyncManager()), 86 vsync_manager_(new CompositorVSyncManager()),
87 device_scale_factor_(0.0f), 87 device_scale_factor_(0.0f),
88 locks_will_time_out_(true), 88 locks_will_time_out_(true),
89 compositor_lock_(NULL), 89 compositor_lock_(NULL),
90 layer_animator_collection_(this), 90 layer_animator_collection_(this),
91 weak_ptr_factory_(this) { 91 weak_ptr_factory_(this) {
92 if (context_factory->GetSurfaceManager()) { 92 context_factory->GetSurfaceManager()->RegisterSurfaceClientId(
93 context_factory->GetSurfaceManager()->RegisterSurfaceClientId( 93 surface_id_allocator_->client_id());
94 surface_id_allocator_->client_id());
95 }
96 root_web_layer_ = cc::Layer::Create(); 94 root_web_layer_ = cc::Layer::Create();
97 95
98 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 96 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
99 97
100 cc::LayerTreeSettings settings; 98 cc::LayerTreeSettings settings;
101 99
102 // This will ensure PictureLayers always can have LCD text, to match the 100 // This will ensure PictureLayers always can have LCD text, to match the
103 // previous behaviour with ContentLayers, where LCD-not-allowed notifications 101 // previous behaviour with ContentLayers, where LCD-not-allowed notifications
104 // were ignored. 102 // were ignored.
105 settings.layers_always_allowed_lcd_text = true; 103 settings.layers_always_allowed_lcd_text = true;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 233
236 if (animation_timeline_) 234 if (animation_timeline_)
237 host_->GetLayerTree()->animation_host()->RemoveAnimationTimeline( 235 host_->GetLayerTree()->animation_host()->RemoveAnimationTimeline(
238 animation_timeline_.get()); 236 animation_timeline_.get());
239 237
240 // Stop all outstanding draws before telling the ContextFactory to tear 238 // Stop all outstanding draws before telling the ContextFactory to tear
241 // down any contexts that the |host_| may rely upon. 239 // down any contexts that the |host_| may rely upon.
242 host_.reset(); 240 host_.reset();
243 241
244 context_factory_->RemoveCompositor(this); 242 context_factory_->RemoveCompositor(this);
245 if (context_factory_->GetSurfaceManager()) { 243 auto* manager = context_factory_->GetSurfaceManager();
246 for (auto& client : surface_clients_) { 244 for (auto& client : surface_clients_) {
247 if (client.second) { 245 DCHECK(client.second);
248 context_factory_->GetSurfaceManager() 246 manager->UnregisterSurfaceNamespaceHierarchy(client.second, client.first);
249 ->UnregisterSurfaceNamespaceHierarchy(client.second, client.first);
250 }
251 }
252 context_factory_->GetSurfaceManager()->InvalidateSurfaceClientId(
253 surface_id_allocator_->client_id());
254 } 247 }
248 manager->InvalidateSurfaceClientId(surface_id_allocator_->client_id());
255 } 249 }
256 250
257 void Compositor::AddSurfaceClient(uint32_t client_id) { 251 void Compositor::AddSurfaceClient(uint32_t client_id) {
258 // We don't give the client a parent until the ui::Compositor has an 252 uint32_t parent_client_id = surface_id_allocator_->client_id();
259 // OutputSurface. 253 context_factory_->GetSurfaceManager()->RegisterSurfaceNamespaceHierarchy(
260 uint32_t parent_client_id = 0; 254 parent_client_id, client_id);
261 if (host_->has_output_surface()) {
262 parent_client_id = surface_id_allocator_->client_id();
263 context_factory_->GetSurfaceManager()->RegisterSurfaceNamespaceHierarchy(
264 parent_client_id, client_id);
265 }
266 surface_clients_[client_id] = parent_client_id; 255 surface_clients_[client_id] = parent_client_id;
267 } 256 }
268 257
269 void Compositor::RemoveSurfaceClient(uint32_t client_id) { 258 void Compositor::RemoveSurfaceClient(uint32_t client_id) {
270 auto it = surface_clients_.find(client_id); 259 auto it = surface_clients_.find(client_id);
271 DCHECK(it != surface_clients_.end()); 260 DCHECK(it != surface_clients_.end());
272 if (host_->has_output_surface()) { 261 DCHECK(it->second);
273 context_factory_->GetSurfaceManager()->UnregisterSurfaceNamespaceHierarchy( 262 context_factory_->GetSurfaceManager()->UnregisterSurfaceNamespaceHierarchy(
274 it->second, client_id); 263 it->second, it->first);
275 }
276 surface_clients_.erase(it); 264 surface_clients_.erase(it);
277 } 265 }
278 266
279 void Compositor::SetOutputSurface( 267 void Compositor::SetOutputSurface(
280 std::unique_ptr<cc::OutputSurface> output_surface) { 268 std::unique_ptr<cc::OutputSurface> output_surface) {
281 output_surface_requested_ = false; 269 output_surface_requested_ = false;
282 host_->SetOutputSurface(std::move(output_surface)); 270 host_->SetOutputSurface(std::move(output_surface));
283 // ui::Compositor uses a SingleThreadProxy and so BindToClient will be called
284 // above and SurfaceManager will be made aware of the OutputSurface's client
285 // ID.
286 for (auto& client : surface_clients_) {
287 if (client.second == surface_id_allocator_->client_id())
288 continue;
289 // If a client already has a parent, then we unregister the existing parent.
290 if (client.second) {
291 context_factory_->GetSurfaceManager()
292 ->UnregisterSurfaceNamespaceHierarchy(client.second, client.first);
293 }
294 context_factory_->GetSurfaceManager()->RegisterSurfaceNamespaceHierarchy(
295 surface_id_allocator_->client_id(), client.first);
296 client.second = surface_id_allocator_->client_id();
297 }
298 // Visibility is reset when the output surface is lost, so update it to match 271 // Visibility is reset when the output surface is lost, so update it to match
299 // the Compositor's. 272 // the Compositor's.
300 context_factory_->SetDisplayVisible(this, host_->visible()); 273 context_factory_->SetDisplayVisible(this, host_->visible());
301 } 274 }
302 275
303 void Compositor::ScheduleDraw() { 276 void Compositor::ScheduleDraw() {
304 host_->SetNeedsCommit(); 277 host_->SetNeedsCommit();
305 } 278 }
306 279
307 void Compositor::SetRootLayer(Layer* root_layer) { 280 void Compositor::SetRootLayer(Layer* root_layer) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // This function should only get called once. 384 // This function should only get called once.
412 DCHECK(!widget_valid_); 385 DCHECK(!widget_valid_);
413 widget_ = widget; 386 widget_ = widget;
414 widget_valid_ = true; 387 widget_valid_ = true;
415 if (output_surface_requested_) 388 if (output_surface_requested_)
416 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr()); 389 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr());
417 } 390 }
418 391
419 gfx::AcceleratedWidget Compositor::ReleaseAcceleratedWidget() { 392 gfx::AcceleratedWidget Compositor::ReleaseAcceleratedWidget() {
420 DCHECK(!IsVisible()); 393 DCHECK(!IsVisible());
421 if (!host_->output_surface_lost()) { 394 host_->ReleaseOutputSurface();
422 host_->ReleaseOutputSurface();
423 for (auto& client : surface_clients_) {
424 context_factory_->GetSurfaceManager()
425 ->UnregisterSurfaceNamespaceHierarchy(client.second, client.first);
426 client.second = 0;
427 }
428 }
429 context_factory_->RemoveCompositor(this); 395 context_factory_->RemoveCompositor(this);
430 widget_valid_ = false; 396 widget_valid_ = false;
431 gfx::AcceleratedWidget widget = widget_; 397 gfx::AcceleratedWidget widget = widget_;
432 widget_ = gfx::kNullAcceleratedWidget; 398 widget_ = gfx::kNullAcceleratedWidget;
433 return widget; 399 return widget;
434 } 400 }
435 401
436 gfx::AcceleratedWidget Compositor::widget() const { 402 gfx::AcceleratedWidget Compositor::widget() const {
437 DCHECK(widget_valid_); 403 DCHECK(widget_valid_);
438 return widget_; 404 return widget_;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 465
500 void Compositor::UpdateLayerTreeHost() { 466 void Compositor::UpdateLayerTreeHost() {
501 if (!root_layer()) 467 if (!root_layer())
502 return; 468 return;
503 SendDamagedRectsRecursive(root_layer()); 469 SendDamagedRectsRecursive(root_layer());
504 } 470 }
505 471
506 void Compositor::RequestNewOutputSurface() { 472 void Compositor::RequestNewOutputSurface() {
507 DCHECK(!output_surface_requested_); 473 DCHECK(!output_surface_requested_);
508 output_surface_requested_ = true; 474 output_surface_requested_ = true;
509 if (widget_valid_) { 475 if (widget_valid_)
510 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr()); 476 context_factory_->CreateOutputSurface(weak_ptr_factory_.GetWeakPtr());
511 }
512 } 477 }
513 478
514 void Compositor::DidInitializeOutputSurface() { 479 void Compositor::DidInitializeOutputSurface() {
515 } 480 }
516 481
517 void Compositor::DidFailToInitializeOutputSurface() { 482 void Compositor::DidFailToInitializeOutputSurface() {
518 // The OutputSurface should already be bound/initialized before being given to 483 // The OutputSurface should already be bound/initialized before being given to
519 // the Compositor. 484 // the Compositor.
520 NOTREACHED(); 485 NOTREACHED();
521 } 486 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 observer_list_, 548 observer_list_,
584 OnCompositingLockStateChanged(this)); 549 OnCompositingLockStateChanged(this));
585 } 550 }
586 551
587 void Compositor::CancelCompositorLock() { 552 void Compositor::CancelCompositorLock() {
588 if (compositor_lock_) 553 if (compositor_lock_)
589 compositor_lock_->CancelLock(); 554 compositor_lock_->CancelLock();
590 } 555 }
591 556
592 } // namespace ui 557 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/compositor.h ('k') | ui/compositor/compositor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698