We have been working on something that should provide similar capabilities as Syphon on Windows.
We started by naively sharing single-surface textures between applications, without synchronizing the access. In some cases this can cause flickering when one app is reading the texture while another app is rendering to that texture at the same time.
Some options to resolve this is to lock the texture in some way. This could cause delays in the reader, if it has to wait for the writer to finish rendering. An even better solution would be some kind of double texture, so you have a front-buffer that can be used safely by the reader, and a back-buffer that can be used safely by the writer.
We were wondering how this problem has been solved in Syphon, maybe this gives us some ideas on how to solve this.
So if one of the developers of Syphon could tell us something more, or point us to the right place in the source-code, so we could check how it’s done, we’d be grateful.
On MacOS, synchronization is handled by the OS, which makes things very simple for us. Changes to the IOSurface are pushed on glFlush() and picked up on the receiving end on glBindTexture(), with the driver taking care of synch. Discussion of its use (not implementation) is in the MacOS header CGLIOSurface.h.
Sorry not to have any useful advice for Windows (maybe vade does) – it sounds like double-buffering might be best if you can efficiently keep track of read/write buffer state in all processes.
We’d be super-interested to hear more about your project – it would be great if you dropped an e-mail to email@example.com.