This might not be the ideal place to post this (although I
am working with Mojave on a MacPro 3,1), but I thought I'd share...
Why the High Sierra nVidia Web Driver Will Never Work on Mojave (long post, sorry - TL;DR at the end)
Like many folks, I dove down the rabbit hole of trying to make my modern GeForce card work under Mojave (with the added twist of doing it on a MacPro 3,1, just to make sure it wasn't
too easy). Unlike most of those folks, I have a fair amount of reverse-engineering experience, and was not about to let an inter-corporation spat deprive me of both Mojave
and a full-featured GPU experience. I dug until I finally found an impenetrable layer of granite.
First, the installer tries to ensure you're using High Sierra (trivial to bypass). Next, the NVDAStartupWeb kext checks the OS version at runtime (also trivial to fix). The first real hurdle is in the HS GeForceWeb kext; the virtual method table for
IOAccelEventMachine2 doesn't match Mojave's version. A bit of research showed that in an unusual move, an existing method (
IOAccelEventMachineFast2::stop()) was replaced with a RESERVED method - that typically goes the other way (newer version fills a RESERVED slot with a new method). Fortunately, GeForceWeb doesn't actually
call that method, so I could patch the symbol table and get the kernel to link. Huzzah! ...maybe.
Booting with the patched GeForceWeb was disappointing; at about 60% of the boot progress bar, a spinner appeared and never stopped spinning. Undaunted, I experimented with copying over the High Sierra SkyLight framework (bad move), then the HS CoreDisplay framework (got the login screen to come up, but infinite loop of death followed). These generated enough log data for me to dig deeper.
I'll spare you the rest of the saga, but at the bottom I found that several data structures have changed between HS and Mojave. One of these, called
MTLIOAccelResource, is a fundamental Metal object; once again, the changes are unusual. They added two members to the structure, they revised two existing members to be bitfields instead of integers (resulting in a smaller structure), and they moved a data element (
resourceID) within the structure (very unusual). It's normal to reserve space in public data structures to allow for changes over time, but it's common practice to never mess with existing elements (either their size or placement), in order to preserve backward-compatibility. Given that this interface is at the driver level, they seemingly weren't concerned with that sort of compatibility; drivers apparently aren't supposed to be functional across OS versions. In any case, a HS graphic driver will be using a
MTLIOAccelResource object that is utterly incompatible with the Mojave system, resulting in all sorts of internal chaos (which is exactly what I observed). And because of the additional data elements (one being a pointer, just to make things worse -
MTLIOAccelDevice<MTLDevice> *weakDevice), it's non-trivial (read: damn near impossible) to write a shim that handles the differences between the HS GeForceMTLDriverWeb kext and the Mojave Metal system.
It's possible that the movement of the
resourceID element was a simple oversight, a rookie mistake, a fat-finger error ("Compiler error? Oops, I must have accidentally deleted that line, I'll just paste it back in somewhere near here"). It's also possible that there's some technical reason that made it necessary, although I can't think of any that make sense.
<tinfoilHat>It's also possible that the "feud" between Apple and nVidia was such that Apple wanted to ensure that there was no way for the existing drivers to work on Mojave, forcing nVidia to... (what?)</tinfoilHat> Regardless of intent, by adding and rearranging elements, they created an effectively insurmountable incompatibility.
TL;DR: Under Mojave, the Metal data structures are fundamentally different from HS, so HS drivers touching the Mojave Metal system just can't work. Plus, there's no reasonable way to write an interface layer to smooth over those differences. nVidia users just need to hope that Apple and nVidia can come to terms at some point.
OR, if nVidia could be persuaded to release (or "leak") unsigned Mojave drivers - or even just selected components (perhaps "for experimental use only" or some such) - there's a community of us out here that would be more than happy to make them usable... (even on fusty old Macs...)
(While I have the floor, many thanks to
@dosdude1 and the rest of the contributors here for making it possible to use High Sierra and Mojave on an old Mac. My cheese grater would probably be living up to its nickname without your efforts.)