Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
bool ShaderProgram::upload_to(RenderContext const & context) const {
    if (programs_.size() <= context.id || !programs_[context.id]) {
        std::unique_lock<std::mutex> lock(upload_mutex_);
        if (programs_.size() <= context.id) {
            programs_.resize(context.id + 1);
        }

        std::list<scm::gl::shader_ptr> shaders;
        for (auto const& s : stages_) {
            shaders.push_back(
                s.is_source
                ? context.render_device->create_shader(s.type, s.source)
                : context.render_device->create_shader_from_file(s.type,
                        s.source));
        }

        if (interleaved_stream_capture_.empty()) {
            programs_[context.id] =
                context.render_device->create_program(shaders);
        } else {
            scm::gl::interleaved_stream_capture capture_array(
                interleaved_stream_capture_.front());
            auto k = interleaved_stream_capture_.begin();
            while (++k != interleaved_stream_capture_.end()) {
                capture_array(*k);
            }

            programs_[context.id] = context.render_device->create_program(
                                        shaders, capture_array, in_rasterization_discard_);
            //programs_[context.id] = context.render_device->create_program (
            //shaders, capture_array, in_rasterization_discard_ );
        }

        if (!programs_[context.id]) {
            Logger::LOG_WARNING << "Failed to create shaders!" << std::endl;

            return false;
        }

        // if (programs_[context.id]->info_log() != "")
        //   std::cout << programs_[context.id]->info_log().c_str() << std::endl;

    }

    return true;
}