/** * Compiles a new shader, and creates an opengl_shader_t that will be put into the GL_shader vector * if compilation is successful. * * @param sdr Identifier defined with the program we wish to compile * @param flags Combination of SDR_* flags * @param replacement_idx The index of the shader this replaces. If -1, the newly compiled shader will be appended to the GL_shader vector * or inserted at the first available empty slot */ int opengl_compile_shader(shader_type sdr, uint flags) { GR_DEBUG_SCOPE("Creating new shader"); int sdr_index = -1; int empty_idx; opengl_shader_t new_shader; Assert(sdr < NUM_SHADER_TYPES); opengl_compile_shader_actual(sdr, flags, new_shader); opengl_shader_set_current(); // add it to our list of embedded shaders // see if we have empty shader slots empty_idx = -1; for (int i = 0; i < (int)GL_shader.size(); ++i) { if (GL_shader[i].shader == NUM_SHADER_TYPES) { empty_idx = i; break; } } // then insert it at an empty slot or at the end if ( empty_idx >= 0 ) { GL_shader[empty_idx] = std::move(new_shader); sdr_index = empty_idx; } else { sdr_index = (int)GL_shader.size(); GL_shader.push_back(std::move(new_shader)); } return sdr_index; }
void gr_opengl_recompile_all_shaders(const std::function<void(size_t, size_t)>& progress_callback) { for (auto sdr = GL_shader.begin(); sdr != GL_shader.end(); ++sdr) { if (progress_callback) progress_callback(std::distance(GL_shader.begin(), sdr), GL_shader.size()); sdr->program.reset(); opengl_compile_shader_actual(sdr->shader, sdr->flags, *sdr); } }