Commit a02a568d authored by Saman Sami's avatar Saman Sami Committed by Commit Bot

viz: Make Page.captureScreenshot work

Page.captureScreenshot blocks on arrival of a LatencyInfo with
BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT component. However, the
browse process does not receive latency info when Viz is enabled.
Plumb latency info with BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT
component from viz to the browser process.

TBR=boliu@chromium.org

Bug: 810037
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: Ia81b0644f29a37059a7b3e0303074fb0db340757
Reviewed-on: https://chromium-review.googlesource.com/1020301Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Reviewed-by: default avatarkylechar <kylechar@chromium.org>
Reviewed-by: default avatarFady Samuel <fsamuel@chromium.org>
Commit-Queue: Saman Sami <samans@chromium.org>
Cr-Commit-Position: refs/heads/master@{#553271}
parent 18d7dcfd
...@@ -66,6 +66,8 @@ class SurfacesInstance : public base::RefCounted<SurfacesInstance>, ...@@ -66,6 +66,8 @@ class SurfacesInstance : public base::RefCounted<SurfacesInstance>,
void DisplayDidDrawAndSwap() override {} void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override {} const gfx::CALayerParams& ca_layer_params) override {}
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
// viz::mojom::CompositorFrameSinkClient implementation. // viz::mojom::CompositorFrameSinkClient implementation.
void DidReceiveCompositorFrameAck( void DidReceiveCompositorFrameAck(
......
...@@ -19,6 +19,8 @@ class FakeOutputSurfaceClient : public viz::OutputSurfaceClient { ...@@ -19,6 +19,8 @@ class FakeOutputSurfaceClient : public viz::OutputSurfaceClient {
const gpu::TextureInUseResponses& responses) override {} const gpu::TextureInUseResponses& responses) override {}
void DidReceiveCALayerParams( void DidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override {} const gfx::CALayerParams& ca_layer_params) override {}
void DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) override {}
int swap_count() { return swap_count_; } int swap_count() { return swap_count_; }
......
...@@ -492,6 +492,22 @@ void Display::DidReceivePresentationFeedback( ...@@ -492,6 +492,22 @@ void Display::DidReceivePresentationFeedback(
active_presented_callbacks_.clear(); active_presented_callbacks_.clear();
} }
void Display::DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) {
std::vector<ui::LatencyInfo> latency_info_with_snapshot_component;
for (const auto& latency : latency_info) {
if (latency.FindLatency(ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT,
nullptr)) {
latency_info_with_snapshot_component.push_back(latency);
}
}
if (!latency_info_with_snapshot_component.empty()) {
client_->DidSwapAfterSnapshotRequestReceived(
latency_info_with_snapshot_component);
}
}
void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
aggregator_->SetFullDamageForSurface(current_surface_id_); aggregator_->SetFullDamageForSurface(current_surface_id_);
if (scheduler_) { if (scheduler_) {
......
...@@ -109,6 +109,8 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient, ...@@ -109,6 +109,8 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient,
void DidReceivePresentationFeedback( void DidReceivePresentationFeedback(
uint64_t swap_id, uint64_t swap_id,
const gfx::PresentationFeedback& feedback) override; const gfx::PresentationFeedback& feedback) override;
void DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) override;
// LatestLocalSurfaceIdLookupDelegate implementation. // LatestLocalSurfaceIdLookupDelegate implementation.
LocalSurfaceId GetSurfaceAtAggregation( LocalSurfaceId GetSurfaceAtAggregation(
......
...@@ -11,6 +11,10 @@ namespace gfx { ...@@ -11,6 +11,10 @@ namespace gfx {
struct CALayerParams; struct CALayerParams;
} // namespace gfx } // namespace gfx
namespace ui {
class LatencyInfo;
} // namespace ui
namespace viz { namespace viz {
class DisplayClient { class DisplayClient {
...@@ -22,6 +26,11 @@ class DisplayClient { ...@@ -22,6 +26,11 @@ class DisplayClient {
virtual void DisplayDidDrawAndSwap() = 0; virtual void DisplayDidDrawAndSwap() = 0;
virtual void DisplayDidReceiveCALayerParams( virtual void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) = 0; const gfx::CALayerParams& ca_layer_params) = 0;
// Notifies that a swap has occured after some latency info with snapshot
// component reached the display.
virtual void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) = 0;
}; };
} // namespace viz } // namespace viz
......
...@@ -187,6 +187,8 @@ class StubDisplayClient : public DisplayClient { ...@@ -187,6 +187,8 @@ class StubDisplayClient : public DisplayClient {
void DisplayDidDrawAndSwap() override {} void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override{}; const gfx::CALayerParams& ca_layer_params) override{};
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
}; };
void CopyCallback(bool* called, std::unique_ptr<CopyOutputResult> result) { void CopyCallback(bool* called, std::unique_ptr<CopyOutputResult> result) {
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "components/viz/service/viz_service_export.h" #include "components/viz/service/viz_service_export.h"
#include "gpu/command_buffer/common/texture_in_use_response.h" #include "gpu/command_buffer/common/texture_in_use_response.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/latency/latency_info.h"
namespace gfx { namespace gfx {
struct CALayerParams; struct CALayerParams;
...@@ -44,6 +45,10 @@ class VIZ_SERVICE_EXPORT OutputSurfaceClient { ...@@ -44,6 +45,10 @@ class VIZ_SERVICE_EXPORT OutputSurfaceClient {
uint64_t swap_id, uint64_t swap_id,
const gfx::PresentationFeedback& feedback) {} const gfx::PresentationFeedback& feedback) {}
// Call after a swap occurs with all LatencyInfo aggregated up to that point.
virtual void DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) = 0;
protected: protected:
virtual ~OutputSurfaceClient() {} virtual ~OutputSurfaceClient() {}
}; };
......
...@@ -153,6 +153,7 @@ void GLOutputSurface::LatencyInfoCompleted( ...@@ -153,6 +153,7 @@ void GLOutputSurface::LatencyInfoCompleted(
for (const auto& latency : latency_info) { for (const auto& latency : latency_info) {
latency_tracker_.OnGpuSwapBuffersCompleted(latency); latency_tracker_.OnGpuSwapBuffersCompleted(latency);
} }
client_->DidFinishLatencyInfo(latency_info);
} }
void GLOutputSurface::OnVSyncParametersUpdated(base::TimeTicks timebase, void GLOutputSurface::OnVSyncParametersUpdated(base::TimeTicks timebase,
......
...@@ -127,6 +127,7 @@ uint32_t SoftwareOutputSurface::GetFramebufferCopyTextureFormat() { ...@@ -127,6 +127,7 @@ uint32_t SoftwareOutputSurface::GetFramebufferCopyTextureFormat() {
void SoftwareOutputSurface::SwapBuffersCallback(uint64_t swap_id) { void SoftwareOutputSurface::SwapBuffersCallback(uint64_t swap_id) {
for (const auto& latency : stored_latency_info_) for (const auto& latency : stored_latency_info_)
latency_tracker_.OnGpuSwapBuffersCompleted(latency); latency_tracker_.OnGpuSwapBuffersCompleted(latency);
client_->DidFinishLatencyInfo(stored_latency_info_);
std::vector<ui::LatencyInfo>().swap(stored_latency_info_); std::vector<ui::LatencyInfo>().swap(stored_latency_info_);
client_->DidReceiveSwapBuffersAck(swap_id); client_->DidReceiveSwapBuffersAck(swap_id);
client_->DidReceivePresentationFeedback( client_->DidReceivePresentationFeedback(
......
...@@ -155,6 +155,12 @@ void DirectLayerTreeFrameSink::DisplayDidReceiveCALayerParams( ...@@ -155,6 +155,12 @@ void DirectLayerTreeFrameSink::DisplayDidReceiveCALayerParams(
display_client_->OnDisplayReceivedCALayerParams(ca_layer_params); display_client_->OnDisplayReceivedCALayerParams(ca_layer_params);
} }
void DirectLayerTreeFrameSink::DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) {
// TODO(samans): Implement this method once the plumbing for latency info also
// works for non-OOP-D.
}
void DirectLayerTreeFrameSink::DidReceiveCompositorFrameAck( void DirectLayerTreeFrameSink::DidReceiveCompositorFrameAck(
const std::vector<ReturnedResource>& resources) { const std::vector<ReturnedResource>& resources) {
// Submitting a CompositorFrame can synchronously draw and dispatch a frame // Submitting a CompositorFrame can synchronously draw and dispatch a frame
......
...@@ -64,6 +64,8 @@ class VIZ_SERVICE_EXPORT DirectLayerTreeFrameSink ...@@ -64,6 +64,8 @@ class VIZ_SERVICE_EXPORT DirectLayerTreeFrameSink
void DisplayDidDrawAndSwap() override; void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override; const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
private: private:
// mojom::CompositorFrameSinkClient implementation: // mojom::CompositorFrameSinkClient implementation:
......
...@@ -167,6 +167,11 @@ void RootCompositorFrameSinkImpl::DisplayDidReceiveCALayerParams( ...@@ -167,6 +167,11 @@ void RootCompositorFrameSinkImpl::DisplayDidReceiveCALayerParams(
display_client_->OnDisplayReceivedCALayerParams(ca_layer_params); display_client_->OnDisplayReceivedCALayerParams(ca_layer_params);
} }
void RootCompositorFrameSinkImpl::DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) {
display_client_->DidSwapAfterSnapshotRequestReceived(latency_info);
}
void RootCompositorFrameSinkImpl::DisplayDidDrawAndSwap() {} void RootCompositorFrameSinkImpl::DisplayDidDrawAndSwap() {}
void RootCompositorFrameSinkImpl::OnClientConnectionLost() { void RootCompositorFrameSinkImpl::OnClientConnectionLost() {
......
...@@ -72,6 +72,8 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink, ...@@ -72,6 +72,8 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink,
void DisplayDidDrawAndSwap() override; void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override; const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
void OnClientConnectionLost(); void OnClientConnectionLost();
......
...@@ -77,6 +77,7 @@ viz_static_library("test_support") { ...@@ -77,6 +77,7 @@ viz_static_library("test_support") {
"//testing/gtest", "//testing/gtest",
"//ui/gfx/geometry", "//ui/gfx/geometry",
"//ui/gl", "//ui/gl",
"//ui/latency:test_support",
] ]
} }
......
...@@ -18,8 +18,10 @@ class MockDisplayClient : public mojom::DisplayClient { ...@@ -18,8 +18,10 @@ class MockDisplayClient : public mojom::DisplayClient {
mojom::DisplayClientPtr BindInterfacePtr(); mojom::DisplayClientPtr BindInterfacePtr();
// mojom::CompositorFrameSinkClient implementation. // mojom::DisplayClient implementation.
MOCK_METHOD1(OnDisplayReceivedCALayerParams, void(const gfx::CALayerParams&)); MOCK_METHOD1(OnDisplayReceivedCALayerParams, void(const gfx::CALayerParams&));
MOCK_METHOD1(DidSwapAfterSnapshotRequestReceived,
void(const std::vector<ui::LatencyInfo>&));
private: private:
mojo::Binding<mojom::DisplayClient> binding_; mojo::Binding<mojom::DisplayClient> binding_;
......
...@@ -116,6 +116,8 @@ class TestLayerTreeFrameSink : public cc::LayerTreeFrameSink, ...@@ -116,6 +116,8 @@ class TestLayerTreeFrameSink : public cc::LayerTreeFrameSink,
void DisplayDidDrawAndSwap() override; void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override; const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
const std::set<SharedBitmapId>& owned_bitmaps() const { const std::set<SharedBitmapId>& owned_bitmaps() const {
return owned_bitmaps_; return owned_bitmaps_;
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "content/browser/compositor/in_process_display_client.h" #include "content/browser/compositor/in_process_display_client.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
#include "ui/accelerated_widget_mac/ca_layer_frame_sink.h" #include "ui/accelerated_widget_mac/ca_layer_frame_sink.h"
#endif #endif
...@@ -40,4 +42,9 @@ void InProcessDisplayClient::OnDisplayReceivedCALayerParams( ...@@ -40,4 +42,9 @@ void InProcessDisplayClient::OnDisplayReceivedCALayerParams(
#endif #endif
} }
void InProcessDisplayClient::DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) {
RenderWidgetHostImpl::OnGpuSwapBuffersCompleted(latency_info);
}
} // namespace content } // namespace content
...@@ -26,6 +26,8 @@ class InProcessDisplayClient : public viz::mojom::DisplayClient { ...@@ -26,6 +26,8 @@ class InProcessDisplayClient : public viz::mojom::DisplayClient {
// viz::mojom::DisplayClient implementation: // viz::mojom::DisplayClient implementation:
void OnDisplayReceivedCALayerParams( void OnDisplayReceivedCALayerParams(
const gfx::CALayerParams& ca_layer_params) override; const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
mojo::Binding<viz::mojom::DisplayClient> binding_; mojo::Binding<viz::mojom::DisplayClient> binding_;
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
......
...@@ -171,6 +171,8 @@ class SynchronousLayerTreeFrameSink ...@@ -171,6 +171,8 @@ class SynchronousLayerTreeFrameSink
void DisplayDidDrawAndSwap() override {} void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams( void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override {} const gfx::CALayerParams& ca_layer_params) override {}
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
}; };
// TODO(danakj): These don't to be stored in unique_ptrs when OutputSurface // TODO(danakj): These don't to be stored in unique_ptrs when OutputSurface
......
...@@ -21,5 +21,6 @@ mojom("compositing") { ...@@ -21,5 +21,6 @@ mojom("compositing") {
"//services/viz/public/interfaces", "//services/viz/public/interfaces",
"//ui/gfx/geometry/mojo", "//ui/gfx/geometry/mojo",
"//ui/gfx/mojo", "//ui/gfx/mojo",
"//ui/latency/mojo:interfaces",
] ]
} }
...@@ -8,6 +8,7 @@ import "mojo/public/mojom/base/time.mojom"; ...@@ -8,6 +8,7 @@ import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/mojo/ca_layer_params.mojom"; import "ui/gfx/mojo/ca_layer_params.mojom";
import "ui/gfx/mojo/color_space.mojom"; import "ui/gfx/mojo/color_space.mojom";
import "ui/gfx/mojo/transform.mojom"; import "ui/gfx/mojo/transform.mojom";
import "ui/latency/mojo/latency_info.mojom";
// See ui/compositor/compositor.h: ContextFactoryPrivate. // See ui/compositor/compositor.h: ContextFactoryPrivate.
// The DisplayPrivate is used by privileged clients to talk to Display. // The DisplayPrivate is used by privileged clients to talk to Display.
...@@ -37,4 +38,8 @@ interface DisplayPrivate { ...@@ -37,4 +38,8 @@ interface DisplayPrivate {
interface DisplayClient { interface DisplayClient {
OnDisplayReceivedCALayerParams(gfx.mojom.CALayerParams ca_layer_params); OnDisplayReceivedCALayerParams(gfx.mojom.CALayerParams ca_layer_params);
// Notifies that a swap has occured after some latency info with snapshot
// component reached the display.
DidSwapAfterSnapshotRequestReceived(array<ui.mojom.LatencyInfo> latency_info);
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment