static bool gl_glsl_load_shader(unsigned index, const char *path) { pglUseProgram(0); if (gl_program[index] != gl_program[0]) { gl_glsl_delete_shader(gl_program[index]); gl_program[index] = 0; } if (path) { struct shader_program prog = {0}; unsigned progs = get_xml_shaders(path, &prog, 1); if (progs != 1) return false; if (!compile_programs(&gl_program[index], &prog, 1)) { RARCH_ERR("Failed to compile shader: %s.\n", path); return false; } find_uniforms(gl_program[index], &gl_uniforms[index]); } else { gl_program[index] = gl_program[0]; gl_uniforms[index] = gl_uniforms[0]; } pglUseProgram(gl_program[active_index]); return true; }
static void gl_glsl_deinit(void) { if (glsl_enable) { pglUseProgram(0); for (unsigned i = 0; i < GFX_MAX_SHADERS; i++) { if (gl_program[i] == 0 || (i && gl_program[i] == gl_program[0])) continue; gl_glsl_delete_shader(gl_program[i]); } if (glsl_shader) glDeleteTextures(glsl_shader->luts, gl_teximage); } memset(gl_program, 0, sizeof(gl_program)); glsl_enable = false; active_index = 0; gl_glsl_free_shader(); if (gl_state_tracker) state_tracker_free(gl_state_tracker); gl_state_tracker = NULL; gl_glsl_reset_attrib(); }
void gl_glsl_deinit(void) { if (glsl_enable) { pglUseProgram(0); for (unsigned i = 0; i <= gl_num_programs; i++) { if (gl_program[i] == 0 || (i && gl_program[i] == gl_program[0])) continue; gl_glsl_delete_shader(gl_program[i]); } glDeleteTextures(gl_teximage_cnt, gl_teximage); gl_teximage_cnt = 0; memset(gl_teximage_uniforms, 0, sizeof(gl_teximage_uniforms)); } memset(gl_program, 0, sizeof(gl_program)); glsl_enable = false; active_index = 0; gl_tracker_info_cnt = 0; memset(gl_tracker_info, 0, sizeof(gl_tracker_info)); memset(gl_tracker_script_class, 0, sizeof(gl_tracker_script_class)); free(gl_script_program); gl_script_program = NULL; if (gl_state_tracker) { state_tracker_free(gl_state_tracker); gl_state_tracker = NULL; } gl_glsl_reset_attrib(); }
static void gl_glsl_deinit(void) { glUseProgram(0); for (unsigned i = 0; i < GFX_MAX_SHADERS; i++) { if (gl_program[i] == 0 || (i && gl_program[i] == gl_program[0])) continue; gl_glsl_delete_shader(gl_program[i]); } if (glsl_shader && glsl_shader->luts) glDeleteTextures(glsl_shader->luts, gl_teximage); memset(gl_program, 0, sizeof(gl_program)); memset(gl_uniforms, 0, sizeof(gl_uniforms)); glsl_enable = false; active_index = 0; gl_glsl_free_shader(); if (gl_state_tracker) state_tracker_free(gl_state_tracker); gl_state_tracker = NULL; gl_glsl_reset_attrib(); for (unsigned i = 0; i < GFX_MAX_SHADERS; i++) { if (glsl_vbo[i].vbo_primary) glDeleteBuffers(1, &glsl_vbo[i].vbo_primary); if (glsl_vbo[i].vbo_secondary) glDeleteBuffers(1, &glsl_vbo[i].vbo_secondary); } memset(&glsl_vbo, 0, sizeof(glsl_vbo)); }