Ozone is a platform abstraction layer beneath the Aura window system that is used for low level input and graphics. Once complete, the abstraction will support underlying systems ranging from embedded SoC targets to new X11-alternative window systems on Linux such as Wayland or Mir to bring up Aura Chromium by providing an implementation of the platform interface.
Our goal is to enable chromium to be used in a wide variety of projects by making porting to new platforms easy. To support this goal, ozone follows the following principles:
- Interfaces, not ifdefs. Differences between platforms are handled by calling a platform-supplied object through an interface instead of using conditional compilation. Platform internals remain encapsulated, and the public interface acts as a firewall between the platform-neutral upper layers (aura, blink, content, etc) and the platform-specific lower layers. The platform layer is relatively centralized to minimize the number of places ports need to add code.
- Flexible interfaces. The platform interfaces should encapsulate just what chrome needs from the platform, with minimal constraints on the platform's implementation as well as minimal constraints on usage from upper layers. An overly prescriptive interface is less useful for porting because fewer ports will be able to use it unmodified. Another way of stating is that the platform layer should provide mechanism, not policy.
- Runtime binding of platforms. Avoiding conditional compilation in the
upper layers allows us to build multiple platforms into one binary and bind
them at runtime. We allow this and provide a command-line flag to select a
platform (
--ozone-platform) if multiple are enabled. Each platform has a unique build define (e.g.ozone_platform_foo) that can be turned on or off independently. - Easy out-of-tree platforms. Most ports begin as forks. Some of them
later merge their code upstream, others will have an extended life out of
tree. This is OK, and we should make this process easy to encourage ports,
and to encourage frequent gardening of chromium changes into the downstream
project. If gardening an out-of-tree port is hard, then those projects will
simply ship outdated and potentially insecure chromium-derived code to users.
One way we support these projects is by providing a way to inject additional
platforms into the build by only patching one
ozone_extra.gnifile.
Ozone moves platform-specific code behind the following interfaces:
PlatformWindowrepresents a window in the windowing system underlying chrome. Interaction with the windowing system (resize, maximize, close, etc) as well as dispatch of input events happens via this interface. Under aura, aPlatformWindowcorresponds to aWindowTreeHost. Under mojo, it corresponds to aNativeViewport. On bare hardware, the underlying windowing system is very simple and a platform window corresponds to a physical display.SurfaceFactoryOzoneis used to create surfaces for the Chrome compositor to paint on using EGL/GLES2 or Skia.GpuPlatformSupportHostprovides the platform code access to IPC between the browser & GPU processes. Some platforms need this to provide additional services in the GPU process such as display configuration.OverlayManagerOzoneis used to manage overlays.InputControllerallows to control input devices such as keyboard, mouse or touchpad.SystemInputInjectorconverts input into events and injects them to the Ozone platform.NativeDisplayDelegateis used to support display configuration & hotplug.PlatformScreenis used to fetch screen configuration.ClipboardDelegateprovides an interface to exchange data with other applications on the host system using a system clipboard mechanism.
Our implementation of Ozone required changes concentrated in these areas:
- Cleaning up extensive assumptions about use of X11 throughout the tree,
protecting this code behind the
USE_X11ifdef, and adding a newUSE_OZONEpath that works in a relatively platform-neutral way by delegating to the interfaces described above. - a
WindowTreeHostOzoneto send events into Aura and participate in display management on the host system, and - an Ozone-specific flavor of
GLSurfaceEGLwhich delegates allocation of accelerated surfaces and refresh syncing to the provided implementation ofSurfaceFactoryOzone.
Users of the Ozone abstraction need to do the following, at minimum:
- Write a subclass of
PlatformWindow. This class (I'll call itPlatformWindowImpl) is responsible for window system integration. It can useMessagePumpLibeventto poll for events from file descriptors and then invokePlatformWindowDelegate::DispatchEventto dispatch each event. - Write a subclass of
SurfaceFactoryOzonethat handles allocating accelerated surfaces. I'll call thisSurfaceFactoryOzoneImpl. - Write a subclass of
CursorFactoryto manage cursors, or use theBitmapCursorFactoryOzoneimplementation if only bitmap cursors need to be supported. - Write a subclass of
OverlayManagerOzoneor just useStubOverlayManagerif your platform does not support overlays. - Write a subclass of
NativeDisplayDelegateif necessary or just useFakeDisplayDelegate, and write a subclass ofPlatformScreen, which is used by aura::ScreenOzone then. - Write a subclass of
GpuPlatformSupportHostor just useStubGpuPlatformSupportHost. - Write a subclass of
InputControlleror just useStubInputController. - Write a subclass of
SystemInputInjectorif necessary. - Write a subclass of
OzonePlatformthat owns instances of the above subclasses and provide a static constructor function for these objects. This constructor will be called when your platform is selected and the returned objects will be used to provide implementations of all the ozone platform interfaces. If your platform does not need some of the interfaces then you can just return aStub*instance or anullptr.
The recommended way to add your platform to the build is as follows. This walks
through creating a new ozone platform called foo.
- Fork
chromium/src.git. - Add your implementation in
ui/ozone/platform/alongside internal platforms. - Patch
ui/ozone/ozone_extra.gnito add yourfooplatform.
Chrome OS - (waterfall)
To build chrome, do this from the src directory:
gn args out/OzoneChromeOS --args="use_ozone=true target_os=\"chromeos\""
ninja -C out/OzoneChromeOS chromeThen to run for example the X11 platform:
./out/OzoneChromeOS/chrome --ozone-platform=x11Warning: Only some targets such as content_shell or unit tests are
currently working for embedded builds.
To build content_shell, do this from the src directory:
gn args out/OzoneEmbedded --args="use_ozone=true toolkit_views=false"
ninja -C out/OzoneEmbedded content_shellThen to run for example the headless platform:
./out/OzoneEmbedded/content_shell --ozone-platform=headless \
--ozone-dump-file=/tmp/Linux Desktop - (waterfall)
Warning: Experimental Ozone feature is available in the official Chrome distributions since m87. It is not required to build Ozone for Linux anymore for the purpose of testing. It is enough to start Chrome with the following flags - ./chrome --enable-features=UseOzonePlatform --ozone-platform={x11/wayland}.
To build chrome with Ozone support, it is no longer required to pass any additional
gn arguments. One can just follow the manual about how to build Chromium for Linux as both
(Aura/X11) 'use_x11=true' and (Linux/Ozone) 'use_ozone=true' are set by default.
If you want to disable Aura/X11 in the build, do this from the src directory:
gn args out/OzoneLinuxDesktop --args="use_x11=false"
ninja -C out/OzoneLinuxDesktop chromeThen to run for example the X11 platform (note that passing --enable-features=UseOzonePlatform is not required if Aura/X11 is disabled):
./out/OzoneLinuxDesktop/chrome --ozone-platform=x11Or run for example the Wayland platform:
./out/OzoneLinuxDesktop/chrome --ozone-platform=waylandIf you want to disable Linux/Ozone in the build, do this from the src directory:
gn args out/LinuxDesktop --args="use_ozone=false"
ninja -C out/LinuxDesktop chromeYou can turn properly implemented ozone platforms on and off by setting the
corresponding flags in your GN configuration. For example
ozone_platform_headless=false ozone_platform_drm=false will turn off the
headless and DRM (GBM) platforms.
This will result in a smaller binary and faster builds. To turn ALL platforms
off by default, set ozone_auto_platforms=false.
You can also specify a default platform to run by setting the ozone_platform
build parameter. For example ozone_platform="x11" will make X11 the
default platform when --ozone-platform is not passed to the program.
If ozone_auto_platforms is true then ozone_platform is set to headless
by default.
Specify the platform you want to use at runtime using the --ozone-platform
flag. For example, to run content_shell with the DRM (GBM) platform:
content_shell --ozone-platform=drmCaveats:
content_shellalways runs at 800x600 resolution.- For the DRM (GBM) platform, you may need to terminate your X server (or any other display server) prior to testing.
- During development, you may need to configure sandboxing or to disable it.
This platform
draws graphical output to a PNG image (no GPU support; software rendering only)
and will not output to the screen. You can set
the path of the directory where to output the images
by specifying --ozone-dump-file=/path/to/output-directory on the
command line:
content_shell --ozone-platform=headless \
--ozone-dump-file=/tmp/This is Linux direct rending with acceleration via mesa GBM & linux DRM/KMS (EGL/GLES2 accelerated rendering & modesetting in GPU process) and is in production use on Chrome OS.
Note that all Chrome OS builds of Chrome will compile and attempt to use this. See Building Chromium for Chromium OS for build instructions.
This platform is used for Chromecast.
This platform provides support for the X window system.
The support for X11 is being actively developed by Igalia and the chromium community and is intended to replace the current legacy X11 path.
You can try to compile and run it with the following configuration:
gn args out/OzoneX11 --args="use_ozone=true"
ninja -C out/OzoneX11 chrome
./out/OzoneX11/chrome --ozone-platform=x11This platform provides support for the Wayland display protocol. It was initially developed by Intel as a fork of chromium and then partially upstreamed.
Currently, the Ozone/Wayland is actively being developed by Igalia in the Chromium mainline repository with some features missing at the moment. The progress can be tracked in the issue #578890.
Below are some quick build & run instructions. It is assumed that you are
launching chrome from a Wayland environment such as weston. Execute the
following commands (make sure a system version of gbm and drm is used, which
are required by Ozone/Wayland by design, when running on Linux platforms.):
gn args out/OzoneWayland --args="use_ozone=true use_system_minigbm=true use_system_libdrm=true use_xkbcommon=true"
ninja -C out/OzoneWayland chrome
./out/OzoneWayland/chrome --ozone-platform=waylandNative file dialogs are currently supported through the GTK toolkit. That implies that the browser is compiled with glib and gtk enabled. Please append the following gn args to your configuration:
use_ozone=true
use_system_minigbm=true
use_system_libdrm=true
use_xkbcommon=true
use_glib=true
use_gtk=trueRunning some test suites requires a Wayland server. If you're not running one you can use a locally compiled version of Weston. This is what the build bots do. Add this to your gn args:
use_bundled_weston = trueThen run the xvfb.py wrapper script and tell it to start Weston:
cd out/debug # or your out directory
../../testing/xvfb.py --use-weston --no-xvfb ./views_unittests --ozone-platform=wayland --enable-features=UseOzonePlatformFeel free to discuss with us on freenode.net, #ozone-wayland channel or on
ozone-dev, or on #ozone-wayland-x11 channel in chromium slack.
This platform draws graphical output to text using libcaca (no GPU support; software rendering only). In case you ever wanted to test embedded content shell on tty. It has been removed from the tree and is no longer maintained but you can build it as an out-of-tree port.
Alternatively, you can try the latest revision known to work. First, install
libcaca shared library and development files. Next, move to the git revision
0e64be9cf335ee3bea7c989702c5a9a0934af037
(you will probably need to synchronize the build dependencies with
gclient sync --with_branch_heads). Finally, build and run the caca platform
with the following commands:
gn args out/OzoneCaca \
--args="use_ozone=true ozone_platform_caca=true use_sysroot=false ozone_auto_platforms=false toolkit_views=false"
ninja -C out/OzoneCaca content_shell
./out/OzoneCaca/content_shellNote: traditional TTYs are not the ideal browsing experience.

There is a public mailing list: ozone-dev@chromium.org