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

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

Issue 418283003: "Buttery Smooth" Tab Capture. (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"
11 #include "cc/output/copy_output_request.h" 11 #include "cc/output/copy_output_request.h"
12 #include "cc/resources/single_release_callback.h" 12 #include "cc/resources/single_release_callback.h"
13 #include "cc/resources/texture_mailbox.h" 13 #include "cc/resources/texture_mailbox.h"
14 #include "content/browser/compositor/resize_lock.h" 14 #include "content/browser/compositor/resize_lock.h"
15 #include "content/common/gpu/client/gl_helper.h" 15 #include "content/common/gpu/client/gl_helper.h"
16 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" 16 #include "content/public/browser/render_widget_host_view_frame_subscriber.h"
17 #include "content/public/common/content_switches.h" 17 #include "content/public/common/content_switches.h"
18 #include "media/base/video_frame.h" 18 #include "media/base/video_frame.h"
19 #include "media/base/video_util.h" 19 #include "media/base/video_util.h"
20 #include "skia/ext/image_operations.h" 20 #include "skia/ext/image_operations.h"
21 #include "ui/gfx/frame_time.h"
21 22
22 namespace content { 23 namespace content {
23 24
24 //////////////////////////////////////////////////////////////////////////////// 25 ////////////////////////////////////////////////////////////////////////////////
25 // DelegatedFrameHostClient 26 // DelegatedFrameHostClient
26 27
27 bool DelegatedFrameHostClient::ShouldCreateResizeLock() { 28 bool DelegatedFrameHostClient::ShouldCreateResizeLock() {
28 // On Windows and Linux, holding pointer moves will not help throttling 29 // On Windows and Linux, holding pointer moves will not help throttling
29 // resizes. 30 // resizes.
30 // TODO(piman): on Windows we need to block (nested message loop?) the 31 // TODO(piman): on Windows we need to block (nested message loop?) the
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 // the release of the lock until we've kicked a frame with the new texture, to 242 // the release of the lock until we've kicked a frame with the new texture, to
242 // avoid resizing the UI before we have a chance to draw a "good" frame. 243 // avoid resizing the UI before we have a chance to draw a "good" frame.
243 resize_lock_->UnlockCompositor(); 244 resize_lock_->UnlockCompositor();
244 ui::Compositor* compositor = client_->GetCompositor(); 245 ui::Compositor* compositor = client_->GetCompositor();
245 if (compositor) { 246 if (compositor) {
246 if (!compositor->HasObserver(this)) 247 if (!compositor->HasObserver(this))
247 compositor->AddObserver(this); 248 compositor->AddObserver(this);
248 } 249 }
249 } 250 }
250 251
251 void DelegatedFrameHost::DidReceiveFrameFromRenderer() { 252 void DelegatedFrameHost::DidReceiveFrameFromRenderer(
252 if (frame_subscriber() && CanCopyToVideoFrame()) { 253 const gfx::Rect& damage_rect) {
253 const base::TimeTicks present_time = base::TimeTicks::Now(); 254 if (!frame_subscriber() || !CanCopyToVideoFrame())
254 scoped_refptr<media::VideoFrame> frame; 255 return;
255 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; 256
256 if (frame_subscriber()->ShouldCaptureFrame(present_time, 257 const base::TimeTicks now = gfx::FrameTime::Now();
257 &frame, &callback)) { 258 base::TimeTicks present_time;
258 CopyFromCompositingSurfaceToVideoFrame( 259 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) {
259 gfx::Rect(current_frame_size_in_dip_), 260 present_time = now;
260 frame, 261 } else {
261 base::Bind(callback, present_time)); 262 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_;
262 } 263 present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_;
264 }
265
266 scoped_refptr<media::VideoFrame> frame;
267 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
268 if (frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time,
269 &frame, &callback)) {
270 CopyFromCompositingSurfaceToVideoFrame(
271 gfx::Rect(current_frame_size_in_dip_),
272 frame,
273 base::Bind(callback, present_time));
263 } 274 }
264 } 275 }
265 276
266 void DelegatedFrameHost::SwapDelegatedFrame( 277 void DelegatedFrameHost::SwapDelegatedFrame(
267 uint32 output_surface_id, 278 uint32 output_surface_id,
268 scoped_ptr<cc::DelegatedFrameData> frame_data, 279 scoped_ptr<cc::DelegatedFrameData> frame_data,
269 float frame_device_scale_factor, 280 float frame_device_scale_factor,
270 const std::vector<ui::LatencyInfo>& latency_info) { 281 const std::vector<ui::LatencyInfo>& latency_info) {
271 RenderWidgetHostImpl* host = client_->GetHost(); 282 RenderWidgetHostImpl* host = client_->GetHost();
272 DCHECK(!frame_data->render_pass_list.empty()); 283 DCHECK(!frame_data->render_pass_list.empty());
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 for (it = skipped_latency_info_list_.begin(); 382 for (it = skipped_latency_info_list_.begin();
372 it != skipped_latency_info_list_.end(); 383 it != skipped_latency_info_list_.end();
373 ++it) 384 ++it)
374 compositor->SetLatencyInfo(*it); 385 compositor->SetLatencyInfo(*it);
375 skipped_latency_info_list_.clear(); 386 skipped_latency_info_list_.clear();
376 AddOnCommitCallbackAndDisableLocks( 387 AddOnCommitCallbackAndDisableLocks(
377 base::Bind(&DelegatedFrameHost::SendDelegatedFrameAck, 388 base::Bind(&DelegatedFrameHost::SendDelegatedFrameAck,
378 AsWeakPtr(), 389 AsWeakPtr(),
379 output_surface_id)); 390 output_surface_id));
380 } 391 }
381 DidReceiveFrameFromRenderer(); 392 DidReceiveFrameFromRenderer(damage_rect);
382 if (frame_provider_.get()) 393 if (frame_provider_.get())
383 delegated_frame_evictor_->SwappedFrame(!host->is_hidden()); 394 delegated_frame_evictor_->SwappedFrame(!host->is_hidden());
384 // Note: the frame may have been evicted immediately. 395 // Note: the frame may have been evicted immediately.
385 } 396 }
386 397
387 void DelegatedFrameHost::SendDelegatedFrameAck(uint32 output_surface_id) { 398 void DelegatedFrameHost::SendDelegatedFrameAck(uint32 output_surface_id) {
388 RenderWidgetHostImpl* host = client_->GetHost(); 399 RenderWidgetHostImpl* host = client_->GetHost();
389 cc::CompositorFrameAck ack; 400 cc::CompositorFrameAck ack;
390 if (resource_collection_) 401 if (resource_collection_)
391 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); 402 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources);
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 // A compositor lock that is part of a resize lock timed out. We 754 // A compositor lock that is part of a resize lock timed out. We
744 // should display a renderer frame. 755 // should display a renderer frame.
745 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) { 756 if (!compositor->IsLocked() && can_lock_compositor_ == YES_DID_LOCK) {
746 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; 757 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME;
747 } 758 }
748 } 759 }
749 760
750 void DelegatedFrameHost::OnUpdateVSyncParameters( 761 void DelegatedFrameHost::OnUpdateVSyncParameters(
751 base::TimeTicks timebase, 762 base::TimeTicks timebase,
752 base::TimeDelta interval) { 763 base::TimeDelta interval) {
764 vsync_timebase_ = timebase;
765 vsync_interval_ = interval;
753 RenderWidgetHostImpl* host = client_->GetHost(); 766 RenderWidgetHostImpl* host = client_->GetHost();
754 if (client_->IsVisible()) 767 if (client_->IsVisible())
755 host->UpdateVSyncParameters(timebase, interval); 768 host->UpdateVSyncParameters(timebase, interval);
756 } 769 }
757 770
758 //////////////////////////////////////////////////////////////////////////////// 771 ////////////////////////////////////////////////////////////////////////////////
759 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: 772 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
760 773
761 void DelegatedFrameHost::OnLostResources() { 774 void DelegatedFrameHost::OnLostResources() {
762 RenderWidgetHostImpl* host = client_->GetHost(); 775 RenderWidgetHostImpl* host = client_->GetHost();
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 // The new_layer is the one that will be used by our Window, so that's the one 855 // The new_layer is the one that will be used by our Window, so that's the one
843 // that should keep our frame. old_layer will be returned to the 856 // that should keep our frame. old_layer will be returned to the
844 // RecreateLayer caller, and should have a copy. 857 // RecreateLayer caller, and should have a copy.
845 if (frame_provider_.get()) { 858 if (frame_provider_.get()) {
846 new_layer->SetShowDelegatedContent(frame_provider_.get(), 859 new_layer->SetShowDelegatedContent(frame_provider_.get(),
847 current_frame_size_in_dip_); 860 current_frame_size_in_dip_);
848 } 861 }
849 } 862 }
850 863
851 } // namespace content 864 } // namespace content
852
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698