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 963f0e79be0f4a1982b1e2f47f56fa3aa5073c55..145f30cf312d80521cee55896bc986268907c6ca 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 cc::LatencyInfo&)>()); |
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; |
@@ -146,6 +155,11 @@ void ImageTransportHelper::SendUpdateVSyncParameters( |
interval)); |
} |
+void ImageTransportHelper::SendLatencyInfo( |
+ const cc::LatencyInfo& latency_info) { |
+ stub_->SetLatencyInfo(latency_info); |
+} |
+ |
void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
gpu::GpuScheduler* scheduler = Scheduler(); |
if (!scheduler) |
@@ -229,6 +243,16 @@ void ImageTransportHelper::Resize(gfx::Size size) { |
#endif |
} |
+void ImageTransportHelper::SetLatencyInfo( |
+ const cc::LatencyInfo& latency_info) { |
+ surface_->SetLatencyInfo(latency_info); |
+} |
+ |
+void ImageTransportHelper::OnFrameDisplayed( |
+ const cc::LatencyInfo& latency_info) { |
+ SendLatencyInfo(latency_info); |
+} |
+ |
PassThroughImageTransportSurface::PassThroughImageTransportSurface( |
GpuChannelManager* manager, |
GpuCommandBufferStub* stub, |
@@ -253,8 +277,26 @@ void PassThroughImageTransportSurface::Destroy() { |
GLSurfaceAdapter::Destroy(); |
} |
+void PassThroughImageTransportSurface::SetLatencyInfo( |
+ const cc::LatencyInfo& 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_) { |
@@ -262,6 +304,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); |
@@ -273,6 +316,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_) { |
@@ -280,6 +328,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; |