Index: services/ui/ws/server_window_compositor_frame_sink_manager.cc |
diff --git a/services/ui/ws/server_window_compositor_frame_sink_manager.cc b/services/ui/ws/server_window_compositor_frame_sink_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43153a0a2dffca627ee03ab92326b0a770c6483c |
--- /dev/null |
+++ b/services/ui/ws/server_window_compositor_frame_sink_manager.cc |
@@ -0,0 +1,102 @@ |
+// Copyright 2015 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 "services/ui/ws/server_window_compositor_frame_sink_manager.h" |
+ |
+#include "services/ui/surfaces/display_compositor.h" |
+#include "services/ui/ws/ids.h" |
+#include "services/ui/ws/server_window.h" |
+#include "services/ui/ws/server_window_compositor_frame_sink.h" |
+#include "services/ui/ws/server_window_delegate.h" |
+ |
+namespace ui { |
+namespace ws { |
+ |
+ServerWindowCompositorFrameSinkManager::ServerWindowCompositorFrameSinkManager( |
+ ServerWindow* window) |
+ : window_(window), |
+ waiting_for_initial_frames_( |
+ window_->properties().count(ui::mojom::kWaitForUnderlay_Property) > |
+ 0) {} |
+ |
+ServerWindowCompositorFrameSinkManager:: |
+ ~ServerWindowCompositorFrameSinkManager() { |
+ // Explicitly clear the type to surface manager so that this manager |
+ // is still valid prior during ~ServerWindowCompositorFrameSink. |
+ type_to_compositor_frame_sink_map_.clear(); |
+} |
+ |
+bool ServerWindowCompositorFrameSinkManager::ShouldDraw() { |
+ if (!waiting_for_initial_frames_) |
+ return true; |
+ |
+ waiting_for_initial_frames_ = !IsCompositorFrameSinkReadyAndNonEmpty( |
+ mojom::CompositorFrameSinkType::DEFAULT) || |
+ !IsCompositorFrameSinkReadyAndNonEmpty( |
+ mojom::CompositorFrameSinkType::UNDERLAY); |
+ return !waiting_for_initial_frames_; |
+} |
+ |
+void ServerWindowCompositorFrameSinkManager::CreateCompositorFrameSink( |
+ mojom::CompositorFrameSinkType compositor_frame_sink_type, |
+ mojo::InterfaceRequest<cc::mojom::MojoCompositorFrameSink> request, |
+ cc::mojom::MojoCompositorFrameSinkClientPtr client) { |
+ cc::FrameSinkId frame_sink_id( |
+ WindowIdToTransportId(window_->id()), |
+ static_cast<uint32_t>(compositor_frame_sink_type)); |
+ std::unique_ptr<ServerWindowCompositorFrameSink> compositor_frame_sink( |
+ new ServerWindowCompositorFrameSink( |
+ this, frame_sink_id, std::move(request), std::move(client))); |
+ type_to_compositor_frame_sink_map_[compositor_frame_sink_type] = |
+ std::move(compositor_frame_sink); |
+} |
+ |
+ServerWindowCompositorFrameSink* |
+ServerWindowCompositorFrameSinkManager::GetDefaultCompositorFrameSink() const { |
+ return GetCompositorFrameSinkByType(mojom::CompositorFrameSinkType::DEFAULT); |
+} |
+ |
+ServerWindowCompositorFrameSink* |
+ServerWindowCompositorFrameSinkManager::GetUnderlayCompositorFrameSink() const { |
+ return GetCompositorFrameSinkByType(mojom::CompositorFrameSinkType::UNDERLAY); |
+} |
+ |
+ServerWindowCompositorFrameSink* |
+ServerWindowCompositorFrameSinkManager::GetCompositorFrameSinkByType( |
+ mojom::CompositorFrameSinkType type) const { |
+ auto iter = type_to_compositor_frame_sink_map_.find(type); |
+ return iter == type_to_compositor_frame_sink_map_.end() ? nullptr |
+ : iter->second.get(); |
+} |
+ |
+bool ServerWindowCompositorFrameSinkManager::HasCompositorFrameSinkOfType( |
+ mojom::CompositorFrameSinkType type) const { |
+ return type_to_compositor_frame_sink_map_.count(type) > 0; |
+} |
+ |
+bool ServerWindowCompositorFrameSinkManager::HasAnyCompositorFrameSink() const { |
+ return GetDefaultCompositorFrameSink() || GetUnderlayCompositorFrameSink(); |
+} |
+ |
+cc::SurfaceManager* |
+ServerWindowCompositorFrameSinkManager::GetCompositorFrameSinkManager() { |
+ return window()->delegate()->GetDisplayCompositor()->manager(); |
+} |
+ |
+bool ServerWindowCompositorFrameSinkManager:: |
+ IsCompositorFrameSinkReadyAndNonEmpty( |
+ mojom::CompositorFrameSinkType type) const { |
+ auto iter = type_to_compositor_frame_sink_map_.find(type); |
+ if (iter == type_to_compositor_frame_sink_map_.end()) |
+ return false; |
+ if (iter->second->last_submitted_frame_size().IsEmpty()) |
+ return false; |
+ const gfx::Size& last_submitted_frame_size = |
+ iter->second->last_submitted_frame_size(); |
+ return last_submitted_frame_size.width() >= window_->bounds().width() && |
+ last_submitted_frame_size.height() >= window_->bounds().height(); |
+} |
+ |
+} // namespace ws |
+} // namespace ui |