The problem is that we don't consume buffers from an occluded surface. So when it swaps buffers we block. But that block occurs on a frontend thread - so the number of frontend threads indirectly limits the number of occluded surfaces.
Supporting evidence for this can be gleaned by hacking OcclusionFilter::operator() to return false - we then see the expected behaviour. (But this isn't a good idea for other reasons.)
The problem is that we don't consume buffers from an occluded surface. So when it swaps buffers we block. But that block occurs on a frontend thread - so the number of frontend threads indirectly limits the number of occluded surfaces.
Supporting evidence for this can be gleaned by hacking OcclusionFilter ::operator( ) to return false - we then see the expected behaviour. (But this isn't a good idea for other reasons.)