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 95ea7df099ffd720ba84b088cacd30a78881f16b..949a9c631ad1922dc1146e3653aae37965fb9123 100644 |
--- a/content/common/gpu/image_transport_surface.cc |
+++ b/content/common/gpu/image_transport_surface.cc |
@@ -74,6 +74,9 @@ ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, |
} |
ImageTransportHelper::~ImageTransportHelper() { |
+ if (stub_) |
+ stub_->SetLatencyInfoCallback( |
+ base::Callback<void(const WebKit::WebLatencyInfoImpl&)>()); |
manager_->RemoveRoute(route_id_); |
} |
@@ -86,6 +89,11 @@ bool ImageTransportHelper::Initialize() { |
decoder->SetResizeCallback( |
base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); |
+ if (stub_) |
+ stub_->SetLatencyInfoCallback( |
+ base::Bind(&ImageTransportHelper::SetLatencyInfo, |
+ base::Unretained(this))); |
+ |
return true; |
} |
@@ -97,6 +105,7 @@ bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BufferPresented, |
OnBufferPresented) |
IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); |
+ IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_FrameDisplayed, OnFrameDisplayed); |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -153,6 +162,11 @@ void ImageTransportHelper::SendUpdateVSyncParameters( |
interval)); |
} |
+void ImageTransportHelper::SendLatencyInfo( |
+ const WebKit::WebLatencyInfoImpl& latency_info) { |
+ stub_->SetLatencyInfo(latency_info); |
+} |
+ |
void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
gpu::GpuScheduler* scheduler = Scheduler(); |
if (!scheduler) |
@@ -236,6 +250,16 @@ void ImageTransportHelper::Resize(gfx::Size size) { |
#endif |
} |
+void ImageTransportHelper::SetLatencyInfo( |
+ const WebKit::WebLatencyInfoImpl& latency_info) { |
+ surface_->SetLatencyInfo(latency_info); |
+} |
+ |
+void ImageTransportHelper::OnFrameDisplayed( |
+ const WebKit::WebLatencyInfoImpl& latency_info) { |
+ SendLatencyInfo(latency_info); |
+} |
+ |
PassThroughImageTransportSurface::PassThroughImageTransportSurface( |
GpuChannelManager* manager, |
GpuCommandBufferStub* stub, |
@@ -260,8 +284,26 @@ void PassThroughImageTransportSurface::Destroy() { |
GLSurfaceAdapter::Destroy(); |
} |
+void PassThroughImageTransportSurface::SetLatencyInfo( |
+ const WebKit::WebLatencyInfoImpl& latency_info) { |
+ if (latency_info_.rendererImplFrameNumber != |
+ latency_info.rendererImplFrameNumber) |
+ TRACE_EVENT_ASYNC_BEGIN2("frame", "Frame", this, |
+ "frame_number", |
+ latency_info.rendererImplFrameNumber, |
+ "input_number", latency_info.inputNumber); |
+ |
+ latency_info_ = latency_info; |
+} |
+ |
bool PassThroughImageTransportSurface::SwapBuffers() { |
bool result = gfx::GLSurfaceAdapter::SwapBuffers(); |
+ latency_info_.swapTimestamp = base::TimeTicks::HighResNow(); |
+ helper_->SendLatencyInfo(latency_info_); |
+ TRACE_EVENT_ASYNC_END2("frame", "Frame", this, |
+ "frame_number", latency_info_.rendererImplFrameNumber, |
+ "input_number", latency_info_.inputNumber); |
+ |
SendVSyncUpdateIfAvailable(); |
if (transport_) { |
@@ -269,6 +311,7 @@ bool PassThroughImageTransportSurface::SwapBuffers() { |
// SwapBuffers message. |
GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
params.surface_handle = 0; |
+ params.latency_info = latency_info_; |
params.size = surface()->GetSize(); |
helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
@@ -280,6 +323,11 @@ bool PassThroughImageTransportSurface::SwapBuffers() { |
bool PassThroughImageTransportSurface::PostSubBuffer( |
int x, int y, int width, int height) { |
bool result = gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); |
+ latency_info_.swapTimestamp = base::TimeTicks::HighResNow(); |
+ helper_->SendLatencyInfo(latency_info_); |
+ TRACE_EVENT_ASYNC_END2("frame", "Frame", this, |
+ "frame_number", latency_info_.rendererImplFrameNumber, |
+ "input_number", latency_info_.inputNumber); |
SendVSyncUpdateIfAvailable(); |
if (transport_) { |
@@ -287,6 +335,7 @@ bool PassThroughImageTransportSurface::PostSubBuffer( |
// PostSubBuffer message. |
GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; |
params.surface_handle = 0; |
+ params.latency_info = latency_info_; |
params.surface_size = surface()->GetSize(); |
params.x = x; |
params.y = y; |