static void gl_cg_destroy_resources(void *data) { cg_shader_data_t *cg_data = (cg_shader_data_t*)data; if (!cg_data) return; gl_cg_reset_attrib(data); gl_cg_deinit_progs(data); if (cg_data->shader && cg_data->shader->luts) { glDeleteTextures(cg_data->shader->luts, cg_data->lut_textures); memset(cg_data->lut_textures, 0, sizeof(cg_data->lut_textures)); } if (cg_data->state_tracker) { state_tracker_free(cg_data->state_tracker); cg_data->state_tracker = NULL; } free(cg_data->shader); cg_data->shader = NULL; }
static void gl_cg_use(unsigned index) { if (cg_active && prg[index].vprg && prg[index].fprg) { gl_cg_reset_attrib(); active_index = index; cgGLBindProgram(prg[index].vprg); cgGLBindProgram(prg[index].fprg); } }
static void gl_cg_use(void *data, void *shader_data, unsigned idx) { cg_shader_data_t *cg_data = (cg_shader_data_t*)shader_data; if (cg_data && cg_data->prg[idx].vprg && cg_data->prg[idx].fprg) { gl_cg_reset_attrib(cg_data); cg_data->active_idx = idx; cgGLBindProgram(cg_data->prg[idx].vprg); cgGLBindProgram(cg_data->prg[idx].fprg); } }
static void gl_cg_use(void *data, void *shader_data, unsigned idx, bool set_active) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; if (cg && cg->prg[idx].vprg && cg->prg[idx].fprg) { if (set_active) { gl_cg_reset_attrib(cg); cg->active_idx = idx; } gl_cg_set_shaders(cg->prg[idx].fprg, cg->prg[idx].vprg); } }
static void gl_cg_use(void *data, unsigned idx) { cg_shader_data_t *cg = (cg_shader_data_t*)driver.video_shader_data; (void)data; if (cg && cg->prg[idx].vprg && cg->prg[idx].fprg) { gl_cg_reset_attrib(cg); cg->active_idx = idx; cgGLBindProgram(cg->prg[idx].vprg); cgGLBindProgram(cg->prg[idx].fprg); } }
static void gl_cg_deinit_state(void) { gl_cg_reset_attrib(); cg_active = false; gl_cg_deinit_progs(); if (cg_shader && cg_shader->luts) { glDeleteTextures(cg_shader->luts, lut_textures); memset(lut_textures, 0, sizeof(lut_textures)); } if (state_tracker) { state_tracker_free(state_tracker); state_tracker = NULL; } free(cg_shader); cg_shader = NULL; }
static void *gl_cg_init(void *data, const char *path) { unsigned i; struct shader_program_info shader_prog_info; cg_shader_data_t *cg = (cg_shader_data_t*) calloc(1, sizeof(cg_shader_data_t)); if (!cg) return NULL; #ifdef HAVE_CG_RUNTIME_COMPILER cgRTCgcInit(); #endif cg->cgCtx = cgCreateContext(); if (!cg->cgCtx) { RARCH_ERR("Failed to create Cg context.\n"); goto error; } #ifdef RARCH_CG_DEBUG cgGLSetDebugMode(CG_TRUE); cgSetErrorHandler(cg_error_handler, NULL); #endif cg->cgFProf = cgGLGetLatestProfile(CG_GL_FRAGMENT); cg->cgVProf = cgGLGetLatestProfile(CG_GL_VERTEX); if ( cg->cgFProf == CG_PROFILE_UNKNOWN || cg->cgVProf == CG_PROFILE_UNKNOWN) { RARCH_ERR("Invalid profile type\n"); goto error; } RARCH_LOG("[Cg]: Vertex profile: %s\n", cgGetProfileString(cg->cgVProf)); RARCH_LOG("[Cg]: Fragment profile: %s\n", cgGetProfileString(cg->cgFProf)); cgGLSetOptimalOptions(cg->cgFProf); cgGLSetOptimalOptions(cg->cgVProf); cgGLEnableProfile(cg->cgFProf); cgGLEnableProfile(cg->cgVProf); memset(cg->alias_define, 0, sizeof(cg->alias_define)); if (path && string_is_equal(path_get_extension(path), "cgp")) { if (!gl_cg_load_preset(cg, path)) goto error; } else { if (!gl_cg_load_plain(cg, path)) goto error; } cg->prg[0].mvp = cgGetNamedParameter(cg->prg[0].vprg, "IN.mvp_matrix"); for (i = 1; i <= cg->shader->passes; i++) gl_cg_set_program_attributes(cg, i); /* If we aren't using last pass non-FBO shader, * this shader will be assumed to be "fixed-function". * * Just use prg[0] for that pass, which will be * pass-through. */ cg->prg[cg->shader->passes + 1] = cg->prg[0]; /* No need to apply Android hack in Cg. */ cg->prg[VIDEO_SHADER_STOCK_BLEND] = cg->prg[0]; gl_cg_set_shaders(cg->prg[1].fprg, cg->prg[1].vprg); shader_prog_info.combined = stock_xmb_simple; shader_prog_info.is_file = false; gl_cg_compile_program( cg, VIDEO_SHADER_MENU, &cg->prg[VIDEO_SHADER_MENU], &shader_prog_info); gl_cg_set_program_base_attrib(cg, VIDEO_SHADER_MENU); shader_prog_info.combined = stock_xmb_simple; shader_prog_info.is_file = false; gl_cg_compile_program( cg, VIDEO_SHADER_MENU_SEC, &cg->prg[VIDEO_SHADER_MENU_SEC], &shader_prog_info); gl_cg_set_program_base_attrib(cg, VIDEO_SHADER_MENU_SEC); gl_cg_reset_attrib(cg); return cg; error: gl_cg_destroy_resources(cg); if (!cg) free(cg); return NULL; }