Zalgorithm

Chromium video rendering issue after Omarchy (Hyprland) update

Edit: getting back to this a few weeks later, it turned out that the issue was related to the LIBVA_DRIVER_NAME environmental variable that was set in hyprland.conf. That variable is set when Omarchy is first installed if a Nvidia GPU is detected: https://github.com/basecamp/omarchy/blob/32592e2e285b5c9af6d38724be319c4fbef6e221/install/config/hardware/nvidia.sh.

With my hybrid GPU, Chromium is using the integrated Intel GPU. The LIBVA_DRIVER_NAME environmental variable should be set to the name of the Intel driver. I think, but am not certain that the required Intel driver wasn’t installed on my system:

❯ ls /usr/lib/dri/*_drv_video.so  # prior to installing `intel-media-driver`
Permissions Size User Date Modified Name
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/d3d12_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/nouveau_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
.rwxr-xr-x   92k root  8 Jun  2025   /usr/lib/dri/nvidia_drv_video.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/r600_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/radeonsi_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/virtio_gpu_drv_video.so -> ../libgallium-25.3.1-arch1.2.so

The fix seems to have been to install intel-media-driver:

❯ sudo pacman -S intel-media-driver

❯ ls /usr/lib/dri/*_drv_video.so
Permissions Size User Date Modified Name
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/d3d12_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
.rwxr-xr-x   39M root 28 Sep  2025   /usr/lib/dri/iHD_drv_video.so  # the intel driver (name: iHD)
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/nouveau_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
.rwxr-xr-x   92k root  8 Jun  2025   /usr/lib/dri/nvidia_drv_video.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/r600_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/radeonsi_drv_video.so -> ../libgallium-25.3.1-arch1.2.so
lrwxrwxrwx     - root  5 Dec  2025   /usr/lib/dri/virtio_gpu_drv_video.so -> ../libgallium-25.3.1-arch1.2.so

Then update ~/.config/hypr/hyprland.conf:

# NVIDIA environment variables (set by Omarchy):
env = NVD_BACKEND,direct
env = LIBVA_DRIVER_NAME,iHD  # was previously set to nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia

Chromium trying to use the Nvidia driver for the Intel GPU explains the errors I was running into.

The error (failed to create GL representation)

After the most recent Omarchy update (Dec 14, 2025), launching Chromium (from the console), returns multiple (as in endless) copies of the following error:

ERR: ImageEGL.cpp:112 (operator()): eglCreateImage failed with 0x00003009
[6859:6859:1214/132211.510928:ERROR:ui/gl/scoped_egl_image.cc:23] Failed to create EGLImage: EGL_SUCCESS
[6859:6859:1214/132211.511064:ERROR:ui/ozone/common/native_pixmap_egl_binding.cc:76] Unable to initialize binding from pixmap
[6859:6859:1214/132211.511202:ERROR:gpu/command_buffer/service/shared_image/ozone_image_backing.cc:316] OzoneImageBacking::ProduceSkiaGanesh failed to create GL representation
[6859:6859:1214/132211.511314:ERROR:gpu/command_buffer/service/shared_image/shared_image_manager.cc:404] SharedImageManager::ProduceSkia: Trying to produce a Skia representation from an incompatible backing: OzoneImageBacking

The relevant part of the error seems to be failed to create GL representation.

From Claude:

OzoneImageBacking::ProduceSkiaGanesh failed to create GL representation suggests Mesa’s GBM (Generic Buffer Management) can’t create EGL images properly - this is the part that handles sharing GPU memory between Wayland, Mesa, and Chromium.

What is a GL representation?

GL refers to Graphics Library, most commonly OpenGL. An OpenGL representation is a description of 2D or 3D vector graphics and the processes used to turn that data into a final image on the screen, using an API that interacts with the GPU.

Disable GPU composting as a temporary fix

Add the following to .config/chromium-flags.conf:

--disable-gpu-compositing

Possible alternate fix (see https://github.com/basecamp/omarchy/issues/3891):

--use-gl=desktop

What is a hybrid GPU?

A hybrid GPU system uses two graphics processors — a low-power integrated GPU (iGPU) and a (more powerful) discrete GPU (dGPU). Apparently to balance performance and energy efficiency. The iGPU is expected to handle basic tasks (browsing, video) and the dGPU is expected to handle demanding apps, games, video editing, etc.

Get GPU info for machine

List PCI devices

The lspci command lists all PCI hardware, including graphics cards:

❯ lspci | grep -E "VGA|3D|Display"
00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
01:00.0 VGA compatible controller: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] (rev a1)

Alternatively, the lshw (list hardware) command provides more structured output:

❯ sudo lshw -C display
  *-display
       description: VGA compatible controller
       product: TigerLake-LP GT2 [Iris Xe Graphics]
       vendor: Intel Corporation
       physical id: 2
       bus info: pci@0000:00:02.0
       logical name: /dev/fb0
       version: 01
       width: 64 bits
       clock: 33MHz
       capabilities: pciexpress msi pm vga_controller bus_master cap_list rom fb
       configuration: depth=32 driver=i915 latency=0 mode=1920x1080 resolution=1920,1080 visual=truecolor xres=1920 yres=1080
       resources: iomemory:620-61f iomemory:400-3ff irq:156 memory:622c000000-622cffffff memory:4000000000-400fffffff ioport:4000(size=64) memory:c0000-dffff memory:4010000000-4016ffffff memory:4020000000-40ffffffff
  *-display
       description: VGA compatible controller
       product: GA106M [GeForce RTX 3060 Mobile / Max-Q]
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:01:00.0
       version: a1
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
       configuration: driver=nvidia latency=0
       resources: iomemory:600-5ff iomemory:620-61f irq:145 memory:83000000-83ffffff memory:6000000000-61ffffffff memory:6200000000-6201ffffff ioport:3000(size=128) memory:84000000-8407ffff

Check current GPU driver setup

# Check if NVIDIA drivers are installed
❯ nvidia-smi  # command
Sun Dec 14 20:21:35 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.105.08             Driver Version: 580.105.08     CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3060 ...    Off |   00000000:01:00.0 Off |                  N/A |
| N/A   42C    P8              9W /   60W |      89MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A             993      G   /usr/lib/Xorg                             4MiB |
|    0   N/A  N/A            1364      G   Hyprland                                  2MiB |
|    0   N/A  N/A            1493    C+G   /usr/bin/walker                          46MiB |
+-----------------------------------------------------------------------------------------+

# Check which GPU is being used; provides details about the currently used OpenGL renderer,
# this can help confirm if the correct drivers are being used
❯ glxinfo | grep "OpenGL renderer"  # command
OpenGL renderer string: NVIDIA GeForce RTX 3060 Laptop GPU/PCIe/SSE2

Which GPU is chromium using on my machine?

Browse to chrome://gpu/ and look at the GL_RENDERER line:

ANGLE (Intel, Mesa Intel(R) Iris(R) Xe Graphics (TGL GT2), OpenGL ES 3.2 Mesa 25.2.7-arch1.1)

It’s using Intel, Mesa.

What is Mesa (in the context of graphics rendering)?

Mesa is an open-source implementation of various graphics API specifications: OpenGL, Vulkan, etc. Mesa is a part of the graphics driver stack:

Here’s Claude’s description of Mesa:

  1. Open-source GPU drivers - Provides drivers for Intel, AMD, and other GPUs
  2. OpenGL/Vulkan implementation - Implements graphics APIs that applications use 3.Interface layer - Sits between applications (like Chromium) and the kernel’s DRM (Direct Rendering Manager) subsystem

So the flow is: Chromium → Mesa → Kernel DRM → GPU hardware

What is GPU compositing?

GPU compositing uses the Graphics Processing Unit (GPU) to combine multiple visual elements (layers, images, textures) into a single final image for display, speeding up processes like web rendering, video editing, or 3D scene assembly by using the GPU’s parallel processing power instead of letting the CPU take care of everything. The GPU takes over the final “flattening” of layers.

What is ozone platform?

The term ozone-platform comes up a lot in discussions related to configuring Chromium on Hyprland. Here’s my current ~/.config/chromium-flags.conf file, with references to ozone-platform:

--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
--disable-features=WaylandWpColorManagerV1

# tmp fix for Mesa issue
--disable-gpu-compositing

Ozone platform is Chromium’s graphics/input layer for cross-platform compatibility. That (somewhat) explains --ozone-platform=wayland and ozone-platform-hint=wayland. It acts as an adapter, translating Chromium’s needs into command for underlying systems like X11 or Wayland.

Here’s the ozone related part of the original error message:

[6859:6859:1214/132211.511064:ERROR:ui/ozone/common/native_pixmap_egl_binding.cc:76] Unable to initialize binding from pixmap

My guess about the cause of the issue

I updated Omarchy today (December 14th). Omarchy pulls updates from its own pacman mirror (I need to confirm what’s going on with this). Mesa in Arch was updated on December 12th (mesa 1:25.3.1-2). The current version of mesa that’s available for Omarchy is:

❯ pacman -Q mesa
mesa 1:25.2.7-1