Alexandros Frantzis
November 27, 2017
Reading time:
Ozone is Chromium’s next-gen platform abstraction layer for graphics and input. When developing either Ozone itself or an application that uses Ozone, it is often beneficial to be able to run the code on the development machine, which is usually a typical GNU/Linux desktop system, since doing so speeds up the development cycle.
The X11 backend for Ozone works without much trouble on a Linux desktop system. However, getting the DRM/GBM backend to run on such a system, which I recently needed to do as part of my work at Collabora, turned out to be significantly less straightforward. In this guide I will describe all the steps that are required to run Chromium with Ozone-GBM on a typical GNU/Linux desktop system.
The Chromium developer documentation provides detailed build instructions for Linux. For this guide, we have to ensure that we enable Ozone and that the target OS for the build is “chromeos”:
$ gn gen out/OzoneChromeOS $ gn args --args='use_ozone=true target_os="chromeos"' out/OzoneChromeOS $ ninja -C out/OzoneChromeOS chrome
Ozone-GBM uses the GBM API to create buffers. However, it doesn’t use Mesa’s GBM implementation, but ships its own in the form of the minigbm library. The Chromium source code contains a copy of the library under third_party, but uses it only for building and testing purposes without enabling any of the minigbm hardware drivers.
In order to run Ozone-GBM on real hardware we need to create a build of minigbm that supports our target GPU. For the purposes of this guide, the simplest way to provide a functional minigbm is to build it independently and provide it at runtime to Chromium using LD_LIBRARY_PATH.
First we need to get the minigbm source code with:
$ git clone https://chromium.googlesource.com/chromiumos/platform/minigbm
minigbm depends on libdrm, so we have to ensure that we have the development files for the libdrm library and the vendor specific extensions. On a Debian/Ubuntu system we can get everything we need by installing the libdrm-dev package:
$ sudo apt install libdrm-dev
We can now build minigbm with the correct flags to ensure the proper GPU driver is supported:
$ make CPPFLAGS="-DDRV_I915" DRV_I915=1
Note that we need to provide the driver flag both as a preprocessor definition and a Make variable. Other driver flags for common desktop GPUs are DRV_RADEON and DRV_AMDGPU (but see below for amdgpu).
Finally we need to create a link with the proper file name so that chrome can find the library:
$ ln -s libminigbm.so.1.0.0 libminigbm.so
The amdgpu driver for minigbm depends on the elusive amdgpuaddr library. This library is part of mesa, but it’s not installed, and thus not provided in any package on most distributions.
To get it we need to build Mesa ourselves and extract it from the built objects. An easy way to get all the dependencies and build Mesa with all the required flags is to use the distribution’s build method. On a Debian/Ubuntu system this translates to a command sequence like:
$ sudo apt build-dep mesa $ apt source mesa $ cd [mesa-dir] && DEB_BUILD_OPTIONS="parallel=$(nproc)" debian/rules build
After the build is done, we have to copy (and rename) the addrlib library and the required headers to the minigbm directory:
$ cp [mesa-dir]/build/src/amd/addrlib/.libs/libamdgpu_addrlib.a [minigbm-dir]/libamdgpuaddr.a $ cp [mesa-dir]/src/amd/addrlib/*.h [minigbm-dir]
Finally, we are able build minigbm with amdgpu support with:
$ make CPPFLAGS="-DDRV_AMDGPU" DRV_AMDGPU=1 LDFLAGS="-L." $ ln -s libminigbm.so.1.0.0 libminigbm.so
We are almost there, but one last detail remains. If we try to run Chromium we will get an error message informing us that EGL initialization failed. The reason is that, when using Ozone-GBM, the EGLDisplay is created using EGL_DEFAULT_DISPLAY as the native display argument, under the assumption that the EGL implementation knows to interpret this as a request for a so-called surfaceless platform. However, Mesa doesn’t recognize this hint. We need to explicitly tell Mesa to use the surfaceless platform with the EGL_PLATFORM environment variable.
The following command line brings all the pieces of the puzzle together, allowing us to run Chromium with Ozone-GBM on a typical GNU/Linux desktop:
$ sudo LD_LIBRARY_PATH=[minigbm-dir] EGL_PLATFORM=surfaceless out/OzoneChromeOS/chrome --ozone-platform=gbm --no-sandbox --mash
Enjoy!
19/12/2024
In the world of deep learning optimization, two powerful tools stand out: torch.compile, PyTorch’s just-in-time (JIT) compiler, and NVIDIA’s…
08/10/2024
Having multiple developers work on pre-merge testing distributes the process and ensures that every contribution is rigorously tested before…
15/08/2024
After rigorous debugging, a new unit testing framework was added to the backend compiler for NVK. This is a walkthrough of the steps taken…
01/08/2024
We're reflecting on the steps taken as we continually seek to improve Linux kernel integration. This will include more detail about the…
27/06/2024
With each board running a mainline-first Linux software stack and tested in a CI loop with the LAVA test framework, the Farm showcased Collabora's…
26/06/2024
WirePlumber 0.5 arrived recently with many new and essential features including the Smart Filter Policy, enabling audio filters to automatically…
Comments (3)
Jay Sanders:
Nov 28, 2017 at 03:06 PM
All that is fine. However, what is not clear from this article is why one would need or want to run this, as opposed to vanilla Chromium. Leaving all technicalities aside, how will running this browser, rather than vanilla Chromium, improve things for me, the end user?
Reply to this comment
Reply to this comment
Alexandros Frantzis:
Nov 29, 2017 at 08:25 AM
Hi Jay. This is vanilla Chromium, too, just running directly in a Linux virtual terminal instead of running using X11 (or Wayland). This is mostly useful for development purposes, especially since Chromebooks run this way, too (i.e., they use Ozone-GBM). From an end user perspective there is not much to be gained from this for normal use cases, although there are some production use cases for which this could be useful (e.g., kiosks).
Reply to this comment
Reply to this comment
abhijit naik:
Feb 23, 2018 at 11:43 AM
Hi,
Thank you very much for the blog.
We are using IMX53 based board and planning to bring up stand alone browser on board. We are planning to use OZONE GBM implementation.
We have GBM implementation for our SoC and I understand we have to port our mesa implementation to mini gbm.
Can you please let me know to what extent ozone+gbm will differ from ozone+wayland, i.e are there any features of wayland that we may miss out if we implement ozone GBM.
Can you please show video of demo of chromium working with ozone=gbm, I needed to confirm whether multi-tabs feature is available are not?
Reply to this comment
Reply to this comment
Add a Comment