Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(810)

Unified Diff: ui/surface/accelerated_surface_win.cc

Issue 10820041: Plumb vsync info from AcceleratedPresenter to RenderWidgetHostImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: offset timebase to Now-space Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/surface/accelerated_surface_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/surface/accelerated_surface_win.cc
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc
index 199d9b9ccc09ce3728d04bb77109e35783556d3d..3dd097c71d8e3bbed255630307eede3fd4789190 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)
« no previous file with comments | « ui/surface/accelerated_surface_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698