In the scene manager, I was thinking about adding a thread per node. It's overkill now, but it's more future proof than a more coarsely grained solution.
Each scene node would have a run() method that would listen for messages from the scene manager. The scene manager in turn would post the various render pass messages back to the nodes. Since each scene node would also be a thread, it could potentially render at any time, so you'd have to synchronize with the scene manager about which render pass each node was in. The rendering system is a serial in nature; you must render lights, then solids, then transparent, etc. In a multithreaded system you'd render all the light threads, then solid threads, etc.
One of the main problems with this solution is that some of the node lists must be sorted. They cannot be made to render in parallel if they must be sorted first. Transparent nodes have this issue. Solid nodes also have it, but according to vitek it's more of a a texture optimization and not really necessary for correct rendering. I commented out the solidnodelist.sort() in the scene managers drawAll() routine and it doesn't seem to make a difference when running the irrlicht examples, although I do have 512MB of texture ram on my machine.
Finally, their would be reentrancy issues with the graphics driver. It would have to have critical sections wrapped around the driver calls.
I dunno. What do you guys think? I could go the quick and easy route and just hardcode some extra threads into irrlicht to speed things up here and there on multicore machines, but having each node as a thread seems like such a more elegant solution.
I think another way would be to use multiple scene managers... opinions please