Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "blimp/client/feature/compositor/blimp_compositor_manager.h" | 5 #include "blimp/client/feature/compositor/blimp_compositor_manager.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | |
| 8 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 9 #include "blimp/client/core/compositor/blob_image_serialization_processor.h" | 8 #include "blimp/client/core/compositor/blimp_compositor_dependencies.h" |
| 10 #include "blimp/client/feature/compositor/blimp_gpu_memory_buffer_manager.h" | |
| 11 #include "blimp/client/feature/compositor/blimp_layer_tree_settings.h" | |
| 12 #include "blimp/common/compositor/blimp_task_graph_runner.h" | |
| 13 #include "cc/proto/compositor_message.pb.h" | 9 #include "cc/proto/compositor_message.pb.h" |
| 14 | 10 |
| 15 namespace blimp { | 11 namespace blimp { |
| 16 namespace client { | 12 namespace client { |
| 17 | 13 |
| 18 namespace { | 14 namespace { |
| 19 base::LazyInstance<blimp::BlimpTaskGraphRunner> g_task_graph_runner = | |
| 20 LAZY_INSTANCE_INITIALIZER; | |
| 21 | |
| 22 const int kDummyTabId = 0; | 15 const int kDummyTabId = 0; |
| 23 } // namespace | 16 } |
|
Khushal
2016/08/24 23:22:46
nit: keep the namespace?
David Trainor- moved to gerrit
2016/08/26 17:15:54
Done.
| |
| 24 | 17 |
| 25 BlimpCompositorManager::BlimpCompositorManager( | 18 BlimpCompositorManager::BlimpCompositorManager( |
| 26 RenderWidgetFeature* render_widget_feature, | 19 RenderWidgetFeature* render_widget_feature, |
| 27 cc::SurfaceManager* surface_manager, | 20 BlimpCompositorDependencies* compositor_dependencies) |
| 28 BlimpGpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 29 SurfaceIdAllocationCallback callback) | |
| 30 : render_widget_feature_(render_widget_feature), | 21 : render_widget_feature_(render_widget_feature), |
| 31 surface_manager_(surface_manager), | |
| 32 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | |
| 33 surface_id_allocation_callback_(callback), | |
| 34 visible_(false), | 22 visible_(false), |
| 35 layer_(cc::Layer::Create()), | 23 layer_(cc::Layer::Create()), |
| 36 active_compositor_(nullptr) { | 24 active_compositor_(nullptr), |
| 25 compositor_dependencies_(compositor_dependencies) { | |
|
Khushal
2016/08/24 23:22:46
DCHECK compositor_dependencies_?
David Trainor- moved to gerrit
2016/08/26 17:15:54
Done.
| |
| 37 DCHECK(render_widget_feature_); | 26 DCHECK(render_widget_feature_); |
| 38 DCHECK(surface_manager_); | |
| 39 DCHECK(gpu_memory_buffer_manager_); | |
| 40 DCHECK(!surface_id_allocation_callback_.is_null()); | |
| 41 | 27 |
| 42 render_widget_feature_->SetDelegate(kDummyTabId, this); | 28 render_widget_feature_->SetDelegate(kDummyTabId, this); |
| 43 } | 29 } |
| 44 | 30 |
| 45 BlimpCompositorManager::~BlimpCompositorManager() { | 31 BlimpCompositorManager::~BlimpCompositorManager() { |
| 46 render_widget_feature_->RemoveDelegate(kDummyTabId); | 32 render_widget_feature_->RemoveDelegate(kDummyTabId); |
| 47 if (compositor_thread_) | |
| 48 compositor_thread_->Stop(); | |
| 49 } | 33 } |
| 50 | 34 |
| 51 void BlimpCompositorManager::SetVisible(bool visible) { | 35 void BlimpCompositorManager::SetVisible(bool visible) { |
| 52 visible_ = visible; | 36 visible_ = visible; |
| 53 if (active_compositor_) | 37 if (active_compositor_) |
| 54 active_compositor_->SetVisible(visible_); | 38 active_compositor_->SetVisible(visible_); |
| 55 } | 39 } |
| 56 | 40 |
| 57 bool BlimpCompositorManager::OnTouchEvent(const ui::MotionEvent& motion_event) { | 41 bool BlimpCompositorManager::OnTouchEvent(const ui::MotionEvent& motion_event) { |
| 58 if (active_compositor_) | 42 if (active_compositor_) |
| 59 return active_compositor_->OnTouchEvent(motion_event); | 43 return active_compositor_->OnTouchEvent(motion_event); |
| 60 return false; | 44 return false; |
| 61 } | 45 } |
| 62 | 46 |
| 63 void BlimpCompositorManager::GenerateLayerTreeSettings( | |
| 64 cc::LayerTreeSettings* settings) { | |
| 65 PopulateCommonLayerTreeSettings(settings); | |
| 66 } | |
| 67 | |
| 68 std::unique_ptr<BlimpCompositor> BlimpCompositorManager::CreateBlimpCompositor( | 47 std::unique_ptr<BlimpCompositor> BlimpCompositorManager::CreateBlimpCompositor( |
| 69 int render_widget_id, | 48 int render_widget_id, |
| 70 cc::SurfaceManager* surface_manager, | 49 BlimpCompositorDependencies* compositor_dependencies, |
| 71 uint32_t surface_client_id, | |
| 72 BlimpCompositorClient* client) { | 50 BlimpCompositorClient* client) { |
| 73 return base::WrapUnique(new BlimpCompositor(render_widget_id, surface_manager, | 51 return base::WrapUnique( |
| 74 surface_client_id, client)); | 52 new BlimpCompositor(render_widget_id, compositor_dependencies, client)); |
| 75 } | 53 } |
| 76 | 54 |
| 77 void BlimpCompositorManager::OnRenderWidgetCreated(int render_widget_id) { | 55 void BlimpCompositorManager::OnRenderWidgetCreated(int render_widget_id) { |
| 78 CHECK(!GetCompositor(render_widget_id)); | 56 CHECK(!GetCompositor(render_widget_id)); |
| 79 | 57 |
| 80 compositors_[render_widget_id] = | 58 compositors_[render_widget_id] = |
| 81 CreateBlimpCompositor(render_widget_id, surface_manager_, | 59 CreateBlimpCompositor(render_widget_id, compositor_dependencies_, this); |
| 82 surface_id_allocation_callback_.Run(), this); | |
| 83 } | 60 } |
| 84 | 61 |
| 85 void BlimpCompositorManager::OnRenderWidgetInitialized(int render_widget_id) { | 62 void BlimpCompositorManager::OnRenderWidgetInitialized(int render_widget_id) { |
| 86 if (active_compositor_ && | 63 if (active_compositor_ && |
| 87 active_compositor_->render_widget_id() == render_widget_id) | 64 active_compositor_->render_widget_id() == render_widget_id) |
| 88 return; | 65 return; |
| 89 | 66 |
| 90 // Detach the content layer from the old compositor. | 67 // Detach the content layer from the old compositor. |
| 91 layer_->RemoveAllChildren(); | 68 layer_->RemoveAllChildren(); |
| 92 | 69 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 118 | 95 |
| 119 void BlimpCompositorManager::OnCompositorMessageReceived( | 96 void BlimpCompositorManager::OnCompositorMessageReceived( |
| 120 int render_widget_id, | 97 int render_widget_id, |
| 121 std::unique_ptr<cc::proto::CompositorMessage> message) { | 98 std::unique_ptr<cc::proto::CompositorMessage> message) { |
| 122 BlimpCompositor* compositor = GetCompositor(render_widget_id); | 99 BlimpCompositor* compositor = GetCompositor(render_widget_id); |
| 123 CHECK(compositor); | 100 CHECK(compositor); |
| 124 | 101 |
| 125 compositor->OnCompositorMessageReceived(std::move(message)); | 102 compositor->OnCompositorMessageReceived(std::move(message)); |
| 126 } | 103 } |
| 127 | 104 |
| 128 cc::LayerTreeSettings* BlimpCompositorManager::GetLayerTreeSettings() { | |
| 129 if (!settings_) { | |
| 130 settings_.reset(new cc::LayerTreeSettings); | |
| 131 | |
| 132 // TODO(khushalsagar): The server should selectively send only those | |
| 133 // LayerTreeSettings which should remain consistent across the server and | |
| 134 // client. Since it currently overrides all settings, ignore them. | |
| 135 // See crbug/577985. | |
| 136 GenerateLayerTreeSettings(settings_.get()); | |
| 137 settings_ | |
| 138 ->abort_commit_before_output_surface_creation = false; | |
| 139 settings_->renderer_settings.buffer_to_texture_target_map = | |
| 140 BlimpGpuMemoryBufferManager::GetDefaultBufferToTextureTargetMap(); | |
| 141 settings_->use_output_surface_begin_frame_source = true; | |
| 142 } | |
| 143 | |
| 144 return settings_.get(); | |
| 145 } | |
| 146 | |
| 147 scoped_refptr<base::SingleThreadTaskRunner> | |
| 148 BlimpCompositorManager::GetCompositorTaskRunner() { | |
| 149 if (compositor_thread_) | |
| 150 return compositor_thread_->task_runner(); | |
| 151 | |
| 152 base::Thread::Options thread_options; | |
| 153 #if defined(OS_ANDROID) | |
| 154 thread_options.priority = base::ThreadPriority::DISPLAY; | |
| 155 #endif | |
| 156 compositor_thread_.reset(new base::Thread("Compositor")); | |
| 157 compositor_thread_->StartWithOptions(thread_options); | |
| 158 | |
| 159 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | |
| 160 compositor_thread_->task_runner(); | |
| 161 task_runner->PostTask( | |
| 162 FROM_HERE, | |
| 163 base::Bind(base::IgnoreResult(&base::ThreadRestrictions::SetIOAllowed), | |
| 164 false)); | |
| 165 // TODO(dtrainor): Determine whether or not we can disallow waiting. | |
| 166 | |
| 167 return task_runner; | |
| 168 } | |
| 169 | |
| 170 cc::TaskGraphRunner* BlimpCompositorManager::GetTaskGraphRunner() { | |
| 171 return g_task_graph_runner.Pointer(); | |
| 172 } | |
| 173 | |
| 174 gpu::GpuMemoryBufferManager* | |
| 175 BlimpCompositorManager::GetGpuMemoryBufferManager() { | |
| 176 return gpu_memory_buffer_manager_; | |
| 177 } | |
| 178 | |
| 179 cc::ImageSerializationProcessor* | |
| 180 BlimpCompositorManager::GetImageSerializationProcessor() { | |
| 181 return BlobImageSerializationProcessor::current(); | |
| 182 } | |
| 183 | |
| 184 void BlimpCompositorManager::SendWebGestureEvent( | 105 void BlimpCompositorManager::SendWebGestureEvent( |
| 185 int render_widget_id, | 106 int render_widget_id, |
| 186 const blink::WebGestureEvent& gesture_event) { | 107 const blink::WebGestureEvent& gesture_event) { |
| 187 render_widget_feature_->SendWebGestureEvent(kDummyTabId, | 108 render_widget_feature_->SendWebGestureEvent(kDummyTabId, |
| 188 render_widget_id, | 109 render_widget_id, |
| 189 gesture_event); | 110 gesture_event); |
| 190 } | 111 } |
| 191 | 112 |
| 192 void BlimpCompositorManager::SendCompositorMessage( | 113 void BlimpCompositorManager::SendCompositorMessage( |
| 193 int render_widget_id, | 114 int render_widget_id, |
| 194 const cc::proto::CompositorMessage& message) { | 115 const cc::proto::CompositorMessage& message) { |
| 195 render_widget_feature_->SendCompositorMessage(kDummyTabId, | 116 render_widget_feature_->SendCompositorMessage(kDummyTabId, |
| 196 render_widget_id, | 117 render_widget_id, |
| 197 message); | 118 message); |
| 198 } | 119 } |
| 199 | 120 |
| 200 BlimpCompositor* BlimpCompositorManager::GetCompositor(int render_widget_id) { | 121 BlimpCompositor* BlimpCompositorManager::GetCompositor(int render_widget_id) { |
| 201 CompositorMap::const_iterator it = compositors_.find(render_widget_id); | 122 CompositorMap::const_iterator it = compositors_.find(render_widget_id); |
| 202 if (it == compositors_.end()) | 123 if (it == compositors_.end()) |
| 203 return nullptr; | 124 return nullptr; |
| 204 return it->second.get(); | 125 return it->second.get(); |
| 205 } | 126 } |
| 206 | 127 |
| 207 } // namespace client | 128 } // namespace client |
| 208 } // namespace blimp | 129 } // namespace blimp |
| OLD | NEW |