1. One context, one canvas, 4 active programs
I cache all shader data upfront for the presets you can cycle through, then only compile and keep hot what’s really needed. That dropped my footprint from 26 separate shader instances down to just 4 active GPU programs. The rest are on standby, no extra contexts piling up, no limit hit.