| OLD | NEW |
| 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/renderer_host/delegated_frame_host.h" | 5 #include "content/browser/renderer_host/delegated_frame_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 if (!request_copy_of_output_callback_for_testing_.is_null()) | 374 if (!request_copy_of_output_callback_for_testing_.is_null()) |
| 375 request_copy_of_output_callback_for_testing_.Run(std::move(request)); | 375 request_copy_of_output_callback_for_testing_.Run(std::move(request)); |
| 376 else | 376 else |
| 377 surface_factory_->RequestCopyOfSurface(surface_id_, std::move(request)); | 377 surface_factory_->RequestCopyOfSurface(surface_id_, std::move(request)); |
| 378 } else { | 378 } else { |
| 379 request->set_area(gfx::Rect(current_frame_size_in_dip_)); | 379 request->set_area(gfx::Rect(current_frame_size_in_dip_)); |
| 380 RequestCopyOfOutput(std::move(request)); | 380 RequestCopyOfOutput(std::move(request)); |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 | 383 |
| 384 void DelegatedFrameHost::SwapDelegatedFrame( | 384 void DelegatedFrameHost::SwapDelegatedFrame(uint32_t output_surface_id, |
| 385 uint32_t output_surface_id, | 385 cc::CompositorFrame frame) { |
| 386 std::unique_ptr<cc::CompositorFrame> frame) { | 386 DCHECK(frame.delegated_frame_data.get()); |
| 387 DCHECK(frame->delegated_frame_data.get()); | 387 cc::DelegatedFrameData* frame_data = frame.delegated_frame_data.get(); |
| 388 cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); | 388 float frame_device_scale_factor = frame.metadata.device_scale_factor; |
| 389 float frame_device_scale_factor = frame->metadata.device_scale_factor; | |
| 390 | 389 |
| 391 DCHECK(!frame_data->render_pass_list.empty()); | 390 DCHECK(!frame_data->render_pass_list.empty()); |
| 392 | 391 |
| 393 cc::RenderPass* root_pass = frame_data->render_pass_list.back().get(); | 392 cc::RenderPass* root_pass = frame_data->render_pass_list.back().get(); |
| 394 | 393 |
| 395 gfx::Size frame_size = root_pass->output_rect.size(); | 394 gfx::Size frame_size = root_pass->output_rect.size(); |
| 396 gfx::Size frame_size_in_dip = | 395 gfx::Size frame_size_in_dip = |
| 397 gfx::ConvertSizeToDIP(frame_device_scale_factor, frame_size); | 396 gfx::ConvertSizeToDIP(frame_device_scale_factor, frame_size); |
| 398 | 397 |
| 399 gfx::Rect damage_rect = root_pass->damage_rect; | 398 gfx::Rect damage_rect = root_pass->damage_rect; |
| 400 damage_rect.Intersect(gfx::Rect(frame_size)); | 399 damage_rect.Intersect(gfx::Rect(frame_size)); |
| 401 gfx::Rect damage_rect_in_dip = | 400 gfx::Rect damage_rect_in_dip = |
| 402 gfx::ConvertRectToDIP(frame_device_scale_factor, damage_rect); | 401 gfx::ConvertRectToDIP(frame_device_scale_factor, damage_rect); |
| 403 | 402 |
| 404 if (ShouldSkipFrame(frame_size_in_dip)) { | 403 if (ShouldSkipFrame(frame_size_in_dip)) { |
| 405 cc::CompositorFrameAck ack; | 404 cc::CompositorFrameAck ack; |
| 406 cc::TransferableResource::ReturnResources(frame_data->resource_list, | 405 cc::TransferableResource::ReturnResources(frame_data->resource_list, |
| 407 &ack.resources); | 406 &ack.resources); |
| 408 | 407 |
| 409 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), | 408 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), |
| 410 frame->metadata.latency_info.begin(), | 409 frame.metadata.latency_info.begin(), |
| 411 frame->metadata.latency_info.end()); | 410 frame.metadata.latency_info.end()); |
| 412 | 411 |
| 413 client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); | 412 client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); |
| 414 skipped_frames_ = true; | 413 skipped_frames_ = true; |
| 415 return; | 414 return; |
| 416 } | 415 } |
| 417 | 416 |
| 418 if (skipped_frames_) { | 417 if (skipped_frames_) { |
| 419 skipped_frames_ = false; | 418 skipped_frames_ = false; |
| 420 damage_rect = gfx::Rect(frame_size); | 419 damage_rect = gfx::Rect(frame_size); |
| 421 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); | 420 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 437 | 436 |
| 438 surface_factory_.reset(); | 437 surface_factory_.reset(); |
| 439 if (!surface_returned_resources_.empty()) | 438 if (!surface_returned_resources_.empty()) |
| 440 SendReturnedDelegatedResources(last_output_surface_id_); | 439 SendReturnedDelegatedResources(last_output_surface_id_); |
| 441 | 440 |
| 442 last_output_surface_id_ = output_surface_id; | 441 last_output_surface_id_ = output_surface_id; |
| 443 } | 442 } |
| 444 bool skip_frame = false; | 443 bool skip_frame = false; |
| 445 pending_delegated_ack_count_++; | 444 pending_delegated_ack_count_++; |
| 446 | 445 |
| 447 background_color_ = frame->metadata.root_background_color; | 446 background_color_ = frame.metadata.root_background_color; |
| 448 | 447 |
| 449 if (frame_size.IsEmpty()) { | 448 if (frame_size.IsEmpty()) { |
| 450 DCHECK(frame_data->resource_list.empty()); | 449 DCHECK(frame_data->resource_list.empty()); |
| 451 EvictDelegatedFrame(); | 450 EvictDelegatedFrame(); |
| 452 } else { | 451 } else { |
| 453 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 452 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 454 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 453 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 455 if (!surface_factory_) { | 454 if (!surface_factory_) { |
| 456 surface_factory_ = | 455 surface_factory_ = |
| 457 base::WrapUnique(new cc::SurfaceFactory(manager, this)); | 456 base::WrapUnique(new cc::SurfaceFactory(manager, this)); |
| 458 } | 457 } |
| 459 if (surface_id_.is_null() || frame_size != current_surface_size_ || | 458 if (surface_id_.is_null() || frame_size != current_surface_size_ || |
| 460 frame_size_in_dip != current_frame_size_in_dip_) { | 459 frame_size_in_dip != current_frame_size_in_dip_) { |
| 461 if (!surface_id_.is_null()) | 460 if (!surface_id_.is_null()) |
| 462 surface_factory_->Destroy(surface_id_); | 461 surface_factory_->Destroy(surface_id_); |
| 463 surface_id_ = id_allocator_->GenerateId(); | 462 surface_id_ = id_allocator_->GenerateId(); |
| 464 surface_factory_->Create(surface_id_); | 463 surface_factory_->Create(surface_id_); |
| 465 surface_factory_->SetSurfaceGpuMemoryBufferClientId( | 464 surface_factory_->SetSurfaceGpuMemoryBufferClientId( |
| 466 surface_id_, client_->DelegatedFrameHostGetGpuMemoryBufferClientId()); | 465 surface_id_, client_->DelegatedFrameHostGetGpuMemoryBufferClientId()); |
| 467 // manager must outlive compositors using it. | 466 // manager must outlive compositors using it. |
| 468 client_->DelegatedFrameHostGetLayer()->SetShowSurface( | 467 client_->DelegatedFrameHostGetLayer()->SetShowSurface( |
| 469 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 468 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| 470 base::Bind(&RequireCallback, base::Unretained(manager)), frame_size, | 469 base::Bind(&RequireCallback, base::Unretained(manager)), frame_size, |
| 471 frame_device_scale_factor, frame_size_in_dip); | 470 frame_device_scale_factor, frame_size_in_dip); |
| 472 current_surface_size_ = frame_size; | 471 current_surface_size_ = frame_size; |
| 473 current_scale_factor_ = frame_device_scale_factor; | 472 current_scale_factor_ = frame_device_scale_factor; |
| 474 } | 473 } |
| 475 | 474 |
| 476 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), | 475 frame.metadata.latency_info.insert(frame.metadata.latency_info.end(), |
| 477 skipped_latency_info_list_.begin(), | 476 skipped_latency_info_list_.begin(), |
| 478 skipped_latency_info_list_.end()); | 477 skipped_latency_info_list_.end()); |
| 479 skipped_latency_info_list_.clear(); | 478 skipped_latency_info_list_.clear(); |
| 480 | 479 |
| 481 gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); | 480 gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); |
| 482 if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) | 481 if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) |
| 483 skip_frame = true; | 482 skip_frame = true; |
| 484 | 483 |
| 485 cc::SurfaceFactory::DrawCallback ack_callback; | 484 cc::SurfaceFactory::DrawCallback ack_callback; |
| 486 if (compositor_ && !skip_frame) { | 485 if (compositor_ && !skip_frame) { |
| 487 ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(), | 486 ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(), |
| 488 output_surface_id); | 487 output_surface_id); |
| 489 } | 488 } |
| 490 surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), | 489 std::unique_ptr<cc::CompositorFrame> frame_copy(new cc::CompositorFrame); |
| 490 *frame_copy = std::move(frame); |
| 491 surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame_copy), |
| 491 ack_callback); | 492 ack_callback); |
| 492 } | 493 } |
| 493 released_front_lock_ = NULL; | 494 released_front_lock_ = NULL; |
| 494 current_frame_size_in_dip_ = frame_size_in_dip; | 495 current_frame_size_in_dip_ = frame_size_in_dip; |
| 495 CheckResizeLock(); | 496 CheckResizeLock(); |
| 496 | 497 |
| 497 UpdateGutters(); | 498 UpdateGutters(); |
| 498 | 499 |
| 499 if (!damage_rect_in_dip.IsEmpty()) | 500 if (!damage_rect_in_dip.IsEmpty()) |
| 500 client_->DelegatedFrameHostGetLayer()->OnDelegatedFrameDamage( | 501 client_->DelegatedFrameHostGetLayer()->OnDelegatedFrameDamage( |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 897 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 897 new_layer->SetShowSurface( | 898 new_layer->SetShowSurface( |
| 898 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 899 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| 899 base::Bind(&RequireCallback, base::Unretained(manager)), | 900 base::Bind(&RequireCallback, base::Unretained(manager)), |
| 900 current_surface_size_, current_scale_factor_, | 901 current_surface_size_, current_scale_factor_, |
| 901 current_frame_size_in_dip_); | 902 current_frame_size_in_dip_); |
| 902 } | 903 } |
| 903 } | 904 } |
| 904 | 905 |
| 905 } // namespace content | 906 } // namespace content |
| OLD | NEW |