Android's dirty F-word, "fragmentation," may not get as many irate headlines or clicks as it once did, but it remains an issue in a thousand tiny ways. As pointed out by Esper.io's Mishaal Rahman in a recent (and exquisite) newsletter, one of those issues is GPU drivers, simply because of how Android works.

Two different phones with the same chipset might actually be running different drivers with different performance profiles and different features enabled, and that can be a headache for developers — particularly when they need every iota of performance or bleeding-edge features. For developers behind bleeding-edge game emulators, this is a serious concern. But the folks behind Skyline, a Nintendo Switch emulator, came up with a neat trick that brings updated performance and features to older hardware.

I got the chance to harass Mark and Billy, two developers among others behind the project, to talk about Adreno Tools, a library they built to plug the gap between older drivers and newer ones at the app level. Released last December, Adreno Tools allows an app to basically intercept how apps talk to the system driver, letting the app use its own drivers instead. There's more to it than that, but it's the short version, and it fixes a lot of problems.

One of the big issues game developers face is whether a given device will support the graphical features they need. As PC gamers know all too well, sometimes you need a certain generation of GPU for a feature to work — as in the case of things like ray tracing. Although they work very differently at a driver level, similar logic applies to phones: Different hardware can simply do different stuff. And sometimes developers have to rely on specific features to work that may or may not be present, which can make things confusing for users — especially since there's that issue with GPU driver fragmentation we mentioned, which means even saying, "you need this chipset or better" may not actually be enough.

Returning to parallels on other gaming platforms, imagine a world where a Dell with an RTX 3080 ends up with different features than an HP with the same specs because it “lost support” last year or a Playstation 5 bought from Best Buy can run games that one purchased from Amazon can't. It would all be a little ridiculous, right? To a certain degree, that's actually how it is for Android phones right now, and it's a problem for developers.

Enter: Adreno Tools. It allows developers to load apps with their own drivers. In the case of Nintendo Switch emulator Skyline's case, they use something called Turnip, an open-source Vulkan driver for most recent Qualcomm Adreno GPUs. It provides both a known-good baseline on supported devices and, together with Adreno Tools, offers some extra features that can improve compatibility and performance on some hardware while also offering the developers a means to contribute back changes and request features — small indie developers can hardly ask Qualcomm to roll out changes just for them, and they'd still be waiting on system-level updates or Play Store-downloadable GPU drivers from device makers if somehow they could.

With Adreno Tools and Turnip, and thanks to the similarities shared by Qualcomm's GPUs across generations, Skyline was able to ensure that older devices could make use of newer features, including a texture compression format required for several Nintendo Switch titles. Other emulators are adopting it too, and it can be extended for use on non-Adreno-based chipsets from companies other than just Qualcomm, drivers willing.

The developers tell me that AetherSX2, a popular Playstation 2 emulator for Android, has at least partially adopted it (through a custom build), and the developers behind Dolphin, the popular GameCube and Wii emulator, are also looking into it. (If you happen to be a game developer running into similar problems, this might be worth a look.)

Adreno Tools can also be used to plug in more recent versions of official drivers for other apps that might use it. As an example for why you might want to, Rahman saw a pretty stunning 13% performance improvement in 3DMark by using an updated Qualcomm-provided driver on his Pixel 3 XL (though he used a different mechanism than Adreno Tools to do that):

It required a little shimming on the part of Skyline developer Billy Laws to shoehorn the driver, meant for recent Qualcomm chipsets, into working on an older one, but it exposes the possibility that customers could take it upon themselves to fix the fragmentation issue and see better performance, without waiting on unincentivized OEMs to do what they should. As Rahman points out in his newsletter this week, there are plenty of ways that Android device drivers can be updated now, from system updates to the Play Store, but it still hasn't fundamentally solved the problem of GPU driver fragmentation.

Adreno Tools doesn't solve that issue either — no one really can outside maybe Google forcing some kind of PC-like centralized driver update schema. But it does at least mean developers have a workaround if and when they can't rely on smartphone makers to deliver the necessary GPU features to their phones.