diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index cdcd79b686..42b5299af0 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -94,6 +94,41 @@ void shader_manager_init(rgui_handle_t *rgui) } } +void shader_manager_set_preset(struct gfx_shader *shader, enum rarch_shader_type type, const char *path) +{ + RARCH_LOG("Setting RGUI shader: %s.\n", path ? path : "N/A (stock)"); + bool ret = video_set_shader_func(type, path); + if (ret) + { + // Makes sure that we use RGUI CGP shader on driver reinit. + // Only do this when the cgp actually works to avoid potential errors. + strlcpy(g_settings.video.shader_path, path ? path : "", + sizeof(g_settings.video.shader_path)); + g_settings.video.shader_enable = true; + + if (path && shader) + { + // Load stored CGP into RGUI menu on success. + // Used when a preset is directly loaded. + // No point in updating when the CGP was created from RGUI itself. + config_file_t *conf = config_file_new(path); + if (conf) + { + gfx_shader_read_conf_cgp(conf, shader); + gfx_shader_resolve_relative(shader, path); + config_file_free(conf); + } + + rgui->need_refresh = true; + } + } + else + { + RARCH_ERR("Setting RGUI CGP failed.\n"); + g_settings.video.shader_enable = false; + } +} + void shader_manager_get_str(struct gfx_shader *shader, char *type_str, size_t type_str_size, unsigned type) { diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 9174b82fbd..53a3d495d8 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -251,6 +251,8 @@ int rgui_input_postprocess(void *data, uint64_t old_state); void shader_manager_init(rgui_handle_t *rgui); void shader_manager_get_str(struct gfx_shader *shader, char *type_str, size_t type_str_size, unsigned type); +void shader_manager_set_preset(struct gfx_shader *shader, + enum rarch_shader_type type, const char *path); #endif void menu_ticker_line(char *buf, size_t len, unsigned tick, const char *str, bool selected); diff --git a/frontend/menu/menu_settings.c b/frontend/menu/menu_settings.c index 4226434aaf..0f1d61bab6 100644 --- a/frontend/menu/menu_settings.c +++ b/frontend/menu/menu_settings.c @@ -17,6 +17,7 @@ #include #include +#include "../../file.h" #include "menu_common.h" #ifdef GEKKO @@ -44,6 +45,36 @@ const unsigned rgui_controller_lut[] = { RETRO_DEVICE_ID_JOYPAD_R3, }; +#ifdef HAVE_SHADER_MANAGER +static enum rarch_shader_type shader_manager_get_type(const struct gfx_shader *shader) +{ + // All shader types must be the same, or we cannot use it. + enum rarch_shader_type type = RARCH_SHADER_NONE; + + for (unsigned i = 0; i < shader->passes; i++) + { + enum rarch_shader_type pass_type = gfx_shader_parse_type(shader->pass[i].source.cg, + RARCH_SHADER_NONE); + + switch (pass_type) + { + case RARCH_SHADER_CG: + case RARCH_SHADER_GLSL: + if (type == RARCH_SHADER_NONE) + type = pass_type; + else if (type != pass_type) + return RARCH_SHADER_NONE; + break; + + default: + return RARCH_SHADER_NONE; + } + } + + return type; +} +#endif + int menu_set_settings(unsigned setting, unsigned action) { unsigned port = rgui->current_pad; @@ -837,6 +868,73 @@ int menu_set_settings(unsigned setting, unsigned action) break; } break; + case RGUI_SETTINGS_SHADER_PASSES: + switch (action) + { + case RGUI_ACTION_START: + rgui->shader.passes = 0; + break; + + case RGUI_ACTION_LEFT: + if (rgui->shader.passes) + rgui->shader.passes--; + break; + + case RGUI_ACTION_RIGHT: + case RGUI_ACTION_OK: + if (rgui->shader.passes < RGUI_MAX_SHADERS) + rgui->shader.passes++; + break; + + default: + break; + } + +#ifndef HAVE_RMENU + rgui->need_refresh = true; +#endif + break; + case RGUI_SETTINGS_SHADER_APPLY: + { + if (!driver.video->set_shader || action != RGUI_ACTION_OK) + return 0; + + RARCH_LOG("Applying shader ...\n"); + + enum rarch_shader_type type = shader_manager_get_type(&rgui->shader); + + if (rgui->shader.passes && type != RARCH_SHADER_NONE) + { + const char *conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp; + + char cgp_path[PATH_MAX]; + const char *shader_dir = *g_settings.video.shader_dir ? + g_settings.video.shader_dir : g_settings.system_directory; + fill_pathname_join(cgp_path, shader_dir, conf_path, sizeof(cgp_path)); + config_file_t *conf = config_file_new(NULL); + if (!conf) + return 0; + gfx_shader_write_conf_cgp(conf, &rgui->shader); + config_file_write(conf, cgp_path); + config_file_free(conf); + + shader_manager_set_preset(NULL, type, cgp_path); + } + else + { + type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE); + if (type == RARCH_SHADER_NONE) + { +#if defined(HAVE_GLSL) + type = RARCH_SHADER_GLSL; +#elif defined(HAVE_CG) || defined(HAVE_HLSL) + type = RARCH_SHADER_CG; +#endif + } + shader_manager_set_preset(NULL, type, NULL); + } + } + break; default: break; } diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index ca7e783523..06fbafafd5 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -413,69 +413,6 @@ static void rgui_settings_shader_manager_populate_entries(rgui_handle_t *rgui) } } -static enum rarch_shader_type shader_manager_get_type(const struct gfx_shader *shader) -{ - // All shader types must be the same, or we cannot use it. - enum rarch_shader_type type = RARCH_SHADER_NONE; - - for (unsigned i = 0; i < shader->passes; i++) - { - enum rarch_shader_type pass_type = gfx_shader_parse_type(shader->pass[i].source.cg, - RARCH_SHADER_NONE); - - switch (pass_type) - { - case RARCH_SHADER_CG: - case RARCH_SHADER_GLSL: - if (type == RARCH_SHADER_NONE) - type = pass_type; - else if (type != pass_type) - return RARCH_SHADER_NONE; - break; - - default: - return RARCH_SHADER_NONE; - } - } - - return type; -} - -static void shader_manager_set_preset(struct gfx_shader *shader, enum rarch_shader_type type, const char *path) -{ - RARCH_LOG("Setting RGUI shader: %s.\n", path ? path : "N/A (stock)"); - bool ret = video_set_shader_func(type, path); - if (ret) - { - // Makes sure that we use RGUI CGP shader on driver reinit. - // Only do this when the cgp actually works to avoid potential errors. - strlcpy(g_settings.video.shader_path, path ? path : "", - sizeof(g_settings.video.shader_path)); - g_settings.video.shader_enable = true; - - if (path && shader) - { - // Load stored CGP into RGUI menu on success. - // Used when a preset is directly loaded. - // No point in updating when the CGP was created from RGUI itself. - config_file_t *conf = config_file_new(path); - if (conf) - { - gfx_shader_read_conf_cgp(conf, shader); - gfx_shader_resolve_relative(shader, path); - config_file_free(conf); - } - - rgui->need_refresh = true; - } - } - else - { - RARCH_ERR("Setting RGUI CGP failed.\n"); - g_settings.video.shader_enable = false; - } -} - static int shader_manager_toggle_setting(rgui_handle_t *rgui, unsigned setting, rgui_action_t action) { unsigned dist_shader = setting - RGUI_SETTINGS_SHADER_0; @@ -500,71 +437,8 @@ static int shader_manager_toggle_setting(rgui_handle_t *rgui, unsigned setting, break; } } - else if (setting == RGUI_SETTINGS_SHADER_APPLY) - { - if (!driver.video->set_shader || action != RGUI_ACTION_OK) - return 0; - - RARCH_LOG("Applying shader ...\n"); - - enum rarch_shader_type type = shader_manager_get_type(&rgui->shader); - - if (rgui->shader.passes && type != RARCH_SHADER_NONE) - { - const char *conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp; - - char cgp_path[PATH_MAX]; - const char *shader_dir = *g_settings.video.shader_dir ? - g_settings.video.shader_dir : g_settings.system_directory; - fill_pathname_join(cgp_path, shader_dir, conf_path, sizeof(cgp_path)); - config_file_t *conf = config_file_new(NULL); - if (!conf) - return 0; - gfx_shader_write_conf_cgp(conf, &rgui->shader); - config_file_write(conf, cgp_path); - config_file_free(conf); - - shader_manager_set_preset(NULL, type, cgp_path); - } - else - { - type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE); - if (type == RARCH_SHADER_NONE) - { -#if defined(HAVE_GLSL) - type = RARCH_SHADER_GLSL; -#elif defined(HAVE_CG) || defined(HAVE_HLSL) - type = RARCH_SHADER_CG; -#endif - } - shader_manager_set_preset(NULL, type, NULL); - } - } - else if (setting == RGUI_SETTINGS_SHADER_PASSES) - { - switch (action) - { - case RGUI_ACTION_START: - rgui->shader.passes = 0; - break; - - case RGUI_ACTION_LEFT: - if (rgui->shader.passes) - rgui->shader.passes--; - break; - - case RGUI_ACTION_RIGHT: - case RGUI_ACTION_OK: - if (rgui->shader.passes < RGUI_MAX_SHADERS) - rgui->shader.passes++; - break; - - default: - break; - } - - rgui->need_refresh = true; - } + else if (setting == RGUI_SETTINGS_SHADER_APPLY || setting == RGUI_SETTINGS_SHADER_PASSES) + return menu_set_settings(setting, action); else if ((dist_shader % 3) == 0 || setting == RGUI_SETTINGS_SHADER_PRESET) { dist_shader /= 3; diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index 9b1bdd9c8e..a545401e7e 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -1331,22 +1331,7 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t #endif break; case SHADERMAN_SHADER_PASSES: - switch (action) - { - case RGUI_ACTION_LEFT: - if (rgui->shader.passes) - rgui->shader.passes--; - break; - case RGUI_ACTION_RIGHT: - case RGUI_ACTION_OK: - if (rgui->shader.passes < RGUI_MAX_SHADERS) - rgui->shader.passes++; - break; - case RGUI_ACTION_START: - rgui->shader.passes= 0; - break; - } - break; + return menu_set_settings(RGUI_SETTINGS_SHADER_PASSES, action); case SHADERMAN_SHADER_0: case SHADERMAN_SHADER_1: case SHADERMAN_SHADER_2: @@ -1438,45 +1423,10 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t } break; case SHADERMAN_APPLY_CHANGES: - switch (action) - { - case RGUI_ACTION_LEFT: - case RGUI_ACTION_RIGHT: - case RGUI_ACTION_OK: - case RGUI_ACTION_START: - { - bool ret = false; - char cgp_path[PATH_MAX]; - - if (rgui->shader.passes) - { - const char *shader_dir = *g_settings.video.shader_dir ? - g_settings.video.shader_dir : g_settings.system_directory; - fill_pathname_join(cgp_path, shader_dir, "rgui.cgp", sizeof(cgp_path)); - config_file_t *conf = config_file_new(NULL); - if (!conf) - return 0; - gfx_shader_write_conf_cgp(conf, &rgui->shader); - config_file_write(conf, cgp_path); - config_file_free(conf); - } - else - cgp_path[0] = '\0'; - - ret = video_set_shader_func(RARCH_SHADER_CG, (cgp_path[0] != '\0') ? cgp_path : NULL); - - if (ret) - g_settings.video.shader_enable = true; - else - { - RARCH_ERR("Setting RGUI CGP failed.\n"); - g_settings.video.shader_enable = false; - } - } - break; - } - break; + return menu_set_settings(RGUI_SETTINGS_SHADER_APPLY, action); #endif + default: + break; } return 0;