+ add_postprocessor(pp, false);
+}
+
+void Pipeline::add_postprocessor(PostProcessor *pp, bool keep)
+{
+ postproc.push_back(pp);
+ if(keep)
+ postproc.back().keep();
+ try
+ {
+ create_targets(0);
+ }
+ catch(...)
+ {
+ postproc.pop_back();
+ throw;
+ }
+}
+
+void Pipeline::setup_frame(Renderer &renderer)
+{
+ for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i)
+ if(Renderable *renderable = i->get_renderable())
+ renderable->setup_frame(renderer);
+ for(vector<Slot>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
+ i->renderable->setup_frame(renderer);
+}
+
+void Pipeline::finish_frame()
+{
+ for(PassList::const_iterator i=passes.begin(); i!=passes.end(); ++i)
+ if(Renderable *renderable = i->get_renderable())
+ renderable->finish_frame();
+ for(vector<Slot>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
+ i->renderable->finish_frame();
+}