diff --git a/driver.h b/driver.h index ff7228b874..328f4cea7e 100644 --- a/driver.h +++ b/driver.h @@ -151,7 +151,10 @@ enum rarch_shader_index { RARCH_SHADER_INDEX_MULTIPASS = 0, RARCH_SHADER_INDEX_PASS0 = 1, - RARCH_SHADER_INDEX_PASS1 = 2 + RARCH_SHADER_INDEX_PASS1 = 2, +#ifdef __CELLOS_LV2__ + RARCH_SHADER_INDEX_PASS2 = 3, +#endif }; typedef struct video_info diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index cfb1e2b152..d6662c2013 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -334,6 +334,12 @@ static void populate_setting_item(void *data, unsigned input) strlcpy(current_item->setting_text, fname, sizeof(current_item->setting_text)); strlcpy(current_item->comment, "INFO - Select a shader as [Shader #2].", sizeof(current_item->comment)); break; + case SETTING_SHADER_3: + fill_pathname_base(fname, g_settings.video.third_pass_shader, sizeof(fname)); + strlcpy(current_item->text, "Shader #3", sizeof(current_item->text)); + strlcpy(current_item->setting_text, fname, sizeof(current_item->setting_text)); + strlcpy(current_item->comment, "INFO - Select a shader as [Shader #3].", sizeof(current_item->comment)); + break; #endif case SETTING_EMU_SKIN: fill_pathname_base(fname, g_extern.console.menu_texture_path, sizeof(fname)); @@ -1065,6 +1071,22 @@ static int select_file(uint8_t menu_type, uint64_t input) g_extern.lifecycle_mode_state &= ~(1ULL << MODE_LOAD_SECOND_SHADER); } + + if (g_extern.lifecycle_mode_state & (1ULL << MODE_LOAD_THIRD_SHADER)) + { + strlcpy(g_settings.video.third_pass_shader, path, sizeof(g_settings.video.third_pass_shader)); + + if (g_settings.video.shader_type != RARCH_SHADER_NONE) + { + driver.video->set_shader(driver.video_data, (enum rarch_shader_type)g_settings.video.shader_type, path, RARCH_SHADER_INDEX_PASS2); + if (g_extern.lifecycle_mode_state & (1ULL << MODE_INFO_DRAW)) + msg_queue_push(g_extern.msg_queue, "INFO - Shader successfully loaded.", 1, 180); + } + else + RARCH_ERR("Shaders are unsupported on this platform.\n"); + + g_extern.lifecycle_mode_state &= ~(1ULL << MODE_LOAD_THIRD_SHADER); + } break; case PRESET_CHOICE: strlcpy(g_extern.file_state.cgp_path, path, sizeof(g_extern.file_state.cgp_path)); @@ -1516,6 +1538,26 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t RARCH_ERR("Shaders are unsupported on this platform.\n"); } break; + case SETTING_SHADER_3: + if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) + { + menu_stack_push(SHADER_CHOICE); + filebrowser_set_root_and_ext(filebrowser, EXT_SHADERS, default_paths.shader_dir); + g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_THIRD_SHADER); + } + if (input & (1ULL << RMENU_DEVICE_NAV_START)) + { + strlcpy(g_settings.video.third_pass_shader, default_paths.shader_file, sizeof(g_settings.video.third_pass_shader)); + if (g_settings.video.shader_type != RARCH_SHADER_NONE) + { + driver.video->set_shader(driver.video_data, (enum rarch_shader_type)g_settings.video.shader_type, NULL, RARCH_SHADER_INDEX_PASS2); + if (g_extern.lifecycle_mode_state & (1ULL << MODE_INFO_DRAW)) + msg_queue_push(g_extern.msg_queue, "INFO - Shader successfully loaded.", 1, 180); + } + else + RARCH_ERR("Shaders are unsupported on this platform.\n"); + } + break; case SETTING_EMU_SKIN: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { @@ -1828,6 +1870,7 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t #if defined(HAVE_CG) || defined(HAVE_HLSL) || defined(HAVE_GLSL) set_setting_action(NULL, SETTING_SHADER, 1ULL << RMENU_DEVICE_NAV_START); set_setting_action(NULL, SETTING_SHADER_2, 1ULL << RMENU_DEVICE_NAV_START); + set_setting_action(NULL, SETTING_SHADER_3, 1ULL << RMENU_DEVICE_NAV_START); #endif } break; diff --git a/frontend/menu/rmenu.h b/frontend/menu/rmenu.h index 2898b6ce7d..891a29a364 100644 --- a/frontend/menu/rmenu.h +++ b/frontend/menu/rmenu.h @@ -100,6 +100,7 @@ enum SETTING_SHADER_PRESETS, SETTING_SHADER, SETTING_SHADER_2, + SETTING_SHADER_3, #endif SETTING_FONT_SIZE, SETTING_KEEP_ASPECT_RATIO, diff --git a/general.h b/general.h index 6481daee05..40238e32c3 100644 --- a/general.h +++ b/general.h @@ -109,6 +109,7 @@ enum menu_enums MODE_LOAD_GAME_STATE_DIR_ENABLE, MODE_LOAD_FIRST_SHADER, MODE_LOAD_SECOND_SHADER, + MODE_LOAD_THIRD_SHADER, MODE_INIT, MODE_MENU, MODE_MENU_WIDESCREEN, @@ -194,6 +195,9 @@ struct settings char second_pass_shader[PATH_MAX]; bool second_pass_smooth; +#ifdef __CELLOS_LV2__ + char third_pass_shader[PATH_MAX]; +#endif char shader_dir[PATH_MAX]; char font_path[PATH_MAX]; diff --git a/gfx/shader_cg.c b/gfx/shader_cg.c index e92859fd06..a0c787dc14 100644 --- a/gfx/shader_cg.c +++ b/gfx/shader_cg.c @@ -486,6 +486,8 @@ static bool load_plain(const char *path) if (!load_stock()) return false; + cg_shader_num = 1; + if (path) { RARCH_LOG("Loading Cg file: %s\n", path); @@ -493,6 +495,7 @@ static bool load_plain(const char *path) if (!load_program(1, path, true)) return false; + if (*g_settings.video.second_pass_shader #ifndef RARCH_CONSOLE && g_settings.video.render_to_texture @@ -502,19 +505,34 @@ static bool load_plain(const char *path) if (!load_program(2, g_settings.video.second_pass_shader, true)) return false; - cg_shader_num = 2; + cg_shader_num++; } else - { prg[2] = prg[0]; - cg_shader_num = 1; + +#ifdef __CELLOS_LV2__ + if (*g_settings.video.third_pass_shader +#ifndef RARCH_CONSOLE + && g_settings.video.render_to_texture +#endif + ) + { + if (!load_program(3, g_settings.video.third_pass_shader, true)) + return false; + + cg_shader_num++; } + else + prg[3] = prg[0]; +#endif } else { RARCH_LOG("Loading stock Cg file.\n"); prg[2] = prg[1] = prg[0]; - cg_shader_num = 1; +#ifdef __CELLOS_LV2__ + prg[3] = prg[0]; +#endif } return true; @@ -823,6 +841,12 @@ static bool load_shader(const char *cgp_path, unsigned i, config_file_t *conf) strlcpy(g_settings.video.second_pass_shader, path_buf, sizeof(g_settings.video.second_pass_shader)); break; +#ifdef __CELLOS_LV2__ + case 2: + strlcpy(g_settings.video.third_pass_shader, + path_buf, sizeof(g_settings.video.third_pass_shader)); + break; +#endif } #endif @@ -1038,6 +1062,11 @@ static bool load_preset(const char *path) case 1: g_settings.video.second_pass_smooth = fbo_smooth[2] == FILTER_LINEAR; break; +#ifdef __CELLOS_LV2__ + case 2: + g_settings.video.second_pass_smooth = fbo_smooth[3] == FILTER_LINEAR; + break; +#endif } #endif } diff --git a/settings.c b/settings.c index a8b0b52fad..d017296822 100644 --- a/settings.c +++ b/settings.c @@ -254,6 +254,9 @@ void config_set_defaults(void) #if defined(HAVE_CG) || defined(HAVE_HLSL) || defined(HAVE_GLSL) strlcpy(g_settings.video.cg_shader_path, default_paths.shader_file, sizeof(g_settings.video.cg_shader_path)); strlcpy(g_settings.video.second_pass_shader, default_paths.shader_file, sizeof(g_settings.video.second_pass_shader)); +#ifdef __CELLOS_LV2__ + strlcpy(g_settings.video.third_pass_shader, default_paths.shader_file, sizeof(g_settings.video.third_pass_shader)); +#endif #endif strlcpy(g_settings.system_directory, default_paths.system_dir, sizeof(g_settings.system_directory)); @@ -456,6 +459,9 @@ bool config_load_file(const char *path) CONFIG_GET_PATH(video.cg_shader_path, "video_cg_shader"); CONFIG_GET_PATH(video.bsnes_shader_path, "video_bsnes_shader"); CONFIG_GET_PATH(video.second_pass_shader, "video_second_pass_shader"); +#ifdef __CELLOS_LV2__ + CONFIG_GET_PATH(video.third_pass_shader, "video_third_pass_shader"); +#endif CONFIG_GET_BOOL(video.render_to_texture, "video_render_to_texture"); CONFIG_GET_FLOAT(video.fbo.scale_x, "video_fbo_scale_x"); CONFIG_GET_FLOAT(video.fbo.scale_y, "video_fbo_scale_y"); @@ -1200,6 +1206,9 @@ bool config_save_file(const char *path) config_set_float(conf, "video_fbo_scale_x", g_settings.video.fbo.scale_x); config_set_float(conf, "video_fbo_scale_y", g_settings.video.fbo.scale_y); config_set_string(conf, "video_second_pass_shader", g_settings.video.second_pass_shader); +#ifdef __CELLOS_LV2__ + config_set_string(conf, "video_third_pass_shader", g_settings.video.third_pass_shader); +#endif config_set_bool(conf, "video_render_to_texture", g_settings.video.render_to_texture); config_set_bool(conf, "video_second_pass_smooth", g_settings.video.second_pass_smooth); #endif