summaryrefslogtreecommitdiffstats
path: root/ui/surface/accelerated_surface_win.cc
diff options
context:
space:
mode:
authorjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 18:19:47 +0000
committerjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-14 18:19:47 +0000
commit85c2ff9b06f2b566b09e318c0242b26fab3f9f5b (patch)
tree0e12d96e23c4f0b144b22197c55a73d28e4266c9 /ui/surface/accelerated_surface_win.cc
parent9af3b284cce562fd94b6a3b34c61449a5c524f94 (diff)
downloadchromium_src-85c2ff9b06f2b566b09e318c0242b26fab3f9f5b.zip
chromium_src-85c2ff9b06f2b566b09e318c0242b26fab3f9f5b.tar.gz
chromium_src-85c2ff9b06f2b566b09e318c0242b26fab3f9f5b.tar.bz2
Plumb vsync info from AcceleratedPresenter to RenderWidgetHostImpl
BUG=137792 Review URL: https://chromiumcodereview.appspot.com/10820041 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151514 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface/accelerated_surface_win.cc')
-rw-r--r--ui/surface/accelerated_surface_win.cc39
1 files changed, 31 insertions, 8 deletions
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc
index 199d9b9..3dd097c 100644
--- a/ui/surface/accelerated_surface_win.cc
+++ b/ui/surface/accelerated_surface_win.cc
@@ -432,11 +432,11 @@ scoped_refptr<AcceleratedPresenter> AcceleratedPresenter::GetForWindow(
void AcceleratedPresenter::AsyncPresentAndAcknowledge(
const gfx::Size& size,
int64 surface_handle,
- const base::Callback<void(bool)>& completion_task) {
+ const CompletionTask& completion_task) {
if (!surface_handle) {
TRACE_EVENT1("gpu", "EarlyOut_ZeroSurfaceHandle",
"surface_handle", surface_handle);
- completion_task.Run(true);
+ completion_task.Run(true, base::TimeTicks(), base::TimeDelta());
return;
}
@@ -675,7 +675,7 @@ static base::TimeDelta GetSwapDelay() {
void AcceleratedPresenter::DoPresentAndAcknowledge(
const gfx::Size& size,
int64 surface_handle,
- const base::Callback<void(bool)>& completion_task) {
+ const CompletionTask& completion_task) {
TRACE_EVENT1(
"gpu", "DoPresentAndAcknowledge", "surface_handle", surface_handle);
@@ -688,13 +688,13 @@ void AcceleratedPresenter::DoPresentAndAcknowledge(
if (!present_thread_->device()) {
if (!completion_task.is_null())
- completion_task.Run(false);
+ completion_task.Run(false, base::TimeTicks(), base::TimeDelta());
return;
}
// Ensure the task is always run and while the lock is taken.
- base::ScopedClosureRunner scoped_completion_runner(base::Bind(completion_task,
- true));
+ base::ScopedClosureRunner scoped_completion_runner(
+ base::Bind(completion_task, true, base::TimeTicks(), base::TimeDelta()));
// If invalidated, do nothing, the window is gone.
if (!window_)
@@ -849,6 +849,24 @@ void AcceleratedPresenter::DoPresentAndAcknowledge(
}
}
+ {
+ TRACE_EVENT0("gpu", "GetPresentationStats");
+ base::TimeTicks timebase;
+ base::TimeDelta interval;
+ uint32 numerator = 0, denominator = 0;
+ if (GetPresentationStats(&timebase, &numerator, &denominator) &&
+ numerator > 0 && denominator > 0) {
+ int64 interval_micros =
+ static_cast<int64>(1000000 * numerator) / denominator;
+ interval = base::TimeDelta::FromMicroseconds(interval_micros);
+ }
+ scoped_completion_runner.Release();
+ completion_task.Run(true, timebase, interval);
+ TRACE_EVENT2("gpu", "GetPresentationStats",
+ "timebase", timebase.ToInternalValue(),
+ "interval", interval.ToInternalValue());
+ }
+
hidden_ = false;
}
@@ -862,7 +880,7 @@ void AcceleratedPresenter::DoReleaseSurface() {
source_texture_.Release();
}
-void AcceleratedPresenter::GetPresentationStats(base::TimeTicks* timebase,
+bool AcceleratedPresenter::GetPresentationStats(base::TimeTicks* timebase,
uint32* interval_numerator,
uint32* interval_denominator) {
lock_.AssertAcquired();
@@ -871,13 +889,18 @@ void AcceleratedPresenter::GetPresentationStats(base::TimeTicks* timebase,
timing_info.cbSize = sizeof(timing_info);
HRESULT result = DwmGetCompositionTimingInfo(window_, &timing_info);
if (result != S_OK)
- return;
+ return false;
*timebase = base::TimeTicks::FromQPCValue(
static_cast<LONGLONG>(timing_info.qpcVBlank));
+ // Offset from QPC-space to TimeTicks::Now-space.
+ *timebase += (base::TimeTicks::Now() - base::TimeTicks::HighResNow());
+
// Swap the numerator/denominator to convert frequency to period.
*interval_numerator = timing_info.rateRefresh.uiDenominator;
*interval_denominator = timing_info.rateRefresh.uiNumerator;
+
+ return true;
}
AcceleratedSurface::AcceleratedSurface(gfx::NativeWindow window)