static bool gl_cg_load_stock(void *data) { if (!gl_cg_load_program(data, 0, stock_cg_gl_program, false)) { RARCH_ERR("Failed to compile passthrough shader, is something wrong with your environment?\n"); return false; } gl_cg_set_program_base_attrib(data, 0); return true; }
static void gl_cg_init_menu_shaders(void *data) { struct shader_program_info shader_prog_info; cg_shader_data_t *cg = (cg_shader_data_t*)data; if (!cg) return; #ifdef HAVE_SHADERPIPELINE shader_prog_info.combined = stock_xmb_ribbon_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_ribbon_simple; shader_prog_info.is_file = false; gl_cg_compile_program( cg, VIDEO_SHADER_MENU_2, &cg->prg[VIDEO_SHADER_MENU_2], &shader_prog_info); gl_cg_set_program_base_attrib(cg, VIDEO_SHADER_MENU_2); shader_prog_info.combined = stock_xmb_snow; shader_prog_info.is_file = false; gl_cg_compile_program( cg, VIDEO_SHADER_MENU_3, &cg->prg[VIDEO_SHADER_MENU_3], &shader_prog_info); gl_cg_set_program_base_attrib(cg, VIDEO_SHADER_MENU_3); #endif }
static bool gl_cg_load_stock(void *data) { struct shader_program_info program_info; cg_shader_data_t *cg = (cg_shader_data_t*)data; program_info.combined = stock_cg_gl_program; program_info.is_file = false; if (!gl_cg_compile_program(data, 0, &cg->prg[0], &program_info)) goto error; gl_cg_set_program_base_attrib(data, 0); return true; error: RARCH_ERR("Failed to compile passthrough shader, is something wrong with your environment?\n"); return false; }
static void gl_cg_set_program_attributes(void *data, unsigned i) { unsigned j; cg_shader_data_t *cg_data = (cg_shader_data_t*)data; if (!cg_data) return; cgGLBindProgram(cg_data->prg[i].fprg); cgGLBindProgram(cg_data->prg[i].vprg); gl_cg_set_program_base_attrib(cg_data, i); cg_data->prg[i].vid_size_f = cgGetNamedParameter (cg_data->prg[i].fprg, "IN.video_size"); cg_data->prg[i].tex_size_f = cgGetNamedParameter (cg_data->prg[i].fprg, "IN.texture_size"); cg_data->prg[i].out_size_f = cgGetNamedParameter (cg_data->prg[i].fprg, "IN.output_size"); cg_data->prg[i].frame_cnt_f = cgGetNamedParameter(cg_data->prg[i].fprg, "IN.frame_count"); cg_data->prg[i].frame_dir_f = cgGetNamedParameter(cg_data->prg[i].fprg, "IN.frame_direction"); cg_data->prg[i].vid_size_v = cgGetNamedParameter (cg_data->prg[i].vprg, "IN.video_size"); cg_data->prg[i].tex_size_v = cgGetNamedParameter (cg_data->prg[i].vprg, "IN.texture_size"); cg_data->prg[i].out_size_v = cgGetNamedParameter (cg_data->prg[i].vprg, "IN.output_size"); cg_data->prg[i].frame_cnt_v = cgGetNamedParameter(cg_data->prg[i].vprg, "IN.frame_count"); cg_data->prg[i].frame_dir_v = cgGetNamedParameter(cg_data->prg[i].vprg, "IN.frame_direction"); cg_data->prg[i].mvp = cgGetNamedParameter(cg_data->prg[i].vprg, "modelViewProj"); if (!cg_data->prg[i].mvp) cg_data->prg[i].mvp = cgGetNamedParameter(cg_data->prg[i].vprg, "IN.mvp_matrix"); cg_data->prg[i].orig.tex = cgGetNamedParameter(cg_data->prg[i].fprg, "ORIG.texture"); cg_data->prg[i].orig.vid_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, "ORIG.video_size"); cg_data->prg[i].orig.vid_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, "ORIG.video_size"); cg_data->prg[i].orig.tex_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, "ORIG.texture_size"); cg_data->prg[i].orig.tex_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, "ORIG.texture_size"); cg_data->prg[i].orig.coord = cgGetNamedParameter(cg_data->prg[i].vprg, "ORIG.tex_coord"); cg_data->prg[i].feedback.tex = cgGetNamedParameter(cg_data->prg[i].fprg, "FEEDBACK.texture"); cg_data->prg[i].feedback.vid_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, "FEEDBACK.video_size"); cg_data->prg[i].feedback.vid_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, "FEEDBACK.video_size"); cg_data->prg[i].feedback.tex_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, "FEEDBACK.texture_size"); cg_data->prg[i].feedback.tex_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, "FEEDBACK.texture_size"); cg_data->prg[i].feedback.coord = cgGetNamedParameter(cg_data->prg[i].vprg, "FEEDBACK.tex_coord"); if (i > 1) { char pass_str[64] = {0}; snprintf(pass_str, sizeof(pass_str), "PASSPREV%u", i); gl_cg_set_pass_attrib(&cg_data->prg[i], &cg_data->prg[i].orig, pass_str); } for (j = 0; j < PREV_TEXTURES; j++) { char attr_buf_tex[64] = {0}; char attr_buf_vid_size[64] = {0}; char attr_buf_tex_size[64] = {0}; char attr_buf_coord[64] = {0}; static const char *prev_names[PREV_TEXTURES] = { "PREV", "PREV1", "PREV2", "PREV3", "PREV4", "PREV5", "PREV6", }; snprintf(attr_buf_tex, sizeof(attr_buf_tex), "%s.texture", prev_names[j]); snprintf(attr_buf_vid_size, sizeof(attr_buf_vid_size), "%s.video_size", prev_names[j]); snprintf(attr_buf_tex_size, sizeof(attr_buf_tex_size), "%s.texture_size", prev_names[j]); snprintf(attr_buf_coord, sizeof(attr_buf_coord), "%s.tex_coord", prev_names[j]); cg_data->prg[i].prev[j].tex = cgGetNamedParameter(cg_data->prg[i].fprg, attr_buf_tex); cg_data->prg[i].prev[j].vid_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, attr_buf_vid_size); cg_data->prg[i].prev[j].vid_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, attr_buf_vid_size); cg_data->prg[i].prev[j].tex_size_v = cgGetNamedParameter(cg_data->prg[i].vprg, attr_buf_tex_size); cg_data->prg[i].prev[j].tex_size_f = cgGetNamedParameter(cg_data->prg[i].fprg, attr_buf_tex_size); cg_data->prg[i].prev[j].coord = cgGetNamedParameter(cg_data->prg[i].vprg, attr_buf_coord); } for (j = 0; j + 1 < i; j++) { char pass_str[64] = {0}; snprintf(pass_str, sizeof(pass_str), "PASS%u", j + 1); gl_cg_set_pass_attrib(&cg_data->prg[i], &cg_data->prg[i].fbo[j], pass_str); snprintf(pass_str, sizeof(pass_str), "PASSPREV%u", i - (j + 1)); gl_cg_set_pass_attrib(&cg_data->prg[i], &cg_data->prg[i].fbo[j], pass_str); if (*cg_data->shader->pass[j].alias) gl_cg_set_pass_attrib(&cg_data->prg[i], &cg_data->prg[i].fbo[j], cg_data->shader->pass[j].alias); } }
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; }