Earlier this week, news of a modder who hacked AMD’s FSR 2.0 time-scaling technology in Cyberpunk 2077, allowing non-RTX graphics card users to play the game at higher frame rates. higher with significantly better visual quality than with FSR 1.0 scaling. This is huge for AMD GPU owners, and the mod even works beautifully on Steam Deck.
We’ve reached out to the mod’s creator, the gloriously named PotatoOfDoom1337, to find out exactly how it works – and if that means FSR 2.0 will soon be available in a ton of existing games. Here is the interview, slightly edited for clarity. Enjoy!
What is your experience in programming and modding games? On NexusMods, it seems you’ve only been creating mods since April of last year?
PotatoOfDoom: I study computer science, I have always been interested in the technical aspect of video games and I was fascinated when I discovered projects like Refresh, Special k Where DXVK. I consider programming my favorite hobby and I also really like reverse engineering and playing with code. I created my first Cyberpunk 2077 mod because CDPR fixed a very funny bug in the game. It annoyed me so much that I downloaded the dev tools and reimplemented the bug myself. The process of creating this mod got me hooked, I learned more about the game over time and started creating more complex mods.
What motivated you to try to hack FSR 2.0 in Cyberpunk 2077?
PotatoOfDoom: Mainly my aging GTX 1080, a bit of envy towards RTX users because of their proprietary DLSS technology, and curiosity about how temporary upscaling solutions work in general. Also, FSR 2.0 and DLSS were described as being very similar, so I just wanted to see if it was possible.
How did you develop the mod?
PotatoOfDoom: I originally started the mod a few weeks ago in anticipation of the FSR 2.0 open source release. The first steps were to get the game to talk to my custom .dll file and tell the game it supports DLSS and report the available DLSS resolutions to the game by implementing the required interfaces. Then I wrote a little shader that just displays a blank red image. My goal was to use this as a basis for verifying that the DirectX parts of my code were working properly. Then I just waited for the open source version. After AMD released the source code, I immediately replaced my test code with FSR 2.0. I expected to work on it for several days, but was pleasantly surprised that it only took me a few hours to integrate it. I’ve used debuggers like x64dbg and reverse engineering software like IDA and Ghidra to find the specifics of DLSS behavior in game code. Also, for debugging buffers, RenderDoc has been incredibly helpful.
Here’s what the mod looks like in action in Cyberpunk 2077 and Dying Light 2, compared to DLSS, FSR 1.0 and native 4K.
Were there any surprises in terms of harder or easier things to accomplish?
PotatoOfDoom: The main DLSS and FSR input buffers are the same. I simply copied the FSR integration from the AMD example, set the FoV/Depth values, ran the game, and immediately got a pretty decent image. The worst was a quirk in Cyberpunk where the game didn’t reset a special DirectX structure (ComputeRootSignature) after running DLSS. It’s not that important for Nvidia’s DLSS since it uses CUDA, but unfortunately FSR uses ordinary DirectX compute shaders, which breaks the game, so I had to find a way to restore that structure after running FSR .
Regarding the implementation of FSR 2.0 CP2077, what is working well at the moment and what needs to be fixed?
PotatoOfDoom: Ghosting and animated textures are the biggest issues right now. DLSS and FSR use separate masks to give the algorithm some guidance on whether to reuse old temporal material or discard it, but they don’t seem to be compatible and I need to create a shader that translates DLSS masks to FSR masks.
Are DLSS and FSR masks…similar to a Photoshop mask?
PotatoOfDoom: Yeah, basically like that. You can imagine them as a grayscale image with values ranging from 0.0 to 1.0 and the temporal upscaler reprojects the old images based on those values. The FSR Documentation goes into more detail about this.
Here is a visual example. I threw an incendiary grenade down the street, and as you can see there’s nothing in the motion vectors or the depth buffer. This is because neither the 2D fire texture nor the spark particles have a 3D representation in-game. The reprojection algorithm ignores these pixels and doesn’t reproject anything there.
Do FSR 2.0 and DLSS have similar requirements in terms of the inputs they need?
PotatoOfDoom: Yes, otherwise this mod would not be possible. Both integrations need color, motion vectors and a depth buffer as input. Plus they use the masks I mentioned earlier. They are very important for things that don’t have motion vectors, like particles or animated textures like smoke and in-game computer screens and poorly applied masks are the main reason for the appearance of ghosts in a game. Additionally, the FSR must know the depth buffer’s FOV and near and far planes. DLSS doesn’t need this extra information (I assume it understands it via the built-in ML algorithm).
With what you know now, would it be easy to develop a similar solution for other DLSS games?
PotatoOfDoom: Yes, I think so. I’m still not done with this one but if other games are similar it really shouldn’t take more than a few days per game. I have already done some first tests with Death Stranding and the first results seem very good.
For example, could FSR 2.0 be added to Control, a game that runs extremely poorly on AMD GPUs, even with RT disabled?
PotatoOfDoom: Yes, I think so. The control has been updated to DLSS 2.0, meaning the DLSS interface the game communicates with is the same or at least very similar to Cyberpunk. This is the most important part.
Given the massive public interest in the mod, what are your plans for the future? Would you be open to other developers joining the project to improve the results or implementing similar mods for other games?
PotatoOfDoom: I really did not expect so much interest in my mod, and if I had known that, I would have prepared a little more when I hit the publish button last Thursday. I want to finish Cyberpunk first (if the real devs aren’t faster than me XD) then move on to other DLSS games. And yes, of course, I’d love for other developers to join me and help me get this project out of the proof-of-concept stage faster and into something people can use. I heard there was already someone who wanted to port my mod to Red Dead Redemption 2.
Will it be possible to create a DLSS replacement that works across a range of games (“dlss2fsr”, as suggested by a Github user) or do you see it’s more of a series of mods each tailored to a given game?
PotatoOfDoom: Only with some compromises. It would be possible to create some sort of mod that retrieves the FoV and Depth values from a simple ini file. This mod might work for almost any DLSS game, but the image quality might not be as good as it could be. I mean even Nvidia optimizes DLSS for some games. For example, early versions of DLSS had terrible ghosting in Cyberpunk, while later DLSS updates improved the situation. I can’t speak for other games, but for example Cyberpunk unintentionally sends the object ID buffer to DLSS (which is a buffer that assigns a unique color value to each object in the scene). DLSS doesn’t need this buffer and can’t do anything with this information, but it gives me a lot of better anti-ghosting (especially when driving). Additionally, the ComputeRootSignature bug I mentioned earlier is unique to Cyberpunk and makes this version of the FSR mod incompatible with any other game. Each game has unique quirks or even bugs that make it important to optimize each game for get the best experience. Obviously I can’t do something like this for every game, but I think if there is some sort of DLSS2FSR framework, it should be possible for other developers with some programming experience to integrate and optimize easily FSR for other DLSS games.
Is there anything else you would like to share about the mod creation process, or that you would like people to know?
PotatoOfDoom:I think my answers above should cover everything mod-related for now. This mod is only a few days old and is already so well received. I’m sure we’ll see a ton of exciting developments in the weeks to come. Stay tuned for more.
Exciting stuff indeed! Since this interview took place, another contributor from mnnx’s ID successfully adapted the mod for Dying Light 2, and I expect to see many more games supported over the next few weeks if all goes well. Thanks to PotatoOfDoom for the time he spent creating the mod and talking to us!
If you want to try the mod for yourself, you can find it on NexusMods. Installation is quite simple – replace a few files in your CP2077 directory and edit the registry. You can also follow the evolution of the mod on PotatoOfDoom GitHub Repository.