GPU and CPU run asynchronously. GPU is often at least half a frame late from the CPU. You'd need to read a GPU generated buffer on CPU during the same frame (multiple times). This means that you need to stall both the CPU and the GPU during the frame (multiple times). Feedback loop like this would not give you any performance gains. Alternative way is to use the last frame's data to cull objects in the next frame. There are games that do this (for example all our previous console games). However this approach has well known problems: Visibility of the previous frame is not the same as visibility of the next frame (otherwise no new objects could ever get visible when the camera moves).
In the naive implementation, each object gets visible one frame late, and stops being visible one frame late. The latter is not a problem (one frame extra visibility doesn't cost much), but objects becoming visible one frame late is a major problem. If nothing is done to prevent this issue, sudden visibility changes (such as peeking across a corner) cause lots of visible popping. The worst case being that big level structures (such as building walls or terrain patches) disappear briefly, letting the player to see through the level (killing the illusion). One way to combat this is to enlarge object bounding spheres/boxes based on some conservative estimate. This way the object bounding area will (most likely) become visible sooner than the object, and we hide the popping. This works quite nicely for smoothly moving cameras and objects, but if something happens suddenly near the camera (wall explodes, door opens quickly, etc) the whole background pops shortly and the illusion of "being there" disappears. Because of these limitations, this technique works quite well for locked 60 fps games (minimum fps = 60). However even at 60 fps you'll sometimes see popping issues even with highly conservative bounding areas. The bigger the conservative bounding areas, the more you waste performance rendering things that are not visible.
If you want an intra-frame feedback loop, I suggest that you move all your scene data structures inside the GPU memory and do your viewport culling completely in the GPU (using compute shaders). This way you can immediately read the GPU rendered depth/occlusion buffers and perform as many iterative culling+rendering steps as you need. However, you need to be careful about how many passes you render. Reading the depth buffer in a compute shader forces the GPU to wait until the draw calls are all finished and the results being written to memory (possibly also flushing the ROP cache on some GPUs). If you do this too many times per frame, you will end up being slower than just (brute force) rendering everything.
Unfortunately I can't yet discuss how we solve the occlusion culling problem in our GPU-driven renderer, but I can forward you to NVIDIA research:
http://on-demand.gputechconf.com/gt...32-Advanced-Scenegraph-Rendering-Pipeline.pdf