Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: ui/ozone/platform/drm/ozone_platform_gbm.cc

Issue 2156093004: Use mojo for cursor control in ozone drm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: corrected small code oversight Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/ozone/platform/drm/mus_thread_proxy.cc ('k') | ui/ozone/public/interfaces/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ui/ozone/platform/drm/ozone_platform_gbm.h" 5 #include "ui/ozone/platform/drm/ozone_platform_gbm.h"
6 6
7 #include <dlfcn.h> 7 #include <dlfcn.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <gbm.h> 9 #include <gbm.h>
10 #include <stdlib.h> 10 #include <stdlib.h>
11 #include <xf86drm.h> 11 #include <xf86drm.h>
12 12
13 #include <memory> 13 #include <memory>
14 #include <utility> 14 #include <utility>
15 15
16 #include "base/bind.h" 16 #include "base/bind.h"
17 #include "base/command_line.h" 17 #include "base/command_line.h"
18 #include "base/macros.h" 18 #include "base/macros.h"
19 #include "base/memory/ptr_util.h" 19 #include "base/memory/ptr_util.h"
20 #include "services/shell/public/cpp/connection.h"
21 #include "services/shell/public/cpp/interface_factory.h"
20 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h" 22 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
21 #include "ui/events/ozone/device/device_manager.h" 23 #include "ui/events/ozone/device/device_manager.h"
22 #include "ui/events/ozone/evdev/event_factory_evdev.h" 24 #include "ui/events/ozone/evdev/event_factory_evdev.h"
23 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" 25 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
24 #include "ui/ozone/platform/drm/common/drm_util.h" 26 #include "ui/ozone/platform/drm/common/drm_util.h"
27 #include "ui/ozone/platform/drm/cursor_proxy_mojo.h"
25 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h" 28 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h"
26 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" 29 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
27 #include "ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h" 30 #include "ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h"
28 #include "ui/ozone/platform/drm/gpu/drm_gpu_platform_support.h" 31 #include "ui/ozone/platform/drm/gpu/drm_gpu_platform_support.h"
29 #include "ui/ozone/platform/drm/gpu/drm_thread_message_proxy.h" 32 #include "ui/ozone/platform/drm/gpu/drm_thread_message_proxy.h"
30 #include "ui/ozone/platform/drm/gpu/drm_thread_proxy.h" 33 #include "ui/ozone/platform/drm/gpu/drm_thread_proxy.h"
31 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h" 34 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h"
32 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h" 35 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h"
33 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h" 36 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h"
34 #include "ui/ozone/platform/drm/gpu/screen_manager.h" 37 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 private: 73 private:
71 // HACK: gbm drivers have broken linkage. The Mesa DRI driver references 74 // HACK: gbm drivers have broken linkage. The Mesa DRI driver references
72 // symbols in the libglapi library however it does not explicitly link against 75 // symbols in the libglapi library however it does not explicitly link against
73 // it. That caused linkage errors when running an application that does not 76 // it. That caused linkage errors when running an application that does not
74 // explicitly link against libglapi. 77 // explicitly link against libglapi.
75 void* glapi_lib_; 78 void* glapi_lib_;
76 79
77 DISALLOW_COPY_AND_ASSIGN(GlApiLoader); 80 DISALLOW_COPY_AND_ASSIGN(GlApiLoader);
78 }; 81 };
79 82
80 // Returns true if we should operate in Mus mode. 83 class OzonePlatformGbm
81 // TODO(rjkroege): Create an explicit "single process ozone mode" that can be 84 : public OzonePlatform,
82 // used for tests after mus+ash team finishes splitting mus. 85 public shell::InterfaceFactory<ozone::mojom::DeviceCursor> {
83 bool RunningInsideMus() {
84 bool has_channel_handle = base::CommandLine::ForCurrentProcess()->HasSwitch(
85 "mojo-platform-channel-handle");
86 return has_channel_handle;
87 }
88
89 class OzonePlatformGbm : public OzonePlatform {
90 public: 86 public:
91 OzonePlatformGbm() {} 87 OzonePlatformGbm() : using_mojo_(false), single_process_(false) {}
92 ~OzonePlatformGbm() override {} 88 ~OzonePlatformGbm() override {}
93 89
94 // OzonePlatform: 90 // OzonePlatform:
95 ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() override { 91 ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() override {
96 return surface_factory_.get(); 92 return surface_factory_.get();
97 } 93 }
98 OverlayManagerOzone* GetOverlayManager() override { 94 OverlayManagerOzone* GetOverlayManager() override {
99 return overlay_manager_.get(); 95 return overlay_manager_.get();
100 } 96 }
101 CursorFactoryOzone* GetCursorFactoryOzone() override { 97 CursorFactoryOzone* GetCursorFactoryOzone() override {
102 return cursor_factory_ozone_.get(); 98 return cursor_factory_ozone_.get();
103 } 99 }
104 InputController* GetInputController() override { 100 InputController* GetInputController() override {
105 return event_factory_ozone_->input_controller(); 101 return event_factory_ozone_->input_controller();
106 } 102 }
107 GpuPlatformSupport* GetGpuPlatformSupport() override { 103 GpuPlatformSupport* GetGpuPlatformSupport() override {
108 return gpu_platform_support_.get(); 104 return gpu_platform_support_.get();
109 } 105 }
110 GpuPlatformSupportHost* GetGpuPlatformSupportHost() override { 106 GpuPlatformSupportHost* GetGpuPlatformSupportHost() override {
111 return gpu_platform_support_host_.get(); 107 return gpu_platform_support_host_.get();
112 } 108 }
113 std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override { 109 std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
114 return event_factory_ozone_->CreateSystemInputInjector(); 110 return event_factory_ozone_->CreateSystemInputInjector();
115 } 111 }
112 void AddInterfaces(shell::Connection* connection) override {
113 connection->AddInterface<ozone::mojom::DeviceCursor>(this);
114 }
115 // shell::InterfaceFactory<mojom::ozone::Cursor> implementation.
116 void Create(const shell::Identity& remote_identity,
117 ozone::mojom::DeviceCursorRequest request) override {
118 DCHECK(drm_thread_);
119 drm_thread_->AddBinding(std::move(request));
120 }
116 std::unique_ptr<PlatformWindow> CreatePlatformWindow( 121 std::unique_ptr<PlatformWindow> CreatePlatformWindow(
117 PlatformWindowDelegate* delegate, 122 PlatformWindowDelegate* delegate,
118 const gfx::Rect& bounds) override { 123 const gfx::Rect& bounds) override {
119 GpuThreadAdapter* adapter = gpu_platform_support_host_.get(); 124 GpuThreadAdapter* adapter = gpu_platform_support_host_.get();
120 if (RunningInsideMus()) { 125 if (using_mojo_ || single_process_) {
121 DCHECK(drm_thread_) << "drm_thread_ should exist (and be running) here."; 126 DCHECK(drm_thread_) << "drm_thread_ should exist (and be running) here.";
122 adapter = mus_thread_proxy_.get(); 127 adapter = mus_thread_proxy_.get();
123 } 128 }
124 129
125 std::unique_ptr<DrmWindowHost> platform_window(new DrmWindowHost( 130 std::unique_ptr<DrmWindowHost> platform_window(new DrmWindowHost(
126 delegate, bounds, adapter, event_factory_ozone_.get(), cursor_.get(), 131 delegate, bounds, adapter, event_factory_ozone_.get(), cursor_.get(),
127 window_manager_.get(), display_manager_.get(), overlay_manager_.get())); 132 window_manager_.get(), display_manager_.get(), overlay_manager_.get()));
128 platform_window->Initialize(); 133 platform_window->Initialize();
129 return std::move(platform_window); 134 return std::move(platform_window);
130 } 135 }
131 std::unique_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate() 136 std::unique_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate()
132 override { 137 override {
133 return base::WrapUnique( 138 return base::WrapUnique(
134 new DrmNativeDisplayDelegate(display_manager_.get())); 139 new DrmNativeDisplayDelegate(display_manager_.get()));
135 } 140 }
136 void InitializeUI() override { 141 void InitializeUI() override {
142 InitParams default_params;
143 InitializeUI(default_params);
144 }
145 void InitializeUI(const InitParams& args) override {
146 // Ozone drm can operate in three modes configured at runtime:
147 // 1. legacy mode where browser and gpu components communicate
148 // via param traits IPC.
149 // 2. single-process mode where browser and gpu components
150 // communicate via PostTask.
151 // 3. mojo mode where browser and gpu components communicate
152 // via mojo IPC.
153 // Currently, mojo mode uses mojo in a single process but this is
154 // an interim implementation detail that will be eliminated in a
155 // future CL.
156 single_process_ = args.single_process;
157 using_mojo_ = args.connector != nullptr;
158 DCHECK(!(using_mojo_ && single_process_));
159
137 device_manager_ = CreateDeviceManager(); 160 device_manager_ = CreateDeviceManager();
138 window_manager_.reset(new DrmWindowHostManager()); 161 window_manager_.reset(new DrmWindowHostManager());
139 cursor_.reset(new DrmCursor(window_manager_.get())); 162 cursor_.reset(new DrmCursor(window_manager_.get()));
140 #if defined(USE_XKBCOMMON) 163 #if defined(USE_XKBCOMMON)
141 KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(base::WrapUnique( 164 KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(base::WrapUnique(
142 new XkbKeyboardLayoutEngine(xkb_evdev_code_converter_))); 165 new XkbKeyboardLayoutEngine(xkb_evdev_code_converter_)));
143 #else 166 #else
144 KeyboardLayoutEngineManager::SetKeyboardLayoutEngine( 167 KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
145 base::WrapUnique(new StubKeyboardLayoutEngine())); 168 base::WrapUnique(new StubKeyboardLayoutEngine()));
146 #endif 169 #endif
170
147 event_factory_ozone_.reset(new EventFactoryEvdev( 171 event_factory_ozone_.reset(new EventFactoryEvdev(
148 cursor_.get(), device_manager_.get(), 172 cursor_.get(), device_manager_.get(),
149 KeyboardLayoutEngineManager::GetKeyboardLayoutEngine())); 173 KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()));
150 174
151 GpuThreadAdapter* adapter; 175 GpuThreadAdapter* adapter;
152 if (RunningInsideMus()) { 176
177 // TODO(rjkroege): Once mus is split, only do this for single_process.
178 if (single_process_ || using_mojo_)
153 gl_api_loader_.reset(new GlApiLoader()); 179 gl_api_loader_.reset(new GlApiLoader());
180
181 if (using_mojo_) {
182 DCHECK(args.connector);
154 mus_thread_proxy_.reset(new MusThreadProxy()); 183 mus_thread_proxy_.reset(new MusThreadProxy());
155 adapter = mus_thread_proxy_.get(); 184 adapter = mus_thread_proxy_.get();
156 cursor_->SetDrmCursorProxy(mus_thread_proxy_.get()); 185 cursor_->SetDrmCursorProxy(new CursorProxyMojo(args.connector));
186 } else if (single_process_) {
187 mus_thread_proxy_.reset(new MusThreadProxy());
188 adapter = mus_thread_proxy_.get();
189 cursor_->SetDrmCursorProxy(
190 new CursorProxyThread(mus_thread_proxy_.get()));
157 } else { 191 } else {
158 gpu_platform_support_host_.reset( 192 gpu_platform_support_host_.reset(
159 new DrmGpuPlatformSupportHost(cursor_.get())); 193 new DrmGpuPlatformSupportHost(cursor_.get()));
160 adapter = gpu_platform_support_host_.get(); 194 adapter = gpu_platform_support_host_.get();
161 } 195 }
162 196
163 display_manager_.reset( 197 display_manager_.reset(
164 new DrmDisplayHostManager(adapter, device_manager_.get(), 198 new DrmDisplayHostManager(adapter, device_manager_.get(),
165 event_factory_ozone_->input_controller())); 199 event_factory_ozone_->input_controller()));
166 cursor_factory_ozone_.reset(new BitmapCursorFactoryOzone); 200 cursor_factory_ozone_.reset(new BitmapCursorFactoryOzone);
167 overlay_manager_.reset( 201 overlay_manager_.reset(
168 new DrmOverlayManager(adapter, window_manager_.get())); 202 new DrmOverlayManager(adapter, window_manager_.get()));
169 203
170 if (RunningInsideMus()) { 204 if (using_mojo_ || single_process_) {
171 mus_thread_proxy_->ProvideManagers(display_manager_.get(), 205 mus_thread_proxy_->ProvideManagers(display_manager_.get(),
172 overlay_manager_.get()); 206 overlay_manager_.get());
173 } 207 }
174 } 208 }
209 void InitializeGPU() override {
210 InitParams default_params;
211 InitializeGPU(default_params);
212 }
213 void InitializeGPU(const InitParams& args) override {
214 // TODO(rjkroege): services/ui should initalize this with a connector.
215 // However, in-progress refactorings in services/ui make it difficult to
216 // require this at present. Set using_mojo_ like below once this is
217 // complete.
218 // using_mojo_ = args.connector != nullptr;
175 219
176 void InitializeGPU() override {
177 InterThreadMessagingProxy* itmp; 220 InterThreadMessagingProxy* itmp;
178 if (RunningInsideMus()) { 221 if (using_mojo_ || single_process_) {
179 DCHECK(mus_thread_proxy_);
180 itmp = mus_thread_proxy_.get(); 222 itmp = mus_thread_proxy_.get();
181 } else { 223 } else {
182 gl_api_loader_.reset(new GlApiLoader()); 224 gl_api_loader_.reset(new GlApiLoader());
183 scoped_refptr<DrmThreadMessageProxy> message_proxy( 225 scoped_refptr<DrmThreadMessageProxy> message_proxy(
184 new DrmThreadMessageProxy()); 226 new DrmThreadMessageProxy());
185 itmp = message_proxy.get(); 227 itmp = message_proxy.get();
186 gpu_platform_support_.reset(new DrmGpuPlatformSupport(message_proxy)); 228 gpu_platform_support_.reset(new DrmGpuPlatformSupport(message_proxy));
187 } 229 }
188 230
189 // NOTE: Can't start the thread here since this is called before sandbox 231 // NOTE: Can't start the thread here since this is called before sandbox
190 // initialization in multi-process Chrome. In mus, we start the DRM thread. 232 // initialization in multi-process Chrome. In mus, we start the DRM thread.
191 drm_thread_.reset(new DrmThreadProxy()); 233 drm_thread_.reset(new DrmThreadProxy());
192 drm_thread_->BindThreadIntoMessagingProxy(itmp); 234 drm_thread_->BindThreadIntoMessagingProxy(itmp);
193 235
194 surface_factory_.reset(new GbmSurfaceFactory(drm_thread_.get())); 236 surface_factory_.reset(new GbmSurfaceFactory(drm_thread_.get()));
195 if (RunningInsideMus()) { 237 if (using_mojo_ || single_process_) {
196 mus_thread_proxy_->StartDrmThread(); 238 mus_thread_proxy_->StartDrmThread();
197 } 239 }
198 } 240 }
199 241
200 private: 242 private:
243 bool using_mojo_;
244 bool single_process_;
245
201 // Objects in the GPU process. 246 // Objects in the GPU process.
247 // TODO(rjk): rename drm_thread_ to drm_thread_proxy_;
202 std::unique_ptr<DrmThreadProxy> drm_thread_; 248 std::unique_ptr<DrmThreadProxy> drm_thread_;
203 std::unique_ptr<GlApiLoader> gl_api_loader_; 249 std::unique_ptr<GlApiLoader> gl_api_loader_;
204 std::unique_ptr<GbmSurfaceFactory> surface_factory_; 250 std::unique_ptr<GbmSurfaceFactory> surface_factory_;
205 std::unique_ptr<DrmGpuPlatformSupport> gpu_platform_support_; 251 std::unique_ptr<DrmGpuPlatformSupport> gpu_platform_support_;
206 252
207 // Objects in the Browser process. 253 // Objects in the Browser process.
208 std::unique_ptr<DeviceManager> device_manager_; 254 std::unique_ptr<DeviceManager> device_manager_;
209 std::unique_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_; 255 std::unique_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_;
210 std::unique_ptr<DrmWindowHostManager> window_manager_; 256 std::unique_ptr<DrmWindowHostManager> window_manager_;
211 std::unique_ptr<DrmCursor> cursor_; 257 std::unique_ptr<DrmCursor> cursor_;
(...skipping 12 matching lines...) Expand all
224 DISALLOW_COPY_AND_ASSIGN(OzonePlatformGbm); 270 DISALLOW_COPY_AND_ASSIGN(OzonePlatformGbm);
225 }; 271 };
226 272
227 } // namespace 273 } // namespace
228 274
229 OzonePlatform* CreateOzonePlatformGbm() { 275 OzonePlatform* CreateOzonePlatformGbm() {
230 return new OzonePlatformGbm; 276 return new OzonePlatformGbm;
231 } 277 }
232 278
233 } // namespace ui 279 } // namespace ui
OLDNEW
« no previous file with comments | « ui/ozone/platform/drm/mus_thread_proxy.cc ('k') | ui/ozone/public/interfaces/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698