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>,
void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override {}
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
// viz::mojom::CompositorFrameSinkClient implementation.
void DidReceiveCompositorFrameAck(
......
......@@ -19,6 +19,8 @@ class FakeOutputSurfaceClient : public viz::OutputSurfaceClient {
const gpu::TextureInUseResponses& responses) override {}
void DidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override {}
void DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) override {}
int swap_count() { return swap_count_; }
......
......@@ -492,6 +492,22 @@ void Display::DidReceivePresentationFeedback(
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) {
aggregator_->SetFullDamageForSurface(current_surface_id_);
if (scheduler_) {
......
......@@ -109,6 +109,8 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient,
void DidReceivePresentationFeedback(
uint64_t swap_id,
const gfx::PresentationFeedback& feedback) override;
void DidFinishLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) override;
// LatestLocalSurfaceIdLookupDelegate implementation.
LocalSurfaceId GetSurfaceAtAggregation(
......
......@@ -11,6 +11,10 @@ namespace gfx {
struct CALayerParams;
} // namespace gfx
namespace ui {
class LatencyInfo;
} // namespace ui
namespace viz {
class DisplayClient {
......@@ -22,6 +26,11 @@ class DisplayClient {
virtual void DisplayDidDrawAndSwap() = 0;
virtual void DisplayDidReceiveCALayerParams(
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
......
......@@ -187,6 +187,8 @@ class StubDisplayClient : public DisplayClient {
void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams(
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) {
......
......@@ -13,6 +13,7 @@
#include "components/viz/service/viz_service_export.h"
#include "gpu/command_buffer/common/texture_in_use_response.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/latency/latency_info.h"
namespace gfx {
struct CALayerParams;
......@@ -44,6 +45,10 @@ class VIZ_SERVICE_EXPORT OutputSurfaceClient {
uint64_t swap_id,
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:
virtual ~OutputSurfaceClient() {}
};
......
......@@ -153,6 +153,7 @@ void GLOutputSurface::LatencyInfoCompleted(
for (const auto& latency : latency_info) {
latency_tracker_.OnGpuSwapBuffersCompleted(latency);
}
client_->DidFinishLatencyInfo(latency_info);
}
void GLOutputSurface::OnVSyncParametersUpdated(base::TimeTicks timebase,
......
......@@ -127,6 +127,7 @@ uint32_t SoftwareOutputSurface::GetFramebufferCopyTextureFormat() {
void SoftwareOutputSurface::SwapBuffersCallback(uint64_t swap_id) {
for (const auto& latency : stored_latency_info_)
latency_tracker_.OnGpuSwapBuffersCompleted(latency);
client_->DidFinishLatencyInfo(stored_latency_info_);
std::vector<ui::LatencyInfo>().swap(stored_latency_info_);
client_->DidReceiveSwapBuffersAck(swap_id);
client_->DidReceivePresentationFeedback(
......
......@@ -155,6 +155,12 @@ void DirectLayerTreeFrameSink::DisplayDidReceiveCALayerParams(
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(
const std::vector<ReturnedResource>& resources) {
// Submitting a CompositorFrame can synchronously draw and dispatch a frame
......
......@@ -64,6 +64,8 @@ class VIZ_SERVICE_EXPORT DirectLayerTreeFrameSink
void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
private:
// mojom::CompositorFrameSinkClient implementation:
......
......@@ -167,6 +167,11 @@ void RootCompositorFrameSinkImpl::DisplayDidReceiveCALayerParams(
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::OnClientConnectionLost() {
......
......@@ -72,6 +72,8 @@ class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink,
void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
void OnClientConnectionLost();
......
......@@ -77,6 +77,7 @@ viz_static_library("test_support") {
"//testing/gtest",
"//ui/gfx/geometry",
"//ui/gl",
"//ui/latency:test_support",
]
}
......
......@@ -18,8 +18,10 @@ class MockDisplayClient : public mojom::DisplayClient {
mojom::DisplayClientPtr BindInterfacePtr();
// mojom::CompositorFrameSinkClient implementation.
// mojom::DisplayClient implementation.
MOCK_METHOD1(OnDisplayReceivedCALayerParams, void(const gfx::CALayerParams&));
MOCK_METHOD1(DidSwapAfterSnapshotRequestReceived,
void(const std::vector<ui::LatencyInfo>&));
private:
mojo::Binding<mojom::DisplayClient> binding_;
......
......@@ -116,6 +116,8 @@ class TestLayerTreeFrameSink : public cc::LayerTreeFrameSink,
void DisplayDidDrawAndSwap() override;
void DisplayDidReceiveCALayerParams(
const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override {}
const std::set<SharedBitmapId>& owned_bitmaps() const {
return owned_bitmaps_;
......
......@@ -4,6 +4,8 @@
#include "content/browser/compositor/in_process_display_client.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#if defined(OS_MACOSX)
#include "ui/accelerated_widget_mac/ca_layer_frame_sink.h"
#endif
......@@ -40,4 +42,9 @@ void InProcessDisplayClient::OnDisplayReceivedCALayerParams(
#endif
}
void InProcessDisplayClient::DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) {
RenderWidgetHostImpl::OnGpuSwapBuffersCompleted(latency_info);
}
} // namespace content
......@@ -26,6 +26,8 @@ class InProcessDisplayClient : public viz::mojom::DisplayClient {
// viz::mojom::DisplayClient implementation:
void OnDisplayReceivedCALayerParams(
const gfx::CALayerParams& ca_layer_params) override;
void DidSwapAfterSnapshotRequestReceived(
const std::vector<ui::LatencyInfo>& latency_info) override;
mojo::Binding<viz::mojom::DisplayClient> binding_;
#if defined(OS_MACOSX)
......
......@@ -171,6 +171,8 @@ class SynchronousLayerTreeFrameSink
void DisplayDidDrawAndSwap() override {}
void DisplayDidReceiveCALayerParams(
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
......
......@@ -21,5 +21,6 @@ mojom("compositing") {
"//services/viz/public/interfaces",
"//ui/gfx/geometry/mojo",
"//ui/gfx/mojo",
"//ui/latency/mojo:interfaces",
]
}
......@@ -8,6 +8,7 @@ import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/mojo/ca_layer_params.mojom";
import "ui/gfx/mojo/color_space.mojom";
import "ui/gfx/mojo/transform.mojom";
import "ui/latency/mojo/latency_info.mojom";
// See ui/compositor/compositor.h: ContextFactoryPrivate.
// The DisplayPrivate is used by privileged clients to talk to Display.
......@@ -37,4 +38,8 @@ interface DisplayPrivate {
interface DisplayClient {
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