Skip to content

Hybrid Intel+NVIDIA: Chromium hardware acceleration requires manual workarounds #4901

@josefdc

Description

@josefdc

System details

  • CPU: 13th Gen Intel (Raptor Lake-P)
  • GPU (integrated): Intel Iris Xe Graphics (RPL-P)
  • GPU (discrete): NVIDIA GeForce RTX 3050 6GB Laptop GPU
  • Drivers: nvidia-open-dkms 590.48.01, Mesa 26.0.1, intel-media-driver 25.3.4
  • Omarchy: 3.4.1
  • Kernel: 6.18.13-arch1-1
  • Chromium: 145.0.7632.116

Problem

On hybrid Intel+NVIDIA laptops, Chromium's hardware acceleration is broken out of the box. Enabling "Use hardware acceleration when available" in Chromium settings causes black screen, flickering, and visual corruption. This forces users to disable hardware acceleration entirely, losing VAAPI video decode and GPU rasterization.

The root cause is a cross-GPU DMA-BUF incompatibility: Hyprland's compositor runs on the NVIDIA GPU, while Chromium renders via the Intel GPU through ANGLE/OpenGL. When Chromium's GPU compositor tries to import NVIDIA DMA-BUF buffers as EGLImages on the Intel GPU, it fails with EGL_BAD_MATCH (0x3009), producing hundreds of errors per second:

eglCreateImage failed with 0x00003009
OzoneImageBacking::ProduceSkiaGanesh failed to create GL representation
SharedImageManager::ProduceSkia: Trying to produce a Skia representation from an incompatible backing: OzoneImageBacking

This is the same issue reported in #3899 (same hardware: 13th Gen Intel + RTX 3050).

Investigation & what we tried

1. Set LIBVA_DRIVER_NAME=iHD in ~/.config/hypr/envs.conf

Result: Partially successful. Without this, vainfo defaults to NVIDIA's NVDEC driver which has limited VAAPI support. With iHD, Intel's full VAAPI stack activates (60+ profiles including H264, VP9, HEVC, AV1 encode/decode).

2. Added VA-API flags to chromium-flags.conf (as proposed in #4773)

--enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoEncoder
--enable-gpu-rasterization
--enable-zero-copy
--ignore-gpu-blocklist

Result: Partially successful. chrome://gpu showed "Video Decode: Hardware accelerated" and chrome://media-internals confirmed VaapiVideoDecoder was being used. However, the eglCreateImage errors persisted, causing black screen and flickering.

3. Tried --use-angle=vulkan with Vulkan features

--use-angle=vulkan
--enable-features=Vulkan,DefaultANGLEVulkan

Result: Failed. Chromium window became completely transparent/invisible. ANGLE Vulkan cannot render at all on this hybrid setup.

4. Added --disable-gpu-compositing (working solution)

--disable-gpu-compositing

Result: Working workaround. This disables only the GPU compositor (the part that does cross-GPU buffer sharing), while keeping:

  • ✅ VAAPI video decode (hardware) - H264, VP8, VP9, HEVC, AV1
  • ✅ GPU rasterization (hardware)
  • ✅ Canvas (hardware)
  • ✅ WebGL/WebGPU (hardware, at reduced performance)
  • ❌ GPU compositing (software - scrolling/CSS animations use CPU)

Working configuration

~/.config/hypr/envs.conf

env = LIBVA_DRIVER_NAME,iHD

~/.config/chromium-flags.conf

--enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoEncoder
--enable-gpu-rasterization
--enable-zero-copy
--ignore-gpu-blocklist
--disable-gpu-compositing

Proposal

For hybrid Intel+NVIDIA systems, Omarchy could:

  1. Auto-detect hybrid GPU setups and set LIBVA_DRIVER_NAME=iHD in the environment (needed for Intel VAAPI to work when NVIDIA is present)
  2. Include VA-API flags by default in chromium-flags.conf (as proposed in Enable VA-API hardware acceleration in default Chromium flags #4773)
  3. Auto-add --disable-gpu-compositing for hybrid Intel+NVIDIA systems to prevent the cross-GPU eglCreateImage errors

This would make Chromium usable with hardware acceleration out of the box on hybrid laptops, instead of forcing users to either disable HW acceleration entirely or manually figure out the workaround.

Related issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions