void gl_program::create_program() { vector<string> uniforms; program_id = glCreateProgram(); GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER); GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER); string vertex_shader = generate_vertex_shader(uniforms); string fragment_shader = generate_fragment_shader(uniforms); debug_flags(PRINT_SHADERS, "---------- Vertex Shader ----------\n%s\n", vertex_shader.c_str()); debug_flags(PRINT_SHADERS, "---------- Fragment Shader ----------\n%s\n", fragment_shader.c_str()); const char* _vertex_shader = vertex_shader.c_str(); const char* _fragment_shader = fragment_shader.c_str(); glShaderSource(fragment_id, 1, &(_fragment_shader), NULL); glCompileShader(fragment_id); glShaderSource(vertex_id, 1, &(_vertex_shader), NULL); glCompileShader(vertex_id); check_shader(fragment_id); check_shader(vertex_id); //Link all the things glAttachShader(program_id, fragment_id); glAttachShader(program_id, vertex_id); glLinkProgram(program_id); CHECK_GL_ERROR("Linking Program"); //Use the program glUseProgram(program_id); CHECK_GL_ERROR("Use Program"); //Add the IDs to array so they get deleted in cleanup shader_ids.push_back(fragment_id); shader_ids.push_back(vertex_id); for (const string & cur : uniforms) { GLuint uniform_loc = glGetUniformLocation(program_id, cur.c_str()); uniform_locations.insert(make_pair(cur, uniform_loc)); CHECK_GL_ERROR("Getting Uniform Location for " + cur); } }
void AP_Scheduler::update_logging() { if (debug_flags()) { perf_info.update_logging(); } if (_log_performance_bit != (uint32_t)-1 && DataFlash_Class::instance()->should_log(_log_performance_bit)) { Log_Write_Performance(); } perf_info.set_loop_rate(get_loop_rate_hz()); perf_info.reset(); }