1
0
mirror of https://github.com/libretro/RetroArch synced 2025-02-20 15:40:44 +00:00

Fix shader preset save.

Have to take into consideration the preset type.
This commit is contained in:
Themaister 2014-03-02 12:15:18 +01:00
parent d111a0c658
commit 4ae4d40364
3 changed files with 89 additions and 74 deletions

@ -414,6 +414,7 @@ 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);
void shader_manager_save_preset(void *data, const char *basename, bool apply);
#endif
void menu_ticker_line(char *buf, size_t len, unsigned tick, const char *str, bool selected);

@ -93,26 +93,15 @@ void rsound_ipaddress_callback(void *userdata, const char *str)
}
#endif
#ifdef HAVE_SHADER_MANAGER
void preset_filename_callback(void *userdata, const char *str)
{
rgui_handle_t *rgui = (rgui_handle_t*)userdata;
if (str && *str)
{
char filepath[PATH_MAX];
fill_pathname_join(filepath, g_settings.video.shader_dir, str, sizeof(filepath));
strlcat(filepath, ".cgp", sizeof(filepath));
config_file_t *conf = config_file_new(NULL);
if (conf)
{
gfx_shader_write_conf_cgp(conf, &rgui->shader);
config_file_write(conf, filepath);
config_file_free(conf);
}
}
shader_manager_save_preset(rgui, str && *str ? str : NULL, false);
menu_key_end_line(rgui);
}
#endif
void menu_key_event(bool down, unsigned keycode, uint32_t character, uint16_t mod)
{

@ -171,6 +171,74 @@ static enum rarch_shader_type shader_manager_get_type(const struct gfx_shader *s
return type;
}
void shader_manager_save_preset(void *data, const char *basename, bool apply)
{
rgui_handle_t *rgui = (rgui_handle_t*)data;
enum rarch_shader_type type = shader_manager_get_type(&rgui->shader);
if (type == RARCH_SHADER_NONE)
return;
const char *conf_path = NULL;
char buffer[PATH_MAX];
if (basename)
{
strlcpy(buffer, basename, sizeof(buffer));
// Append extension automatically as appropriate.
if (!strstr(basename, ".cgp") && !strstr(basename, ".glslp"))
{
if (type == RARCH_SHADER_GLSL)
strlcat(buffer, ".glslp", sizeof(buffer));
else if (type == RARCH_SHADER_CG)
strlcat(buffer, ".cgp", sizeof(buffer));
}
conf_path = buffer;
}
else
conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp;
char config_directory[PATH_MAX];
if (*g_extern.config_path)
fill_pathname_basedir(config_directory, g_extern.config_path, sizeof(config_directory));
else
*config_directory = '\0';
char cgp_path[PATH_MAX];
const char *dirs[] = {
g_settings.video.shader_dir,
g_settings.rgui_config_directory,
config_directory,
};
config_file_t *conf = config_file_new(NULL);
if (!conf)
return;
gfx_shader_write_conf_cgp(conf, &rgui->shader);
bool ret = false;
unsigned d;
for (d = 0; d < ARRAY_SIZE(dirs); d++)
{
if (!*dirs[d])
continue;
fill_pathname_join(cgp_path, dirs[d], conf_path, sizeof(cgp_path));
if (config_file_write(conf, cgp_path))
{
RARCH_LOG("Saved shader preset to %s.\n", cgp_path);
if (apply)
shader_manager_set_preset(NULL, type, cgp_path);
ret = true;
break;
}
else
RARCH_LOG("Failed writing shader preset to %s.\n", cgp_path);
}
config_file_free(conf);
if (!ret)
RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n");
}
static int shader_manager_toggle_setting(void *data, unsigned setting, unsigned action)
{
unsigned dist_shader, dist_filter, dist_scale;
@ -1585,74 +1653,31 @@ int menu_set_settings(void *data, unsigned setting, unsigned action)
#endif
break;
case RGUI_SETTINGS_SHADER_APPLY:
{
if (!driver.video || !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)
shader_manager_save_preset(rgui, NULL, true);
else
{
if (!driver.video || !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)
type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE);
if (type == RARCH_SHADER_NONE)
{
const char *conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp;
char config_directory[PATH_MAX];
if (*g_extern.config_path)
fill_pathname_basedir(config_directory, g_extern.config_path, sizeof(config_directory));
else
*config_directory = '\0';
char cgp_path[PATH_MAX];
const char *dirs[] = {
g_settings.video.shader_dir,
g_settings.rgui_config_directory,
config_directory,
};
config_file_t *conf = config_file_new(NULL);
if (!conf)
return 0;
gfx_shader_write_conf_cgp(conf, &rgui->shader);
bool ret = false;
unsigned d;
for (d = 0; d < ARRAY_SIZE(dirs); d++)
{
if (!*dirs[d])
continue;
fill_pathname_join(cgp_path, dirs[d], conf_path, sizeof(cgp_path));
if (config_file_write(conf, cgp_path))
{
RARCH_LOG("Saved shader preset to %s.\n", cgp_path);
shader_manager_set_preset(NULL, type, cgp_path);
ret = true;
break;
}
else
RARCH_LOG("Failed writing shader preset to %s.\n", cgp_path);
}
config_file_free(conf);
if (!ret)
RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n");
}
else
{
type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE);
if (type == RARCH_SHADER_NONE)
{
#if defined(HAVE_GLSL)
type = RARCH_SHADER_GLSL;
type = RARCH_SHADER_GLSL;
#elif defined(HAVE_CG) || defined(HAVE_HLSL)
type = RARCH_SHADER_CG;
type = RARCH_SHADER_CG;
#endif
}
shader_manager_set_preset(NULL, type, NULL);
}
shader_manager_set_preset(NULL, type, NULL);
}
break;
}
#endif
#ifdef _XBOX1
case RGUI_SETTINGS_FLICKER_FILTER: