Previously, each backend had to guard against it, which is messy,
results in duplication, and leaves new backends open to the risk
of not guarding against it (the Wii U GX2 renderer didn't).
The Wii U's wacky PowerPC architecture highlighted a cool
platform-dependency: the boss rendering code only properly works on
platforms where `char` is signed by default.
Granted, it's possible Pixel explicitly marked this variable as
signed. Who knows. Either way, CSE2 didn't, and now that's been
fixed.
This uses basic hardware-acceleration to bounce the software-rendered
frame to both the gamepad *and* the TV!
The previous method only supported the gamepad, suffered from V-tear,
and used slightly more CPU (my test with the end of Egg Corridor ran
at 52FPS, while this new method runs at 55FPS).
With GLFW, you're supposed to `#include` your extension loader before
it, but this header made that extremely awkward. The previous "fix"
would cause build errors on Windows when compiling the software
renderer.
There's a new bug I've noticed: sometimes, an instrument will just
'disappear', and refuse to ever play again.
This stuff is practically impossible to debug, so I'm just throwing
things at the wall. This time, I'm going to make more use of the
`AXVoiceBegin` and `AXVoiceEnd` functions. I have no idea what
they're meant to do: code I found online uses it inconstently, and
Decaf doesn't have it implemented at all!
Hopefully, all of my problems have just been race conditions caused
by not using these guard functions (assuming that's what they are).