Quote Originally Posted by Rob Barris
The key idea is really that careful fencing and sync efforts are only needed in the absence of orphaning and in cases where you are going back to *rewrite* some storage that may be pending drawing, like trying to do some sort of sub-section update to a mesh, say.
Rob, I'm not sure I understand. You still need a sync before you go to draw though, don't you? Should the application keep track of active and inactive VBOs (the GPU may be drawing with the active while the inactive VBOs are ready to be recycled)?

Quote Originally Posted by Rob Barris
The flip side of that is that you can do high performance dynamically generated batches of mixed sizes with no fences at all, and with low driver overhead, if you constrain your access patterns to only write/use any given segment of a buffer exactly once before the buffer is orphaned. This is a familiar pattern from the D3D playbook.
I'm curious about your "dynamically generated batches". Do you generate the batches a frame or two in advance to ensure you have time to upload them to the GPU before you need to draw with them? I'd really like to be able to put all my vertex data directly into VBOs. Unfortunately, I have multiple LODs and I don't know which LODs I need until I'm finished culling. If I put all my LODs into VBOs, I'd have hundreds of MBs of VBO data. I'm struggling with how to fill VBOs with the correct subset of vertex data while giving the GPU enough time between the upload and the draw call...