Still, worrying about the overhead of calling "renderer.update()" is kinda silly. I mean, how many calls of those are you even going to issue per frame? One? A dozen at most? I don't think you could even measure that kind of overhead properly.
In any case, making "pass(objects)" a method of the render manager sounds like a bad idea to me. You'll end up with a bunch of specialized methods like OGLManager->ShadowPass(objects), D3DManager->ShadowPass(objects), OGLManager->GeometryPass(objects) and so on.
IMO the pass itself should be an object, not a method. You got your render manager, it has a list of passes to run. So it iterates over each pass, executing the "render" method of each of them Pass knows what state to setup, what shaders to run, and the way you can handle the "object" list to draw can vary (make it part of the pass object, make it external managed by the render manager, etc).
Maybe that way the render manager doesn't even needs to be API specific, just the pass objects themselves.
Thats the bucketing way of drawing things. You essentially got buckets of objects that go into particular passes for drawing. Another popular way of drawing is using keys to sort and draw, each key has the state it needs to be executed packed in it. And there are probably combinations of both principles (bucketing and render-key based sorting).