fragment program & switching pbuffer context

I have a single fragment shader that must write in the same frame, with an if on uniform bool variable, a different color on two different p-buffers.

I would want to write something like this in particular i would want to bind the shader program and the drawing context only once in the init function:

 
 
Pbuffer p1;
Pbuffer p2;

GLhandleARB prog;

SetUniform(prog,string,val)
{
  GLint hvar;
  if ((hvar = glGetUniformLocationARB(prog,var.c_str())) == -1)
  {
    //ERROR HANDLING
  }
  glUniform1fARB(hvar,val);
}

init()
{
  p1.makeActiveRenderSurface();
  glUseProgramObjectARB(prog);
  p2.makeActiveRenderSurface();
  glUseProgramObjectARB(prog);
};

display()
{
  p1.makeActiveRenderSurface();
  SetUniform(prog,"UseFirstBuffer",true);
  //display something
  p2.makeActiveRenderSurface();
  SetUniform(prog,"UseFirstBuffer",false);
  if ( (er = glGetError()) != 0) 
    Utility::ReportError(er);
  //display something other
}

main()
{
   init()
   glutDisplayFunc(display);
   glutMainLoop()
}

…but if I do this the second invocation at SetUniform give me a glGetError and the applicantion’s output is linked at the standard OpenGL pipeline and not at my fragment shader…

Otherwise if I bind the context and the fragment program at every display’s calling all seems good

display()
{
  p1.makeActiveRenderSurface();
  glUseProgramObjectARB(prog);
  SetUniform(prog,"UseFirstBuffer",true);
  // display something
  p2.makeActiveRenderSurface();
  glUseProgramObjectARB(prog);
  SetUniform(prog,"UseFirstBuffer",false);
  if ( (er = glGetError()) != 0) 	Utility::ReportError(er);
  //display something other
}

WHY??? And how much may it cost to me in terms of FPS???