| 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 callback.Run(SkBitmap(), content::READBACK_SURFACE_UNAVAILABLE); | 148 callback.Run(SkBitmap(), content::READBACK_SURFACE_UNAVAILABLE); |
| 149 return; | 149 return; |
| 150 } | 150 } |
| 151 | 151 |
| 152 scoped_ptr<cc::CopyOutputRequest> request = | 152 scoped_ptr<cc::CopyOutputRequest> request = |
| 153 cc::CopyOutputRequest::CreateRequest( | 153 cc::CopyOutputRequest::CreateRequest( |
| 154 base::Bind(&DelegatedFrameHost::CopyFromCompositingSurfaceHasResult, | 154 base::Bind(&DelegatedFrameHost::CopyFromCompositingSurfaceHasResult, |
| 155 output_size, preferred_color_type, callback)); | 155 output_size, preferred_color_type, callback)); |
| 156 if (!src_subrect.IsEmpty()) | 156 if (!src_subrect.IsEmpty()) |
| 157 request->set_area(src_subrect); | 157 request->set_area(src_subrect); |
| 158 RequestCopyOfOutput(request.Pass()); | 158 RequestCopyOfOutput(std::move(request)); |
| 159 } | 159 } |
| 160 | 160 |
| 161 void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame( | 161 void DelegatedFrameHost::CopyFromCompositingSurfaceToVideoFrame( |
| 162 const gfx::Rect& src_subrect, | 162 const gfx::Rect& src_subrect, |
| 163 const scoped_refptr<media::VideoFrame>& target, | 163 const scoped_refptr<media::VideoFrame>& target, |
| 164 const base::Callback<void(const gfx::Rect&, bool)>& callback) { | 164 const base::Callback<void(const gfx::Rect&, bool)>& callback) { |
| 165 if (!CanCopyToVideoFrame()) { | 165 if (!CanCopyToVideoFrame()) { |
| 166 callback.Run(gfx::Rect(), false); | 166 callback.Run(gfx::Rect(), false); |
| 167 return; | 167 return; |
| 168 } | 168 } |
| 169 | 169 |
| 170 scoped_ptr<cc::CopyOutputRequest> request = | 170 scoped_ptr<cc::CopyOutputRequest> request = |
| 171 cc::CopyOutputRequest::CreateRequest(base::Bind( | 171 cc::CopyOutputRequest::CreateRequest(base::Bind( |
| 172 &DelegatedFrameHost:: | 172 &DelegatedFrameHost:: |
| 173 CopyFromCompositingSurfaceHasResultForVideo, | 173 CopyFromCompositingSurfaceHasResultForVideo, |
| 174 AsWeakPtr(), // For caching the ReadbackYUVInterface on this class. | 174 AsWeakPtr(), // For caching the ReadbackYUVInterface on this class. |
| 175 nullptr, | 175 nullptr, |
| 176 target, | 176 target, |
| 177 callback)); | 177 callback)); |
| 178 request->set_area(src_subrect); | 178 request->set_area(src_subrect); |
| 179 RequestCopyOfOutput(request.Pass()); | 179 RequestCopyOfOutput(std::move(request)); |
| 180 } | 180 } |
| 181 | 181 |
| 182 bool DelegatedFrameHost::CanCopyToBitmap() const { | 182 bool DelegatedFrameHost::CanCopyToBitmap() const { |
| 183 return compositor_ && | 183 return compositor_ && |
| 184 client_->DelegatedFrameHostGetLayer()->has_external_content(); | 184 client_->DelegatedFrameHostGetLayer()->has_external_content(); |
| 185 } | 185 } |
| 186 | 186 |
| 187 bool DelegatedFrameHost::CanCopyToVideoFrame() const { | 187 bool DelegatedFrameHost::CanCopyToVideoFrame() const { |
| 188 return compositor_ && | 188 return compositor_ && |
| 189 client_->DelegatedFrameHostGetLayer()->has_external_content(); | 189 client_->DelegatedFrameHostGetLayer()->has_external_content(); |
| 190 } | 190 } |
| 191 | 191 |
| 192 void DelegatedFrameHost::BeginFrameSubscription( | 192 void DelegatedFrameHost::BeginFrameSubscription( |
| 193 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { | 193 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { |
| 194 frame_subscriber_ = subscriber.Pass(); | 194 frame_subscriber_ = std::move(subscriber); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void DelegatedFrameHost::EndFrameSubscription() { | 197 void DelegatedFrameHost::EndFrameSubscription() { |
| 198 idle_frame_subscriber_textures_.clear(); | 198 idle_frame_subscriber_textures_.clear(); |
| 199 frame_subscriber_.reset(); | 199 frame_subscriber_.reset(); |
| 200 } | 200 } |
| 201 | 201 |
| 202 uint32_t DelegatedFrameHost::GetSurfaceIdNamespace() { | 202 uint32_t DelegatedFrameHost::GetSurfaceIdNamespace() { |
| 203 if (!use_surfaces_) | 203 if (!use_surfaces_) |
| 204 return 0; | 204 return 0; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 request->SetTextureMailbox(cc::TextureMailbox( | 324 request->SetTextureMailbox(cc::TextureMailbox( |
| 325 subscriber_texture->mailbox(), subscriber_texture->sync_token(), | 325 subscriber_texture->mailbox(), subscriber_texture->sync_token(), |
| 326 subscriber_texture->target())); | 326 subscriber_texture->target())); |
| 327 } | 327 } |
| 328 | 328 |
| 329 if (surface_factory_.get()) { | 329 if (surface_factory_.get()) { |
| 330 // To avoid unnecessary composites, go directly to the Surface rather than | 330 // To avoid unnecessary composites, go directly to the Surface rather than |
| 331 // through RequestCopyOfOutput (which goes through the browser | 331 // through RequestCopyOfOutput (which goes through the browser |
| 332 // compositor). | 332 // compositor). |
| 333 if (!request_copy_of_output_callback_for_testing_.is_null()) | 333 if (!request_copy_of_output_callback_for_testing_.is_null()) |
| 334 request_copy_of_output_callback_for_testing_.Run(request.Pass()); | 334 request_copy_of_output_callback_for_testing_.Run(std::move(request)); |
| 335 else | 335 else |
| 336 surface_factory_->RequestCopyOfSurface(surface_id_, request.Pass()); | 336 surface_factory_->RequestCopyOfSurface(surface_id_, std::move(request)); |
| 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(std::move(request)); |
| 340 } | 340 } |
| 341 } | 341 } |
| 342 | 342 |
| 343 void DelegatedFrameHost::SwapDelegatedFrame( | 343 void DelegatedFrameHost::SwapDelegatedFrame( |
| 344 uint32_t 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 |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 } | 604 } |
| 605 | 605 |
| 606 gfx::Size output_size_in_pixel; | 606 gfx::Size output_size_in_pixel; |
| 607 if (dst_size_in_pixel.IsEmpty()) | 607 if (dst_size_in_pixel.IsEmpty()) |
| 608 output_size_in_pixel = result->size(); | 608 output_size_in_pixel = result->size(); |
| 609 else | 609 else |
| 610 output_size_in_pixel = dst_size_in_pixel; | 610 output_size_in_pixel = dst_size_in_pixel; |
| 611 | 611 |
| 612 if (result->HasTexture()) { | 612 if (result->HasTexture()) { |
| 613 // GPU-accelerated path | 613 // GPU-accelerated path |
| 614 PrepareTextureCopyOutputResult(output_size_in_pixel, color_type, | 614 PrepareTextureCopyOutputResult(output_size_in_pixel, color_type, callback, |
| 615 callback, | 615 std::move(result)); |
| 616 result.Pass()); | |
| 617 return; | 616 return; |
| 618 } | 617 } |
| 619 | 618 |
| 620 DCHECK(result->HasBitmap()); | 619 DCHECK(result->HasBitmap()); |
| 621 // Software path | 620 // Software path |
| 622 PrepareBitmapCopyOutputResult(output_size_in_pixel, color_type, callback, | 621 PrepareBitmapCopyOutputResult(output_size_in_pixel, color_type, callback, |
| 623 result.Pass()); | 622 std::move(result)); |
| 624 } | 623 } |
| 625 | 624 |
| 626 static void CopyFromCompositingSurfaceFinished( | 625 static void CopyFromCompositingSurfaceFinished( |
| 627 const ReadbackRequestCallback& callback, | 626 const ReadbackRequestCallback& callback, |
| 628 scoped_ptr<cc::SingleReleaseCallback> release_callback, | 627 scoped_ptr<cc::SingleReleaseCallback> release_callback, |
| 629 scoped_ptr<SkBitmap> bitmap, | 628 scoped_ptr<SkBitmap> bitmap, |
| 630 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock, | 629 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock, |
| 631 bool result) { | 630 bool result) { |
| 632 bitmap_pixels_lock.reset(); | 631 bitmap_pixels_lock.reset(); |
| 633 | 632 |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 } | 1041 } |
| 1043 | 1042 |
| 1044 void DelegatedFrameHost::LockResources() { | 1043 void DelegatedFrameHost::LockResources() { |
| 1045 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1044 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
| 1046 delegated_frame_evictor_->LockFrame(); | 1045 delegated_frame_evictor_->LockFrame(); |
| 1047 } | 1046 } |
| 1048 | 1047 |
| 1049 void DelegatedFrameHost::RequestCopyOfOutput( | 1048 void DelegatedFrameHost::RequestCopyOfOutput( |
| 1050 scoped_ptr<cc::CopyOutputRequest> request) { | 1049 scoped_ptr<cc::CopyOutputRequest> request) { |
| 1051 if (!request_copy_of_output_callback_for_testing_.is_null()) | 1050 if (!request_copy_of_output_callback_for_testing_.is_null()) |
| 1052 request_copy_of_output_callback_for_testing_.Run(request.Pass()); | 1051 request_copy_of_output_callback_for_testing_.Run(std::move(request)); |
| 1053 else | 1052 else |
| 1054 client_->DelegatedFrameHostGetLayer()->RequestCopyOfOutput(request.Pass()); | 1053 client_->DelegatedFrameHostGetLayer()->RequestCopyOfOutput( |
| 1054 std::move(request)); |
| 1055 } | 1055 } |
| 1056 | 1056 |
| 1057 void DelegatedFrameHost::UnlockResources() { | 1057 void DelegatedFrameHost::UnlockResources() { |
| 1058 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 1058 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
| 1059 delegated_frame_evictor_->UnlockFrame(); | 1059 delegated_frame_evictor_->UnlockFrame(); |
| 1060 } | 1060 } |
| 1061 | 1061 |
| 1062 //////////////////////////////////////////////////////////////////////////////// | 1062 //////////////////////////////////////////////////////////////////////////////// |
| 1063 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: | 1063 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: |
| 1064 | 1064 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1076 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 1076 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
| 1077 new_layer->SetShowSurface( | 1077 new_layer->SetShowSurface( |
| 1078 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 1078 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| 1079 base::Bind(&RequireCallback, base::Unretained(manager)), | 1079 base::Bind(&RequireCallback, base::Unretained(manager)), |
| 1080 current_surface_size_, current_scale_factor_, | 1080 current_surface_size_, current_scale_factor_, |
| 1081 current_frame_size_in_dip_); | 1081 current_frame_size_in_dip_); |
| 1082 } | 1082 } |
| 1083 } | 1083 } |
| 1084 | 1084 |
| 1085 } // namespace content | 1085 } // namespace content |
| OLD | NEW |