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 |
index 97812ccc1f7eb936e42e8ff012f7f0faea5987a5..97a2abac42b2e660af2eda50ff80b2315e81cfe8 100644 |
--- a/services/ui/ws/server_window_compositor_frame_sink_manager.cc |
+++ b/services/ui/ws/server_window_compositor_frame_sink_manager.cc |
@@ -4,6 +4,7 @@ |
#include "services/ui/ws/server_window_compositor_frame_sink_manager.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
#include "services/ui/surfaces/display_compositor.h" |
#include "services/ui/ws/ids.h" |
#include "services/ui/ws/server_window.h" |
@@ -22,9 +23,6 @@ ServerWindowCompositorFrameSinkManager::ServerWindowCompositorFrameSinkManager( |
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() { |
@@ -50,15 +48,56 @@ void ServerWindowCompositorFrameSinkManager::CreateCompositorFrameSink( |
static_cast<uint32_t>(compositor_frame_sink_type)); |
CompositorFrameSinkData& data = |
type_to_compositor_frame_sink_map_[compositor_frame_sink_type]; |
+ |
+ cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request; |
+ if (data.pending_compositor_frame_sink_request.is_pending()) { |
+ private_request = std::move(data.pending_compositor_frame_sink_request); |
+ } else { |
+ private_request = mojo::GetProxy(&data.compositor_frame_sink); |
+ } |
+ |
// TODO(fsamuel): Create the CompositorFrameSink through the DisplayCompositor |
- // mojo interface and hold on to a MojoCompositorFrameSinkPtr. |
- data.compositor_frame_sink = |
+ // mojo interface. |
+ mojo::MakeStrongBinding( |
base::MakeUnique<ServerWindowCompositorFrameSink>( |
- this, frame_sink_id, widget, gpu_memory_buffer_manager, |
- std::move(context_provider), std::move(request), std::move(client)); |
+ window_->delegate()->GetDisplayCompositor(), frame_sink_id, widget, |
+ gpu_memory_buffer_manager, std::move(context_provider), |
+ std::move(request), std::move(client)), |
+ std::move(private_request)); |
+ if (window_->parent()) { |
+ window_->delegate() |
+ ->GetRootWindow(window_) |
+ ->GetOrCreateCompositorFrameSinkManager() |
+ ->AddChildFrameSinkId(mojom::CompositorFrameSinkType::DEFAULT, |
+ frame_sink_id); |
+ } |
+ |
data.surface_sequence_generator.set_frame_sink_id(frame_sink_id); |
} |
+void ServerWindowCompositorFrameSinkManager::AddChildFrameSinkId( |
+ mojom::CompositorFrameSinkType compositor_frame_sink_type, |
+ const cc::FrameSinkId& frame_sink_id) { |
+ auto it = type_to_compositor_frame_sink_map_.find(compositor_frame_sink_type); |
+ if (it != type_to_compositor_frame_sink_map_.end()) { |
+ it->second.compositor_frame_sink->AddChildFrameSink(frame_sink_id); |
+ return; |
+ } |
+ CompositorFrameSinkData& data = |
+ type_to_compositor_frame_sink_map_[compositor_frame_sink_type]; |
+ data.pending_compositor_frame_sink_request = |
+ mojo::GetProxy(&data.compositor_frame_sink); |
+ data.compositor_frame_sink->AddChildFrameSink(frame_sink_id); |
+} |
+ |
+void ServerWindowCompositorFrameSinkManager::RemoveChildFrameSinkId( |
+ mojom::CompositorFrameSinkType compositor_frame_sink_type, |
+ const cc::FrameSinkId& frame_sink_id) { |
+ auto it = type_to_compositor_frame_sink_map_.find(compositor_frame_sink_type); |
+ DCHECK(it != type_to_compositor_frame_sink_map_.end()); |
+ it->second.compositor_frame_sink->AddChildFrameSink(frame_sink_id); |
+} |
+ |
bool ServerWindowCompositorFrameSinkManager::HasCompositorFrameSinkOfType( |
mojom::CompositorFrameSinkType type) const { |
return type_to_compositor_frame_sink_map_.count(type) > 0; |