2015 13" MacBook Air [5th,2C,U] + RX 460 @ 16Gbps-TB2 (AKiTiO Thunder2) + macOS 10.13 [padams35] // eGPU linked straight to laptop's screen through a screen input board
I've been running a minimalist eGPU (RX 460 in an AKiTiO Thunder 2 enclosure with a 120W power supply brick) on a 2011 iMac and a 2015 MacBook Air since 10.12.1. Sierra was pretty painless, but 10.13.4 has introduced enough new quirks that I felt a new build guide was required.
TLDR; This combo works, but given an option I'd recommend sticking with 10.12.6.
System specs: 2015 13" MacBook Air 2.2 GHz i7, 8GB Ram, Intel Graphics 6000. MacOS 10.13.4
eGPU hardware: AKiTiO Thunder 2 enclosure with Gigabyte RX 460 2GB. The Thunder 2's default power brick was replace with a 10A 120W unit that had a compatible 5.5mm x 2.5mm plug. Due to the Gigabyte RX 460's length I also had to remove the Thunder 2's fan. I chose to remount the fan on the outside of the enclosure.
Installation steps: (One time)
- Disable SIP
- Run a script to enable eGPUs on Thunderbolt 1&2 macs (I used fr34k's macOS-eGPU.sh)
- Download Goalque's automate-eGPU.kext
- Move kext to /Library/Extensions/ and update flags to match other kexts
- Drag-drop automate-eGPU.ket to /Library/Extensions/ in finder.
- Open terminal.
- sudo chmod -R 755 /Library/Extensions/automate-eGPU.kext
- sudo chown root:wheel /Library/Extensions/automate-eGPU.kext
- ls -l@ /Library/Extensions/
- If you see 'drwxr-xr-x@' followed by com.apple.quarantine then:
- sudo xattr -d com.apple.quarantine /Library/Extensions/automate-eGPU.kext
Usage steps: (First time the eGPU is used after each restart.)
- in terminal run: sudo kextload /Library/Extensions/automate-eGPU.kext
- Connect the eGPU without a connected monitor (my eGPU is not always recognized with monitor connected)
- Connect the monitor to the eGPU (external monitor is recognized but screen is black)
- Logout (external monitor begins to function normally here)
- Login and enjoy your eGPU experience.
- Unigine Valley eGPU: 24.3 fps [1920x1080p full screen High 2xAA, external monitor]
- Unigine Valley HD 6000: 9.4 fps [1440x900 full screen High 2xAA internal monitor]
- Guild Wars 2 eGPU: ~47 fps @ 1920x1080
- Guild Wars 2 HD 6000: ~22 fps @ 1440x900 (Other setting constant. Same time/location)
- Starting in clamshell mode without using the internal display is painful but possible. Directly connect external monitor. Load kext. Disconnect monitor. Connect eGPU. Connect display to eGPU. Press 'option + shift + command + q' to force logout.
- If the automate-eGPU.kext has been loaded then my Air will kernel panic on wake-from-sleep if it has been asleep long enough for standby mode to be applicable. This occurs even if I have properly disconnected the eGPU.
- If the eGPU is connected while in clamshell it is recognized as an AMD Radeon RX 460. However if connecting while the internal display is active it will instead be recognized as an AMD Radeon Pro 460.
- I suspect that using Activity Monitor to monitor GPU use while gaming may cause GPU intensive games to stutter in time with the sampling rate. However my before/after sample sizes are small enough that that could have been a fluke, especially considering lax consistency in game settings.
Comments: Due to the multi-step startup that must be performed with every use I would recommend staying with Sierra 10.12.6 for this setup. That said, the RX 460 generally allows me to play games at over twice the framerate at 1080p on an external monitor than the Air could manage on the internal display at the lower 1440x900 resolution. The setup works and effectively expands the list of games playable on a MacBook Air
Sounds like something's really wrong here. Doesn't @fr34k's script already include automate-eGPU.kext automatically? Even a manual install should not require the Usage Steps you have mentioned above. Also, try adding -R flag to the chown command too. You may also have luck with the sleep problems by disabling hibernation - purge-wrangler has this option, but you can do so manually using pmset.
Ok, I created a clean test partition and reran the macOS-eGPU.sh script. It still didn't work, so I reran a local copy of it again a dozen times with iterative debug prints. This found at least two major bugs in legacy AMD GPU handling.
The big one is that L1798 is missing the '-r' flag. Without that the script was returning directory not copied errors when it tries to move the kext. Updating the line to start with 'sudo cp -r' allows the automate-eGPU.kext to install normally (when the script is run with the -a flag to force automate-egpu.kext install). That done my MacBookAir is now properly plug-and-play with the RX 460. I think my manual kext update procedure might be missing a step.
The nasty bug is that L2477 pciTemp variable is defined to store a command sequence and not the actual output. As a result when the variable is later used at L2529 the variable resolves as null since by then the eGPU will have already been disconnected. This prevents auto-recognition of legacy AMD GPUs. I wasn't able to figure out a working fix for this one. Theoretically changing the define to =$(system_profiler SPPCIDataType) should have fixed the issue but I'm still missing something (or multiple somethings).
I'll update the opening post in a couple days after I next have time to dig though code and test plug/play stability and performance.