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

Side by Side Diff: content/browser/compositor/delegated_frame_host.cc

Issue 553213003: Avoid destroying surface before the parent surface stops referencing it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/browser/compositor/delegated_frame_host.h" 5 #include "content/browser/compositor/delegated_frame_host.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h" 10 #include "cc/output/compositor_frame_ack.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 scoped_ptr<cc::CopyOutputRequest> request) { 47 scoped_ptr<cc::CopyOutputRequest> request) {
48 GetDelegatedFrameHost()->RequestCopyOfOutput(request.Pass()); 48 GetDelegatedFrameHost()->RequestCopyOfOutput(request.Pass());
49 } 49 }
50 50
51 //////////////////////////////////////////////////////////////////////////////// 51 ////////////////////////////////////////////////////////////////////////////////
52 // DelegatedFrameHost 52 // DelegatedFrameHost
53 53
54 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) 54 DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client)
55 : client_(client), 55 : client_(client),
56 use_surfaces_(base::CommandLine::ForCurrentProcess()->HasSwitch( 56 use_surfaces_(base::CommandLine::ForCurrentProcess()->HasSwitch(
57 switches::kUseSurfaces)), 57 switches::kUseSurfaces)),
58 last_output_surface_id_(0), 58 last_output_surface_id_(0),
59 pending_delegated_ack_count_(0), 59 pending_delegated_ack_count_(0),
60 skipped_frames_(false), 60 skipped_frames_(false),
61 can_lock_compositor_(YES_CAN_LOCK), 61 can_lock_compositor_(YES_CAN_LOCK),
62 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { 62 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) {
63 ImageTransportFactory::GetInstance()->AddObserver(this); 63 ImageTransportFactory::GetInstance()->AddObserver(this);
64 } 64 }
65 65
66 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { 66 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) {
67 delegated_frame_evictor_->SetVisible(true); 67 delegated_frame_evictor_->SetVisible(true);
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 ui::Compositor* compositor = client_->GetCompositor(); 365 ui::Compositor* compositor = client_->GetCompositor();
366 if (frame_size.IsEmpty()) { 366 if (frame_size.IsEmpty()) {
367 DCHECK(frame_data->resource_list.empty()); 367 DCHECK(frame_data->resource_list.empty());
368 EvictDelegatedFrame(); 368 EvictDelegatedFrame();
369 modified_layers = true; 369 modified_layers = true;
370 } else { 370 } else {
371 if (use_surfaces_) { 371 if (use_surfaces_) {
372 if (!surface_factory_) { 372 if (!surface_factory_) {
373 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 373 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
374 cc::SurfaceManager* manager = factory->GetSurfaceManager(); 374 cc::SurfaceManager* manager = factory->GetSurfaceManager();
375 id_allocator_ = factory->CreateSurfaceIdAllocator(); 375 id_allocator_ =
376 factory->GetContextFactory()->CreateSurfaceIdAllocator();
376 surface_factory_ = 377 surface_factory_ =
377 make_scoped_ptr(new cc::SurfaceFactory(manager, this)); 378 make_scoped_ptr(new cc::SurfaceFactory(manager, this));
378 } 379 }
379 if (surface_id_.is_null() || frame_size != current_surface_size_ || 380 if (surface_id_.is_null() || frame_size != current_surface_size_ ||
380 frame_size_in_dip != current_frame_size_in_dip_) { 381 frame_size_in_dip != current_frame_size_in_dip_) {
381 // TODO(jbauman): Wait to destroy this surface until the parent has 382 if (!surface_id_.is_null()) {
382 // finished using it. 383 if (compositor) {
383 if (!surface_id_.is_null()) 384 std::set<cc::SurfaceSequence> s;
jamesr 2014/09/12 01:08:55 's' seems a bit too terse, maybe 'seq' ?
jbauman 2014/09/23 01:58:05 Done.
384 surface_factory_->Destroy(surface_id_); 385 s.insert(compositor->CreateSurfaceSequence());
386 surface_factory_->DestroyOnSequence(surface_id_, s);
387 } else {
388 surface_factory_->Destroy(surface_id_);
389 }
390 }
385 surface_id_ = id_allocator_->GenerateId(); 391 surface_id_ = id_allocator_->GenerateId();
386 surface_factory_->Create(surface_id_, frame_size); 392 surface_factory_->Create(surface_id_, frame_size);
387 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip); 393 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip);
388 current_surface_size_ = frame_size; 394 current_surface_size_ = frame_size;
389 modified_layers = true; 395 modified_layers = true;
390 } 396 }
391 scoped_ptr<cc::CompositorFrame> compositor_frame = 397 scoped_ptr<cc::CompositorFrame> compositor_frame =
392 make_scoped_ptr(new cc::CompositorFrame()); 398 make_scoped_ptr(new cc::CompositorFrame());
393 compositor_frame->delegated_frame_data = frame_data.Pass(); 399 compositor_frame->delegated_frame_data = frame_data.Pass();
394 base::Closure ack_callback; 400 base::Closure ack_callback;
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 if (frame_provider_.get()) { 982 if (frame_provider_.get()) {
977 new_layer->SetShowDelegatedContent(frame_provider_.get(), 983 new_layer->SetShowDelegatedContent(frame_provider_.get(),
978 current_frame_size_in_dip_); 984 current_frame_size_in_dip_);
979 } 985 }
980 if (!surface_id_.is_null()) { 986 if (!surface_id_.is_null()) {
981 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); 987 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_);
982 } 988 }
983 } 989 }
984 990
985 } // namespace content 991 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698