Chromium Code Reviews| 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..0c684beefd879c28350843180b1b3975d6b6d66c 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,8 @@ |
| #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" |
| +#include "base/debug/stack_trace.h" |
|
rjkroege
2016/11/05 00:59:50
do you need this?
Fady Samuel
2016/11/05 11:56:03
Done.
|
| +#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 +24,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 +49,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; |