Hybrid graphics, envycontrol, and prime run

Hey folks,

Been doing some research/reading on the forums and elsewhere and I’m hoping someone here would know more to help me understand how Garuda leverages hybrid graphics. Based on the Garuda Wiki it claims that “Garuda Linux by default only uses your integrated GPU to save power…” and that “The iGPU is much better suited for running low power common desktop applications.”

I have an Intel UHD Graphics 770 iGPU and NVIDIA GeForce RTX 3060 Ti dGPU. However, I can confirm that the intel igpu is not used at all (via intel_gpu_top and btop (don’t see any gpu activity). Furthermore, running glxinfo -B | grep "OpenGL vendor string" results in OpenGL vendor string: NVIDIA Corporation. Of course, pre-pending prime-run to the same command has the same exact output.

I’m wondering if I use envycontrol and switch to integrated mode (currently envycontrol -q shows hybrid) and then utilize prime-run for more graphic-intensive applications - would this correctly leverage my iGPU for more “low power common desktop applications” like the DE? I have a dual monitor setup, and they’re both plugged into 2 displayports on my NVIDIA card - would switching to integrated mean I won’t get any output display?

Is there another way I should be thinking about this? If Garuda uses iGPU by default to save power, how can I confirm that it’s doing so, since all I’ve been able to see is that it’s using the NVIDIA card.

Secondarily, any benefits to using the Intel Xe driver?

Here’s my garuda-inxi:

> garuda-inxi
System:
  Kernel: 6.17.1-zen1-1-zen arch: x86_64 bits: 64 compiler: gcc v: 15.2.1
    clocksource: tsc avail: acpi_pm
    parameters: BOOT_IMAGE=/@/boot/vmlinuz-linux-zen
    root=UUID=8dcc0c9c-8fe9-4fc6-b189-a8db2cfa3823 rw rootflags=subvol=@
    i915.enable_guc=3 i915.max_vfs=7 quiet
    resume=UUID=a14a443b-9c6b-47d0-b49a-d9686d767b7c loglevel=3
    sysrq_always_enabled=1 nvidia-drm.modeset=1
    pci=disable_acs_redir=pci:12D8:2308
    vt.default_red=30,243,166,249,137,245,148,186,88,243,166,249,137,245,148,166
    vt.default_grn=30,139,227,226,180,194,226,194,91,139,227,226,180,194,226,173
    vt.default_blu=46,168,161,175,250,231,213,222,112,168,161,175,250,231,213,200
  Desktop: KDE Plasma v: 6.4.5 tk: Qt v: N/A info: frameworks v: 6.18.0
    wm: kwin_wayland with: krunner vt: 1 dm: SDDM Distro: Garuda
    base: Arch Linux
Machine:
  Type: Desktop System: ASUS product: N/A v: N/A serial: <superuser required>
  Mobo: ASUSTeK model: PRIME Z690-P WIFI v: Rev 1.xx
    serial: <superuser required> part-nu: SKU uuid: <superuser required>
    UEFI: American Megatrends v: 3801 date: 05/14/2025
Battery:
  Device-1: hidpp_battery_0 model: Logitech Wireless Keyboard serial: <filter>
    charge: 55% (should be ignored) rechargeable: yes status: discharging
CPU:
  Info: model: 12th Gen Intel Core i9-12900K bits: 64 type: MST AMCP
    arch: Alder Lake gen: core 12 level: v3 note: check built: 2021+
    process: Intel 7 (10nm ESF) family: 6 model-id: 0x97 (151) stepping: 2
    microcode: 0x3A
  Topology: cpus: 1x dies: 1 clusters: 10 cores: 16 threads: 24 mt: 8 tpc: 2
    st: 8 smt: enabled cache: L1: 1.4 MiB desc: d-8x32 KiB, 8x48 KiB; i-8x32
    KiB, 8x64 KiB L2: 14 MiB desc: 8x1.2 MiB, 2x2 MiB L3: 30 MiB
    desc: 1x30 MiB
  Speed (MHz): avg: 801 min/max: 800/5100:5200:3900 scaling:
    driver: intel_pstate governor: powersave cores: 1: 801 2: 801 3: 801 4: 801
    5: 801 6: 801 7: 801 8: 801 9: 801 10: 801 11: 801 12: 801 13: 801 14: 801
    15: 801 16: 801 17: 801 18: 801 19: 801 20: 801 21: 801 22: 801 23: 801
    24: 801 bogomips: 152985
  Flags-basic: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx
  Vulnerabilities: <filter>
Graphics:
  Device-1: Intel AlderLake-S GT1 vendor: ASUSTeK driver: i915 v: kernel
    alternate: xe arch: Xe process: Intel 10nm built: 2020-21 ports:
    active: none empty: DP-1,HDMI-A-1,HDMI-A-2 bus-ID: 00:02.0
    chip-ID: 8086:4680 class-ID: 0300
  Device-2: NVIDIA GA104 [GeForce RTX 3060 Ti Lite Hash Rate]
    vendor: ASUSTeK driver: nvidia v: 580.95.05 alternate: nouveau,nvidia_drm
    non-free: 550-580.xx+ status: current (as of 2025-08; EOL~2026-12-xx)
    arch: Ampere code: GAxxx process: TSMC n7 (7nm) built: 2020-2023 pcie:
    gen: 4 speed: 16 GT/s lanes: 16 ports: active: DP-2,DP-4,HDMI-A-4
    empty: DP-3,HDMI-A-3 bus-ID: 01:00.0 chip-ID: 10de:2489 class-ID: 0300
  Device-3: Realtek Integrated_Webcam_FHD driver: uvcvideo type: USB
    rev: 2.0 speed: 480 Mb/s lanes: 1 mode: 2.0 bus-ID: 1-12.4:11
    chip-ID: 0bda:58ba class-ID: 0e02 serial: <filter>
  Device-4: Microsoft LifeCam Studio
    driver: hid-generic,snd-usb-audio,usbhid,uvcvideo type: USB rev: 2.0
    speed: 480 Mb/s lanes: 1 mode: 2.0 bus-ID: 1-3:3 chip-ID: 045e:0772
    class-ID: 0300
  Display: wayland server: X.org v: 1.21.1.18 with: Xwayland v: 24.1.8
    compositor: kwin_wayland driver: X: loaded: modesetting,nvidia
    unloaded: nouveau alternate: fbdev,intel,nv,vesa dri: iris
    gpu: nv_platform,nvidia,nvidia-nvswitch d-rect: 3840x2160 display-ID: 0
  Monitor-1: DP-2 pos: primary,left model: Samsung SyncMaster
    serial: <filter> built: 2009 res: mode: 1920x1080 hz: 60 scale: 100% (1)
    dpi: 92 gamma: 1.2 size: 531x298mm (20.91x11.73") diag: 609mm (24")
    ratio: 16:9 modes: max: 1920x1080 min: 640x480
  Monitor-2: DP-4 pos: right model: Dell UZ2715H serial: <filter>
    built: 2014 res: mode: 1920x1080 hz: 60 scale: 100% (1) dpi: 83 gamma: 1.2
    size: 597x336mm (23.5x13.23") diag: 676mm (26.6") ratio: 16:9 modes:
    max: 1920x1080 min: 640x480
  Monitor-3: HDMI-A-4 pos: right model: Lontium semi serial: <filter>
    built: 2020 res: mode: 3840x2160 hz: 30 scale: 200% (2) to: 1920x1080
    dpi: 813 gamma: 1.2 size: 3840x2160mm (151.18x85.04") diag: 139mm (5.5")
    ratio: 15:9, 16:9 modes: max: 3840x2160 min: 640x480
  API: EGL v: 1.5 hw: drv: intel iris drv: nvidia platforms: device: 0
    drv: nvidia device: 2 drv: iris device: 3 drv: swrast gbm: drv: nvidia
    surfaceless: drv: nvidia wayland: drv: nvidia x11: drv: nvidia
    inactive: device-1
  API: OpenGL v: 4.6.0 compat-v: 4.5 vendor: nvidia mesa v: 580.95.05
    glx-v: 1.4 direct-render: yes renderer: NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2
    memory: 7.81 GiB display-ID: :1.0
  API: Vulkan v: 1.4.321 layers: 17 device: 0 type: discrete-gpu name: NVIDIA
    GeForce RTX 3060 Ti driver: nvidia v: 580.95.05 device-ID: 10de:2489
    surfaces: N/A device: 1 type: integrated-gpu name: Intel UHD Graphics 770
    (ADL-S GT1) driver: mesa intel v: 25.2.4-arch1.1 device-ID: 8086:4680
    surfaces: N/A device: 2 type: cpu name: llvmpipe (LLVM 20.1.8 256 bits)
    driver: mesa llvmpipe v: 25.2.4-arch1.1 (LLVM 20.1.8)
    device-ID: 10005:0000 surfaces: N/A
  Info: Tools: api: clinfo, eglinfo, glxinfo, vulkaninfo
    de: kscreen-console,kscreen-doctor gpu: corectrl, gputop, intel_gpu_top,
    lsgpu, lact, nvidia-settings, nvidia-smi wl: wayland-info,wlr-randr
    x11: xdpyinfo, xprop, xrandr
Audio:
  Device-1: Intel Alder Lake-S HD Audio vendor: ASUSTeK driver: snd_hda_intel
    v: kernel alternate: snd_soc_avs,snd_sof_pci_intel_tgl bus-ID: 00:1f.3
    chip-ID: 8086:7ad0 class-ID: 0403
  Device-2: NVIDIA GA104 High Definition Audio vendor: ASUSTeK
    driver: snd_hda_intel v: kernel pcie: gen: 4 speed: 16 GT/s lanes: 16
    bus-ID: 01:00.1 chip-ID: 10de:228b class-ID: 0403
  Device-3: Conexant Systems (Rockwell) DELL UZ2715H
    driver: hid-generic,snd-usb-audio,usbhid type: USB rev: 2.0 speed: 12 Mb/s
    lanes: 1 mode: 1.1 bus-ID: 1-12.2:12 chip-ID: 0572:141c class-ID: 0300
    serial: <filter>
  Device-4: Microsoft LifeCam Studio
    driver: hid-generic,snd-usb-audio,usbhid,uvcvideo type: USB rev: 2.0
    speed: 480 Mb/s lanes: 1 mode: 2.0 bus-ID: 1-3:3 chip-ID: 045e:0772
    class-ID: 0300
  API: ALSA v: k6.17.1-zen1-1-zen status: kernel-api with: aoss
    type: oss-emulator tools: alsactl,alsamixer,amixer
  Server-1: PipeWire v: 1.4.8 status: active with: 1: pipewire-pulse
    status: active 2: wireplumber status: active 3: pipewire-alsa type: plugin
    4: pw-jack type: plugin tools: pactl,pw-cat,pw-cli,wpctl
Network:
  Device-1: Intel Alder Lake-S PCH CNVi WiFi driver: iwlwifi v: kernel
    bus-ID: 00:14.3 chip-ID: 8086:7af0 class-ID: 0280
  IF: wlo1 state: down mac: <filter>
  Device-2: Realtek RTL8125 2.5GbE vendor: ASUSTeK driver: r8169 v: kernel
    pcie: gen: 2 speed: 5 GT/s lanes: 1 port: 3000 bus-ID: 06:00.0
    chip-ID: 10ec:8125 class-ID: 0200
  IF: enp6s0 state: up speed: 1000 Mbps duplex: full mac: <filter>
  IF-ID-1: br-1f7862558da6 state: down mac: <filter>
  IF-ID-2: br-7bfc84ea431e state: down mac: <filter>
  IF-ID-3: br-82d31aa0b51e state: up speed: 10000 Mbps duplex: unknown
    mac: <filter>
  IF-ID-4: br-960c3623af4c state: down mac: <filter>
  IF-ID-5: br-b787944b7593 state: up speed: 10000 Mbps duplex: unknown
    mac: <filter>
  IF-ID-6: br-b90412b2529c state: down mac: <filter>
  IF-ID-7: br-c3a5729d4cf6 state: down mac: <filter>
  IF-ID-8: br-e0cf0c4bc03a state: up speed: 10000 Mbps duplex: unknown
    mac: <filter>
  IF-ID-9: br-e9c38ec2b98c state: up speed: 10000 Mbps duplex: unknown
    mac: <filter>
  IF-ID-10: docker0 state: down mac: <filter>
  IF-ID-11: veth03c4a4f state: up speed: 10000 Mbps duplex: full
    mac: <filter>
  IF-ID-12: veth4ccbab3 state: up speed: 10000 Mbps duplex: full
    mac: <filter>
  IF-ID-13: veth5f3d8a9 state: up speed: 10000 Mbps duplex: full
    mac: <filter>
  IF-ID-14: vethe85a946 state: up speed: 10000 Mbps duplex: full
    mac: <filter>
  IF-ID-15: virbr0 state: down mac: <filter>
  IF-ID-16: virbr1 state: down mac: <filter>
  Info: services: NetworkManager, smbd, sshd, systemd-timesyncd
Bluetooth:
  Device-1: Intel AX201 Bluetooth driver: btusb v: 0.8 type: USB rev: 2.0
    speed: 12 Mb/s lanes: 1 mode: 1.1 bus-ID: 1-14:8 chip-ID: 8087:0026
    class-ID: e001
  Report: btmgmt ID: hci0 rfk-id: 0 state: up address: <filter> bt-v: 5.2
    lmp-v: 11 status: discoverable: no pairing: no class-ID: 6c0104
RAID:
  Hardware-1: Intel Volume Management Device NVMe RAID Controller driver: vmd
    v: 0.6 port: N/A bus-ID: 00:0e.0 chip-ID: 8086:467f rev: class-ID: 0104
Drives:
  Local Storage: total: 6.37 TiB used: 2.97 TiB (46.6%)
  SMART Message: Unable to run smartctl. Root privileges required.
  ID-1: /dev/nvme0n1 maj-min: 259:0 vendor: Samsung model: SSD 990 PRO with
    Heatsink 2TB size: 1.82 TiB block-size: physical: 512 B logical: 512 B
    speed: 63.2 Gb/s lanes: 4 tech: SSD serial: <filter> fw-rev: 4B2QJXD7
    temp: 46.9 C scheme: GPT
  ID-2: /dev/nvme1n1 maj-min: 259:1 vendor: Samsung model: SSD 980 PRO 1TB
    size: 931.51 GiB block-size: physical: 512 B logical: 512 B speed: 63.2 Gb/s
    lanes: 4 tech: SSD serial: <filter> fw-rev: 5B2QGXA7 temp: 42.9 C
    scheme: GPT
  ID-3: /dev/sda maj-min: 8:0 vendor: Seagate model: ST4000NE001-2MA101
    size: 3.64 TiB block-size: physical: 4096 B logical: 512 B speed: 6.0 Gb/s
    tech: HDD rpm: 7200 serial: <filter> fw-rev: EN01 scheme: GPT
  SMART Message: Unknown smartctl error. Unable to generate data.
Partition:
  ID-1: / raw-size: 1.79 TiB size: 1.79 TiB (100.00%) used: 705.27 GiB (38.6%)
    fs: btrfs block-size: 4096 B dev: /dev/nvme0n1p2 maj-min: 259:3
  ID-2: /boot/efi raw-size: 300 MiB size: 299.4 MiB (99.80%)
    used: 636 KiB (0.2%) fs: vfat block-size: 512 B dev: /dev/nvme0n1p1
    maj-min: 259:2
  ID-3: /home raw-size: 1.79 TiB size: 1.79 TiB (100.00%)
    used: 705.27 GiB (38.6%) fs: btrfs block-size: 4096 B dev: /dev/nvme0n1p2
    maj-min: 259:3
  ID-4: /var/log raw-size: 1.79 TiB size: 1.79 TiB (100.00%)
    used: 705.27 GiB (38.6%) fs: btrfs block-size: 4096 B dev: /dev/nvme0n1p2
    maj-min: 259:3
  ID-5: /var/tmp raw-size: 1.79 TiB size: 1.79 TiB (100.00%)
    used: 705.27 GiB (38.6%) fs: btrfs block-size: 4096 B dev: /dev/nvme0n1p2
    maj-min: 259:3
Swap:
  Kernel: swappiness: 133 (default 60) cache-pressure: 100 (default) zswap: no
  ID-1: swap-1 type: zram size: 31.08 GiB used: 137.3 MiB (0.4%)
    priority: 100 comp: zstd avail: lzo-rle,lzo,lz4,lz4hc,deflate,842
    dev: /dev/zram0
  ID-2: swap-2 type: partition size: 34.2 GiB used: 0 KiB (0.0%)
    priority: -2 dev: /dev/nvme0n1p3 maj-min: 259:4
Sensors:
  System Temperatures: cpu: 44.0 C mobo: N/A
  Fan Speeds (rpm): N/A
Info:
  Memory: total: 32 GiB note: est. available: 31.08 GiB used: 9.43 GiB (30.4%)
  Processes: 620 Power: uptime: 3h 41m states: freeze,mem,disk suspend: deep
    avail: s2idle wakeups: 0 hibernate: platform avail: shutdown, reboot,
    suspend, test_resume image: 12.37 GiB services: org_kde_powerdevil,
    power-profiles-daemon, upowerd Init: systemd v: 258 default: graphical
    tool: systemctl
  Packages: 2698 pm: pacman pkgs: 2681 libs: 619 tools: octopi,pacseek,paru
    pm: flatpak pkgs: 17 Compilers: clang: 20.1.8 gcc: 15.2.1 alt: 13/14
    Shell: Bash v: 5.3.3 default: fish v: 4.1.2 running-in: kitty inxi: 3.3.39
Garuda (2.11.1-1):
  System install date:     2024-10-16
  Garuda release:          240428
  Last full system update: 2025-10-08 
  Is partially upgraded:   No
  Relevant software:       snapper NetworkManager dracut nvidia-utils nvidia-open-dkms garuda-hardware-profile-nvidia garuda-hardware-profile-standard garuda-hardware-profile-standard-x11
  Windows dual boot:       Probably (Run as root to verify)
  Failed units:            
--- System Health Check Report ---
23/24 checks run in 0.73 seconds ⌛
Powered by garuda-health 🦅

✅ System health check passed. No issues found.

Many thanks!!

Heya. We provide no support for third party configuration tools like envycontrol.

On my end, Garuda Linux is working as expected and using the iGPU over the dGPU as described in the wiki article.

It is unfortunately impossible to know which configuration files this envycontrol software has messed with, so I hope you will be able to remove whatever it has done to create this mess in the first place. The best way to do that reliably would probably be to restore a snapshot from before you have installed it.

If the issue persists, we will need a new inxi and we will start troubleshooting from there.

That depends. For some users, the xe driver has shown promise in regards to stability. I would recommend staying on the kernel’s default choice. In the future, the default choice might change.

2 Likes

I wish to clarify, I haven’t done anything with envycontrol yet - I just installed it to query the configuration. I haven’t changed any settings. What would you suggest would be the best way for me to begin looking into why the intel gpu isn’t being leveraged? Is there something wrong in my configuration?

What is the output you’re getting from

env -i glxinfo | grep "OpenGL vendor string"

1 Like
> env -i glxinfo | grep "OpenGL vendor string"
Error: unable to open display

Right. Should have thought about that.

env -i DISPLAY=:1 glxinfo | grep "OpenGL vendor string"

Also, as a secondary troubleshooting step, does the issue persist if you only leave the one monitor plugged in that’s connected to the internal GPU? (With a reboot in between?)

You seem to have 3 monitors plugged in. I suspect two of those are plugged into the dedicated GPU?

1 Like
> env -i DISPLAY=:1 glxinfo | grep "OpenGL vendor string"
Authorization required, but no authorization protocol specified

Error: unable to open display :1

While the system is still running, I plugged the secondary monitor into the displayport of the iGPU and it’s working just fine.

I have a KVM plugged into the NVIDIA hdmi port and mirroring the primary monitor.

Ughhh

env -i DISPLAY=:1 XAUTHORITY=$XAUTHORITY glxinfo | grep "OpenGL vendor string"

That’s not really what I asked.

I’ll need you to unplug all monitors from the NVIDIA GPU and then reboot and see if the issue persists.

The issue, in this case, being that the NVIDIA GPU is the primary GPU.

1 Like
> env -i DISPLAY=:1 XAUTHORITY=$XAUTHORITY glxinfo | grep "OpenGL vendor string"
OpenGL vendor string: NVIDIA Corporation

Sorry! Misunderstood. I’ll shutdown, unplug all except one monitor into the iGPU and will report back.

1 Like

Ok, rebooted with just one monitor plugged into the iGPU.

> env -i DISPLAY=:1 XAUTHORITY=$XAUTHORITY glxinfo | grep "OpenGL vendor string"
OpenGL vendor string: Intel

edit: FWIW, while still running, I re-ported all the monitors back into the NVIDIA card, and the output above is the same.

Heya.

Well that makes sense to me. If your screens are plugged into the dedicated GPU, your dedicated GPU will need to be turned on and active for the screens to work.

I think everything is behaving as intended here, and there is nothing to worry about as long as you are not facing any other issues.

2 Likes

Huh, ok… it appears that now it’s defaulted to the iGPU, and I have to use prime-run to tell it to use the NVIDIA card specifically. But, if I reboot with all the monitors plugged into the NVIDIA card, then it will default to the dGPU and leave the intel one just idling…

Yeah, that’s totally normal and there is nothing for you to worry about. If you’re not actually using the iGPU for anything, there is no need to default to it. The dGPU will be active 24/7 anyway because the monitors are plugged into it.

Does that answer the question in your original post?

2 Likes

Yes, this makes a lot of sense, thank you!

Ok, so…something bizarre… after a reboot, with the monitors plugged into the nvidia card, the system switches to NVIDIA as the primary GPU, as evidenced by the output for:

> glxinfo | grep "OpenGL vendor string"
OpenGL vendor string: NVIDIA Corporation

However, now, when I load chrome or firefox for google meet, and use a filter, it produces a completely white screen. For some reason, NVIDIA is having issues with hardware acceleration on chrome and firefox.

Intel, however, has no issue with hardware acceleration on the browsers. Is there a way to default to the Intel GPU as the primary GPU even with the monitors plugged into the NVIDIA displayports?

Edit: did some searching and came across this thread on the arch forum: [SOLVED] dGPU is used instead of iGPU by default / Newbie Corner / Arch Linux Forums

While the issue was with the user’s windows application interfering with the GPU, there was a suggestion to “remove the KMS hook and add i915 to the modules in mkinitcpio.conf”.

Now, I know Garuda now uses dracut and in my /etc/dracut.conf.d/ directory I have 2 files: intel.conf and nvidia.conf both of which contain the kernel modules that need to be loaded. Is there a way to have it load the i915 as the primary display? There was a suggestion somewhere else online to modify the GRUB kernel parameter to include i915.modeset=1 to default to the intel igpu - would this work? Or am I thinking about this wrong?

You definitely don’t have to change anything about the dracut stuff. Ignore that.

You can try to play around with the kernel parameters, or you can try this variable here: Environment Variables — The Mesa 3D Graphics Library latest documentation (DRI_PRIME)

2 Likes

Thank you, this is helpful information. I discovered that if I have one of my monitors and the kvm plugged into the igpu display slots, and the secondary monitor on the dgpu display slot, it defaults to intel gpu first, and i can manually specify via prime-run for a program to use the dgpu - like games. This seemed to also resolve some issues with google meet on chrome and FF - as nvidia and wayland aren’t the best of friends yet, and the latest nvidia driver caused issues with hardware acceleration on both those browsers.

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.