(Menu) Convert rgui->shader into void* too

This commit is contained in:
twinaphex 2014-05-31 21:08:32 +02:00
parent 8f8f757d65
commit ecb21743f8
6 changed files with 106 additions and 60 deletions

View File

@ -47,6 +47,7 @@
static inline struct gfx_shader *shader_manager_get_current_shader(void *data, unsigned type) static inline struct gfx_shader *shader_manager_get_current_shader(void *data, unsigned type)
{ {
rgui_handle_t *rgui = (rgui_handle_t*)data; rgui_handle_t *rgui = (rgui_handle_t*)data;
struct gfx_shader *shader = NULL;
if (!rgui) if (!rgui)
{ {
@ -54,7 +55,9 @@ static inline struct gfx_shader *shader_manager_get_current_shader(void *data, u
return NULL; return NULL;
} }
struct gfx_shader *shader = type == RGUI_SETTINGS_SHADER_PRESET_PARAMETERS ? &rgui->shader : NULL; if (type == RGUI_SETTINGS_SHADER_PRESET_PARAMETERS)
shader = (struct gfx_shader *)rgui->shader;
if (!shader && driver.video_poke && driver.video_data && driver.video_poke->get_current_shader) if (!shader && driver.video_poke && driver.video_data && driver.video_poke->get_current_shader)
shader = driver.video_poke->get_current_shader(driver.video_data); shader = driver.video_poke->get_current_shader(driver.video_data);
@ -79,7 +82,7 @@ static void menu_common_entries_init(void *data, unsigned menu_type)
{ {
file_list_clear(rgui->selection_buf); file_list_clear(rgui->selection_buf);
struct gfx_shader *shader = shader_manager_get_current_shader(rgui, menu_type); struct gfx_shader *shader = (struct gfx_shader*)shader_manager_get_current_shader(rgui, menu_type);
if (shader) if (shader)
for (i = 0; i < shader->num_parameters; i++) for (i = 0; i < shader->num_parameters; i++)
file_list_push(rgui->selection_buf, shader->parameters[i].desc, RGUI_SETTINGS_SHADER_PARAMETER_0 + i, 0); file_list_push(rgui->selection_buf, shader->parameters[i].desc, RGUI_SETTINGS_SHADER_PARAMETER_0 + i, 0);
@ -87,6 +90,12 @@ static void menu_common_entries_init(void *data, unsigned menu_type)
break; break;
} }
case RGUI_SETTINGS_SHADER_OPTIONS: case RGUI_SETTINGS_SHADER_OPTIONS:
{
struct gfx_shader *shader = (struct gfx_shader*)rgui->shader;
if (!shader)
return;
file_list_clear(rgui->selection_buf); file_list_clear(rgui->selection_buf);
file_list_push(rgui->selection_buf, "Apply Shader Changes", file_list_push(rgui->selection_buf, "Apply Shader Changes",
RGUI_SETTINGS_SHADER_APPLY, 0); RGUI_SETTINGS_SHADER_APPLY, 0);
@ -102,7 +111,7 @@ static void menu_common_entries_init(void *data, unsigned menu_type)
file_list_push(rgui->selection_buf, "Shader Passes", file_list_push(rgui->selection_buf, "Shader Passes",
RGUI_SETTINGS_SHADER_PASSES, 0); RGUI_SETTINGS_SHADER_PASSES, 0);
for (i = 0; i < rgui->shader.passes; i++) for (i = 0; i < shader->passes; i++)
{ {
char buf[64]; char buf[64];
@ -118,7 +127,8 @@ static void menu_common_entries_init(void *data, unsigned menu_type)
file_list_push(rgui->selection_buf, buf, file_list_push(rgui->selection_buf, buf,
RGUI_SETTINGS_SHADER_0_SCALE + 3 * i, 0); RGUI_SETTINGS_SHADER_0_SCALE + 3 * i, 0);
} }
break; }
break;
#endif #endif
case RGUI_SETTINGS_GENERAL_OPTIONS: case RGUI_SETTINGS_GENERAL_OPTIONS:
file_list_clear(rgui->selection_buf); file_list_clear(rgui->selection_buf);
@ -2053,17 +2063,19 @@ static int menu_common_iterate(unsigned action)
char shader_path[PATH_MAX]; char shader_path[PATH_MAX];
fill_pathname_join(shader_path, dir, path, sizeof(shader_path)); fill_pathname_join(shader_path, dir, path, sizeof(shader_path));
if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_set_preset) if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_set_preset)
driver.menu_ctx->backend->shader_manager_set_preset(&rgui->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE), driver.menu_ctx->backend->shader_manager_set_preset(rgui->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE),
shader_path); shader_path);
} }
else else
{ {
struct gfx_shader *shader = (struct gfx_shader*)rgui->shader;
unsigned pass = (menu_type - RGUI_SETTINGS_SHADER_0) / 3; unsigned pass = (menu_type - RGUI_SETTINGS_SHADER_0) / 3;
fill_pathname_join(rgui->shader.pass[pass].source.path,
dir, path, sizeof(rgui->shader.pass[pass].source.path)); fill_pathname_join(shader->pass[pass].source.path,
dir, path, sizeof(shader->pass[pass].source.path));
// This will reset any changed parameters. // This will reset any changed parameters.
gfx_shader_resolve_parameters(NULL, &rgui->shader); gfx_shader_resolve_parameters(NULL, rgui->shader);
} }
// Pop stack until we hit shader manager again. // Pop stack until we hit shader manager again.
@ -2340,7 +2352,6 @@ static void menu_common_shader_manager_init(void *data)
return; return;
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
memset(&rgui->shader, 0, sizeof(rgui->shader));
config_file_t *conf = NULL; config_file_t *conf = NULL;
const char *config_path = NULL; const char *config_path = NULL;
@ -2373,19 +2384,21 @@ static void menu_common_shader_manager_init(void *data)
conf = config_file_new(g_settings.video.shader_path); conf = config_file_new(g_settings.video.shader_path);
if (conf) if (conf)
{ {
if (gfx_shader_read_conf_cgp(conf, &rgui->shader)) if (gfx_shader_read_conf_cgp(conf, rgui->shader))
{ {
gfx_shader_resolve_relative(&rgui->shader, g_settings.video.shader_path); gfx_shader_resolve_relative(rgui->shader, g_settings.video.shader_path);
gfx_shader_resolve_parameters(conf, &rgui->shader); gfx_shader_resolve_parameters(conf, rgui->shader);
} }
config_file_free(conf); config_file_free(conf);
} }
} }
else if (strcmp(ext, "glsl") == 0 || strcmp(ext, "cg") == 0) else if (strcmp(ext, "glsl") == 0 || strcmp(ext, "cg") == 0)
{ {
strlcpy(rgui->shader.pass[0].source.path, g_settings.video.shader_path, struct gfx_shader *shader = (struct gfx_shader*)rgui->shader;
sizeof(rgui->shader.pass[0].source.path));
rgui->shader.passes = 1; strlcpy(shader->pass[0].source.path, g_settings.video.shader_path,
sizeof(shader->pass[0].source.path));
shader->passes = 1;
} }
else else
{ {
@ -2403,10 +2416,10 @@ static void menu_common_shader_manager_init(void *data)
if (conf) if (conf)
{ {
if (gfx_shader_read_conf_cgp(conf, &rgui->shader)) if (gfx_shader_read_conf_cgp(conf, rgui->shader))
{ {
gfx_shader_resolve_relative(&rgui->shader, cgp_path); gfx_shader_resolve_relative(rgui->shader, cgp_path);
gfx_shader_resolve_parameters(conf, &rgui->shader); gfx_shader_resolve_parameters(conf, rgui->shader);
} }
config_file_free(conf); config_file_free(conf);
} }
@ -2471,7 +2484,7 @@ static void menu_common_shader_manager_get_str(void *data, char *type_str, size_
// rgui->parameter_shader here. // rgui->parameter_shader here.
if (shader) if (shader)
{ {
const struct gfx_shader_parameter *param = &shader->parameters[type - RGUI_SETTINGS_SHADER_PARAMETER_0]; const struct gfx_shader_parameter *param = (const struct gfx_shader_parameter*)&shader->parameters[type - RGUI_SETTINGS_SHADER_PARAMETER_0];
snprintf(type_str, type_str_size, "%.2f [%.2f %.2f]", param->current, param->minimum, param->maximum); snprintf(type_str, type_str_size, "%.2f [%.2f %.2f]", param->current, param->minimum, param->maximum);
} }
else else
@ -2539,7 +2552,7 @@ static void menu_common_shader_manager_save_preset(const char *basename, bool ap
} }
if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_type) if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_type)
type = driver.menu_ctx->backend->shader_manager_get_type(&rgui->shader); type = driver.menu_ctx->backend->shader_manager_get_type(rgui->shader);
else else
type = RARCH_SHADER_NONE; type = RARCH_SHADER_NONE;
@ -2580,7 +2593,7 @@ static void menu_common_shader_manager_save_preset(const char *basename, bool ap
config_file_t *conf = config_file_new(NULL); config_file_t *conf = config_file_new(NULL);
if (!conf) if (!conf)
return; return;
gfx_shader_write_conf_cgp(conf, &rgui->shader); gfx_shader_write_conf_cgp(conf, rgui->shader);
bool ret = false; bool ret = false;
@ -2699,11 +2712,19 @@ static int menu_common_shader_manager_setting_toggle(unsigned setting, unsigned
} }
else if (setting >= RGUI_SETTINGS_SHADER_PARAMETER_0 && setting <= RGUI_SETTINGS_SHADER_PARAMETER_LAST) else if (setting >= RGUI_SETTINGS_SHADER_PARAMETER_0 && setting <= RGUI_SETTINGS_SHADER_PARAMETER_LAST)
{ {
if (!rgui->parameter_shader) struct gfx_shader *shader;
struct gfx_shader_parameter *param;
shader = (struct gfx_shader*)rgui->parameter_shader;
if (!shader)
return 0;
param = (struct gfx_shader_parameter*)&shader->parameters[setting - RGUI_SETTINGS_SHADER_PARAMETER_0];
if (!param)
return 0; return 0;
struct gfx_shader *shader = (struct gfx_shader*)&rgui->parameter_shader;
struct gfx_shader_parameter *param = (struct gfx_shader_parameter*)&shader->parameters[setting - RGUI_SETTINGS_SHADER_PARAMETER_0];
switch (action) switch (action)
{ {
case RGUI_ACTION_START: case RGUI_ACTION_START:
@ -2729,9 +2750,13 @@ static int menu_common_shader_manager_setting_toggle(unsigned setting, unsigned
driver.menu_ctx->backend->setting_set(setting, action); driver.menu_ctx->backend->setting_set(setting, action);
else if (((dist_shader % 3) == 0 || setting == RGUI_SETTINGS_SHADER_PRESET)) else if (((dist_shader % 3) == 0 || setting == RGUI_SETTINGS_SHADER_PRESET))
{ {
struct gfx_shader *shader = NULL;
struct gfx_shader_pass *pass = NULL;
dist_shader /= 3; dist_shader /= 3;
struct gfx_shader_pass *pass = setting == RGUI_SETTINGS_SHADER_PRESET ? shader = (struct gfx_shader*)rgui->shader;
&rgui->shader.pass[dist_shader] : NULL; if (shader && setting == RGUI_SETTINGS_SHADER_PRESET)
pass = (struct gfx_shader_pass*)&shader->pass[dist_shader];
switch (action) switch (action)
{ {
case RGUI_ACTION_OK: case RGUI_ACTION_OK:
@ -2751,12 +2776,15 @@ static int menu_common_shader_manager_setting_toggle(unsigned setting, unsigned
} }
else if ((dist_filter % 3) == 0) else if ((dist_filter % 3) == 0)
{ {
struct gfx_shader *shader = NULL;
struct gfx_shader_pass *pass = NULL;
dist_filter /= 3; dist_filter /= 3;
struct gfx_shader_pass *pass = &rgui->shader.pass[dist_filter]; shader = (struct gfx_shader*)rgui->shader;
pass = (struct gfx_shader_pass*)&shader->pass[dist_filter];
switch (action) switch (action)
{ {
case RGUI_ACTION_START: case RGUI_ACTION_START:
rgui->shader.pass[dist_filter].filter = RARCH_FILTER_UNSPEC; shader->pass[dist_filter].filter = RARCH_FILTER_UNSPEC;
break; break;
case RGUI_ACTION_LEFT: case RGUI_ACTION_LEFT:
@ -2774,8 +2802,11 @@ static int menu_common_shader_manager_setting_toggle(unsigned setting, unsigned
} }
else if ((dist_scale % 3) == 0) else if ((dist_scale % 3) == 0)
{ {
struct gfx_shader *shader = NULL;
struct gfx_shader_pass *pass = NULL;
dist_scale /= 3; dist_scale /= 3;
struct gfx_shader_pass *pass = &rgui->shader.pass[dist_scale]; shader = (struct gfx_shader*)rgui->shader;
pass = (struct gfx_shader_pass*)&shader->pass[dist_scale];
switch (action) switch (action)
{ {
case RGUI_ACTION_START: case RGUI_ACTION_START:
@ -2963,7 +2994,7 @@ static bool osk_callback_enter_filename(void *data)
config_file_t *conf = config_file_new(NULL); config_file_t *conf = config_file_new(NULL);
if (!conf) if (!conf)
return false; return false;
gfx_shader_write_conf_cgp(conf, &rgui->shader); gfx_shader_write_conf_cgp(conf, rgui->shader);
config_file_write(conf, filepath); config_file_write(conf, filepath);
config_file_free(conf); config_file_free(conf);
goto do_exit; goto do_exit;
@ -4344,39 +4375,45 @@ static int menu_common_setting_set(unsigned setting, unsigned action)
break; break;
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
case RGUI_SETTINGS_SHADER_PASSES: case RGUI_SETTINGS_SHADER_PASSES:
switch (action)
{ {
case RGUI_ACTION_START: struct gfx_shader *shader = (struct gfx_shader*)rgui->shader;
rgui->shader.passes = 0;
rgui->need_refresh = true;
break;
case RGUI_ACTION_LEFT: switch (action)
if (rgui->shader.passes) {
{ case RGUI_ACTION_START:
rgui->shader.passes--; if (shader && shader->passes)
shader->passes = 0;
rgui->need_refresh = true; rgui->need_refresh = true;
} break;
break;
case RGUI_ACTION_RIGHT: case RGUI_ACTION_LEFT:
case RGUI_ACTION_OK: if (shader && shader->passes)
if (rgui->shader.passes < GFX_MAX_SHADERS) {
{ shader->passes--;
rgui->shader.passes++; rgui->need_refresh = true;
rgui->need_refresh = true; }
} break;
break;
default: case RGUI_ACTION_RIGHT:
break; case RGUI_ACTION_OK:
if (shader && (shader->passes < GFX_MAX_SHADERS))
{
shader->passes++;
rgui->need_refresh = true;
}
break;
default:
break;
}
if (rgui->need_refresh)
gfx_shader_resolve_parameters(NULL, rgui->shader);
} }
if (rgui->need_refresh)
gfx_shader_resolve_parameters(NULL, &rgui->shader);
break; break;
case RGUI_SETTINGS_SHADER_APPLY: case RGUI_SETTINGS_SHADER_APPLY:
{ {
struct gfx_shader *shader = (struct gfx_shader*)rgui->shader;
unsigned type = RARCH_SHADER_NONE; unsigned type = RARCH_SHADER_NONE;
if (!driver.video || !driver.video->set_shader || action != RGUI_ACTION_OK) if (!driver.video || !driver.video->set_shader || action != RGUI_ACTION_OK)
@ -4385,9 +4422,9 @@ static int menu_common_setting_set(unsigned setting, unsigned action)
RARCH_LOG("Applying shader ...\n"); RARCH_LOG("Applying shader ...\n");
if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_type) if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_type)
type = driver.menu_ctx->backend->shader_manager_get_type(&rgui->shader); type = driver.menu_ctx->backend->shader_manager_get_type(rgui->shader);
if (rgui->shader.passes && type != RARCH_SHADER_NONE if (shader->passes && type != RARCH_SHADER_NONE
&& driver.menu_ctx && driver.menu_ctx->backend && && driver.menu_ctx && driver.menu_ctx->backend &&
driver.menu_ctx->backend->shader_manager_save_preset) driver.menu_ctx->backend->shader_manager_save_preset)
driver.menu_ctx->backend->shader_manager_save_preset(NULL, true); driver.menu_ctx->backend->shader_manager_save_preset(NULL, true);

View File

@ -478,7 +478,7 @@ static void rgui_render(void)
if (type >= RGUI_SETTINGS_SHADER_PARAMETER_0 && type <= RGUI_SETTINGS_SHADER_PARAMETER_LAST) if (type >= RGUI_SETTINGS_SHADER_PARAMETER_0 && type <= RGUI_SETTINGS_SHADER_PARAMETER_LAST)
driver.menu_ctx->backend->shader_manager_get_str(rgui->parameter_shader, type_str, sizeof(type_str), type); driver.menu_ctx->backend->shader_manager_get_str(rgui->parameter_shader, type_str, sizeof(type_str), type);
else else
driver.menu_ctx->backend->shader_manager_get_str(&rgui->shader, type_str, sizeof(type_str), type); driver.menu_ctx->backend->shader_manager_get_str(rgui->shader, type_str, sizeof(type_str), type);
} }
} }
else else

View File

@ -348,7 +348,7 @@ static void rmenu_render(void)
if (type >= RGUI_SETTINGS_SHADER_PARAMETER_0 && type <= RGUI_SETTINGS_SHADER_PARAMETER_LAST) if (type >= RGUI_SETTINGS_SHADER_PARAMETER_0 && type <= RGUI_SETTINGS_SHADER_PARAMETER_LAST)
driver.menu_ctx->backend->shader_manager_get_str(rgui->parameter_shader, type_str, sizeof(type_str), type); driver.menu_ctx->backend->shader_manager_get_str(rgui->parameter_shader, type_str, sizeof(type_str), type);
else else
driver.menu_ctx->backend->shader_manager_get_str(&rgui->shader, type_str, sizeof(type_str), type); driver.menu_ctx->backend->shader_manager_get_str(rgui->shader, type_str, sizeof(type_str), type);
} }
} }
else else

View File

@ -570,7 +570,7 @@ static void rmenu_xui_render(void)
snprintf(type_str, sizeof(type_str), "%s", snprintf(type_str, sizeof(type_str), "%s",
g_settings.video.smooth ? "Linear" : "Nearest"); g_settings.video.smooth ? "Linear" : "Nearest");
else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_str) else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_str)
driver.menu_ctx->backend->shader_manager_get_str(&rgui->shader, type_str, sizeof(type_str), type); driver.menu_ctx->backend->shader_manager_get_str(rgui->shader, type_str, sizeof(type_str), type);
} }
else else
// Pretty-print libretro cores from menu. // Pretty-print libretro cores from menu.

View File

@ -323,6 +323,9 @@ void *menu_init(const void *data)
rgui->menu_stack = (file_list_t*)calloc(1, sizeof(file_list_t)); rgui->menu_stack = (file_list_t*)calloc(1, sizeof(file_list_t));
rgui->selection_buf = (file_list_t*)calloc(1, sizeof(file_list_t)); rgui->selection_buf = (file_list_t*)calloc(1, sizeof(file_list_t));
rgui->core_info_current = (core_info_t*)calloc(1, sizeof(core_info_t)); rgui->core_info_current = (core_info_t*)calloc(1, sizeof(core_info_t));
#ifdef HAVE_SHADER_MANAGER
rgui->shader = (struct gfx_shader*)calloc(1, sizeof(struct gfx_shader));
#endif
file_list_push(rgui->menu_stack, "", RGUI_SETTINGS, 0); file_list_push(rgui->menu_stack, "", RGUI_SETTINGS, 0);
menu_clear_navigation(rgui); menu_clear_navigation(rgui);
rgui->push_start_screen = g_settings.rgui_show_start_screen; rgui->push_start_screen = g_settings.rgui_show_start_screen;
@ -355,6 +358,12 @@ void menu_free(void *data)
if (!rgui) if (!rgui)
return; return;
#ifdef HAVE_SHADER_MANAGER
if (rgui->shader)
free(rgui->shader);
rgui->shader = NULL;
#endif
if (driver.menu_ctx && driver.menu_ctx->free) if (driver.menu_ctx && driver.menu_ctx->free)
driver.menu_ctx->free(rgui); driver.menu_ctx->free(rgui);

View File

@ -167,7 +167,7 @@ typedef struct
bool load_no_rom; bool load_no_rom;
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
struct gfx_shader shader; void *shader;
void *parameter_shader; // Points to either shader or graphics driver current shader. void *parameter_shader; // Points to either shader or graphics driver current shader.
#endif #endif
unsigned current_pad; unsigned current_pad;