mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
(RMenu/RGUI) Reuse two shader settings across RGUI/RMenu
This commit is contained in:
parent
66431d1524
commit
103cf3a94e
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user