summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/gpu/gpu_process_host.cc48
-rw-r--r--ui/surface/accelerated_surface_win.cc59
-rw-r--r--ui/surface/accelerated_surface_win.h13
3 files changed, 53 insertions, 67 deletions
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index e7416d3..2fa5928 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -102,8 +102,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,
@@ -111,8 +111,8 @@ void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id,
base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU,
host_id,
route_id,
- surface_handle,
- alive));
+ alive,
+ surface_handle));
return;
}
@@ -162,6 +162,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
@@ -796,7 +809,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;
@@ -829,17 +842,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);
@@ -864,17 +870,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 0fa247d7..acd8c64 100644
--- a/ui/surface/accelerated_surface_win.cc
+++ b/ui/surface/accelerated_surface_win.cc
@@ -390,13 +390,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;
}
@@ -406,8 +404,7 @@ void AcceleratedPresenter::AsyncPresentAndAcknowledge(
this,
size,
surface_handle,
- copy_completion_task,
- present_completion_task));
+ completion_task));
}
void AcceleratedPresenter::Present(HDC dc) {
@@ -632,8 +629,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(),
@@ -647,21 +643,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_) {
@@ -798,23 +788,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();
@@ -880,8 +853,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();