Skip to the second paragraph for the how-to. The first is mostly describing how I got here. Also, be advised that ChatGPT did assist me here as I was DESPERATE for a solution and spent dozens of hours trying to figure it out on my own but to no avail. I typically dislike AI but I had no choice here. I also understand that this is unnecessarily long, but I always need everything explained to me like I’m a 5 year old so that’s how I write it.
KEEP IN MIND THAT WITH ANY TWEAKS LIKE THIS, THERE IS ALWAYS THE RISK THAT SOMETHING GOES WRONG. ALWAYS HAVE A BACKUP OF YOUR DATA. I AM NOT RESPONSIBLE FOR ANY HARDWARE/ SOFTWARE DAMAGE OR DATA LOSS THAT MAY RESULT IN YOU TRYING THIS.
One of my biggest gripes with the FW16 (7040 series w/ the rx7700s) has been the lack of a MUX switch setting in the UEFI. This has been a huge pain point for me and made me seriously reconsider my purchase, considering I was coming from an old Lenovo Legion 5i that I disabled the iGPU in on day 1. I primarily use my framework for Linux but I use Windows for a select few apps and games, and have been struggling with driver crashes (not to mention the Framework driver bundle completely borked windows so bad I couldn’t boot and had to reinstall), horrible stuttering when the MUX is switching, and some games/ applications not even being detected correctly so the MUX is not switching at all. Also, with games like Minecraft with different versions sometimes including their own built in Java runtimes, it’s not feasible to add every single java executable to the Windows graphics settings, but more importantly, it’s not something we should have to do at all. With all of the trade-offs and risks in mind (increased power consumption both at idle and in game, increased thermals, battery that may deplete even when plugged in, etc.), this is how I managed to not only keep the dGPU on at all times in Windows 11, but also completely automate it so it comes on only when plugged in to power and turns off automatically when power is unplugged.
The first thing to make sure of, at least for my situation, is to ensure you’re on AMD Adrenalin version 26.1.1, as I had major issues with 26.3.1 crashing and timing out, which is the latest version at the time of writing. 26.1.1 has been extremely stable for me currently and barely hiccups when switching to the dGPU on login. Also make sure to use the AMD Cleanup Utility in safe mode to cleanup the driver and installed version of Adrenalin before installing 26.1.1, as recommended by AMD on their website. Here’s the link for the Adrenalin patch notes, which includes a download link as well as a link to and explanation about the Cleanup Utility.
https://www.amd.com/en/resources/support-articles/release-notes/RN-RAD-WIN-26-1-1.html#Downloads
The second thing is to get Windows to recognize a “game” is running in order to wake the dGPU up. When I originally tried looking into this, I tried to add an app that’s always running (like Discord) to Settings > System > Display > Graphics but found it didn’t work because there wasn’t anything about it that required using the dGPU. What does work is a dummy application that makes a Direct3D 11 device and context and stays active so that, while the dGPU isn’t doing any real work, it keeps the dGPU waiting for work that won’t ever be done. This is where ChatGPT came into play. I had it code a basic desktop application (my C++ years are way behind me) that achieves all of this and runs silently in the background. I used Microsoft Visual Studio 2026 (not visual studio code) to compile this and it worked great. I’m not going to post the executable I made as it would be quite silly and risky to download something random off the internet when it’s so easy to make yourself. This is the code I used:
#include <windows.h>
#include <d3d11.h>
#pragma comment(lib, "d3d11.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
D3D_FEATURE_LEVEL featureLevel;
ID3D11Device* device = nullptr;
ID3D11DeviceContext* context = nullptr;
HRESULT hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
&device,
&featureLevel,
&context
);
if (FAILED(hr)) return 1;
while (true)
{
Sleep(3000);
}
return 0;
}
This is as simple as creating a new project, selecting “Empty Project” (the one with C++) on the right, going to “Project > Add New Item” and clicking add, then just pasting the code in. You’ll then have to (on the right side) right click your project (likely just project or project1 if you left the names default), click properties, expand “Linker” on the left side, then click system, then replace where it says “Console (/SUBSYSTEM:CONSOLE)” with “Windows (/SUBSYSTEM:WINDOWS)”. This is required for this to be completely invisible and run without a blank CMD window opening up. At this point, it’s pretty much done. Now just click “Build” on the top and click “Build Solution” which will compile the code into an executable with the same name as your project. You now need to simply retrieve your .exe file, which for me was located at C:\Users\USERNAME\source\repos\PROJECTNAME\x64\Debug and had the name project1.exe (I left the project names all default). I then renamed the file “GPU-KeepAlive.exe” and threw it on the C:\ drive, but you can realistically put it anywhere. That’s the hard part now done. The next part is adding it to the Windows graphics settings and having it run automatically via Windows Task Scheduler (the automation is not necessary but I personally wanted it so I didn’t have to run it manually on login and so it didn’t nuke battery too bad if wall power was lost).
Now to add it to Windows graphics settings so Windows will always have the dGPU running when our program is running. Go to Settings > System > Display > Graphics and next to “Add an app”, click “Add desktop app”. Navigate to wherever you placed GPU-KeepAlive.exe and click “add”. Now that your program is added to the list of programs below, click the program and change it from “Let Windows decide” to “High Performance (AMD Radeon™ RX 7700S)”. I also unchecked “Optimizations for windowed games” as I wanted to be safe but it may be fine, I just didn’t test it. At this point, you should be able to manually run GPU-KeepAlive.exe and find that Windows and the display driver should switch to the dGPU. You can also kill it via task manager and it should automatically switch back. This is what we want.
Now, you could just leave it like this and run the program only when you want to MUX the dGPU and kill it from task manager when you’re done, but I much prefer it to be automatic as I want a true set it and forget it solution. To achieve this, open task scheduler, click Action > Create Basic Task and proceed with creating the task. Name it whatever you want (I chose “Keep dGPU Active”) and put a description if you’d like. For trigger, select “When I log on”. For action, leave “Start a program” selected. Now click “browse” and search for the GPU-KeepAlive.exe the same way we did when adding it into the Windows graphics settings. After that, click finish and it should now open automatically when you log in, but we’re not done yet. We’re going to add a slight time delay to the task to give Windows and Adrenalin a head start in making sure they’re ready, as well as add the trigger to turn this off when on battery. There is already an option to not trigger this when on battery that, if you’d like, can be unchecked now to really make sure the dGPU is on ALL THE TIME.
Find the task you just made on the right side where the list of tasks are and “right click > properties” to edit the task. If you’d like this to run all the time regardless of battery or wall power, you can uncheck “Start the task only if the computer is on AC power” as well as unchecking “Stop if the computer switches to battery power”. If you desire to have it turn off on battery power like I did, ignore this and proceed to the next step. Now, go to the “Triggers” Tab and click “New” at the bottom. For “Begin the task” on the top, set it to “On an event”. Set Log to “System”, set Source to “Kernel-Power”, set Event ID to “105”, and click OK at the bottom. Click OK again to save it. Lastly, click the first “At log on” trigger and then click edit. At the bottom under “Advanced settings”, check off “Delay task for:” and in the box next to it, type “10 seconds”. That box does have a drop down, but to make it shorter than 30 seconds, you have to manually type it. Once you click OK to save everything and close task scheduler, you should be all set.
I hope this helps others as much as it’s helping me now that I have this fixed. If anyone wants screenshots to help them do this, I can provide them. I just didn’t feel like screenshotting every step when I was writing this.