+void Program::compile_glsl_stage(unsigned stage_id)
+{
+ glCompileShader(stage_id);
+ bool compiled = get_shader_i(stage_id, GL_COMPILE_STATUS);
+
+ GLsizei info_log_len = get_shader_i(stage_id, GL_INFO_LOG_LENGTH);
+ string info_log(info_log_len+1, 0);
+ glGetShaderInfoLog(stage_id, info_log_len+1, &info_log_len, &info_log[0]);
+ info_log.erase(info_log_len);
+ if(module && module->get_format()==Module::GLSL)
+ info_log = static_cast<const GlslModule *>(module)->get_source_map().translate_errors(info_log);
+
+ if(!compiled)
+ throw compile_error(info_log);
+#ifdef DEBUG
+ if(!info_log.empty())
+ IO::print("Shader compile info log:\n%s", info_log);
+#endif
+}
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+void Program::attach_shader(Shader &shader)
+{
+ unsigned shader_id = shader.steal_id();
+ if(!shader_id)
+ throw invalid_argument("Program::attach_shader");
+ stage_ids.push_back(shader_id);
+ compile_glsl_stage(shader_id);
+}
+
+void Program::attach_shader_owned(Shader *shader)
+{
+ attach_shader(*shader);
+ delete shader;
+}
+
+void Program::detach_shader(Shader &)
+{
+}
+
+const vector<Shader *> &Program::get_attached_shaders() const
+{
+ static vector<Shader *> dummy;
+ return dummy;
+}
+