AMD CPU + Nvidia GPU on a fresh Ubuntu 20.04 system

I was wondering how can I set my system up so that I can use my nvidia dgpu on difficult tasks and amd igpu for simple tasks. I have managed to make it work on Manjaro, using prime-run, but I can't figure it out on Ubuntu, as I am require to use Ubuntu.

CPU: AMD Ryzen 7: 4800HS GPU: Nvidia GeForce RTX 2060 with Max-Q

lspci | grep VGA output:

01:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2060] (rev a1) 05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Renoir (rev c6)

As far as I know, the best option is prime render offload, but what are the steps to make it work on a fresh Ubuntu 20.04 system? I would really appreciate a step-by-step answer.

lspci -k | grep -EA3 'VGA|3D|Display' output:

01:00.0 VGA compatible controller: NVIDIA Corporation TU106 [GeForce RTX 2060] (rev a1)
         Subsystem: ASUSTeK Computer Inc. Device 1e11
         Kernel driver in use: nvidia
         Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
-- 
05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Renoir (rev c6)
         Subsystem: ASUSTeK Computer Inc. Renoir
         Kernel modules: amdgpu 
05:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Device 1637

I am wondering because glxinfo | grep OpenGL gives:

OpenGL vendor string: VMware, Inc. OpenGL renderer string: llvmpipe (LLVM 9.0.1, 128 bits) OpenGL core profile version string: 3.3 (Core Profile) Mesa 20.0.4 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.1 Mesa 20.0.4 OpenGL shading language version string: 1.40 OpenGL context flags: (none) OpenGL extensions: OpenGL ES profile version string: OpenGL ES 3.1 Mesa 20.0.4 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10

So there is nothings about nvidia.

I have tried different solutions for a week already and nothing worked for me when I used Ubuntu.

I can provide any other information if required.

Thanks in advance!


Solution 1:

First you need to install kernel >=5.8 unless Renoir architecture will not work : you will find this here https://wiki.ubuntu.com/Kernel/MainlineBuilds or easy graphical use from ppa : https://github.com/bkw777/mainline.

Install this 5.8.* kernel first and nvidia driver second.

Second you need Nvidia 450 driver as describe below.

On a clean installation (with no xorg.conf and other options given on others places to xorg) do :

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update sudo
sudo apt dist-upgrade
sudo apt install nvidia-driver-450

After reboot you will be able to launch programs on the Nvidia card with the prefix __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

__ means _ _ without space.

For example try

$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | egrep "(OpenGL vendor|OpenGL renderer|OpenGL version)"

You should get something like this but with your graphical card (I have geforce 1660) :

$ OpenGL vendor string: NVIDIA Corporation
$ OpenGL renderer string: GeForce GTX 1660 Ti/PCIe/SSE2
$ OpenGL version string: 4.6.0 NVIDIA 450.66

Ans without the prefix, your integrated GPU will be used

$ glxinfo | egrep "(OpenGL vendor|OpenGL renderer|OpenGL version)"
$ OpenGL vendor string: X.Org
$ OpenGL renderer string: AMD RENOIR (DRM 3.38.0, 5.8.8-050808-generic, LLVM 10.0.0)
$ OpenGL version string: 4.6 (Compatibility Profile) Mesa 20.0.8

I don't know how to get the "On-Demand" work but only manually launch.

More information here :

https://us.download.nvidia.com/XFree86/Linux-x86_64/450.57/README/primerenderoffload.html

EDIT : the "On-Demand" is only manuel launch on demand from the eGPU. In linux there is no automatic as in windows.