diff options
-rw-r--r-- | content/browser/gpu/gpu_process_host.cc | 50 | ||||
-rw-r--r-- | ui/surface/accelerated_surface_win.cc | 23 | ||||
-rw-r--r-- | ui/surface/accelerated_surface_win.h | 8 |
3 files changed, 56 insertions, 25 deletions
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 33e6c23..323335e 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc @@ -39,6 +39,7 @@ #include "gpu/command_buffer/service/gpu_switches.h" #include "ipc/ipc_channel_handle.h" #include "ipc/ipc_switches.h" +#include "ui/base/latency_info.h" #include "ui/gl/gl_switches.h" @@ -84,8 +85,7 @@ void SendGpuProcessMessage(GpuProcessHost::GpuProcessKind kind, void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, int route_id, - bool alive, - uint64 surface_handle) { + bool alive) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { BrowserThread::PostTask( BrowserThread::IO, @@ -93,8 +93,7 @@ void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, host_id, route_id, - alive, - surface_handle)); + alive)); return; } @@ -117,13 +116,14 @@ void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, void AcceleratedSurfaceBuffersSwappedCompletedForRenderer( int surface_id, base::TimeTicks timebase, - base::TimeDelta interval) { + base::TimeDelta interval, + const ui::LatencyInfo& latency_info) { if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForRenderer, - surface_id, timebase, interval)); + surface_id, timebase, interval, latency_info)); return; } @@ -142,19 +142,21 @@ void AcceleratedSurfaceBuffersSwappedCompletedForRenderer( RenderWidgetHostImpl::From(rwh)->AcknowledgeSwapBuffersToRenderer(); if (interval != base::TimeDelta()) RenderWidgetHostImpl::From(rwh)->UpdateVSyncParameters(timebase, interval); + RenderWidgetHostImpl::From(rwh)->FrameSwapped(latency_info); } -void AcceleratedSurfaceBuffersSwappedCompleted(int host_id, - int route_id, - int surface_id, - uint64 surface_handle, - bool alive, - base::TimeTicks timebase, - base::TimeDelta interval) { +void AcceleratedSurfaceBuffersSwappedCompleted( + int host_id, + int route_id, + int surface_id, + bool alive, + base::TimeTicks timebase, + base::TimeDelta interval, + const ui::LatencyInfo& latency_info) { AcceleratedSurfaceBuffersSwappedCompletedForGPU(host_id, route_id, - alive, surface_handle); + alive); AcceleratedSurfaceBuffersSwappedCompletedForRenderer(surface_id, timebase, - interval); + interval, latency_info); } // NOTE: changes to this class need to be reviewed by the security team. @@ -912,7 +914,7 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( base::ScopedClosureRunner scoped_completion_runner( base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, host_id_, params.route_id, - true /* alive */, params.surface_handle)); + true /* alive */)); int render_process_id = 0; int render_widget_id = 0; @@ -951,8 +953,8 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( base::ScopedClosureRunner scoped_completion_runner( base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, - host_id_, params.route_id, params.surface_id, params.surface_handle, - true, base::TimeTicks(), base::TimeDelta())); + host_id_, params.route_id, params.surface_id, + true, base::TimeTicks(), base::TimeDelta(), ui::LatencyInfo())); gfx::GLSurfaceHandle handle = GpuSurfaceTracker::Get()->GetSurfaceHandle(params.surface_id); @@ -978,6 +980,14 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( "EarlyOut_NativeWindowNotFound", "handle", handle.handle); + scoped_completion_runner.Release(); + AcceleratedSurfaceBuffersSwappedCompleted(host_id_, + params.route_id, + params.surface_id, + true, + base::TimeTicks(), + base::TimeDelta(), + params.latency_info); return; } @@ -985,11 +995,11 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( presenter->AsyncPresentAndAcknowledge( params.size, params.surface_handle, + params.latency_info, base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, host_id_, params.route_id, - params.surface_id, - params.surface_handle)); + params.surface_id)); FrameSubscriberMap::iterator it = frame_subscribers_.find(params.surface_id); if (it != frame_subscribers_.end() && it->second) { diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc index 298f125..41983c5 100644 --- a/ui/surface/accelerated_surface_win.cc +++ b/ui/surface/accelerated_surface_win.cc @@ -25,6 +25,7 @@ #include "media/base/video_frame.h" #include "media/base/video_util.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/latency_info.h" #include "ui/base/win/dpi.h" #include "ui/base/win/hwnd_util.h" #include "ui/base/win/shell.h" @@ -380,11 +381,13 @@ scoped_refptr<AcceleratedPresenter> AcceleratedPresenter::GetForWindow( void AcceleratedPresenter::AsyncPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, + const ui::LatencyInfo& latency_info, const CompletionTask& completion_task) { if (!surface_handle) { TRACE_EVENT1("gpu", "EarlyOut_ZeroSurfaceHandle", "surface_handle", surface_handle); - completion_task.Run(true, base::TimeTicks(), base::TimeDelta()); + completion_task.Run( + true, base::TimeTicks(), base::TimeDelta(), ui::LatencyInfo()); return; } @@ -394,6 +397,7 @@ void AcceleratedPresenter::AsyncPresentAndAcknowledge( this, size, surface_handle, + latency_info, completion_task)); } @@ -679,6 +683,7 @@ AcceleratedPresenter::~AcceleratedPresenter() { void AcceleratedPresenter::DoPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, + const ui::LatencyInfo& latency_info, const CompletionTask& completion_task) { TRACE_EVENT2( "gpu", "DoPresentAndAcknowledge", @@ -689,18 +694,25 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( base::AutoLock locked(*present_thread_->lock()); + latency_info_.MergeWith(latency_info); + // Initialize the device lazily since calling Direct3D can crash bots. present_thread_->InitDevice(); if (!present_thread_->device()) { - completion_task.Run(false, base::TimeTicks(), base::TimeDelta()); + completion_task.Run( + false, base::TimeTicks(), base::TimeDelta(), ui::LatencyInfo()); TRACE_EVENT0("gpu", "EarlyOut_NoDevice"); return; } // Ensure the task is acknowledged on early out after this point. base::ScopedClosureRunner scoped_completion_runner( - base::Bind(completion_task, true, base::TimeTicks(), base::TimeDelta())); + base::Bind(completion_task, + true, + base::TimeTicks(), + base::TimeDelta(), + ui::LatencyInfo())); // If invalidated, do nothing, the window is gone. if (!window_) { @@ -845,6 +857,8 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( ReleaseDC(window_, dc); } + latency_info_.swap_timestamp = base::TimeTicks::HighResNow(); + hidden_ = false; D3DDISPLAYMODE display_mode; @@ -903,7 +917,8 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( } scoped_completion_runner.Release(); - completion_task.Run(true, last_vsync_time, refresh_period); + completion_task.Run(true, last_vsync_time, refresh_period, latency_info_); + latency_info_.Clear(); } void AcceleratedPresenter::DoSuspend() { diff --git a/ui/surface/accelerated_surface_win.h b/ui/surface/accelerated_surface_win.h index 7aa9273..f2f766e 100644 --- a/ui/surface/accelerated_surface_win.h +++ b/ui/surface/accelerated_surface_win.h @@ -14,6 +14,7 @@ #include "base/synchronization/waitable_event.h" #include "base/time.h" #include "base/win/scoped_comptr.h" +#include "ui/base/latency_info.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/size.h" #include "ui/surface/surface_export.h" @@ -33,7 +34,8 @@ class SURFACE_EXPORT AcceleratedPresenter public: typedef base::Callback<void(bool, base::TimeTicks, - base::TimeDelta)> CompletionTask; + base::TimeDelta, + const ui::LatencyInfo&)> CompletionTask; explicit AcceleratedPresenter(gfx::PluginWindowHandle window); @@ -52,6 +54,7 @@ class SURFACE_EXPORT AcceleratedPresenter void AsyncPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, + const ui::LatencyInfo& latency_info, const CompletionTask& completion_task); // Schedule the presenter to free all its resources. This can be called on any @@ -98,6 +101,7 @@ class SURFACE_EXPORT AcceleratedPresenter void DoPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, + const ui::LatencyInfo& latency_info, const CompletionTask& completion_task); void DoSuspend(); void DoPresent(const base::Closure& composite_task); @@ -171,6 +175,8 @@ class SURFACE_EXPORT AcceleratedPresenter gfx::Size last_window_size_; base::Time last_window_resize_time_; + ui::LatencyInfo latency_info_; + DISALLOW_COPY_AND_ASSIGN(AcceleratedPresenter); }; |