| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "services/ui/surfaces/display_compositor.h" | 5 #include "services/ui/surfaces/display_compositor.h" |
| 6 | 6 |
| 7 #include "cc/output/in_process_context_provider.h" | 7 #include "cc/output/in_process_context_provider.h" |
| 8 #include "cc/surfaces/surface.h" | 8 #include "cc/surfaces/surface.h" |
| 9 #include "gpu/command_buffer/client/shared_memory_limits.h" | 9 #include "gpu/command_buffer/client/shared_memory_limits.h" |
| 10 #include "gpu/ipc/gpu_in_process_thread_service.h" | 10 #include "gpu/ipc/gpu_in_process_thread_service.h" |
| 11 #include "mojo/public/cpp/bindings/strong_binding.h" | 11 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 12 #include "services/ui/common/mus_gpu_memory_buffer_manager.h" | 12 #include "services/ui/common/mus_gpu_memory_buffer_manager.h" |
| 13 #include "services/ui/surfaces/gpu_compositor_frame_sink.h" | 13 #include "services/ui/surfaces/gpu_compositor_frame_sink.h" |
| 14 | 14 |
| 15 namespace ui { | 15 namespace ui { |
| 16 | 16 |
| 17 DisplayCompositor::DisplayCompositor( | 17 DisplayCompositor::DisplayCompositor( |
| 18 scoped_refptr<gpu::InProcessCommandBuffer::Service> gpu_service, | 18 scoped_refptr<gpu::InProcessCommandBuffer::Service> gpu_service, |
| 19 std::unique_ptr<MusGpuMemoryBufferManager> gpu_memory_buffer_manager, | 19 std::unique_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager, |
| 20 gpu::ImageFactory* image_factory, | 20 gpu::ImageFactory* image_factory, |
| 21 cc::mojom::DisplayCompositorRequest request, | 21 cc::mojom::DisplayCompositorRequest request, |
| 22 cc::mojom::DisplayCompositorClientPtr client) | 22 cc::mojom::DisplayCompositorClientPtr client) |
| 23 : gpu_service_(std::move(gpu_service)), | 23 : gpu_service_(std::move(gpu_service)), |
| 24 gpu_memory_buffer_manager_(std::move(gpu_memory_buffer_manager)), | 24 gpu_memory_buffer_manager_(std::move(gpu_memory_buffer_manager)), |
| 25 image_factory_(image_factory), | 25 image_factory_(image_factory), |
| 26 client_(std::move(client)), | 26 client_(std::move(client)), |
| 27 binding_(this, std::move(request)) { | 27 binding_(this, std::move(request)) { |
| 28 manager_.AddObserver(this); | 28 manager_.AddObserver(this); |
| 29 } | 29 } |
| 30 | 30 |
| 31 void DisplayCompositor::CreateCompositorFrameSink( | 31 void DisplayCompositor::CreateCompositorFrameSink( |
| 32 const cc::FrameSinkId& frame_sink_id, | 32 const cc::FrameSinkId& frame_sink_id, |
| 33 gpu::SurfaceHandle surface_handle, | 33 gpu::SurfaceHandle surface_handle, |
| 34 cc::mojom::MojoCompositorFrameSinkRequest request, | 34 cc::mojom::MojoCompositorFrameSinkRequest request, |
| 35 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, | 35 cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, |
| 36 cc::mojom::MojoCompositorFrameSinkClientPtr client) { | 36 cc::mojom::MojoCompositorFrameSinkClientPtr client) { |
| 37 DCHECK(thread_checker_.CalledOnValidThread()); |
| 37 // We cannot create more than one CompositorFrameSink with a given | 38 // We cannot create more than one CompositorFrameSink with a given |
| 38 // |frame_sink_id|. | 39 // |frame_sink_id|. |
| 39 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); | 40 DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); |
| 40 scoped_refptr<cc::InProcessContextProvider> context_provider; | 41 scoped_refptr<cc::InProcessContextProvider> context_provider; |
| 41 if (surface_handle != gpu::kNullSurfaceHandle) { | 42 if (surface_handle != gpu::kNullSurfaceHandle) { |
| 42 context_provider = new cc::InProcessContextProvider( | 43 context_provider = new cc::InProcessContextProvider( |
| 43 gpu_service_, surface_handle, gpu_memory_buffer_manager_.get(), | 44 gpu_service_, surface_handle, gpu_memory_buffer_manager_.get(), |
| 44 image_factory_, gpu::SharedMemoryLimits(), | 45 image_factory_, gpu::SharedMemoryLimits(), |
| 45 nullptr /* shared_context */); | 46 nullptr /* shared_context */); |
| 46 } | 47 } |
| 47 compositor_frame_sinks_[frame_sink_id] = | 48 compositor_frame_sinks_[frame_sink_id] = |
| 48 base::MakeUnique<GpuCompositorFrameSink>( | 49 base::MakeUnique<GpuCompositorFrameSink>( |
| 49 this, frame_sink_id, surface_handle, gpu_memory_buffer_manager_.get(), | 50 this, frame_sink_id, surface_handle, gpu_memory_buffer_manager_.get(), |
| 50 std::move(context_provider), std::move(request), | 51 std::move(context_provider), std::move(request), |
| 51 std::move(private_request), std::move(client)); | 52 std::move(private_request), std::move(client)); |
| 52 } | 53 } |
| 53 | 54 |
| 54 void DisplayCompositor::AddRootSurfaceReference(const cc::SurfaceId& child_id) { | 55 void DisplayCompositor::AddRootSurfaceReference(const cc::SurfaceId& child_id) { |
| 56 DCHECK(thread_checker_.CalledOnValidThread()); |
| 55 AddSurfaceReference(manager_.GetRootSurfaceId(), child_id); | 57 AddSurfaceReference(manager_.GetRootSurfaceId(), child_id); |
| 56 } | 58 } |
| 57 | 59 |
| 58 void DisplayCompositor::AddSurfaceReference(const cc::SurfaceId& parent_id, | 60 void DisplayCompositor::AddSurfaceReference(const cc::SurfaceId& parent_id, |
| 59 const cc::SurfaceId& child_id) { | 61 const cc::SurfaceId& child_id) { |
| 62 DCHECK(thread_checker_.CalledOnValidThread()); |
| 60 auto vector_iter = temp_references_.find(child_id.frame_sink_id()); | 63 auto vector_iter = temp_references_.find(child_id.frame_sink_id()); |
| 61 | 64 |
| 62 // If there are no temporary references for the FrameSinkId then we can just | 65 // If there are no temporary references for the FrameSinkId then we can just |
| 63 // add reference and return. | 66 // add reference and return. |
| 64 if (vector_iter == temp_references_.end()) { | 67 if (vector_iter == temp_references_.end()) { |
| 65 manager_.AddSurfaceReference(parent_id, child_id); | 68 manager_.AddSurfaceReference(parent_id, child_id); |
| 66 return; | 69 return; |
| 67 } | 70 } |
| 68 | 71 |
| 69 // Get the vector<LocalFrameId> for the appropriate FrameSinkId and look for | 72 // Get the vector<LocalFrameId> for the appropriate FrameSinkId and look for |
| (...skipping 30 matching lines...) Expand all Loading... |
| 100 // element in |refs| then we are removing all temporary references for the | 103 // element in |refs| then we are removing all temporary references for the |
| 101 // FrameSinkId and can remove the map entry entirely. | 104 // FrameSinkId and can remove the map entry entirely. |
| 102 if (++temp_ref_iter == refs.end()) | 105 if (++temp_ref_iter == refs.end()) |
| 103 temp_references_.erase(child_id.frame_sink_id()); | 106 temp_references_.erase(child_id.frame_sink_id()); |
| 104 else | 107 else |
| 105 refs.erase(refs.begin(), ++temp_ref_iter); | 108 refs.erase(refs.begin(), ++temp_ref_iter); |
| 106 } | 109 } |
| 107 | 110 |
| 108 void DisplayCompositor::RemoveRootSurfaceReference( | 111 void DisplayCompositor::RemoveRootSurfaceReference( |
| 109 const cc::SurfaceId& child_id) { | 112 const cc::SurfaceId& child_id) { |
| 113 DCHECK(thread_checker_.CalledOnValidThread()); |
| 110 RemoveSurfaceReference(manager_.GetRootSurfaceId(), child_id); | 114 RemoveSurfaceReference(manager_.GetRootSurfaceId(), child_id); |
| 111 } | 115 } |
| 112 | 116 |
| 113 void DisplayCompositor::RemoveSurfaceReference(const cc::SurfaceId& parent_id, | 117 void DisplayCompositor::RemoveSurfaceReference(const cc::SurfaceId& parent_id, |
| 114 const cc::SurfaceId& child_id) { | 118 const cc::SurfaceId& child_id) { |
| 119 DCHECK(thread_checker_.CalledOnValidThread()); |
| 115 // TODO(kylechar): Each remove reference can trigger GC, it would be better if | 120 // TODO(kylechar): Each remove reference can trigger GC, it would be better if |
| 116 // we GC only once if removing multiple references. | 121 // we GC only once if removing multiple references. |
| 117 manager_.RemoveSurfaceReference(parent_id, child_id); | 122 manager_.RemoveSurfaceReference(parent_id, child_id); |
| 118 } | 123 } |
| 119 | 124 |
| 120 DisplayCompositor::~DisplayCompositor() { | 125 DisplayCompositor::~DisplayCompositor() { |
| 126 DCHECK(thread_checker_.CalledOnValidThread()); |
| 121 // Remove all temporary references on shutdown. | 127 // Remove all temporary references on shutdown. |
| 122 for (auto& map_entry : temp_references_) { | 128 for (auto& map_entry : temp_references_) { |
| 123 const cc::FrameSinkId& frame_sink_id = map_entry.first; | 129 const cc::FrameSinkId& frame_sink_id = map_entry.first; |
| 124 for (auto& local_frame_id : map_entry.second) { | 130 for (auto& local_frame_id : map_entry.second) { |
| 125 manager_.RemoveSurfaceReference( | 131 manager_.RemoveSurfaceReference( |
| 126 manager_.GetRootSurfaceId(), | 132 manager_.GetRootSurfaceId(), |
| 127 cc::SurfaceId(frame_sink_id, local_frame_id)); | 133 cc::SurfaceId(frame_sink_id, local_frame_id)); |
| 128 } | 134 } |
| 129 } | 135 } |
| 130 manager_.RemoveObserver(this); | 136 manager_.RemoveObserver(this); |
| 131 } | 137 } |
| 132 | 138 |
| 133 void DisplayCompositor::OnCompositorFrameSinkClientConnectionLost( | 139 void DisplayCompositor::OnCompositorFrameSinkClientConnectionLost( |
| 134 const cc::FrameSinkId& frame_sink_id, | 140 const cc::FrameSinkId& frame_sink_id, |
| 135 bool destroy_compositor_frame_sink) { | 141 bool destroy_compositor_frame_sink) { |
| 142 DCHECK(thread_checker_.CalledOnValidThread()); |
| 136 if (destroy_compositor_frame_sink) | 143 if (destroy_compositor_frame_sink) |
| 137 compositor_frame_sinks_.erase(frame_sink_id); | 144 compositor_frame_sinks_.erase(frame_sink_id); |
| 138 // TODO(fsamuel): Tell the display compositor host that the client connection | 145 // TODO(fsamuel): Tell the display compositor host that the client connection |
| 139 // has been lost so that it can drop its private connection and allow a new | 146 // has been lost so that it can drop its private connection and allow a new |
| 140 // client instance to create a new CompositorFrameSink. | 147 // client instance to create a new CompositorFrameSink. |
| 141 } | 148 } |
| 142 | 149 |
| 143 void DisplayCompositor::OnCompositorFrameSinkPrivateConnectionLost( | 150 void DisplayCompositor::OnCompositorFrameSinkPrivateConnectionLost( |
| 144 const cc::FrameSinkId& frame_sink_id, | 151 const cc::FrameSinkId& frame_sink_id, |
| 145 bool destroy_compositor_frame_sink) { | 152 bool destroy_compositor_frame_sink) { |
| 153 DCHECK(thread_checker_.CalledOnValidThread()); |
| 146 if (destroy_compositor_frame_sink) | 154 if (destroy_compositor_frame_sink) |
| 147 compositor_frame_sinks_.erase(frame_sink_id); | 155 compositor_frame_sinks_.erase(frame_sink_id); |
| 148 } | 156 } |
| 149 | 157 |
| 150 void DisplayCompositor::OnSurfaceCreated(const cc::SurfaceId& surface_id, | 158 void DisplayCompositor::OnSurfaceCreated(const cc::SurfaceId& surface_id, |
| 151 const gfx::Size& frame_size, | 159 const gfx::Size& frame_size, |
| 152 float device_scale_factor) { | 160 float device_scale_factor) { |
| 161 DCHECK(thread_checker_.CalledOnValidThread()); |
| 153 // We can get into a situation where multiple CompositorFrames arrive for a | 162 // We can get into a situation where multiple CompositorFrames arrive for a |
| 154 // CompositorFrameSink before the DisplayCompositorClient can add any | 163 // CompositorFrameSink before the DisplayCompositorClient can add any |
| 155 // references for the frame. When the second frame with a new size arrives, | 164 // references for the frame. When the second frame with a new size arrives, |
| 156 // the first will be destroyed and then if there are no references it will be | 165 // the first will be destroyed and then if there are no references it will be |
| 157 // deleted during surface GC. A temporary reference, removed when a real | 166 // deleted during surface GC. A temporary reference, removed when a real |
| 158 // reference is received, is added to prevent this from happening. | 167 // reference is received, is added to prevent this from happening. |
| 159 manager_.AddSurfaceReference(manager_.GetRootSurfaceId(), surface_id); | 168 manager_.AddSurfaceReference(manager_.GetRootSurfaceId(), surface_id); |
| 160 temp_references_[surface_id.frame_sink_id()].push_back( | 169 temp_references_[surface_id.frame_sink_id()].push_back( |
| 161 surface_id.local_frame_id()); | 170 surface_id.local_frame_id()); |
| 162 | 171 |
| 163 if (client_) | 172 if (client_) |
| 164 client_->OnSurfaceCreated(surface_id, frame_size, device_scale_factor); | 173 client_->OnSurfaceCreated(surface_id, frame_size, device_scale_factor); |
| 165 } | 174 } |
| 166 | 175 |
| 167 void DisplayCompositor::OnSurfaceDamaged(const cc::SurfaceId& surface_id, | 176 void DisplayCompositor::OnSurfaceDamaged(const cc::SurfaceId& surface_id, |
| 168 bool* changed) {} | 177 bool* changed) {} |
| 169 | 178 |
| 170 } // namespace ui | 179 } // namespace ui |
| OLD | NEW |