bool ShaderProgram::upload_to(RenderContext const & context) const {

  if ( !program_ || dirty_) {
    std::list<scm::gl::shader_ptr> shaders;
    ResourceFactory factory;

    for (auto const& s : stages_) {
      auto source = factory.resolve_substitutions(s.source, substitutions_);
      shaders.push_back(context.render_device->create_shader(s.type, source));
    }
    
    if (interleaved_stream_capture_.empty()) {
      program_ = context.render_device->create_program(shaders);
    } else {
      scm::gl::interleaved_stream_capture capture_array (interleaved_stream_capture_.front());
      for (auto const& k : interleaved_stream_capture_)
        capture_array(k);

      program_ = context.render_device->create_program(
          shaders, capture_array, in_rasterization_discard_);
    }

    dirty_ = false;

    if (!program_) {
      Logger::LOG_WARNING << "Failed to create shaders!" << std::endl;
      return false;
    }
  }

  return true;
}