diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index 7362406dc8..e2555da95a 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -47,6 +47,7 @@ static inline struct gfx_shader *shader_manager_get_current_shader(void *data, unsigned type) { rgui_handle_t *rgui = (rgui_handle_t*)data; + struct gfx_shader *shader = NULL; if (!rgui) { @@ -54,7 +55,9 @@ static inline struct gfx_shader *shader_manager_get_current_shader(void *data, u 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) 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); - 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) 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); @@ -87,6 +90,12 @@ static void menu_common_entries_init(void *data, unsigned menu_type) break; } 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_push(rgui->selection_buf, "Apply Shader Changes", 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", RGUI_SETTINGS_SHADER_PASSES, 0); - for (i = 0; i < rgui->shader.passes; i++) + for (i = 0; i < shader->passes; i++) { 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, RGUI_SETTINGS_SHADER_0_SCALE + 3 * i, 0); } - break; + } + break; #endif case RGUI_SETTINGS_GENERAL_OPTIONS: file_list_clear(rgui->selection_buf); @@ -2053,17 +2063,19 @@ static int menu_common_iterate(unsigned action) char shader_path[PATH_MAX]; 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) - 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); } else { + struct gfx_shader *shader = (struct gfx_shader*)rgui->shader; 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. - gfx_shader_resolve_parameters(NULL, &rgui->shader); + gfx_shader_resolve_parameters(NULL, rgui->shader); } // Pop stack until we hit shader manager again. @@ -2340,7 +2352,6 @@ static void menu_common_shader_manager_init(void *data) return; #ifdef HAVE_SHADER_MANAGER - memset(&rgui->shader, 0, sizeof(rgui->shader)); config_file_t *conf = 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); 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_parameters(conf, &rgui->shader); + gfx_shader_resolve_relative(rgui->shader, g_settings.video.shader_path); + gfx_shader_resolve_parameters(conf, rgui->shader); } config_file_free(conf); } } else if (strcmp(ext, "glsl") == 0 || strcmp(ext, "cg") == 0) { - strlcpy(rgui->shader.pass[0].source.path, g_settings.video.shader_path, - sizeof(rgui->shader.pass[0].source.path)); - rgui->shader.passes = 1; + struct gfx_shader *shader = (struct gfx_shader*)rgui->shader; + + strlcpy(shader->pass[0].source.path, g_settings.video.shader_path, + sizeof(shader->pass[0].source.path)); + shader->passes = 1; } else { @@ -2403,10 +2416,10 @@ static void menu_common_shader_manager_init(void *data) 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_parameters(conf, &rgui->shader); + gfx_shader_resolve_relative(rgui->shader, cgp_path); + gfx_shader_resolve_parameters(conf, rgui->shader); } 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. 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); } 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) - type = driver.menu_ctx->backend->shader_manager_get_type(&rgui->shader); + type = driver.menu_ctx->backend->shader_manager_get_type(rgui->shader); else 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); if (!conf) return; - gfx_shader_write_conf_cgp(conf, &rgui->shader); + gfx_shader_write_conf_cgp(conf, rgui->shader); 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) { - 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; - 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) { 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); 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; - struct gfx_shader_pass *pass = setting == RGUI_SETTINGS_SHADER_PRESET ? - &rgui->shader.pass[dist_shader] : NULL; + shader = (struct gfx_shader*)rgui->shader; + if (shader && setting == RGUI_SETTINGS_SHADER_PRESET) + pass = (struct gfx_shader_pass*)&shader->pass[dist_shader]; + switch (action) { 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) { + struct gfx_shader *shader = NULL; + struct gfx_shader_pass *pass = NULL; 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) { case RGUI_ACTION_START: - rgui->shader.pass[dist_filter].filter = RARCH_FILTER_UNSPEC; + shader->pass[dist_filter].filter = RARCH_FILTER_UNSPEC; break; 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) { + struct gfx_shader *shader = NULL; + struct gfx_shader_pass *pass = NULL; 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) { case RGUI_ACTION_START: @@ -2963,7 +2994,7 @@ static bool osk_callback_enter_filename(void *data) config_file_t *conf = config_file_new(NULL); if (!conf) 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_free(conf); goto do_exit; @@ -4344,39 +4375,45 @@ static int menu_common_setting_set(unsigned setting, unsigned action) break; #ifdef HAVE_SHADER_MANAGER case RGUI_SETTINGS_SHADER_PASSES: - switch (action) { - case RGUI_ACTION_START: - rgui->shader.passes = 0; - rgui->need_refresh = true; - break; + struct gfx_shader *shader = (struct gfx_shader*)rgui->shader; - case RGUI_ACTION_LEFT: - if (rgui->shader.passes) - { - rgui->shader.passes--; + switch (action) + { + case RGUI_ACTION_START: + if (shader && shader->passes) + shader->passes = 0; rgui->need_refresh = true; - } - break; + break; - case RGUI_ACTION_RIGHT: - case RGUI_ACTION_OK: - if (rgui->shader.passes < GFX_MAX_SHADERS) - { - rgui->shader.passes++; - rgui->need_refresh = true; - } - break; + case RGUI_ACTION_LEFT: + if (shader && shader->passes) + { + shader->passes--; + rgui->need_refresh = true; + } + break; - default: - break; + case RGUI_ACTION_RIGHT: + 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; case RGUI_SETTINGS_SHADER_APPLY: { + struct gfx_shader *shader = (struct gfx_shader*)rgui->shader; unsigned type = RARCH_SHADER_NONE; 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"); 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->backend->shader_manager_save_preset) driver.menu_ctx->backend->shader_manager_save_preset(NULL, true); diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index 781fae6ef8..fab0bbb317 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -478,7 +478,7 @@ static void rgui_render(void) 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); 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 diff --git a/frontend/menu/disp/rmenu.c b/frontend/menu/disp/rmenu.c index 493a105ed9..381cebcad3 100644 --- a/frontend/menu/disp/rmenu.c +++ b/frontend/menu/disp/rmenu.c @@ -348,7 +348,7 @@ static void rmenu_render(void) 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); 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 diff --git a/frontend/menu/disp/rmenu_xui.cpp b/frontend/menu/disp/rmenu_xui.cpp index 619cb1a089..f2a93e81e1 100644 --- a/frontend/menu/disp/rmenu_xui.cpp +++ b/frontend/menu/disp/rmenu_xui.cpp @@ -570,7 +570,7 @@ static void rmenu_xui_render(void) snprintf(type_str, sizeof(type_str), "%s", g_settings.video.smooth ? "Linear" : "Nearest"); 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 // Pretty-print libretro cores from menu. diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 28f93553d5..8b997bc789 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -323,6 +323,9 @@ void *menu_init(const void *data) 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->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); menu_clear_navigation(rgui); rgui->push_start_screen = g_settings.rgui_show_start_screen; @@ -354,6 +357,12 @@ void menu_free(void *data) if (!rgui) return; + +#ifdef HAVE_SHADER_MANAGER + if (rgui->shader) + free(rgui->shader); + rgui->shader = NULL; +#endif if (driver.menu_ctx && driver.menu_ctx->free) driver.menu_ctx->free(rgui); diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 6810537984..b9b0e273c3 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -167,7 +167,7 @@ typedef struct bool load_no_rom; #ifdef HAVE_SHADER_MANAGER - struct gfx_shader shader; + void *shader; void *parameter_shader; // Points to either shader or graphics driver current shader. #endif unsigned current_pad;