Index: components/display_compositor/display_compositor.cc |
diff --git a/components/display_compositor/display_compositor.cc b/components/display_compositor/display_compositor.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9e7042d80e0942fae40683007cce7f7fb1ede9ac |
--- /dev/null |
+++ b/components/display_compositor/display_compositor.cc |
@@ -0,0 +1,102 @@ |
+// 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/display_compositor/display_compositor.h" |
+ |
+#include "cc/base/switches.h" |
+#include "cc/surfaces/surface.h" |
+#include "components/display_compositor/gpu_offscreen_compositor_frame_sink.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
+ |
+namespace display_compositor { |
+ |
+DisplayCompositor::DisplayCompositor() |
+ : surface_manager_(cc::SurfaceManager::LifetimeType::SEQUENCES), |
+ binding_(this) { |
+ surface_manager_.AddObserver(this); |
+} |
+ |
+DisplayCompositor::DisplayCompositor( |
+ cc::mojom::DisplayCompositorRequest request, |
+ cc::mojom::DisplayCompositorClientPtr client) |
+ : surface_manager_(cc::SurfaceManager::LifetimeType::SEQUENCES), |
+ client_(std::move(client)), |
+ binding_(this, std::move(request)) { |
+ surface_manager_.AddObserver(this); |
+} |
+ |
+DisplayCompositor::~DisplayCompositor() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ surface_manager_.RemoveObserver(this); |
+} |
+ |
+void DisplayCompositor::Bind(cc::mojom::DisplayCompositorRequest request, |
+ cc::mojom::DisplayCompositorClientPtr client) { |
+ binding_.Bind(std::move(request)); |
+ client_ = std::move(client); |
+} |
+ |
+void DisplayCompositor::OnClientConnectionLost( |
+ const cc::FrameSinkId& frame_sink_id, |
+ bool destroy_compositor_frame_sink) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (destroy_compositor_frame_sink) |
+ DestroyCompositorFrameSink(frame_sink_id); |
+ // TODO(fsamuel): Tell the display compositor host that the client connection |
+ // has been lost so that it can drop its private connection and allow a new |
+ // client instance to create a new CompositorFrameSink. |
+} |
+ |
+void DisplayCompositor::OnPrivateConnectionLost( |
+ const cc::FrameSinkId& frame_sink_id, |
+ bool destroy_compositor_frame_sink) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (destroy_compositor_frame_sink) |
+ DestroyCompositorFrameSink(frame_sink_id); |
+} |
+ |
+void DisplayCompositor::CreateDisplayCompositorFrameSink( |
+ const cc::FrameSinkId& frame_sink_id, |
+ gpu::SurfaceHandle surface_handle, |
+ cc::mojom::MojoCompositorFrameSinkAssociatedRequest request, |
+ cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, |
+ cc::mojom::MojoCompositorFrameSinkClientPtr client, |
+ cc::mojom::DisplayPrivateAssociatedRequest display_private_request) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); |
+ DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); |
+ // TODO(fsamuel, kylechar): Implement this. |
+ NOTREACHED(); |
+} |
+ |
+void DisplayCompositor::CreateOffscreenCompositorFrameSink( |
+ const cc::FrameSinkId& frame_sink_id, |
+ cc::mojom::MojoCompositorFrameSinkRequest request, |
+ cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, |
+ cc::mojom::MojoCompositorFrameSinkClientPtr client) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); |
+ |
+ compositor_frame_sinks_[frame_sink_id] = |
+ base::MakeUnique<GpuOffscreenCompositorFrameSink>( |
+ this, &surface_manager_, frame_sink_id, std::move(request), |
+ std::move(private_request), std::move(client)); |
+} |
+ |
+void DisplayCompositor::DestroyCompositorFrameSink(cc::FrameSinkId sink_id) { |
+ compositor_frame_sinks_.erase(sink_id); |
+} |
+ |
+void DisplayCompositor::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_GT(surface_info.device_scale_factor(), 0.0f); |
+ |
+ if (client_) |
+ client_->OnSurfaceCreated(surface_info); |
+} |
+ |
+void DisplayCompositor::OnSurfaceDamaged(const cc::SurfaceId& surface_id, |
+ bool* changed) {} |
+ |
+} // namespace ui |