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; }
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; }