The issue in my case was that i returned vertex positions as vec4(position, 0.0). I should have returned vec4(position, 1.0) instead. As per specs, a dynamic error occurs if w is 0. This error could not be captured though, and causes everything to fail silently.