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/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> |
11 | 11 |
12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/time/default_tick_clock.h" | 14 #include "base/time/default_tick_clock.h" |
15 #include "cc/output/compositor_frame.h" | 15 #include "cc/output/compositor_frame.h" |
16 #include "cc/output/compositor_frame_ack.h" | 16 #include "cc/output/compositor_frame_ack.h" |
17 #include "cc/output/copy_output_request.h" | 17 #include "cc/output/copy_output_request.h" |
18 #include "cc/resources/single_release_callback.h" | 18 #include "cc/resources/single_release_callback.h" |
19 #include "cc/resources/texture_mailbox.h" | 19 #include "cc/resources/texture_mailbox.h" |
20 #include "cc/surfaces/surface.h" | 20 #include "cc/surfaces/surface.h" |
21 #include "cc/surfaces/surface_factory.h" | 21 #include "cc/surfaces/surface_factory.h" |
22 #include "cc/surfaces/surface_hittest.h" | 22 #include "cc/surfaces/surface_hittest.h" |
23 #include "cc/surfaces/surface_manager.h" | 23 #include "cc/surfaces/surface_manager.h" |
24 #include "content/browser/compositor/gl_helper.h" | 24 #include "content/browser/compositor/gl_helper.h" |
25 #include "content/browser/compositor/resize_lock.h" | |
26 #include "content/browser/compositor/surface_utils.h" | 25 #include "content/browser/compositor/surface_utils.h" |
27 #include "content/browser/gpu/compositor_util.h" | 26 #include "content/browser/gpu/compositor_util.h" |
| 27 #include "content/browser/renderer_host/resize_lock.h" |
28 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" | 28 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" |
29 #include "content/public/common/content_switches.h" | 29 #include "content/public/common/content_switches.h" |
30 #include "media/base/video_frame.h" | 30 #include "media/base/video_frame.h" |
31 #include "media/base/video_util.h" | 31 #include "media/base/video_util.h" |
32 #include "skia/ext/image_operations.h" | 32 #include "skia/ext/image_operations.h" |
33 #include "third_party/skia/include/core/SkCanvas.h" | 33 #include "third_party/skia/include/core/SkCanvas.h" |
34 #include "third_party/skia/include/core/SkPaint.h" | 34 #include "third_party/skia/include/core/SkPaint.h" |
35 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 35 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
36 #include "ui/gfx/geometry/dip_util.h" | 36 #include "ui/gfx/geometry/dip_util.h" |
37 | 37 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 77 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
78 factory->AddObserver(this); | 78 factory->AddObserver(this); |
79 id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator(); | 79 id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator(); |
80 factory->GetSurfaceManager()->RegisterSurfaceFactoryClient( | 80 factory->GetSurfaceManager()->RegisterSurfaceFactoryClient( |
81 id_allocator_->id_namespace(), this); | 81 id_allocator_->id_namespace(), this); |
82 } | 82 } |
83 | 83 |
84 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { | 84 void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
85 delegated_frame_evictor_->SetVisible(true); | 85 delegated_frame_evictor_->SetVisible(true); |
86 | 86 |
87 if (surface_id_.is_null() && | 87 if (surface_id_.is_null() && !released_front_lock_.get()) { |
88 !released_front_lock_.get()) { | |
89 if (compositor_) | 88 if (compositor_) |
90 released_front_lock_ = compositor_->GetCompositorLock(); | 89 released_front_lock_ = compositor_->GetCompositorLock(); |
91 } | 90 } |
92 | 91 |
93 if (compositor_) { | 92 if (compositor_) { |
94 compositor_->SetLatencyInfo(latency_info); | 93 compositor_->SetLatencyInfo(latency_info); |
95 } | 94 } |
96 } | 95 } |
97 | 96 |
98 bool DelegatedFrameHost::HasSavedFrame() { | 97 bool DelegatedFrameHost::HasSavedFrame() { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 const gfx::Rect& src_subrect, | 164 const gfx::Rect& src_subrect, |
166 const scoped_refptr<media::VideoFrame>& target, | 165 const scoped_refptr<media::VideoFrame>& target, |
167 const base::Callback<void(const gfx::Rect&, bool)>& callback) { | 166 const base::Callback<void(const gfx::Rect&, bool)>& callback) { |
168 if (!CanCopyToVideoFrame()) { | 167 if (!CanCopyToVideoFrame()) { |
169 callback.Run(gfx::Rect(), false); | 168 callback.Run(gfx::Rect(), false); |
170 return; | 169 return; |
171 } | 170 } |
172 | 171 |
173 scoped_ptr<cc::CopyOutputRequest> request = | 172 scoped_ptr<cc::CopyOutputRequest> request = |
174 cc::CopyOutputRequest::CreateRequest(base::Bind( | 173 cc::CopyOutputRequest::CreateRequest(base::Bind( |
175 &DelegatedFrameHost:: | 174 &DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo, |
176 CopyFromCompositingSurfaceHasResultForVideo, | |
177 AsWeakPtr(), // For caching the ReadbackYUVInterface on this class. | 175 AsWeakPtr(), // For caching the ReadbackYUVInterface on this class. |
178 nullptr, | 176 nullptr, target, callback)); |
179 target, | |
180 callback)); | |
181 request->set_area(src_subrect); | 177 request->set_area(src_subrect); |
182 RequestCopyOfOutput(std::move(request)); | 178 RequestCopyOfOutput(std::move(request)); |
183 } | 179 } |
184 | 180 |
185 bool DelegatedFrameHost::CanCopyToBitmap() const { | 181 bool DelegatedFrameHost::CanCopyToBitmap() const { |
186 return compositor_ && | 182 return compositor_ && |
187 client_->DelegatedFrameHostGetLayer()->has_external_content(); | 183 client_->DelegatedFrameHostGetLayer()->has_external_content(); |
188 } | 184 } |
189 | 185 |
190 bool DelegatedFrameHost::CanCopyToVideoFrame() const { | 186 bool DelegatedFrameHost::CanCopyToVideoFrame() const { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 transform.GetInverse(&transform)) { | 233 transform.GetInverse(&transform)) { |
238 transform.TransformPoint(transformed_point); | 234 transform.TransformPoint(transformed_point); |
239 } | 235 } |
240 } | 236 } |
241 | 237 |
242 bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { | 238 bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { |
243 // Should skip a frame only when another frame from the renderer is guaranteed | 239 // Should skip a frame only when another frame from the renderer is guaranteed |
244 // to replace it. Otherwise may cause hangs when the renderer is waiting for | 240 // to replace it. Otherwise may cause hangs when the renderer is waiting for |
245 // the completion of latency infos (such as when taking a Snapshot.) | 241 // the completion of latency infos (such as when taking a Snapshot.) |
246 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || | 242 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || |
247 can_lock_compositor_ == NO_PENDING_COMMIT || | 243 can_lock_compositor_ == NO_PENDING_COMMIT || !resize_lock_.get()) |
248 !resize_lock_.get()) | |
249 return false; | 244 return false; |
250 | 245 |
251 return size_in_dip != resize_lock_->expected_size(); | 246 return size_in_dip != resize_lock_->expected_size(); |
252 } | 247 } |
253 | 248 |
254 void DelegatedFrameHost::WasResized() { | 249 void DelegatedFrameHost::WasResized() { |
255 if (client_->DelegatedFrameHostDesiredSizeInDIP() != | 250 if (client_->DelegatedFrameHostDesiredSizeInDIP() != |
256 current_frame_size_in_dip_ && | 251 current_frame_size_in_dip_ && |
257 !client_->DelegatedFrameHostIsVisible()) | 252 !client_->DelegatedFrameHostIsVisible()) |
258 EvictDelegatedFrame(); | 253 EvictDelegatedFrame(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 base::TimeTicks present_time; | 320 base::TimeTicks present_time; |
326 if (vsync_interval_ <= base::TimeDelta()) { | 321 if (vsync_interval_ <= base::TimeDelta()) { |
327 present_time = now; | 322 present_time = now; |
328 } else { | 323 } else { |
329 const int64_t intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; | 324 const int64_t intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
330 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; | 325 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_; |
331 } | 326 } |
332 | 327 |
333 scoped_refptr<media::VideoFrame> frame; | 328 scoped_refptr<media::VideoFrame> frame; |
334 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 329 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
335 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, | 330 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, &frame, |
336 &frame, &callback)) | 331 &callback)) |
337 return; | 332 return; |
338 | 333 |
339 // Get a texture to re-use; else, create a new one. | 334 // Get a texture to re-use; else, create a new one. |
340 scoped_refptr<OwnedMailbox> subscriber_texture; | 335 scoped_refptr<OwnedMailbox> subscriber_texture; |
341 if (!idle_frame_subscriber_textures_.empty()) { | 336 if (!idle_frame_subscriber_textures_.empty()) { |
342 subscriber_texture = idle_frame_subscriber_textures_.back(); | 337 subscriber_texture = idle_frame_subscriber_textures_.back(); |
343 idle_frame_subscriber_textures_.pop_back(); | 338 idle_frame_subscriber_textures_.pop_back(); |
344 } else if (GLHelper* helper = | 339 } else if (GLHelper* helper = |
345 ImageTransportFactory::GetInstance()->GetGLHelper()) { | 340 ImageTransportFactory::GetInstance()->GetGLHelper()) { |
346 subscriber_texture = new OwnedMailbox(helper); | 341 subscriber_texture = new OwnedMailbox(helper); |
347 } | 342 } |
348 | 343 |
349 scoped_ptr<cc::CopyOutputRequest> request = | 344 scoped_ptr<cc::CopyOutputRequest> request = |
350 cc::CopyOutputRequest::CreateRequest(base::Bind( | 345 cc::CopyOutputRequest::CreateRequest(base::Bind( |
351 &DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo, | 346 &DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo, |
352 AsWeakPtr(), | 347 AsWeakPtr(), subscriber_texture, frame, |
353 subscriber_texture, | |
354 frame, | |
355 base::Bind(callback, present_time))); | 348 base::Bind(callback, present_time))); |
356 // Setting the source in this copy request asks that the layer abort any prior | 349 // Setting the source in this copy request asks that the layer abort any prior |
357 // uncommitted copy requests made on behalf of the same frame subscriber. | 350 // uncommitted copy requests made on behalf of the same frame subscriber. |
358 // This will not affect any of the copy requests spawned elsewhere from | 351 // This will not affect any of the copy requests spawned elsewhere from |
359 // DelegatedFrameHost (e.g., a call to CopyFromCompositingSurface() for | 352 // DelegatedFrameHost (e.g., a call to CopyFromCompositingSurface() for |
360 // screenshots) since those copy requests do not specify |frame_subscriber()| | 353 // screenshots) since those copy requests do not specify |frame_subscriber()| |
361 // as a source. | 354 // as a source. |
362 request->set_source(frame_subscriber()); | 355 request->set_source(frame_subscriber()); |
363 if (subscriber_texture.get()) { | 356 if (subscriber_texture.get()) { |
364 request->SetTextureMailbox(cc::TextureMailbox( | 357 request->SetTextureMailbox(cc::TextureMailbox( |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 | 438 |
446 background_color_ = frame->metadata.root_background_color; | 439 background_color_ = frame->metadata.root_background_color; |
447 | 440 |
448 if (frame_size.IsEmpty()) { | 441 if (frame_size.IsEmpty()) { |
449 DCHECK(frame_data->resource_list.empty()); | 442 DCHECK(frame_data->resource_list.empty()); |
450 EvictDelegatedFrame(); | 443 EvictDelegatedFrame(); |
451 } else { | 444 } else { |
452 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 445 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
453 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 446 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
454 if (!surface_factory_) { | 447 if (!surface_factory_) { |
455 surface_factory_ = | 448 surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); |
456 make_scoped_ptr(new cc::SurfaceFactory(manager, this)); | |
457 } | 449 } |
458 if (surface_id_.is_null() || frame_size != current_surface_size_ || | 450 if (surface_id_.is_null() || frame_size != current_surface_size_ || |
459 frame_size_in_dip != current_frame_size_in_dip_) { | 451 frame_size_in_dip != current_frame_size_in_dip_) { |
460 if (!surface_id_.is_null()) | 452 if (!surface_id_.is_null()) |
461 surface_factory_->Destroy(surface_id_); | 453 surface_factory_->Destroy(surface_id_); |
462 surface_id_ = id_allocator_->GenerateId(); | 454 surface_id_ = id_allocator_->GenerateId(); |
463 surface_factory_->Create(surface_id_); | 455 surface_factory_->Create(surface_id_); |
464 // manager must outlive compositors using it. | 456 // manager must outlive compositors using it. |
465 client_->DelegatedFrameHostGetLayer()->SetShowSurface( | 457 client_->DelegatedFrameHostGetLayer()->SetShowSurface( |
466 surface_id_, | 458 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
467 base::Bind(&SatisfyCallback, base::Unretained(manager)), | |
468 base::Bind(&RequireCallback, base::Unretained(manager)), frame_size, | 459 base::Bind(&RequireCallback, base::Unretained(manager)), frame_size, |
469 frame_device_scale_factor, frame_size_in_dip); | 460 frame_device_scale_factor, frame_size_in_dip); |
470 current_surface_size_ = frame_size; | 461 current_surface_size_ = frame_size; |
471 current_scale_factor_ = frame_device_scale_factor; | 462 current_scale_factor_ = frame_device_scale_factor; |
472 } | 463 } |
473 | 464 |
474 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), | 465 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), |
475 skipped_latency_info_list_.begin(), | 466 skipped_latency_info_list_.begin(), |
476 skipped_latency_info_list_.end()); | 467 skipped_latency_info_list_.end()); |
477 skipped_latency_info_list_.clear(); | 468 skipped_latency_info_list_.clear(); |
478 | 469 |
479 gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); | 470 gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); |
480 if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) | 471 if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) |
481 skip_frame = true; | 472 skip_frame = true; |
482 | 473 |
483 cc::SurfaceFactory::DrawCallback ack_callback; | 474 cc::SurfaceFactory::DrawCallback ack_callback; |
484 if (compositor_ && !skip_frame) { | 475 if (compositor_ && !skip_frame) { |
485 ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, | 476 ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(), |
486 AsWeakPtr(), output_surface_id); | 477 output_surface_id); |
487 } | 478 } |
488 surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), | 479 surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), |
489 ack_callback); | 480 ack_callback); |
490 } | 481 } |
491 released_front_lock_ = NULL; | 482 released_front_lock_ = NULL; |
492 current_frame_size_in_dip_ = frame_size_in_dip; | 483 current_frame_size_in_dip_ = frame_size_in_dip; |
493 CheckResizeLock(); | 484 CheckResizeLock(); |
494 | 485 |
495 UpdateGutters(); | 486 UpdateGutters(); |
496 | 487 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 ack.resources.swap(surface_returned_resources_); | 528 ack.resources.swap(surface_returned_resources_); |
538 | 529 |
539 client_->DelegatedFrameHostSendReclaimCompositorResources(output_surface_id, | 530 client_->DelegatedFrameHostSendReclaimCompositorResources(output_surface_id, |
540 ack); | 531 ack); |
541 } | 532 } |
542 | 533 |
543 void DelegatedFrameHost::ReturnResources( | 534 void DelegatedFrameHost::ReturnResources( |
544 const cc::ReturnedResourceArray& resources) { | 535 const cc::ReturnedResourceArray& resources) { |
545 if (resources.empty()) | 536 if (resources.empty()) |
546 return; | 537 return; |
547 std::copy(resources.begin(), | 538 std::copy(resources.begin(), resources.end(), |
548 resources.end(), | |
549 std::back_inserter(surface_returned_resources_)); | 539 std::back_inserter(surface_returned_resources_)); |
550 if (!pending_delegated_ack_count_) | 540 if (!pending_delegated_ack_count_) |
551 SendReturnedDelegatedResources(last_output_surface_id_); | 541 SendReturnedDelegatedResources(last_output_surface_id_); |
552 } | 542 } |
553 | 543 |
554 void DelegatedFrameHost::WillDrawSurface(cc::SurfaceId id, | 544 void DelegatedFrameHost::WillDrawSurface(cc::SurfaceId id, |
555 const gfx::Rect& damage_rect) { | 545 const gfx::Rect& damage_rect) { |
556 if (id != surface_id_) | 546 if (id != surface_id_) |
557 return; | 547 return; |
558 AttemptFrameSubscriberCapture(damage_rect); | 548 AttemptFrameSubscriberCapture(damage_rect); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 | 606 |
617 // static | 607 // static |
618 void DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo( | 608 void DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo( |
619 base::WeakPtr<DelegatedFrameHost> dfh, | 609 base::WeakPtr<DelegatedFrameHost> dfh, |
620 scoped_refptr<OwnedMailbox> subscriber_texture, | 610 scoped_refptr<OwnedMailbox> subscriber_texture, |
621 scoped_refptr<media::VideoFrame> video_frame, | 611 scoped_refptr<media::VideoFrame> video_frame, |
622 const base::Callback<void(const gfx::Rect&, bool)>& callback, | 612 const base::Callback<void(const gfx::Rect&, bool)>& callback, |
623 scoped_ptr<cc::CopyOutputResult> result) { | 613 scoped_ptr<cc::CopyOutputResult> result) { |
624 base::ScopedClosureRunner scoped_callback_runner( | 614 base::ScopedClosureRunner scoped_callback_runner( |
625 base::Bind(callback, gfx::Rect(), false)); | 615 base::Bind(callback, gfx::Rect(), false)); |
626 base::ScopedClosureRunner scoped_return_subscriber_texture( | 616 base::ScopedClosureRunner scoped_return_subscriber_texture(base::Bind( |
627 base::Bind(&ReturnSubscriberTexture, dfh, subscriber_texture, | 617 &ReturnSubscriberTexture, dfh, subscriber_texture, gpu::SyncToken())); |
628 gpu::SyncToken())); | |
629 | 618 |
630 if (!dfh) | 619 if (!dfh) |
631 return; | 620 return; |
632 if (result->IsEmpty()) | 621 if (result->IsEmpty()) |
633 return; | 622 return; |
634 if (result->size().IsEmpty()) | 623 if (result->size().IsEmpty()) |
635 return; | 624 return; |
636 | 625 |
637 // Compute the dest size we want after the letterboxing resize. Make the | 626 // Compute the dest size we want after the letterboxing resize. Make the |
638 // coordinates and sizes even because we letterbox in YUV space | 627 // coordinates and sizes even because we letterbox in YUV space |
639 // (see CopyRGBToVideoFrame). They need to be even for the UV samples to | 628 // (see CopyRGBToVideoFrame). They need to be even for the UV samples to |
640 // line up correctly. | 629 // line up correctly. |
641 // The video frame's visible_rect() and the result's size() are both physical | 630 // The video frame's visible_rect() and the result's size() are both physical |
642 // pixels. | 631 // pixels. |
643 gfx::Rect region_in_frame = media::ComputeLetterboxRegion( | 632 gfx::Rect region_in_frame = media::ComputeLetterboxRegion( |
644 video_frame->visible_rect(), result->size()); | 633 video_frame->visible_rect(), result->size()); |
645 region_in_frame = gfx::Rect(region_in_frame.x() & ~1, | 634 region_in_frame = |
646 region_in_frame.y() & ~1, | 635 gfx::Rect(region_in_frame.x() & ~1, region_in_frame.y() & ~1, |
647 region_in_frame.width() & ~1, | 636 region_in_frame.width() & ~1, region_in_frame.height() & ~1); |
648 region_in_frame.height() & ~1); | |
649 if (region_in_frame.IsEmpty()) | 637 if (region_in_frame.IsEmpty()) |
650 return; | 638 return; |
651 | 639 |
652 if (!result->HasTexture()) { | 640 if (!result->HasTexture()) { |
653 DCHECK(result->HasBitmap()); | 641 DCHECK(result->HasBitmap()); |
654 scoped_ptr<SkBitmap> bitmap = result->TakeBitmap(); | 642 scoped_ptr<SkBitmap> bitmap = result->TakeBitmap(); |
655 // Scale the bitmap to the required size, if necessary. | 643 // Scale the bitmap to the required size, if necessary. |
656 SkBitmap scaled_bitmap; | 644 SkBitmap scaled_bitmap; |
657 if (result->size() != region_in_frame.size()) { | 645 if (result->size() != region_in_frame.size()) { |
658 skia::ImageOperations::ResizeMethod method = | 646 skia::ImageOperations::ResizeMethod method = |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 std::string switch_value = | 694 std::string switch_value = |
707 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 695 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
708 quality_switch); | 696 quality_switch); |
709 if (switch_value == "fast") | 697 if (switch_value == "fast") |
710 quality = GLHelper::SCALER_QUALITY_FAST; | 698 quality = GLHelper::SCALER_QUALITY_FAST; |
711 else if (switch_value == "good") | 699 else if (switch_value == "good") |
712 quality = GLHelper::SCALER_QUALITY_GOOD; | 700 quality = GLHelper::SCALER_QUALITY_GOOD; |
713 else if (switch_value == "best") | 701 else if (switch_value == "best") |
714 quality = GLHelper::SCALER_QUALITY_BEST; | 702 quality = GLHelper::SCALER_QUALITY_BEST; |
715 | 703 |
716 dfh->yuv_readback_pipeline_.reset( | 704 dfh->yuv_readback_pipeline_.reset(gl_helper->CreateReadbackPipelineYUV( |
717 gl_helper->CreateReadbackPipelineYUV(quality, | 705 quality, result_rect.size(), result_rect, region_in_frame.size(), true, |
718 result_rect.size(), | 706 true)); |
719 result_rect, | |
720 region_in_frame.size(), | |
721 true, | |
722 true)); | |
723 yuv_readback_pipeline = dfh->yuv_readback_pipeline_.get(); | 707 yuv_readback_pipeline = dfh->yuv_readback_pipeline_.get(); |
724 } | 708 } |
725 | 709 |
726 ignore_result(scoped_callback_runner.Release()); | 710 ignore_result(scoped_callback_runner.Release()); |
727 ignore_result(scoped_return_subscriber_texture.Release()); | 711 ignore_result(scoped_return_subscriber_texture.Release()); |
728 | 712 |
729 base::Callback<void(bool result)> finished_callback = base::Bind( | 713 base::Callback<void(bool result)> finished_callback = base::Bind( |
730 &DelegatedFrameHost::CopyFromCompositingSurfaceFinishedForVideo, | 714 &DelegatedFrameHost::CopyFromCompositingSurfaceFinishedForVideo, |
731 dfh->AsWeakPtr(), base::Bind(callback, region_in_frame), | 715 dfh->AsWeakPtr(), base::Bind(callback, region_in_frame), |
732 subscriber_texture, base::Passed(&release_callback)); | 716 subscriber_texture, base::Passed(&release_callback)); |
733 yuv_readback_pipeline->ReadbackYUV(texture_mailbox.mailbox(), | 717 yuv_readback_pipeline->ReadbackYUV( |
734 texture_mailbox.sync_token(), | 718 texture_mailbox.mailbox(), texture_mailbox.sync_token(), |
735 video_frame.get(), | 719 video_frame.get(), region_in_frame.origin(), finished_callback); |
736 region_in_frame.origin(), | |
737 finished_callback); | |
738 } | 720 } |
739 | 721 |
740 //////////////////////////////////////////////////////////////////////////////// | 722 //////////////////////////////////////////////////////////////////////////////// |
741 // DelegatedFrameHost, ui::CompositorObserver implementation: | 723 // DelegatedFrameHost, ui::CompositorObserver implementation: |
742 | 724 |
743 void DelegatedFrameHost::OnCompositingDidCommit( | 725 void DelegatedFrameHost::OnCompositingDidCommit(ui::Compositor* compositor) { |
744 ui::Compositor* compositor) { | |
745 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 726 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
746 can_lock_compositor_ = YES_CAN_LOCK; | 727 can_lock_compositor_ = YES_CAN_LOCK; |
747 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 728 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
748 can_lock_compositor_ = YES_DID_LOCK; | 729 can_lock_compositor_ = YES_DID_LOCK; |
749 } | 730 } |
750 if (resize_lock_ && | 731 if (resize_lock_ && |
751 resize_lock_->expected_size() == current_frame_size_in_dip_) { | 732 resize_lock_->expected_size() == current_frame_size_in_dip_) { |
752 resize_lock_.reset(); | 733 resize_lock_.reset(); |
753 client_->DelegatedFrameHostResizeLockWasReleased(); | 734 client_->DelegatedFrameHostResizeLockWasReleased(); |
754 // We may have had a resize while we had the lock (e.g. if the lock expired, | 735 // We may have had a resize while we had the lock (e.g. if the lock expired, |
755 // or if the UI still gave us some resizes), so make sure we grab a new lock | 736 // or if the UI still gave us some resizes), so make sure we grab a new lock |
756 // if necessary. | 737 // if necessary. |
757 MaybeCreateResizeLock(); | 738 MaybeCreateResizeLock(); |
758 } | 739 } |
759 } | 740 } |
760 | 741 |
761 void DelegatedFrameHost::OnCompositingStarted( | 742 void DelegatedFrameHost::OnCompositingStarted(ui::Compositor* compositor, |
762 ui::Compositor* compositor, base::TimeTicks start_time) { | 743 base::TimeTicks start_time) { |
763 last_draw_ended_ = start_time; | 744 last_draw_ended_ = start_time; |
764 } | 745 } |
765 | 746 |
766 void DelegatedFrameHost::OnCompositingEnded( | 747 void DelegatedFrameHost::OnCompositingEnded(ui::Compositor* compositor) {} |
767 ui::Compositor* compositor) { | |
768 } | |
769 | 748 |
770 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) { | 749 void DelegatedFrameHost::OnCompositingAborted(ui::Compositor* compositor) {} |
771 } | |
772 | 750 |
773 void DelegatedFrameHost::OnCompositingLockStateChanged( | 751 void DelegatedFrameHost::OnCompositingLockStateChanged( |
774 ui::Compositor* compositor) { | 752 ui::Compositor* compositor) { |
775 // A compositor lock that is part of a resize lock timed out. We | 753 // A compositor lock that is part of a resize lock timed out. We |
776 // should display a renderer frame. | 754 // should display a renderer frame. |
777 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { | 755 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { |
778 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; | 756 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; |
779 } | 757 } |
780 } | 758 } |
781 | 759 |
782 void DelegatedFrameHost::OnCompositingShuttingDown(ui::Compositor* compositor) { | 760 void DelegatedFrameHost::OnCompositingShuttingDown(ui::Compositor* compositor) { |
783 DCHECK_EQ(compositor, compositor_); | 761 DCHECK_EQ(compositor, compositor_); |
784 ResetCompositor(); | 762 ResetCompositor(); |
785 DCHECK(!compositor_); | 763 DCHECK(!compositor_); |
786 } | 764 } |
787 | 765 |
788 void DelegatedFrameHost::OnUpdateVSyncParameters( | 766 void DelegatedFrameHost::OnUpdateVSyncParameters(base::TimeTicks timebase, |
789 base::TimeTicks timebase, | 767 base::TimeDelta interval) { |
790 base::TimeDelta interval) { | |
791 SetVSyncParameters(timebase, interval); | 768 SetVSyncParameters(timebase, interval); |
792 if (client_->DelegatedFrameHostIsVisible()) | 769 if (client_->DelegatedFrameHostIsVisible()) |
793 client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval); | 770 client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval); |
794 } | 771 } |
795 | 772 |
796 //////////////////////////////////////////////////////////////////////////////// | 773 //////////////////////////////////////////////////////////////////////////////// |
797 // DelegatedFrameHost, ImageTransportFactoryObserver implementation: | 774 // DelegatedFrameHost, ImageTransportFactoryObserver implementation: |
798 | 775 |
799 void DelegatedFrameHost::OnLostResources() { | 776 void DelegatedFrameHost::OnLostResources() { |
800 if (!surface_id_.is_null()) | 777 if (!surface_id_.is_null()) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 | 859 |
883 void DelegatedFrameHost::UnlockResources() { | 860 void DelegatedFrameHost::UnlockResources() { |
884 DCHECK(!surface_id_.is_null()); | 861 DCHECK(!surface_id_.is_null()); |
885 delegated_frame_evictor_->UnlockFrame(); | 862 delegated_frame_evictor_->UnlockFrame(); |
886 } | 863 } |
887 | 864 |
888 //////////////////////////////////////////////////////////////////////////////// | 865 //////////////////////////////////////////////////////////////////////////////// |
889 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: | 866 // DelegatedFrameHost, ui::LayerOwnerDelegate implementation: |
890 | 867 |
891 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, | 868 void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, |
892 ui::Layer* new_layer) { | 869 ui::Layer* new_layer) { |
893 // The new_layer is the one that will be used by our Window, so that's the one | 870 // The new_layer is the one that will be used by our Window, so that's the one |
894 // that should keep our frame. old_layer will be returned to the | 871 // that should keep our frame. old_layer will be returned to the |
895 // RecreateLayer caller, and should have a copy. | 872 // RecreateLayer caller, and should have a copy. |
896 if (!surface_id_.is_null()) { | 873 if (!surface_id_.is_null()) { |
897 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 874 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
898 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 875 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
899 new_layer->SetShowSurface( | 876 new_layer->SetShowSurface( |
900 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 877 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
901 base::Bind(&RequireCallback, base::Unretained(manager)), | 878 base::Bind(&RequireCallback, base::Unretained(manager)), |
902 current_surface_size_, current_scale_factor_, | 879 current_surface_size_, current_scale_factor_, |
903 current_frame_size_in_dip_); | 880 current_frame_size_in_dip_); |
904 } | 881 } |
905 } | 882 } |
906 | 883 |
907 } // namespace content | 884 } // namespace content |
OLD | NEW |