summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/gpu/gpu_process_host.cc50
-rw-r--r--ui/surface/accelerated_surface_win.cc23
-rw-r--r--ui/surface/accelerated_surface_win.h8
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);
};