summaryrefslogtreecommitdiff
path: root/chromium/components/viz/client/client_layer_tree_frame_sink.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/viz/client/client_layer_tree_frame_sink.cc')
-rw-r--r--chromium/components/viz/client/client_layer_tree_frame_sink.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/chromium/components/viz/client/client_layer_tree_frame_sink.cc b/chromium/components/viz/client/client_layer_tree_frame_sink.cc
new file mode 100644
index 00000000000..4425d5f5758
--- /dev/null
+++ b/chromium/components/viz/client/client_layer_tree_frame_sink.cc
@@ -0,0 +1,167 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/viz/client/client_layer_tree_frame_sink.h"
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "cc/output/begin_frame_args.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/output/layer_tree_frame_sink_client.h"
+#include "components/viz/client/local_surface_id_provider.h"
+#include "components/viz/common/resources/shared_bitmap_manager.h"
+
+namespace viz {
+
+ClientLayerTreeFrameSink::ClientLayerTreeFrameSink(
+ scoped_refptr<ContextProvider> context_provider,
+ scoped_refptr<ContextProvider> worker_context_provider,
+ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+ SharedBitmapManager* shared_bitmap_manager,
+ std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
+ cc::mojom::CompositorFrameSinkPtrInfo compositor_frame_sink_info,
+ cc::mojom::CompositorFrameSinkClientRequest client_request,
+ std::unique_ptr<LocalSurfaceIdProvider> local_surface_id_provider,
+ bool enable_surface_synchronization)
+ : cc::LayerTreeFrameSink(std::move(context_provider),
+ std::move(worker_context_provider),
+ gpu_memory_buffer_manager,
+ shared_bitmap_manager),
+ local_surface_id_provider_(std::move(local_surface_id_provider)),
+ synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
+ compositor_frame_sink_info_(std::move(compositor_frame_sink_info)),
+ client_request_(std::move(client_request)),
+ client_binding_(this),
+ enable_surface_synchronization_(enable_surface_synchronization),
+ weak_factory_(this) {
+ DETACH_FROM_THREAD(thread_checker_);
+}
+
+ClientLayerTreeFrameSink::ClientLayerTreeFrameSink(
+ scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
+ std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
+ cc::mojom::CompositorFrameSinkPtrInfo compositor_frame_sink_info,
+ cc::mojom::CompositorFrameSinkClientRequest client_request,
+ std::unique_ptr<LocalSurfaceIdProvider> local_surface_id_provider,
+ bool enable_surface_synchronization)
+ : cc::LayerTreeFrameSink(std::move(vulkan_context_provider)),
+ local_surface_id_provider_(std::move(local_surface_id_provider)),
+ synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
+ compositor_frame_sink_info_(std::move(compositor_frame_sink_info)),
+ client_request_(std::move(client_request)),
+ client_binding_(this),
+ enable_surface_synchronization_(enable_surface_synchronization),
+ weak_factory_(this) {
+ DETACH_FROM_THREAD(thread_checker_);
+}
+
+ClientLayerTreeFrameSink::~ClientLayerTreeFrameSink() {}
+
+base::WeakPtr<ClientLayerTreeFrameSink> ClientLayerTreeFrameSink::GetWeakPtr() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ return weak_factory_.GetWeakPtr();
+}
+
+bool ClientLayerTreeFrameSink::BindToClient(
+ cc::LayerTreeFrameSinkClient* client) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ if (!cc::LayerTreeFrameSink::BindToClient(client))
+ return false;
+
+ compositor_frame_sink_.Bind(std::move(compositor_frame_sink_info_));
+ compositor_frame_sink_.set_connection_error_with_reason_handler(
+ base::Bind(ClientLayerTreeFrameSink::OnMojoConnectionError));
+ client_binding_.Bind(std::move(client_request_));
+
+ if (synthetic_begin_frame_source_) {
+ client->SetBeginFrameSource(synthetic_begin_frame_source_.get());
+ } else {
+ begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this);
+ begin_frame_source_->OnSetBeginFrameSourcePaused(begin_frames_paused_);
+ client->SetBeginFrameSource(begin_frame_source_.get());
+ }
+
+ return true;
+}
+
+void ClientLayerTreeFrameSink::DetachFromClient() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ client_->SetBeginFrameSource(nullptr);
+ begin_frame_source_.reset();
+ synthetic_begin_frame_source_.reset();
+ client_binding_.Close();
+ compositor_frame_sink_.reset();
+ cc::LayerTreeFrameSink::DetachFromClient();
+}
+
+void ClientLayerTreeFrameSink::SetLocalSurfaceId(
+ const LocalSurfaceId& local_surface_id) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(local_surface_id.is_valid());
+ DCHECK(enable_surface_synchronization_);
+ local_surface_id_ = local_surface_id;
+}
+
+void ClientLayerTreeFrameSink::SubmitCompositorFrame(
+ cc::CompositorFrame frame) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(frame.metadata.begin_frame_ack.has_damage);
+ DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber,
+ frame.metadata.begin_frame_ack.sequence_number);
+
+ if (!enable_surface_synchronization_) {
+ local_surface_id_ =
+ local_surface_id_provider_->GetLocalSurfaceIdForFrame(frame);
+ }
+
+ compositor_frame_sink_->SubmitCompositorFrame(local_surface_id_,
+ std::move(frame));
+}
+
+void ClientLayerTreeFrameSink::DidNotProduceFrame(
+ const cc::BeginFrameAck& ack) {
+ DCHECK(!ack.has_damage);
+ DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
+ compositor_frame_sink_->DidNotProduceFrame(ack);
+}
+
+void ClientLayerTreeFrameSink::DidReceiveCompositorFrameAck(
+ const std::vector<cc::ReturnedResource>& resources) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ client_->ReclaimResources(resources);
+ client_->DidReceiveCompositorFrameAck();
+}
+
+void ClientLayerTreeFrameSink::OnBeginFrame(
+ const cc::BeginFrameArgs& begin_frame_args) {
+ if (begin_frame_source_)
+ begin_frame_source_->OnBeginFrame(begin_frame_args);
+}
+
+void ClientLayerTreeFrameSink::OnBeginFramePausedChanged(bool paused) {
+ begin_frames_paused_ = paused;
+ if (begin_frame_source_)
+ begin_frame_source_->OnSetBeginFrameSourcePaused(paused);
+}
+
+void ClientLayerTreeFrameSink::ReclaimResources(
+ const std::vector<cc::ReturnedResource>& resources) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ client_->ReclaimResources(resources);
+}
+
+void ClientLayerTreeFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
+ compositor_frame_sink_->SetNeedsBeginFrame(needs_begin_frames);
+}
+
+// static
+void ClientLayerTreeFrameSink::OnMojoConnectionError(
+ uint32_t custom_reason,
+ const std::string& description) {
+ if (custom_reason)
+ DLOG(FATAL) << description;
+}
+
+} // namespace viz