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

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

Issue 432093003: Enqueuing new frames in a Surface should cause Displays to reaggregate it (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
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 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 if (resource_collection_.get()) { 343 if (resource_collection_.get()) {
344 resource_collection_->SetClient(NULL); 344 resource_collection_->SetClient(NULL);
345 345
346 if (resource_collection_->LoseAllResources()) 346 if (resource_collection_->LoseAllResources())
347 SendReturnedDelegatedResources(last_output_surface_id_); 347 SendReturnedDelegatedResources(last_output_surface_id_);
348 348
349 resource_collection_ = NULL; 349 resource_collection_ = NULL;
350 } 350 }
351 last_output_surface_id_ = output_surface_id; 351 last_output_surface_id_ = output_surface_id;
352 } 352 }
353 bool modified_layers = false;
353 if (frame_size.IsEmpty()) { 354 if (frame_size.IsEmpty()) {
354 DCHECK(frame_data->resource_list.empty()); 355 DCHECK(frame_data->resource_list.empty());
355 EvictDelegatedFrame(); 356 EvictDelegatedFrame();
357 modified_layers = true;
356 } else { 358 } else {
357 if (use_surfaces_) { 359 if (use_surfaces_) {
358 if (!surface_factory_) { 360 if (!surface_factory_) {
359 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 361 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
360 cc::SurfaceManager* manager = factory->GetSurfaceManager(); 362 cc::SurfaceManager* manager = factory->GetSurfaceManager();
361 id_allocator_ = factory->CreateSurfaceIdAllocator(); 363 id_allocator_ = factory->CreateSurfaceIdAllocator();
362 surface_factory_ = 364 surface_factory_ =
363 make_scoped_ptr(new cc::SurfaceFactory(manager, this)); 365 make_scoped_ptr(new cc::SurfaceFactory(manager, this));
364 } 366 }
365 if (surface_id_.is_null() || frame_size != current_surface_size_ || 367 if (surface_id_.is_null() || frame_size != current_surface_size_ ||
366 frame_size_in_dip != current_frame_size_in_dip_) { 368 frame_size_in_dip != current_frame_size_in_dip_) {
369 // TODO(jbauman): Wait to destroy this surface until the parent has
370 // finished using it.
367 if (!surface_id_.is_null()) 371 if (!surface_id_.is_null())
368 surface_factory_->Destroy(surface_id_); 372 surface_factory_->Destroy(surface_id_);
369 surface_id_ = id_allocator_->GenerateId(); 373 surface_id_ = id_allocator_->GenerateId();
370 surface_factory_->Create(surface_id_, frame_size); 374 surface_factory_->Create(surface_id_, frame_size);
371 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip); 375 client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip);
372 current_surface_size_ = frame_size; 376 current_surface_size_ = frame_size;
377 modified_layers = true;
373 } 378 }
374 scoped_ptr<cc::CompositorFrame> compositor_frame = 379 scoped_ptr<cc::CompositorFrame> compositor_frame =
375 make_scoped_ptr(new cc::CompositorFrame()); 380 make_scoped_ptr(new cc::CompositorFrame());
376 compositor_frame->delegated_frame_data = frame_data.Pass(); 381 compositor_frame->delegated_frame_data = frame_data.Pass();
377 surface_factory_->SubmitFrame(surface_id_, compositor_frame.Pass()); 382 surface_factory_->SubmitFrame(surface_id_, compositor_frame.Pass());
378 } else { 383 } else {
379 if (!resource_collection_) { 384 if (!resource_collection_) {
380 resource_collection_ = new cc::DelegatedFrameResourceCollection; 385 resource_collection_ = new cc::DelegatedFrameResourceCollection;
381 resource_collection_->SetClient(this); 386 resource_collection_->SetClient(this);
382 } 387 }
383 // If the physical frame size changes, we need a new |frame_provider_|. If 388 // If the physical frame size changes, we need a new |frame_provider_|. If
384 // the physical frame size is the same, but the size in DIP changed, we 389 // the physical frame size is the same, but the size in DIP changed, we
385 // need to adjust the scale at which the frames will be drawn, and we do 390 // need to adjust the scale at which the frames will be drawn, and we do
386 // this by making a new |frame_provider_| also to ensure the scale change 391 // this by making a new |frame_provider_| also to ensure the scale change
387 // is presented in sync with the new frame content. 392 // is presented in sync with the new frame content.
388 if (!frame_provider_.get() || 393 if (!frame_provider_.get() ||
389 frame_size != frame_provider_->frame_size() || 394 frame_size != frame_provider_->frame_size() ||
390 frame_size_in_dip != current_frame_size_in_dip_) { 395 frame_size_in_dip != current_frame_size_in_dip_) {
391 frame_provider_ = new cc::DelegatedFrameProvider( 396 frame_provider_ = new cc::DelegatedFrameProvider(
392 resource_collection_.get(), frame_data.Pass()); 397 resource_collection_.get(), frame_data.Pass());
393 client_->GetLayer()->SetShowDelegatedContent(frame_provider_.get(), 398 client_->GetLayer()->SetShowDelegatedContent(frame_provider_.get(),
394 frame_size_in_dip); 399 frame_size_in_dip);
395 } else { 400 } else {
396 frame_provider_->SetFrameData(frame_data.Pass()); 401 frame_provider_->SetFrameData(frame_data.Pass());
397 } 402 }
403 modified_layers = true;
398 } 404 }
399 } 405 }
400 released_front_lock_ = NULL; 406 released_front_lock_ = NULL;
401 current_frame_size_in_dip_ = frame_size_in_dip; 407 current_frame_size_in_dip_ = frame_size_in_dip;
402 CheckResizeLock(); 408 CheckResizeLock();
403 409
404 client_->SchedulePaintInRect(damage_rect_in_dip); 410 if (modified_layers) {
411 // TODO(jbauman): Need to always tell the window observer about the
412 // damage.
413 client_->SchedulePaintInRect(damage_rect_in_dip);
414 }
405 415
406 pending_delegated_ack_count_++; 416 pending_delegated_ack_count_++;
407 417
408 ui::Compositor* compositor = client_->GetCompositor(); 418 ui::Compositor* compositor = client_->GetCompositor();
409 if (!compositor) { 419 if (!compositor || !modified_layers) {
410 SendDelegatedFrameAck(output_surface_id); 420 SendDelegatedFrameAck(output_surface_id);
411 } else { 421 } else {
412 std::vector<ui::LatencyInfo>::const_iterator it; 422 std::vector<ui::LatencyInfo>::const_iterator it;
413 for (it = latency_info.begin(); it != latency_info.end(); ++it) 423 for (it = latency_info.begin(); it != latency_info.end(); ++it)
414 compositor->SetLatencyInfo(*it); 424 compositor->SetLatencyInfo(*it);
415 // If we've previously skipped any latency infos add them. 425 // If we've previously skipped any latency infos add them.
416 for (it = skipped_latency_info_list_.begin(); 426 for (it = skipped_latency_info_list_.begin();
417 it != skipped_latency_info_list_.end(); 427 it != skipped_latency_info_list_.end();
418 ++it) 428 ++it)
419 compositor->SetLatencyInfo(*it); 429 compositor->SetLatencyInfo(*it);
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 if (frame_provider_.get()) { 926 if (frame_provider_.get()) {
917 new_layer->SetShowDelegatedContent(frame_provider_.get(), 927 new_layer->SetShowDelegatedContent(frame_provider_.get(),
918 current_frame_size_in_dip_); 928 current_frame_size_in_dip_);
919 } 929 }
920 if (!surface_id_.is_null()) { 930 if (!surface_id_.is_null()) {
921 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_); 931 new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_);
922 } 932 }
923 } 933 }
924 934
925 } // namespace content 935 } // namespace content
OLDNEW
« no previous file with comments | « cc/surfaces/surfaces_pixeltest.cc ('k') | content/browser/compositor/gpu_process_transport_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698