“There’s that sort of sense that many technical people will see or feel when you see something and you know what it could be, and you know it could be important, and you see companies just doing it wrong — there’s that powerful desire to fix it and do it right and show them sort of how it’s supposed to be done”
— John Carmack at GDC 2015, in what’s likely to be the most reused quote on this blog.
I just bought Doom Eternal. Excited to see the download has completed I fired it up and.. nothing. Just a bunch of resolution changes, then nothing - not even an error message. I’m back to the desktop right where I started. My first go-to was the Doom Eternal support article on Steam, where I was greeted with this gem:
“Issue: DOOM Eternal fails to launch or crashes while launching on my Laptop. Resolution: We do not officially support laptop hardware. Laptops that conform to the supported hardware specifications may run DOOM Eternal. Make sure the laptop uses its dedicated GPU and that the laptop is plugged into power. (This may also help with some desktops that use motherboards that have integrated GPUs.) For NVIDIA users, your NVIDIA driver needs to be setup to pick the dedicated GPU.”
I did happen to be using a laptop — a Razer Blade advanced model with a GeForce RTX 2080. It’s not like it’s an alien computer from outer space, and software shouldn’t have trouble running on a laptop versus a desktop. Let’s try to read between the lines and see how iD Software might be failing here. First there’s “Make sure the laptop uses its dedicated GPU” — most users aren’t technically inclined enough to know how to make sure the laptop does that, and in Doom Eternal’s case being powered by a Vulkan renderer means that at one point they need to be calling vkEnumeratePhysicalDevices to, ahem, enumerate the physical GPU devices on the system. Almost all hybrid systems will be using an Intel integrated GPU plus an NVIDIA or AMD discrete GPU — is this too hard to detect? Is a heuristic picking the non-Intel GPU when faced with two GPUs too much work? Such a heuristic would save Bethesda the effort of writing the above support message and quite a few support calls, and I’m not even going to touch upon lost sales. Direct3D users have IDXGIFactory::EnumAdapters, which does the same thing. There’s really no excuse for requiring that the user, every user, jump through hoops when GPU selection is something that can be done in a few lines of code on the application’s side.
As for the second part, “Make sure… that the laptop is plugged into power” — can’t someone just call GetSystemPowerStatus and display a warning? There’s no reason an app shouldn’t work on battery power (that’s pure madness if you ask me), but it’s reasonable to show a warning saying you’ll either drain your battery really fast or you’ll suffer decreased performance.
Later down in the same support document I came across another embarrassing answer:
“Issue: Game crashes on launch with two AMD GPUs installed. Resolution: Issue is caused by having multiple monitors plugged into different GPUs. Plug both monitors into the primary GPU to fix.”
Seriously? There’s IDXGIAdapter::EnumOutputs, and you can use the VK_KHR_get_physical_device_properties2 extension to map a Vulkan device’s LUID to a DXGI device’s LUID.
It seems like Doom Eternal’s code, as technically impressive as its core renderer is, seems to only work fine on the authors’ computers and nothing significantly different — if you even hook up your monitors differently you’re shit out of luck. There isn’t even any effort to detect the known-bad cases and show an error message, you just get a blank screen then back to the desktop and then have to go through the support document and figure out what might apply to your case. Even if you ignore the time saved for customers, the dollar-amount cost for Bethesda in terms of support effort makes detecting such situations financially worth it.