| 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/compositor/delegated_frame_host.h" | 5 #include "content/browser/compositor/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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 void DelegatedFrameHost::AttemptFrameSubscriberCapture( | 279 void DelegatedFrameHost::AttemptFrameSubscriberCapture( |
| 280 const gfx::Rect& damage_rect) { | 280 const gfx::Rect& damage_rect) { |
| 281 if (!frame_subscriber() || !CanCopyToVideoFrame()) | 281 if (!frame_subscriber() || !CanCopyToVideoFrame()) |
| 282 return; | 282 return; |
| 283 | 283 |
| 284 const base::TimeTicks now = tick_clock_->NowTicks(); | 284 const base::TimeTicks now = tick_clock_->NowTicks(); |
| 285 base::TimeTicks present_time; | 285 base::TimeTicks present_time; |
| 286 if (vsync_interval_ <= base::TimeDelta()) { | 286 if (vsync_interval_ <= base::TimeDelta()) { |
| 287 present_time = now; | 287 present_time = now; |
| 288 } else { | 288 } else { |
| 289 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; | 289 const int64_t intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
| 290 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; | 290 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; |
| 291 } | 291 } |
| 292 | 292 |
| 293 scoped_refptr<media::VideoFrame> frame; | 293 scoped_refptr<media::VideoFrame> frame; |
| 294 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 294 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| 295 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, | 295 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, |
| 296 &frame, &callback)) | 296 &frame, &callback)) |
| 297 return; | 297 return; |
| 298 | 298 |
| 299 // Get a texture to re-use; else, create a new one. | 299 // Get a texture to re-use; else, create a new one. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 request_copy_of_output_callback_for_testing_.Run(request.Pass()); | 334 request_copy_of_output_callback_for_testing_.Run(request.Pass()); |
| 335 else | 335 else |
| 336 surface_factory_->RequestCopyOfSurface(surface_id_, request.Pass()); | 336 surface_factory_->RequestCopyOfSurface(surface_id_, request.Pass()); |
| 337 } else { | 337 } else { |
| 338 request->set_area(gfx::Rect(current_frame_size_in_dip_)); | 338 request->set_area(gfx::Rect(current_frame_size_in_dip_)); |
| 339 RequestCopyOfOutput(request.Pass()); | 339 RequestCopyOfOutput(request.Pass()); |
| 340 } | 340 } |
| 341 } | 341 } |
| 342 | 342 |
| 343 void DelegatedFrameHost::SwapDelegatedFrame( | 343 void DelegatedFrameHost::SwapDelegatedFrame( |
| 344 uint32 output_surface_id, | 344 uint32_t output_surface_id, |
| 345 scoped_ptr<cc::CompositorFrame> frame) { | 345 scoped_ptr<cc::CompositorFrame> frame) { |
| 346 DCHECK(frame->delegated_frame_data.get()); | 346 DCHECK(frame->delegated_frame_data.get()); |
| 347 cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); | 347 cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); |
| 348 float frame_device_scale_factor = frame->metadata.device_scale_factor; | 348 float frame_device_scale_factor = frame->metadata.device_scale_factor; |
| 349 | 349 |
| 350 DCHECK(!frame_data->render_pass_list.empty()); | 350 DCHECK(!frame_data->render_pass_list.empty()); |
| 351 | 351 |
| 352 cc::RenderPass* root_pass = frame_data->render_pass_list.back().get(); | 352 cc::RenderPass* root_pass = frame_data->render_pass_list.back().get(); |
| 353 | 353 |
| 354 gfx::Size frame_size = root_pass->output_rect.size(); | 354 gfx::Size frame_size = root_pass->output_rect.size(); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 delegated_frame_evictor_->SwappedFrame( | 513 delegated_frame_evictor_->SwappedFrame( |
| 514 client_->DelegatedFrameHostIsVisible()); | 514 client_->DelegatedFrameHostIsVisible()); |
| 515 // Note: the frame may have been evicted immediately. | 515 // Note: the frame may have been evicted immediately. |
| 516 } | 516 } |
| 517 | 517 |
| 518 void DelegatedFrameHost::ClearDelegatedFrame() { | 518 void DelegatedFrameHost::ClearDelegatedFrame() { |
| 519 if (frame_provider_.get() || !surface_id_.is_null()) | 519 if (frame_provider_.get() || !surface_id_.is_null()) |
| 520 EvictDelegatedFrame(); | 520 EvictDelegatedFrame(); |
| 521 } | 521 } |
| 522 | 522 |
| 523 void DelegatedFrameHost::SendDelegatedFrameAck(uint32 output_surface_id) { | 523 void DelegatedFrameHost::SendDelegatedFrameAck(uint32_t output_surface_id) { |
| 524 cc::CompositorFrameAck ack; | 524 cc::CompositorFrameAck ack; |
| 525 if (!surface_returned_resources_.empty()) | 525 if (!surface_returned_resources_.empty()) |
| 526 ack.resources.swap(surface_returned_resources_); | 526 ack.resources.swap(surface_returned_resources_); |
| 527 if (resource_collection_.get()) | 527 if (resource_collection_.get()) |
| 528 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); | 528 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
| 529 client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); | 529 client_->DelegatedFrameHostSendCompositorSwapAck(output_surface_id, ack); |
| 530 DCHECK_GT(pending_delegated_ack_count_, 0); | 530 DCHECK_GT(pending_delegated_ack_count_, 0); |
| 531 pending_delegated_ack_count_--; | 531 pending_delegated_ack_count_--; |
| 532 } | 532 } |
| 533 | 533 |
| 534 void DelegatedFrameHost::SurfaceDrawn(uint32 output_surface_id, | 534 void DelegatedFrameHost::SurfaceDrawn(uint32_t output_surface_id, |
| 535 cc::SurfaceDrawStatus drawn) { | 535 cc::SurfaceDrawStatus drawn) { |
| 536 SendDelegatedFrameAck(output_surface_id); | 536 SendDelegatedFrameAck(output_surface_id); |
| 537 } | 537 } |
| 538 | 538 |
| 539 void DelegatedFrameHost::UnusedResourcesAreAvailable() { | 539 void DelegatedFrameHost::UnusedResourcesAreAvailable() { |
| 540 if (pending_delegated_ack_count_) | 540 if (pending_delegated_ack_count_) |
| 541 return; | 541 return; |
| 542 | 542 |
| 543 SendReturnedDelegatedResources(last_output_surface_id_); | 543 SendReturnedDelegatedResources(last_output_surface_id_); |
| 544 } | 544 } |
| 545 | 545 |
| 546 void DelegatedFrameHost::SendReturnedDelegatedResources( | 546 void DelegatedFrameHost::SendReturnedDelegatedResources( |
| 547 uint32 output_surface_id) { | 547 uint32_t output_surface_id) { |
| 548 cc::CompositorFrameAck ack; | 548 cc::CompositorFrameAck ack; |
| 549 if (!surface_returned_resources_.empty()) { | 549 if (!surface_returned_resources_.empty()) { |
| 550 ack.resources.swap(surface_returned_resources_); | 550 ack.resources.swap(surface_returned_resources_); |
| 551 } else { | 551 } else { |
| 552 DCHECK(resource_collection_.get()); | 552 DCHECK(resource_collection_.get()); |
| 553 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); | 553 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
| 554 } | 554 } |
| 555 DCHECK(!ack.resources.empty()); | 555 DCHECK(!ack.resources.empty()); |
| 556 | 556 |
| 557 client_->DelegatedFrameHostSendReclaimCompositorResources(output_surface_id, | 557 client_->DelegatedFrameHostSendReclaimCompositorResources(output_surface_id, |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 return; | 666 return; |
| 667 } | 667 } |
| 668 | 668 |
| 669 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 669 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 670 GLHelper* gl_helper = factory->GetGLHelper(); | 670 GLHelper* gl_helper = factory->GetGLHelper(); |
| 671 if (!gl_helper) | 671 if (!gl_helper) |
| 672 return; | 672 return; |
| 673 | 673 |
| 674 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock( | 674 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock( |
| 675 new SkAutoLockPixels(*bitmap)); | 675 new SkAutoLockPixels(*bitmap)); |
| 676 uint8* pixels = static_cast<uint8*>(bitmap->getPixels()); | 676 uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); |
| 677 | 677 |
| 678 cc::TextureMailbox texture_mailbox; | 678 cc::TextureMailbox texture_mailbox; |
| 679 scoped_ptr<cc::SingleReleaseCallback> release_callback; | 679 scoped_ptr<cc::SingleReleaseCallback> release_callback; |
| 680 result->TakeTexture(&texture_mailbox, &release_callback); | 680 result->TakeTexture(&texture_mailbox, &release_callback); |
| 681 DCHECK(texture_mailbox.IsTexture()); | 681 DCHECK(texture_mailbox.IsTexture()); |
| 682 | 682 |
| 683 ignore_result(scoped_callback_runner.Release()); | 683 ignore_result(scoped_callback_runner.Release()); |
| 684 | 684 |
| 685 gl_helper->CropScaleReadbackAndCleanMailbox( | 685 gl_helper->CropScaleReadbackAndCleanMailbox( |
| 686 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), | 686 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 region_in_frame.width(), | 829 region_in_frame.width(), |
| 830 region_in_frame.height()); | 830 region_in_frame.height()); |
| 831 } else { | 831 } else { |
| 832 scaled_bitmap = *bitmap.get(); | 832 scaled_bitmap = *bitmap.get(); |
| 833 } | 833 } |
| 834 | 834 |
| 835 { | 835 { |
| 836 SkAutoLockPixels scaled_bitmap_locker(scaled_bitmap); | 836 SkAutoLockPixels scaled_bitmap_locker(scaled_bitmap); |
| 837 | 837 |
| 838 media::CopyRGBToVideoFrame( | 838 media::CopyRGBToVideoFrame( |
| 839 reinterpret_cast<uint8*>(scaled_bitmap.getPixels()), | 839 reinterpret_cast<uint8_t*>(scaled_bitmap.getPixels()), |
| 840 scaled_bitmap.rowBytes(), | 840 scaled_bitmap.rowBytes(), region_in_frame, video_frame.get()); |
| 841 region_in_frame, | |
| 842 video_frame.get()); | |
| 843 } | 841 } |
| 844 ignore_result(scoped_callback_runner.Release()); | 842 ignore_result(scoped_callback_runner.Release()); |
| 845 callback.Run(region_in_frame, true); | 843 callback.Run(region_in_frame, true); |
| 846 return; | 844 return; |
| 847 } | 845 } |
| 848 | 846 |
| 849 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 847 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 850 GLHelper* gl_helper = factory->GetGLHelper(); | 848 GLHelper* gl_helper = factory->GetGLHelper(); |
| 851 if (!gl_helper) | 849 if (!gl_helper) |
| 852 return; | 850 return; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1076 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 1079 new_layer->SetShowSurface( | 1077 new_layer->SetShowSurface( |
| 1080 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1078 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| 1081 base::Bind(&RequireCallback, base::Unretained(manager)), | 1079 base::Bind(&RequireCallback, base::Unretained(manager)), |
| 1082 current_surface_size_, current_scale_factor_, | 1080 current_surface_size_, current_scale_factor_, |
| 1083 current_frame_size_in_dip_); | 1081 current_frame_size_in_dip_); |
| 1084 } | 1082 } |
| 1085 } | 1083 } |
| 1086 | 1084 |
| 1087 } // namespace content | 1085 } // namespace content |
| OLD | NEW |