diff options
-rw-r--r-- | content/browser/gpu/gpu_process_host.cc | 51 | ||||
-rw-r--r-- | ui/surface/accelerated_surface_win.cc | 59 | ||||
-rw-r--r-- | ui/surface/accelerated_surface_win.h | 13 |
3 files changed, 54 insertions, 69 deletions
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index d6e6632..4c4dc13 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc @@ -85,8 +85,8 @@ void SendGpuProcessMessage(GpuProcessHost::GpuProcessKind kind, void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, int route_id, - uint64 surface_handle, - bool alive) { + bool alive, + uint64 surface_handle) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { BrowserThread::PostTask( BrowserThread::IO, @@ -94,8 +94,8 @@ void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, host_id, route_id, - surface_handle, - alive)); + alive, + surface_handle)); return; } @@ -144,6 +144,19 @@ void AcceleratedSurfaceBuffersSwappedCompletedForRenderer( if (interval != base::TimeDelta()) RenderWidgetHostImpl::From(rwh)->UpdateVSyncParameters(timebase, interval); } + +void AcceleratedSurfaceBuffersSwappedCompleted(int host_id, + int route_id, + int surface_id, + uint64 surface_handle, + bool alive, + base::TimeTicks timebase, + base::TimeDelta interval) { + AcceleratedSurfaceBuffersSwappedCompletedForGPU(host_id, route_id, + alive, surface_handle); + AcceleratedSurfaceBuffersSwappedCompletedForRenderer(surface_id, timebase, + interval); +} #endif // defined(OS_WIN) } // anonymous namespace @@ -765,7 +778,7 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( base::ScopedClosureRunner scoped_completion_runner( base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, host_id_, params.route_id, - params.surface_handle, true /* alive */)); + true /* alive */, params.surface_handle)); int render_process_id = 0; int render_widget_id = 0; @@ -798,17 +811,10 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { TRACE_EVENT0("gpu", "GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped"); - base::ScopedClosureRunner scoped_present_completion_runner( - base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForRenderer, - params.surface_id, - base::TimeTicks(), - base::TimeDelta())); - base::ScopedClosureRunner scoped_copy_completion_runner( - base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, - host_id_, - params.route_id, - params.surface_handle, - true)); + base::ScopedClosureRunner scoped_completion_runner( + base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, + host_id_, params.route_id, params.surface_id, params.surface_handle, + true, base::TimeTicks(), base::TimeDelta())); gfx::PluginWindowHandle handle = GpuSurfaceTracker::Get()->GetSurfaceWindowHandle(params.surface_id); @@ -818,8 +824,7 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( "surface_id", params.surface_id); #if defined(USE_AURA) // This is a content area swap, send it on to the UI thread. - scoped_copy_completion_runner.Release(); - scoped_present_completion_runner.Release(); + scoped_completion_runner.Release(); RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); #endif return; @@ -834,17 +839,15 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( return; } - scoped_copy_completion_runner.Release(); - scoped_present_completion_runner.Release(); + scoped_completion_runner.Release(); presenter->AsyncPresentAndAcknowledge( params.size, params.surface_handle, - base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, + base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, host_id_, params.route_id, - params.surface_handle), - base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForRenderer, - params.surface_id)); + params.surface_id, + params.surface_handle)); } void GpuProcessHost::OnAcceleratedSurfacePostSubBuffer( diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc index 0ac8f1c..6b4e1b1 100644 --- a/ui/surface/accelerated_surface_win.cc +++ b/ui/surface/accelerated_surface_win.cc @@ -269,13 +269,11 @@ scoped_refptr<AcceleratedPresenter> AcceleratedPresenter::GetForWindow( void AcceleratedPresenter::AsyncPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, - const CopyCompletionTask& copy_completion_task, - const PresentCompletionTask& present_completion_task) { + const CompletionTask& completion_task) { if (!surface_handle) { TRACE_EVENT1("gpu", "EarlyOut_ZeroSurfaceHandle", "surface_handle", surface_handle); - copy_completion_task.Run(true); - present_completion_task.Run(base::TimeTicks(), base::TimeDelta()); + completion_task.Run(true, base::TimeTicks(), base::TimeDelta()); return; } @@ -285,8 +283,7 @@ void AcceleratedPresenter::AsyncPresentAndAcknowledge( this, size, surface_handle, - copy_completion_task, - present_completion_task)); + completion_task)); } void AcceleratedPresenter::Present(HDC dc) { @@ -472,8 +469,7 @@ static base::TimeDelta GetSwapDelay() { void AcceleratedPresenter::DoPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, - const CopyCompletionTask& copy_completion_task, - const PresentCompletionTask& present_completion_task) { + const CompletionTask& completion_task) { TRACE_EVENT2( "gpu", "DoPresentAndAcknowledge", "width", size.width(), @@ -487,21 +483,15 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( present_thread_->InitDevice(); if (!present_thread_->device()) { - if (!copy_completion_task.is_null()) - copy_completion_task.Run(false); - if (!present_completion_task.is_null()) - present_completion_task.Run(base::TimeTicks(), base::TimeDelta()); + if (!completion_task.is_null()) + completion_task.Run(false, base::TimeTicks(), base::TimeDelta()); TRACE_EVENT0("gpu", "EarlyOut_NoDevice"); return; } // Ensure the task is always run and while the lock is taken. - base::ScopedClosureRunner scoped_copy_completion_runner( - base::Bind(copy_completion_task, true)); - base::ScopedClosureRunner scoped_present_completion_runner( - base::Bind(present_completion_task, - base::TimeTicks(), - base::TimeDelta())); + base::ScopedClosureRunner scoped_completion_runner( + base::Bind(completion_task, true, base::TimeTicks(), base::TimeDelta())); // If invalidated, do nothing, the window is gone. if (!window_) { @@ -604,23 +594,6 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( if (FAILED(hr)) return; - // Wait for the StretchRect to complete before notifying the GPU process - // that it is safe to write to its backing store again. - { - TRACE_EVENT0("gpu", "spin"); - do { - hr = present_thread_->query()->GetData(NULL, 0, D3DGETDATA_FLUSH); - - if (hr == S_FALSE) - Sleep(1); - } while (hr == S_FALSE); - } - - // Acknowledge that the copy is complete and it is safe to modify the shared - // texture. - scoped_copy_completion_runner.Release(); - copy_completion_task.Run(true); - present_size_ = size; static const base::TimeDelta swap_delay = GetSwapDelay(); @@ -686,8 +659,20 @@ void AcceleratedPresenter::DoPresentAndAcknowledge( 1000000 / display_mode.RefreshRate); } - scoped_present_completion_runner.Release(); - present_completion_task.Run(last_vsync_time, refresh_period); + // Wait for the StretchRect to complete before notifying the GPU process + // that it is safe to write to its backing store again. + { + TRACE_EVENT0("gpu", "spin"); + do { + hr = present_thread_->query()->GetData(NULL, 0, D3DGETDATA_FLUSH); + + if (hr == S_FALSE) + Sleep(1); + } while (hr == S_FALSE); + } + + scoped_completion_runner.Release(); + completion_task.Run(true, last_vsync_time, refresh_period); } void AcceleratedPresenter::DoSuspend() { diff --git a/ui/surface/accelerated_surface_win.h b/ui/surface/accelerated_surface_win.h index e077aae..166bf5b 100644 --- a/ui/surface/accelerated_surface_win.h +++ b/ui/surface/accelerated_surface_win.h @@ -26,10 +26,9 @@ class Rect; class SURFACE_EXPORT AcceleratedPresenter : public base::RefCountedThreadSafe<AcceleratedPresenter> { public: - typedef base::Callback<void(bool)> CopyCompletionTask; - - typedef base::Callback<void(base::TimeTicks, - base::TimeDelta)> PresentCompletionTask; + typedef base::Callback<void(bool, + base::TimeTicks, + base::TimeDelta)> CompletionTask; explicit AcceleratedPresenter(gfx::PluginWindowHandle window); @@ -46,8 +45,7 @@ class SURFACE_EXPORT AcceleratedPresenter void AsyncPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, - const CopyCompletionTask& copy_completion_task, - const PresentCompletionTask& present_completion_task); + const CompletionTask& completion_task); // Schedule the presenter to free all its resources. This can be called on any // thread. @@ -83,8 +81,7 @@ class SURFACE_EXPORT AcceleratedPresenter void DoPresentAndAcknowledge( const gfx::Size& size, int64 surface_handle, - const CopyCompletionTask& copy_completion_task, - const PresentCompletionTask& present_completion_task); + const CompletionTask& completion_task); void DoSuspend(); void DoPresent(const base::Closure& composite_task); void DoReleaseSurface(); |