= How to Set Nvidia as Primary GPU on Optimus-based Laptops
Akashdeep Dhar ; Jun Aruga ; Ankur Sinha; 
:revnumber: F37
:revdate: 2022-09-12
:category: Administration
:tags: How-to, Nvidia 
:page-aliases: how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops.adoc

//:imagesdir: ./images


include::{partialsdir}/3rdparty-message.adoc[]


== Introduction
The goal is to have an active NVIDIA GPU on an Optimus-based laptop and use it for all activities on Desktops Environments with Xorg-X11. 
Avoid using this guide if you prefer to render your desktop with the integrated GPU and selectively choose applications to utilize the NVIDIA GPU.

[NOTE]
====
The instructions in this document have been verified to work on releases of Fedora 32 Workstation and later versions that use Xorg-X11.

Some guides on the internet recommend a different approach to installing Nvidia drivers on Fedora, such as directly using the binaries provided by Nvidia. However, the Fedora Project cannot guarantee that these will always function with every Fedora release. Therefore, we recommend following the steps outlined in this document instead.

As of Fedora 34, Wayland has become the default display server on Fedora Workstation for GNOME desktop environments. To follow the steps provided in this guide, you must be logged in to a session that runs on Xorg-X11.


====

[WARNING]
====
This guide requires the secure boot to be **turned off** to load up the unsigned NVIDIA kernel modules.
====

To make all rendering default to the NVIDIA GPU, you need to follow these steps very carefully.

First, consider the following points:

* Why would you want to do this?

    Using the NVIDIA GPU all the time allows for smoother transitions and richer animation effects. Premium desktop environments like GNOME benefit greatly from this.
    Enabling the NVIDIA GPU all the time leads to lower CPU load and memory consumption, which would otherwise be high due to the added in-memory video buffer.

* Why might this not be ideal?

    Using the NVIDIA GPU all the time can cause a slight increase in battery consumption. This shouldn't be a concern if your device is plugged in while in use.
    The increased heat generation from the constantly enabled NVIDIA GPU might be a concern. You wouldn't want to play demanding games (AAA titles) on Proton while using your laptop on your lap.

== Step #1: Update from the existing repositories
Execute
----
sudo dnf upgrade
----
Once to update all your packages first.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-0.png[]

== Step #2: Add the RPMFusion repository for NVIDIA drivers
Then you need to add the *RPM Fusion repository for NVIDIA drivers*. To do that, open up *GNOME Software* and click on the *hamburger menu* (three horizontal lines) on the top-right corner. Then click on *Software Repositories* from the dropdown menu. There you will see this.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-1.png[]

Select *RPM Fusion for Fedora 32 - Nonfree - NVIDIA Driver* and *ENABLE* it. It requires elevated privileges so enter your password and it will be done.

== Step #3: Update from the newly added repositories
Execute
----
sudo dnf upgrade --refresh
----
to fetch all available updates from the newly added repository.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-2.png[]

== Step #4: Install the driver and its dependencies
Execute
----
sudo dnf install gcc kernel-headers kernel-devel akmod-nvidia xorg-x11-drv-nvidia xorg-x11-drv-nvidia-libs xorg-x11-drv-nvidia-libs.i686
----
to get the driver and all necessary dependencies.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-3.png[]

== Step #5: Wait for the kernel modules to load up
You **must** wait 5-10 minutes for the kernel modules to load. Please do not proceed to the next steps immediately.

== Step #6: Read from the updated kernel modules
Execute
----
sudo akmods --force
sudo dracut --force
----
This would force the configuration to be read from the updated kernel modules which now have the NVIDIA drivers in them.

== Step #7: Reboot your system
Wait for 3-5 minutes for the changes to take effect and then reboot your system.

Log in to a session with Xorg-X11.

From the desktop, go to the *About* page in the *Settings* application. You are likely to see the following output.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-4.png[]

This means that the driver installation was successful leading to the detection of two distinct video accelerators - internal and dedicated.

== Step #8: Edit the X11 configuration
Please ensure that the [application]`xrandr` package is installed before proceeding with this step:

----
sudo dnf install xrandr
----

Execute the following command to copy the display render details for the X11.

----
sudo cp -p /usr/share/X11/xorg.conf.d/nvidia.conf /etc/X11/xorg.conf.d/nvidia.conf
----

Once done, open up the `nvidia.conf` from the copy destination and edit it to add
----
Option "PrimaryGPU" "yes"
----
to the `OutputClass` section of it.

For example, use `nano`
----
sudo nano /etc/X11/xorg.conf.d/nvidia.conf
----
and make changes.

The file should look like this. Your file should look similar to this.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-5.png[]

You can see the additions in both sections.

Save it using `[Ctrl]+[S]` and exit out using `[Ctrl]+[X]`.

NOTE: If you are using a display manager other than GDM (the default of Fedora Workstation), you will need to configure it appropriately. Please refer https://wiki.archlinux.org/index.php/NVIDIA_Optimus#Display_managers[to the Arch wiki for instructions]. For SDDM (the KDE spin default) on Fedora32, the Arch wiki is _wrong_, and you need to edit the `/etc/sddm/Xsetup` file, _not_ `/usr/share/sddm/scripts/Xsetup`.

== Step #9: Reboot your system
Reboot your system and proceed to the next steps to verify the change in configuration.

== Step #10: Verify the configuration
Open a terminal and type in
----
glxinfo | egrep "OpenGL vendor|OpenGL renderer"
----
It should show your NVIDIA GPU.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-6.png[]

Check on `screenfetch`.
----
screenfetch
----
It should show your NVIDIA GPU under the GPU name.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-7.png[]

Check in your *Settings* application.
You would see something like this in the *About* page.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-8.png[]

You can make other configuration changes using *NVIDIA X Server Settings* application.
Also the GPU would show activity in its utilization percentage to signify that it is actually working.

image:how-to-set-nvidia-as-primary-gpu-on-optimus-based-laptops-9.png[]

== References
Should you face issues while following these steps or if these do not match your use case,
feel free to convey your queries on https://ask.fedoraproject.org[Fedora Forums].

Here are the links you can refer to for obtaining more information.

* https://rpmfusion.org/Howto/Optimus[RPMFusion's Optimus How-to guide]
* https://rpmfusion.org/Howto/NVIDIA[RPMFusion's NVIDIA How-to guide]
* https://unix.stackexchange.com/questions/16407/how-to-check-which-gpu-is-active-in-linux[GPU Activity on UNIX StackExchange]
* https://www.reddit.com/r/Fedora/comments/bw4b0p/how_to_fedora_nvidia_prime/[Fedora Subreddit (zvitaly’s response only)]
