blob: 9729fcd192d72ecaa6b39747cab05d263ad6b11d [file] [log] [blame] [view]
fwang8491a612016-10-31 20:59:451# Ozone Overview
2
3Ozone is a platform abstraction layer beneath the Aura window system that is
4used for low level input and graphics. Once complete, the abstraction will
5support underlying systems ranging from embedded SoC targets to new
6X11-alternative window systems on Linux such as Wayland or Mir to bring up Aura
7Chromium by providing an implementation of the platform interface.
8
9## Guiding Principles
10
11Our goal is to enable chromium to be used in a wide variety of projects by
12making porting to new platforms easy. To support this goal, ozone follows the
13following principles:
14
151. **Interfaces, not ifdefs**. Differences between platforms are handled by
16 calling a platform-supplied object through an interface instead of using
17 conditional compilation. Platform internals remain encapsulated, and the
18 public interface acts as a firewall between the platform-neutral upper
19 layers (aura, blink, content, etc) and the platform-specific lower layers.
20 The platform layer is relatively centralized to minimize the number of
21 places ports need to add code.
222. **Flexible interfaces**. The platform interfaces should encapsulate just what
23 chrome needs from the platform, with minimal constraints on the platform's
24 implementation as well as minimal constraints on usage from upper layers. An
25 overly prescriptive interface is less useful for porting because fewer ports
26 will be able to use it unmodified. Another way of stating is that the
27 platform layer should provide mechanism, not policy.
283. **Runtime binding of platforms**. Avoiding conditional compilation in the
29 upper layers allows us to build multiple platforms into one binary and bind
30 them at runtime. We allow this and provide a command-line flag to select a
31 platform (`--ozone-platform`) if multiple are enabled. Each platform has a
32 unique build define (e.g. `ozone_platform_foo`) that can be turned on or off
33 independently.
344. **Easy out-of-tree platforms**. Most ports begin as forks. Some of them
35 later merge their code upstream, others will have an extended life out of
36 tree. This is OK, and we should make this process easy to encourage ports,
37 and to encourage frequent gardening of chromium changes into the downstream
38 project. If gardening an out-of-tree port is hard, then those projects will
39 simply ship outdated and potentially insecure chromium-derived code to users.
40 One way we support these projects is by providing a way to inject additional
41 platforms into the build by only patching one `ozone_extra.gni` file.
42
43## Ozone Platform Interface
44
45Ozone moves platform-specific code behind the following interfaces:
46
47* `PlatformWindow` represents a window in the windowing system underlying
48 chrome. Interaction with the windowing system (resize, maximize, close, etc)
49 as well as dispatch of input events happens via this interface. Under aura, a
50 `PlatformWindow` corresponds to a `WindowTreeHost`. Under mojo, it corresponds
51 to a `NativeViewport`. On bare hardware, the underlying windowing system is
52 very simple and a platform window corresponds to a physical display.
53* `SurfaceFactoryOzone` is used to create surfaces for the Chrome compositor to
54 paint on using EGL/GLES2 or Skia.
55* `GpuPlatformSupportHost` provides the platform code
56 access to IPC between the browser & GPU processes. Some platforms need this
57 to provide additional services in the GPU process such as display
58 configuration.
59* `CursorFactoryOzone` is used to load & set platform cursors.
60* `OverlayManagerOzone` is used to manage overlays.
61* `InputController` allows to control input devices such as keyboard, mouse or
62 touchpad.
63* `SystemInputInjector` converts input into events and injects them to the
64 Ozone platform.
65* `NativeDisplayDelegate` is used to support display configuration & hotplug.
Maksim Sisov0a0b7482018-10-18 07:59:4266* `PlatformScreen` is used to fetch screen configuration.
67* `ClipboardDelegate` provides an interface to exchange data with other
68applications on the host system using a system clipboard mechanism.
fwang8491a612016-10-31 20:59:4569
70## Ozone in Chromium
71
72Our implementation of Ozone required changes concentrated in these areas:
73
74* Cleaning up extensive assumptions about use of X11 throughout the tree,
75 protecting this code behind the `USE_X11` ifdef, and adding a new `USE_OZONE`
76 path that works in a relatively platform-neutral way by delegating to the
77 interfaces described above.
78* a `WindowTreeHostOzone` to send events into Aura and participate in display
79 management on the host system, and
80* an Ozone-specific flavor of `GLSurfaceEGL` which delegates allocation of
81 accelerated surfaces and refresh syncing to the provided implementation of
82 `SurfaceFactoryOzone`.
83
84## Porting with Ozone
85
86Users of the Ozone abstraction need to do the following, at minimum:
87
88* Write a subclass of `PlatformWindow`. This class (I'll call it
89 `PlatformWindowImpl`) is responsible for window system integration. It can
90 use `MessagePumpLibevent` to poll for events from file descriptors and then
91 invoke `PlatformWindowDelegate::DispatchEvent` to dispatch each event.
92* Write a subclass of `SurfaceFactoryOzone` that handles allocating accelerated
93 surfaces. I'll call this `SurfaceFactoryOzoneImpl`.
94* Write a subclass of `CursorFactoryOzone` to manage cursors, or use the
95 `BitmapCursorFactoryOzone` implementation if only bitmap cursors need to be
96 supported.
97* Write a subclass of `OverlayManagerOzone` or just use `StubOverlayManager` if
98 your platform does not support overlays.
99* Write a subclass of `NativeDisplayDelegate` if necessary or just use
Maksim Sisov0a0b7482018-10-18 07:59:42100 `FakeDisplayDelegate`, and write a subclass of `PlatformScreen`, which is
101 used by aura::ScreenOzone then.
fwang8491a612016-10-31 20:59:45102* Write a subclass of `GpuPlatformSupportHost` or just use
103 `StubGpuPlatformSupportHost`.
104* Write a subclass of `InputController` or just use `StubInputController`.
105* Write a subclass of `SystemInputInjector` if necessary.
106* Write a subclass of `OzonePlatform` that owns instances of
107 the above subclasses and provide a static constructor function for these
108 objects. This constructor will be called when
109 your platform is selected and the returned objects will be used to provide
110 implementations of all the ozone platform interfaces.
111 If your platform does not need some of the interfaces then you can just
112 return a `Stub*` instance or a `nullptr`.
113
114## Adding an Ozone Platform to the build (instructions for out-of-tree ports)
115
116The recommended way to add your platform to the build is as follows. This walks
117through creating a new ozone platform called `foo`.
118
1191. Fork `chromium/src.git`.
1202. Add your implementation in `ui/ozone/platform/` alongside internal platforms.
1213. Patch `ui/ozone/ozone_extra.gni` to add your `foo` platform.
122
123## Building with Ozone
124
derat81710502017-02-22 17:57:55125### Chrome OS - ([waterfall](https://build.chromium.org/p/chromium.chromiumos/waterfall?builder=Linux+ChromiumOS+Ozone+Builder&builder=Linux+ChromiumOS+Ozone+Tests+%281%29&builder=Linux+ChromiumOS+Ozone+Tests+%282%29&reload=none))
fwang8491a612016-10-31 20:59:45126
127To build `chrome`, do this from the `src` directory:
128
129``` shell
130gn args out/OzoneChromeOS --args="use_ozone=true target_os=\"chromeos\""
131ninja -C out/OzoneChromeOS chrome
132```
133
134Then to run for example the X11 platform:
135
136``` shell
fwang399b51c2016-11-10 09:48:27137./out/OzoneChromeOS/chrome --ozone-platform=x11
fwang8491a612016-10-31 20:59:45138```
139
140### Embedded
141
fwang7af9db62017-01-09 14:52:22142**Warning: Only some targets such as `content_shell` or unit tests are
143currently working for embedded builds.**
fwang8491a612016-10-31 20:59:45144
145To build `content_shell`, do this from the `src` directory:
146
147``` shell
148gn args out/OzoneEmbedded --args="use_ozone=true toolkit_views=false"
149ninja -C out/OzoneEmbedded content_shell
150```
151
152Then to run for example the headless platform:
153
154``` shell
fwang399b51c2016-11-10 09:48:27155./out/OzoneEmbedded/content_shell --ozone-platform=headless \
fwang8491a612016-10-31 20:59:45156 --ozone-dump-file=/tmp/
157```
158
fwang15744c72016-11-08 13:58:33159### Linux Desktop - ([waterfall](https://build.chromium.org/p/chromium.fyi/builders/Ozone%20Linux/))
fwang8491a612016-10-31 20:59:45160
Maksim Sisov0a0b7482018-10-18 07:59:42161**Warning: Experimental support for Linux Desktop is available since m57 and still under
162 development. Most of the work is done in the upstream, but some patches continue to
163 be landed to the [ozone-wayland-dev](https://github.com/Igalia/chromium/tree/ozone-wayland-dev) branch.**
fwang15744c72016-11-08 13:58:33164
165To build `chrome`, do this from the `src` directory:
166
167``` shell
Maksim Sisov0a0b7482018-10-18 07:59:42168gn args out/OzoneLinuxDesktop --args="use_ozone=true use_XXX_minigbm=true"
fwang15744c72016-11-08 13:58:33169ninja -C out/OzoneLinuxDesktop chrome
170```
Maksim Sisov0a0b7482018-10-18 07:59:42171
172You have to choose, which driver for minigbm to use from the
173[third\_party/minigbm/BUILD.gn](https://cs.chromium.org/chromium/src/third_party/minigbm/BUILD.gn?l=16).
174
fwang15744c72016-11-08 13:58:33175Then to run for example the X11 platform:
176
177``` shell
Scott Violet52134e2e2018-05-01 00:33:16178./out/OzoneLinuxDesktop/chrome --ozone-platform=x11
fwang15744c72016-11-08 13:58:33179```
180
Maksim Sisov0a0b7482018-10-18 07:59:42181Or run for example the Wayland platform:
182
183``` shell
184./out/OzoneLinuxDesktop/chrome --ozone-platform=Wayland
185```
186
fwang8491a612016-10-31 20:59:45187### GN Configuration notes
188
189You can turn properly implemented ozone platforms on and off by setting the
190corresponding flags in your GN configuration. For example
191`ozone_platform_headless=false ozone_platform_gbm=false` will turn off the
192headless and DRM/GBM platforms.
193This will result in a smaller binary and faster builds. To turn ALL platforms
194off by default, set `ozone_auto_platforms=false`.
195
196You can also specify a default platform to run by setting the `ozone_platform`
197build parameter. For example `ozone_platform="x11"` will make X11 the
198default platform when `--ozone-platform` is not passed to the program.
199If `ozone_auto_platforms` is true then `ozone_platform` is set to `headless`
200by default.
201
202## Running with Ozone
203
204Specify the platform you want to use at runtime using the `--ozone-platform`
fwang399b51c2016-11-10 09:48:27205flag. For example, to run `content_shell` with the GBM platform:
fwang8491a612016-10-31 20:59:45206
207``` shell
fwang399b51c2016-11-10 09:48:27208content_shell --ozone-platform=gbm
fwang8491a612016-10-31 20:59:45209```
210
211Caveats:
212
213* `content_shell` always runs at 800x600 resolution.
214* For the GBM platform, you may need to terminate your X server (or any other
215 display server) prior to testing.
fwang399b51c2016-11-10 09:48:27216* During development, you may need to configure
217 [sandboxing](linux_sandboxing.md) or to disable it.
fwang8491a612016-10-31 20:59:45218
219## Ozone Platforms
220
221### Headless
222
223This platform
224draws graphical output to a PNG image (no GPU support; software rendering only)
225and will not output to the screen. You can set
226the path of the directory where to output the images
227by specifying `--ozone-dump-file=/path/to/output-directory` on the
228command line:
229
230``` shell
fwang399b51c2016-11-10 09:48:27231content_shell --ozone-platform=headless \
fwang8491a612016-10-31 20:59:45232 --ozone-dump-file=/tmp/
233```
234
235### DRM/GBM
236
237This is Linux direct rending with acceleration via mesa GBM & linux DRM/KMS
238(EGL/GLES2 accelerated rendering & modesetting in GPU process) and is in
derat81710502017-02-22 17:57:55239production use on [Chrome OS](https://www.chromium.org/chromium-os).
fwang8491a612016-10-31 20:59:45240
derat81710502017-02-22 17:57:55241Note that all Chrome OS builds of Chrome will compile and attempt to use this.
fwang8491a612016-10-31 20:59:45242See [Building Chromium for Chromium OS](https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/building-chromium-browser) for build instructions.
243
244### Cast
245
246This platform is used for
247[Chromecast](https://www.google.com/intl/en_us/chromecast/).
248
249### X11
250
251This platform provides support for the [X window system](https://www.x.org/).
252
253### Wayland
254
255This platform provides support for the
256[Wayland](http://wayland.freedesktop.org/) display protocol. It was
257initially developed by Intel as
258[a fork of chromium](https://github.com/01org/ozone-wayland)
259and then partially upstreamed.
Maksim Sisov0a0b7482018-10-18 07:59:42260It is still actively being developed by Igalia both on the
fwangbc6983a72017-04-05 18:06:14261[ozone-wayland-dev](https://github.com/Igalia/chromium/tree/ozone-wayland-dev)
Maksim Sisov0a0b7482018-10-18 07:59:42262branch and the Chromium mainline repository, feel free to discuss
fwang8491a612016-10-31 20:59:45263with us on freenode.net, `#ozone-wayland` channel or on `ozone-dev`.
264
fwang15744c72016-11-08 13:58:33265Below are some quick build & run instructions. It is assumed that you are
fwang7af9db62017-01-09 14:52:22266launching `chrome` from a Wayland environment such as `weston`. Execute the
Maksim Sisov0a0b7482018-10-18 07:59:42267following commands (check above the comment regarding usage of minigbm, which
268is required by Ozone/Wayland by design):
fwang8491a612016-10-31 20:59:45269
270``` shell
Maksim Sisov0a0b7482018-10-18 07:59:42271gn args out/OzoneWayland --args="use_ozone=true use_intel_minigbm=true"
fwang8491a612016-10-31 20:59:45272ninja -C out/OzoneWayland chrome
Maksim Sisov0a0b7482018-10-18 07:59:42273./out/OzoneWayland/chrome --ozone-platform=wayland
fwang8491a612016-10-31 20:59:45274```
275
276### Caca
277
278This platform
279draws graphical output to text using
280[libcaca](http://caca.zoy.org/wiki/libcaca)
281(no GPU support; software
282rendering only). In case you ever wanted to test embedded content shell on
283tty.
284It has been
285[removed from the tree](https://codereview.chromium.org/2445323002/) and is no
fwang7fa6daf72016-11-03 16:07:04286longer maintained but you can
287[build it as an out-of-tree port](https://github.com/fred-wang/ozone-caca).
288
289Alternatively, you can try the latest revision known to work. First, install
290libcaca shared library and development files. Next, move to the git revision
291`0e64be9cf335ee3bea7c989702c5a9a0934af037`
292(you will probably need to synchronize the build dependencies with
293`gclient sync --with_branch_heads`). Finally, build and run the caca platform
294with the following commands:
fwang8491a612016-10-31 20:59:45295
296``` shell
fwang8491a612016-10-31 20:59:45297gn args out/OzoneCaca \
298 --args="use_ozone=true ozone_platform_caca=true use_sysroot=false ozone_auto_platforms=false toolkit_views=false"
299ninja -C out/OzoneCaca content_shell
fwang399b51c2016-11-10 09:48:27300./out/OzoneCaca/content_shell
fwang8491a612016-10-31 20:59:45301```
302
303 Note: traditional TTYs are not the ideal browsing experience.<br/>
fwang639002722016-11-08 12:33:04304 ![Picture of a workstation using Ozone/caca to display the Google home page in a text terminal](./images/ozone_caca.jpg)
fwang8491a612016-10-31 20:59:45305
306## Communication
307
308There is a public mailing list:
309[[email protected]](https://groups.google.com/a/chromium.org/forum/#!forum/ozone-dev)