/* Full deinit. */ static void gl_cg_deinit(void) { cg_shader_data_t *cg = (cg_shader_data_t*)driver.video_shader_data; if (!cg) return; gl_cg_destroy_resources(cg); gl_cg_deinit_context_state(cg); }
/* Full deinit. */ static void gl_cg_deinit(void *data) { cg_shader_data_t *cg_data = (cg_shader_data_t*)data; if (!cg_data) return; gl_cg_destroy_resources(cg_data); gl_cg_deinit_context_state(cg_data); free(cg_data); }
/* Full deinit. */ static void gl_cg_deinit(void) { driver_t *driver = driver_get_ptr(); cg_shader_data_t *cg = (cg_shader_data_t*)driver->video_shader_data; if (!cg) return; gl_cg_destroy_resources(cg); gl_cg_deinit_context_state(cg); }
static void *gl_cg_init(void *data, const char *path) { unsigned i; cg_shader_data_t *cg_data = (cg_shader_data_t*) calloc(1, sizeof(cg_shader_data_t)); if (!cg_data) return NULL; #ifdef HAVE_CG_RUNTIME_COMPILER cgRTCgcInit(); #endif cg_data->cgCtx = cgCreateContext(); if (!cg_data->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_data->cgFProf = cgGLGetLatestProfile(CG_GL_FRAGMENT); cg_data->cgVProf = cgGLGetLatestProfile(CG_GL_VERTEX); if ( cg_data->cgFProf == CG_PROFILE_UNKNOWN || cg_data->cgVProf == CG_PROFILE_UNKNOWN) { RARCH_ERR("Invalid profile type\n"); free(cg_data); cg_data = NULL; goto error; } RARCH_LOG("[Cg]: Vertex profile: %s\n", cgGetProfileString(cg_data->cgVProf)); RARCH_LOG("[Cg]: Fragment profile: %s\n", cgGetProfileString(cg_data->cgFProf)); cgGLSetOptimalOptions(cg_data->cgFProf); cgGLSetOptimalOptions(cg_data->cgVProf); cgGLEnableProfile(cg_data->cgFProf); cgGLEnableProfile(cg_data->cgVProf); memset(cg_data->cg_alias_define, 0, sizeof(cg_data->cg_alias_define)); if (path && string_is_equal(path_get_extension(path), "cgp")) { if (!gl_cg_load_preset(cg_data, path)) goto error; } else { if (!gl_cg_load_plain(cg_data, path)) goto error; } cg_data->prg[0].mvp = cgGetNamedParameter(cg_data->prg[0].vprg, "IN.mvp_matrix"); for (i = 1; i <= cg_data->shader->passes; i++) gl_cg_set_program_attributes(cg_data, 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_data->prg[cg_data->shader->passes + 1] = cg_data->prg[0]; /* No need to apply Android hack in Cg. */ cg_data->prg[GL_SHADER_STOCK_BLEND] = cg_data->prg[0]; cgGLBindProgram(cg_data->prg[1].fprg); cgGLBindProgram(cg_data->prg[1].vprg); return cg_data; error: gl_cg_destroy_resources(cg_data); if (!cg_data) free(cg_data); return NULL; }