Chromium Code Reviews| Index: content/common/gpu/image_transport_surface.cc |
| diff --git a/content/common/gpu/image_transport_surface.cc b/content/common/gpu/image_transport_surface.cc |
| index 1b1428b02f0a82d901616908265aa87c8b2394ca..3b49d775221ae5aee93dc1e81f5fd9896ad2e0b5 100644 |
| --- a/content/common/gpu/image_transport_surface.cc |
| +++ b/content/common/gpu/image_transport_surface.cc |
| @@ -267,6 +267,7 @@ void PassThroughImageTransportSurface::Destroy() { |
| bool PassThroughImageTransportSurface::SwapBuffers() { |
| bool result = gfx::GLSurfaceAdapter::SwapBuffers(); |
| + SendVSyncUpdateIfAvailable(); |
| if (transport_) { |
| // Round trip to the browser UI thread, for throttling, by sending a dummy |
| @@ -283,6 +284,7 @@ bool PassThroughImageTransportSurface::SwapBuffers() { |
| bool PassThroughImageTransportSurface::PostSubBuffer( |
| int x, int y, int width, int height) { |
| bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); |
| + SendVSyncUpdateIfAvailable(); |
| if (transport_) { |
| // Round trip to the browser UI thread, for throttling, by sending a dummy |
| @@ -337,4 +339,43 @@ gfx::Size PassThroughImageTransportSurface::GetSize() { |
| PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {} |
| +void PassThroughImageTransportSurface::SendVSyncUpdateIfAvailable() { |
| + int64 systemTime; |
| + int64 mediaStreamCounter; |
| + int64 swapBufferCounter; |
| + |
| + // GetSyncValues gives us a time from CLOCK_REALTIME, but we need |
| + // a time from CLOCK_MONOTONIC, so we convert. |
| + static bool conversionComputed = false; |
| + static int64 timeDifference = 0; |
| + |
| + // This assumes that the difference between Unix epoch time and system |
| + // uptime remains constant throughout the life of this process, but this |
| + // may not be true (e.g. the user may adjust the clock). We should either |
| + // recompute this periodically, or (if it's cheap enough) recompute this |
| + // everytime. |
| + if (!conversionComputed) { |
| + struct timespec realTime; |
| + struct timespec monotonicTime; |
| + clock_gettime(CLOCK_REALTIME, &realTime); |
| + clock_gettime(CLOCK_MONOTONIC, &monotonicTime); |
|
piman
2012/10/17 17:24:47
PassThroughImageTransportSurface is cross-platform
|
| + |
| + int64 realTimeInMicroseconds = |
| + realTime.tv_sec * base::Time::kMicrosecondsPerSecond + |
| + realTime.tv_nsec / base::Time::kNanosecondsPerMicrosecond; |
| + |
| + int64 monotonicTimeInMicroseconds = |
| + monotonicTime.tv_sec * base::Time::kMicrosecondsPerSecond + |
| + monotonicTime.tv_nsec / base::Time::kNanosecondsPerMicrosecond; |
| + |
| + timeDifference = realTimeInMicroseconds - monotonicTimeInMicroseconds; |
| + conversionComputed = true; |
| + } |
| + |
| + if (GetSyncValues(&systemTime, &mediaStreamCounter, &swapBufferCounter)) { |
| + int64 monotonicVSyncTime = systemTime - timeDifference; |
| + helper_->stub()->SendUpdateVSyncTime(monotonicVSyncTime); |
| + } |
| +} |
| + |
| #endif // defined(ENABLE_GPU) |